Files
paseo/packages/app/src/utils/extract-tool-call-file-path.ts
T
Mohamed BoudraandGitHub 53c14d9855 Extract client SDK package (#1052)
* Extract client SDK package

* Polish SDK client identity defaults

* Build client before dependent CI jobs

* Restore daemon client server export

* Extract protocol and client SDK packages

* Fix provider override schema validation

* Fix app test daemon client imports

* Simplify workspace build targets

* Fix CLI test server build bootstrap

* Run SDK package tests in CI

* Fix rebase package split drift

* Restore lockfile registry metadata

* Update SDK config test for prompt default

* Move terminal stream router test to client package

* Fix rebase drift for protocol imports

* Fix SDK agent capability fixture

* Restore legacy server client exports

* Fix server export compatibility test

* Advertise custom mode icon client capability

* Remove server daemon-client exports

* Format rebased mode control import

* Fix rebase drift for protocol imports

Files added by upstream PRs (#893, #1147, #1154) referenced the pre-split
shared/ paths that this branch moves into @getpaseo/protocol. Redirect
those imports to the protocol package so typecheck stays green after the
rebase.
2026-05-28 01:58:18 +08:00

71 lines
1.4 KiB
TypeScript

import type { ToolCallDetail } from "@getpaseo/protocol/agent-types";
const SHELL_FILE_COMMANDS = new Set([
"cat",
"bat",
"less",
"more",
"head",
"tail",
"wc",
"nl",
"tac",
"od",
"xxd",
"file",
"stat",
"column",
"md5",
"md5sum",
"sha1sum",
"sha256sum",
"shasum",
]);
const SHELL_OPERATOR_PATTERN = /[|><&;`$()]/;
const SHORT_FLAG_PATTERN = /^-[a-zA-Z]$/;
function extractFromShellCommand(command: string): string | null {
const trimmed = command.trim();
if (!trimmed || SHELL_OPERATOR_PATTERN.test(trimmed)) {
return null;
}
const tokens = trimmed.split(/\s+/);
if (tokens.length < 2) {
return null;
}
if (!SHELL_FILE_COMMANDS.has(tokens[0])) {
return null;
}
const last = tokens[tokens.length - 1];
if (last.startsWith("-")) {
return null;
}
if (tokens.length > 2) {
const prev = tokens[tokens.length - 2];
if (!prev.startsWith("-")) {
const prevPrev = tokens[tokens.length - 3];
if (!prevPrev || !SHORT_FLAG_PATTERN.test(prevPrev)) {
return null;
}
}
}
return last;
}
export function extractToolCallFilePath(detail: ToolCallDetail | undefined): string | null {
if (!detail) {
return null;
}
switch (detail.type) {
case "read":
case "edit":
case "write":
return detail.filePath || null;
case "shell":
return extractFromShellCommand(detail.command);
default:
return null;
}
}