sessix-server 0.2.8 → 0.2.9

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 (60) hide show
  1. package/dist/index.js +63 -23
  2. package/dist/server.js +63 -23
  3. package/package.json +10 -1
  4. package/dist/approval/ApprovalProxy.d.ts +0 -86
  5. package/dist/approval/ApprovalProxy.d.ts.map +0 -1
  6. package/dist/approval/ApprovalProxy.js +0 -363
  7. package/dist/approval/ApprovalProxy.js.map +0 -1
  8. package/dist/hooks/HookInstaller.d.ts +0 -55
  9. package/dist/hooks/HookInstaller.d.ts.map +0 -1
  10. package/dist/hooks/HookInstaller.js +0 -215
  11. package/dist/hooks/HookInstaller.js.map +0 -1
  12. package/dist/index.d.ts +0 -2
  13. package/dist/index.d.ts.map +0 -1
  14. package/dist/index.js.map +0 -1
  15. package/dist/mdns/MdnsService.d.ts +0 -36
  16. package/dist/mdns/MdnsService.d.ts.map +0 -1
  17. package/dist/mdns/MdnsService.js +0 -66
  18. package/dist/mdns/MdnsService.js.map +0 -1
  19. package/dist/notification/ActivityPushChannel.d.ts +0 -54
  20. package/dist/notification/ActivityPushChannel.d.ts.map +0 -1
  21. package/dist/notification/ActivityPushChannel.js +0 -235
  22. package/dist/notification/ActivityPushChannel.js.map +0 -1
  23. package/dist/notification/ExpoNotificationChannel.d.ts +0 -17
  24. package/dist/notification/ExpoNotificationChannel.d.ts.map +0 -1
  25. package/dist/notification/ExpoNotificationChannel.js +0 -57
  26. package/dist/notification/ExpoNotificationChannel.js.map +0 -1
  27. package/dist/notification/MacNotificationChannel.d.ts +0 -22
  28. package/dist/notification/MacNotificationChannel.d.ts.map +0 -1
  29. package/dist/notification/MacNotificationChannel.js +0 -33
  30. package/dist/notification/MacNotificationChannel.js.map +0 -1
  31. package/dist/notification/NotificationService.d.ts +0 -50
  32. package/dist/notification/NotificationService.d.ts.map +0 -1
  33. package/dist/notification/NotificationService.js +0 -177
  34. package/dist/notification/NotificationService.js.map +0 -1
  35. package/dist/providers/ExecutionProvider.d.ts +0 -60
  36. package/dist/providers/ExecutionProvider.d.ts.map +0 -1
  37. package/dist/providers/ExecutionProvider.js +0 -3
  38. package/dist/providers/ExecutionProvider.js.map +0 -1
  39. package/dist/providers/ProcessProvider.d.ts +0 -117
  40. package/dist/providers/ProcessProvider.d.ts.map +0 -1
  41. package/dist/providers/ProcessProvider.js +0 -507
  42. package/dist/providers/ProcessProvider.js.map +0 -1
  43. package/dist/server.d.ts.map +0 -1
  44. package/dist/server.js.map +0 -1
  45. package/dist/session/ProjectReader.d.ts +0 -44
  46. package/dist/session/ProjectReader.d.ts.map +0 -1
  47. package/dist/session/ProjectReader.js +0 -471
  48. package/dist/session/ProjectReader.js.map +0 -1
  49. package/dist/session/SessionFileWatcher.d.ts +0 -35
  50. package/dist/session/SessionFileWatcher.d.ts.map +0 -1
  51. package/dist/session/SessionFileWatcher.js +0 -207
  52. package/dist/session/SessionFileWatcher.js.map +0 -1
  53. package/dist/session/SessionManager.d.ts +0 -114
  54. package/dist/session/SessionManager.d.ts.map +0 -1
  55. package/dist/session/SessionManager.js +0 -356
  56. package/dist/session/SessionManager.js.map +0 -1
  57. package/dist/ws/WsBridge.d.ts +0 -55
  58. package/dist/ws/WsBridge.d.ts.map +0 -1
  59. package/dist/ws/WsBridge.js +0 -220
  60. package/dist/ws/WsBridge.js.map +0 -1
@@ -1,471 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.getSessionFilePath = getSessionFilePath;
4
- exports.getProjects = getProjects;
5
- exports.getSessionsForProject = getSessionsForProject;
6
- exports.getHistoricalSessions = getHistoricalSessions;
7
- exports.getSessionHistory = getSessionHistory;
8
- const promises_1 = require("fs/promises");
9
- const readline_1 = require("readline");
10
- const path_1 = require("path");
11
- const os_1 = require("os");
12
- // ============================================
13
- // ProjectReader — 扫描 ~/.claude/projects/ 读取项目和会话
14
- // ============================================
15
- /** Claude 项目目录的根路径 */
16
- const CLAUDE_PROJECTS_DIR = (0, path_1.join)((0, os_1.homedir)(), '.claude', 'projects');
17
- /**
18
- * 返回指定会话对应的 JSONL 文件绝对路径(文件不一定存在)
19
- */
20
- function getSessionFilePath(projectPath, sessionId) {
21
- return (0, path_1.join)(CLAUDE_PROJECTS_DIR, encodeDirName(projectPath), `${sessionId}.jsonl`);
22
- }
23
- /**
24
- * 扫描 ~/.claude/projects/ 目录,返回所有项目列表
25
- *
26
- * 目录结构:
27
- * ~/.claude/projects/
28
- * ├── -Users-huge-Project-Sessix/ ← 破折号替代斜杠的路径编码
29
- * │ ├── abc123.jsonl ← 会话文件
30
- * │ └── def456.jsonl
31
- * └── -Users-huge-Project-Other/
32
- * └── ghi789.jsonl
33
- *
34
- * @returns 项目列表,包含每个项目的会话数量
35
- */
36
- async function getProjects() {
37
- try {
38
- // 检查目录是否存在
39
- const dirExists = await directoryExists(CLAUDE_PROJECTS_DIR);
40
- if (!dirExists) {
41
- return { ok: true, value: [] };
42
- }
43
- // 读取所有子目录
44
- const entries = await (0, promises_1.readdir)(CLAUDE_PROJECTS_DIR, { withFileTypes: true });
45
- const projects = [];
46
- for (const entry of entries) {
47
- // 只处理目录,跳过文件和隐藏目录
48
- if (!entry.isDirectory() || entry.name.startsWith('.')) {
49
- continue;
50
- }
51
- // 解码项目路径(Claude Code 使用破折号替代斜杠编码路径)
52
- const encodedPath = entry.name;
53
- const decodedPath = decodeDirName(encodedPath);
54
- // 提取项目名称(路径的最后一段)
55
- const name = decodedPath.split('/').filter(Boolean).pop() ?? encodedPath;
56
- // 统计该项目下的会话数量,并获取最近一次会话文件的修改时间
57
- const projectDir = (0, path_1.join)(CLAUDE_PROJECTS_DIR, encodedPath);
58
- const { count: sessionCount, latestMtime } = await countJsonlFilesWithMtime(projectDir);
59
- projects.push({
60
- id: encodedPath,
61
- path: decodedPath,
62
- name,
63
- sessionCount,
64
- lastActiveAt: latestMtime,
65
- });
66
- }
67
- // 按名称排序
68
- projects.sort((a, b) => a.name.localeCompare(b.name));
69
- return { ok: true, value: projects };
70
- }
71
- catch (err) {
72
- return {
73
- ok: false,
74
- error: err instanceof Error ? err : new Error(String(err)),
75
- };
76
- }
77
- }
78
- /**
79
- * 获取指定项目路径下的所有会话 ID 列表
80
- *
81
- * @param projectPath - 项目的绝对路径(解码后的)
82
- * @returns 会话 ID 列表(即 .jsonl 文件名去掉后缀)
83
- */
84
- async function getSessionsForProject(projectPath) {
85
- try {
86
- // 将项目路径编码为目录名(破折号替代斜杠)
87
- const encodedPath = encodeDirName(projectPath);
88
- const projectDir = (0, path_1.join)(CLAUDE_PROJECTS_DIR, encodedPath);
89
- // 检查目录是否存在
90
- const dirExists = await directoryExists(projectDir);
91
- if (!dirExists) {
92
- return { ok: true, value: [] };
93
- }
94
- // 读取 .jsonl 文件列表
95
- const entries = await (0, promises_1.readdir)(projectDir, { withFileTypes: true });
96
- const sessionIds = [];
97
- for (const entry of entries) {
98
- if (entry.isFile() && entry.name.endsWith('.jsonl')) {
99
- // 去掉 .jsonl 后缀作为 session ID
100
- const sessionId = entry.name.slice(0, -6);
101
- sessionIds.push(sessionId);
102
- }
103
- }
104
- // 按文件修改时间倒序排列(最近的在前)
105
- const sessionWithMtime = await Promise.all(sessionIds.map(async (id) => {
106
- const filePath = (0, path_1.join)(projectDir, `${id}.jsonl`);
107
- try {
108
- const fileStat = await (0, promises_1.stat)(filePath);
109
- return { id, mtime: fileStat.mtimeMs };
110
- }
111
- catch {
112
- return { id, mtime: 0 };
113
- }
114
- }));
115
- sessionWithMtime.sort((a, b) => b.mtime - a.mtime);
116
- return { ok: true, value: sessionWithMtime.map((s) => s.id) };
117
- }
118
- catch (err) {
119
- return {
120
- ok: false,
121
- error: err instanceof Error ? err : new Error(String(err)),
122
- };
123
- }
124
- }
125
- /**
126
- * 获取指定项目的历史会话列表,限制最近 20 条
127
- *
128
- * 优先从 sessions-index.json 读取(包含 summary 等丰富信息),
129
- * 读取失败时回退到扫描 .jsonl 文件。
130
- */
131
- async function getHistoricalSessions(projectPath) {
132
- try {
133
- const encodedPath = encodeDirName(projectPath);
134
- const projectDir = (0, path_1.join)(CLAUDE_PROJECTS_DIR, encodedPath);
135
- const dirExists = await directoryExists(projectDir);
136
- if (!dirExists) {
137
- return { ok: true, value: [] };
138
- }
139
- // 扫描所有 .jsonl 文件和 UUID 目录,按 mtime 建立映射
140
- const entries = await (0, promises_1.readdir)(projectDir, { withFileTypes: true });
141
- const jsonlFiles = entries.filter((e) => e.isFile() && e.name.endsWith('.jsonl'));
142
- // 用 mtime 映射,供后续合并使用
143
- const mtimeMap = new Map();
144
- for (const entry of jsonlFiles) {
145
- const sessionId = entry.name.slice(0, -6);
146
- const filePath = (0, path_1.join)(projectDir, entry.name);
147
- try {
148
- const fileStat = await (0, promises_1.stat)(filePath);
149
- mtimeMap.set(sessionId, fileStat.mtimeMs);
150
- }
151
- catch {
152
- mtimeMap.set(sessionId, 0);
153
- }
154
- }
155
- // 新格式:UUID 目录(无对应 .jsonl 时单独计入)
156
- const uuidDirs = entries.filter((e) => e.isDirectory() && UUID_RE.test(e.name) && !mtimeMap.has(e.name));
157
- for (const entry of uuidDirs) {
158
- try {
159
- const fileStat = await (0, promises_1.stat)((0, path_1.join)(projectDir, entry.name));
160
- mtimeMap.set(entry.name, fileStat.mtimeMs);
161
- }
162
- catch {
163
- mtimeMap.set(entry.name, 0);
164
- }
165
- }
166
- // 优先尝试从 sessions-index.json 读取(有 summary 等丰富信息)
167
- const indexPath = (0, path_1.join)(projectDir, 'sessions-index.json');
168
- const sessionMap = new Map();
169
- try {
170
- const indexContent = await (0, promises_1.readFile)(indexPath, 'utf-8');
171
- const indexData = JSON.parse(indexContent);
172
- if (indexData.version === 1 && Array.isArray(indexData.entries)) {
173
- for (const entry of indexData.entries) {
174
- // 优先使用磁盘上的实际 mtime(比索引里的更可靠)
175
- const mtime = mtimeMap.get(entry.sessionId)
176
- ?? entry.fileMtime
177
- ?? (entry.modified ? new Date(entry.modified).getTime() : 0);
178
- sessionMap.set(entry.sessionId, {
179
- sessionId: entry.sessionId,
180
- lastModified: mtime,
181
- summary: entry.summary,
182
- firstPrompt: entry.firstPrompt,
183
- messageCount: entry.messageCount,
184
- });
185
- }
186
- // 对 index 中有 messageCount(>0)但缺少 summary/firstPrompt 的条目,
187
- // 尝试从对应 .jsonl 文件补充提取第一条提示词
188
- await Promise.all(Array.from(sessionMap.values())
189
- .filter(s => (s.messageCount ?? 0) > 0 && !s.summary && !s.firstPrompt)
190
- .map(async (s) => {
191
- const filePath = (0, path_1.join)(projectDir, `${s.sessionId}.jsonl`);
192
- const firstPrompt = await extractFirstPrompt(filePath).catch(() => undefined);
193
- if (firstPrompt)
194
- s.firstPrompt = firstPrompt;
195
- }));
196
- }
197
- }
198
- catch {
199
- // sessions-index.json 不存在或解析失败,继续用扫描结果
200
- }
201
- // 合并:将索引中没有的条目(.jsonl 文件或 UUID 目录)补充进来
202
- const uuidDirSet = new Set(uuidDirs.map((e) => e.name));
203
- for (const [sessionId, mtime] of mtimeMap) {
204
- if (!sessionMap.has(sessionId)) {
205
- if (uuidDirSet.has(sessionId)) {
206
- // UUID 目录格式:无顶层对话,标记 messageCount=-1 以区分
207
- sessionMap.set(sessionId, { sessionId, lastModified: mtime, messageCount: -1 });
208
- }
209
- else {
210
- const filePath = (0, path_1.join)(projectDir, `${sessionId}.jsonl`);
211
- const firstPrompt = await extractFirstPrompt(filePath).catch(() => undefined);
212
- sessionMap.set(sessionId, { sessionId, lastModified: mtime, firstPrompt });
213
- }
214
- }
215
- }
216
- const sessions = Array.from(sessionMap.values())
217
- .filter(s => {
218
- // 忽略完全空的会话(如 VS Code 新建但未发消息的会话)
219
- if (s.messageCount === 0)
220
- return false;
221
- // UUID 目录格式(messageCount=-1):保留
222
- if (s.messageCount === -1)
223
- return true;
224
- if (s.firstPrompt === undefined && s.messageCount === undefined)
225
- return false;
226
- return true;
227
- });
228
- sessions.sort((a, b) => b.lastModified - a.lastModified);
229
- return { ok: true, value: sessions.slice(0, 20) };
230
- }
231
- catch (err) {
232
- return {
233
- ok: false,
234
- error: err instanceof Error ? err : new Error(String(err)),
235
- };
236
- }
237
- }
238
- /**
239
- * 读取指定会话的 JSONL 文件,提取对话消息
240
- *
241
- * JSONL 格式(Claude Code 原生):
242
- * - type: 'user' / 'assistant' / 'progress' / 'queue-operation' / 'file-history-snapshot'
243
- * - message: { role, content }(仅 user/assistant 有)
244
- *
245
- * 我们提取 user 和 assistant 类型的消息,映射为 ClaudeStreamEvent 格式。
246
- */
247
- async function getSessionHistory(projectPath, sessionId) {
248
- try {
249
- const encodedPath = encodeDirName(projectPath);
250
- const filePath = (0, path_1.join)(CLAUDE_PROJECTS_DIR, encodedPath, `${sessionId}.jsonl`);
251
- const raw = await (0, promises_1.readFile)(filePath, 'utf-8').catch((err) => {
252
- if (err.code === 'ENOENT')
253
- return null;
254
- throw err;
255
- });
256
- if (raw === null)
257
- return { ok: false, error: new Error('ENOENT') };
258
- const lines = raw.split('\n').filter((l) => l.trim());
259
- const events = [];
260
- for (const line of lines) {
261
- try {
262
- const obj = JSON.parse(line);
263
- const type = obj.type;
264
- if (type === 'user' && obj.message) {
265
- // 过滤掉系统命令消息
266
- const msgContent = obj.message.content;
267
- if (typeof msgContent === 'string') {
268
- if (msgContent.includes('<local-command') || msgContent.includes('<command-name>'))
269
- continue;
270
- }
271
- else if (Array.isArray(msgContent)) {
272
- // 跳过只包含 tool_result 的消息(不可读)
273
- const hasText = msgContent.some((b) => b.type === 'text' && !b.text?.includes('<local-command') && !b.text?.includes('<command-name>'));
274
- if (!hasText)
275
- continue;
276
- }
277
- // 规范化 content 为数组格式(JSONL 中 user content 可能是字符串)
278
- const normalizedContent = typeof msgContent === 'string'
279
- ? [{ type: 'text', text: msgContent }]
280
- : Array.isArray(msgContent)
281
- ? msgContent.filter((b) => b.type === 'text' && typeof b.text === 'string')
282
- : [];
283
- if (normalizedContent.length === 0)
284
- continue;
285
- events.push({
286
- type: 'user',
287
- message: {
288
- ...obj.message,
289
- content: normalizedContent,
290
- },
291
- session_id: sessionId,
292
- });
293
- }
294
- else if (type === 'assistant' && obj.message) {
295
- // 保留 text、tool_use 和 thinking 块
296
- const content = (obj.message.content ?? []).filter((b) => b.type === 'text' || b.type === 'tool_use' || b.type === 'thinking');
297
- if (content.length === 0)
298
- continue;
299
- events.push({
300
- type: 'assistant',
301
- message: {
302
- id: obj.message.id ?? obj.uuid ?? `hist-${events.length}`,
303
- model: obj.message.model ?? 'unknown',
304
- role: 'assistant',
305
- content,
306
- stop_reason: obj.message.stop_reason,
307
- usage: obj.message.usage,
308
- },
309
- session_id: sessionId,
310
- });
311
- }
312
- }
313
- catch {
314
- // 跳过无法解析的行
315
- }
316
- }
317
- // 从 JSONL 数据中合成一个 result 事件,提供 token 统计摘要
318
- if (events.length > 0) {
319
- let totalInputTokens = 0;
320
- let totalOutputTokens = 0;
321
- for (const ev of events) {
322
- if (ev.type === 'assistant' && ev.message.usage) {
323
- totalInputTokens += ev.message.usage.input_tokens ?? 0;
324
- totalOutputTokens += ev.message.usage.output_tokens ?? 0;
325
- }
326
- }
327
- if (totalInputTokens > 0 || totalOutputTokens > 0) {
328
- events.push({
329
- type: 'result',
330
- subtype: 'success',
331
- is_error: false,
332
- duration_ms: 0,
333
- num_turns: events.filter((e) => e.type === 'user').length,
334
- result: '',
335
- session_id: sessionId,
336
- usage: { input_tokens: totalInputTokens, output_tokens: totalOutputTokens },
337
- });
338
- }
339
- }
340
- return { ok: true, value: events };
341
- }
342
- catch (err) {
343
- return {
344
- ok: false,
345
- error: err instanceof Error ? err : new Error(String(err)),
346
- };
347
- }
348
- }
349
- // ============================================
350
- // 内部工具函数
351
- // ============================================
352
- /**
353
- * 从 JSONL 文件中提取第一条 user 消息的文本作为标题
354
- * 使用流式读取,只读取前 20 行以避免加载整个大文件到内存
355
- */
356
- async function extractFirstPrompt(filePath) {
357
- let fileHandle;
358
- try {
359
- fileHandle = await (0, promises_1.open)(filePath, 'r');
360
- const rl = (0, readline_1.createInterface)({
361
- input: fileHandle.createReadStream({ encoding: 'utf-8' }),
362
- crlfDelay: Infinity,
363
- });
364
- let lineCount = 0;
365
- for await (const line of rl) {
366
- if (++lineCount > 20)
367
- break;
368
- if (!line.trim())
369
- continue;
370
- try {
371
- const obj = JSON.parse(line);
372
- if (obj.type === 'user' && obj.message) {
373
- const msgContent = obj.message.content;
374
- let text = '';
375
- if (typeof msgContent === 'string') {
376
- text = msgContent;
377
- }
378
- else if (Array.isArray(msgContent)) {
379
- const textBlock = msgContent.find((b) => b.type === 'text' && typeof b.text === 'string');
380
- text = textBlock?.text ?? '';
381
- }
382
- // 过滤系统消息
383
- if (text && !text.includes('<local-command') && !text.includes('<command-name>')) {
384
- // 先整块移除 <ide_opened_file>...</ide_opened_file>(含文件内容)
385
- text = text.replace(/<ide_opened_file>[\s\S]*?<\/ide_opened_file>/gi, '');
386
- // 再清理残余标签
387
- text = text.replace(/<[^>]+>/g, '').trim();
388
- rl.close();
389
- return text.length > 80 ? text.slice(0, 80) + '...' : text;
390
- }
391
- }
392
- }
393
- catch { /* skip unparseable line */ }
394
- }
395
- }
396
- catch { /* file read error */ }
397
- finally {
398
- await fileHandle?.close();
399
- }
400
- return undefined;
401
- }
402
- /**
403
- * 解码 Claude Code 的项目目录名
404
- * 格式:破折号替代斜杠,例如 "-Users-huge-Project-Sessix" → "/Users/huge/Project/Sessix"
405
- * 特殊情况:连续破折号 "--" 表示原始路径中包含破折号
406
- */
407
- function decodeDirName(dirName) {
408
- // 先处理连续破折号(转义的破折号),用占位符暂存
409
- const placeholder = '\x00';
410
- const escaped = dirName.replace(/--/g, placeholder);
411
- // 单破折号替代斜杠
412
- const decoded = escaped.replace(/-/g, '/');
413
- // 还原转义的破折号
414
- return decoded.replace(new RegExp(placeholder, 'g'), '-');
415
- }
416
- /**
417
- * 编码路径为 Claude Code 的目录名格式
418
- */
419
- function encodeDirName(path) {
420
- // 先转义路径中的破折号为双破折号
421
- const escaped = path.replace(/-/g, '--');
422
- // 斜杠替换为单破折号
423
- return escaped.replace(/\//g, '-');
424
- }
425
- /**
426
- * 检查目录是否存在
427
- */
428
- async function directoryExists(dirPath) {
429
- try {
430
- const s = await (0, promises_1.stat)(dirPath);
431
- return s.isDirectory();
432
- }
433
- catch {
434
- return false;
435
- }
436
- }
437
- const UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
438
- /**
439
- * 统计目录下的会话数量,并返回最新修改时间。
440
- * 支持两种格式:
441
- * - 旧格式:<uuid>.jsonl 文件
442
- * - 新格式:<uuid>/ 目录(无对应 .jsonl,新版 Claude Code subagent 模式)
443
- */
444
- async function countJsonlFilesWithMtime(dirPath) {
445
- try {
446
- const entries = await (0, promises_1.readdir)(dirPath, { withFileTypes: true });
447
- const jsonlNames = new Set(entries
448
- .filter((e) => e.isFile() && e.name.endsWith('.jsonl'))
449
- .map((e) => e.name.slice(0, -6)));
450
- // UUID 目录中,若已有对应的 .jsonl 文件则不重复计数
451
- const uuidDirs = entries.filter((e) => e.isDirectory() && UUID_RE.test(e.name) && !jsonlNames.has(e.name));
452
- let latestMtime = 0;
453
- const allEntries = [
454
- ...entries.filter((e) => e.isFile() && e.name.endsWith('.jsonl')),
455
- ...uuidDirs,
456
- ];
457
- for (const entry of allEntries) {
458
- try {
459
- const fileStat = await (0, promises_1.stat)((0, path_1.join)(dirPath, entry.name));
460
- if (fileStat.mtimeMs > latestMtime)
461
- latestMtime = fileStat.mtimeMs;
462
- }
463
- catch { /* ignore */ }
464
- }
465
- return { count: jsonlNames.size + uuidDirs.length, latestMtime };
466
- }
467
- catch {
468
- return { count: 0, latestMtime: 0 };
469
- }
470
- }
471
- //# sourceMappingURL=ProjectReader.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ProjectReader.js","sourceRoot":"","sources":["../../src/session/ProjectReader.ts"],"names":[],"mappings":"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"}
@@ -1,35 +0,0 @@
1
- import type { ServerEvent } from '@sessix/shared';
2
- /**
3
- * 监听 JSONL 会话文件的新增内容,推送到手机端。
4
- *
5
- * 使用场景:用户从 Sessix App 切到 VS Code(或其他客户端)继续会话后,
6
- * Sessix 不再管理该进程,但可以通过监听 JSONL 文件实时获取新消息。
7
- *
8
- * 轻度监听策略:
9
- * - 使用 chokidar 原生 FS 事件(非 polling),CPU 开销极低
10
- * - awaitWriteFinish 300ms 防抖,避免每次字节写入都触发
11
- * - 10 分钟无变化自动停止,不持续占用资源
12
- * - 只跟踪"字节偏移量",每次仅读新增部分
13
- */
14
- export declare class SessionFileWatcher {
15
- private watchers;
16
- private onEvent;
17
- /** 文件无变化后自动停止监听的超时时间(10 分钟) */
18
- private readonly IDLE_TIMEOUT_MS;
19
- constructor(onEvent: (event: ServerEvent) => void);
20
- /**
21
- * 开始监听指定会话的 JSONL 文件新增内容
22
- *
23
- * @param sessionId 会话 ID
24
- * @param filePath JSONL 文件绝对路径
25
- * @param byteOffset 已读到的字节位置(跳过历史内容,只推送新行)
26
- */
27
- watch(sessionId: string, filePath: string, byteOffset: number): void;
28
- /** 停止监听指定会话 */
29
- unwatch(sessionId: string): void;
30
- /** 停止所有监听(服务关闭时调用) */
31
- destroy(): void;
32
- private resetIdleTimer;
33
- private readNewLines;
34
- }
35
- //# sourceMappingURL=SessionFileWatcher.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"SessionFileWatcher.d.ts","sourceRoot":"","sources":["../../src/session/SessionFileWatcher.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAqB,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAEpE;;;;;;;;;;;GAWG;AACH,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,QAAQ,CAAgC;IAChD,OAAO,CAAC,OAAO,CAA8B;IAE7C,+BAA+B;IAC/B,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAiB;gBAErC,OAAO,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,IAAI;IAIjD;;;;;;OAMG;IACH,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI;IAiCpE,eAAe;IACf,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAWhC,sBAAsB;IACtB,OAAO,IAAI,IAAI;IAUf,OAAO,CAAC,cAAc;YAWR,YAAY;CAmD3B"}