# Conflicts: # apps/cli/tests/web-agent-presets.e2e.ts # packages/fs/tool-fs/package.json
35 lines
1.4 KiB
TypeScript
35 lines
1.4 KiB
TypeScript
/**
|
|
* Shared path resolution and regular-file validation for model-facing read tools.
|
|
* @module @deepseek-ai/dsh-tool-fs/src/read-target
|
|
*/
|
|
|
|
import type { Context } from '@deepseek-ai/cordis'
|
|
import { FsError } from '@deepseek-ai/dsh-fs'
|
|
import type { FsInfo, FsTarget } from '@deepseek-ai/dsh-fs'
|
|
import type { ToolExecution } from '@deepseek-ai/dsh-tools'
|
|
import { sessionResolveOptions } from './session-cwd.ts'
|
|
|
|
/**
|
|
* Resolve a model-supplied path, observe absence, and require a regular file.
|
|
* @param ctx - the plugin context providing filesystem resolution and observation events.
|
|
* @param exec - the current tool execution, including session cwd and cancellation.
|
|
* @param requestedPath - the raw path supplied to the tool.
|
|
* @returns the resolved target and its single stat result.
|
|
*/
|
|
export async function resolveRegularReadTarget(
|
|
ctx: Context,
|
|
exec: ToolExecution,
|
|
requestedPath: string,
|
|
): Promise<{ target: FsTarget; info: FsInfo }> {
|
|
const target = await ctx.fs.resolve(requestedPath, sessionResolveOptions(exec, requestedPath))
|
|
const info = await ctx.fs.stat(target, exec.signal)
|
|
if (info === undefined) {
|
|
ctx.emit('fs/observed', target, { kind: 'absent' }, exec)
|
|
throw new FsError(`cannot read "${target.displayPath}": not found`, 'FS_NOT_FOUND')
|
|
}
|
|
if (info.type !== 'file') {
|
|
throw new FsError(`cannot read "${target.displayPath}": not a regular file`, 'FS_NOT_REGULAR_FILE')
|
|
}
|
|
return { target, info }
|
|
}
|