@caoruhua/open-claude-remote 0.3.7 → 1.0.4
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/README.md +20 -0
- package/dist/backend/src/api/file-routes.d.ts +29 -0
- package/dist/backend/src/api/file-routes.d.ts.map +1 -0
- package/dist/backend/src/api/file-routes.js +288 -0
- package/dist/backend/src/api/file-routes.js.map +1 -0
- package/dist/backend/src/api/instance-routes.d.ts.map +1 -1
- package/dist/backend/src/api/instance-routes.js +19 -2
- package/dist/backend/src/api/instance-routes.js.map +1 -1
- package/dist/backend/src/api/router.d.ts.map +1 -1
- package/dist/backend/src/api/router.js +2 -0
- package/dist/backend/src/api/router.js.map +1 -1
- package/dist/backend/src/instance/instance-session.d.ts +7 -0
- package/dist/backend/src/instance/instance-session.d.ts.map +1 -1
- package/dist/backend/src/instance/instance-session.js +56 -13
- package/dist/backend/src/instance/instance-session.js.map +1 -1
- package/dist/backend/src/pty/path-detector.d.ts +83 -0
- package/dist/backend/src/pty/path-detector.d.ts.map +1 -0
- package/dist/backend/src/pty/path-detector.js +163 -0
- package/dist/backend/src/pty/path-detector.js.map +1 -0
- package/dist/backend/src/skills/skill-command-merger.d.ts +5 -6
- package/dist/backend/src/skills/skill-command-merger.d.ts.map +1 -1
- package/dist/backend/src/skills/skill-command-merger.js +41 -53
- package/dist/backend/src/skills/skill-command-merger.js.map +1 -1
- package/frontend-dist/assets/index-6CW6J4Mw.css +41 -0
- package/frontend-dist/assets/index-wh4MHpoB.js +198 -0
- package/frontend-dist/index.html +2 -2
- package/package.json +12 -5
- package/frontend-dist/assets/index-Biw9Vigh.js +0 -152
- package/frontend-dist/assets/index-DUvMeUw6.css +0 -32
package/README.md
CHANGED
|
@@ -76,6 +76,16 @@ Example: When connected to both WiFi (192.168.x.x) and company VPN (30.x.x.x), b
|
|
|
76
76
|
- Highlights key UI elements with coach marks
|
|
77
77
|
- Auto-skips on subsequent visits
|
|
78
78
|
|
|
79
|
+
### Markdown File Viewer
|
|
80
|
+
- **Floating access** — tap the floating 📄 button in the top-right corner (below instance tabs) to browse all Markdown files (auto-refreshes every 5 seconds)
|
|
81
|
+
- **Draggable position** — drag the button to reposition it anywhere on screen
|
|
82
|
+
- **Long-press to hide** — press and hold the button to hide it (refresh to restore, or use Settings > Display)
|
|
83
|
+
- **One-tap preview** — select a file to navigate to the Markdown viewer (browser back button returns to terminal)
|
|
84
|
+
- **GFM rendering** — supports GitHub Flavored Markdown (tables, task lists, strikethrough)
|
|
85
|
+
- **Code highlighting** — syntax highlighting for code blocks using highlight.js
|
|
86
|
+
- **Table of contents** — mobile: bottom drawer; desktop: right sidebar
|
|
87
|
+
- **Security** — only files within allowed workspace directories can be viewed
|
|
88
|
+
|
|
79
89
|
### Multi-Instance
|
|
80
90
|
- Run multiple `claude-remote` instances simultaneously in a single daemon process
|
|
81
91
|
- Fixed port 8866 — all instances share same origin, no cross-port auth needed
|
|
@@ -583,6 +593,16 @@ claude-remote
|
|
|
583
593
|
- 聚焦关键 UI 元素并显示提示标记
|
|
584
594
|
- 后续访问自动跳过
|
|
585
595
|
|
|
596
|
+
### Markdown 文件查看器
|
|
597
|
+
- **悬浮按钮访问** — 点击右上角的悬浮 📄 按钮(实例标签栏下方)浏览所有 Markdown 文件(每 5 秒自动刷新)
|
|
598
|
+
- **拖拽定位** — 可拖动按钮到屏幕任意位置
|
|
599
|
+
- **长按隐藏** — 长按按钮可隐藏(刷新页面恢复,或通过设置>显示重新开启)
|
|
600
|
+
- **一键预览** — 选择文件后导航到 Markdown 查看器(浏览器返回按钮回到终端)
|
|
601
|
+
- **GFM 渲染** — 支持 GitHub 风格 Markdown(表格、任务列表、删除线)
|
|
602
|
+
- **代码高亮** — 使用 highlight.js 为代码块提供语法高亮
|
|
603
|
+
- **目录导航** — 移动端:底部抽屉;桌面端:右侧边栏
|
|
604
|
+
- **安全限制** — 仅允许查看工作目录白名单内的文件
|
|
605
|
+
|
|
586
606
|
### 多实例支持
|
|
587
607
|
- 在单个守护进程中同时运行多个 `claude-remote` 实例
|
|
588
608
|
- 固定端口 8866 — 所有实例共享同源,无需跨端口认证
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { Router } from 'express';
|
|
2
|
+
import { AuthModule } from '../auth/auth-middleware.js';
|
|
3
|
+
import type { InstanceManager } from '../instance/instance-manager.js';
|
|
4
|
+
/** Markdown 文件信息 */
|
|
5
|
+
export interface MarkdownFileItem {
|
|
6
|
+
filename: string;
|
|
7
|
+
absolutePath: string;
|
|
8
|
+
relativePath: string;
|
|
9
|
+
size: number;
|
|
10
|
+
modifiedAt: string;
|
|
11
|
+
}
|
|
12
|
+
/** 文件列表响应 */
|
|
13
|
+
export interface FileListResponse {
|
|
14
|
+
files: MarkdownFileItem[];
|
|
15
|
+
cwd: string;
|
|
16
|
+
total: number;
|
|
17
|
+
}
|
|
18
|
+
export interface FileReadResponse {
|
|
19
|
+
/** 文件内容 */
|
|
20
|
+
content: string;
|
|
21
|
+
/** 文件路径(绝对路径) */
|
|
22
|
+
path: string;
|
|
23
|
+
/** 文件名 */
|
|
24
|
+
filename: string;
|
|
25
|
+
/** 文件大小(字节) */
|
|
26
|
+
size: number;
|
|
27
|
+
}
|
|
28
|
+
export declare function createFileRoutes(authModule: AuthModule, instanceManager: InstanceManager): Router;
|
|
29
|
+
//# sourceMappingURL=file-routes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-routes.d.ts","sourceRoot":"","sources":["../../../../backend/src/api/file-routes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAGjC,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AACxD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AA+CvE,oBAAoB;AACpB,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,aAAa;AACb,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,gBAAgB,EAAE,CAAC;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,gBAAgB;IAC/B,WAAW;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,iBAAiB;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU;IACV,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe;IACf,IAAI,EAAE,MAAM,CAAC;CACd;AAmFD,wBAAgB,gBAAgB,CAC9B,UAAU,EAAE,UAAU,EACtB,eAAe,EAAE,eAAe,GAC/B,MAAM,CAoMR"}
|
|
@@ -0,0 +1,288 @@
|
|
|
1
|
+
import { Router } from 'express';
|
|
2
|
+
import { readFile, stat, readdir } from 'node:fs/promises';
|
|
3
|
+
import { extname, join, relative, resolve, normalize } from 'node:path';
|
|
4
|
+
import { loadUserConfig } from '../config.js';
|
|
5
|
+
import { logger } from '../logger/logger.js';
|
|
6
|
+
/** 文件大小限制:5MB(与 PRD 一致) */
|
|
7
|
+
const MAX_FILE_SIZE = 5 * 1024 * 1024;
|
|
8
|
+
/** 允许的文件扩展名 */
|
|
9
|
+
const ALLOWED_EXTENSIONS = ['.md', '.markdown'];
|
|
10
|
+
/** 最大扫描文件数限制 */
|
|
11
|
+
const MAX_FILES = 1000;
|
|
12
|
+
/** 跳过的目录 */
|
|
13
|
+
const SKIP_DIRS = ['node_modules', 'dist', 'build', '.git'];
|
|
14
|
+
/**
|
|
15
|
+
* 检查路径是否在允许的目录白名单范围内
|
|
16
|
+
* @param path - 要检查的路径(绝对路径)
|
|
17
|
+
* @param allowedCwds - 允许的目录白名单
|
|
18
|
+
* @returns 是否允许访问
|
|
19
|
+
*/
|
|
20
|
+
function isPathAllowed(path, allowedCwds) {
|
|
21
|
+
const normalizedPath = normalize(path);
|
|
22
|
+
return allowedCwds.some((cwd) => {
|
|
23
|
+
const normalizedCwd = normalize(cwd);
|
|
24
|
+
return normalizedPath.startsWith(normalizedCwd + '/') || normalizedPath === normalizedCwd;
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* 规范化路径:将相对路径转换为绝对路径
|
|
29
|
+
* @param rawPath - 原始路径(绝对路径或相对路径)
|
|
30
|
+
* @param baseDir - 基准目录(用于解析相对路径)
|
|
31
|
+
* @returns 规范化后的绝对路径,如果路径无效则返回 null
|
|
32
|
+
*/
|
|
33
|
+
function normalizePath(rawPath, baseDir) {
|
|
34
|
+
try {
|
|
35
|
+
// 处理相对路径
|
|
36
|
+
const absolutePath = rawPath.startsWith('/') ? rawPath : resolve(baseDir, rawPath);
|
|
37
|
+
// 规范化路径,移除 ./ 和 ../
|
|
38
|
+
return normalize(absolutePath);
|
|
39
|
+
}
|
|
40
|
+
catch {
|
|
41
|
+
return null;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* 获取合并后的允许 cwd 白名单
|
|
46
|
+
* 来源:配置文件 workspaces + 已启动实例的 cwd(去重)
|
|
47
|
+
*/
|
|
48
|
+
function getAllowedCwds(instanceManager) {
|
|
49
|
+
const config = loadUserConfig();
|
|
50
|
+
const configWorkspaces = config.workspaces ?? [];
|
|
51
|
+
const instances = instanceManager.listInstances();
|
|
52
|
+
const instanceCwds = instances.map(inst => inst.cwd);
|
|
53
|
+
return [...new Set([...configWorkspaces, ...instanceCwds])];
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* 递归扫描目录中的 Markdown 文件
|
|
57
|
+
* @param dir - 要扫描的目录
|
|
58
|
+
* @param baseDir - 基准目录(用于计算相对路径)
|
|
59
|
+
* @param allowedCwds - 允许的目录白名单
|
|
60
|
+
* @param files - 已收集的文件列表(递归用)
|
|
61
|
+
* @returns Markdown 文件列表
|
|
62
|
+
*/
|
|
63
|
+
async function scanMarkdownFiles(dir, baseDir, allowedCwds, files = []) {
|
|
64
|
+
// 安全检查:路径必须在白名单范围内
|
|
65
|
+
if (!isPathAllowed(dir, allowedCwds)) {
|
|
66
|
+
logger.warn({ dir, allowedCwds }, 'Scan rejected: directory not allowed');
|
|
67
|
+
return files;
|
|
68
|
+
}
|
|
69
|
+
try {
|
|
70
|
+
const entries = await readdir(dir, { withFileTypes: true });
|
|
71
|
+
for (const entry of entries) {
|
|
72
|
+
// 达到最大文件数限制时停止扫描
|
|
73
|
+
if (files.length >= MAX_FILES) {
|
|
74
|
+
logger.warn({ dir, maxFiles: MAX_FILES }, 'Scan stopped: max file limit reached');
|
|
75
|
+
break;
|
|
76
|
+
}
|
|
77
|
+
const fullPath = join(dir, entry.name);
|
|
78
|
+
if (entry.isDirectory()) {
|
|
79
|
+
// 跳过隐藏目录和敏感目录
|
|
80
|
+
if (entry.name.startsWith('.') || SKIP_DIRS.includes(entry.name)) {
|
|
81
|
+
continue;
|
|
82
|
+
}
|
|
83
|
+
// 递归扫描子目录
|
|
84
|
+
await scanMarkdownFiles(fullPath, baseDir, allowedCwds, files);
|
|
85
|
+
}
|
|
86
|
+
else if (entry.isFile()) {
|
|
87
|
+
// 检查扩展名
|
|
88
|
+
const ext = extname(entry.name).toLowerCase();
|
|
89
|
+
if (!ALLOWED_EXTENSIONS.includes(ext)) {
|
|
90
|
+
continue;
|
|
91
|
+
}
|
|
92
|
+
try {
|
|
93
|
+
const fileStat = await stat(fullPath);
|
|
94
|
+
const relativePath = relative(baseDir, fullPath);
|
|
95
|
+
files.push({
|
|
96
|
+
filename: entry.name,
|
|
97
|
+
absolutePath: fullPath,
|
|
98
|
+
relativePath: relativePath.startsWith('.') ? relativePath : `./${relativePath}`,
|
|
99
|
+
size: fileStat.size,
|
|
100
|
+
modifiedAt: fileStat.mtime.toISOString(),
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
catch (err) {
|
|
104
|
+
logger.debug({ path: fullPath, err: String(err) }, 'Failed to stat file during scan');
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
catch (err) {
|
|
110
|
+
logger.warn({ dir, err: String(err) }, 'Failed to read directory during scan');
|
|
111
|
+
}
|
|
112
|
+
return files;
|
|
113
|
+
}
|
|
114
|
+
export function createFileRoutes(authModule, instanceManager) {
|
|
115
|
+
const router = Router();
|
|
116
|
+
/**
|
|
117
|
+
* GET /api/file/list - 列出当前工作目录下的 Markdown 文件
|
|
118
|
+
* Query params:
|
|
119
|
+
* - instanceId: 可选,指定实例 ID,优先使用该实例的 cwd
|
|
120
|
+
* - cwd: 可选,指定扫描目录(默认使用第一个实例的 cwd)
|
|
121
|
+
*/
|
|
122
|
+
router.get('/file/list', authModule.requireAuth, async (req, res) => {
|
|
123
|
+
try {
|
|
124
|
+
// 获取允许的目录白名单
|
|
125
|
+
const allowedCwds = getAllowedCwds(instanceManager);
|
|
126
|
+
// 如果白名单为空,返回空列表
|
|
127
|
+
if (allowedCwds.length === 0) {
|
|
128
|
+
logger.warn('File list request: no allowed directories');
|
|
129
|
+
res.json({
|
|
130
|
+
files: [],
|
|
131
|
+
cwd: '',
|
|
132
|
+
total: 0,
|
|
133
|
+
});
|
|
134
|
+
return;
|
|
135
|
+
}
|
|
136
|
+
// 确定扫描目录:优先级 instanceId > cwd > 默认第一个允许目录
|
|
137
|
+
const instanceId = req.query.instanceId;
|
|
138
|
+
const queryCwd = req.query.cwd;
|
|
139
|
+
let baseDir;
|
|
140
|
+
if (instanceId) {
|
|
141
|
+
// 通过 instanceId 获取实例的 cwd
|
|
142
|
+
const instance = instanceManager.getInstance(instanceId);
|
|
143
|
+
if (!instance) {
|
|
144
|
+
logger.warn({ instanceId }, 'File list rejected: instance not found');
|
|
145
|
+
res.status(404).json({ error: 'Instance not found' });
|
|
146
|
+
return;
|
|
147
|
+
}
|
|
148
|
+
baseDir = instance.cwd;
|
|
149
|
+
}
|
|
150
|
+
else if (queryCwd) {
|
|
151
|
+
baseDir = normalizePath(queryCwd, allowedCwds[0]) || allowedCwds[0];
|
|
152
|
+
}
|
|
153
|
+
else {
|
|
154
|
+
baseDir = allowedCwds[0];
|
|
155
|
+
}
|
|
156
|
+
// 安全检查:扫描目录必须在白名单范围内
|
|
157
|
+
if (!isPathAllowed(baseDir, allowedCwds)) {
|
|
158
|
+
logger.warn({ baseDir, allowedCwds }, 'File list rejected: directory not allowed');
|
|
159
|
+
res.status(403).json({
|
|
160
|
+
error: 'Access denied. Directory is outside allowed workspaces.',
|
|
161
|
+
});
|
|
162
|
+
return;
|
|
163
|
+
}
|
|
164
|
+
logger.info({ baseDir }, 'Scanning for Markdown files');
|
|
165
|
+
// 递归扫描 Markdown 文件
|
|
166
|
+
const files = await scanMarkdownFiles(baseDir, baseDir, allowedCwds);
|
|
167
|
+
// 按修改时间倒序排序
|
|
168
|
+
files.sort((a, b) => new Date(b.modifiedAt).getTime() - new Date(a.modifiedAt).getTime());
|
|
169
|
+
// 限制返回数量
|
|
170
|
+
const limitedFiles = files.slice(0, 100);
|
|
171
|
+
logger.info({
|
|
172
|
+
scanned: files.length,
|
|
173
|
+
returned: limitedFiles.length,
|
|
174
|
+
cwd: baseDir,
|
|
175
|
+
}, 'Markdown file scan completed');
|
|
176
|
+
const response = {
|
|
177
|
+
files: limitedFiles,
|
|
178
|
+
cwd: baseDir,
|
|
179
|
+
total: limitedFiles.length,
|
|
180
|
+
};
|
|
181
|
+
res.json(response);
|
|
182
|
+
}
|
|
183
|
+
catch (err) {
|
|
184
|
+
logger.error({ err }, 'Failed to list files');
|
|
185
|
+
res.status(500).json({ error: 'Internal server error' });
|
|
186
|
+
}
|
|
187
|
+
});
|
|
188
|
+
/**
|
|
189
|
+
* GET /api/file/read - 读取 Markdown 文件内容
|
|
190
|
+
* Query params:
|
|
191
|
+
* - instanceId: 可选,指定实例 ID,用于解析相对路径
|
|
192
|
+
* - path: 文件路径(绝对路径或相对于 cwd 的相对路径)
|
|
193
|
+
*/
|
|
194
|
+
router.get('/file/read', authModule.requireAuth, async (req, res) => {
|
|
195
|
+
try {
|
|
196
|
+
const rawPath = req.query.path;
|
|
197
|
+
const instanceId = req.query.instanceId;
|
|
198
|
+
if (!rawPath) {
|
|
199
|
+
res.status(400).json({ error: 'Missing path parameter' });
|
|
200
|
+
return;
|
|
201
|
+
}
|
|
202
|
+
// 获取允许的目录白名单
|
|
203
|
+
const allowedCwds = getAllowedCwds(instanceManager);
|
|
204
|
+
// 如果白名单为空,拒绝所有请求
|
|
205
|
+
if (allowedCwds.length === 0) {
|
|
206
|
+
logger.warn({ path: rawPath }, 'File read rejected: no allowed directories');
|
|
207
|
+
res.status(403).json({
|
|
208
|
+
error: 'No allowed directories configured. Start an instance first.',
|
|
209
|
+
});
|
|
210
|
+
return;
|
|
211
|
+
}
|
|
212
|
+
// 确定基准目录:优先级 instanceId > 默认第一个允许目录
|
|
213
|
+
let baseDir;
|
|
214
|
+
if (instanceId) {
|
|
215
|
+
const instance = instanceManager.getInstance(instanceId);
|
|
216
|
+
if (!instance) {
|
|
217
|
+
logger.warn({ instanceId }, 'File read rejected: instance not found');
|
|
218
|
+
res.status(404).json({ error: 'Instance not found' });
|
|
219
|
+
return;
|
|
220
|
+
}
|
|
221
|
+
baseDir = instance.cwd;
|
|
222
|
+
}
|
|
223
|
+
else {
|
|
224
|
+
baseDir = allowedCwds[0];
|
|
225
|
+
}
|
|
226
|
+
const absolutePath = normalizePath(rawPath, baseDir);
|
|
227
|
+
if (!absolutePath) {
|
|
228
|
+
res.status(400).json({ error: 'Invalid path format' });
|
|
229
|
+
return;
|
|
230
|
+
}
|
|
231
|
+
// 安全检查:路径必须在白名单范围内
|
|
232
|
+
if (!isPathAllowed(absolutePath, allowedCwds)) {
|
|
233
|
+
logger.warn({ path: absolutePath, allowedCwds }, 'File read rejected: path not allowed');
|
|
234
|
+
res.status(403).json({
|
|
235
|
+
error: 'Access denied. File is outside allowed directories.',
|
|
236
|
+
});
|
|
237
|
+
return;
|
|
238
|
+
}
|
|
239
|
+
// 扩展名检查
|
|
240
|
+
const ext = extname(absolutePath).toLowerCase();
|
|
241
|
+
if (!ALLOWED_EXTENSIONS.includes(ext)) {
|
|
242
|
+
res.status(400).json({
|
|
243
|
+
error: 'Only Markdown files (.md, .markdown) are allowed',
|
|
244
|
+
});
|
|
245
|
+
return;
|
|
246
|
+
}
|
|
247
|
+
// 检查文件是否存在并获取大小
|
|
248
|
+
let fileStat;
|
|
249
|
+
try {
|
|
250
|
+
fileStat = await stat(absolutePath);
|
|
251
|
+
}
|
|
252
|
+
catch {
|
|
253
|
+
logger.debug({ path: absolutePath }, 'File not found');
|
|
254
|
+
res.status(404).json({ error: 'File not found' });
|
|
255
|
+
return;
|
|
256
|
+
}
|
|
257
|
+
// 检查是否为文件
|
|
258
|
+
if (!fileStat.isFile()) {
|
|
259
|
+
res.status(400).json({ error: 'Path is not a file' });
|
|
260
|
+
return;
|
|
261
|
+
}
|
|
262
|
+
// 文件大小检查
|
|
263
|
+
if (fileStat.size > MAX_FILE_SIZE) {
|
|
264
|
+
res.status(413).json({
|
|
265
|
+
error: `File too large. Maximum size is ${MAX_FILE_SIZE / 1024 / 1024}MB`,
|
|
266
|
+
});
|
|
267
|
+
return;
|
|
268
|
+
}
|
|
269
|
+
// 读取文件内容
|
|
270
|
+
const content = await readFile(absolutePath, 'utf-8');
|
|
271
|
+
const filename = absolutePath.split('/').pop() || absolutePath;
|
|
272
|
+
logger.info({ path: absolutePath, size: fileStat.size }, 'File read successfully');
|
|
273
|
+
const response = {
|
|
274
|
+
content,
|
|
275
|
+
path: absolutePath,
|
|
276
|
+
filename,
|
|
277
|
+
size: fileStat.size,
|
|
278
|
+
};
|
|
279
|
+
res.json(response);
|
|
280
|
+
}
|
|
281
|
+
catch (err) {
|
|
282
|
+
logger.error({ err }, 'Failed to read file');
|
|
283
|
+
res.status(500).json({ error: 'Internal server error' });
|
|
284
|
+
}
|
|
285
|
+
});
|
|
286
|
+
return router;
|
|
287
|
+
}
|
|
288
|
+
//# sourceMappingURL=file-routes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-routes.js","sourceRoot":"","sources":["../../../../backend/src/api/file-routes.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"instance-routes.d.ts","sourceRoot":"","sources":["../../../../backend/src/api/instance-routes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAGjC,OAAO,KAAK,EAAoB,YAAY,EAAE,MAAM,SAAS,CAAC;AAC9D,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AACxD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;
|
|
1
|
+
{"version":3,"file":"instance-routes.d.ts","sourceRoot":"","sources":["../../../../backend/src/api/instance-routes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAGjC,OAAO,KAAK,EAAoB,YAAY,EAAE,MAAM,SAAS,CAAC;AAC9D,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AACxD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAoDvE,MAAM,WAAW,qBAAqB;IACpC,WAAW;IACX,GAAG,EAAE,MAAM,CAAC;IACZ,eAAe;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,sBAAsB;IACtB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,iDAAiD;IACjD,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,sBAAsB;IACrC,eAAe;IACf,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,gBAAgB;IAChB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,wBAAwB;IACxB,aAAa,EAAE,YAAY,EAAE,CAAC;IAC9B,8BAA8B;IAC9B,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB;AAED,wBAAgB,oBAAoB,CAClC,UAAU,EAAE,UAAU,EACtB,eAAe,EAAE,eAAe,GAC/B,MAAM,CAsHR"}
|
|
@@ -6,11 +6,15 @@ import { logger } from '../logger/logger.js';
|
|
|
6
6
|
/**
|
|
7
7
|
* 检查 cwd 是否在允许的路径范围内
|
|
8
8
|
* 只允许白名单中的目录或其子目录
|
|
9
|
+
* 注意:macOS 文件系统默认大小写不敏感,需要规范化比较
|
|
9
10
|
*/
|
|
10
11
|
function isCwdAllowed(absoluteCwd, allowedCwds) {
|
|
12
|
+
// 规范化比较路径(macOS 大小写不敏感)
|
|
13
|
+
const normalizedCwd = absoluteCwd.toLowerCase();
|
|
11
14
|
for (const allowed of allowedCwds) {
|
|
12
15
|
const absAllowed = resolve(allowed);
|
|
13
|
-
const
|
|
16
|
+
const normalizedAllowed = absAllowed.toLowerCase();
|
|
17
|
+
const rel = relative(normalizedAllowed, normalizedCwd);
|
|
14
18
|
// rel 为空字符串表示路径相同,不以 '..' 开头表示是子目录
|
|
15
19
|
if (rel === '' || (rel && !rel.startsWith('..'))) {
|
|
16
20
|
return true;
|
|
@@ -21,13 +25,26 @@ function isCwdAllowed(absoluteCwd, allowedCwds) {
|
|
|
21
25
|
/**
|
|
22
26
|
* 获取合并后的允许 cwd 白名单
|
|
23
27
|
* 来源:配置文件 workspaces + 已启动实例的 cwd(去重)
|
|
28
|
+
* 注意:macOS 文件系统默认大小写不敏感,需要规范化去重
|
|
24
29
|
*/
|
|
25
30
|
function getAllowedCwds(instanceManager) {
|
|
26
31
|
const config = loadUserConfig();
|
|
27
32
|
const configWorkspaces = config.workspaces ?? [];
|
|
28
33
|
const instances = instanceManager.listInstances();
|
|
29
34
|
const instanceCwds = instances.map(inst => inst.cwd);
|
|
30
|
-
|
|
35
|
+
// 规范化去重:使用 resolve + toLowerCase 作为 key
|
|
36
|
+
// macOS 文件系统默认大小写不敏感,需要小写比较
|
|
37
|
+
const seen = new Set();
|
|
38
|
+
const result = [];
|
|
39
|
+
for (const cwd of [...configWorkspaces, ...instanceCwds]) {
|
|
40
|
+
const resolved = resolve(cwd);
|
|
41
|
+
const normalizedKey = resolved.toLowerCase();
|
|
42
|
+
if (!seen.has(normalizedKey)) {
|
|
43
|
+
seen.add(normalizedKey);
|
|
44
|
+
result.push(resolved);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
return result;
|
|
31
48
|
}
|
|
32
49
|
export function createInstanceRoutes(authModule, instanceManager) {
|
|
33
50
|
const router = Router();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"instance-routes.js","sourceRoot":"","sources":["../../../../backend/src/api/instance-routes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAI9C,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAClF,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAE7C
|
|
1
|
+
{"version":3,"file":"instance-routes.js","sourceRoot":"","sources":["../../../../backend/src/api/instance-routes.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../../../../backend/src/api/router.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../../../../backend/src/api/router.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AASjC,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AACvE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,yCAAyC,CAAC;AACnF,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,iDAAiD,CAAC;AAGlG,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,UAAU,CAAC;IACvB,eAAe,EAAE,eAAe,CAAC;IACjC,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,mBAAmB,CAAC,EAAE,mBAAmB,CAAC;IAC1C,0BAA0B,CAAC,EAAE,0BAA0B,CAAC;IACxD,aAAa;IACb,IAAI,EAAE,MAAM,CAAC;IACb,uBAAuB;IACvB,mBAAmB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC/B,oBAAoB;IACpB,UAAU,CAAC,EAAE,MAAM,IAAI,CAAC;CACzB;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,gBAAgB,GAAG,MAAM,CAoD9D"}
|
|
@@ -6,6 +6,7 @@ import { createHookRoutes } from './hook-routes.js';
|
|
|
6
6
|
import { createPushRoutes } from './push-routes.js';
|
|
7
7
|
import { createInstanceRoutes } from './instance-routes.js';
|
|
8
8
|
import { createConfigRoutes } from './config-routes.js';
|
|
9
|
+
import { createFileRoutes } from './file-routes.js';
|
|
9
10
|
import { logger } from '../logger/logger.js';
|
|
10
11
|
export function createApiRouter(opts) {
|
|
11
12
|
const router = Router();
|
|
@@ -23,6 +24,7 @@ export function createApiRouter(opts) {
|
|
|
23
24
|
router.use(createPushRoutes(opts.authModule, opts.pushService));
|
|
24
25
|
}
|
|
25
26
|
router.use(createInstanceRoutes(opts.authModule, opts.instanceManager));
|
|
27
|
+
router.use(createFileRoutes(opts.authModule, opts.instanceManager));
|
|
26
28
|
// Shutdown endpoint (localhost only, requires confirmation)
|
|
27
29
|
if (opts.onShutdown) {
|
|
28
30
|
const shutdownFn = opts.onShutdown;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"router.js","sourceRoot":"","sources":["../../../../backend/src/api/router.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"router.js","sourceRoot":"","sources":["../../../../backend/src/api/router.ts"],"names":[],"mappings":"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"}
|
|
@@ -27,6 +27,12 @@ export interface InstanceSessionOptions {
|
|
|
27
27
|
* 复用 SessionController 的核心逻辑
|
|
28
28
|
*/
|
|
29
29
|
export declare class InstanceSession extends EventEmitter {
|
|
30
|
+
/**
|
|
31
|
+
* Delay before falling back active source when the last client of a type disconnects.
|
|
32
|
+
* Prevents unnecessary PTY resize cycles during tab switching:
|
|
33
|
+
* webapp disconnect → relay.resumeResize → PTY resize → Claude Code clear screen → content loss.
|
|
34
|
+
*/
|
|
35
|
+
static readonly ACTIVE_SOURCE_FALLBACK_DELAY_MS = 3000;
|
|
30
36
|
readonly instanceId: string;
|
|
31
37
|
readonly name: string;
|
|
32
38
|
readonly cwd: string;
|
|
@@ -41,6 +47,7 @@ export declare class InstanceSession extends EventEmitter {
|
|
|
41
47
|
private _activeSource;
|
|
42
48
|
private _lastKnownSizes;
|
|
43
49
|
private _relay;
|
|
50
|
+
private activeSourceFallbackTimer;
|
|
44
51
|
private pushService;
|
|
45
52
|
private notificationServiceFactory;
|
|
46
53
|
private notificationManager;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"instance-session.d.ts","sourceRoot":"","sources":["../../../../backend/src/instance/instance-session.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AAC/B,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAE5D,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAEnD,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAGzD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AACnE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,yCAAyC,CAAC;AACnF,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,iDAAiD,CAAC;AAKlG,qCAAqC;AACrC,MAAM,MAAM,UAAU,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAE7C,iDAAiD;AACjD,MAAM,MAAM,YAAY,GAAG,OAAO,GAAG,QAAQ,GAAG,QAAQ,GAAG,IAAI,CAAC;AAQhE,MAAM,WAAW,sBAAsB;IACrC,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,OAAO,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,gCAAgC;IAChC,UAAU,CAAC,EAAE,UAAU,CAAC;CACzB;AAED;;;;GAIG;AACH,qBAAa,eAAgB,SAAQ,YAAY;IAC/C,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,UAAU,EAAE,MAAM,EAAE,CAAC;IAC9B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAE3B,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAC;IAChC,QAAQ,CAAC,YAAY,EAAE,YAAY,CAAC;IAEpC,OAAO,CAAC,OAAO,CAAyB;IACxC,OAAO,CAAC,MAAM,CAAe;IAC7B,OAAO,CAAC,OAAO,CAA8B;IAE7C,OAAO,CAAC,aAAa,CAAsB;IAC3C,OAAO,CAAC,eAAe,CAA0D;IACjF,OAAO,CAAC,MAAM,CAA8B;
|
|
1
|
+
{"version":3,"file":"instance-session.d.ts","sourceRoot":"","sources":["../../../../backend/src/instance/instance-session.ts"],"names":[],"mappings":"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"}
|