Files
paseo/packages/server/src/utils/tool-call-parsers.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

49 lines
1.2 KiB
TypeScript

import { z } from "zod";
import { stripCwdPrefix } from "@getpaseo/protocol/path-utils";
const SHELL_WRAPPER_PREFIX_PATTERN = /^\/bin\/(?:zsh|bash|sh)\s+(?:-[a-zA-Z]+\s+)?/;
const CD_AND_PATTERN = /^cd\s+(?:"[^"]+"|'[^']+'|\S+)\s+&&\s+/;
export { stripCwdPrefix };
export function stripShellWrapperPrefix(command: string): string {
const prefixMatch = command.match(SHELL_WRAPPER_PREFIX_PATTERN);
if (!prefixMatch) {
return command;
}
let rest = command.slice(prefixMatch[0].length).trim();
if (rest.length >= 2) {
const first = rest[0];
const last = rest[rest.length - 1];
if ((first === `"` || first === `'`) && last === first) {
rest = rest.slice(1, -1);
}
}
return rest.replace(CD_AND_PATTERN, "");
}
export interface TodoItem {
content: string;
status: "pending" | "in_progress" | "completed";
activeForm?: string;
}
const TodosSchema = z.object({
todos: z.array(
z.object({
content: z.string(),
status: z.enum(["pending", "in_progress", "completed"]),
activeForm: z.string().optional(),
}),
),
});
export function extractTodos(value: unknown): TodoItem[] {
const parsed = TodosSchema.safeParse(value);
if (!parsed.success) {
return [];
}
return parsed.data.todos;
}