
















@@ -132,21 +132,49 @@ type FileMeta = {
132132133133type WorkspaceRoot = Awaited<ReturnType<typeof root>>;
134134135+function isRegularWorkspaceFileStat(stat: {
136+isFile: boolean | (() => boolean);
137+isSymbolicLink: boolean | (() => boolean);
138+nlink: number;
139+}): boolean {
140+const isFile = typeof stat.isFile === "function" ? stat.isFile() : stat.isFile;
141+const isSymbolicLink =
142+typeof stat.isSymbolicLink === "function" ? stat.isSymbolicLink() : stat.isSymbolicLink;
143+return isFile && !isSymbolicLink && stat.nlink <= 1;
144+}
145+135146async function statWorkspaceFileSafely(
136-workspaceRoot: WorkspaceRoot,
147+workspaceRoot: WorkspaceRoot | null,
148+workspaceDir: string,
137149name: string,
138150): Promise<FileMeta | null> {
139151try {
140-const stat = await workspaceRoot.stat(name);
141-if (!stat.isFile || stat.isSymbolicLink || stat.nlink > 1) {
152+const stat = workspaceRoot
153+ ? await workspaceRoot.stat(name)
154+ : await fs.lstat(path.join(workspaceDir, name));
155+if (!isRegularWorkspaceFileStat(stat)) {
142156return null;
143157}
144158return {
145159size: stat.size,
146160updatedAtMs: Math.floor(stat.mtimeMs),
147161};
148162} catch {
149-return null;
163+if (!workspaceRoot) {
164+return null;
165+}
166+try {
167+const stat = await fs.lstat(path.join(workspaceDir, name));
168+if (!isRegularWorkspaceFileStat(stat)) {
169+return null;
170+}
171+return {
172+size: stat.size,
173+updatedAtMs: Math.floor(stat.mtimeMs),
174+};
175+} catch {
176+return null;
177+}
150178}
151179}
152180@@ -185,7 +213,7 @@ async function listAgentFiles(workspaceDir: string, options?: { hideBootstrap?:
185213 : BOOTSTRAP_FILE_NAMES;
186214for (const name of bootstrapFileNames) {
187215const filePath = path.join(workspaceDir, name);
188-const meta = await statWorkspaceFileSafely(workspaceRoot, name);
216+const meta = await statWorkspaceFileSafely(workspaceRoot, workspaceDir, name);
189217if (meta) {
190218files.push({
191219 name,
@@ -199,7 +227,11 @@ async function listAgentFiles(workspaceDir: string, options?: { hideBootstrap?:
199227}
200228}
201229202-const primaryMeta = await statWorkspaceFileSafely(workspaceRoot, DEFAULT_MEMORY_FILENAME);
230+const primaryMeta = await statWorkspaceFileSafely(
231+workspaceRoot,
232+workspaceDir,
233+DEFAULT_MEMORY_FILENAME,
234+);
203235if (primaryMeta) {
204236files.push({
205237name: DEFAULT_MEMORY_FILENAME,
@@ -768,7 +800,7 @@ export const agentsHandlers: GatewayRequestHandlers = {
768800respondWorkspaceFileUnsafe(respond, name);
769801return;
770802}
771-const meta = await statWorkspaceFileSafely(workspaceRoot, name);
803+const meta = await statWorkspaceFileSafely(workspaceRoot, workspaceDir, name);
772804respond(
773805true,
774806{
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。