Fix file browser absolute path copy (#860)

This commit is contained in:
Zhicheng Han
2026-05-20 04:36:49 +02:00
committed by GitHub
parent 7f6b691238
commit 5fc7dce9c8
8 changed files with 181 additions and 6 deletions
+6 -2
View File
@@ -6,6 +6,10 @@ import {
MAX_EDIT_SIZE,
} from '../../services/hermes/file-provider'
function withAbsolutePath<T extends { path: string }>(entry: T): T & { absolutePath: string } {
return { ...entry, absolutePath: resolveHermesPath(entry.path) }
}
export const fileRoutes = new Router()
function handleError(ctx: any, err: any) {
@@ -39,7 +43,7 @@ fileRoutes.get('/api/hermes/files/list', async (ctx) => {
if (a.isDir !== b.isDir) return a.isDir ? -1 : 1
return a.name.localeCompare(b.name)
})
ctx.body = { entries, path: relativePath }
ctx.body = { entries: entries.map(withAbsolutePath), path: relativePath, absolutePath: absPath }
} catch (err: any) {
handleError(ctx, err)
}
@@ -57,7 +61,7 @@ fileRoutes.get('/api/hermes/files/stat', async (ctx) => {
const absPath = resolveHermesPath(relativePath)
const provider = await createFileProvider()
const info = await provider.stat(absPath)
ctx.body = info
ctx.body = withAbsolutePath(info)
} catch (err: any) {
handleError(ctx, err)
}
+20 -2
View File
@@ -1,8 +1,10 @@
import { WebSocketServer } from 'ws'
import type { Server as HttpServer } from 'http'
import { accessSync, chmodSync, constants as fsConstants, existsSync } from 'fs'
import { dirname, join } from 'path'
import { dirname, join, isAbsolute, resolve as resolvePath } from 'path'
import { homedir } from 'os'
import { getActiveProfileDir } from '../../services/hermes/hermes-profile'
import { getTerminalConfig, type TerminalConfig } from '../../services/hermes/file-provider'
import { getToken } from '../../services/auth'
import { logger } from '../../services/logger'
@@ -66,6 +68,22 @@ function shellName(shell: string): string {
return shell.split('/').pop() || 'shell'
}
export function resolveTerminalCwd(
cfg: Pick<TerminalConfig, 'cwd'> = getTerminalConfig(),
profileDir = getActiveProfileDir(),
): string {
const configured = cfg.cwd?.trim()
const fallback = existsSync(profileDir) ? profileDir : homedir()
if (!configured) return fallback
const cwd = isAbsolute(configured) ? configured : resolvePath(profileDir, configured)
if (!existsSync(cwd)) {
logger.warn({ cwd }, 'Configured terminal cwd does not exist; falling back to Hermes profile directory')
return fallback
}
return cwd
}
// ─── Session types ──────────────────────────────────────────────
interface PtySession {
@@ -96,7 +114,7 @@ function createSession(shell: string): PtySession {
name: 'xterm-color',
cols: 80,
rows: 24,
cwd: homedir(),
cwd: resolveTerminalCwd(),
})
} catch (err: any) {
throw new Error(`Failed to spawn shell "${shell}": ${err.message}`)