import * as Schema from "effect/Schema";import { NonNegativeInt, PositiveInt, TrimmedNonEmptyString } from "./baseSchemas.ts"; const PROJECT_SEARCH_ENTRIES_MAX_LIMIT = 200;const PROJECT_WRITE_FILE_PATH_MAX_LENGTH = 512;const PROJECT_READ_FILE_PATH_MAX_LENGTH = 512; export const ProjectSearchEntriesInput = Schema.Struct({ cwd: TrimmedNonEmptyString, query: TrimmedNonEmptyString.check(Schema.isMaxLength(256)), limit: PositiveInt.check(Schema.isLessThanOrEqualTo(PROJECT_SEARCH_ENTRIES_MAX_LIMIT)),});export type ProjectSearchEntriesInput = typeof ProjectSearchEntriesInput.Type; const ProjectEntryKind = Schema.Literals(["file", "directory"]); export const ProjectEntry = Schema.Struct({ path: TrimmedNonEmptyString, kind: ProjectEntryKind,});export type ProjectEntry = typeof ProjectEntry.Type; export const ProjectSearchEntriesResult = Schema.Struct({ entries: Schema.Array(ProjectEntry), truncated: Schema.Boolean,});export type ProjectSearchEntriesResult = typeof ProjectSearchEntriesResult.Type; export const ProjectListEntriesInput = Schema.Struct({ cwd: TrimmedNonEmptyString,});export type ProjectListEntriesInput = typeof ProjectListEntriesInput.Type; export const ProjectListEntriesResult = Schema.Struct({ entries: Schema.Array(ProjectEntry), truncated: Schema.Boolean,});export type ProjectListEntriesResult = typeof ProjectListEntriesResult.Type; export const ProjectEntriesFailure = Schema.Literals([ "workspace_root_not_found", "workspace_root_create_failed", "workspace_root_not_directory", "search_index_create_failed", "search_index_scan_timed_out", "search_index_search_failed",]);export type ProjectEntriesFailure = typeof ProjectEntriesFailure.Type; type ProjectEntriesFailureContext = { readonly failure: ProjectEntriesFailure; readonly normalizedCwd?: string; readonly timeout?: string; readonly detail?: string; readonly cause?: unknown;}; function decodedProjectErrorMessage(props: object): string | undefined { if (!("message" in props)) return undefined; return typeof props.message === "string" ? props.message : undefined;} export class ProjectSearchEntriesError extends Schema.TaggedErrorClass<ProjectSearchEntriesError>()( "ProjectSearchEntriesError", { cwd: Schema.optional(TrimmedNonEmptyString), queryLength: Schema.optional(NonNegativeInt), limit: Schema.optional(PositiveInt), failure: Schema.optional(ProjectEntriesFailure), normalizedCwd: Schema.optional(TrimmedNonEmptyString), timeout: Schema.optional(TrimmedNonEmptyString), detail: Schema.optional(TrimmedNonEmptyString), message: TrimmedNonEmptyString, cause: Schema.optional(Schema.Defect()), },) { // The structured fields are optional on the wire so newer peers can decode legacy message-only // failures. New application code must provide them through this constructor. // @effect-diagnostics-next-line overriddenSchemaConstructor:off constructor( props: ProjectEntriesFailureContext & { readonly cwd: string; readonly queryLength: number; readonly limit: number; }, ) { super({ ...props, message: decodedProjectErrorMessage(props) ?? `Failed to search workspace entries in '${props.cwd}'.`, } as any); }} export class ProjectListEntriesError extends Schema.TaggedErrorClass<ProjectListEntriesError>()( "ProjectListEntriesError", { cwd: Schema.optional(TrimmedNonEmptyString), failure: Schema.optional(ProjectEntriesFailure), normalizedCwd: Schema.optional(TrimmedNonEmptyString), timeout: Schema.optional(TrimmedNonEmptyString), detail: Schema.optional(TrimmedNonEmptyString), message: TrimmedNonEmptyString, cause: Schema.optional(Schema.Defect()), },) { // @effect-diagnostics-next-line overriddenSchemaConstructor:off constructor(props: ProjectEntriesFailureContext & { readonly cwd: string }) { super({ ...props, message: decodedProjectErrorMessage(props) ?? `Failed to list workspace entries in '${props.cwd}'.`, } as any); }} export const ProjectReadFileInput = Schema.Struct({ cwd: TrimmedNonEmptyString, relativePath: TrimmedNonEmptyString.check(Schema.isMaxLength(PROJECT_READ_FILE_PATH_MAX_LENGTH)),});export type ProjectReadFileInput = typeof ProjectReadFileInput.Type; export const ProjectReadFileResult = Schema.Struct({ relativePath: TrimmedNonEmptyString, contents: Schema.String, byteLength: NonNegativeInt, truncated: Schema.Boolean,});export type ProjectReadFileResult = typeof ProjectReadFileResult.Type; export const ProjectFileFailure = Schema.Literals([ "workspace_path_outside_root", "resolved_path_outside_root", "path_not_file", "binary_file", "operation_failed",]);export type ProjectFileFailure = typeof ProjectFileFailure.Type; export const ProjectFileOperation = Schema.Literals([ "realpath-workspace-root", "realpath-target", "open", "stat", "read", "close", "make-directory", "write-file",]);export type ProjectFileOperation = typeof ProjectFileOperation.Type; type ProjectFileFailureContext = { readonly cwd: string; readonly relativePath: string; readonly failure: ProjectFileFailure; readonly resolvedPath?: string; readonly resolvedWorkspaceRoot?: string; readonly operation?: ProjectFileOperation; readonly operationPath?: string; readonly cause?: unknown;}; export class ProjectReadFileError extends Schema.TaggedErrorClass<ProjectReadFileError>()( "ProjectReadFileError", { cwd: Schema.optional(TrimmedNonEmptyString), relativePath: Schema.optional(TrimmedNonEmptyString), failure: Schema.optional(ProjectFileFailure), resolvedPath: Schema.optional(TrimmedNonEmptyString), resolvedWorkspaceRoot: Schema.optional(TrimmedNonEmptyString), operation: Schema.optional(ProjectFileOperation), operationPath: Schema.optional(TrimmedNonEmptyString), message: TrimmedNonEmptyString, cause: Schema.optional(Schema.Defect()), },) { // @effect-diagnostics-next-line overriddenSchemaConstructor:off constructor(props: ProjectFileFailureContext) { super({ ...props, message: decodedProjectErrorMessage(props) ?? `Failed to read workspace file '${props.relativePath}' in '${props.cwd}'.`, } as any); }} export const ProjectWriteFileInput = Schema.Struct({ cwd: TrimmedNonEmptyString, relativePath: TrimmedNonEmptyString.check(Schema.isMaxLength(PROJECT_WRITE_FILE_PATH_MAX_LENGTH)), contents: Schema.String,});export type ProjectWriteFileInput = typeof ProjectWriteFileInput.Type; export const ProjectWriteFileResult = Schema.Struct({ relativePath: TrimmedNonEmptyString,});export type ProjectWriteFileResult = typeof ProjectWriteFileResult.Type; export class ProjectWriteFileError extends Schema.TaggedErrorClass<ProjectWriteFileError>()( "ProjectWriteFileError", { cwd: Schema.optional(TrimmedNonEmptyString), relativePath: Schema.optional(TrimmedNonEmptyString), failure: Schema.optional(ProjectFileFailure), resolvedPath: Schema.optional(TrimmedNonEmptyString), resolvedWorkspaceRoot: Schema.optional(TrimmedNonEmptyString), operation: Schema.optional(ProjectFileOperation), operationPath: Schema.optional(TrimmedNonEmptyString), message: TrimmedNonEmptyString, cause: Schema.optional(Schema.Defect()), },) { // @effect-diagnostics-next-line overriddenSchemaConstructor:off constructor(props: ProjectFileFailureContext) { super({ ...props, message: decodedProjectErrorMessage(props) ?? `Failed to write workspace file '${props.relativePath}' in '${props.cwd}'.`, } as any); }}
import * as Schema from "effect/Schema";
import { NonNegativeInt, PositiveInt, TrimmedNonEmptyString } from "./baseSchemas.ts";
const PROJECT_SEARCH_ENTRIES_MAX_LIMIT = 200;
const PROJECT_WRITE_FILE_PATH_MAX_LENGTH = 512;
const PROJECT_READ_FILE_PATH_MAX_LENGTH = 512;
export const ProjectSearchEntriesInput = Schema.Struct({
cwd: TrimmedNonEmptyString,
query: TrimmedNonEmptyString.check(Schema.isMaxLength(256)),
limit: PositiveInt.check(Schema.isLessThanOrEqualTo(PROJECT_SEARCH_ENTRIES_MAX_LIMIT)),
});
export type ProjectSearchEntriesInput = typeof ProjectSearchEntriesInput.Type;
const ProjectEntryKind = Schema.Literals(["file", "directory"]);
export const ProjectEntry = Schema.Struct({
path: TrimmedNonEmptyString,
kind: ProjectEntryKind,
});
export type ProjectEntry = typeof ProjectEntry.Type;
export const ProjectSearchEntriesResult = Schema.Struct({
entries: Schema.Array(ProjectEntry),
truncated: Schema.Boolean,
});
export type ProjectSearchEntriesResult = typeof ProjectSearchEntriesResult.Type;
export const ProjectListEntriesInput = Schema.Struct({
cwd: TrimmedNonEmptyString,
});
export type ProjectListEntriesInput = typeof ProjectListEntriesInput.Type;
export const ProjectListEntriesResult = Schema.Struct({
entries: Schema.Array(ProjectEntry),
truncated: Schema.Boolean,
});
export type ProjectListEntriesResult = typeof ProjectListEntriesResult.Type;
export const ProjectEntriesFailure = Schema.Literals([
"workspace_root_not_found",
"workspace_root_create_failed",
"workspace_root_not_directory",
"search_index_create_failed",
"search_index_scan_timed_out",
"search_index_search_failed",
]);
export type ProjectEntriesFailure = typeof ProjectEntriesFailure.Type;
type ProjectEntriesFailureContext = {
readonly failure: ProjectEntriesFailure;
readonly normalizedCwd?: string;
readonly timeout?: string;
readonly detail?: string;
readonly cause?: unknown;
};
function decodedProjectErrorMessage(props: object): string | undefined {
if (!("message" in props)) return undefined;
return typeof props.message === "string" ? props.message : undefined;
}
export class ProjectSearchEntriesError extends Schema.TaggedErrorClass<ProjectSearchEntriesError>()(
"ProjectSearchEntriesError",
{
cwd: Schema.optional(TrimmedNonEmptyString),
queryLength: Schema.optional(NonNegativeInt),
limit: Schema.optional(PositiveInt),
failure: Schema.optional(ProjectEntriesFailure),
normalizedCwd: Schema.optional(TrimmedNonEmptyString),
timeout: Schema.optional(TrimmedNonEmptyString),
detail: Schema.optional(TrimmedNonEmptyString),
message: TrimmedNonEmptyString,
cause: Schema.optional(Schema.Defect()),
},
) {
// The structured fields are optional on the wire so newer peers can decode legacy message-only
// failures. New application code must provide them through this constructor.
// @effect-diagnostics-next-line overriddenSchemaConstructor:off
constructor(
props: ProjectEntriesFailureContext & {
readonly cwd: string;
readonly queryLength: number;
readonly limit: number;
},
) {
super({
...props,
message:
decodedProjectErrorMessage(props) ??
`Failed to search workspace entries in '${props.cwd}'.`,
} as any);
}
}
export class ProjectListEntriesError extends Schema.TaggedErrorClass<ProjectListEntriesError>()(
"ProjectListEntriesError",
{
cwd: Schema.optional(TrimmedNonEmptyString),
failure: Schema.optional(ProjectEntriesFailure),
normalizedCwd: Schema.optional(TrimmedNonEmptyString),
timeout: Schema.optional(TrimmedNonEmptyString),
detail: Schema.optional(TrimmedNonEmptyString),
message: TrimmedNonEmptyString,
cause: Schema.optional(Schema.Defect()),
},
) {
// @effect-diagnostics-next-line overriddenSchemaConstructor:off
constructor(props: ProjectEntriesFailureContext & { readonly cwd: string }) {
super({
...props,
message:
decodedProjectErrorMessage(props) ?? `Failed to list workspace entries in '${props.cwd}'.`,
} as any);
}
}
export const ProjectReadFileInput = Schema.Struct({
cwd: TrimmedNonEmptyString,
relativePath: TrimmedNonEmptyString.check(Schema.isMaxLength(PROJECT_READ_FILE_PATH_MAX_LENGTH)),
});
export type ProjectReadFileInput = typeof ProjectReadFileInput.Type;
export const ProjectReadFileResult = Schema.Struct({
relativePath: TrimmedNonEmptyString,
contents: Schema.String,
byteLength: NonNegativeInt,
truncated: Schema.Boolean,
});
export type ProjectReadFileResult = typeof ProjectReadFileResult.Type;
export const ProjectFileFailure = Schema.Literals([
"workspace_path_outside_root",
"resolved_path_outside_root",
"path_not_file",
"binary_file",
"operation_failed",
]);
export type ProjectFileFailure = typeof ProjectFileFailure.Type;
export const ProjectFileOperation = Schema.Literals([
"realpath-workspace-root",
"realpath-target",
"open",
"stat",
"read",
"close",
"make-directory",
"write-file",
]);
export type ProjectFileOperation = typeof ProjectFileOperation.Type;
type ProjectFileFailureContext = {
readonly cwd: string;
readonly relativePath: string;
readonly failure: ProjectFileFailure;
readonly resolvedPath?: string;
readonly resolvedWorkspaceRoot?: string;
readonly operation?: ProjectFileOperation;
readonly operationPath?: string;
readonly cause?: unknown;
};
export class ProjectReadFileError extends Schema.TaggedErrorClass<ProjectReadFileError>()(
"ProjectReadFileError",
{
cwd: Schema.optional(TrimmedNonEmptyString),
relativePath: Schema.optional(TrimmedNonEmptyString),
failure: Schema.optional(ProjectFileFailure),
resolvedPath: Schema.optional(TrimmedNonEmptyString),
resolvedWorkspaceRoot: Schema.optional(TrimmedNonEmptyString),
operation: Schema.optional(ProjectFileOperation),
operationPath: Schema.optional(TrimmedNonEmptyString),
message: TrimmedNonEmptyString,
cause: Schema.optional(Schema.Defect()),
},
) {
// @effect-diagnostics-next-line overriddenSchemaConstructor:off
constructor(props: ProjectFileFailureContext) {
super({
...props,
message:
decodedProjectErrorMessage(props) ??
`Failed to read workspace file '${props.relativePath}' in '${props.cwd}'.`,
} as any);
}
}
export const ProjectWriteFileInput = Schema.Struct({
cwd: TrimmedNonEmptyString,
relativePath: TrimmedNonEmptyString.check(Schema.isMaxLength(PROJECT_WRITE_FILE_PATH_MAX_LENGTH)),
contents: Schema.String,
});
export type ProjectWriteFileInput = typeof ProjectWriteFileInput.Type;
export const ProjectWriteFileResult = Schema.Struct({
relativePath: TrimmedNonEmptyString,
});
export type ProjectWriteFileResult = typeof ProjectWriteFileResult.Type;
export class ProjectWriteFileError extends Schema.TaggedErrorClass<ProjectWriteFileError>()(
"ProjectWriteFileError",
{
cwd: Schema.optional(TrimmedNonEmptyString),
relativePath: Schema.optional(TrimmedNonEmptyString),
failure: Schema.optional(ProjectFileFailure),
resolvedPath: Schema.optional(TrimmedNonEmptyString),
resolvedWorkspaceRoot: Schema.optional(TrimmedNonEmptyString),
operation: Schema.optional(ProjectFileOperation),
operationPath: Schema.optional(TrimmedNonEmptyString),
message: TrimmedNonEmptyString,
cause: Schema.optional(Schema.Defect()),
},
) {
// @effect-diagnostics-next-line overriddenSchemaConstructor:off
constructor(props: ProjectFileFailureContext) {
super({
...props,
message:
decodedProjectErrorMessage(props) ??
`Failed to write workspace file '${props.relativePath}' in '${props.cwd}'.`,
} as any);
}
}