iflow-run 1.0.7 → 1.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.
package/.npmignore ADDED
@@ -0,0 +1,46 @@
1
+ # 源码管理
2
+ .git
3
+ .gitignore
4
+
5
+ # 开发文件
6
+ node_modules/
7
+ test_screenshot.py
8
+ tool-display-test*.jpg
9
+ AGENTS.md
10
+ TODO.md
11
+
12
+ # TypeScript 源文件
13
+ *.ts
14
+ !bin/*.js
15
+ tsconfig.json
16
+ vite.config.ts
17
+
18
+ # ESLint 和 Prettier 配置
19
+ .eslintrc.json
20
+ .prettierrc
21
+ .prettierignore
22
+
23
+ # 测试文件
24
+ test-features.html
25
+ test.html
26
+
27
+ # IDE 配置
28
+ .vscode/
29
+ .idea/
30
+ *.swp
31
+ *.swo
32
+ *~
33
+
34
+ # 系统文件
35
+ .DS_Store
36
+ Thumbs.db
37
+
38
+ # 日志文件
39
+ *.log
40
+ npm-debug.log*
41
+ yarn-debug.log*
42
+ yarn-error.log*
43
+
44
+ # 临时文件
45
+ .tmp/
46
+ temp/
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../server.ts"],"names":[],"mappings":""}
package/dist/server.js ADDED
@@ -0,0 +1,403 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const express_1 = __importDefault(require("express"));
7
+ const promises_1 = __importDefault(require("fs/promises"));
8
+ const fs_1 = __importDefault(require("fs"));
9
+ const path_1 = __importDefault(require("path"));
10
+ const cors_1 = __importDefault(require("cors"));
11
+ const os_1 = __importDefault(require("os"));
12
+ const ws_1 = require("ws");
13
+ const http_1 = __importDefault(require("http"));
14
+ // 全局变量
15
+ const app = (0, express_1.default)();
16
+ const currentDir = path_1.default.dirname(__filename);
17
+ // 配置
18
+ const args = process.argv.slice(2);
19
+ const portArg = args.find(arg => arg.startsWith('--port='))?.split('=')[1];
20
+ const PORT = parseInt(getQueryParam(process.env.PORT || process.env.IFLOW_RUN_PORT || portArg, '3000'));
21
+ let IFLOW_DIR = getQueryParam(process.env.IFLOW_DIR || process.env.IFLOW_RUN_DIR || args.find(arg => arg.startsWith('--dir='))?.split('=')[1]);
22
+ if (!IFLOW_DIR) {
23
+ const homeDir = os_1.default.homedir();
24
+ IFLOW_DIR = path_1.default.join(homeDir, '.iflow');
25
+ }
26
+ const PROJECTS_DIR = path_1.default.join(IFLOW_DIR, 'projects');
27
+ // 缓存配置
28
+ const CACHE_TTL = 5 * 60 * 1000;
29
+ let projectsCache = null;
30
+ let projectsCacheTime = 0;
31
+ // WebSocket 客户端集合
32
+ const wsClients = new Set();
33
+ // 中间件
34
+ app.use((0, cors_1.default)());
35
+ app.use(express_1.default.json());
36
+ app.use(express_1.default.static(path_1.default.join(currentDir, 'public')));
37
+ // 创建 HTTP 服务器用于 WebSocket
38
+ const server = http_1.default.createServer(app);
39
+ const wss = new ws_1.WebSocketServer({ server, path: '/ws' });
40
+ // WebSocket 连接处理
41
+ wss.on('connection', (ws) => {
42
+ console.log('WebSocket 客户端已连接');
43
+ wsClients.add(ws);
44
+ ws.on('close', () => {
45
+ console.log('WebSocket 客户端已断开');
46
+ wsClients.delete(ws);
47
+ });
48
+ ws.on('error', (error) => {
49
+ console.error('WebSocket 错误:', error);
50
+ });
51
+ });
52
+ // 广播消息到所有客户端
53
+ function broadcast(message) {
54
+ wsClients.forEach(client => {
55
+ if (client.readyState === ws_1.WebSocket.OPEN) {
56
+ client.send(JSON.stringify(message));
57
+ }
58
+ });
59
+ }
60
+ // 监听会话文件变化
61
+ async function watchSessions() {
62
+ try {
63
+ const dirExists = await promises_1.default.access(PROJECTS_DIR).then(() => true).catch(() => false);
64
+ if (!dirExists)
65
+ return;
66
+ fs_1.default.watch(PROJECTS_DIR, { recursive: true }, (eventType, filename) => {
67
+ if (filename && (filename.startsWith('session-') || eventType === 'rename')) {
68
+ console.log(`检测到会话文件变化: ${filename}`);
69
+ // 清除缓存
70
+ projectsCache = null;
71
+ projectsCacheTime = 0;
72
+ // 通知客户端
73
+ broadcast({
74
+ type: 'session_update',
75
+ timestamp: Date.now()
76
+ });
77
+ }
78
+ });
79
+ }
80
+ catch (error) {
81
+ console.error('监听会话文件变化失败:', error);
82
+ }
83
+ }
84
+ // 辅助函数:安全获取字符串查询参数
85
+ function getQueryParam(value, defaultValue = '') {
86
+ if (Array.isArray(value)) {
87
+ return String(value[0] || defaultValue);
88
+ }
89
+ return String(value || defaultValue);
90
+ }
91
+ // 获取所有项目(支持分页)
92
+ app.get('/api/projects', async (req, res) => {
93
+ try {
94
+ const page = parseInt(getQueryParam(req.query.page, '1')) || 1;
95
+ const limit = parseInt(getQueryParam(req.query.limit, '20')) || 20;
96
+ const search = getQueryParam(req.query.search, '').toLowerCase();
97
+ // 检查缓存
98
+ const now = Date.now();
99
+ if (projectsCache && (now - projectsCacheTime) < CACHE_TTL && !search) {
100
+ // 分页
101
+ const startIndex = (page - 1) * limit;
102
+ const endIndex = startIndex + limit;
103
+ const paginatedProjects = projectsCache.slice(startIndex, endIndex);
104
+ return res.json({
105
+ projects: paginatedProjects,
106
+ total: projectsCache.length,
107
+ page,
108
+ limit,
109
+ totalPages: Math.ceil(projectsCache.length / limit)
110
+ });
111
+ }
112
+ // 检查目录是否存在
113
+ const dirExists = await promises_1.default.access(PROJECTS_DIR).then(() => true).catch(() => false);
114
+ if (!dirExists) {
115
+ return res.json({ projects: [], total: 0, page, limit, totalPages: 0 });
116
+ }
117
+ const entries = await promises_1.default.readdir(PROJECTS_DIR, { withFileTypes: true });
118
+ const projects = [];
119
+ for (const dirent of entries) {
120
+ if (!dirent.isDirectory())
121
+ continue;
122
+ // 搜索过滤
123
+ if (search && !dirent.name.toLowerCase().includes(search))
124
+ continue;
125
+ const projectPath = path_1.default.join(PROJECTS_DIR, dirent.name);
126
+ const files = await promises_1.default.readdir(projectPath);
127
+ const sessionFiles = files
128
+ .filter(file => file.startsWith('session-') && file.endsWith('.jsonl'))
129
+ .sort((a, b) => {
130
+ const statA = fs_1.default.statSync(path_1.default.join(projectPath, a));
131
+ const statB = fs_1.default.statSync(path_1.default.join(projectPath, b));
132
+ return statB.mtimeMs - statA.mtimeMs;
133
+ });
134
+ if (sessionFiles.length === 0)
135
+ continue;
136
+ const sessions = [];
137
+ for (const file of sessionFiles) {
138
+ const sessionId = file.replace('.jsonl', '');
139
+ const sessionFile = path_1.default.join(projectPath, file);
140
+ const stats = fs_1.default.statSync(sessionFile);
141
+ const mtime = stats.mtime;
142
+ // 优化:只读取文件的前几行来获取预览
143
+ let preview = '暂无预览';
144
+ try {
145
+ const content = await promises_1.default.readFile(sessionFile, 'utf8');
146
+ const lines = content.split('\n').filter(line => line.trim()).slice(0, 2);
147
+ if (lines.length > 0) {
148
+ const firstMessage = JSON.parse(lines[0]);
149
+ if (firstMessage.message && firstMessage.message.content) {
150
+ const msgContent = firstMessage.message.content;
151
+ if (typeof msgContent === 'string') {
152
+ preview = msgContent;
153
+ }
154
+ else if (Array.isArray(msgContent)) {
155
+ const textParts = msgContent.filter(c => c.type === 'text').map(c => c.text);
156
+ if (textParts.length > 0) {
157
+ preview = textParts.join(' ');
158
+ }
159
+ }
160
+ if (preview.length > 100) {
161
+ preview = preview.substring(0, 100) + '...';
162
+ }
163
+ }
164
+ }
165
+ }
166
+ catch (err) {
167
+ console.error(`Error reading session preview for ${file}:`, err);
168
+ }
169
+ sessions.push({
170
+ id: sessionId,
171
+ file: file,
172
+ mtime: mtime,
173
+ preview: preview
174
+ });
175
+ }
176
+ projects.push({
177
+ id: dirent.name,
178
+ name: dirent.name.replace(/^-/g, ''),
179
+ sessionCount: sessionFiles.length,
180
+ sessions: sessions
181
+ });
182
+ }
183
+ // 更新缓存
184
+ projectsCache = projects;
185
+ projectsCacheTime = now;
186
+ // 分页
187
+ const startIndex = (page - 1) * limit;
188
+ const endIndex = startIndex + limit;
189
+ const paginatedProjects = projects.slice(startIndex, endIndex);
190
+ res.json({
191
+ projects: paginatedProjects,
192
+ total: projects.length,
193
+ page,
194
+ limit,
195
+ totalPages: Math.ceil(projects.length / limit)
196
+ });
197
+ }
198
+ catch (error) {
199
+ console.error('Error reading projects:', error);
200
+ res.status(500).json({ error: 'Failed to read projects', message: error.message });
201
+ }
202
+ });
203
+ // 读取会话消息
204
+ app.get('/api/sessions/:projectId/:sessionId', async (req, res) => {
205
+ try {
206
+ const { projectId, sessionId } = req.params;
207
+ const sessionFile = path_1.default.join(PROJECTS_DIR, String(projectId), `${String(sessionId)}.jsonl`);
208
+ const fileExists = await promises_1.default.access(sessionFile).then(() => true).catch(() => false);
209
+ if (!fileExists) {
210
+ return res.status(404).json({ error: 'Session not found' });
211
+ }
212
+ const content = await promises_1.default.readFile(sessionFile, 'utf8');
213
+ const messages = content.split('\n')
214
+ .filter(line => line.trim())
215
+ .map(line => JSON.parse(line));
216
+ res.json(messages);
217
+ }
218
+ catch (error) {
219
+ console.error('Error reading session:', error);
220
+ res.status(500).json({ error: 'Failed to read session', message: error.message });
221
+ }
222
+ });
223
+ // 搜索会话
224
+ app.get('/api/search', async (req, res) => {
225
+ try {
226
+ const query = getQueryParam(req.query.q, '');
227
+ const page = parseInt(getQueryParam(req.query.page, '1')) || 1;
228
+ const limit = parseInt(getQueryParam(req.query.limit, '20')) || 20;
229
+ const type = getQueryParam(req.query.type, 'all');
230
+ const startDate = req.query.startDate ? parseInt(getQueryParam(req.query.startDate)) : null;
231
+ const endDate = req.query.endDate ? parseInt(getQueryParam(req.query.endDate)) : null;
232
+ if (!query.trim()) {
233
+ return res.json({ results: [], total: 0, page, limit });
234
+ }
235
+ const dirExists = await promises_1.default.access(PROJECTS_DIR).then(() => true).catch(() => false);
236
+ if (!dirExists) {
237
+ return res.json({ results: [], total: 0, page, limit });
238
+ }
239
+ const entries = await promises_1.default.readdir(PROJECTS_DIR, { withFileTypes: true });
240
+ const results = [];
241
+ const lowerQuery = query.toLowerCase();
242
+ for (const project of entries) {
243
+ if (!project.isDirectory())
244
+ continue;
245
+ const projectPath = path_1.default.join(PROJECTS_DIR, project.name);
246
+ const files = await promises_1.default.readdir(projectPath);
247
+ const sessionFiles = files.filter(file => file.startsWith('session-') && file.endsWith('.jsonl'));
248
+ for (const file of sessionFiles) {
249
+ const sessionFile = path_1.default.join(projectPath, file);
250
+ const sessionId = file.replace('.jsonl', '');
251
+ try {
252
+ const content = await promises_1.default.readFile(sessionFile, 'utf8');
253
+ const lines = content.split('\n').filter(line => line.trim());
254
+ for (const line of lines) {
255
+ const msg = JSON.parse(line);
256
+ const messageContent = extractContent(msg);
257
+ if (type !== 'all' && msg.type !== type)
258
+ continue;
259
+ if (startDate && msg.timestamp < startDate)
260
+ continue;
261
+ if (endDate && msg.timestamp > endDate)
262
+ continue;
263
+ if (messageContent.toLowerCase().includes(lowerQuery)) {
264
+ results.push({
265
+ projectId: project.name,
266
+ projectName: project.name,
267
+ sessionId: sessionId,
268
+ content: messageContent.substring(0, 200) + (messageContent.length > 200 ? '...' : ''),
269
+ type: msg.type,
270
+ timestamp: msg.timestamp,
271
+ uuid: msg.uuid || ''
272
+ });
273
+ }
274
+ }
275
+ }
276
+ catch (err) {
277
+ console.error(`Error searching session ${file}:`, err);
278
+ }
279
+ }
280
+ }
281
+ results.sort((a, b) => b.timestamp - a.timestamp);
282
+ const total = results.length;
283
+ const startIndex = (page - 1) * limit;
284
+ const paginatedResults = results.slice(startIndex, startIndex + limit);
285
+ res.json({
286
+ results: paginatedResults,
287
+ total,
288
+ page,
289
+ limit,
290
+ totalPages: Math.ceil(total / limit)
291
+ });
292
+ }
293
+ catch (error) {
294
+ console.error('Error searching sessions:', error);
295
+ res.status(500).json({ error: 'Failed to search sessions', message: error.message });
296
+ }
297
+ });
298
+ // 打开项目目录
299
+ app.get('/api/open-directory/:projectId', async (req, res) => {
300
+ try {
301
+ const { projectId } = req.params;
302
+ const projectPath = path_1.default.join(PROJECTS_DIR, String(projectId));
303
+ const dirExists = await promises_1.default.access(projectPath).then(() => true).catch(() => false);
304
+ if (!dirExists) {
305
+ return res.status(404).json({ error: 'Project directory not found' });
306
+ }
307
+ const { exec, spawn } = require('child_process');
308
+ if (process.platform === 'win32') {
309
+ spawn('explorer.exe', [projectPath], { detached: true });
310
+ res.json({ success: true, path: projectPath });
311
+ }
312
+ else if (process.platform === 'darwin') {
313
+ exec(`open "${projectPath}"`, (error) => {
314
+ if (error) {
315
+ console.error('Failed to open directory:', error);
316
+ return res.status(500).json({ error: 'Failed to open directory', message: error.message });
317
+ }
318
+ res.json({ success: true, path: projectPath });
319
+ });
320
+ }
321
+ else {
322
+ exec(`xdg-open "${projectPath}"`, (error) => {
323
+ if (error) {
324
+ console.error('Failed to open directory:', error);
325
+ return res.status(500).json({ error: 'Failed to open directory', message: error.message });
326
+ }
327
+ res.json({ success: true, path: projectPath });
328
+ });
329
+ }
330
+ }
331
+ catch (error) {
332
+ console.error('Error opening directory:', error);
333
+ res.status(500).json({ error: 'Failed to open directory', message: error.message });
334
+ }
335
+ });
336
+ // 提取消息内容
337
+ function extractContent(msg) {
338
+ if (!msg.message || !msg.message.content)
339
+ return '';
340
+ const content = msg.message.content;
341
+ if (typeof content === 'string')
342
+ return content;
343
+ if (Array.isArray(content)) {
344
+ const textParts = content.filter(c => c.type === 'text').map(c => c.text);
345
+ return textParts.join(' ');
346
+ }
347
+ return JSON.stringify(content);
348
+ }
349
+ // 检测端口是否可用
350
+ function isPortAvailable(port) {
351
+ return new Promise((resolve) => {
352
+ const net = require('net');
353
+ const server = net.createServer();
354
+ server.once('error', (err) => {
355
+ if (err.code === 'EADDRINUSE') {
356
+ resolve(false);
357
+ }
358
+ else {
359
+ resolve(true);
360
+ }
361
+ });
362
+ server.once('listening', () => {
363
+ server.close();
364
+ resolve(true);
365
+ });
366
+ server.listen(port);
367
+ });
368
+ }
369
+ // 自动查找可用端口
370
+ async function findAvailablePort(startPort) {
371
+ let port = startPort;
372
+ let attempts = 0;
373
+ const maxAttempts = 100;
374
+ while (attempts < maxAttempts) {
375
+ const available = await isPortAvailable(port);
376
+ if (available) {
377
+ return port;
378
+ }
379
+ port++;
380
+ attempts++;
381
+ }
382
+ throw new Error(`Unable to find available port after ${maxAttempts} attempts`);
383
+ }
384
+ // 启动服务器
385
+ (async () => {
386
+ try {
387
+ const availablePort = await findAvailablePort(PORT);
388
+ if (availablePort !== PORT) {
389
+ console.log(`Port ${PORT} is occupied, using port ${availablePort} instead`);
390
+ }
391
+ // 启动文件监听
392
+ watchSessions();
393
+ server.listen(availablePort, () => {
394
+ console.log(`iflow-run server running at http://localhost:${availablePort}`);
395
+ console.log(`WebSocket server running at ws://localhost:${availablePort}/ws`);
396
+ });
397
+ }
398
+ catch (error) {
399
+ console.error('Failed to start server:', error.message);
400
+ process.exit(1);
401
+ }
402
+ })();
403
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../server.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1 +1 @@
1
- {"name":"iflow-run","version":"1.0.7","description":"查看 iflow-cli 会话轨迹和历史会话的 Web 应用","type":"commonjs","main":"server.js","bin":{"iflow-run":"./bin/iflow-run.js"},"scripts":{"start":"node server.js","dev":"node server.js"},"keywords":["iflow","session","history","cli","viewer","dashboard"],"author":"dukewen <dukewen666@gmail.com>","license":"MIT","files":["bin/","public/","server.js","package.json","README.md"],"dependencies":{"express":"^4.18.2","cors":"^2.8.5"},"engines":{"node":">=14.0.0"}}
1
+ {"name":"iflow-run","version":"1.1.0","description":"查看 iflow-cli 会话轨迹和历史会话的 Web 应用","type":"commonjs","main":"dist/server.js","bin":{"iflow-run":"./bin/iflow-run.js"},"scripts":{"start":"node dist/server.js","dev":"node dist/server.js","dev:watch":"tsx watch server.ts","build:server":"tsc","build:frontend":"vite build","build":"npm run build:server && npm run build:frontend","type-check":"tsc --noEmit","lint":"eslint . --ext .ts,.tsx,.js,.jsx","lint:fix":"eslint . --ext .ts,.tsx,.js,.jsx --fix","format":"prettier --write \"**/*.{ts,tsx,js,jsx,json,css,html,md}\"","test":"jest","test:e2e":"playwright test"},"keywords":["iflow","session","history","cli","viewer","dashboard"],"author":"dukewen <dukewen666@gmail.com>","license":"MIT","files":["bin/","dist/","public/","package.json","README.md",".npmignore"],"dependencies":{"cors":"^2.8.5","express":"^4.18.2","highlight.js":"^11.11.1","marked":"^17.0.3","ws":"^8.19.0"},"engines":{"node":">=14.0.0"},"devDependencies":{"@types/cors":"^2.8.19","@types/express":"^5.0.6","@types/node":"^25.3.3","@types/ws":"^8.18.1","@typescript-eslint/eslint-plugin":"^8.56.1","@typescript-eslint/parser":"^8.56.1","@vitejs/plugin-react":"^5.1.4","eslint":"^10.0.2","eslint-config-prettier":"^10.1.8","eslint-plugin-prettier":"^5.5.5","prettier":"^3.8.1","tsx":"^4.19.2","typescript":"^5.9.3","vite":"^7.3.1"}}