import { Message } from "@langchain/langgraph-sdk"; /** * copy and modify from copilotkit * https://github.com/copilotkit/copilotkit * * MIT License */ type TypeMap = { string: string; number: number; boolean: boolean; object: object; "string[]": string[]; "number[]": number[]; "boolean[]": boolean[]; "object[]": object[]; }; type AbstractParameter = { name: string; type?: keyof TypeMap; description?: string; required?: boolean; }; interface StringParameter extends AbstractParameter { type: "string"; enum?: string[]; } interface ObjectParameter extends AbstractParameter { type: "object"; attributes?: Parameter[]; } interface ObjectArrayParameter extends AbstractParameter { type: "object[]"; attributes?: Parameter[]; } type SpecialParameters = StringParameter | ObjectParameter | ObjectArrayParameter; interface BaseParameter extends AbstractParameter { type?: Exclude; } export type Parameter = BaseParameter | SpecialParameters; type OptionalParameterType

= P["required"] extends false ? undefined : never; type StringParameterType

= P extends StringParameter ? (P extends { enum?: Array } ? E : string) : never; type ObjectParameterType

= P extends ObjectParameter ? (P extends { attributes?: infer Attributes extends Parameter[] } ? MappedParameterTypes : object) : never; type ObjectArrayParameterType

= P extends ObjectArrayParameter ? (P extends { attributes?: infer Attributes extends Parameter[] } ? MappedParameterTypes[] : any[]) : never; type MappedTypeOrString = T extends keyof TypeMap ? TypeMap[T] : string; type BaseParameterType

= P extends { type: infer T } ? (T extends BaseParameter["type"] ? MappedTypeOrString : never) : string; export type MappedParameterTypes = T extends [] ? Record : { [P in T[number] as P["name"]]: OptionalParameterType

| StringParameterType

| ObjectParameterType

| ObjectArrayParameterType

| BaseParameterType

; }; export type Action = { name: string; description?: string; parameters?: T; handler?: T extends [] ? () => any | Promise : (args: MappedParameterTypes, context?: any) => any | Promise; returnDirect?: boolean; callbackMessage?: () => Message[]; };