✨ feat(vscode): 文件和文件夹在预览顶部问

侧栏「问 AI」打开代码阅读预览。文件夹是没有代码块的一页,源码文件在整页顶部聊,代码块下面的问答不动。历史按工作区文件夹和相对路径记在窗口状态里,不写进按块存的记录。
This commit is contained in:
cruldra committed 2026-10-03 03:22:20 +08:00
1 parent 2be635d1e5
commit 2c10acf9c4
19 files changed
+610 -459

No files matched your search

@@ -0,0 +1,35 @@
/**
* 顶部问答带给模型的材料:文件是相对路径加开头若干行,文件夹是相对路径加这一层的名字。
*/
import type { Uri, WorkspaceFolder } from 'vscode'
import type { ExcludeSetting } from '../explorer/fileEntries'
import type { PathAskSubject, PathChild } from './pathAskPrompt'
import { FileType, workspace } from 'vscode'
import { createExcludeMatcher, sortEntries } from '../explorer/fileEntries'
import { readFileHead } from './pathAskContext'
import { displayRelativePath } from './pathQa'
export async function describePath(target: { uri: Uri, folder: WorkspaceFolder, isDirectory: boolean, relativePath: string }): Promise<PathAskSubject> {
const relativePath = displayRelativePath(target.relativePath)
if (target.isDirectory)
return { kind: 'folder', relativePath, children: await folderChildren(target.uri, target.folder, target.relativePath) }
return { kind: 'file', relativePath, head: await readFileHead(target.uri.fsPath) }
}
/** 文件夹这一层的子文件和子目录;files.exclude 排除的不列。列不出来时只留原因。 */
async function folderChildren(uri: Uri, folder: WorkspaceFolder, relativePath: string): Promise<PathChild[] | { unavailable: string }> {
let entries: [string, FileType][]
try {
entries = await workspace.fs.readDirectory(uri)
}
catch (err) {
const message = err instanceof Error ? err.message : String(err)
return { unavailable: `列不出来(${message})。` }
}
const excluded = createExcludeMatcher(workspace.getConfiguration('files', folder).get<ExcludeSetting>('exclude'))
const names = new Set(entries.map(([name]) => name))
return sortEntries(entries.map(([name, type]) => ({ name, isDirectory: (type & FileType.Directory) !== 0 })))
.filter(entry => !excluded(relativePath ? `${relativePath}/${entry.name}` : entry.name, names))
.map(entry => ({ name: entry.name, kind: entry.isDirectory ? 'folder' : 'file' }))
}