terminal-pilot 0.0.44 → 0.0.45

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../toolcraft/src/index.ts", "../../../toolcraft/src/user-error.ts", "../../../toolcraft/src/human-in-loop/config.ts", "../../../toolcraft-schema/src/json.ts", "../../../toolcraft-schema/src/oneof.ts", "../../../toolcraft-schema/src/record.ts", "../../../toolcraft-schema/src/union.ts", "../../../toolcraft-schema/src/validate.ts", "../../../toolcraft-schema/src/index.ts", "../../../toolcraft/src/runtime-logging.ts", "../../../toolcraft/src/package-metadata.ts", "../../src/terminal-pilot.ts", "../../src/terminal-session.ts", "../../src/ansi.ts", "../../src/errors.ts", "../../src/terminal-buffer.ts", "../../src/keys.ts", "../../src/terminal-screen.ts", "../../src/commands/runtime.ts", "../../src/commands/close-session.ts"],
4
- "sourcesContent": ["import { fileURLToPath } from \"node:url\";\nimport type { McpServerConfig } from \"@poe-code/agent-mcp-config\";\nimport type { AnySchema, ObjectSchema, Static } from \"toolcraft-schema\";\nimport type { LoggerOutput, RenderTableOptions, ThemePalette } from \"toolcraft-design\";\nimport { ApprovalDeclinedError } from \"./human-in-loop/types.js\";\nimport type {\n HumanInLoopConfig,\n HumanInLoopPending,\n HumanInLoopRuntimeOptions\n} from \"./human-in-loop/types.js\";\nimport { mergeHumanInLoopFromGroup, validateHumanInLoopOnDefine } from \"./human-in-loop/config.js\";\nimport { ToolcraftBugError, UserError } from \"./user-error.js\";\nimport { suggest } from \"./suggest.js\";\nimport type { RuntimeLogger } from \"./runtime-logging.js\";\nimport type { StreamStatusEvent, ToolcraftStream } from \"./stream.js\";\n\nexport { createManagedStream } from \"./stream.js\";\nexport type {\n StreamConsumerOptions,\n StreamStatusEvent,\n StreamStatusType,\n ToolcraftStream\n} from \"./stream.js\";\n\nconst commandConfigSymbol = Symbol(\"toolcraft.command.config\");\nconst groupConfigSymbol = Symbol(\"toolcraft.group.config\");\nconst commandSourcePathSymbol = Symbol(\"toolcraft.command.sourcePath\");\n\ntype ScopeValue = \"cli\" | \"mcp\" | \"sdk\";\ntype AnyObjectSchema = ObjectSchema<Record<string, never>>;\ntype EmptyServices = Record<string, never>;\ntype ScopeInput = readonly Scope[] | undefined;\ntype HumanInLoopMode = \"sync\" | \"async\";\ntype HumanInLoopModeInput = HumanInLoopMode | null | undefined;\n\nexport type Scope = ScopeValue;\n\ntype ResolveOwnHumanInLoopMode<TValue> = TValue extends {\n mode: infer TMode extends HumanInLoopMode;\n}\n ? TMode\n : TValue extends null\n ? null\n : undefined;\n\nexport interface SecretDefinition {\n env: string;\n description?: string;\n optional?: boolean;\n}\n\nexport type SecretDeclarations = Record<string, SecretDefinition>;\n\ntype OptionalSecretKeys<TSecrets extends SecretDeclarations> = {\n [TKey in keyof TSecrets]: TSecrets[TKey] extends { optional: true } ? TKey : never;\n}[keyof TSecrets];\n\ntype RequiredSecretKeys<TSecrets extends SecretDeclarations> = Exclude<\n keyof TSecrets,\n OptionalSecretKeys<TSecrets>\n>;\n\nexport type InferSecrets<TSecrets extends SecretDeclarations | undefined> =\n TSecrets extends SecretDeclarations\n ? { [TKey in RequiredSecretKeys<TSecrets>]: string } & {\n [TKey in OptionalSecretKeys<TSecrets>]?: string;\n }\n : Record<string, never>;\n\nexport interface HandlerFs {\n readFile(path: string, encoding?: BufferEncoding): Promise<string>;\n writeFile(\n path: string,\n contents: string,\n options?: { encoding?: BufferEncoding; flag?: string; mode?: number }\n ): Promise<void>;\n exists(path: string): Promise<boolean>;\n lstat(path: string): Promise<{ isSymbolicLink(): boolean }>;\n rename(fromPath: string, toPath: string): Promise<void>;\n unlink(path: string): Promise<void>;\n}\n\nexport interface HandlerEnv {\n get(key: string): string | undefined;\n}\n\nexport interface RenderPrimitives {\n logger: LoggerOutput;\n renderTable(options: RenderTableOptions): string;\n getTheme(): ThemePalette;\n note(message: string, title?: string): void;\n}\n\nexport interface CheckResult {\n ok: boolean;\n message?: string;\n}\n\nexport interface CommandExample {\n title: string;\n params: Record<string, unknown>;\n}\n\nexport type GroupCheckContext<TServices extends object = EmptyServices> = TServices & {\n params?: unknown;\n secrets?: Record<string, string | undefined>;\n fetch: typeof globalThis.fetch;\n fs: HandlerFs;\n env: HandlerEnv;\n diagnostics: RuntimeLogger;\n progress(message: string): void;\n};\n\nexport type CommandCheckContext<\n TParamsSchema extends ObjectSchema<any> = AnyObjectSchema,\n TSecrets extends SecretDeclarations | undefined = undefined,\n TServices extends object = EmptyServices\n> = TServices & {\n params?: Static<TParamsSchema>;\n secrets?: InferSecrets<TSecrets>;\n fetch: typeof globalThis.fetch;\n fs: HandlerFs;\n env: HandlerEnv;\n diagnostics: RuntimeLogger;\n progress(message: string): void;\n};\n\nexport interface Requires<TContext = unknown> {\n auth?: boolean;\n apiVersion?: string;\n check?: (ctx: TContext) => Promise<CheckResult>;\n}\n\nexport interface Renderers<TResult> {\n rich?: (result: TResult, primitives: RenderPrimitives) => void;\n markdown?: (result: TResult, primitives: RenderPrimitives) => string;\n json?: (result: TResult, primitives: RenderPrimitives) => unknown;\n}\n\nexport type HandlerContext<\n TParamsSchema extends ObjectSchema<any> = AnyObjectSchema,\n TSecrets extends SecretDeclarations | undefined = undefined,\n TServices extends object = EmptyServices\n> = TServices & {\n params: Static<TParamsSchema>;\n secrets: InferSecrets<TSecrets>;\n fetch: typeof globalThis.fetch;\n fs: HandlerFs;\n env: HandlerEnv;\n diagnostics: RuntimeLogger;\n progress(message: string): void;\n};\n\nexport interface CommandConfig<\n TServices extends object,\n TParamsSchema extends ObjectSchema<any>,\n TSecrets extends SecretDeclarations | undefined,\n TResult\n> {\n name: string;\n description?: string;\n hidden?: boolean;\n examples?: CommandExample[];\n aliases?: string[];\n positional?: string[];\n params: TParamsSchema;\n result?: ObjectSchema<any>;\n secrets?: TSecrets;\n scope?: Scope[];\n confirm?: boolean;\n humanInLoop?: HumanInLoopConfig<TParamsSchema> | null;\n requires?: Requires<CommandCheckContext<TParamsSchema, TSecrets, TServices>>;\n handler: (ctx: HandlerContext<TParamsSchema, TSecrets, TServices>) => Promise<TResult> | TResult;\n render?: Renderers<TResult>;\n}\n\nexport interface StreamDefinition<TEventSchema extends AnySchema = AnySchema> {\n event: TEventSchema;\n bufferSize: number;\n}\n\nexport type StreamHandlerContext<\n TParamsSchema extends ObjectSchema<any>,\n TSecrets extends SecretDeclarations | undefined,\n TServices extends object\n> = HandlerContext<TParamsSchema, TSecrets, TServices> & {\n signal: AbortSignal;\n status(event: StreamStatusEvent): void;\n refreshSecrets(): Promise<InferSecrets<TSecrets>>;\n};\n\nexport interface StreamCommandConfig<\n TServices extends object,\n TParamsSchema extends ObjectSchema<any>,\n TSecrets extends SecretDeclarations | undefined,\n TEventSchema extends AnySchema\n> extends Omit<\n CommandConfig<TServices, TParamsSchema, TSecrets, AsyncIterable<Static<TEventSchema>>>,\n \"handler\" | \"render\" | \"result\" | \"humanInLoop\" | \"confirm\"\n > {\n event: TEventSchema;\n handler: (\n ctx: StreamHandlerContext<TParamsSchema, TSecrets, TServices>\n ) => AsyncIterable<Static<TEventSchema>> | Promise<AsyncIterable<Static<TEventSchema>>>;\n render?: Renderers<Static<TEventSchema>>;\n}\n\nexport interface Command<\n TServices extends object = EmptyServices,\n TParamsSchema extends ObjectSchema<any> = AnyObjectSchema,\n TSecrets extends SecretDeclarations | undefined = undefined,\n TResult = unknown\n> {\n kind: \"command\";\n name: string;\n description?: string;\n hidden: boolean;\n examples: CommandExample[];\n aliases: string[];\n positional: string[];\n params: TParamsSchema;\n result?: ObjectSchema<any>;\n stream?: StreamDefinition<any>;\n secrets: SecretDeclarations;\n scope: Scope[];\n confirm: boolean;\n humanInLoop?: HumanInLoopConfig<TParamsSchema> | null;\n requires?: Requires<any>;\n handler: (ctx: HandlerContext<TParamsSchema, TSecrets, TServices>) => Promise<TResult> | TResult;\n render?: Renderers<TResult>;\n}\n\nexport interface GroupConfig<TServices extends object> {\n name: string;\n description?: string;\n aliases?: string[];\n mcp?: McpServerConfig;\n scope?: Scope[];\n humanInLoop?: HumanInLoopConfig<AnyObjectSchema> | null;\n secrets?: SecretDeclarations;\n tools?: string[];\n rename?: Record<string, string>;\n requires?: Requires<GroupCheckContext<TServices>>;\n children: Array<CommandNode<TServices>>;\n default?: Command<TServices, any, any, any>;\n}\n\nexport interface Group<TServices extends object = EmptyServices> {\n kind: \"group\";\n name: string;\n description?: string;\n aliases: string[];\n scope?: Scope[];\n humanInLoop?: HumanInLoopConfig<AnyObjectSchema> | null;\n secrets: SecretDeclarations;\n requires?: Requires<any>;\n children: Array<CommandNode<TServices>>;\n default?: Command<TServices, any, any, any>;\n}\n\nexport type CommandNode<TServices extends object = EmptyServices> =\n | Command<TServices, any, any, any>\n | Group<TServices>;\n\nexport interface CommandTypeInfo<\n TName extends string = string,\n TParamsSchema extends ObjectSchema<any> = AnyObjectSchema,\n TResult = unknown,\n TOwnScope extends ScopeInput = ScopeInput,\n TOwnHumanInLoopMode extends HumanInLoopModeInput = undefined\n> {\n name: TName;\n params: TParamsSchema;\n result: TResult;\n ownScope: TOwnScope;\n ownHumanInLoopMode: TOwnHumanInLoopMode;\n}\n\nexport interface GroupTypeInfo<\n TServices extends object = EmptyServices,\n TName extends string = string,\n TChildren extends readonly unknown[] = readonly CommandNode<TServices>[],\n TOwnScope extends ScopeInput = ScopeInput,\n TOwnHumanInLoopMode extends HumanInLoopModeInput = undefined\n> {\n name: TName;\n children: TChildren;\n ownScope: TOwnScope;\n ownHumanInLoopMode: TOwnHumanInLoopMode;\n}\n\ntype TypedCommandMetadata<\n TName extends string,\n TParamsSchema extends ObjectSchema<any>,\n TResult,\n TOwnScope extends ScopeInput,\n TOwnHumanInLoopMode extends HumanInLoopModeInput\n> = {\n readonly __agentKitCommandTypeInfo: CommandTypeInfo<\n TName,\n TParamsSchema,\n TResult,\n TOwnScope,\n TOwnHumanInLoopMode\n >;\n};\n\ntype TypedGroupMetadata<\n TServices extends object,\n TName extends string,\n TChildren extends readonly unknown[],\n TOwnScope extends ScopeInput,\n TOwnHumanInLoopMode extends HumanInLoopModeInput\n> = {\n readonly __agentKitGroupTypeInfo: GroupTypeInfo<\n TServices,\n TName,\n TChildren,\n TOwnScope,\n TOwnHumanInLoopMode\n >;\n};\n\ninterface InternalCommandConfig {\n scope?: Scope[];\n hidden: boolean;\n examples: CommandExample[];\n result?: ObjectSchema<any>;\n humanInLoop?: HumanInLoopConfig<ObjectSchema<any>> | null;\n secrets: SecretDeclarations;\n requires?: Requires<any>;\n sourcePath?: string;\n}\n\ninterface InternalGroupConfig<TServices extends object> {\n mcp?: McpServerConfig;\n scope?: Scope[];\n humanInLoop?: HumanInLoopConfig<AnyObjectSchema> | null;\n secrets: SecretDeclarations;\n tools?: string[];\n rename?: Record<string, string>;\n requires?: Requires<any>;\n children: Array<CommandNode<TServices>>;\n default?: Command<TServices, any, any, any>;\n}\n\ninterface InheritedMetadata {\n scope?: Scope[];\n humanInLoop?: HumanInLoopConfig<AnyObjectSchema> | null;\n secrets: SecretDeclarations;\n requires?: Requires<any>;\n}\n\nexport interface CommandRequirementOptions {\n apiVersion?: string;\n authEnvVar?: string;\n env?: Record<string, string | undefined>;\n}\n\nfunction cloneScope(scope: Scope[] | undefined): Scope[] | undefined {\n return scope === undefined ? undefined : [...scope];\n}\n\nfunction cloneSecretDefinition(secret: SecretDefinition): SecretDefinition {\n return {\n env: secret.env,\n description: secret.description,\n optional: secret.optional\n };\n}\n\nfunction cloneSecrets(secrets: SecretDeclarations | undefined): SecretDeclarations {\n if (secrets === undefined) {\n return {};\n }\n\n return Object.fromEntries(\n Object.entries(secrets).map(([key, secret]) => [key, cloneSecretDefinition(secret)])\n );\n}\n\nfunction cloneRequires<TContext>(\n requires: Requires<TContext> | undefined\n): Requires<TContext> | undefined {\n if (requires === undefined) {\n return undefined;\n }\n\n return {\n auth: requires.auth,\n apiVersion: requires.apiVersion,\n check: requires.check\n };\n}\n\nfunction cloneStringArray(values: string[] | undefined): string[] | undefined {\n return values === undefined ? undefined : [...values];\n}\n\nfunction cloneCommandExamples(examples: CommandExample[] | undefined): CommandExample[] {\n return (examples ?? []).map((example) => ({\n title: example.title,\n params: { ...example.params }\n }));\n}\n\nfunction cloneStringRecord(\n values: Record<string, string> | undefined\n): Record<string, string> | undefined {\n return values === undefined ? undefined : { ...values };\n}\n\nfunction cloneMcpServerConfig(config: McpServerConfig | undefined): McpServerConfig | undefined {\n if (config === undefined) {\n return undefined;\n }\n\n if (config.transport === \"stdio\") {\n return {\n transport: \"stdio\",\n command: config.command,\n args: cloneStringArray(config.args),\n env: cloneStringRecord(config.env)\n };\n }\n\n return {\n transport: \"http\",\n url: config.url,\n headers: cloneStringRecord(config.headers)\n };\n}\n\nfunction cloneRenameMap(\n rename: Record<string, string> | undefined\n): Record<string, string> | undefined {\n return rename === undefined ? undefined : { ...rename };\n}\n\nfunction validateRenameMap(rename: Record<string, string> | undefined): void {\n if (rename === undefined) {\n return;\n }\n\n const seenTargets = new Map<string, string>();\n\n for (const [upstreamName, targetPath] of Object.entries(rename)) {\n if (targetPath.length === 0) {\n throw new UserError(\n `Invalid rename target for upstream tool \"${upstreamName}\": path cannot be empty.`\n );\n }\n\n if (targetPath.split(\".\").some((segment) => segment.length === 0)) {\n throw new UserError(\n `Invalid rename target for upstream tool \"${upstreamName}\": \"${targetPath}\" contains an empty segment.`\n );\n }\n\n const existingUpstreamName = seenTargets.get(targetPath);\n if (existingUpstreamName !== undefined) {\n throw new UserError(\n `Duplicate rename target \"${targetPath}\" for upstream tools \"${existingUpstreamName}\" and \"${upstreamName}\".`\n );\n }\n\n seenTargets.set(targetPath, upstreamName);\n }\n}\n\nfunction parseStackPath(candidate: string): string | undefined {\n if (candidate.startsWith(\"file://\")) {\n try {\n return fileURLToPath(candidate);\n } catch {\n return undefined;\n }\n }\n\n if (candidate.startsWith(\"/\")) {\n return candidate;\n }\n\n return undefined;\n}\n\nfunction extractStackPath(line: string): string | undefined {\n const trimmed = line.trim();\n const fileIndex = trimmed.indexOf(\"file://\");\n\n if (fileIndex >= 0) {\n const location = trimmed.slice(fileIndex);\n const separatorIndex = location.lastIndexOf(\":\");\n const previousSeparatorIndex =\n separatorIndex >= 0 ? location.lastIndexOf(\":\", separatorIndex - 1) : -1;\n const candidate =\n separatorIndex >= 0 && previousSeparatorIndex >= 0\n ? location.slice(0, previousSeparatorIndex)\n : location;\n\n return parseStackPath(candidate);\n }\n\n const slashIndex = trimmed.indexOf(\"/\");\n if (slashIndex < 0) {\n return undefined;\n }\n\n const location = trimmed.slice(slashIndex);\n const separatorIndex = location.lastIndexOf(\":\");\n const previousSeparatorIndex =\n separatorIndex >= 0 ? location.lastIndexOf(\":\", separatorIndex - 1) : -1;\n const candidate =\n separatorIndex >= 0 && previousSeparatorIndex >= 0\n ? location.slice(0, previousSeparatorIndex)\n : location;\n\n return parseStackPath(candidate);\n}\n\nfunction inferCommandSourcePath(): string | undefined {\n const stack = new Error().stack;\n\n if (typeof stack !== \"string\") {\n return undefined;\n }\n\n for (const line of stack.split(\"\\n\").slice(1)) {\n const candidate = extractStackPath(line);\n\n if (candidate === undefined) {\n continue;\n }\n\n if (\n candidate.includes(\"/packages/toolcraft/src/index.ts\") ||\n candidate.includes(\"/packages/toolcraft/dist/index.js\") ||\n candidate.includes(\"/node_modules/toolcraft/dist/index.js\")\n ) {\n continue;\n }\n\n return candidate;\n }\n\n return undefined;\n}\n\nfunction composeChecks(\n parentCheck: Requires<any>[\"check\"] | undefined,\n childCheck: Requires<any>[\"check\"] | undefined\n): Requires<any>[\"check\"] | undefined {\n if (parentCheck === undefined) {\n return childCheck;\n }\n\n if (childCheck === undefined) {\n return parentCheck;\n }\n\n return async (ctx) => {\n const parentResult = await parentCheck(ctx);\n if (!parentResult.ok) {\n return parentResult;\n }\n\n return childCheck(ctx);\n };\n}\n\nfunction mergeRequires(\n parent: Requires<any> | undefined,\n child: Requires<any> | undefined\n): Requires<any> | undefined {\n if (parent === undefined && child === undefined) {\n return undefined;\n }\n\n const merged: Requires<any> = {\n auth: child?.auth ?? parent?.auth,\n apiVersion: child?.apiVersion ?? parent?.apiVersion,\n check: composeChecks(parent?.check, child?.check)\n };\n\n if (merged.auth === undefined && merged.apiVersion === undefined && merged.check === undefined) {\n return undefined;\n }\n\n return merged;\n}\n\nfunction parseSimpleSemver(value: string): [number, number, number] | undefined {\n const parts = value.split(\".\");\n if (parts.length !== 3) {\n return undefined;\n }\n\n const parsed = parts.map((part) => {\n if (part.length === 0) {\n return Number.NaN;\n }\n\n for (const char of part) {\n if (char < \"0\" || char > \"9\") {\n return Number.NaN;\n }\n }\n\n return Number(part);\n });\n\n if (parsed.some((part) => !Number.isInteger(part) || part < 0)) {\n return undefined;\n }\n\n return parsed as [number, number, number];\n}\n\nfunction parseMinimumApiVersion(requirement: string): [number, number, number] | undefined {\n if (!requirement.startsWith(\">=\")) {\n return undefined;\n }\n\n return parseSimpleSemver(requirement.slice(2).trim());\n}\n\nfunction compareSemver(left: [number, number, number], right: [number, number, number]): number {\n for (let index = 0; index < left.length; index += 1) {\n if (left[index] === right[index]) {\n continue;\n }\n\n return left[index]! > right[index]! ? 1 : -1;\n }\n\n return 0;\n}\n\nexport function resolveCommandSecrets(\n command: Command<any, any, any, any>,\n env: Record<string, string | undefined> = process.env\n): Record<string, string | undefined> {\n const secrets: Record<string, string | undefined> = {};\n\n for (const [name, secret] of Object.entries(command.secrets)) {\n const value = env[secret.env];\n\n if (value === undefined && secret.optional !== true) {\n const details = secret.description ? `\\n ${secret.description}` : \"\";\n const candidates = Object.keys(env).filter(\n (candidate) => candidate !== secret.env && env[candidate] !== undefined\n );\n const suggestions = suggestSecretEnv(secret.env, candidates);\n const suggestionLine =\n suggestions.length > 0 ? `\\nDid you mean: ${suggestions.join(\", \")}?` : \"\";\n throw new UserError(`Missing required secret ${secret.env}${details}${suggestionLine}`);\n }\n\n Object.defineProperty(secrets, name, {\n value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n }\n\n return secrets;\n}\n\nfunction suggestSecretEnv(input: string, candidates: readonly string[]): string[] {\n const directSuggestions = suggest(input, candidates);\n if (!input.includes(\"_\")) {\n return directSuggestions;\n }\n\n const inputParts = input.split(\"_\");\n const firstPart = inputParts[0];\n const lastPart = inputParts[inputParts.length - 1];\n const relatedCandidates = candidates.filter((candidate) => {\n const candidateParts = candidate.split(\"_\");\n return (\n candidateParts[0] === firstPart && candidateParts[candidateParts.length - 1] === lastPart\n );\n });\n const expandedSuggestions = suggest(input, relatedCandidates, {\n threshold: Math.max(4, Math.floor(input.length / 4))\n });\n\n return [...new Set([...directSuggestions, ...expandedSuggestions])].slice(0, 3);\n}\n\nexport async function assertCommandRequirements(\n command: Command<any, any, any, any>,\n context: GroupCheckContext<any>,\n options: CommandRequirementOptions = {}\n): Promise<void> {\n const requires = command.requires;\n if (requires === undefined) {\n return;\n }\n\n const env = options.env ?? process.env;\n const authEnvVar = options.authEnvVar ?? \"POE_API_KEY\";\n\n if (requires.auth === true && env[authEnvVar] === undefined) {\n throw new UserError(\n `Command \"${command.name}\" requires authentication.\\n Run 'poe-code login' first.`\n );\n }\n\n if (requires.apiVersion !== undefined) {\n const minimumVersion = parseMinimumApiVersion(requires.apiVersion);\n if (minimumVersion === undefined) {\n throw new UserError(\n `Command \"${command.name}\" has invalid apiVersion requirement \"${requires.apiVersion}\". Expected format \">=X.Y.Z\".`\n );\n }\n\n if (options.apiVersion === undefined) {\n throw new UserError(\n `Command \"${command.name}\" requires API version ${requires.apiVersion}, but no runner API version was provided.`\n );\n }\n\n const runnerVersion = parseSimpleSemver(options.apiVersion);\n if (runnerVersion === undefined) {\n throw new UserError(\n `Command \"${command.name}\" requires API version ${requires.apiVersion}, but runner API version \"${options.apiVersion}\" is not valid semver.`\n );\n }\n\n if (compareSemver(runnerVersion, minimumVersion) < 0) {\n throw new UserError(\n `Command \"${command.name}\" requires API version ${requires.apiVersion}, but runner API version is ${options.apiVersion}.`\n );\n }\n }\n\n const checkResult = await requires.check?.(context);\n if (checkResult && !checkResult.ok) {\n throw new UserError(checkResult.message ?? \"Command precondition failed.\");\n }\n}\n\nfunction mergeSecrets(parent: SecretDeclarations, child: SecretDeclarations): SecretDeclarations {\n return cloneSecrets({\n ...parent,\n ...child\n });\n}\n\nfunction resolveCommandScope(\n ownScope: Scope[] | undefined,\n inheritedScope: Scope[] | undefined\n): Scope[] {\n return cloneScope(ownScope ?? inheritedScope) ?? [\"cli\", \"sdk\"];\n}\n\nfunction resolveGroupScope(\n ownScope: Scope[] | undefined,\n inheritedScope: Scope[] | undefined\n): Scope[] | undefined {\n return cloneScope(ownScope ?? inheritedScope);\n}\n\nfunction createBaseCommand<\n TServices extends object,\n TParamsSchema extends ObjectSchema<any>,\n TSecrets extends SecretDeclarations | undefined,\n TResult\n>(\n config: CommandConfig<TServices, TParamsSchema, TSecrets, TResult>\n): Command<TServices, TParamsSchema, TSecrets, TResult> {\n const command: Command<TServices, TParamsSchema, TSecrets, TResult> = {\n kind: \"command\",\n name: config.name,\n description: config.description,\n hidden: config.hidden ?? false,\n examples: cloneCommandExamples(config.examples),\n aliases: [...(config.aliases ?? [])],\n positional: [...(config.positional ?? [])],\n params: config.params,\n result: config.result,\n stream: undefined,\n secrets: cloneSecrets(config.secrets),\n scope: resolveCommandScope(config.scope, undefined),\n confirm: config.confirm ?? false,\n humanInLoop: config.humanInLoop,\n requires: cloneRequires(config.requires),\n handler: config.handler,\n render: config.render\n };\n\n Object.defineProperty(command, commandConfigSymbol, {\n value: {\n scope: cloneScope(config.scope),\n hidden: config.hidden ?? false,\n examples: cloneCommandExamples(config.examples),\n result: config.result,\n humanInLoop: config.humanInLoop,\n secrets: cloneSecrets(config.secrets),\n requires: cloneRequires(config.requires),\n sourcePath: inferCommandSourcePath()\n } satisfies InternalCommandConfig\n });\n\n return command;\n}\n\nfunction createBaseGroup<TServices extends object>(\n config: GroupConfig<TServices>\n): Group<TServices> {\n const group: Group<TServices> = {\n kind: \"group\",\n name: config.name,\n description: config.description,\n aliases: [...(config.aliases ?? [])],\n scope: resolveGroupScope(config.scope, undefined),\n humanInLoop: config.humanInLoop,\n secrets: cloneSecrets(config.secrets),\n requires: cloneRequires(config.requires),\n children: [],\n default: undefined\n };\n\n Object.defineProperty(group, groupConfigSymbol, {\n value: {\n mcp: cloneMcpServerConfig(config.mcp),\n scope: cloneScope(config.scope),\n humanInLoop: config.humanInLoop,\n secrets: cloneSecrets(config.secrets),\n tools: cloneStringArray(config.tools),\n rename: cloneRenameMap(config.rename),\n requires: cloneRequires(config.requires),\n children: [...config.children],\n default: config.default\n } satisfies InternalGroupConfig<TServices>\n });\n\n return group;\n}\n\nfunction getInternalCommandConfig(command: Command<any, any, any, any>): InternalCommandConfig {\n return (\n command as Command<any, any, any, any> & { [commandConfigSymbol]: InternalCommandConfig }\n )[commandConfigSymbol];\n}\n\nfunction getInternalGroupConfig<TServices extends object>(\n group: Group<TServices>\n): InternalGroupConfig<TServices> {\n return (group as Group<TServices> & { [groupConfigSymbol]: InternalGroupConfig<TServices> })[\n groupConfigSymbol\n ];\n}\n\nfunction materializeCommand<\n TServices extends object,\n TParamsSchema extends ObjectSchema<any>,\n TSecrets extends SecretDeclarations | undefined,\n TResult\n>(\n command: Command<TServices, TParamsSchema, TSecrets, TResult>,\n inherited: InheritedMetadata\n): Command<TServices, TParamsSchema, TSecrets, TResult> {\n const internal = getInternalCommandConfig(command);\n\n const materialized: Command<TServices, TParamsSchema, TSecrets, TResult> = {\n kind: \"command\",\n name: command.name,\n description: command.description,\n hidden: internal.hidden,\n examples: cloneCommandExamples(internal.examples),\n aliases: [...command.aliases],\n positional: [...command.positional],\n params: command.params,\n result: internal.result,\n stream: command.stream,\n secrets: mergeSecrets(inherited.secrets, internal.secrets),\n scope: resolveCommandScope(internal.scope, inherited.scope),\n confirm: command.confirm,\n humanInLoop: mergeHumanInLoopFromGroup(inherited.humanInLoop, internal.humanInLoop),\n requires: mergeRequires(inherited.requires, internal.requires),\n handler: command.handler,\n render: command.render\n };\n\n Object.defineProperty(materialized, commandConfigSymbol, {\n value: {\n scope: cloneScope(internal.scope),\n hidden: internal.hidden,\n examples: cloneCommandExamples(internal.examples),\n result: internal.result,\n humanInLoop: internal.humanInLoop,\n secrets: cloneSecrets(internal.secrets),\n requires: cloneRequires(internal.requires),\n sourcePath: internal.sourcePath\n } satisfies InternalCommandConfig\n });\n\n Object.defineProperty(materialized, commandSourcePathSymbol, {\n value: internal.sourcePath\n });\n\n return materialized;\n}\n\nfunction mergeInheritedMetadata<TServices extends object>(\n group: InternalGroupConfig<TServices>,\n inherited: InheritedMetadata\n): InheritedMetadata {\n return {\n scope: resolveGroupScope(group.scope, inherited.scope),\n humanInLoop: mergeHumanInLoopFromGroup(inherited.humanInLoop, group.humanInLoop),\n secrets: mergeSecrets(inherited.secrets, group.secrets),\n requires: mergeRequires(inherited.requires, group.requires)\n };\n}\n\nfunction materializeGroup<TServices extends object>(\n group: Group<TServices>,\n inherited: InheritedMetadata\n): Group<TServices> {\n const internal = getInternalGroupConfig(group);\n const mergedInherited = mergeInheritedMetadata(internal, inherited);\n const materializedChildren = internal.children.map((child) =>\n materializeNode(child, mergedInherited)\n );\n\n let defaultChild: Command<TServices, any, any, any> | undefined;\n\n if (internal.default !== undefined) {\n const defaultIndex = internal.children.indexOf(internal.default);\n\n if (defaultIndex === -1) {\n throw new ToolcraftBugError(\n `Default command \"${internal.default.name}\" must be listed in children.`\n );\n }\n\n const resolvedDefault = materializedChildren[defaultIndex];\n if (resolvedDefault?.kind !== \"command\") {\n throw new ToolcraftBugError(`Default child \"${internal.default.name}\" must be a command.`);\n }\n\n defaultChild = resolvedDefault;\n }\n\n const materialized: Group<TServices> = {\n kind: \"group\",\n name: group.name,\n description: group.description,\n aliases: [...group.aliases],\n scope: mergedInherited.scope,\n humanInLoop: mergedInherited.humanInLoop,\n secrets: mergedInherited.secrets,\n requires: mergedInherited.requires,\n children: materializedChildren,\n default: defaultChild\n };\n\n Object.defineProperty(materialized, groupConfigSymbol, {\n value: {\n mcp: cloneMcpServerConfig(internal.mcp),\n scope: cloneScope(internal.scope),\n humanInLoop: internal.humanInLoop,\n secrets: cloneSecrets(internal.secrets),\n tools: cloneStringArray(internal.tools),\n rename: cloneRenameMap(internal.rename),\n requires: cloneRequires(internal.requires),\n children: [...internal.children],\n default: internal.default\n } satisfies InternalGroupConfig<TServices>\n });\n\n return materialized;\n}\n\nfunction materializeNode<TServices extends object>(\n node: CommandNode<TServices>,\n inherited: InheritedMetadata\n): CommandNode<TServices> {\n if (node.kind === \"command\") {\n return materializeCommand(node, inherited);\n }\n\n return materializeGroup(node, inherited);\n}\n\nexport function defineCommand<\n TServices extends object = EmptyServices,\n TName extends string = string,\n TParamsSchema extends ObjectSchema<any> = AnyObjectSchema,\n TSecrets extends SecretDeclarations | undefined = undefined,\n TResult = unknown,\n TOwnScope extends ScopeInput = undefined,\n TOwnHumanInLoop extends HumanInLoopConfig<TParamsSchema> | null | undefined = undefined\n>(\n config: Omit<\n CommandConfig<TServices, TParamsSchema, TSecrets, TResult>,\n \"name\" | \"scope\" | \"humanInLoop\"\n > & {\n name: TName;\n scope?: TOwnScope;\n humanInLoop?: TOwnHumanInLoop;\n }\n): Command<TServices, TParamsSchema, TSecrets, TResult> &\n TypedCommandMetadata<\n TName,\n TParamsSchema,\n TResult,\n TOwnScope,\n ResolveOwnHumanInLoopMode<TOwnHumanInLoop>\n > {\n validateHumanInLoopOnDefine(config);\n\n return materializeCommand(\n createBaseCommand(config as CommandConfig<TServices, TParamsSchema, TSecrets, TResult>),\n {\n scope: undefined,\n humanInLoop: undefined,\n secrets: {},\n requires: undefined\n }\n ) as Command<TServices, TParamsSchema, TSecrets, TResult> &\n TypedCommandMetadata<\n TName,\n TParamsSchema,\n TResult,\n TOwnScope,\n ResolveOwnHumanInLoopMode<TOwnHumanInLoop>\n >;\n}\n\nexport function defineStreamCommand<\n TServices extends object = EmptyServices,\n TName extends string = string,\n TParamsSchema extends ObjectSchema<any> = AnyObjectSchema,\n TSecrets extends SecretDeclarations | undefined = undefined,\n TEventSchema extends AnySchema = AnySchema,\n TOwnScope extends ScopeInput = undefined\n>(\n config: Omit<\n StreamCommandConfig<TServices, TParamsSchema, TSecrets, TEventSchema>,\n \"name\" | \"scope\"\n > & {\n name: TName;\n scope?: TOwnScope;\n }\n): Command<TServices, TParamsSchema, TSecrets, AsyncIterable<Static<TEventSchema>>> &\n TypedCommandMetadata<\n TName,\n TParamsSchema,\n ToolcraftStream<Static<TEventSchema>>,\n TOwnScope,\n undefined\n > {\n const command = defineCommand({\n ...config,\n confirm: false,\n humanInLoop: null,\n handler: config.handler as never,\n render: undefined\n } as never) as Command<\n TServices,\n TParamsSchema,\n TSecrets,\n AsyncIterable<Static<TEventSchema>>\n >;\n command.stream = {\n event: config.event,\n bufferSize: 1\n };\n command.render = config.render as never;\n return command as never;\n}\n\nexport function defineGroup<\n TServices extends object = EmptyServices,\n TName extends string = string,\n TChildren extends readonly unknown[] = readonly CommandNode<TServices>[],\n TOwnScope extends ScopeInput = undefined,\n TOwnHumanInLoop extends HumanInLoopConfig<AnyObjectSchema> | null | undefined = undefined\n>(\n config: Omit<GroupConfig<TServices>, \"name\" | \"children\" | \"scope\" | \"humanInLoop\"> & {\n name: TName;\n children: TChildren & readonly CommandNode<TServices>[];\n scope?: TOwnScope;\n humanInLoop?: TOwnHumanInLoop;\n }\n): Group<TServices> &\n TypedGroupMetadata<\n TServices,\n TName,\n TChildren,\n TOwnScope,\n ResolveOwnHumanInLoopMode<TOwnHumanInLoop>\n > {\n validateRenameMap(config.rename);\n validateHumanInLoopOnDefine(config);\n\n return materializeGroup(createBaseGroup(config as unknown as GroupConfig<TServices>), {\n scope: undefined,\n humanInLoop: undefined,\n secrets: {},\n requires: undefined\n }) as Group<TServices> &\n TypedGroupMetadata<\n TServices,\n TName,\n TChildren,\n TOwnScope,\n ResolveOwnHumanInLoopMode<TOwnHumanInLoop>\n >;\n}\n\nexport function getCommandSourcePath(command: Command<any, any, any, any>): string | undefined {\n return (command as Command<any, any, any, any> & { [commandSourcePathSymbol]?: string })[\n commandSourcePathSymbol\n ];\n}\n\nexport function hasMcpProxyConfig(group: Group<any>): boolean {\n const configSymbol = Object.getOwnPropertySymbols(group).find(\n (candidate) => candidate.description === groupConfigSymbol.description\n );\n const config =\n configSymbol === undefined\n ? undefined\n : (group as unknown as Record<PropertyKey, InternalGroupConfig<any>>)[configSymbol];\n if (config?.mcp !== undefined) {\n return true;\n }\n\n const children = config?.children ?? group.children;\n return children.some(\n (child) => child.kind === \"group\" && hasMcpProxyConfig(child)\n );\n}\n\nexport { S, toJsonSchema } from \"toolcraft-schema\";\nexport {\n AuthenticationError,\n BadRequestError,\n ClientError,\n ConflictError,\n HttpError,\n InternalServerError,\n NotFoundError,\n PermissionDeniedError,\n RateLimitError,\n ServerError,\n ServiceUnavailableError,\n UnprocessableEntityError,\n createHttpError\n} from \"./http-errors.js\";\nexport type { HttpErrorRequest, HttpErrorResponse } from \"./http-errors.js\";\nexport { ApprovalDeclinedError, ToolcraftBugError, UserError };\nexport { createRuntimeLogger, isLogLevel, shouldEmitDiagnostic } from \"./runtime-logging.js\";\nexport { findPackageMetadata, packageMetadata } from \"./package-metadata.js\";\nexport type { PackageMetadata } from \"./package-metadata.js\";\nexport type {\n FileChangeRendererOptions,\n FileChangeResult\n} from \"./file-change-renderer.js\";\nexport type { FileChange, FileChangeDisplayMode, FileChangeKind } from \"toolcraft-design\";\nexport type {\n DiagnosticLogEvent,\n LogLevel,\n RuntimeLogger,\n RuntimeLoggerInput\n} from \"./runtime-logging.js\";\nexport type {\n AnySchema,\n ArraySchema,\n BooleanSchema,\n EnumSchema,\n JsonSchema,\n NumberSchema,\n ObjectSchema,\n OptionalSchema,\n Static,\n StringSchema\n} from \"toolcraft-schema\";\nexport type { HumanInLoopConfig, HumanInLoopPending, HumanInLoopRuntimeOptions };\n", "export class UserError extends Error {\n constructor(message: string, options?: ErrorOptions) {\n super(message, options);\n this.name = \"UserError\";\n }\n}\n\nexport class ToolcraftBugError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"ToolcraftBugError\";\n }\n}\n", "import type { ObjectSchema } from \"toolcraft-schema\";\nimport type { HumanInLoopConfig } from \"./types.js\";\n\ntype HumanInLoopValue<TParamsSchema extends ObjectSchema<any>> =\n | HumanInLoopConfig<TParamsSchema>\n | null\n | undefined;\n\nexport function validateHumanInLoopOnDefine<TParamsSchema extends ObjectSchema<any>>(config: {\n name: string;\n confirm?: boolean;\n children?: readonly unknown[];\n humanInLoop?: HumanInLoopValue<TParamsSchema>;\n}): void {\n const label = Array.isArray(config.children) ? \"group\" : \"command\";\n\n if (config.confirm === true && config.humanInLoop !== undefined && config.humanInLoop !== null) {\n throw new Error(`${label} '${config.name}': use either confirm or humanInLoop, not both`);\n }\n\n if (config.humanInLoop === undefined || config.humanInLoop === null) {\n return;\n }\n\n if (config.humanInLoop.mode !== \"sync\" && config.humanInLoop.mode !== \"async\") {\n throw new Error(`${label} '${config.name}': humanInLoop.mode must be \"sync\" or \"async\"`);\n }\n\n if (typeof config.humanInLoop.message !== \"function\") {\n throw new Error(`${label} '${config.name}': humanInLoop.message must be a function`);\n }\n\n if (config.humanInLoop.plan !== undefined && typeof config.humanInLoop.plan !== \"function\") {\n throw new Error(`${label} '${config.name}': humanInLoop.plan must be a function`);\n }\n}\n\nexport function mergeHumanInLoopFromGroup<\n TGroupParamsSchema extends ObjectSchema<any>,\n TChildParamsSchema extends ObjectSchema<any>,\n>(\n groupHumanInLoop: HumanInLoopValue<TGroupParamsSchema>,\n childHumanInLoop: HumanInLoopValue<TChildParamsSchema>\n): HumanInLoopValue<TChildParamsSchema> {\n if (childHumanInLoop !== undefined) {\n return childHumanInLoop;\n }\n\n return groupHumanInLoop as HumanInLoopValue<TChildParamsSchema>;\n}\n", "import type { SchemaBase } from \"./index.js\";\n\ntype JsonPrimitive = string | number | boolean | null;\n\nexport type JsonValue = JsonPrimitive | { [key: string]: JsonValue } | JsonValue[];\n\nexport interface JsonValueSchema extends SchemaBase<\"json\", JsonValue> {\n readonly kind: \"json\";\n}\n\nexport function Json(): JsonValueSchema {\n return {\n kind: \"json\",\n };\n}\n", "import type { ObjectSchema, SchemaBase, Static } from \"./index.js\";\n\ntype OneOfStatic<\n TBranches extends Record<string, ObjectSchema<any>>,\n TDiscriminator extends string,\n> = {\n [TBranchName in keyof TBranches & string]: Omit<Static<TBranches[TBranchName]>, TDiscriminator> & {\n [TFieldName in TDiscriminator]: TBranchName;\n };\n}[keyof TBranches & string];\n\nexport interface OneOfSchema<\n TBranches extends Record<string, ObjectSchema<any>>,\n TDiscriminator extends string = string,\n> extends SchemaBase<\"oneOf\", OneOfStatic<TBranches, TDiscriminator>> {\n readonly discriminator: TDiscriminator;\n readonly branches: TBranches;\n}\n\nfunction assertValidBranches(\n branches: Record<string, ObjectSchema<any>>,\n discriminator: string\n): void {\n if (Object.keys(branches).length === 0) {\n throw new Error(\"OneOf schema requires at least one branch\");\n }\n\n for (const [branchName, branch] of Object.entries(branches)) {\n if (Object.prototype.hasOwnProperty.call(branch.shape, discriminator)) {\n throw new Error(\n `OneOf branch \"${branchName}\" must not declare discriminator field \"${discriminator}\".`\n );\n }\n }\n}\n\nexport function OneOf<\n TDiscriminator extends string,\n TBranches extends Record<string, ObjectSchema<any>>,\n>(config: {\n discriminator: TDiscriminator;\n branches: TBranches;\n}): OneOfSchema<TBranches, TDiscriminator> {\n assertValidBranches(config.branches, config.discriminator);\n\n return {\n kind: \"oneOf\",\n discriminator: config.discriminator,\n branches: config.branches,\n };\n}\n", "import type { AnySchema, SchemaBase, Static } from \"./index.js\";\n\nexport interface RecordSchema<TValue extends AnySchema>\n extends SchemaBase<\"record\", Record<string, Static<TValue>>> {\n readonly value: TValue;\n}\n\nexport function Record<TValue extends AnySchema>(value: TValue): RecordSchema<TValue> {\n return {\n kind: \"record\",\n value,\n };\n}\n", "import type { AnySchema, ObjectSchema, OptionalSchema, SchemaBase, Static } from \"./index.js\";\n\ntype UnionStatic<TBranches extends readonly ObjectSchema<any>[]> = Static<TBranches[number]>;\n\nexport interface UnionSchema<TBranches extends readonly ObjectSchema<any>[]>\n extends SchemaBase<\"union\", UnionStatic<TBranches>> {\n readonly branches: TBranches;\n}\n\nfunction isOptionalSchema(schema: AnySchema): schema is OptionalSchema<AnySchema> {\n return schema.kind === \"optional\";\n}\n\nfunction getRequiredKeys(schema: ObjectSchema<any>): string[] {\n return Object.keys(schema.shape)\n .filter((key) => !isOptionalSchema(schema.shape[key] as AnySchema))\n .sort();\n}\n\nexport function getRequiredKeyFingerprint(schema: ObjectSchema<any>): string {\n return getRequiredKeys(schema).join(\"+\");\n}\n\nfunction assertUniqueRequiredKeyFingerprints(branches: readonly ObjectSchema<any>[]): void {\n const fingerprints = new Map<string, { display: string; indices: number[] }>();\n\n branches.forEach((branch, index) => {\n const requiredKeys = getRequiredKeys(branch);\n const fingerprint = JSON.stringify(requiredKeys);\n const existing = fingerprints.get(fingerprint);\n\n if (existing === undefined) {\n fingerprints.set(fingerprint, {\n display: requiredKeys.join(\"+\"),\n indices: [index],\n });\n return;\n }\n\n existing.indices.push(index);\n });\n\n for (const { display, indices } of fingerprints.values()) {\n if (indices.length > 1) {\n throw new Error(\n `Union branches [${indices.join(\", \")}] share required-key fingerprint \"${display}\". Each branch must require a distinct set of keys.`\n );\n }\n }\n}\n\nfunction assertValidBranches(branches: readonly ObjectSchema<any>[]): void {\n if (branches.length === 0) {\n throw new Error(\"Union schema requires at least one branch\");\n }\n\n assertUniqueRequiredKeyFingerprints(branches);\n}\n\nexport function Union<const TBranches extends readonly ObjectSchema<any>[]>(\n branches: TBranches\n): UnionSchema<TBranches> {\n assertValidBranches(branches);\n\n return {\n kind: \"union\",\n branches,\n };\n}\n", "import type { AnySchema, ObjectSchema, OptionalSchema, Static } from \"./index.js\";\nimport { getRequiredKeyFingerprint } from \"./union.js\";\n\nexport type SchemaDescriptor = AnySchema;\n\nexport type ValidationIssue = {\n path: readonly string[];\n expected: string;\n received: string;\n message: string;\n};\n\nexport type ValidationResult<T> =\n | { ok: true; value: T }\n | { ok: false; issues: readonly ValidationIssue[] };\n\ntype ValidationState = {\n issues: ValidationIssue[];\n};\n\ntype WalkResult = { present: true; value: unknown } | { present: false };\n\nconst missingValue = Symbol(\"missingValue\");\n\nexport function validate<S extends SchemaDescriptor>(\n schema: S,\n value: unknown\n): ValidationResult<Static<S>> {\n const state: ValidationState = { issues: [] };\n const result = walkSchema(schema, value, [], state);\n\n if (state.issues.length > 0) {\n return { ok: false, issues: state.issues };\n }\n\n return { ok: true, value: (result.present ? result.value : undefined) as Static<S> };\n}\n\nfunction walkSchema(\n schema: AnySchema,\n value: unknown | typeof missingValue,\n path: readonly string[],\n state: ValidationState\n): WalkResult {\n if (schema.kind === \"optional\") {\n return walkOptional(schema, value, path, state);\n }\n\n if (value === missingValue) {\n addIssue(\n state,\n path,\n expectedFor(schema),\n \"missing\",\n `Expected ${expectedFor(schema)} at ${formatPath(path)}`\n );\n return { present: false };\n }\n\n if (value === null && schema.nullable === true) {\n return { present: true, value };\n }\n\n switch (schema.kind) {\n case \"string\":\n return walkString(schema, value, path, state);\n\n case \"number\":\n return walkNumber(schema, value, path, state);\n\n case \"boolean\":\n return walkBoolean(value, path, state);\n\n case \"enum\":\n return walkEnum(schema, value, path, state);\n\n case \"array\":\n return walkArray(schema, value, path, state);\n\n case \"object\":\n return walkObject(schema, value, path, state);\n\n case \"oneOf\":\n return walkOneOf(schema, value, path, state);\n\n case \"union\":\n return walkUnion(schema, value, path, state);\n\n case \"record\":\n return walkRecord(schema, value, path, state);\n\n case \"json\":\n return walkJson(value, path, state);\n }\n}\n\nfunction walkOptional(\n schema: OptionalSchema<AnySchema>,\n value: unknown | typeof missingValue,\n path: readonly string[],\n state: ValidationState\n): WalkResult {\n if (value === missingValue || value === undefined) {\n const defaultValue = getDefault(schema.inner);\n\n if (defaultValue.present) {\n return walkSchema(schema.inner, cloneDefault(defaultValue.value), path, state);\n }\n\n return { present: false };\n }\n\n return walkSchema(schema.inner, value, path, state);\n}\n\nfunction walkString(\n schema: Extract<AnySchema, { kind: \"string\" }>,\n value: unknown,\n path: readonly string[],\n state: ValidationState\n): WalkResult {\n if (typeof value !== \"string\") {\n addExpectedIssue(state, path, \"string\", value);\n return { present: true, value };\n }\n\n if (schema.minLength !== undefined && value.length < schema.minLength) {\n const expected = `string with length at least ${schema.minLength}`;\n addIssue(\n state,\n path,\n expected,\n `string with length ${value.length}`,\n `Expected ${expected} at ${formatPath(path)}`\n );\n }\n\n if (schema.maxLength !== undefined && value.length > schema.maxLength) {\n const expected = `string with length at most ${schema.maxLength}`;\n addIssue(\n state,\n path,\n expected,\n `string with length ${value.length}`,\n `Expected ${expected} at ${formatPath(path)}`\n );\n }\n\n if (schema.pattern !== undefined) {\n const pattern = compilePattern(schema.pattern);\n\n if (pattern === undefined || !pattern.test(value)) {\n const expected = `string matching pattern ${schema.pattern}`;\n addIssue(state, path, expected, value, `Expected ${expected} at ${formatPath(path)}`);\n }\n }\n\n return { present: true, value };\n}\n\nfunction walkNumber(\n schema: Extract<AnySchema, { kind: \"number\" }>,\n value: unknown,\n path: readonly string[],\n state: ValidationState\n): WalkResult {\n if (typeof value !== \"number\" || !Number.isFinite(value)) {\n addExpectedIssue(state, path, schema.jsonType === \"integer\" ? \"integer\" : \"number\", value);\n return { present: true, value };\n }\n\n if (schema.jsonType === \"integer\" && !Number.isInteger(value)) {\n addExpectedIssue(state, path, \"integer\", value);\n }\n\n if (schema.minimum !== undefined && value < schema.minimum) {\n const expected = `number greater than or equal to ${schema.minimum}`;\n addIssue(state, path, expected, String(value), `Expected ${expected} at ${formatPath(path)}`);\n }\n\n if (schema.maximum !== undefined && value > schema.maximum) {\n const expected = `number less than or equal to ${schema.maximum}`;\n addIssue(state, path, expected, String(value), `Expected ${expected} at ${formatPath(path)}`);\n }\n\n return { present: true, value };\n}\n\nfunction walkBoolean(value: unknown, path: readonly string[], state: ValidationState): WalkResult {\n if (typeof value !== \"boolean\") {\n addExpectedIssue(state, path, \"boolean\", value);\n }\n\n return { present: true, value };\n}\n\nfunction walkEnum(\n schema: Extract<AnySchema, { kind: \"enum\" }>,\n value: unknown,\n path: readonly string[],\n state: ValidationState\n): WalkResult {\n if (!schema.values.includes(value as never)) {\n const expected = `one of ${schema.values.join(\", \")}`;\n addIssue(\n state,\n path,\n expected,\n receivedValue(value),\n `Expected ${expected} at ${formatPath(path)}`\n );\n }\n\n return { present: true, value };\n}\n\nfunction walkArray(\n schema: Extract<AnySchema, { kind: \"array\" }>,\n value: unknown,\n path: readonly string[],\n state: ValidationState\n): WalkResult {\n if (!Array.isArray(value)) {\n addExpectedIssue(state, path, \"array\", value);\n return { present: true, value };\n }\n\n if (schema.minItems !== undefined && value.length < schema.minItems) {\n const expected = `array with at least ${schema.minItems} items`;\n addIssue(\n state,\n path,\n expected,\n `array with ${value.length} items`,\n `Expected ${expected} at ${formatPath(path)}`\n );\n }\n\n if (schema.maxItems !== undefined && value.length > schema.maxItems) {\n const expected = `array with at most ${schema.maxItems} items`;\n addIssue(\n state,\n path,\n expected,\n `array with ${value.length} items`,\n `Expected ${expected} at ${formatPath(path)}`\n );\n }\n\n const nextValue = value.map((item, index) => {\n const result = walkSchema(schema.item, item, [...path, String(index)], state);\n\n return result.present ? result.value : item;\n });\n\n return { present: true, value: nextValue };\n}\n\nfunction walkObject(\n schema: ObjectSchema<any>,\n value: unknown,\n path: readonly string[],\n state: ValidationState,\n injectedProperties: Record<string, unknown> = {}\n): WalkResult {\n if (!isPlainRecord(value)) {\n addExpectedIssue(state, path, \"object\", value);\n return { present: true, value };\n }\n\n const nextValue: Record<string, unknown> = {};\n const allowedKeys = new Set([...Object.keys(schema.shape), ...Object.keys(injectedProperties)]);\n\n for (const [key, propertySchema] of Object.entries(schema.shape) as Array<[string, AnySchema]>) {\n const propertyValue = Object.hasOwn(value, key) ? value[key] : missingValue;\n const result = walkSchema(propertySchema, propertyValue, [...path, key], state);\n\n if (result.present) {\n setOwnValue(nextValue, key, result.value);\n }\n }\n\n for (const [key, injectedValue] of Object.entries(injectedProperties)) {\n if (Object.hasOwn(value, key)) {\n setOwnValue(nextValue, key, value[key]);\n } else {\n setOwnValue(nextValue, key, injectedValue);\n }\n }\n\n for (const [key, propertyValue] of Object.entries(value)) {\n if (allowedKeys.has(key)) {\n continue;\n }\n\n if (schema.additionalProperties === true) {\n setOwnValue(nextValue, key, propertyValue);\n } else {\n addUnexpectedPropertyIssue(state, [...path, key]);\n }\n }\n\n return { present: true, value: nextValue };\n}\n\nfunction walkOneOf(\n schema: Extract<AnySchema, { kind: \"oneOf\" }>,\n value: unknown,\n path: readonly string[],\n state: ValidationState\n): WalkResult {\n if (!isPlainRecord(value)) {\n addExpectedIssue(state, path, \"object\", value);\n return { present: true, value };\n }\n\n const discriminatorValue = value[schema.discriminator];\n const discriminatorPath = [...path, schema.discriminator];\n const branchValues = Object.keys(schema.branches);\n const expected = `one of ${branchValues.join(\", \")}`;\n\n if (!Object.hasOwn(value, schema.discriminator)) {\n addIssueWithMessage(\n state,\n discriminatorPath,\n expected,\n \"missing\",\n `Missing discriminator \"${schema.discriminator}\" at ${formatPath(path)}. Expected one of: ${branchValues.join(\", \")}.`\n );\n return { present: true, value };\n }\n\n if (\n typeof discriminatorValue !== \"string\" ||\n !Object.hasOwn(schema.branches, discriminatorValue)\n ) {\n addIssueWithMessage(\n state,\n discriminatorPath,\n expected,\n receivedValue(discriminatorValue),\n `Expected ${expected} at ${formatPath(discriminatorPath)}, got ${formatReceivedDiscriminator(discriminatorValue)}`\n );\n return { present: true, value };\n }\n\n return walkObject(schema.branches[discriminatorValue], value, path, state, {\n [schema.discriminator]: discriminatorValue\n });\n}\n\nfunction walkUnion(\n schema: Extract<AnySchema, { kind: \"union\" }>,\n value: unknown,\n path: readonly string[],\n state: ValidationState\n): WalkResult {\n if (isPlainRecord(value)) {\n const candidateBranches = schema.branches.filter((branch) => hasRequiredKeys(branch, value));\n\n if (candidateBranches.length === 1) {\n return walkObject(candidateBranches[0], value, path, state);\n }\n }\n\n const matches: Array<{ fingerprint: string; value: unknown }> = [];\n\n for (const branch of schema.branches) {\n const branchState: ValidationState = { issues: [] };\n const result = walkObject(branch, value, path, branchState);\n\n if (branchState.issues.length === 0 && result.present) {\n matches.push({ fingerprint: getRequiredKeyFingerprint(branch), value: result.value });\n }\n }\n\n if (matches.length === 1) {\n return { present: true, value: matches[0].value };\n }\n\n if (matches.length === 0) {\n const branchDescriptions = schema.branches.map((branch) => getRequiredKeyFingerprint(branch));\n addIssueWithMessage(\n state,\n path,\n \"exactly one union branch\",\n \"0 matching branches\",\n `No union branch matched at ${formatPath(path)}. Tried ${schema.branches.length} branches. Expected one of: ${branchDescriptions.join(\" | \")}.`\n );\n return { present: true, value };\n }\n\n addIssueWithMessage(\n state,\n path,\n \"exactly one union branch\",\n `${matches.length} matching branches`,\n `Expected exactly one union branch at ${formatPath(path)}, but matched more than one branch: ${matches.map((match) => match.fingerprint).join(\" | \")}`\n );\n return { present: true, value };\n}\n\nfunction hasRequiredKeys(schema: ObjectSchema<any>, value: Record<string, unknown>): boolean {\n for (const [key, propertySchema] of Object.entries(schema.shape) as Array<[string, AnySchema]>) {\n if (propertySchema.kind !== \"optional\" && !Object.hasOwn(value, key)) {\n return false;\n }\n }\n\n return true;\n}\n\nfunction walkRecord(\n schema: Extract<AnySchema, { kind: \"record\" }>,\n value: unknown,\n path: readonly string[],\n state: ValidationState\n): WalkResult {\n if (!isPlainRecord(value)) {\n addExpectedIssue(state, path, \"object\", value);\n return { present: true, value };\n }\n\n const nextValue: Record<string, unknown> = {};\n\n for (const [key, propertyValue] of Object.entries(value)) {\n const result = walkSchema(schema.value, propertyValue, [...path, key], state);\n\n if (result.present) {\n setOwnValue(nextValue, key, result.value);\n }\n }\n\n return { present: true, value: nextValue };\n}\n\nfunction walkJson(value: unknown, path: readonly string[], state: ValidationState): WalkResult {\n if (isJsonValue(value)) {\n return { present: true, value };\n }\n\n addExpectedIssue(state, path, \"JSON value\", value);\n return { present: true, value };\n}\n\nfunction getDefault(schema: AnySchema): WalkResult {\n if (schema.default !== undefined) {\n return { present: true, value: schema.default };\n }\n\n if (schema.kind === \"optional\") {\n return getDefault(schema.inner);\n }\n\n return { present: false };\n}\n\nfunction isPlainRecord(value: unknown): value is Record<string, unknown> {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) {\n return false;\n }\n\n const prototype = Object.getPrototypeOf(value);\n\n return prototype === Object.prototype || prototype === null;\n}\n\nfunction isJsonValue(value: unknown, ancestors: Set<object> = new Set()): boolean {\n if (\n value === null ||\n typeof value === \"string\" ||\n typeof value === \"number\" ||\n typeof value === \"boolean\"\n ) {\n return typeof value !== \"number\" || Number.isFinite(value);\n }\n\n if (Array.isArray(value)) {\n if (ancestors.has(value)) {\n return false;\n }\n ancestors.add(value);\n const result = value.every((item) => isJsonValue(item, ancestors));\n ancestors.delete(value);\n return result;\n }\n\n if (isPlainRecord(value)) {\n if (ancestors.has(value)) {\n return false;\n }\n ancestors.add(value);\n const result = Object.values(value).every((item) => isJsonValue(item, ancestors));\n ancestors.delete(value);\n return result;\n }\n\n return false;\n}\n\nfunction cloneDefault(value: unknown): unknown {\n return structuredClone(value);\n}\n\nfunction setOwnValue(target: Record<string, unknown>, key: string, value: unknown): void {\n Object.defineProperty(target, key, {\n configurable: true,\n enumerable: true,\n writable: true,\n value\n });\n}\n\nfunction expectedFor(schema: AnySchema): string {\n switch (schema.kind) {\n case \"string\":\n return \"string\";\n case \"number\":\n return schema.jsonType === \"integer\" ? \"integer\" : \"number\";\n case \"boolean\":\n return \"boolean\";\n case \"enum\":\n return `one of ${schema.values.join(\", \")}`;\n case \"array\":\n return \"array\";\n case \"object\":\n case \"oneOf\":\n case \"record\":\n return \"object\";\n case \"union\":\n return \"exactly one union branch\";\n case \"json\":\n return \"JSON value\";\n case \"optional\":\n return expectedFor(schema.inner);\n }\n}\n\nfunction addExpectedIssue(\n state: ValidationState,\n path: readonly string[],\n expected: string,\n value: unknown\n): void {\n addIssue(\n state,\n path,\n expected,\n receivedType(value),\n `Expected ${expected} at ${formatPath(path)}`\n );\n}\n\nfunction addUnexpectedPropertyIssue(state: ValidationState, path: readonly string[]): void {\n addIssue(\n state,\n path,\n \"no additional properties\",\n \"unknown property\",\n `Unexpected property ${formatPath(path)}`\n );\n}\n\nfunction addIssue(\n state: ValidationState,\n path: readonly string[],\n expected: string,\n received: string,\n _message: string\n): void {\n state.issues.push({\n path,\n expected,\n received,\n message: formatIssueMessage(expected, path, received)\n });\n}\n\nfunction addIssueWithMessage(\n state: ValidationState,\n path: readonly string[],\n expected: string,\n received: string,\n message: string\n): void {\n state.issues.push({\n path,\n expected,\n received,\n message\n });\n}\n\nfunction formatIssueMessage(expected: string, path: readonly string[], received: string): string {\n return `Expected ${expected} at ${formatPath(path)}, got ${received}`;\n}\n\nfunction formatPath(path: readonly string[]): string {\n return path.length === 0 ? \"value\" : path.join(\".\");\n}\n\nfunction compilePattern(pattern: string): RegExp | undefined {\n try {\n return new RegExp(pattern);\n } catch {\n return undefined;\n }\n}\n\nfunction receivedType(value: unknown): string {\n if (value === null) {\n return \"null\";\n }\n\n if (Array.isArray(value)) {\n return \"array\";\n }\n\n if (typeof value === \"number\" && Number.isInteger(value)) {\n return \"integer\";\n }\n\n return typeof value;\n}\n\nfunction receivedValue(value: unknown): string {\n if (typeof value === \"string\") {\n return value;\n }\n\n if (value === undefined) {\n return \"undefined\";\n }\n\n return String(value);\n}\n\nfunction formatReceivedDiscriminator(value: unknown): string {\n if (typeof value === \"string\") {\n return JSON.stringify(value);\n }\n\n return receivedValue(value);\n}\n", "import { Json } from \"./json.js\";\nimport { createJsonSchemaDocument } from \"./json-schema-document.js\";\nimport { OneOf } from \"./oneof.js\";\nimport { Record as RecordBuilder } from \"./record.js\";\nimport { Union } from \"./union.js\";\nimport { validate } from \"./validate.js\";\nimport type { JsonValue, JsonValueSchema } from \"./json.js\";\nimport type { JsonSchemaDocument, JsonSchemaDocumentOptions } from \"./json-schema-document.js\";\nimport type { OneOfSchema } from \"./oneof.js\";\nimport type { RecordSchema } from \"./record.js\";\nimport type { UnionSchema } from \"./union.js\";\nimport type { ValidationIssue, ValidationResult } from \"./validate.js\";\n\ntype JsonSchemaType = \"string\" | \"number\" | \"integer\" | \"boolean\" | \"array\" | \"object\";\ntype SchemaKind =\n | \"string\"\n | \"number\"\n | \"boolean\"\n | \"enum\"\n | \"array\"\n | \"object\"\n | \"optional\"\n | \"oneOf\"\n | \"union\"\n | \"record\"\n | \"json\";\ntype EnumValue = string | number | boolean;\ntype JsonSchemaEnumValue = EnumValue | null;\ntype NumberJsonType = \"number\" | \"integer\";\ntype NonEmptyReadonlyArray<T> = readonly [T, ...T[]];\ntype ObjectShape = Record<string, AnySchema>;\ntype EmptyOptions = Record<never, never>;\ntype SchemaScope = \"cli\" | \"mcp\" | \"sdk\";\nexport type CliOutputMode = \"rich\" | \"md\" | \"json\";\nexport interface CliMissingParameterChoice<TValue> {\n label: string;\n value: TValue;\n}\nexport interface CliMissingParameterContext {\n commandPath: string;\n params: Readonly<Record<string, unknown>>;\n output: CliOutputMode;\n stdinTTY: boolean;\n stdoutTTY: boolean;\n}\nexport interface CliMissingParameterResolution<TValue> {\n choices: readonly CliMissingParameterChoice<TValue>[];\n message?: string;\n}\nexport interface CliSchemaOptions<TValue> {\n resolveMissing?: (\n context: CliMissingParameterContext\n ) =>\n | CliMissingParameterResolution<TValue>\n | undefined\n | Promise<CliMissingParameterResolution<TValue> | undefined>;\n}\ntype StringMetadata = {\n format?: string;\n maxLength?: number;\n minLength?: number;\n pattern?: string;\n secret?: boolean;\n};\ntype NumberMetadata = {\n maximum?: number;\n minimum?: number;\n secret?: boolean;\n};\ntype ArrayMetadata = {\n maxItems?: number;\n minItems?: number;\n};\ntype ObjectMetadata = {\n additionalProperties?: boolean;\n};\ntype OptionalKeys<TShape extends ObjectShape> = {\n [TKey in keyof TShape]: TShape[TKey] extends OptionalSchema<any> ? TKey : never;\n}[keyof TShape];\ntype RequiredKeys<TShape extends ObjectShape> = Exclude<keyof TShape, OptionalKeys<TShape>>;\n\ntype PropertyStatic<TSchema extends AnySchema> =\n TSchema extends OptionalSchema<infer TInner> ? Static<TInner> : Static<TSchema>;\n\ntype InferObject<TShape extends ObjectShape> = {\n [TKey in RequiredKeys<TShape>]: PropertyStatic<TShape[TKey]>;\n} & {\n [TKey in OptionalKeys<TShape>]?: PropertyStatic<TShape[TKey]>;\n};\n\ntype SchemaOptions<TDefault> = {\n cli?: CliSchemaOptions<TDefault>;\n description?: string;\n cliDescription?: string;\n cliAliases?: readonly string[];\n default?: TDefault;\n nullable?: boolean;\n requiredScopes?: readonly SchemaScope[];\n short?: string;\n scope?: readonly SchemaScope[];\n global?: boolean;\n};\n\ntype WithNullable<\n TSchema extends AnySchema,\n TOptions extends { nullable?: boolean }\n> = TOptions extends { readonly nullable: true } ? TSchema & { readonly nullable: true } : TSchema;\n\nexport interface SchemaBase<TKind extends SchemaKind, TStatic> {\n readonly kind: TKind;\n readonly cli?: CliSchemaOptions<TStatic>;\n readonly description?: string;\n readonly cliDescription?: string;\n readonly cliAliases?: readonly string[];\n readonly default?: TStatic;\n readonly nullable?: boolean;\n readonly requiredScopes?: readonly SchemaScope[];\n readonly short?: string;\n readonly scope?: readonly SchemaScope[];\n readonly global?: boolean;\n readonly __static?: TStatic;\n}\n\nexport interface JsonSchema {\n additionalProperties?: boolean | JsonSchema;\n type?: JsonSchemaType;\n description?: string;\n default?: unknown;\n enum?: ReadonlyArray<JsonSchemaEnumValue>;\n format?: string;\n items?: JsonSchema;\n maxItems?: number;\n maximum?: number;\n maxLength?: number;\n minItems?: number;\n minimum?: number;\n minLength?: number;\n nullable?: boolean;\n oneOf?: JsonSchema[];\n pattern?: string;\n properties?: Record<string, JsonSchema>;\n required?: string[];\n}\n\nexport interface StringSchema extends SchemaBase<\"string\", string>, StringMetadata {}\n\nexport interface NumberSchema extends SchemaBase<\"number\", number>, NumberMetadata {\n readonly jsonType?: NumberJsonType;\n}\n\nexport type BooleanSchema = SchemaBase<\"boolean\", boolean>;\n\nexport interface EnumSchema<TValues extends NonEmptyReadonlyArray<EnumValue>> extends SchemaBase<\n \"enum\",\n TValues[number]\n> {\n readonly values: TValues;\n readonly jsonType?: \"integer\";\n readonly labels?: Partial<Record<string, string>>;\n readonly loadOptions?:\n | (() => Array<{ label: string; value: string }>)\n | (() => Promise<Array<{ label: string; value: string }>>);\n}\n\nexport interface ArraySchema<TItem extends AnySchema>\n extends SchemaBase<\"array\", Array<Static<TItem>>>, ArrayMetadata {\n readonly item: TItem;\n}\n\nexport interface ObjectSchema<TShape extends ObjectShape>\n extends SchemaBase<\"object\", InferObject<TShape>>, ObjectMetadata {\n readonly shape: TShape;\n}\n\nexport interface OptionalSchema<TInner extends AnySchema> extends SchemaBase<\n \"optional\",\n Static<TInner> | undefined\n> {\n readonly inner: TInner;\n}\n\nexport type AnySchema =\n | StringSchema\n | NumberSchema\n | BooleanSchema\n | EnumSchema<NonEmptyReadonlyArray<EnumValue>>\n | ArraySchema<AnySchema>\n | ObjectSchema<ObjectShape>\n | OptionalSchema<AnySchema>\n | OneOfSchema<Record<string, ObjectSchema<any>>, string>\n | UnionSchema<readonly ObjectSchema<any>[]>\n | RecordSchema<AnySchema>\n | JsonValueSchema;\n\nexport type Static<TSchema extends AnySchema> = TSchema extends { readonly nullable: true }\n ? TSchema extends SchemaBase<any, infer TStatic>\n ? TStatic | null\n : never\n : TSchema extends SchemaBase<any, infer TStatic>\n ? TStatic\n : never;\n\nfunction withMetadata<TSchema extends AnySchema>(\n schema: TSchema,\n jsonSchema: JsonSchema\n): JsonSchema {\n if (schema.description !== undefined) {\n jsonSchema.description = schema.description;\n }\n\n if (schema.default !== undefined) {\n jsonSchema.default = schema.default;\n }\n\n if (schema.nullable === true) {\n jsonSchema.nullable = true;\n }\n\n return jsonSchema;\n}\n\nfunction withStringMetadata(schema: StringSchema, jsonSchema: JsonSchema): JsonSchema {\n if (schema.minLength !== undefined) {\n jsonSchema.minLength = schema.minLength;\n }\n\n if (schema.maxLength !== undefined) {\n jsonSchema.maxLength = schema.maxLength;\n }\n\n if (schema.pattern !== undefined) {\n jsonSchema.pattern = schema.pattern;\n }\n\n if (schema.format !== undefined) {\n jsonSchema.format = schema.format;\n }\n\n return withMetadata(schema, jsonSchema);\n}\n\nfunction withNumberMetadata(schema: NumberSchema, jsonSchema: JsonSchema): JsonSchema {\n if (schema.minimum !== undefined) {\n jsonSchema.minimum = schema.minimum;\n }\n\n if (schema.maximum !== undefined) {\n jsonSchema.maximum = schema.maximum;\n }\n\n return withMetadata(schema, jsonSchema);\n}\n\nfunction withArrayMetadata(schema: ArraySchema<any>, jsonSchema: JsonSchema): JsonSchema {\n if (schema.minItems !== undefined) {\n jsonSchema.minItems = schema.minItems;\n }\n\n if (schema.maxItems !== undefined) {\n jsonSchema.maxItems = schema.maxItems;\n }\n\n return withMetadata(schema, jsonSchema);\n}\n\nfunction withObjectMetadata(schema: ObjectSchema<any>, jsonSchema: JsonSchema): JsonSchema {\n jsonSchema.additionalProperties = schema.additionalProperties ?? false;\n\n return withMetadata(schema, jsonSchema);\n}\n\nfunction getEnumJsonType(values: ReadonlyArray<EnumValue>): JsonSchemaType | undefined {\n const [firstValue] = values;\n\n if (firstValue === undefined) {\n return undefined;\n }\n\n const firstType = typeof firstValue;\n const isSinglePrimitiveType = values.every((value) => typeof value === firstType);\n\n if (!isSinglePrimitiveType) {\n return undefined;\n }\n\n if (firstType === \"string\" || firstType === \"number\" || firstType === \"boolean\") {\n return firstType;\n }\n\n return undefined;\n}\n\nfunction isOptionalSchema(schema: AnySchema): schema is OptionalSchema<AnySchema> {\n return schema.kind === \"optional\";\n}\n\nfunction assertValidEnumValues(values: ReadonlyArray<EnumValue>): void {\n if (values.length === 0) {\n throw new Error(\"Enum schema requires at least one value\");\n }\n\n const uniqueValues = new Set(values);\n\n if (uniqueValues.size !== values.length) {\n throw new Error(\"Enum schema values must be unique\");\n }\n\n if (values.some((value) => typeof value === \"number\" && !Number.isFinite(value))) {\n throw new Error(\"Enum schema numeric values must be finite\");\n }\n}\n\nfunction assertNonNegativeInteger(value: number | undefined, name: string): void {\n if (value !== undefined && (!Number.isInteger(value) || value < 0)) {\n throw new Error(`${name} must be a non-negative integer`);\n }\n}\n\nfunction assertFiniteNumber(value: number | undefined, name: string): void {\n if (value !== undefined && !Number.isFinite(value)) {\n throw new Error(`${name} must be finite`);\n }\n}\n\nfunction assertMinMaxOrder(\n minimum: number | undefined,\n maximum: number | undefined,\n minimumName: string,\n maximumName: string\n): void {\n if (minimum !== undefined && maximum !== undefined && minimum > maximum) {\n throw new Error(`${minimumName} must be less than or equal to ${maximumName}`);\n }\n}\n\nfunction assertValidDefault(schema: AnySchema): void {\n if (schema.default === undefined) {\n return;\n }\n\n const result = validate(schema, schema.default);\n if (!result.ok) {\n throw new Error(\n `default must satisfy schema: ${result.issues[0]?.message ?? \"invalid default\"}`\n );\n }\n}\n\nfunction assertPattern(pattern: string | undefined): void {\n if (pattern === undefined) {\n return;\n }\n try {\n new RegExp(pattern);\n } catch {\n throw new Error(\"pattern must be a valid regular expression\");\n }\n}\n\nfunction unwrapOptional(schema: AnySchema): Exclude<AnySchema, OptionalSchema<AnySchema>> {\n if (isOptionalSchema(schema)) {\n return unwrapOptional(schema.inner);\n }\n\n return schema;\n}\n\nfunction withInjectedDiscriminator(\n schema: ObjectSchema<any>,\n discriminator: string,\n branchName: string\n): JsonSchema {\n const branchJsonSchema = toJsonSchema(schema);\n const properties = {\n ...(branchJsonSchema.properties ?? {}),\n [discriminator]: {\n type: \"string\",\n enum: [branchName]\n } satisfies JsonSchema\n };\n const required = [...new Set([...(branchJsonSchema.required ?? []), discriminator])];\n\n return {\n ...branchJsonSchema,\n type: \"object\",\n properties,\n required\n };\n}\n\nexport const S = {\n String<const TOptions extends SchemaOptions<string> & StringMetadata = EmptyOptions>(\n options: TOptions = {} as TOptions\n ): WithNullable<StringSchema, TOptions> {\n assertNonNegativeInteger(options.minLength, \"minLength\");\n assertNonNegativeInteger(options.maxLength, \"maxLength\");\n assertMinMaxOrder(options.minLength, options.maxLength, \"minLength\", \"maxLength\");\n assertPattern(options.pattern);\n const schema: StringSchema = {\n kind: \"string\",\n ...options\n };\n assertValidDefault(schema);\n return schema as WithNullable<StringSchema, TOptions>;\n },\n\n Number<\n const TOptions extends SchemaOptions<number> & NumberMetadata & { jsonType?: NumberJsonType } =\n EmptyOptions\n >(options: TOptions = {} as TOptions): WithNullable<NumberSchema, TOptions> {\n assertFiniteNumber(options.minimum, \"minimum\");\n assertFiniteNumber(options.maximum, \"maximum\");\n assertMinMaxOrder(options.minimum, options.maximum, \"minimum\", \"maximum\");\n assertFiniteNumber(options.default, \"default\");\n if (\n options.jsonType === \"integer\" &&\n options.default !== undefined &&\n !Number.isInteger(options.default)\n ) {\n throw new Error(\"default must be an integer\");\n }\n const schema: NumberSchema = {\n kind: \"number\",\n ...options\n };\n assertValidDefault(schema);\n return schema as WithNullable<NumberSchema, TOptions>;\n },\n\n Boolean<const TOptions extends SchemaOptions<boolean> = EmptyOptions>(\n options: TOptions = {} as TOptions\n ): WithNullable<BooleanSchema, TOptions> {\n const schema: BooleanSchema = {\n kind: \"boolean\",\n ...options\n };\n assertValidDefault(schema);\n return schema as WithNullable<BooleanSchema, TOptions>;\n },\n\n Enum<\n const TValues extends NonEmptyReadonlyArray<EnumValue>,\n const TOptions extends SchemaOptions<TValues[number]> & {\n jsonType?: \"integer\";\n labels?: Partial<Record<string, string>>;\n loadOptions?:\n | (() => Array<{ label: string; value: string }>)\n | (() => Promise<Array<{ label: string; value: string }>>);\n } = EmptyOptions\n >(\n values: TValues,\n options: TOptions = {} as TOptions\n ): WithNullable<EnumSchema<TValues>, TOptions> {\n assertValidEnumValues(values);\n if (\n options.jsonType === \"integer\" &&\n values.some((value) => typeof value !== \"number\" || !Number.isInteger(value))\n ) {\n throw new Error(\"Integer enum values must be integers\");\n }\n\n const schema: EnumSchema<TValues> = {\n kind: \"enum\",\n values,\n ...options\n };\n assertValidDefault(schema);\n return schema as WithNullable<EnumSchema<TValues>, TOptions>;\n },\n\n Array<\n TItem extends AnySchema,\n const TOptions extends SchemaOptions<Array<Static<TItem>>> & ArrayMetadata = EmptyOptions\n >(item: TItem, options: TOptions = {} as TOptions): WithNullable<ArraySchema<TItem>, TOptions> {\n assertNonNegativeInteger(options.minItems, \"minItems\");\n assertNonNegativeInteger(options.maxItems, \"maxItems\");\n assertMinMaxOrder(options.minItems, options.maxItems, \"minItems\", \"maxItems\");\n const schema: ArraySchema<TItem> = {\n kind: \"array\",\n item,\n ...options\n };\n assertValidDefault(schema);\n return schema as WithNullable<ArraySchema<TItem>, TOptions>;\n },\n\n Object<\n const TShape extends ObjectShape,\n const TOptions extends SchemaOptions<InferObject<TShape>> & ObjectMetadata = EmptyOptions\n >(\n shape: TShape,\n options: TOptions = {} as TOptions\n ): WithNullable<ObjectSchema<TShape>, TOptions> {\n const schema: ObjectSchema<TShape> = {\n kind: \"object\",\n shape,\n ...options\n };\n assertValidDefault(schema);\n return schema as WithNullable<ObjectSchema<TShape>, TOptions>;\n },\n\n Optional<TInner extends AnySchema>(inner: TInner): OptionalSchema<TInner> {\n return {\n kind: \"optional\",\n inner\n };\n },\n\n OneOf,\n\n Union,\n\n Record: RecordBuilder,\n\n Json\n} as const;\n\nexport function toJsonSchema(schema: AnySchema): JsonSchema {\n const unwrappedSchema = unwrapOptional(schema);\n\n switch (unwrappedSchema.kind) {\n case \"string\":\n return withStringMetadata(unwrappedSchema, { type: \"string\" });\n\n case \"number\":\n return withNumberMetadata(unwrappedSchema, { type: unwrappedSchema.jsonType ?? \"number\" });\n\n case \"boolean\":\n return withMetadata(unwrappedSchema, { type: \"boolean\" });\n\n case \"enum\": {\n const jsonSchema: JsonSchema = {\n enum:\n unwrappedSchema.nullable === true\n ? [...unwrappedSchema.values, null]\n : [...unwrappedSchema.values]\n };\n const enumType = unwrappedSchema.jsonType ?? getEnumJsonType(unwrappedSchema.values);\n\n if (enumType !== undefined) {\n jsonSchema.type = enumType;\n }\n\n return withMetadata(unwrappedSchema, jsonSchema);\n }\n\n case \"array\":\n return withArrayMetadata(unwrappedSchema, {\n type: \"array\",\n items: toJsonSchema(unwrappedSchema.item)\n });\n\n case \"object\": {\n const properties: Record<string, JsonSchema> = {};\n const required: string[] = [];\n\n for (const [key, propertySchema] of Object.entries(unwrappedSchema.shape)) {\n Object.defineProperty(properties, key, {\n enumerable: true,\n configurable: true,\n writable: true,\n value: toJsonSchema(propertySchema)\n });\n\n if (!isOptionalSchema(propertySchema)) {\n required.push(key);\n }\n }\n\n return withObjectMetadata(unwrappedSchema, {\n type: \"object\",\n properties,\n required\n });\n }\n\n case \"oneOf\":\n return withMetadata(unwrappedSchema, {\n oneOf: Object.entries(unwrappedSchema.branches).map(([branchName, branchSchema]) =>\n withInjectedDiscriminator(branchSchema, unwrappedSchema.discriminator, branchName)\n )\n });\n\n case \"union\":\n return withMetadata(unwrappedSchema, {\n oneOf: unwrappedSchema.branches.map((branchSchema) => toJsonSchema(branchSchema))\n });\n\n case \"record\":\n return withMetadata(unwrappedSchema, {\n type: \"object\",\n additionalProperties: toJsonSchema(unwrappedSchema.value)\n });\n\n case \"json\":\n return withMetadata(unwrappedSchema, {});\n }\n}\n\nexport function toJsonSchemaDocument(\n schema: AnySchema,\n options: JsonSchemaDocumentOptions = {}\n): JsonSchemaDocument {\n return createJsonSchemaDocument(toJsonSchema(schema), options);\n}\n\nexport { Json, OneOf, RecordBuilder as Record, Union, validate };\nexport type { JsonSchemaDocument, JsonSchemaDocumentOptions } from \"./json-schema-document.js\";\nexport type {\n JsonValue,\n JsonValueSchema,\n OneOfSchema,\n RecordSchema,\n UnionSchema,\n ValidationIssue,\n ValidationResult\n};\n", "export type LogLevel = \"silent\" | \"error\" | \"warn\" | \"info\" | \"debug\" | \"trace\";\n\nexport interface DiagnosticLogEvent {\n level: Exclude<LogLevel, \"silent\">;\n message: string;\n category?: \"runtime\" | \"http\" | \"auth\" | \"retry\" | \"progress\";\n data?: Record<string, unknown>;\n}\n\nexport interface RuntimeLogger {\n level: LogLevel;\n emit(event: DiagnosticLogEvent): void;\n}\n\nexport type RuntimeLoggerInput = RuntimeLogger | ((event: DiagnosticLogEvent) => void);\n\nconst LOG_LEVEL_RANK = {\n silent: 0,\n error: 1,\n warn: 2,\n info: 3,\n debug: 4,\n trace: 5\n} as const satisfies Record<LogLevel, number>;\n\nexport const LOG_LEVELS = Object.freeze([\n \"silent\",\n \"error\",\n \"warn\",\n \"info\",\n \"debug\",\n \"trace\"\n] as const satisfies readonly LogLevel[]);\n\nexport function isLogLevel(value: string): value is LogLevel {\n return (LOG_LEVELS as readonly string[]).includes(value);\n}\n\nexport function shouldEmitDiagnostic(eventLevel: LogLevel, configuredLevel: LogLevel): boolean {\n if (eventLevel === \"silent\" || configuredLevel === \"silent\") {\n return false;\n }\n\n return LOG_LEVEL_RANK[eventLevel] <= LOG_LEVEL_RANK[configuredLevel];\n}\n\nexport function createRuntimeLogger(\n options: {\n level?: LogLevel;\n logger?: RuntimeLoggerInput;\n } = {}\n): RuntimeLogger {\n const level = options.level ?? \"warn\";\n const sink = options.logger;\n\n return {\n level,\n emit(event): void {\n if (!shouldEmitDiagnostic(event.level, level)) {\n return;\n }\n\n if (typeof sink === \"function\") {\n sink(event);\n return;\n }\n\n sink?.emit(event);\n }\n };\n}\n", "import { existsSync, readFileSync, realpathSync, statSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nexport interface PackageMetadata {\n name?: string;\n path: string;\n version?: string;\n}\n\ntype PackageMetadataInput = string | URL;\n\nfunction pathFromInput(from: PackageMetadataInput): string {\n if (from instanceof URL) {\n return fileURLToPath(from);\n }\n\n if (from.startsWith(\"file:\")) {\n return fileURLToPath(from);\n }\n\n return path.resolve(from);\n}\n\nfunction getSearchDirectory(from: PackageMetadataInput): string {\n const resolved = pathFromInput(from);\n let searchPath = resolved;\n\n try {\n searchPath = realpathSync(resolved);\n } catch {\n searchPath = resolved;\n }\n\n try {\n return statSync(searchPath).isDirectory() ? searchPath : path.dirname(searchPath);\n } catch {\n return path.dirname(resolved);\n }\n}\n\nfunction readPackageMetadata(packageJsonPath: string): PackageMetadata | undefined {\n const parsed = JSON.parse(readFileSync(packageJsonPath, \"utf8\")) as {\n name?: unknown;\n version?: unknown;\n };\n const metadata: PackageMetadata = { path: packageJsonPath };\n\n if (typeof parsed.name === \"string\") {\n metadata.name = parsed.name;\n }\n\n if (typeof parsed.version === \"string\") {\n metadata.version = parsed.version;\n }\n\n return metadata;\n}\n\nexport function findPackageMetadata(from: PackageMetadataInput): PackageMetadata | undefined {\n let current = getSearchDirectory(from);\n\n while (true) {\n const packageJsonPath = path.join(current, \"package.json\");\n\n if (existsSync(packageJsonPath)) {\n return readPackageMetadata(packageJsonPath);\n }\n\n const parent = path.dirname(current);\n\n if (parent === current) {\n return undefined;\n }\n\n current = parent;\n }\n}\n\nexport function packageMetadata(from: PackageMetadataInput = process.cwd()): PackageMetadata {\n const metadata = findPackageMetadata(from);\n\n if (metadata === undefined) {\n throw new Error(`No package.json found from ${pathFromInput(from)}.`);\n }\n\n return metadata;\n}\n\nexport function findEntrypointPackageMetadata(entrypoint: string | undefined): PackageMetadata | undefined {\n if (entrypoint === undefined || entrypoint.length === 0) {\n return undefined;\n }\n\n if (!path.isAbsolute(entrypoint) && !entrypoint.startsWith(\"file:\")) {\n return undefined;\n }\n\n return findPackageMetadata(entrypoint);\n}\n", "import { randomUUID } from \"node:crypto\";\nimport { TerminalSession } from \"./terminal-session.js\";\n\nconst DEFAULT_COLS = 120;\nconst DEFAULT_ROWS = 40;\n\nexport interface NewSessionOptions {\n command: string;\n args?: string[];\n cwd?: string;\n env?: Record<string, string>;\n cols?: number;\n rows?: number;\n observe?: boolean;\n}\n\nexport class TerminalPilot {\n private readonly sessionMap = new Map<string, TerminalSession>();\n\n static async launch(): Promise<TerminalPilot> {\n return new TerminalPilot();\n }\n\n async newSession(opts: NewSessionOptions): Promise<TerminalSession> {\n const session = new TerminalSession({\n id: randomUUID(),\n command: opts.command,\n args: opts.args,\n cwd: opts.cwd,\n env: opts.env,\n cols: opts.cols ?? DEFAULT_COLS,\n rows: opts.rows ?? DEFAULT_ROWS,\n observe: opts.observe ?? false\n });\n\n this.sessionMap.set(session.id, session);\n return session;\n }\n\n getSession(id: string): TerminalSession {\n const session = this.sessionMap.get(id);\n\n if (session === undefined) {\n throw new Error(`Session not found: ${id}`);\n }\n\n return session;\n }\n\n deleteSession(id: string): void {\n this.sessionMap.delete(id);\n }\n\n sessions(): TerminalSession[] {\n return [...this.sessionMap.values()].filter((s) => s.exitCode === null);\n }\n\n async close(): Promise<void> {\n const sessions = [...this.sessionMap.values()];\n\n await Promise.all(\n sessions.map(async (session) => {\n await session.close();\n this.sessionMap.delete(session.id);\n })\n );\n }\n}\n", "import { EventEmitter } from \"node:events\";\nimport { accessSync, chmodSync, constants } from \"node:fs\";\nimport { createRequire } from \"node:module\";\nimport { dirname, join } from \"node:path\";\nimport * as nodePty from \"node-pty\";\nimport { stripAnsi } from \"./ansi.js\";\nimport { hasOwnErrorCode } from \"./errors.js\";\nimport { TerminalBuffer } from \"./terminal-buffer.js\";\nimport { keyToSequence, type TerminalKey } from \"./keys.js\";\nimport { TerminalScreen } from \"./terminal-screen.js\";\n\nconst DEFAULT_COLS = 120;\nconst DEFAULT_ROWS = 40;\nconst DEFAULT_TIMEOUT_MS = 10_000;\nconst WAIT_FOR_POLL_MS = 10;\nconst TYPE_DELAY_MS = 15;\nconst CLOSE_AFTER_SIGNAL_GRACE_MS = 250;\nconst CLOSE_AFTER_SIGTERM_MS = 1000;\nconst CLOSE_AFTER_SIGKILL_MS = 1000;\n\ntype TerminalSessionOptions = {\n id: string;\n command: string;\n args?: string[];\n cwd?: string;\n env?: Record<string, string | undefined>;\n cols?: number;\n rows?: number;\n observe?: boolean;\n};\n\nexport type WaitForOptions = {\n timeout?: number;\n scope?: \"history\" | \"screen\";\n};\n\nexport type HistoryOptions = {\n last?: number;\n};\n\ntype PtyLike = {\n readonly pid: number;\n write(data: string): void;\n resize(cols: number, rows: number): void;\n kill(signal?: string): void;\n onData(listener: (chunk: string) => void): { dispose(): void };\n onExit(listener: (event: { exitCode: number; signal?: number }) => void): { dispose(): void };\n};\n\nexport class TerminalSession {\n readonly id: string;\n readonly command: string;\n readonly pid: number;\n exitCode: number | null = null;\n\n private readonly pty: PtyLike;\n private readonly terminal: TerminalBuffer;\n private readonly emitter = new EventEmitter();\n private readonly exitPromise: Promise<number>;\n private rawBuffer = \"\";\n private lastDataAt = Date.now();\n private currentCols: number;\n private currentRows: number;\n private closePromise: Promise<number> | null = null;\n\n constructor({\n id,\n command,\n args = [],\n cwd = process.cwd(),\n env = process.env,\n cols = DEFAULT_COLS,\n rows = DEFAULT_ROWS,\n observe = false\n }: TerminalSessionOptions) {\n assertTerminalGeometry(cols, rows);\n this.id = id;\n this.command = command;\n this.currentCols = cols;\n this.currentRows = rows;\n this.terminal = new TerminalBuffer(cols, rows);\n this.pty = createPtyProcess({ command, args, cwd, env, cols, rows });\n this.pid = this.pty.pid;\n\n const dataSubscription = this.pty.onData((chunk) => {\n this.rawBuffer += chunk;\n this.lastDataAt = Date.now();\n this.terminal.write(chunk);\n\n if (observe) {\n process.stderr.write(chunk);\n }\n });\n\n let exitSubscription: { dispose(): void } | undefined;\n\n this.exitPromise = new Promise<number>((resolve) => {\n exitSubscription = this.pty.onExit(({ exitCode }) => {\n if (this.exitCode !== null) {\n resolve(this.exitCode);\n return;\n }\n\n this.exitCode = exitCode;\n dataSubscription.dispose();\n exitSubscription?.dispose();\n this.emitter.emit(\"exit\", exitCode);\n resolve(exitCode);\n });\n });\n }\n\n async type(text: string): Promise<void> {\n for (const character of text) {\n await this.send(character);\n await sleep(TYPE_DELAY_MS);\n }\n }\n\n async fill(text: string): Promise<void> {\n await this.send(text.replace(/\\r?\\n/g, \"\\r\"));\n }\n\n async press(key: TerminalKey): Promise<void> {\n await this.send(keyToSequence(key));\n }\n\n async send(raw: string): Promise<void> {\n if (this.exitCode !== null) {\n throw new Error(`Terminal session \"${this.id}\" has already exited.`);\n }\n\n this.pty.write(raw);\n }\n\n async signal(sig: string): Promise<void> {\n if (this.exitCode !== null) {\n return;\n }\n\n this.pty.kill(sig);\n }\n\n async waitFor(pattern: string | RegExp, opts?: WaitForOptions): Promise<string> {\n const timeout = opts?.timeout ?? DEFAULT_TIMEOUT_MS;\n const scope = opts?.scope ?? \"history\";\n assertTimeout(timeout);\n assertWaitScope(scope);\n const startedAt = Date.now();\n\n while (Date.now() - startedAt <= timeout) {\n const source = scope === \"screen\" ? (await this.screen()).text : this.rawBuffer;\n const matched = matchPattern(source, pattern);\n if (matched !== null) {\n return matched;\n }\n\n if (this.exitCode !== null) {\n throw new Error(`Terminal session \"${this.id}\" exited before matching pattern: ${String(pattern)}`);\n }\n\n await sleep(WAIT_FOR_POLL_MS);\n }\n\n throw new Error(`Timed out waiting for pattern after ${timeout}ms: ${String(pattern)}`);\n }\n\n async waitForQuiet(ms: number): Promise<void> {\n assertQuietPeriod(ms);\n while (true) {\n const remaining = ms - (Date.now() - this.lastDataAt);\n if (remaining <= 0) {\n return;\n }\n\n await sleep(remaining);\n }\n }\n\n async screen(): Promise<TerminalScreen> {\n const rawLines: string[] = [];\n\n for (let row = 0; row < this.currentRows; row += 1) {\n rawLines.push(this.terminal.renderLine(row));\n }\n\n return new TerminalScreen({\n lines: rawLines,\n rawLines,\n cursor: {\n row: this.terminal.displayBuffer.cursorY,\n col: this.terminal.displayBuffer.cursorX\n },\n size: {\n rows: this.currentRows,\n cols: this.currentCols\n }\n });\n }\n\n async history(opts?: HistoryOptions): Promise<string[]> {\n const normalized = normalizeHistoryBuffer(stripAnsi(this.rawBuffer));\n const lines = splitHistoryLines(normalized);\n\n if (opts?.last === undefined) {\n return lines;\n }\n\n if (!Number.isInteger(opts.last) || opts.last < 0) {\n throw new Error(\"History last must be a non-negative integer.\");\n }\n\n const start = Math.max(0, lines.length - opts.last);\n return lines.slice(start);\n }\n\n async resize(cols: number, rows: number): Promise<void> {\n assertTerminalGeometry(cols, rows);\n this.currentCols = cols;\n this.currentRows = rows;\n if (this.exitCode === null) {\n this.pty.resize(cols, rows);\n }\n this.terminal.resize(cols, rows);\n }\n\n async waitForExit(opts?: { timeout?: number }): Promise<number> {\n if (opts?.timeout !== undefined) {\n assertTimeout(opts.timeout);\n }\n\n if (this.exitCode !== null) {\n return this.exitCode;\n }\n\n if (opts?.timeout !== undefined) {\n const result = await waitForExit(this.exitPromise, opts.timeout);\n if (result === null) {\n throw new Error(`Timed out waiting for process to exit after ${opts.timeout}ms`);\n }\n return result;\n }\n\n return this.exitPromise;\n }\n\n async close(): Promise<number> {\n if (this.exitCode !== null) {\n return this.exitCode;\n }\n\n this.closePromise ??= this.closeProcess().catch((error: unknown) => {\n this.closePromise = null;\n throw error;\n });\n return this.closePromise;\n }\n\n private async closeProcess(): Promise<number> {\n const gracefulExitCode = await waitForExit(this.exitPromise, CLOSE_AFTER_SIGNAL_GRACE_MS);\n if (gracefulExitCode !== null) {\n return gracefulExitCode;\n }\n\n if (this.exitCode === null) {\n this.pty.kill(\"SIGTERM\");\n const afterSigterm = await waitForExit(this.exitPromise, CLOSE_AFTER_SIGTERM_MS);\n if (afterSigterm !== null) {\n return afterSigterm;\n }\n }\n\n if (this.exitCode === null) {\n this.pty.kill(\"SIGKILL\");\n const afterSigkill = await waitForExit(this.exitPromise, CLOSE_AFTER_SIGKILL_MS);\n if (afterSigkill !== null) {\n return afterSigkill;\n }\n }\n\n throw new Error(\"Timed out waiting for process to exit after SIGKILL.\");\n }\n\n on(event: \"exit\", cb: (code: number) => void): void {\n this.emitter.on(event, cb);\n }\n}\n\nfunction assertTerminalGeometry(cols: number, rows: number): void {\n if (!Number.isInteger(cols) || cols <= 0 || !Number.isInteger(rows) || rows <= 0) {\n throw new Error(\"Terminal columns and rows must be positive integers.\");\n }\n}\n\nfunction assertTimeout(timeout: number): void {\n if (!Number.isFinite(timeout) || timeout < 0) {\n throw new Error(\"Timeout must be a finite non-negative number.\");\n }\n}\n\nfunction assertWaitScope(scope: string): void {\n if (scope !== \"history\" && scope !== \"screen\") {\n throw new Error('Wait scope must be either \"history\" or \"screen\".');\n }\n}\n\nfunction assertQuietPeriod(duration: number): void {\n if (!Number.isFinite(duration) || duration < 0) {\n throw new Error(\"Quiet period must be a finite non-negative number.\");\n }\n}\n\nfunction createPtyProcess({\n command,\n args,\n cwd,\n env,\n cols,\n rows\n}: {\n command: string;\n args: string[];\n cwd: string;\n env: Record<string, string | undefined>;\n cols: number;\n rows: number;\n}): PtyLike {\n ensureSpawnHelperExecutable();\n return nodePty.spawn(command, args, {\n cwd,\n env,\n cols,\n rows,\n encoding: \"utf8\"\n });\n}\n\nlet spawnHelperChecked = false;\n\nfunction ensureSpawnHelperExecutable(): void {\n if (spawnHelperChecked) return;\n spawnHelperChecked = true;\n\n const require = createRequire(import.meta.url);\n const nodePtyDir = dirname(require.resolve(\"node-pty\"));\n const helper = join(nodePtyDir, \"..\", \"prebuilds\", `${process.platform}-${process.arch}`, \"spawn-helper\");\n\n try {\n accessSync(helper, constants.X_OK);\n } catch (error) {\n if (isMissingFileError(error)) {\n return;\n }\n\n try {\n chmodSync(helper, 0o755);\n } catch (chmodError) {\n if (isMissingFileError(chmodError)) {\n return;\n }\n\n throw chmodError;\n }\n }\n}\n\nfunction isMissingFileError(error: unknown): boolean {\n return hasOwnErrorCode(error, \"ENOENT\");\n}\n\nfunction matchPattern(buffer: string, pattern: string | RegExp): string | null {\n const clean = normalizeHistoryBuffer(stripAnsi(buffer));\n\n for (const line of clean.split(\"\\n\")) {\n if (typeof pattern === \"string\") {\n if (line.includes(pattern)) return line;\n } else {\n const flags = removeCharacter(pattern.flags, \"g\");\n if (new RegExp(pattern.source, flags).test(line)) return line;\n }\n }\n\n return null;\n}\n\nfunction removeCharacter(input: string, charToRemove: string): string {\n let output = \"\";\n\n for (const character of input) {\n if (character !== charToRemove) {\n output += character;\n }\n }\n\n return output;\n}\n\n\nfunction splitHistoryLines(input: string): string[] {\n const lines = input.split(\"\\n\");\n\n if (lines.length > 0 && lines[lines.length - 1] === \"\") {\n lines.pop();\n }\n\n return lines;\n}\n\nfunction normalizeHistoryBuffer(input: string): string {\n let output = \"\";\n let line = \"\";\n let cursor = 0;\n\n for (const character of input) {\n if (character === \"\\r\") {\n cursor = 0;\n continue;\n }\n\n if (character === \"\\b\") {\n cursor = Math.max(0, cursor - 1);\n continue;\n }\n\n if (character === \"\\n\") {\n output += `${line}\\n`;\n line = \"\";\n cursor = 0;\n continue;\n }\n\n line = `${line.slice(0, cursor)}${character}${line.slice(cursor + 1)}`;\n cursor += 1;\n }\n\n return output + line;\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => {\n setTimeout(resolve, ms);\n });\n}\n\nasync function waitForExit(exitPromise: Promise<number>, timeout: number): Promise<number | null> {\n return new Promise((resolve) => {\n let settled = false;\n\n const timer = setTimeout(() => {\n if (settled) {\n return;\n }\n\n settled = true;\n resolve(null);\n }, timeout);\n\n void exitPromise.then((code) => {\n if (settled) {\n return;\n }\n\n settled = true;\n clearTimeout(timer);\n resolve(code);\n });\n });\n}\n", "const ESC = 0x1b;\nconst BEL = 0x07;\nconst ST = 0x9c;\nconst CSI = 0x9b;\nconst OSC = 0x9d;\nconst DCS = 0x90;\nconst SOS = 0x98;\nconst PM = 0x9e;\nconst APC = 0x9f;\n\nexport function stripAnsi(input: string): string {\n let output = \"\";\n\n for (let index = 0; index < input.length; index += 1) {\n const code = input.charCodeAt(index);\n\n if (code === ESC) {\n const nextCode = input.charCodeAt(index + 1);\n\n if (nextCode === 0x5b) {\n index = consumeCsi(input, index + 2);\n continue;\n }\n\n if (nextCode === 0x5d) {\n index = consumeTerminatedString(input, index + 2, true);\n continue;\n }\n\n if (nextCode === 0x50 || nextCode === 0x58 || nextCode === 0x5e || nextCode === 0x5f) {\n index = consumeTerminatedString(input, index + 2, false);\n continue;\n }\n\n if (!Number.isNaN(nextCode)) {\n index += 1;\n }\n\n continue;\n }\n\n if (code === CSI) {\n index = consumeCsi(input, index + 1);\n continue;\n }\n\n if (code === OSC) {\n index = consumeTerminatedString(input, index + 1, true);\n continue;\n }\n\n if (code === DCS || code === SOS || code === PM || code === APC) {\n index = consumeTerminatedString(input, index + 1, false);\n continue;\n }\n\n output += input[index];\n }\n\n return output;\n}\n\nfunction consumeCsi(input: string, index: number): number {\n while (index < input.length) {\n const code = input.charCodeAt(index);\n if (code >= 0x40 && code <= 0x7e) {\n return index;\n }\n\n index += 1;\n }\n\n return input.length;\n}\n\nfunction consumeTerminatedString(\n input: string,\n index: number,\n allowBellTerminator: boolean\n): number {\n while (index < input.length) {\n const code = input.charCodeAt(index);\n\n if (code === ST || (allowBellTerminator && code === BEL)) {\n return index;\n }\n\n if (code === ESC && input.charCodeAt(index + 1) === 0x5c) {\n return index + 1;\n }\n\n index += 1;\n }\n\n return input.length;\n}\n", "export function hasOwnErrorCode(error: unknown, code: string): boolean {\n return (\n error instanceof Error &&\n Object.prototype.hasOwnProperty.call(error, \"code\") &&\n (error as { code?: unknown }).code === code\n );\n}\n", "type Cell = ([number, string] & { style?: string }) | null;\ntype Row = Cell[];\n\ninterface SgrStyleState {\n bold: boolean;\n dim: boolean;\n italic: boolean;\n underline: boolean;\n inverse: boolean;\n conceal: boolean;\n strikethrough: boolean;\n fg?: number[];\n bg?: number[];\n}\n\ninterface SavedCursorState {\n x: number;\n y: number;\n autoWrap: boolean;\n style: SgrStyleState;\n styleSequence: string;\n}\n\ninterface PrimaryScreenState {\n screen: Row[];\n cursorX: number;\n cursorY: number;\n pendingWrap: boolean;\n style: SgrStyleState;\n styleSequence: string;\n}\n\nconst RESET_SGR = \"\\x1b[0m\";\nconst DEC_SPECIAL_GRAPHICS: Record<string, string> = {\n j: \"\u2518\",\n k: \"\u2510\",\n l: \"\u250C\",\n m: \"\u2514\",\n n: \"\u253C\",\n q: \"\u2500\",\n t: \"\u251C\",\n u: \"\u2524\",\n v: \"\u2534\",\n w: \"\u252C\",\n x: \"\u2502\"\n};\n\nconst enum State {\n Normal,\n Escape,\n Csi,\n Osc,\n Str,\n StringEscape,\n EscCharset,\n EscHash\n}\n\nexport class TerminalBuffer {\n private _cols: number;\n private _rows: number;\n private _screen: Row[];\n private _primaryScreen: PrimaryScreenState | null = null;\n private _cursorX = 0;\n private _cursorY = 0;\n private _savedCursor: SavedCursorState;\n private _scrollTop = 0;\n private _scrollBottom: number;\n private _state = State.Normal;\n private _csiParams = \"\";\n private _csiPrivate = \"\";\n private _autoWrap = true;\n private _pendingWrap = false;\n private _originMode = false;\n private _insertMode = false;\n private _tabStops: Set<number>;\n private _lastPrintedChar: string | null = null;\n private _style: SgrStyleState = createDefaultStyleState();\n private _styleSequence = \"\";\n private _stringState = State.Normal;\n private _charsetTarget: \"g0\" | \"g1\" | null = null;\n private _g0Charset: \"ascii\" | \"graphics\" = \"ascii\";\n private _g1Charset: \"ascii\" | \"graphics\" = \"ascii\";\n private _shiftOut = false;\n\n readonly displayBuffer: {\n readonly cursorX: number;\n readonly cursorY: number;\n readonly data: Array<Row | undefined>;\n };\n\n constructor(cols: number, rows: number) {\n this._cols = cols;\n this._rows = rows;\n this._scrollBottom = rows - 1;\n this._screen = this._makeScreen(cols, rows);\n this._tabStops = this._createDefaultTabStops(cols);\n this._savedCursor = this._createSavedCursorState();\n\n this.displayBuffer = Object.defineProperties(\n {} as {\n readonly cursorX: number;\n readonly cursorY: number;\n readonly data: Array<Row | undefined>;\n },\n {\n cursorX: { get: () => this._cursorX, enumerable: true },\n cursorY: { get: () => this._cursorY, enumerable: true },\n data: { get: () => this._screen as Array<Row | undefined>, enumerable: true }\n }\n );\n }\n\n write(data: string): void {\n for (const ch of data) {\n this._feed(ch);\n }\n }\n\n renderLine(row: number): string {\n const cells = this._screen[row] ?? [];\n let lastVisibleCell = -1;\n\n for (let index = cells.length - 1; index >= 0; index -= 1) {\n if (cells[index] !== null) {\n lastVisibleCell = index;\n break;\n }\n }\n\n if (lastVisibleCell === -1) {\n return \"\";\n }\n\n let line = \"\";\n let activeStyle = \"\";\n\n for (let index = 0; index <= lastVisibleCell; index += 1) {\n const cell = cells[index];\n const cellStyle = cell?.style ?? \"\";\n\n if (cellStyle !== activeStyle) {\n line += cellStyle.length > 0 ? cellStyle : RESET_SGR;\n activeStyle = cellStyle;\n }\n\n line += cell?.[1] ?? \" \";\n }\n\n if (activeStyle.length > 0) {\n line += RESET_SGR;\n }\n\n return line;\n }\n\n resize(cols: number, rows: number): void {\n // Adjust row count\n while (this._screen.length < rows) {\n this._screen.push(this._makeRow(cols));\n }\n this._screen.length = rows;\n\n // Adjust col count for each row\n for (let y = 0; y < rows; y++) {\n const row = this._screen[y] ?? this._makeRow(cols);\n while (row.length < cols) row.push(null);\n row.length = cols;\n this._screen[y] = row;\n }\n\n this._cols = cols;\n this._rows = rows;\n this._scrollTop = this._clamp(this._scrollTop, 0, rows - 1);\n this._scrollBottom = this._clamp(this._scrollBottom, 0, rows - 1);\n if (this._scrollTop >= this._scrollBottom) {\n this._scrollTop = 0;\n this._scrollBottom = rows - 1;\n }\n this._cursorX = this._clamp(this._cursorX, 0, cols - 1);\n this._cursorY = this._clamp(this._cursorY, 0, rows - 1);\n }\n\n private _makeScreen(cols: number, rows: number): Row[] {\n return Array.from({ length: rows }, () => this._makeRow(cols));\n }\n\n private _makeRow(cols: number): Row {\n return Array(cols).fill(null) as Row;\n }\n\n private _createDefaultTabStops(cols: number): Set<number> {\n const tabStops = new Set<number>();\n for (let column = 8; column < cols; column += 8) {\n tabStops.add(column);\n }\n return tabStops;\n }\n\n private _clamp(value: number, min: number, max: number): number {\n return Math.max(min, Math.min(max, value));\n }\n\n private _createSavedCursorState(): SavedCursorState {\n return {\n x: this._cursorX,\n y: this._cursorY,\n autoWrap: this._autoWrap,\n style: { ...this._style, fg: this._style.fg?.slice(), bg: this._style.bg?.slice() },\n styleSequence: this._styleSequence\n };\n }\n\n private _saveCursor(): void {\n this._savedCursor = this._createSavedCursorState();\n }\n\n private _restoreCursor(): void {\n this._cursorX = this._clamp(this._savedCursor.x, 0, this._cols - 1);\n this._cursorY = this._clamp(this._savedCursor.y, 0, this._rows - 1);\n this._autoWrap = this._savedCursor.autoWrap;\n this._style = {\n ...this._savedCursor.style,\n fg: this._savedCursor.style.fg?.slice(),\n bg: this._savedCursor.style.bg?.slice()\n };\n this._styleSequence = this._savedCursor.styleSequence;\n }\n\n private _resetModes(): void {\n this._autoWrap = true;\n this._originMode = false;\n this._insertMode = false;\n this._pendingWrap = false;\n this._tabStops = this._createDefaultTabStops(this._cols);\n this._g0Charset = \"ascii\";\n this._g1Charset = \"ascii\";\n this._shiftOut = false;\n this._resetStyle();\n }\n\n private _writePrintable(ch: string): void {\n const width = this._cellWidth(ch);\n\n if (width === 0) {\n this._appendCombiningMark(ch);\n return;\n }\n\n if (this._autoWrap && this._pendingWrap) {\n this._cursorX = 0;\n this._newline();\n } else if (this._autoWrap && this._cursorX + width > this._cols) {\n this._cursorX = 0;\n this._newline();\n }\n\n if (this._insertMode) {\n const row = this._screen[this._cursorY];\n if (row) {\n row.splice(this._cursorX, 0, ...(Array(width).fill(null) as Cell[]));\n row.splice(this._cols);\n }\n }\n\n this._setChar(this._cursorY, this._cursorX, ch);\n for (let column = 1; column < width && this._cursorX + column < this._cols; column += 1) {\n const row = this._screen[this._cursorY];\n if (row) row[this._cursorX + column] = null;\n }\n this._lastPrintedChar = ch;\n\n if (!this._autoWrap) {\n this._cursorX = Math.min(this._cursorX + width, this._cols - 1);\n this._pendingWrap = false;\n } else if (this._cursorX + width >= this._cols) {\n this._cursorX = this._cols - 1;\n this._pendingWrap = true;\n } else {\n this._cursorX += width;\n this._pendingWrap = false;\n }\n }\n\n private _cellWidth(ch: string): number {\n const codePoint = ch.codePointAt(0);\n if (codePoint === undefined) return 0;\n if (isCombiningCodePoint(codePoint)) {\n return 0;\n }\n if (\n (codePoint >= 0x1100 && codePoint <= 0x115f) ||\n codePoint === 0x2329 ||\n codePoint === 0x232a ||\n (codePoint >= 0x2e80 && codePoint <= 0x303e) ||\n (codePoint >= 0x3041 && codePoint <= 0x33bf) ||\n (codePoint >= 0x3400 && codePoint <= 0x4dbf) ||\n (codePoint >= 0x4e00 && codePoint <= 0xa4cf) ||\n (codePoint >= 0xac00 && codePoint <= 0xd7af) ||\n (codePoint >= 0xf900 && codePoint <= 0xfaff) ||\n (codePoint >= 0xfe10 && codePoint <= 0xfe19) ||\n (codePoint >= 0xfe30 && codePoint <= 0xfe6f) ||\n (codePoint >= 0xff00 && codePoint <= 0xff60) ||\n (codePoint >= 0xffe0 && codePoint <= 0xffe6) ||\n (codePoint >= 0x1f200 && codePoint <= 0x1fffd) ||\n (codePoint >= 0x20000 && codePoint <= 0x3fffd)\n ) {\n return Math.min(2, this._cols);\n }\n return 1;\n }\n\n private _appendCombiningMark(ch: string): void {\n const target = this._findCombiningTarget();\n if (target === null) {\n return;\n }\n\n const cell = this._screen[target.y]?.[target.x];\n if (cell === null || cell === undefined) {\n return;\n }\n\n cell[1] += ch;\n }\n\n private _findCombiningTarget(): { x: number; y: number } | null {\n const startX = this._pendingWrap ? this._cursorX : this._cursorX - 1;\n\n for (let y = this._cursorY; y >= 0; y -= 1) {\n const row = this._screen[y];\n if (row === undefined) {\n continue;\n }\n\n for (let x = y === this._cursorY ? startX : this._cols - 1; x >= 0; x -= 1) {\n if (row[x] !== null) {\n return { x, y };\n }\n }\n }\n\n return null;\n }\n\n private _setChar(y: number, x: number, ch: string): void {\n const row = this._screen[y];\n if (row && x >= 0 && x < this._cols) {\n const renderedChar = this._style.conceal ? \" \" : ch;\n const cell = [renderedChar.charCodeAt(0), renderedChar] as Exclude<Cell, null>;\n\n if (this._styleSequence.length > 0) {\n Object.defineProperty(cell, \"style\", {\n value: this._styleSequence,\n writable: true,\n configurable: true\n });\n }\n\n row[x] = cell;\n }\n }\n\n private _eraseLine(y: number, fromX: number, toX: number): void {\n const row = this._screen[y];\n if (!row) return;\n for (let x = fromX; x <= toX && x < this._cols; x++) {\n row[x] = null;\n }\n }\n\n private _scrollUp(count: number): void {\n for (let i = 0; i < count; i++) {\n this._screen.splice(this._scrollTop, 1);\n this._screen.splice(this._scrollBottom, 0, this._makeRow(this._cols));\n }\n }\n\n private _scrollDown(count: number): void {\n for (let i = 0; i < count; i++) {\n this._screen.splice(this._scrollBottom, 1);\n this._screen.splice(this._scrollTop, 0, this._makeRow(this._cols));\n }\n }\n\n private _newline(): void {\n this._pendingWrap = false;\n if (this._cursorY === this._scrollBottom) {\n this._scrollUp(1);\n } else {\n this._cursorY = Math.min(this._cursorY + 1, this._rows - 1);\n }\n }\n\n private _parseCsiParams(): number[] {\n if (!this._csiParams) return [];\n const values = this._csiParams\n .split(\";\")\n .flatMap((segment) => segment.split(\":\"))\n .map((segment) => (segment === \"\" ? 0 : parseInt(segment, 10)));\n if ((values[0] === 38 || values[0] === 48) && values[1] === 2 && values[2] === 0) {\n values.splice(2, 1);\n }\n return values;\n }\n\n private _execCsi(final: string): void {\n const params = this._parseCsiParams();\n const p0 = params[0] ?? 0;\n const p1 = params[1] ?? 0;\n\n if (this._csiPrivate === \"?\") {\n if (final === \"h\" || final === \"l\") {\n if (params.includes(7)) {\n this._autoWrap = final === \"h\";\n }\n\n if (params.includes(6)) {\n this._originMode = final === \"h\";\n this._cursorX = 0;\n this._cursorY = this._originMode ? this._scrollTop : 0;\n }\n\n if (params.includes(1049)) {\n if (final === \"h\") {\n this._primaryScreen = {\n screen: this._screen,\n cursorX: this._cursorX,\n cursorY: this._cursorY,\n pendingWrap: this._pendingWrap,\n style: { ...this._style, fg: this._style.fg?.slice(), bg: this._style.bg?.slice() },\n styleSequence: this._styleSequence\n };\n this._screen = this._makeScreen(this._cols, this._rows);\n this._cursorX = 0;\n this._cursorY = 0;\n this._pendingWrap = false;\n } else {\n if (this._primaryScreen !== null) {\n this._screen = this._primaryScreen.screen;\n this._cursorX = this._primaryScreen.cursorX;\n this._cursorY = this._primaryScreen.cursorY;\n this._pendingWrap = this._primaryScreen.pendingWrap;\n this._style = this._primaryScreen.style;\n this._styleSequence = this._primaryScreen.styleSequence;\n this._primaryScreen = null;\n }\n }\n if (final === \"h\") this._resetStyle();\n }\n }\n return;\n }\n\n if ((final === \"h\" || final === \"l\") && params.includes(4)) {\n this._insertMode = final === \"h\";\n return;\n }\n\n switch (final) {\n case \"A\": // cursor up\n this._cursorY = this._clamp(this._cursorY - Math.max(1, p0), 0, this._rows - 1);\n break;\n case \"B\": // cursor down\n this._cursorY = this._clamp(this._cursorY + Math.max(1, p0), 0, this._rows - 1);\n break;\n case \"C\": // cursor forward\n case \"a\":\n this._cursorX = this._clamp(this._cursorX + Math.max(1, p0), 0, this._cols - 1);\n break;\n case \"D\": // cursor backward\n this._cursorX = this._clamp(this._cursorX - Math.max(1, p0), 0, this._cols - 1);\n break;\n case \"E\": // cursor next line\n this._cursorY = this._clamp(this._cursorY + Math.max(1, p0), 0, this._rows - 1);\n this._cursorX = 0;\n break;\n case \"F\": // cursor preceding line\n this._cursorY = this._clamp(this._cursorY - Math.max(1, p0), 0, this._rows - 1);\n this._cursorX = 0;\n break;\n case \"G\": // cursor horizontal absolute\n case \"`\":\n this._cursorX = this._clamp(Math.max(1, p0) - 1, 0, this._cols - 1);\n break;\n case \"H\": // cursor position\n case \"f\":\n this._cursorY = this._originMode\n ? this._clamp(this._scrollTop + Math.max(1, p0) - 1, this._scrollTop, this._scrollBottom)\n : this._clamp(Math.max(1, p0) - 1, 0, this._rows - 1);\n this._cursorX = this._clamp(Math.max(1, p1) - 1, 0, this._cols - 1);\n break;\n case \"I\": // cursor forward tabulation\n for (let i = 0; i < Math.max(1, p0); i++) {\n this._cursorX = Math.min(this._cols - 1, (Math.floor(this._cursorX / 8) + 1) * 8);\n }\n break;\n case \"J\": // erase in display\n if (p0 === 0) {\n this._eraseLine(this._cursorY, this._cursorX, this._cols - 1);\n for (let y = this._cursorY + 1; y < this._rows; y++)\n this._eraseLine(y, 0, this._cols - 1);\n } else if (p0 === 1) {\n for (let y = 0; y < this._cursorY; y++) this._eraseLine(y, 0, this._cols - 1);\n this._eraseLine(this._cursorY, 0, this._cursorX);\n } else if (p0 === 2) {\n for (let y = 0; y < this._rows; y++) this._eraseLine(y, 0, this._cols - 1);\n }\n break;\n case \"K\": // erase in line\n if (p0 === 0) this._eraseLine(this._cursorY, this._cursorX, this._cols - 1);\n else if (p0 === 1) this._eraseLine(this._cursorY, 0, this._cursorX);\n else if (p0 === 2) this._eraseLine(this._cursorY, 0, this._cols - 1);\n break;\n case \"X\": // erase characters (ECH)\n this._eraseLine(this._cursorY, this._cursorX, this._cursorX + Math.max(1, p0) - 1);\n break;\n case \"L\": {\n // insert lines\n if (this._cursorY < this._scrollTop || this._cursorY > this._scrollBottom) {\n break;\n }\n const n = Math.max(1, p0);\n for (let i = 0; i < n; i++) {\n this._screen.splice(this._scrollBottom, 1);\n this._screen.splice(this._cursorY, 0, this._makeRow(this._cols));\n }\n break;\n }\n case \"M\": {\n // delete lines\n if (this._cursorY < this._scrollTop || this._cursorY > this._scrollBottom) {\n break;\n }\n const n = Math.max(1, p0);\n for (let i = 0; i < n; i++) {\n this._screen.splice(this._cursorY, 1);\n this._screen.splice(this._scrollBottom, 0, this._makeRow(this._cols));\n }\n break;\n }\n case \"P\": {\n // delete characters\n const row = this._screen[this._cursorY];\n if (row) {\n const n = Math.max(1, p0);\n row.splice(this._cursorX, n);\n while (row.length < this._cols) row.push(null);\n }\n break;\n }\n case \"@\": {\n // insert blank characters\n const row = this._screen[this._cursorY];\n if (row) {\n const n = Math.max(1, p0);\n for (let i = 0; i < n; i++) row.splice(this._cursorX, 0, null);\n row.splice(this._cols);\n }\n break;\n }\n case \"S\": // scroll up\n this._scrollUp(Math.max(1, p0));\n break;\n case \"T\": // scroll down\n if (params.length <= 1) this._scrollDown(Math.max(1, p0));\n break;\n case \"Z\": {\n // cursor backward tabulation\n const n = Math.max(1, p0);\n for (let i = 0; i < n; i++) {\n this._cursorX = Math.max(0, (Math.ceil(this._cursorX / 8) - 1) * 8);\n }\n break;\n }\n case \"b\": // repeat preceding character\n if (this._lastPrintedChar !== null) {\n for (let index = 0; index < Math.max(1, p0); index += 1) {\n this._writePrintable(this._lastPrintedChar);\n }\n }\n break;\n case \"d\": // line position absolute\n this._cursorY = this._clamp(Math.max(1, p0) - 1, 0, this._rows - 1);\n break;\n case \"e\": // vertical position relative\n this._cursorY = this._clamp(this._cursorY + Math.max(1, p0), 0, this._rows - 1);\n break;\n case \"r\": {\n // set scrolling region\n const top = this._clamp(Math.max(1, p0) - 1, 0, this._rows - 1);\n const bottom = this._clamp((p1 === 0 ? this._rows : p1) - 1, 0, this._rows - 1);\n if (top < bottom) {\n this._scrollTop = top;\n this._scrollBottom = bottom;\n }\n this._cursorX = 0;\n this._cursorY = this._originMode ? this._scrollTop : 0;\n break;\n }\n case \"s\": // save cursor\n this._saveCursor();\n break;\n case \"u\": // restore cursor\n this._restoreCursor();\n break;\n case \"p\":\n if (this._csiPrivate === \"!\") {\n this._resetModes();\n }\n break;\n case \"m\":\n this._applySgr(params);\n break;\n default:\n break;\n }\n }\n\n private _feed(ch: string): void {\n const code = ch.charCodeAt(0);\n\n if (this._state !== State.Normal && (code === 0x18 || code === 0x1a)) {\n this._state = State.Normal;\n return;\n }\n\n if (this._state === State.Csi && code === 0x1b) {\n this._state = State.Escape;\n return;\n }\n\n switch (this._state) {\n case State.Normal:\n this._feedNormal(ch, code);\n break;\n case State.Escape:\n this._feedEscape(ch, code);\n break;\n case State.Csi:\n this._feedCsi(ch, code);\n break;\n case State.Osc:\n // consume until BEL or ST\n if (code === 0x07 || code === 0x9c) {\n this._state = State.Normal;\n } else if (code === 0x1b) {\n this._stringState = State.Osc;\n this._state = State.StringEscape;\n }\n break;\n case State.Str:\n // consume until ST\n if (code === 0x9c) {\n this._state = State.Normal;\n } else if (code === 0x1b) {\n this._stringState = State.Str;\n this._state = State.StringEscape;\n }\n break;\n case State.StringEscape:\n this._state = ch === \"\\\\\" ? State.Normal : this._stringState;\n break;\n case State.EscCharset:\n if (this._charsetTarget === \"g0\") this._g0Charset = ch === \"0\" ? \"graphics\" : \"ascii\";\n if (this._charsetTarget === \"g1\") this._g1Charset = ch === \"0\" ? \"graphics\" : \"ascii\";\n this._charsetTarget = null;\n this._state = State.Normal;\n break;\n case State.EscHash:\n if (ch === \"8\") {\n for (let row = 0; row < this._rows; row += 1) {\n for (let column = 0; column < this._cols; column += 1) {\n this._setChar(row, column, \"E\");\n }\n }\n this._cursorX = 0;\n this._cursorY = 0;\n }\n this._state = State.Normal;\n break;\n }\n }\n\n private _feedNormal(ch: string, code: number): void {\n if (code === 0x1b) {\n this._state = State.Escape;\n } else if (code === 0x9b) {\n // C1 CSI\n this._csiParams = \"\";\n this._csiPrivate = \"\";\n this._state = State.Csi;\n } else if (code === 0x9d) {\n // C1 OSC\n this._state = State.Osc;\n } else if (code === 0x90 || code === 0x98 || code === 0x9e || code === 0x9f) {\n // DCS, SOS, PM, APC\n this._state = State.Str;\n } else if (code === 0x85) {\n // C1 NEL = next line\n this._cursorX = 0;\n this._newline();\n } else if (code === 0x9c) {\n // C1 ST outside a string has no visible effect\n } else if (code === 0x07 || code === 0x05 || code === 0x06) {\n // BEL, ENQ, ACK \u2014 ignore\n } else if (code === 0x08) {\n // BS\n this._pendingWrap = false;\n if (this._cursorX > 0) this._cursorX--;\n } else if (code === 0x7f) {\n // DEL \u2014 ignore in displayed output\n } else if (code === 0x09) {\n // HT\n const nextTabStop = [...this._tabStops]\n .sort((left, right) => left - right)\n .find((tabStop) => tabStop > this._cursorX);\n this._cursorX = nextTabStop ?? this._cols - 1;\n } else if (code === 0x0a || code === 0x0b || code === 0x0c) {\n // LF, VT, FF\n this._newline();\n } else if (code === 0x0d) {\n // CR\n this._pendingWrap = false;\n this._cursorX = 0;\n } else if (code === 0x0e || code === 0x0f) {\n // SO, SI \u2014 shift between G1 and G0 character sets\n this._shiftOut = code === 0x0e;\n } else if (code >= 0x20 && code !== 0x7f) {\n // Printable character (including multi-byte Unicode via code points)\n const charset = this._shiftOut ? this._g1Charset : this._g0Charset;\n this._writePrintable(charset === \"graphics\" ? (DEC_SPECIAL_GRAPHICS[ch] ?? ch) : ch);\n }\n }\n\n private _feedEscape(ch: string, code: number): void {\n this._state = State.Normal;\n\n if (code === 0x5b) {\n // ESC [ = CSI\n this._csiParams = \"\";\n this._csiPrivate = \"\";\n this._state = State.Csi;\n } else if (code === 0x5d) {\n // ESC ] = OSC\n this._state = State.Osc;\n } else if (code === 0x50 || code === 0x58 || code === 0x5e || code === 0x5f) {\n // DCS, SOS, PM, APC\n this._state = State.Str;\n } else if (\n code === 0x28 ||\n code === 0x29 ||\n code === 0x2a ||\n code === 0x2b ||\n code === 0x2d ||\n code === 0x2e\n ) {\n // ESC ( ) * + - . = charset designation (consume next char)\n this._charsetTarget = code === 0x28 ? \"g0\" : code === 0x29 ? \"g1\" : null;\n this._state = State.EscCharset;\n } else if (code === 0x23) {\n // ESC # = line attributes (consume next char)\n this._state = State.EscHash;\n } else if (code === 0x37) {\n // ESC 7 = save cursor\n this._saveCursor();\n } else if (code === 0x38) {\n // ESC 8 = restore cursor\n this._restoreCursor();\n } else if (code === 0x44) {\n // ESC D = index (LF)\n this._newline();\n } else if (code === 0x45) {\n // ESC E = next line\n this._cursorX = 0;\n this._newline();\n } else if (code === 0x4d) {\n // ESC M = reverse index\n if (this._cursorY === this._scrollTop) {\n this._scrollDown(1);\n } else {\n this._cursorY = Math.max(0, this._cursorY - 1);\n }\n } else if (code === 0x48) {\n // ESC H = horizontal tab set\n this._tabStops.add(this._cursorX);\n } else if (code === 0x63) {\n // ESC c = full reset\n this._screen = this._makeScreen(this._cols, this._rows);\n this._cursorX = 0;\n this._cursorY = 0;\n this._scrollTop = 0;\n this._scrollBottom = this._rows - 1;\n this._resetModes();\n this._savedCursor = this._createSavedCursorState();\n }\n // All other ESC sequences: two-char, already consumed \u2014 ignore\n }\n\n private _feedCsi(ch: string, code: number): void {\n if (code >= 0x40 && code <= 0x7e) {\n // Final byte\n this._execCsi(ch);\n this._state = State.Normal;\n } else if (code === 0x3f || code === 0x21 || code === 0x3e || code === 0x20) {\n // Private/intermediate marker (?, !, >, space)\n this._csiPrivate = ch;\n } else if ((code >= 0x30 && code <= 0x39) || code === 0x3b || code === 0x3a) {\n // Digit, semicolon, or colon \u2014 parameter byte\n this._csiParams += ch;\n }\n // Other bytes ignored\n }\n\n private _resetStyle(): void {\n this._style = createDefaultStyleState();\n this._styleSequence = \"\";\n }\n\n private _applySgr(params: number[]): void {\n const normalizedParams = params.length === 0 ? [0] : params;\n\n for (let index = 0; index < normalizedParams.length; index += 1) {\n const value = normalizedParams[index] ?? 0;\n\n switch (value) {\n case 0:\n this._resetStyle();\n break;\n case 1:\n this._style.bold = true;\n break;\n case 2:\n this._style.dim = true;\n break;\n case 3:\n this._style.italic = true;\n break;\n case 4:\n this._style.underline = true;\n break;\n case 7:\n this._style.inverse = true;\n break;\n case 8:\n this._style.conceal = true;\n break;\n case 9:\n this._style.strikethrough = true;\n break;\n case 21:\n case 22:\n this._style.bold = false;\n this._style.dim = false;\n break;\n case 23:\n this._style.italic = false;\n break;\n case 24:\n this._style.underline = false;\n break;\n case 27:\n this._style.inverse = false;\n break;\n case 28:\n this._style.conceal = false;\n break;\n case 29:\n this._style.strikethrough = false;\n break;\n case 39:\n this._style.fg = undefined;\n break;\n case 49:\n this._style.bg = undefined;\n break;\n case 38:\n case 48:\n index = this._applyExtendedColor(value, normalizedParams, index);\n break;\n default:\n if ((value >= 30 && value <= 37) || (value >= 90 && value <= 97)) {\n this._style.fg = [value];\n } else if ((value >= 40 && value <= 47) || (value >= 100 && value <= 107)) {\n this._style.bg = [value];\n }\n break;\n }\n }\n\n this._styleSequence = serializeStyleState(this._style);\n }\n\n private _applyExtendedColor(control: 38 | 48, params: number[], index: number): number {\n const mode = params[index + 1];\n const target = control === 38 ? \"fg\" : \"bg\";\n\n if (mode === 5) {\n const paletteIndex = params[index + 2];\n if (paletteIndex !== undefined) {\n this._style[target] = [control, 5, paletteIndex];\n return index + 2;\n }\n\n return index;\n }\n\n if (mode === 2) {\n const red = params[index + 2];\n const green = params[index + 3];\n const blue = params[index + 4];\n if (red !== undefined && green !== undefined && blue !== undefined) {\n this._style[target] = [control, 2, red, green, blue];\n return index + 4;\n }\n }\n\n return index;\n }\n}\n\nfunction createDefaultStyleState(): SgrStyleState {\n return {\n bold: false,\n dim: false,\n italic: false,\n underline: false,\n inverse: false,\n conceal: false,\n strikethrough: false\n };\n}\n\nfunction isCombiningCodePoint(codePoint: number): boolean {\n return (\n (codePoint >= 0x0300 && codePoint <= 0x036f) ||\n (codePoint >= 0x1ab0 && codePoint <= 0x1aff) ||\n (codePoint >= 0x1dc0 && codePoint <= 0x1dff) ||\n (codePoint >= 0x20d0 && codePoint <= 0x20ff) ||\n (codePoint >= 0xfe20 && codePoint <= 0xfe2f)\n );\n}\n\nfunction serializeStyleState(state: SgrStyleState): string {\n const codes: number[] = [];\n\n if (state.bold) {\n codes.push(1);\n }\n if (state.dim) {\n codes.push(2);\n }\n if (state.italic) {\n codes.push(3);\n }\n if (state.underline) {\n codes.push(4);\n }\n if (state.inverse) {\n codes.push(7);\n }\n if (state.conceal) {\n codes.push(8);\n }\n if (state.strikethrough) {\n codes.push(9);\n }\n if (state.fg !== undefined) {\n codes.push(...state.fg);\n }\n if (state.bg !== undefined) {\n codes.push(...state.bg);\n }\n\n return codes.length === 0 ? \"\" : `\\x1b[${codes.join(\";\")}m`;\n}\n", "const NAMED_KEY_SEQUENCES = {\n Enter: \"\\r\",\n Tab: \"\\t\",\n Escape: \"\\x1b\",\n Backspace: \"\\x7f\",\n Delete: \"\\x1b[3~\",\n ArrowUp: \"\\x1b[A\",\n ArrowDown: \"\\x1b[B\",\n ArrowRight: \"\\x1b[C\",\n ArrowLeft: \"\\x1b[D\",\n Home: \"\\x1b[H\",\n End: \"\\x1b[F\",\n PageUp: \"\\x1b[5~\",\n PageDown: \"\\x1b[6~\",\n Space: \" \"\n} as const;\n\nconst NAMED_KEY_LOWER = new Map(\n (Object.entries(NAMED_KEY_SEQUENCES) as [string, string][]).map(([k, v]) => [k.toLowerCase(), v])\n);\n\nconst VALID_KEYS_HINT = `Valid keys: ${Object.keys(NAMED_KEY_SEQUENCES).join(\", \")}, Control+<letter>, Alt+<key>`;\nconst NAMED_KEY_PATTERN = Object.keys(NAMED_KEY_SEQUENCES).map(caseInsensitivePattern).join(\"|\");\n\nexport const TERMINAL_KEY_PATTERN = `^(?:${NAMED_KEY_PATTERN}|.|[Cc][Oo][Nn][Tt][Rr][Oo][Ll]\\\\+[A-Za-z]|[Aa][Ll][Tt]\\\\+.+)$`;\n\nfunction unknownKeyError(key: string): Error {\n return new Error(`Unknown terminal key: ${key}. ${VALID_KEYS_HINT}`);\n}\n\nexport type TerminalKey =\n | \"Enter\"\n | \"Tab\"\n | \"Escape\"\n | \"Backspace\"\n | \"Delete\"\n | \"ArrowUp\"\n | \"ArrowDown\"\n | \"ArrowLeft\"\n | \"ArrowRight\"\n | \"Home\"\n | \"End\"\n | \"PageUp\"\n | \"PageDown\"\n | \"Space\"\n | `Control+${string}`\n | `Alt+${string}`;\n\nexport function keyToSequence(key: TerminalKey): string {\n const lowerKey = (key as string).toLowerCase();\n\n const namedSequence = NAMED_KEY_LOWER.get(lowerKey);\n if (namedSequence !== undefined) {\n return namedSequence;\n }\n\n if (lowerKey.startsWith(\"control+\")) {\n return controlKeyToSequence((key as string).slice(\"control+\".length));\n }\n\n if (lowerKey.startsWith(\"alt+\")) {\n const nestedKey = (key as string).slice(\"alt+\".length);\n if (nestedKey.length === 0) {\n throw unknownKeyError(key);\n }\n\n if (nestedKey.length === 1) {\n return \"\\x1b\" + nestedKey;\n }\n\n try {\n return \"\\x1b\" + keyToSequence(nestedKey as TerminalKey);\n } catch {\n throw unknownKeyError(key);\n }\n }\n\n if ((key as string).length === 1) {\n return key as string;\n }\n\n throw unknownKeyError(key);\n}\n\nfunction controlKeyToSequence(controlKey: string): string {\n if (controlKey.length !== 1) {\n throw unknownKeyError(`Control+${controlKey}`);\n }\n\n const uppercaseLetter = controlKey.toUpperCase();\n const charCode = uppercaseLetter.charCodeAt(0);\n if (charCode < 65 || charCode > 90) {\n throw unknownKeyError(`Control+${controlKey}`);\n }\n\n return String.fromCharCode(charCode - 64);\n}\n\nfunction caseInsensitivePattern(value: string): string {\n let pattern = \"\";\n\n for (const character of value) {\n const lower = character.toLowerCase();\n const upper = character.toUpperCase();\n pattern += lower === upper ? escapePatternCharacter(character) : `[${upper}${lower}]`;\n }\n\n return pattern;\n}\n\nfunction escapePatternCharacter(character: string): string {\n return character.replace(/[\\\\^$.*+?()[\\]{}|]/g, \"\\\\$&\");\n}\n", "import { stripAnsi } from \"./ansi.js\";\n\nexport class TerminalScreen {\n readonly lines: readonly string[];\n readonly rawLines: readonly string[];\n readonly cursor: { row: number; col: number };\n readonly size: { rows: number; cols: number };\n\n constructor({\n lines,\n rawLines,\n cursor,\n size\n }: {\n lines: string[];\n rawLines: string[];\n cursor: { row: number; col: number };\n size: { rows: number; cols: number };\n }) {\n this.lines = Object.freeze(lines.map((line) => stripAnsi(line)));\n this.rawLines = Object.freeze([...rawLines]);\n this.cursor = Object.freeze({ ...cursor });\n this.size = Object.freeze({ ...size });\n\n Object.freeze(this);\n }\n\n get text(): string {\n return this.lines.join(\"\\n\");\n }\n\n contains(substring: string): boolean {\n return this.text.includes(substring);\n }\n\n line(index: number): string {\n const normalizedIndex = index < 0 ? this.lines.length + index : index;\n const line = this.lines[normalizedIndex];\n\n if (line === undefined) {\n throw new RangeError(`Line index out of bounds: ${index}`);\n }\n\n return line;\n }\n}\n", "import { UserError } from \"toolcraft\";\nimport type { HandlerEnv } from \"toolcraft\";\nimport type { TerminalPilotInstallerServices } from \"./installer.js\";\nimport { TerminalPilot, type NewSessionOptions } from \"../terminal-pilot.js\";\nimport type { TerminalSession } from \"../terminal-session.js\";\n\nexport const SESSION_ENV_VAR = \"TERMINAL_PILOT_SESSION\";\n\ntype SessionLike = Pick<\n TerminalSession,\n | \"id\"\n | \"command\"\n | \"pid\"\n | \"exitCode\"\n | \"fill\"\n | \"type\"\n | \"press\"\n | \"signal\"\n | \"waitFor\"\n | \"waitForExit\"\n | \"screen\"\n | \"history\"\n | \"resize\"\n | \"close\"\n>;\n\ntype PilotLike = Pick<TerminalPilot, \"newSession\" | \"getSession\" | \"deleteSession\" | \"sessions\">;\ntype ClosablePilotLike = PilotLike & Pick<TerminalPilot, \"close\">;\n\ntype NamedSession = {\n name: string;\n session: SessionLike;\n};\n\ntype CreateSessionParams = NewSessionOptions & {\n session?: string;\n};\n\nexport interface TerminalPilotRuntime {\n createSession(params: CreateSessionParams, env?: HandlerEnv): Promise<NamedSession>;\n resolveSession(name: string | undefined, env?: HandlerEnv): Promise<NamedSession>;\n closeSession(\n name: string | undefined,\n env?: HandlerEnv\n ): Promise<{ exitCode: number; name: string }>;\n listSessions(): Promise<NamedSession[]>;\n hasRetainedSessions(): Promise<boolean>;\n close(): Promise<void>;\n}\n\nexport interface TerminalPilotCommandServices {\n terminalPilotRuntime?: TerminalPilotRuntime;\n terminalPilotInstaller?: TerminalPilotInstallerServices;\n}\n\ninterface CreateTerminalPilotRuntimeOptions {\n launchPilot?: () => Promise<ClosablePilotLike>;\n}\n\nlet sharedRuntime: TerminalPilotRuntime | undefined;\n\nexport function getTerminalPilotRuntime(\n runtime: TerminalPilotRuntime | undefined\n): TerminalPilotRuntime {\n if (runtime !== undefined) {\n return runtime;\n }\n\n sharedRuntime ??= createTerminalPilotRuntime();\n return sharedRuntime;\n}\n\nexport function createTerminalPilotRuntime(\n options: CreateTerminalPilotRuntimeOptions = {}\n): TerminalPilotRuntime {\n const launchPilot = options.launchPilot ?? TerminalPilot.launch;\n const nameToId = new Map<string, string>();\n const idToName = new Map<string, string>();\n const pendingNames = new Set<string>();\n let pilotPromise: Promise<ClosablePilotLike> | undefined;\n\n function getRequestedName(name: string | undefined, env?: HandlerEnv): string | undefined {\n const requestedName = name ?? env?.get(SESSION_ENV_VAR);\n\n if (requestedName !== undefined && requestedName.trim().length === 0) {\n throw new UserError(\"Session name must not be empty.\");\n }\n\n return requestedName;\n }\n\n async function getPilot(): Promise<ClosablePilotLike> {\n pilotPromise ??= launchPilot();\n return pilotPromise;\n }\n\n function nextSessionName(): string {\n let index = 1;\n\n while (nameToId.has(`s${index}`) || pendingNames.has(`s${index}`)) {\n index += 1;\n }\n\n return `s${index}`;\n }\n\n function rememberSession(name: string, session: SessionLike): NamedSession {\n nameToId.set(name, session.id);\n idToName.set(session.id, name);\n return { name, session };\n }\n\n function forgetSession(name: string, sessionId: string): void {\n if (nameToId.get(name) === sessionId) {\n nameToId.delete(name);\n }\n if (idToName.get(sessionId) === name) {\n idToName.delete(sessionId);\n }\n }\n\n function formatAvailableSessions(names: string[]): string {\n if (names.length === 0) {\n return \"No active sessions are available.\";\n }\n\n return `Available sessions: ${names.join(\", \")}.`;\n }\n\n async function lookupNamedSession(name: string): Promise<NamedSession> {\n const sessionId = nameToId.get(name);\n\n if (sessionId === undefined) {\n const active = await listSessions();\n throw new UserError(\n `Session \"${name}\" was not found. ${formatAvailableSessions(active.map((entry) => entry.name))}`\n );\n }\n\n const pilot = await getPilot();\n\n try {\n return { name, session: pilot.getSession(sessionId) };\n } catch {\n forgetSession(name, sessionId);\n const active = await listSessions();\n throw new UserError(\n `Session \"${name}\" was not found. ${formatAvailableSessions(active.map((entry) => entry.name))}`\n );\n }\n }\n\n async function listSessions(): Promise<NamedSession[]> {\n const pilot = await getPilot();\n\n return pilot.sessions().flatMap((session) => {\n const name = idToName.get(session.id);\n\n if (name === undefined) {\n return [];\n }\n\n return [{ name, session }];\n });\n }\n\n async function discardExitedSessionName(name: string): Promise<void> {\n const sessionId = nameToId.get(name);\n if (sessionId === undefined) {\n return;\n }\n\n const pilot = await getPilot();\n try {\n const session = pilot.getSession(sessionId);\n if (session.exitCode === null) {\n return;\n }\n pilot.deleteSession(sessionId);\n } catch {\n // Missing sessions no longer reserve public names.\n }\n forgetSession(name, sessionId);\n }\n\n return {\n async createSession(params: CreateSessionParams, env?: HandlerEnv): Promise<NamedSession> {\n if (params.command.trim().length === 0) {\n throw new UserError(\"Command must not be empty.\");\n }\n\n const requestedName = getRequestedName(params.session, env) ?? nextSessionName();\n\n await discardExitedSessionName(requestedName);\n\n if (nameToId.has(requestedName) || pendingNames.has(requestedName)) {\n throw new UserError(`Session \"${requestedName}\" already exists.`);\n }\n\n pendingNames.add(requestedName);\n try {\n const pilot = await getPilot();\n const session = await pilot.newSession({\n command: params.command,\n args: params.args,\n cwd: params.cwd,\n cols: params.cols,\n rows: params.rows,\n observe: params.observe\n });\n\n return rememberSession(requestedName, session);\n } finally {\n pendingNames.delete(requestedName);\n }\n },\n\n async resolveSession(name: string | undefined, env?: HandlerEnv): Promise<NamedSession> {\n const requestedName = getRequestedName(name, env);\n\n if (requestedName !== undefined) {\n return lookupNamedSession(requestedName);\n }\n\n const active = await listSessions();\n\n if (active.length === 1) {\n return active[0] as NamedSession;\n }\n\n if (active.length === 0) {\n throw new UserError(\"No active sessions. Create one with create-session.\");\n }\n\n throw new UserError(\n `Multiple active sessions require an explicit session name. Pass --session or set ${SESSION_ENV_VAR}. ${formatAvailableSessions(active.map((entry) => entry.name))}`\n );\n },\n\n async closeSession(\n name: string | undefined,\n env?: HandlerEnv\n ): Promise<{ exitCode: number; name: string }> {\n const namedSession = await this.resolveSession(name, env);\n const exitCode = await namedSession.session.close();\n const pilot = await getPilot();\n\n pilot.deleteSession(namedSession.session.id);\n forgetSession(namedSession.name, namedSession.session.id);\n\n return {\n exitCode,\n name: namedSession.name\n };\n },\n listSessions,\n\n async hasRetainedSessions(): Promise<boolean> {\n return nameToId.size > 0 || pendingNames.size > 0;\n },\n\n async close(): Promise<void> {\n if (pilotPromise === undefined) {\n return;\n }\n\n const pilot = await pilotPromise;\n await pilot.close();\n pilotPromise = undefined;\n nameToId.clear();\n idToName.clear();\n pendingNames.clear();\n }\n };\n}\n\nexport async function closeSharedTerminalPilotRuntime(): Promise<void> {\n if (sharedRuntime === undefined) {\n return;\n }\n\n await sharedRuntime.close();\n sharedRuntime = undefined;\n}\n", "import { defineCommand, S } from \"toolcraft\";\nimport { getTerminalPilotRuntime, type TerminalPilotCommandServices } from \"./runtime.js\";\n\nconst params = S.Object({\n session: S.Optional(\n S.String({ short: \"s\", description: \"Session name\", minLength: 1, pattern: \"\\\\S\" })\n )\n});\n\nexport const closeSession = defineCommand<\n TerminalPilotCommandServices,\n \"close-session\",\n typeof params,\n undefined,\n { exitCode: number },\n readonly [\"cli\", \"mcp\", \"sdk\"]\n>({\n name: \"close-session\",\n description: \"Close an active terminal session\",\n scope: [\"cli\", \"mcp\", \"sdk\"],\n params,\n handler: async ({ params, env, terminalPilotRuntime }) => {\n const { exitCode } = await getTerminalPilotRuntime(terminalPilotRuntime).closeSession(\n params.session,\n env\n );\n return { exitCode };\n }\n});\n"],
4
+ "sourcesContent": ["import { fileURLToPath } from \"node:url\";\nimport type { McpServerConfig } from \"@poe-code/agent-mcp-config\";\nimport type { AnySchema, ObjectSchema, Static } from \"toolcraft-schema\";\nimport type { LoggerOutput, RenderTableOptions, ThemePalette } from \"toolcraft-design\";\nimport { ApprovalDeclinedError } from \"./human-in-loop/types.js\";\nimport type {\n HumanInLoopConfig,\n HumanInLoopPending,\n HumanInLoopRuntimeOptions\n} from \"./human-in-loop/types.js\";\nimport { mergeHumanInLoopFromGroup, validateHumanInLoopOnDefine } from \"./human-in-loop/config.js\";\nimport { ToolcraftBugError, UserError } from \"./user-error.js\";\nimport { suggest } from \"./suggest.js\";\nimport type { RuntimeLogger } from \"./runtime-logging.js\";\nimport type { StreamStatusEvent, ToolcraftStream } from \"./stream.js\";\n\nexport { createManagedStream } from \"./stream.js\";\nexport type {\n StreamConsumerOptions,\n StreamStatusEvent,\n StreamStatusType,\n ToolcraftStream\n} from \"./stream.js\";\n\nconst commandConfigSymbol = Symbol(\"toolcraft.command.config\");\nconst groupConfigSymbol = Symbol(\"toolcraft.group.config\");\nconst commandSourcePathSymbol = Symbol(\"toolcraft.command.sourcePath\");\n\ntype ScopeValue = \"cli\" | \"mcp\" | \"sdk\";\ntype AnyObjectSchema = ObjectSchema<Record<string, never>>;\ntype EmptyServices = Record<string, never>;\ntype ScopeInput = readonly Scope[] | undefined;\ntype HumanInLoopMode = \"sync\" | \"async\";\ntype HumanInLoopModeInput = HumanInLoopMode | null | undefined;\n\nexport type Scope = ScopeValue;\n\ntype ResolveOwnHumanInLoopMode<TValue> = TValue extends {\n mode: infer TMode extends HumanInLoopMode;\n}\n ? TMode\n : TValue extends null\n ? null\n : undefined;\n\nexport interface SecretDefinition {\n env: string;\n description?: string;\n optional?: boolean;\n}\n\nexport type SecretDeclarations = Record<string, SecretDefinition>;\n\ntype OptionalSecretKeys<TSecrets extends SecretDeclarations> = {\n [TKey in keyof TSecrets]: TSecrets[TKey] extends { optional: true } ? TKey : never;\n}[keyof TSecrets];\n\ntype RequiredSecretKeys<TSecrets extends SecretDeclarations> = Exclude<\n keyof TSecrets,\n OptionalSecretKeys<TSecrets>\n>;\n\nexport type InferSecrets<TSecrets extends SecretDeclarations | undefined> =\n TSecrets extends SecretDeclarations\n ? { [TKey in RequiredSecretKeys<TSecrets>]: string } & {\n [TKey in OptionalSecretKeys<TSecrets>]?: string;\n }\n : Record<string, never>;\n\nexport interface HandlerFs {\n readFile(path: string, encoding?: BufferEncoding): Promise<string>;\n writeFile(\n path: string,\n contents: string,\n options?: { encoding?: BufferEncoding; flag?: string; mode?: number }\n ): Promise<void>;\n exists(path: string): Promise<boolean>;\n lstat(path: string): Promise<{ isSymbolicLink(): boolean }>;\n rename(fromPath: string, toPath: string): Promise<void>;\n unlink(path: string): Promise<void>;\n}\n\nexport interface HandlerEnv {\n get(key: string): string | undefined;\n}\n\nexport interface RenderPrimitives {\n logger: LoggerOutput;\n renderTable(options: RenderTableOptions): string;\n getTheme(): ThemePalette;\n note(message: string, title?: string): void;\n}\n\nexport interface CheckResult {\n ok: boolean;\n message?: string;\n}\n\nexport interface CommandExample {\n title: string;\n params: Record<string, unknown>;\n}\n\nexport type GroupCheckContext<TServices extends object = EmptyServices> = TServices & {\n params?: unknown;\n secrets?: Record<string, string | undefined>;\n fetch: typeof globalThis.fetch;\n fs: HandlerFs;\n env: HandlerEnv;\n diagnostics: RuntimeLogger;\n progress(message: string): void;\n};\n\nexport type CommandCheckContext<\n TParamsSchema extends ObjectSchema<any> = AnyObjectSchema,\n TSecrets extends SecretDeclarations | undefined = undefined,\n TServices extends object = EmptyServices\n> = TServices & {\n params?: Static<TParamsSchema>;\n secrets?: InferSecrets<TSecrets>;\n fetch: typeof globalThis.fetch;\n fs: HandlerFs;\n env: HandlerEnv;\n diagnostics: RuntimeLogger;\n progress(message: string): void;\n};\n\nexport interface Requires<TContext = unknown> {\n auth?: boolean;\n apiVersion?: string;\n check?: (ctx: TContext) => Promise<CheckResult>;\n}\n\nexport interface Renderers<TResult> {\n rich?: (result: TResult, primitives: RenderPrimitives) => void;\n markdown?: (result: TResult, primitives: RenderPrimitives) => string;\n json?: (result: TResult, primitives: RenderPrimitives) => unknown;\n}\n\nexport type HandlerContext<\n TParamsSchema extends ObjectSchema<any> = AnyObjectSchema,\n TSecrets extends SecretDeclarations | undefined = undefined,\n TServices extends object = EmptyServices\n> = TServices & {\n params: Static<TParamsSchema>;\n secrets: InferSecrets<TSecrets>;\n fetch: typeof globalThis.fetch;\n fs: HandlerFs;\n env: HandlerEnv;\n diagnostics: RuntimeLogger;\n progress(message: string): void;\n};\n\nexport interface CommandConfig<\n TServices extends object,\n TParamsSchema extends ObjectSchema<any>,\n TSecrets extends SecretDeclarations | undefined,\n TResult\n> {\n name: string;\n description?: string;\n hidden?: boolean;\n examples?: CommandExample[];\n aliases?: string[];\n positional?: string[];\n params: TParamsSchema;\n result?: ObjectSchema<any>;\n secrets?: TSecrets;\n scope?: Scope[];\n confirm?: boolean;\n humanInLoop?: HumanInLoopConfig<TParamsSchema> | null;\n requires?: Requires<CommandCheckContext<TParamsSchema, TSecrets, TServices>>;\n handler: (ctx: HandlerContext<TParamsSchema, TSecrets, TServices>) => Promise<TResult> | TResult;\n render?: Renderers<TResult>;\n}\n\nexport interface StreamDefinition<TEventSchema extends AnySchema = AnySchema> {\n event: TEventSchema;\n bufferSize: number;\n}\n\nexport type StreamHandlerContext<\n TParamsSchema extends ObjectSchema<any>,\n TSecrets extends SecretDeclarations | undefined,\n TServices extends object\n> = HandlerContext<TParamsSchema, TSecrets, TServices> & {\n signal: AbortSignal;\n status(event: StreamStatusEvent): void;\n refreshSecrets(): Promise<InferSecrets<TSecrets>>;\n};\n\nexport interface StreamCommandConfig<\n TServices extends object,\n TParamsSchema extends ObjectSchema<any>,\n TSecrets extends SecretDeclarations | undefined,\n TEventSchema extends AnySchema\n> extends Omit<\n CommandConfig<TServices, TParamsSchema, TSecrets, AsyncIterable<Static<TEventSchema>>>,\n \"handler\" | \"render\" | \"result\" | \"humanInLoop\" | \"confirm\"\n > {\n event: TEventSchema;\n handler: (\n ctx: StreamHandlerContext<TParamsSchema, TSecrets, TServices>\n ) => AsyncIterable<Static<TEventSchema>> | Promise<AsyncIterable<Static<TEventSchema>>>;\n render?: Renderers<Static<TEventSchema>>;\n}\n\nexport interface Command<\n TServices extends object = EmptyServices,\n TParamsSchema extends ObjectSchema<any> = AnyObjectSchema,\n TSecrets extends SecretDeclarations | undefined = undefined,\n TResult = unknown\n> {\n kind: \"command\";\n name: string;\n description?: string;\n hidden: boolean;\n examples: CommandExample[];\n aliases: string[];\n positional: string[];\n params: TParamsSchema;\n result?: ObjectSchema<any>;\n stream?: StreamDefinition<any>;\n secrets: SecretDeclarations;\n scope: Scope[];\n confirm: boolean;\n humanInLoop?: HumanInLoopConfig<TParamsSchema> | null;\n requires?: Requires<any>;\n handler: (ctx: HandlerContext<TParamsSchema, TSecrets, TServices>) => Promise<TResult> | TResult;\n render?: Renderers<TResult>;\n}\n\nexport interface GroupConfig<TServices extends object> {\n name: string;\n description?: string;\n aliases?: string[];\n mcp?: McpServerConfig;\n scope?: Scope[];\n humanInLoop?: HumanInLoopConfig<AnyObjectSchema> | null;\n secrets?: SecretDeclarations;\n tools?: string[];\n rename?: Record<string, string>;\n requires?: Requires<GroupCheckContext<TServices>>;\n children: Array<CommandNode<TServices>>;\n default?: Command<TServices, any, any, any>;\n}\n\nexport interface Group<TServices extends object = EmptyServices> {\n kind: \"group\";\n name: string;\n description?: string;\n aliases: string[];\n scope?: Scope[];\n humanInLoop?: HumanInLoopConfig<AnyObjectSchema> | null;\n secrets: SecretDeclarations;\n requires?: Requires<any>;\n children: Array<CommandNode<TServices>>;\n default?: Command<TServices, any, any, any>;\n}\n\nexport type CommandNode<TServices extends object = EmptyServices> =\n | Command<TServices, any, any, any>\n | Group<TServices>;\n\nexport interface CommandTypeInfo<\n TName extends string = string,\n TParamsSchema extends ObjectSchema<any> = AnyObjectSchema,\n TResult = unknown,\n TOwnScope extends ScopeInput = ScopeInput,\n TOwnHumanInLoopMode extends HumanInLoopModeInput = undefined\n> {\n name: TName;\n params: TParamsSchema;\n result: TResult;\n ownScope: TOwnScope;\n ownHumanInLoopMode: TOwnHumanInLoopMode;\n}\n\nexport interface GroupTypeInfo<\n TServices extends object = EmptyServices,\n TName extends string = string,\n TChildren extends readonly unknown[] = readonly CommandNode<TServices>[],\n TOwnScope extends ScopeInput = ScopeInput,\n TOwnHumanInLoopMode extends HumanInLoopModeInput = undefined\n> {\n name: TName;\n children: TChildren;\n ownScope: TOwnScope;\n ownHumanInLoopMode: TOwnHumanInLoopMode;\n}\n\ntype TypedCommandMetadata<\n TName extends string,\n TParamsSchema extends ObjectSchema<any>,\n TResult,\n TOwnScope extends ScopeInput,\n TOwnHumanInLoopMode extends HumanInLoopModeInput\n> = {\n readonly __agentKitCommandTypeInfo: CommandTypeInfo<\n TName,\n TParamsSchema,\n TResult,\n TOwnScope,\n TOwnHumanInLoopMode\n >;\n};\n\ntype TypedGroupMetadata<\n TServices extends object,\n TName extends string,\n TChildren extends readonly unknown[],\n TOwnScope extends ScopeInput,\n TOwnHumanInLoopMode extends HumanInLoopModeInput\n> = {\n readonly __agentKitGroupTypeInfo: GroupTypeInfo<\n TServices,\n TName,\n TChildren,\n TOwnScope,\n TOwnHumanInLoopMode\n >;\n};\n\ninterface InternalCommandConfig {\n scope?: Scope[];\n hidden: boolean;\n examples: CommandExample[];\n result?: ObjectSchema<any>;\n humanInLoop?: HumanInLoopConfig<ObjectSchema<any>> | null;\n secrets: SecretDeclarations;\n requires?: Requires<any>;\n sourcePath?: string;\n}\n\ninterface InternalGroupConfig<TServices extends object> {\n mcp?: McpServerConfig;\n scope?: Scope[];\n humanInLoop?: HumanInLoopConfig<AnyObjectSchema> | null;\n secrets: SecretDeclarations;\n tools?: string[];\n rename?: Record<string, string>;\n requires?: Requires<any>;\n children: Array<CommandNode<TServices>>;\n default?: Command<TServices, any, any, any>;\n}\n\ninterface InheritedMetadata {\n scope?: Scope[];\n humanInLoop?: HumanInLoopConfig<AnyObjectSchema> | null;\n secrets: SecretDeclarations;\n requires?: Requires<any>;\n}\n\nexport interface CommandRequirementOptions {\n apiVersion?: string;\n authEnvVar?: string;\n env?: Record<string, string | undefined>;\n}\n\nfunction cloneScope(scope: Scope[] | undefined): Scope[] | undefined {\n return scope === undefined ? undefined : [...scope];\n}\n\nfunction cloneSecretDefinition(secret: SecretDefinition): SecretDefinition {\n return {\n env: secret.env,\n description: secret.description,\n optional: secret.optional\n };\n}\n\nfunction cloneSecrets(secrets: SecretDeclarations | undefined): SecretDeclarations {\n if (secrets === undefined) {\n return {};\n }\n\n return Object.fromEntries(\n Object.entries(secrets).map(([key, secret]) => [key, cloneSecretDefinition(secret)])\n );\n}\n\nfunction cloneRequires<TContext>(\n requires: Requires<TContext> | undefined\n): Requires<TContext> | undefined {\n if (requires === undefined) {\n return undefined;\n }\n\n return {\n auth: requires.auth,\n apiVersion: requires.apiVersion,\n check: requires.check\n };\n}\n\nfunction cloneStringArray(values: string[] | undefined): string[] | undefined {\n return values === undefined ? undefined : [...values];\n}\n\nfunction cloneCommandExamples(examples: CommandExample[] | undefined): CommandExample[] {\n return (examples ?? []).map((example) => ({\n title: example.title,\n params: { ...example.params }\n }));\n}\n\nfunction cloneStringRecord(\n values: Record<string, string> | undefined\n): Record<string, string> | undefined {\n return values === undefined ? undefined : { ...values };\n}\n\nfunction cloneMcpServerConfig(config: McpServerConfig | undefined): McpServerConfig | undefined {\n if (config === undefined) {\n return undefined;\n }\n\n if (config.transport === \"stdio\") {\n return {\n transport: \"stdio\",\n command: config.command,\n args: cloneStringArray(config.args),\n env: cloneStringRecord(config.env)\n };\n }\n\n return {\n transport: \"http\",\n url: config.url,\n headers: cloneStringRecord(config.headers)\n };\n}\n\nfunction cloneRenameMap(\n rename: Record<string, string> | undefined\n): Record<string, string> | undefined {\n return rename === undefined ? undefined : { ...rename };\n}\n\nfunction validateRenameMap(rename: Record<string, string> | undefined): void {\n if (rename === undefined) {\n return;\n }\n\n const seenTargets = new Map<string, string>();\n\n for (const [upstreamName, targetPath] of Object.entries(rename)) {\n if (targetPath.length === 0) {\n throw new UserError(\n `Invalid rename target for upstream tool \"${upstreamName}\": path cannot be empty.`\n );\n }\n\n if (targetPath.split(\".\").some((segment) => segment.length === 0)) {\n throw new UserError(\n `Invalid rename target for upstream tool \"${upstreamName}\": \"${targetPath}\" contains an empty segment.`\n );\n }\n\n const existingUpstreamName = seenTargets.get(targetPath);\n if (existingUpstreamName !== undefined) {\n throw new UserError(\n `Duplicate rename target \"${targetPath}\" for upstream tools \"${existingUpstreamName}\" and \"${upstreamName}\".`\n );\n }\n\n seenTargets.set(targetPath, upstreamName);\n }\n}\n\nfunction parseStackPath(candidate: string): string | undefined {\n if (candidate.startsWith(\"file://\")) {\n try {\n return fileURLToPath(candidate);\n } catch {\n return undefined;\n }\n }\n\n if (candidate.startsWith(\"/\")) {\n return candidate;\n }\n\n return undefined;\n}\n\nfunction extractStackPath(line: string): string | undefined {\n const trimmed = line.trim();\n const fileIndex = trimmed.indexOf(\"file://\");\n\n if (fileIndex >= 0) {\n const location = trimmed.slice(fileIndex);\n const separatorIndex = location.lastIndexOf(\":\");\n const previousSeparatorIndex =\n separatorIndex >= 0 ? location.lastIndexOf(\":\", separatorIndex - 1) : -1;\n const candidate =\n separatorIndex >= 0 && previousSeparatorIndex >= 0\n ? location.slice(0, previousSeparatorIndex)\n : location;\n\n return parseStackPath(candidate);\n }\n\n const slashIndex = trimmed.indexOf(\"/\");\n if (slashIndex < 0) {\n return undefined;\n }\n\n const location = trimmed.slice(slashIndex);\n const separatorIndex = location.lastIndexOf(\":\");\n const previousSeparatorIndex =\n separatorIndex >= 0 ? location.lastIndexOf(\":\", separatorIndex - 1) : -1;\n const candidate =\n separatorIndex >= 0 && previousSeparatorIndex >= 0\n ? location.slice(0, previousSeparatorIndex)\n : location;\n\n return parseStackPath(candidate);\n}\n\nfunction inferCommandSourcePath(): string | undefined {\n const stack = new Error().stack;\n\n if (typeof stack !== \"string\") {\n return undefined;\n }\n\n for (const line of stack.split(\"\\n\").slice(1)) {\n const candidate = extractStackPath(line);\n\n if (candidate === undefined) {\n continue;\n }\n\n if (\n candidate.includes(\"/packages/toolcraft/src/index.ts\") ||\n candidate.includes(\"/packages/toolcraft/dist/index.js\") ||\n candidate.includes(\"/node_modules/toolcraft/dist/index.js\")\n ) {\n continue;\n }\n\n return candidate;\n }\n\n return undefined;\n}\n\nfunction composeChecks(\n parentCheck: Requires<any>[\"check\"] | undefined,\n childCheck: Requires<any>[\"check\"] | undefined\n): Requires<any>[\"check\"] | undefined {\n if (parentCheck === undefined) {\n return childCheck;\n }\n\n if (childCheck === undefined) {\n return parentCheck;\n }\n\n return async (ctx) => {\n const parentResult = await parentCheck(ctx);\n if (!parentResult.ok) {\n return parentResult;\n }\n\n return childCheck(ctx);\n };\n}\n\nfunction mergeRequires(\n parent: Requires<any> | undefined,\n child: Requires<any> | undefined\n): Requires<any> | undefined {\n if (parent === undefined && child === undefined) {\n return undefined;\n }\n\n const merged: Requires<any> = {\n auth: child?.auth ?? parent?.auth,\n apiVersion: child?.apiVersion ?? parent?.apiVersion,\n check: composeChecks(parent?.check, child?.check)\n };\n\n if (merged.auth === undefined && merged.apiVersion === undefined && merged.check === undefined) {\n return undefined;\n }\n\n return merged;\n}\n\nfunction parseSimpleSemver(value: string): [number, number, number] | undefined {\n const parts = value.split(\".\");\n if (parts.length !== 3) {\n return undefined;\n }\n\n const parsed = parts.map((part) => {\n if (part.length === 0) {\n return Number.NaN;\n }\n\n for (const char of part) {\n if (char < \"0\" || char > \"9\") {\n return Number.NaN;\n }\n }\n\n return Number(part);\n });\n\n if (parsed.some((part) => !Number.isInteger(part) || part < 0)) {\n return undefined;\n }\n\n return parsed as [number, number, number];\n}\n\nfunction parseMinimumApiVersion(requirement: string): [number, number, number] | undefined {\n if (!requirement.startsWith(\">=\")) {\n return undefined;\n }\n\n return parseSimpleSemver(requirement.slice(2).trim());\n}\n\nfunction compareSemver(left: [number, number, number], right: [number, number, number]): number {\n for (let index = 0; index < left.length; index += 1) {\n if (left[index] === right[index]) {\n continue;\n }\n\n return left[index]! > right[index]! ? 1 : -1;\n }\n\n return 0;\n}\n\nexport function resolveCommandSecrets(\n command: Command<any, any, any, any>,\n env: Record<string, string | undefined> = process.env\n): Record<string, string | undefined> {\n const secrets: Record<string, string | undefined> = {};\n\n for (const [name, secret] of Object.entries(command.secrets)) {\n const value = env[secret.env];\n\n if (value === undefined && secret.optional !== true) {\n const details = secret.description ? `\\n ${secret.description}` : \"\";\n const candidates = Object.keys(env).filter(\n (candidate) => candidate !== secret.env && env[candidate] !== undefined\n );\n const suggestions = suggestSecretEnv(secret.env, candidates);\n const suggestionLine =\n suggestions.length > 0 ? `\\nDid you mean: ${suggestions.join(\", \")}?` : \"\";\n throw new UserError(`Missing required secret ${secret.env}${details}${suggestionLine}`);\n }\n\n Object.defineProperty(secrets, name, {\n value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n }\n\n return secrets;\n}\n\nfunction suggestSecretEnv(input: string, candidates: readonly string[]): string[] {\n const directSuggestions = suggest(input, candidates);\n if (!input.includes(\"_\")) {\n return directSuggestions;\n }\n\n const inputParts = input.split(\"_\");\n const firstPart = inputParts[0];\n const lastPart = inputParts[inputParts.length - 1];\n const relatedCandidates = candidates.filter((candidate) => {\n const candidateParts = candidate.split(\"_\");\n return (\n candidateParts[0] === firstPart && candidateParts[candidateParts.length - 1] === lastPart\n );\n });\n const expandedSuggestions = suggest(input, relatedCandidates, {\n threshold: Math.max(4, Math.floor(input.length / 4))\n });\n\n return [...new Set([...directSuggestions, ...expandedSuggestions])].slice(0, 3);\n}\n\nexport async function assertCommandRequirements(\n command: Command<any, any, any, any>,\n context: GroupCheckContext<any>,\n options: CommandRequirementOptions = {}\n): Promise<void> {\n const requires = command.requires;\n if (requires === undefined) {\n return;\n }\n\n const env = options.env ?? process.env;\n const authEnvVar = options.authEnvVar ?? \"POE_API_KEY\";\n\n if (requires.auth === true && env[authEnvVar] === undefined) {\n throw new UserError(\n `Command \"${command.name}\" requires authentication.\\n Run 'poe-code login' first.`\n );\n }\n\n if (requires.apiVersion !== undefined) {\n const minimumVersion = parseMinimumApiVersion(requires.apiVersion);\n if (minimumVersion === undefined) {\n throw new UserError(\n `Command \"${command.name}\" has invalid apiVersion requirement \"${requires.apiVersion}\". Expected format \">=X.Y.Z\".`\n );\n }\n\n if (options.apiVersion === undefined) {\n throw new UserError(\n `Command \"${command.name}\" requires API version ${requires.apiVersion}, but no runner API version was provided.`\n );\n }\n\n const runnerVersion = parseSimpleSemver(options.apiVersion);\n if (runnerVersion === undefined) {\n throw new UserError(\n `Command \"${command.name}\" requires API version ${requires.apiVersion}, but runner API version \"${options.apiVersion}\" is not valid semver.`\n );\n }\n\n if (compareSemver(runnerVersion, minimumVersion) < 0) {\n throw new UserError(\n `Command \"${command.name}\" requires API version ${requires.apiVersion}, but runner API version is ${options.apiVersion}.`\n );\n }\n }\n\n const checkResult = await requires.check?.(context);\n if (checkResult && !checkResult.ok) {\n throw new UserError(checkResult.message ?? \"Command precondition failed.\");\n }\n}\n\nfunction mergeSecrets(parent: SecretDeclarations, child: SecretDeclarations): SecretDeclarations {\n return cloneSecrets({\n ...parent,\n ...child\n });\n}\n\nfunction resolveCommandScope(\n ownScope: Scope[] | undefined,\n inheritedScope: Scope[] | undefined\n): Scope[] {\n return cloneScope(ownScope ?? inheritedScope) ?? [\"cli\", \"sdk\"];\n}\n\nfunction resolveGroupScope(\n ownScope: Scope[] | undefined,\n inheritedScope: Scope[] | undefined\n): Scope[] | undefined {\n return cloneScope(ownScope ?? inheritedScope);\n}\n\nfunction createBaseCommand<\n TServices extends object,\n TParamsSchema extends ObjectSchema<any>,\n TSecrets extends SecretDeclarations | undefined,\n TResult\n>(\n config: CommandConfig<TServices, TParamsSchema, TSecrets, TResult>\n): Command<TServices, TParamsSchema, TSecrets, TResult> {\n const command: Command<TServices, TParamsSchema, TSecrets, TResult> = {\n kind: \"command\",\n name: config.name,\n description: config.description,\n hidden: config.hidden ?? false,\n examples: cloneCommandExamples(config.examples),\n aliases: [...(config.aliases ?? [])],\n positional: [...(config.positional ?? [])],\n params: config.params,\n result: config.result,\n stream: undefined,\n secrets: cloneSecrets(config.secrets),\n scope: resolveCommandScope(config.scope, undefined),\n confirm: config.confirm ?? false,\n humanInLoop: config.humanInLoop,\n requires: cloneRequires(config.requires),\n handler: config.handler,\n render: config.render\n };\n\n Object.defineProperty(command, commandConfigSymbol, {\n value: {\n scope: cloneScope(config.scope),\n hidden: config.hidden ?? false,\n examples: cloneCommandExamples(config.examples),\n result: config.result,\n humanInLoop: config.humanInLoop,\n secrets: cloneSecrets(config.secrets),\n requires: cloneRequires(config.requires),\n sourcePath: inferCommandSourcePath()\n } satisfies InternalCommandConfig\n });\n\n return command;\n}\n\nfunction createBaseGroup<TServices extends object>(\n config: GroupConfig<TServices>\n): Group<TServices> {\n const group: Group<TServices> = {\n kind: \"group\",\n name: config.name,\n description: config.description,\n aliases: [...(config.aliases ?? [])],\n scope: resolveGroupScope(config.scope, undefined),\n humanInLoop: config.humanInLoop,\n secrets: cloneSecrets(config.secrets),\n requires: cloneRequires(config.requires),\n children: [],\n default: undefined\n };\n\n Object.defineProperty(group, groupConfigSymbol, {\n value: {\n mcp: cloneMcpServerConfig(config.mcp),\n scope: cloneScope(config.scope),\n humanInLoop: config.humanInLoop,\n secrets: cloneSecrets(config.secrets),\n tools: cloneStringArray(config.tools),\n rename: cloneRenameMap(config.rename),\n requires: cloneRequires(config.requires),\n children: [...config.children],\n default: config.default\n } satisfies InternalGroupConfig<TServices>\n });\n\n return group;\n}\n\nfunction getInternalCommandConfig(command: Command<any, any, any, any>): InternalCommandConfig {\n return (\n command as Command<any, any, any, any> & { [commandConfigSymbol]: InternalCommandConfig }\n )[commandConfigSymbol];\n}\n\nfunction getInternalGroupConfig<TServices extends object>(\n group: Group<TServices>\n): InternalGroupConfig<TServices> {\n return (group as Group<TServices> & { [groupConfigSymbol]: InternalGroupConfig<TServices> })[\n groupConfigSymbol\n ];\n}\n\nfunction materializeCommand<\n TServices extends object,\n TParamsSchema extends ObjectSchema<any>,\n TSecrets extends SecretDeclarations | undefined,\n TResult\n>(\n command: Command<TServices, TParamsSchema, TSecrets, TResult>,\n inherited: InheritedMetadata\n): Command<TServices, TParamsSchema, TSecrets, TResult> {\n const internal = getInternalCommandConfig(command);\n\n const materialized: Command<TServices, TParamsSchema, TSecrets, TResult> = {\n kind: \"command\",\n name: command.name,\n description: command.description,\n hidden: internal.hidden,\n examples: cloneCommandExamples(internal.examples),\n aliases: [...command.aliases],\n positional: [...command.positional],\n params: command.params,\n result: internal.result,\n stream: command.stream,\n secrets: mergeSecrets(inherited.secrets, internal.secrets),\n scope: resolveCommandScope(internal.scope, inherited.scope),\n confirm: command.confirm,\n humanInLoop: mergeHumanInLoopFromGroup(inherited.humanInLoop, internal.humanInLoop),\n requires: mergeRequires(inherited.requires, internal.requires),\n handler: command.handler,\n render: command.render\n };\n\n Object.defineProperty(materialized, commandConfigSymbol, {\n value: {\n scope: cloneScope(internal.scope),\n hidden: internal.hidden,\n examples: cloneCommandExamples(internal.examples),\n result: internal.result,\n humanInLoop: internal.humanInLoop,\n secrets: cloneSecrets(internal.secrets),\n requires: cloneRequires(internal.requires),\n sourcePath: internal.sourcePath\n } satisfies InternalCommandConfig\n });\n\n Object.defineProperty(materialized, commandSourcePathSymbol, {\n value: internal.sourcePath\n });\n\n return materialized;\n}\n\nfunction mergeInheritedMetadata<TServices extends object>(\n group: InternalGroupConfig<TServices>,\n inherited: InheritedMetadata\n): InheritedMetadata {\n return {\n scope: resolveGroupScope(group.scope, inherited.scope),\n humanInLoop: mergeHumanInLoopFromGroup(inherited.humanInLoop, group.humanInLoop),\n secrets: mergeSecrets(inherited.secrets, group.secrets),\n requires: mergeRequires(inherited.requires, group.requires)\n };\n}\n\nfunction materializeGroup<TServices extends object>(\n group: Group<TServices>,\n inherited: InheritedMetadata\n): Group<TServices> {\n const internal = getInternalGroupConfig(group);\n const mergedInherited = mergeInheritedMetadata(internal, inherited);\n const materializedChildren = internal.children.map((child) =>\n materializeNode(child, mergedInherited)\n );\n\n let defaultChild: Command<TServices, any, any, any> | undefined;\n\n if (internal.default !== undefined) {\n const defaultIndex = internal.children.indexOf(internal.default);\n\n if (defaultIndex === -1) {\n throw new ToolcraftBugError(\n `Default command \"${internal.default.name}\" must be listed in children.`\n );\n }\n\n const resolvedDefault = materializedChildren[defaultIndex];\n if (resolvedDefault?.kind !== \"command\") {\n throw new ToolcraftBugError(`Default child \"${internal.default.name}\" must be a command.`);\n }\n\n defaultChild = resolvedDefault;\n }\n\n const materialized: Group<TServices> = {\n kind: \"group\",\n name: group.name,\n description: group.description,\n aliases: [...group.aliases],\n scope: mergedInherited.scope,\n humanInLoop: mergedInherited.humanInLoop,\n secrets: mergedInherited.secrets,\n requires: mergedInherited.requires,\n children: materializedChildren,\n default: defaultChild\n };\n\n Object.defineProperty(materialized, groupConfigSymbol, {\n value: {\n mcp: cloneMcpServerConfig(internal.mcp),\n scope: cloneScope(internal.scope),\n humanInLoop: internal.humanInLoop,\n secrets: cloneSecrets(internal.secrets),\n tools: cloneStringArray(internal.tools),\n rename: cloneRenameMap(internal.rename),\n requires: cloneRequires(internal.requires),\n children: [...internal.children],\n default: internal.default\n } satisfies InternalGroupConfig<TServices>\n });\n\n return materialized;\n}\n\nfunction materializeNode<TServices extends object>(\n node: CommandNode<TServices>,\n inherited: InheritedMetadata\n): CommandNode<TServices> {\n if (node.kind === \"command\") {\n return materializeCommand(node, inherited);\n }\n\n return materializeGroup(node, inherited);\n}\n\nexport function defineCommand<\n TServices extends object = EmptyServices,\n TName extends string = string,\n TParamsSchema extends ObjectSchema<any> = AnyObjectSchema,\n TSecrets extends SecretDeclarations | undefined = undefined,\n TResult = unknown,\n TOwnScope extends ScopeInput = undefined,\n TOwnHumanInLoop extends HumanInLoopConfig<TParamsSchema> | null | undefined = undefined\n>(\n config: Omit<\n CommandConfig<TServices, TParamsSchema, TSecrets, TResult>,\n \"name\" | \"scope\" | \"humanInLoop\"\n > & {\n name: TName;\n scope?: TOwnScope;\n humanInLoop?: TOwnHumanInLoop;\n }\n): Command<TServices, TParamsSchema, TSecrets, TResult> &\n TypedCommandMetadata<\n TName,\n TParamsSchema,\n TResult,\n TOwnScope,\n ResolveOwnHumanInLoopMode<TOwnHumanInLoop>\n > {\n validateHumanInLoopOnDefine(config);\n\n return materializeCommand(\n createBaseCommand(config as CommandConfig<TServices, TParamsSchema, TSecrets, TResult>),\n {\n scope: undefined,\n humanInLoop: undefined,\n secrets: {},\n requires: undefined\n }\n ) as Command<TServices, TParamsSchema, TSecrets, TResult> &\n TypedCommandMetadata<\n TName,\n TParamsSchema,\n TResult,\n TOwnScope,\n ResolveOwnHumanInLoopMode<TOwnHumanInLoop>\n >;\n}\n\nexport function defineStreamCommand<\n TServices extends object = EmptyServices,\n TName extends string = string,\n TParamsSchema extends ObjectSchema<any> = AnyObjectSchema,\n TSecrets extends SecretDeclarations | undefined = undefined,\n TEventSchema extends AnySchema = AnySchema,\n TOwnScope extends ScopeInput = undefined\n>(\n config: Omit<\n StreamCommandConfig<TServices, TParamsSchema, TSecrets, TEventSchema>,\n \"name\" | \"scope\"\n > & {\n name: TName;\n scope?: TOwnScope;\n }\n): Command<TServices, TParamsSchema, TSecrets, AsyncIterable<Static<TEventSchema>>> &\n TypedCommandMetadata<\n TName,\n TParamsSchema,\n ToolcraftStream<Static<TEventSchema>>,\n TOwnScope,\n undefined\n > {\n const command = defineCommand({\n ...config,\n confirm: false,\n humanInLoop: null,\n handler: config.handler as never,\n render: undefined\n } as never) as Command<\n TServices,\n TParamsSchema,\n TSecrets,\n AsyncIterable<Static<TEventSchema>>\n >;\n command.stream = {\n event: config.event,\n bufferSize: 1\n };\n command.render = config.render as never;\n return command as never;\n}\n\nexport function defineGroup<\n TServices extends object = EmptyServices,\n TName extends string = string,\n TChildren extends readonly unknown[] = readonly CommandNode<TServices>[],\n TOwnScope extends ScopeInput = undefined,\n TOwnHumanInLoop extends HumanInLoopConfig<AnyObjectSchema> | null | undefined = undefined\n>(\n config: Omit<GroupConfig<TServices>, \"name\" | \"children\" | \"scope\" | \"humanInLoop\"> & {\n name: TName;\n children: TChildren & readonly CommandNode<TServices>[];\n scope?: TOwnScope;\n humanInLoop?: TOwnHumanInLoop;\n }\n): Group<TServices> &\n TypedGroupMetadata<\n TServices,\n TName,\n TChildren,\n TOwnScope,\n ResolveOwnHumanInLoopMode<TOwnHumanInLoop>\n > {\n validateRenameMap(config.rename);\n validateHumanInLoopOnDefine(config);\n\n return materializeGroup(createBaseGroup(config as unknown as GroupConfig<TServices>), {\n scope: undefined,\n humanInLoop: undefined,\n secrets: {},\n requires: undefined\n }) as Group<TServices> &\n TypedGroupMetadata<\n TServices,\n TName,\n TChildren,\n TOwnScope,\n ResolveOwnHumanInLoopMode<TOwnHumanInLoop>\n >;\n}\n\nexport function getCommandSourcePath(command: Command<any, any, any, any>): string | undefined {\n return (command as Command<any, any, any, any> & { [commandSourcePathSymbol]?: string })[\n commandSourcePathSymbol\n ];\n}\n\nexport function hasMcpProxyConfig(group: Group<any>): boolean {\n const configSymbol = Object.getOwnPropertySymbols(group).find(\n (candidate) => candidate.description === groupConfigSymbol.description\n );\n const config =\n configSymbol === undefined\n ? undefined\n : (group as unknown as Record<PropertyKey, InternalGroupConfig<any>>)[configSymbol];\n if (config?.mcp !== undefined) {\n return true;\n }\n\n const children = config?.children ?? group.children;\n return children.some(\n (child) => child.kind === \"group\" && hasMcpProxyConfig(child)\n );\n}\n\nexport { S, toJsonSchema } from \"./schema.js\";\nexport {\n AuthenticationError,\n BadRequestError,\n ClientError,\n ConflictError,\n HttpError,\n InternalServerError,\n NotFoundError,\n PermissionDeniedError,\n RateLimitError,\n ServerError,\n ServiceUnavailableError,\n UnprocessableEntityError,\n createHttpError\n} from \"./http-errors.js\";\nexport type { HttpErrorRequest, HttpErrorResponse } from \"./http-errors.js\";\nexport { ApprovalDeclinedError, ToolcraftBugError, UserError };\nexport { createRuntimeLogger, isLogLevel, shouldEmitDiagnostic } from \"./runtime-logging.js\";\nexport { findPackageMetadata, packageMetadata } from \"./package-metadata.js\";\nexport type { PackageMetadata } from \"./package-metadata.js\";\nexport type {\n FileChangeRendererOptions,\n FileChangeResult\n} from \"./file-change-renderer.js\";\nexport type { FileChange, FileChangeDisplayMode, FileChangeKind } from \"toolcraft-design\";\nexport type {\n DiagnosticLogEvent,\n LogLevel,\n RuntimeLogger,\n RuntimeLoggerInput\n} from \"./runtime-logging.js\";\nexport type {\n AnySchema,\n ArraySchema,\n BooleanSchema,\n CliMissingParameterChoice,\n CliMissingParameterContext,\n CliMissingParameterResolution,\n CliOutputMode,\n CliSchemaOptions,\n EnumSchema,\n JsonSchema,\n JsonSchemaDocument,\n JsonSchemaDocumentOptions,\n JsonValue,\n JsonValueSchema,\n NumberSchema,\n ObjectSchema,\n OneOfSchema,\n OptionalSchema,\n RecordSchema,\n SchemaBase,\n Static,\n StringSchema,\n UnionSchema,\n ValidationIssue,\n ValidationResult\n} from \"./schema.js\";\nexport type { HumanInLoopConfig, HumanInLoopPending, HumanInLoopRuntimeOptions };\n", "export class UserError extends Error {\n constructor(message: string, options?: ErrorOptions) {\n super(message, options);\n this.name = \"UserError\";\n }\n}\n\nexport class ToolcraftBugError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"ToolcraftBugError\";\n }\n}\n", "import type { ObjectSchema } from \"toolcraft-schema\";\nimport type { HumanInLoopConfig } from \"./types.js\";\n\ntype HumanInLoopValue<TParamsSchema extends ObjectSchema<any>> =\n | HumanInLoopConfig<TParamsSchema>\n | null\n | undefined;\n\nexport function validateHumanInLoopOnDefine<TParamsSchema extends ObjectSchema<any>>(config: {\n name: string;\n confirm?: boolean;\n children?: readonly unknown[];\n humanInLoop?: HumanInLoopValue<TParamsSchema>;\n}): void {\n const label = Array.isArray(config.children) ? \"group\" : \"command\";\n\n if (config.confirm === true && config.humanInLoop !== undefined && config.humanInLoop !== null) {\n throw new Error(`${label} '${config.name}': use either confirm or humanInLoop, not both`);\n }\n\n if (config.humanInLoop === undefined || config.humanInLoop === null) {\n return;\n }\n\n if (config.humanInLoop.mode !== \"sync\" && config.humanInLoop.mode !== \"async\") {\n throw new Error(`${label} '${config.name}': humanInLoop.mode must be \"sync\" or \"async\"`);\n }\n\n if (typeof config.humanInLoop.message !== \"function\") {\n throw new Error(`${label} '${config.name}': humanInLoop.message must be a function`);\n }\n\n if (config.humanInLoop.plan !== undefined && typeof config.humanInLoop.plan !== \"function\") {\n throw new Error(`${label} '${config.name}': humanInLoop.plan must be a function`);\n }\n}\n\nexport function mergeHumanInLoopFromGroup<\n TGroupParamsSchema extends ObjectSchema<any>,\n TChildParamsSchema extends ObjectSchema<any>,\n>(\n groupHumanInLoop: HumanInLoopValue<TGroupParamsSchema>,\n childHumanInLoop: HumanInLoopValue<TChildParamsSchema>\n): HumanInLoopValue<TChildParamsSchema> {\n if (childHumanInLoop !== undefined) {\n return childHumanInLoop;\n }\n\n return groupHumanInLoop as HumanInLoopValue<TChildParamsSchema>;\n}\n", "import type { SchemaBase } from \"./index.js\";\n\ntype JsonPrimitive = string | number | boolean | null;\n\nexport type JsonValue = JsonPrimitive | { [key: string]: JsonValue } | JsonValue[];\n\nexport interface JsonValueSchema extends SchemaBase<\"json\", JsonValue> {\n readonly kind: \"json\";\n}\n\nexport function Json(): JsonValueSchema {\n return {\n kind: \"json\",\n };\n}\n", "import type { ObjectSchema, SchemaBase, Static } from \"./index.js\";\n\ntype OneOfStatic<\n TBranches extends Record<string, ObjectSchema<any>>,\n TDiscriminator extends string,\n> = {\n [TBranchName in keyof TBranches & string]: Omit<Static<TBranches[TBranchName]>, TDiscriminator> & {\n [TFieldName in TDiscriminator]: TBranchName;\n };\n}[keyof TBranches & string];\n\nexport interface OneOfSchema<\n TBranches extends Record<string, ObjectSchema<any>>,\n TDiscriminator extends string = string,\n> extends SchemaBase<\"oneOf\", OneOfStatic<TBranches, TDiscriminator>> {\n readonly discriminator: TDiscriminator;\n readonly branches: TBranches;\n}\n\nfunction assertValidBranches(\n branches: Record<string, ObjectSchema<any>>,\n discriminator: string\n): void {\n if (Object.keys(branches).length === 0) {\n throw new Error(\"OneOf schema requires at least one branch\");\n }\n\n for (const [branchName, branch] of Object.entries(branches)) {\n if (Object.prototype.hasOwnProperty.call(branch.shape, discriminator)) {\n throw new Error(\n `OneOf branch \"${branchName}\" must not declare discriminator field \"${discriminator}\".`\n );\n }\n }\n}\n\nexport function OneOf<\n TDiscriminator extends string,\n TBranches extends Record<string, ObjectSchema<any>>,\n>(config: {\n discriminator: TDiscriminator;\n branches: TBranches;\n}): OneOfSchema<TBranches, TDiscriminator> {\n assertValidBranches(config.branches, config.discriminator);\n\n return {\n kind: \"oneOf\",\n discriminator: config.discriminator,\n branches: config.branches,\n };\n}\n", "import type { AnySchema, SchemaBase, Static } from \"./index.js\";\n\nexport interface RecordSchema<TValue extends AnySchema>\n extends SchemaBase<\"record\", Record<string, Static<TValue>>> {\n readonly value: TValue;\n}\n\nexport function Record<TValue extends AnySchema>(value: TValue): RecordSchema<TValue> {\n return {\n kind: \"record\",\n value,\n };\n}\n", "import type { AnySchema, ObjectSchema, OptionalSchema, SchemaBase, Static } from \"./index.js\";\n\ntype UnionStatic<TBranches extends readonly ObjectSchema<any>[]> = Static<TBranches[number]>;\n\nexport interface UnionSchema<TBranches extends readonly ObjectSchema<any>[]>\n extends SchemaBase<\"union\", UnionStatic<TBranches>> {\n readonly branches: TBranches;\n}\n\nfunction isOptionalSchema(schema: AnySchema): schema is OptionalSchema<AnySchema> {\n return schema.kind === \"optional\";\n}\n\nfunction getRequiredKeys(schema: ObjectSchema<any>): string[] {\n return Object.keys(schema.shape)\n .filter((key) => !isOptionalSchema(schema.shape[key] as AnySchema))\n .sort();\n}\n\nexport function getRequiredKeyFingerprint(schema: ObjectSchema<any>): string {\n return getRequiredKeys(schema).join(\"+\");\n}\n\nfunction assertUniqueRequiredKeyFingerprints(branches: readonly ObjectSchema<any>[]): void {\n const fingerprints = new Map<string, { display: string; indices: number[] }>();\n\n branches.forEach((branch, index) => {\n const requiredKeys = getRequiredKeys(branch);\n const fingerprint = JSON.stringify(requiredKeys);\n const existing = fingerprints.get(fingerprint);\n\n if (existing === undefined) {\n fingerprints.set(fingerprint, {\n display: requiredKeys.join(\"+\"),\n indices: [index],\n });\n return;\n }\n\n existing.indices.push(index);\n });\n\n for (const { display, indices } of fingerprints.values()) {\n if (indices.length > 1) {\n throw new Error(\n `Union branches [${indices.join(\", \")}] share required-key fingerprint \"${display}\". Each branch must require a distinct set of keys.`\n );\n }\n }\n}\n\nfunction assertValidBranches(branches: readonly ObjectSchema<any>[]): void {\n if (branches.length === 0) {\n throw new Error(\"Union schema requires at least one branch\");\n }\n\n assertUniqueRequiredKeyFingerprints(branches);\n}\n\nexport function Union<const TBranches extends readonly ObjectSchema<any>[]>(\n branches: TBranches\n): UnionSchema<TBranches> {\n assertValidBranches(branches);\n\n return {\n kind: \"union\",\n branches,\n };\n}\n", "import type { AnySchema, ObjectSchema, OptionalSchema, Static } from \"./index.js\";\nimport { getRequiredKeyFingerprint } from \"./union.js\";\n\nexport type SchemaDescriptor = AnySchema;\n\nexport type ValidationIssue = {\n path: readonly string[];\n expected: string;\n received: string;\n message: string;\n};\n\nexport type ValidationResult<T> =\n | { ok: true; value: T }\n | { ok: false; issues: readonly ValidationIssue[] };\n\ntype ValidationState = {\n issues: ValidationIssue[];\n};\n\ntype WalkResult = { present: true; value: unknown } | { present: false };\n\nconst missingValue = Symbol(\"missingValue\");\n\nexport function validate<S extends SchemaDescriptor>(\n schema: S,\n value: unknown\n): ValidationResult<Static<S>> {\n const state: ValidationState = { issues: [] };\n const result = walkSchema(schema, value, [], state);\n\n if (state.issues.length > 0) {\n return { ok: false, issues: state.issues };\n }\n\n return { ok: true, value: (result.present ? result.value : undefined) as Static<S> };\n}\n\nfunction walkSchema(\n schema: AnySchema,\n value: unknown | typeof missingValue,\n path: readonly string[],\n state: ValidationState\n): WalkResult {\n if (schema.kind === \"optional\") {\n return walkOptional(schema, value, path, state);\n }\n\n if (value === missingValue) {\n addIssue(\n state,\n path,\n expectedFor(schema),\n \"missing\",\n `Expected ${expectedFor(schema)} at ${formatPath(path)}`\n );\n return { present: false };\n }\n\n if (value === null && schema.nullable === true) {\n return { present: true, value };\n }\n\n switch (schema.kind) {\n case \"string\":\n return walkString(schema, value, path, state);\n\n case \"number\":\n return walkNumber(schema, value, path, state);\n\n case \"boolean\":\n return walkBoolean(value, path, state);\n\n case \"enum\":\n return walkEnum(schema, value, path, state);\n\n case \"array\":\n return walkArray(schema, value, path, state);\n\n case \"object\":\n return walkObject(schema, value, path, state);\n\n case \"oneOf\":\n return walkOneOf(schema, value, path, state);\n\n case \"union\":\n return walkUnion(schema, value, path, state);\n\n case \"record\":\n return walkRecord(schema, value, path, state);\n\n case \"json\":\n return walkJson(value, path, state);\n }\n}\n\nfunction walkOptional(\n schema: OptionalSchema<AnySchema>,\n value: unknown | typeof missingValue,\n path: readonly string[],\n state: ValidationState\n): WalkResult {\n if (value === missingValue || value === undefined) {\n const defaultValue = getDefault(schema.inner);\n\n if (defaultValue.present) {\n return walkSchema(schema.inner, cloneDefault(defaultValue.value), path, state);\n }\n\n return { present: false };\n }\n\n return walkSchema(schema.inner, value, path, state);\n}\n\nfunction walkString(\n schema: Extract<AnySchema, { kind: \"string\" }>,\n value: unknown,\n path: readonly string[],\n state: ValidationState\n): WalkResult {\n if (typeof value !== \"string\") {\n addExpectedIssue(state, path, \"string\", value);\n return { present: true, value };\n }\n\n if (schema.minLength !== undefined && value.length < schema.minLength) {\n const expected = `string with length at least ${schema.minLength}`;\n addIssue(\n state,\n path,\n expected,\n `string with length ${value.length}`,\n `Expected ${expected} at ${formatPath(path)}`\n );\n }\n\n if (schema.maxLength !== undefined && value.length > schema.maxLength) {\n const expected = `string with length at most ${schema.maxLength}`;\n addIssue(\n state,\n path,\n expected,\n `string with length ${value.length}`,\n `Expected ${expected} at ${formatPath(path)}`\n );\n }\n\n if (schema.pattern !== undefined) {\n const pattern = compilePattern(schema.pattern);\n\n if (pattern === undefined || !pattern.test(value)) {\n const expected = `string matching pattern ${schema.pattern}`;\n addIssue(state, path, expected, value, `Expected ${expected} at ${formatPath(path)}`);\n }\n }\n\n return { present: true, value };\n}\n\nfunction walkNumber(\n schema: Extract<AnySchema, { kind: \"number\" }>,\n value: unknown,\n path: readonly string[],\n state: ValidationState\n): WalkResult {\n if (typeof value !== \"number\" || !Number.isFinite(value)) {\n addExpectedIssue(state, path, schema.jsonType === \"integer\" ? \"integer\" : \"number\", value);\n return { present: true, value };\n }\n\n if (schema.jsonType === \"integer\" && !Number.isInteger(value)) {\n addExpectedIssue(state, path, \"integer\", value);\n }\n\n if (schema.minimum !== undefined && value < schema.minimum) {\n const expected = `number greater than or equal to ${schema.minimum}`;\n addIssue(state, path, expected, String(value), `Expected ${expected} at ${formatPath(path)}`);\n }\n\n if (schema.maximum !== undefined && value > schema.maximum) {\n const expected = `number less than or equal to ${schema.maximum}`;\n addIssue(state, path, expected, String(value), `Expected ${expected} at ${formatPath(path)}`);\n }\n\n return { present: true, value };\n}\n\nfunction walkBoolean(value: unknown, path: readonly string[], state: ValidationState): WalkResult {\n if (typeof value !== \"boolean\") {\n addExpectedIssue(state, path, \"boolean\", value);\n }\n\n return { present: true, value };\n}\n\nfunction walkEnum(\n schema: Extract<AnySchema, { kind: \"enum\" }>,\n value: unknown,\n path: readonly string[],\n state: ValidationState\n): WalkResult {\n if (!schema.values.includes(value as never)) {\n const expected = `one of ${schema.values.join(\", \")}`;\n addIssue(\n state,\n path,\n expected,\n receivedValue(value),\n `Expected ${expected} at ${formatPath(path)}`\n );\n }\n\n return { present: true, value };\n}\n\nfunction walkArray(\n schema: Extract<AnySchema, { kind: \"array\" }>,\n value: unknown,\n path: readonly string[],\n state: ValidationState\n): WalkResult {\n if (!Array.isArray(value)) {\n addExpectedIssue(state, path, \"array\", value);\n return { present: true, value };\n }\n\n if (schema.minItems !== undefined && value.length < schema.minItems) {\n const expected = `array with at least ${schema.minItems} items`;\n addIssue(\n state,\n path,\n expected,\n `array with ${value.length} items`,\n `Expected ${expected} at ${formatPath(path)}`\n );\n }\n\n if (schema.maxItems !== undefined && value.length > schema.maxItems) {\n const expected = `array with at most ${schema.maxItems} items`;\n addIssue(\n state,\n path,\n expected,\n `array with ${value.length} items`,\n `Expected ${expected} at ${formatPath(path)}`\n );\n }\n\n const nextValue = value.map((item, index) => {\n const result = walkSchema(schema.item, item, [...path, String(index)], state);\n\n return result.present ? result.value : item;\n });\n\n return { present: true, value: nextValue };\n}\n\nfunction walkObject(\n schema: ObjectSchema<any>,\n value: unknown,\n path: readonly string[],\n state: ValidationState,\n injectedProperties: Record<string, unknown> = {}\n): WalkResult {\n if (!isPlainRecord(value)) {\n addExpectedIssue(state, path, \"object\", value);\n return { present: true, value };\n }\n\n const nextValue: Record<string, unknown> = {};\n const allowedKeys = new Set([...Object.keys(schema.shape), ...Object.keys(injectedProperties)]);\n\n for (const [key, propertySchema] of Object.entries(schema.shape) as Array<[string, AnySchema]>) {\n const propertyValue = Object.hasOwn(value, key) ? value[key] : missingValue;\n const result = walkSchema(propertySchema, propertyValue, [...path, key], state);\n\n if (result.present) {\n setOwnValue(nextValue, key, result.value);\n }\n }\n\n for (const [key, injectedValue] of Object.entries(injectedProperties)) {\n if (Object.hasOwn(value, key)) {\n setOwnValue(nextValue, key, value[key]);\n } else {\n setOwnValue(nextValue, key, injectedValue);\n }\n }\n\n for (const [key, propertyValue] of Object.entries(value)) {\n if (allowedKeys.has(key)) {\n continue;\n }\n\n if (schema.additionalProperties === true) {\n setOwnValue(nextValue, key, propertyValue);\n } else {\n addUnexpectedPropertyIssue(state, [...path, key]);\n }\n }\n\n return { present: true, value: nextValue };\n}\n\nfunction walkOneOf(\n schema: Extract<AnySchema, { kind: \"oneOf\" }>,\n value: unknown,\n path: readonly string[],\n state: ValidationState\n): WalkResult {\n if (!isPlainRecord(value)) {\n addExpectedIssue(state, path, \"object\", value);\n return { present: true, value };\n }\n\n const discriminatorValue = value[schema.discriminator];\n const discriminatorPath = [...path, schema.discriminator];\n const branchValues = Object.keys(schema.branches);\n const expected = `one of ${branchValues.join(\", \")}`;\n\n if (!Object.hasOwn(value, schema.discriminator)) {\n addIssueWithMessage(\n state,\n discriminatorPath,\n expected,\n \"missing\",\n `Missing discriminator \"${schema.discriminator}\" at ${formatPath(path)}. Expected one of: ${branchValues.join(\", \")}.`\n );\n return { present: true, value };\n }\n\n if (\n typeof discriminatorValue !== \"string\" ||\n !Object.hasOwn(schema.branches, discriminatorValue)\n ) {\n addIssueWithMessage(\n state,\n discriminatorPath,\n expected,\n receivedValue(discriminatorValue),\n `Expected ${expected} at ${formatPath(discriminatorPath)}, got ${formatReceivedDiscriminator(discriminatorValue)}`\n );\n return { present: true, value };\n }\n\n return walkObject(schema.branches[discriminatorValue], value, path, state, {\n [schema.discriminator]: discriminatorValue\n });\n}\n\nfunction walkUnion(\n schema: Extract<AnySchema, { kind: \"union\" }>,\n value: unknown,\n path: readonly string[],\n state: ValidationState\n): WalkResult {\n if (isPlainRecord(value)) {\n const candidateBranches = schema.branches.filter((branch) => hasRequiredKeys(branch, value));\n\n if (candidateBranches.length === 1) {\n return walkObject(candidateBranches[0], value, path, state);\n }\n }\n\n const matches: Array<{ fingerprint: string; value: unknown }> = [];\n\n for (const branch of schema.branches) {\n const branchState: ValidationState = { issues: [] };\n const result = walkObject(branch, value, path, branchState);\n\n if (branchState.issues.length === 0 && result.present) {\n matches.push({ fingerprint: getRequiredKeyFingerprint(branch), value: result.value });\n }\n }\n\n if (matches.length === 1) {\n return { present: true, value: matches[0].value };\n }\n\n if (matches.length === 0) {\n const branchDescriptions = schema.branches.map((branch) => getRequiredKeyFingerprint(branch));\n addIssueWithMessage(\n state,\n path,\n \"exactly one union branch\",\n \"0 matching branches\",\n `No union branch matched at ${formatPath(path)}. Tried ${schema.branches.length} branches. Expected one of: ${branchDescriptions.join(\" | \")}.`\n );\n return { present: true, value };\n }\n\n addIssueWithMessage(\n state,\n path,\n \"exactly one union branch\",\n `${matches.length} matching branches`,\n `Expected exactly one union branch at ${formatPath(path)}, but matched more than one branch: ${matches.map((match) => match.fingerprint).join(\" | \")}`\n );\n return { present: true, value };\n}\n\nfunction hasRequiredKeys(schema: ObjectSchema<any>, value: Record<string, unknown>): boolean {\n for (const [key, propertySchema] of Object.entries(schema.shape) as Array<[string, AnySchema]>) {\n if (propertySchema.kind !== \"optional\" && !Object.hasOwn(value, key)) {\n return false;\n }\n }\n\n return true;\n}\n\nfunction walkRecord(\n schema: Extract<AnySchema, { kind: \"record\" }>,\n value: unknown,\n path: readonly string[],\n state: ValidationState\n): WalkResult {\n if (!isPlainRecord(value)) {\n addExpectedIssue(state, path, \"object\", value);\n return { present: true, value };\n }\n\n const nextValue: Record<string, unknown> = {};\n\n for (const [key, propertyValue] of Object.entries(value)) {\n const result = walkSchema(schema.value, propertyValue, [...path, key], state);\n\n if (result.present) {\n setOwnValue(nextValue, key, result.value);\n }\n }\n\n return { present: true, value: nextValue };\n}\n\nfunction walkJson(value: unknown, path: readonly string[], state: ValidationState): WalkResult {\n if (isJsonValue(value)) {\n return { present: true, value };\n }\n\n addExpectedIssue(state, path, \"JSON value\", value);\n return { present: true, value };\n}\n\nfunction getDefault(schema: AnySchema): WalkResult {\n if (schema.default !== undefined) {\n return { present: true, value: schema.default };\n }\n\n if (schema.kind === \"optional\") {\n return getDefault(schema.inner);\n }\n\n return { present: false };\n}\n\nfunction isPlainRecord(value: unknown): value is Record<string, unknown> {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) {\n return false;\n }\n\n const prototype = Object.getPrototypeOf(value);\n\n return prototype === Object.prototype || prototype === null;\n}\n\nfunction isJsonValue(value: unknown, ancestors: Set<object> = new Set()): boolean {\n if (\n value === null ||\n typeof value === \"string\" ||\n typeof value === \"number\" ||\n typeof value === \"boolean\"\n ) {\n return typeof value !== \"number\" || Number.isFinite(value);\n }\n\n if (Array.isArray(value)) {\n if (ancestors.has(value)) {\n return false;\n }\n ancestors.add(value);\n const result = value.every((item) => isJsonValue(item, ancestors));\n ancestors.delete(value);\n return result;\n }\n\n if (isPlainRecord(value)) {\n if (ancestors.has(value)) {\n return false;\n }\n ancestors.add(value);\n const result = Object.values(value).every((item) => isJsonValue(item, ancestors));\n ancestors.delete(value);\n return result;\n }\n\n return false;\n}\n\nfunction cloneDefault(value: unknown): unknown {\n return structuredClone(value);\n}\n\nfunction setOwnValue(target: Record<string, unknown>, key: string, value: unknown): void {\n Object.defineProperty(target, key, {\n configurable: true,\n enumerable: true,\n writable: true,\n value\n });\n}\n\nfunction expectedFor(schema: AnySchema): string {\n switch (schema.kind) {\n case \"string\":\n return \"string\";\n case \"number\":\n return schema.jsonType === \"integer\" ? \"integer\" : \"number\";\n case \"boolean\":\n return \"boolean\";\n case \"enum\":\n return `one of ${schema.values.join(\", \")}`;\n case \"array\":\n return \"array\";\n case \"object\":\n case \"oneOf\":\n case \"record\":\n return \"object\";\n case \"union\":\n return \"exactly one union branch\";\n case \"json\":\n return \"JSON value\";\n case \"optional\":\n return expectedFor(schema.inner);\n }\n}\n\nfunction addExpectedIssue(\n state: ValidationState,\n path: readonly string[],\n expected: string,\n value: unknown\n): void {\n addIssue(\n state,\n path,\n expected,\n receivedType(value),\n `Expected ${expected} at ${formatPath(path)}`\n );\n}\n\nfunction addUnexpectedPropertyIssue(state: ValidationState, path: readonly string[]): void {\n addIssue(\n state,\n path,\n \"no additional properties\",\n \"unknown property\",\n `Unexpected property ${formatPath(path)}`\n );\n}\n\nfunction addIssue(\n state: ValidationState,\n path: readonly string[],\n expected: string,\n received: string,\n _message: string\n): void {\n state.issues.push({\n path,\n expected,\n received,\n message: formatIssueMessage(expected, path, received)\n });\n}\n\nfunction addIssueWithMessage(\n state: ValidationState,\n path: readonly string[],\n expected: string,\n received: string,\n message: string\n): void {\n state.issues.push({\n path,\n expected,\n received,\n message\n });\n}\n\nfunction formatIssueMessage(expected: string, path: readonly string[], received: string): string {\n return `Expected ${expected} at ${formatPath(path)}, got ${received}`;\n}\n\nfunction formatPath(path: readonly string[]): string {\n return path.length === 0 ? \"value\" : path.join(\".\");\n}\n\nfunction compilePattern(pattern: string): RegExp | undefined {\n try {\n return new RegExp(pattern);\n } catch {\n return undefined;\n }\n}\n\nfunction receivedType(value: unknown): string {\n if (value === null) {\n return \"null\";\n }\n\n if (Array.isArray(value)) {\n return \"array\";\n }\n\n if (typeof value === \"number\" && Number.isInteger(value)) {\n return \"integer\";\n }\n\n return typeof value;\n}\n\nfunction receivedValue(value: unknown): string {\n if (typeof value === \"string\") {\n return value;\n }\n\n if (value === undefined) {\n return \"undefined\";\n }\n\n return String(value);\n}\n\nfunction formatReceivedDiscriminator(value: unknown): string {\n if (typeof value === \"string\") {\n return JSON.stringify(value);\n }\n\n return receivedValue(value);\n}\n", "import { Json } from \"./json.js\";\nimport { createJsonSchemaDocument } from \"./json-schema-document.js\";\nimport { OneOf } from \"./oneof.js\";\nimport { Record as RecordBuilder } from \"./record.js\";\nimport { Union } from \"./union.js\";\nimport { validate } from \"./validate.js\";\nimport type { JsonValue, JsonValueSchema } from \"./json.js\";\nimport type { JsonSchemaDocument, JsonSchemaDocumentOptions } from \"./json-schema-document.js\";\nimport type { OneOfSchema } from \"./oneof.js\";\nimport type { RecordSchema } from \"./record.js\";\nimport type { UnionSchema } from \"./union.js\";\nimport type { ValidationIssue, ValidationResult } from \"./validate.js\";\n\ntype JsonSchemaType = \"string\" | \"number\" | \"integer\" | \"boolean\" | \"array\" | \"object\";\ntype SchemaKind =\n | \"string\"\n | \"number\"\n | \"boolean\"\n | \"enum\"\n | \"array\"\n | \"object\"\n | \"optional\"\n | \"oneOf\"\n | \"union\"\n | \"record\"\n | \"json\";\ntype EnumValue = string | number | boolean;\ntype JsonSchemaEnumValue = EnumValue | null;\ntype NumberJsonType = \"number\" | \"integer\";\ntype NonEmptyReadonlyArray<T> = readonly [T, ...T[]];\ntype ObjectShape = Record<string, AnySchema>;\ntype EmptyOptions = Record<never, never>;\ntype SchemaScope = \"cli\" | \"mcp\" | \"sdk\";\nexport type CliOutputMode = \"rich\" | \"md\" | \"json\";\nexport interface CliMissingParameterChoice<TValue> {\n label: string;\n value: TValue;\n}\nexport interface CliMissingParameterContext {\n commandPath: string;\n params: Readonly<Record<string, unknown>>;\n output: CliOutputMode;\n stdinTTY: boolean;\n stdoutTTY: boolean;\n}\nexport interface CliMissingParameterResolution<TValue> {\n choices: readonly CliMissingParameterChoice<TValue>[];\n message?: string;\n}\nexport interface CliSchemaOptions<TValue> {\n resolveMissing?: (\n context: CliMissingParameterContext\n ) =>\n | CliMissingParameterResolution<TValue>\n | undefined\n | Promise<CliMissingParameterResolution<TValue> | undefined>;\n}\ntype StringMetadata = {\n format?: string;\n maxLength?: number;\n minLength?: number;\n pattern?: string;\n secret?: boolean;\n};\ntype NumberMetadata = {\n maximum?: number;\n minimum?: number;\n secret?: boolean;\n};\ntype ArrayMetadata = {\n maxItems?: number;\n minItems?: number;\n};\ntype ObjectMetadata = {\n additionalProperties?: boolean;\n};\ntype OptionalKeys<TShape extends ObjectShape> = {\n [TKey in keyof TShape]: TShape[TKey] extends OptionalSchema<any> ? TKey : never;\n}[keyof TShape];\ntype RequiredKeys<TShape extends ObjectShape> = Exclude<keyof TShape, OptionalKeys<TShape>>;\n\ntype PropertyStatic<TSchema extends AnySchema> =\n TSchema extends OptionalSchema<infer TInner> ? Static<TInner> : Static<TSchema>;\n\ntype InferObject<TShape extends ObjectShape> = {\n [TKey in RequiredKeys<TShape>]: PropertyStatic<TShape[TKey]>;\n} & {\n [TKey in OptionalKeys<TShape>]?: PropertyStatic<TShape[TKey]>;\n};\n\ntype SchemaOptions<TDefault> = {\n cli?: CliSchemaOptions<TDefault>;\n description?: string;\n cliDescription?: string;\n cliAliases?: readonly string[];\n default?: TDefault;\n nullable?: boolean;\n requiredScopes?: readonly SchemaScope[];\n short?: string;\n scope?: readonly SchemaScope[];\n global?: boolean;\n};\n\ntype WithNullable<\n TSchema extends AnySchema,\n TOptions extends { nullable?: boolean }\n> = TOptions extends { readonly nullable: true } ? TSchema & { readonly nullable: true } : TSchema;\n\nexport interface SchemaBase<TKind extends SchemaKind, TStatic> {\n readonly kind: TKind;\n readonly cli?: CliSchemaOptions<TStatic>;\n readonly description?: string;\n readonly cliDescription?: string;\n readonly cliAliases?: readonly string[];\n readonly default?: TStatic;\n readonly nullable?: boolean;\n readonly requiredScopes?: readonly SchemaScope[];\n readonly short?: string;\n readonly scope?: readonly SchemaScope[];\n readonly global?: boolean;\n readonly __static?: TStatic;\n}\n\nexport interface JsonSchema {\n additionalProperties?: boolean | JsonSchema;\n type?: JsonSchemaType;\n description?: string;\n default?: unknown;\n enum?: ReadonlyArray<JsonSchemaEnumValue>;\n format?: string;\n items?: JsonSchema;\n maxItems?: number;\n maximum?: number;\n maxLength?: number;\n minItems?: number;\n minimum?: number;\n minLength?: number;\n nullable?: boolean;\n oneOf?: JsonSchema[];\n pattern?: string;\n properties?: Record<string, JsonSchema>;\n required?: string[];\n}\n\nexport interface StringSchema extends SchemaBase<\"string\", string>, StringMetadata {}\n\nexport interface NumberSchema extends SchemaBase<\"number\", number>, NumberMetadata {\n readonly jsonType?: NumberJsonType;\n}\n\nexport type BooleanSchema = SchemaBase<\"boolean\", boolean>;\n\nexport interface EnumSchema<TValues extends NonEmptyReadonlyArray<EnumValue>> extends SchemaBase<\n \"enum\",\n TValues[number]\n> {\n readonly values: TValues;\n readonly jsonType?: \"integer\";\n readonly labels?: Partial<Record<string, string>>;\n readonly loadOptions?:\n | (() => Array<{ label: string; value: string }>)\n | (() => Promise<Array<{ label: string; value: string }>>);\n}\n\nexport interface ArraySchema<TItem extends AnySchema>\n extends SchemaBase<\"array\", Array<Static<TItem>>>, ArrayMetadata {\n readonly item: TItem;\n}\n\nexport interface ObjectSchema<TShape extends ObjectShape>\n extends SchemaBase<\"object\", InferObject<TShape>>, ObjectMetadata {\n readonly shape: TShape;\n}\n\nexport interface OptionalSchema<TInner extends AnySchema> extends SchemaBase<\n \"optional\",\n Static<TInner> | undefined\n> {\n readonly inner: TInner;\n}\n\nexport type AnySchema =\n | StringSchema\n | NumberSchema\n | BooleanSchema\n | EnumSchema<NonEmptyReadonlyArray<EnumValue>>\n | ArraySchema<AnySchema>\n | ObjectSchema<ObjectShape>\n | OptionalSchema<AnySchema>\n | OneOfSchema<Record<string, ObjectSchema<any>>, string>\n | UnionSchema<readonly ObjectSchema<any>[]>\n | RecordSchema<AnySchema>\n | JsonValueSchema;\n\nexport type Static<TSchema extends AnySchema> = TSchema extends { readonly nullable: true }\n ? TSchema extends SchemaBase<any, infer TStatic>\n ? TStatic | null\n : never\n : TSchema extends SchemaBase<any, infer TStatic>\n ? TStatic\n : never;\n\nfunction withMetadata<TSchema extends AnySchema>(\n schema: TSchema,\n jsonSchema: JsonSchema\n): JsonSchema {\n if (schema.description !== undefined) {\n jsonSchema.description = schema.description;\n }\n\n if (schema.default !== undefined) {\n jsonSchema.default = schema.default;\n }\n\n if (schema.nullable === true) {\n jsonSchema.nullable = true;\n }\n\n return jsonSchema;\n}\n\nfunction withStringMetadata(schema: StringSchema, jsonSchema: JsonSchema): JsonSchema {\n if (schema.minLength !== undefined) {\n jsonSchema.minLength = schema.minLength;\n }\n\n if (schema.maxLength !== undefined) {\n jsonSchema.maxLength = schema.maxLength;\n }\n\n if (schema.pattern !== undefined) {\n jsonSchema.pattern = schema.pattern;\n }\n\n if (schema.format !== undefined) {\n jsonSchema.format = schema.format;\n }\n\n return withMetadata(schema, jsonSchema);\n}\n\nfunction withNumberMetadata(schema: NumberSchema, jsonSchema: JsonSchema): JsonSchema {\n if (schema.minimum !== undefined) {\n jsonSchema.minimum = schema.minimum;\n }\n\n if (schema.maximum !== undefined) {\n jsonSchema.maximum = schema.maximum;\n }\n\n return withMetadata(schema, jsonSchema);\n}\n\nfunction withArrayMetadata(schema: ArraySchema<any>, jsonSchema: JsonSchema): JsonSchema {\n if (schema.minItems !== undefined) {\n jsonSchema.minItems = schema.minItems;\n }\n\n if (schema.maxItems !== undefined) {\n jsonSchema.maxItems = schema.maxItems;\n }\n\n return withMetadata(schema, jsonSchema);\n}\n\nfunction withObjectMetadata(schema: ObjectSchema<any>, jsonSchema: JsonSchema): JsonSchema {\n jsonSchema.additionalProperties = schema.additionalProperties ?? false;\n\n return withMetadata(schema, jsonSchema);\n}\n\nfunction getEnumJsonType(values: ReadonlyArray<EnumValue>): JsonSchemaType | undefined {\n const [firstValue] = values;\n\n if (firstValue === undefined) {\n return undefined;\n }\n\n const firstType = typeof firstValue;\n const isSinglePrimitiveType = values.every((value) => typeof value === firstType);\n\n if (!isSinglePrimitiveType) {\n return undefined;\n }\n\n if (firstType === \"string\" || firstType === \"number\" || firstType === \"boolean\") {\n return firstType;\n }\n\n return undefined;\n}\n\nfunction isOptionalSchema(schema: AnySchema): schema is OptionalSchema<AnySchema> {\n return schema.kind === \"optional\";\n}\n\nfunction assertValidEnumValues(values: ReadonlyArray<EnumValue>): void {\n if (values.length === 0) {\n throw new Error(\"Enum schema requires at least one value\");\n }\n\n const uniqueValues = new Set(values);\n\n if (uniqueValues.size !== values.length) {\n throw new Error(\"Enum schema values must be unique\");\n }\n\n if (values.some((value) => typeof value === \"number\" && !Number.isFinite(value))) {\n throw new Error(\"Enum schema numeric values must be finite\");\n }\n}\n\nfunction assertNonNegativeInteger(value: number | undefined, name: string): void {\n if (value !== undefined && (!Number.isInteger(value) || value < 0)) {\n throw new Error(`${name} must be a non-negative integer`);\n }\n}\n\nfunction assertFiniteNumber(value: number | undefined, name: string): void {\n if (value !== undefined && !Number.isFinite(value)) {\n throw new Error(`${name} must be finite`);\n }\n}\n\nfunction assertMinMaxOrder(\n minimum: number | undefined,\n maximum: number | undefined,\n minimumName: string,\n maximumName: string\n): void {\n if (minimum !== undefined && maximum !== undefined && minimum > maximum) {\n throw new Error(`${minimumName} must be less than or equal to ${maximumName}`);\n }\n}\n\nfunction assertValidDefault(schema: AnySchema): void {\n if (schema.default === undefined) {\n return;\n }\n\n const result = validate(schema, schema.default);\n if (!result.ok) {\n throw new Error(\n `default must satisfy schema: ${result.issues[0]?.message ?? \"invalid default\"}`\n );\n }\n}\n\nfunction assertPattern(pattern: string | undefined): void {\n if (pattern === undefined) {\n return;\n }\n try {\n new RegExp(pattern);\n } catch {\n throw new Error(\"pattern must be a valid regular expression\");\n }\n}\n\nfunction unwrapOptional(schema: AnySchema): Exclude<AnySchema, OptionalSchema<AnySchema>> {\n if (isOptionalSchema(schema)) {\n return unwrapOptional(schema.inner);\n }\n\n return schema;\n}\n\nfunction withInjectedDiscriminator(\n schema: ObjectSchema<any>,\n discriminator: string,\n branchName: string\n): JsonSchema {\n const branchJsonSchema = toJsonSchema(schema);\n const properties = {\n ...(branchJsonSchema.properties ?? {}),\n [discriminator]: {\n type: \"string\",\n enum: [branchName]\n } satisfies JsonSchema\n };\n const required = [...new Set([...(branchJsonSchema.required ?? []), discriminator])];\n\n return {\n ...branchJsonSchema,\n type: \"object\",\n properties,\n required\n };\n}\n\nexport const S = {\n String<const TOptions extends SchemaOptions<string> & StringMetadata = EmptyOptions>(\n options: TOptions = {} as TOptions\n ): WithNullable<StringSchema, TOptions> {\n assertNonNegativeInteger(options.minLength, \"minLength\");\n assertNonNegativeInteger(options.maxLength, \"maxLength\");\n assertMinMaxOrder(options.minLength, options.maxLength, \"minLength\", \"maxLength\");\n assertPattern(options.pattern);\n const schema: StringSchema = {\n kind: \"string\",\n ...options\n };\n assertValidDefault(schema);\n return schema as WithNullable<StringSchema, TOptions>;\n },\n\n Number<\n const TOptions extends SchemaOptions<number> & NumberMetadata & { jsonType?: NumberJsonType } =\n EmptyOptions\n >(options: TOptions = {} as TOptions): WithNullable<NumberSchema, TOptions> {\n assertFiniteNumber(options.minimum, \"minimum\");\n assertFiniteNumber(options.maximum, \"maximum\");\n assertMinMaxOrder(options.minimum, options.maximum, \"minimum\", \"maximum\");\n assertFiniteNumber(options.default, \"default\");\n if (\n options.jsonType === \"integer\" &&\n options.default !== undefined &&\n !Number.isInteger(options.default)\n ) {\n throw new Error(\"default must be an integer\");\n }\n const schema: NumberSchema = {\n kind: \"number\",\n ...options\n };\n assertValidDefault(schema);\n return schema as WithNullable<NumberSchema, TOptions>;\n },\n\n Boolean<const TOptions extends SchemaOptions<boolean> = EmptyOptions>(\n options: TOptions = {} as TOptions\n ): WithNullable<BooleanSchema, TOptions> {\n const schema: BooleanSchema = {\n kind: \"boolean\",\n ...options\n };\n assertValidDefault(schema);\n return schema as WithNullable<BooleanSchema, TOptions>;\n },\n\n Enum<\n const TValues extends NonEmptyReadonlyArray<EnumValue>,\n const TOptions extends SchemaOptions<TValues[number]> & {\n jsonType?: \"integer\";\n labels?: Partial<Record<string, string>>;\n loadOptions?:\n | (() => Array<{ label: string; value: string }>)\n | (() => Promise<Array<{ label: string; value: string }>>);\n } = EmptyOptions\n >(\n values: TValues,\n options: TOptions = {} as TOptions\n ): WithNullable<EnumSchema<TValues>, TOptions> {\n assertValidEnumValues(values);\n if (\n options.jsonType === \"integer\" &&\n values.some((value) => typeof value !== \"number\" || !Number.isInteger(value))\n ) {\n throw new Error(\"Integer enum values must be integers\");\n }\n\n const schema: EnumSchema<TValues> = {\n kind: \"enum\",\n values,\n ...options\n };\n assertValidDefault(schema);\n return schema as WithNullable<EnumSchema<TValues>, TOptions>;\n },\n\n Array<\n TItem extends AnySchema,\n const TOptions extends SchemaOptions<Array<Static<TItem>>> & ArrayMetadata = EmptyOptions\n >(item: TItem, options: TOptions = {} as TOptions): WithNullable<ArraySchema<TItem>, TOptions> {\n assertNonNegativeInteger(options.minItems, \"minItems\");\n assertNonNegativeInteger(options.maxItems, \"maxItems\");\n assertMinMaxOrder(options.minItems, options.maxItems, \"minItems\", \"maxItems\");\n const schema: ArraySchema<TItem> = {\n kind: \"array\",\n item,\n ...options\n };\n assertValidDefault(schema);\n return schema as WithNullable<ArraySchema<TItem>, TOptions>;\n },\n\n Object<\n const TShape extends ObjectShape,\n const TOptions extends SchemaOptions<InferObject<TShape>> & ObjectMetadata = EmptyOptions\n >(\n shape: TShape,\n options: TOptions = {} as TOptions\n ): WithNullable<ObjectSchema<TShape>, TOptions> {\n const schema: ObjectSchema<TShape> = {\n kind: \"object\",\n shape,\n ...options\n };\n assertValidDefault(schema);\n return schema as WithNullable<ObjectSchema<TShape>, TOptions>;\n },\n\n Optional<TInner extends AnySchema>(inner: TInner): OptionalSchema<TInner> {\n return {\n kind: \"optional\",\n inner\n };\n },\n\n OneOf,\n\n Union,\n\n Record: RecordBuilder,\n\n Json\n} as const;\n\nexport function toJsonSchema(schema: AnySchema): JsonSchema {\n const unwrappedSchema = unwrapOptional(schema);\n\n switch (unwrappedSchema.kind) {\n case \"string\":\n return withStringMetadata(unwrappedSchema, { type: \"string\" });\n\n case \"number\":\n return withNumberMetadata(unwrappedSchema, { type: unwrappedSchema.jsonType ?? \"number\" });\n\n case \"boolean\":\n return withMetadata(unwrappedSchema, { type: \"boolean\" });\n\n case \"enum\": {\n const jsonSchema: JsonSchema = {\n enum:\n unwrappedSchema.nullable === true\n ? [...unwrappedSchema.values, null]\n : [...unwrappedSchema.values]\n };\n const enumType = unwrappedSchema.jsonType ?? getEnumJsonType(unwrappedSchema.values);\n\n if (enumType !== undefined) {\n jsonSchema.type = enumType;\n }\n\n return withMetadata(unwrappedSchema, jsonSchema);\n }\n\n case \"array\":\n return withArrayMetadata(unwrappedSchema, {\n type: \"array\",\n items: toJsonSchema(unwrappedSchema.item)\n });\n\n case \"object\": {\n const properties: Record<string, JsonSchema> = {};\n const required: string[] = [];\n\n for (const [key, propertySchema] of Object.entries(unwrappedSchema.shape)) {\n Object.defineProperty(properties, key, {\n enumerable: true,\n configurable: true,\n writable: true,\n value: toJsonSchema(propertySchema)\n });\n\n if (!isOptionalSchema(propertySchema)) {\n required.push(key);\n }\n }\n\n return withObjectMetadata(unwrappedSchema, {\n type: \"object\",\n properties,\n required\n });\n }\n\n case \"oneOf\":\n return withMetadata(unwrappedSchema, {\n oneOf: Object.entries(unwrappedSchema.branches).map(([branchName, branchSchema]) =>\n withInjectedDiscriminator(branchSchema, unwrappedSchema.discriminator, branchName)\n )\n });\n\n case \"union\":\n return withMetadata(unwrappedSchema, {\n oneOf: unwrappedSchema.branches.map((branchSchema) => toJsonSchema(branchSchema))\n });\n\n case \"record\":\n return withMetadata(unwrappedSchema, {\n type: \"object\",\n additionalProperties: toJsonSchema(unwrappedSchema.value)\n });\n\n case \"json\":\n return withMetadata(unwrappedSchema, {});\n }\n}\n\nexport function toJsonSchemaDocument(\n schema: AnySchema,\n options: JsonSchemaDocumentOptions = {}\n): JsonSchemaDocument {\n return createJsonSchemaDocument(toJsonSchema(schema), options);\n}\n\nexport { Json, OneOf, RecordBuilder as Record, Union, validate };\nexport type { JsonSchemaDocument, JsonSchemaDocumentOptions } from \"./json-schema-document.js\";\nexport type {\n JsonValue,\n JsonValueSchema,\n OneOfSchema,\n RecordSchema,\n UnionSchema,\n ValidationIssue,\n ValidationResult\n};\n", "export type LogLevel = \"silent\" | \"error\" | \"warn\" | \"info\" | \"debug\" | \"trace\";\n\nexport interface DiagnosticLogEvent {\n level: Exclude<LogLevel, \"silent\">;\n message: string;\n category?: \"runtime\" | \"http\" | \"auth\" | \"retry\" | \"progress\";\n data?: Record<string, unknown>;\n}\n\nexport interface RuntimeLogger {\n level: LogLevel;\n emit(event: DiagnosticLogEvent): void;\n}\n\nexport type RuntimeLoggerInput = RuntimeLogger | ((event: DiagnosticLogEvent) => void);\n\nconst LOG_LEVEL_RANK = {\n silent: 0,\n error: 1,\n warn: 2,\n info: 3,\n debug: 4,\n trace: 5\n} as const satisfies Record<LogLevel, number>;\n\nexport const LOG_LEVELS = Object.freeze([\n \"silent\",\n \"error\",\n \"warn\",\n \"info\",\n \"debug\",\n \"trace\"\n] as const satisfies readonly LogLevel[]);\n\nexport function isLogLevel(value: string): value is LogLevel {\n return (LOG_LEVELS as readonly string[]).includes(value);\n}\n\nexport function shouldEmitDiagnostic(eventLevel: LogLevel, configuredLevel: LogLevel): boolean {\n if (eventLevel === \"silent\" || configuredLevel === \"silent\") {\n return false;\n }\n\n return LOG_LEVEL_RANK[eventLevel] <= LOG_LEVEL_RANK[configuredLevel];\n}\n\nexport function createRuntimeLogger(\n options: {\n level?: LogLevel;\n logger?: RuntimeLoggerInput;\n } = {}\n): RuntimeLogger {\n const level = options.level ?? \"warn\";\n const sink = options.logger;\n\n return {\n level,\n emit(event): void {\n if (!shouldEmitDiagnostic(event.level, level)) {\n return;\n }\n\n if (typeof sink === \"function\") {\n sink(event);\n return;\n }\n\n sink?.emit(event);\n }\n };\n}\n", "import { existsSync, readFileSync, realpathSync, statSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nexport interface PackageMetadata {\n name?: string;\n path: string;\n version?: string;\n}\n\ntype PackageMetadataInput = string | URL;\n\nfunction pathFromInput(from: PackageMetadataInput): string {\n if (from instanceof URL) {\n return fileURLToPath(from);\n }\n\n if (from.startsWith(\"file:\")) {\n return fileURLToPath(from);\n }\n\n return path.resolve(from);\n}\n\nfunction getSearchDirectory(from: PackageMetadataInput): string {\n const resolved = pathFromInput(from);\n let searchPath = resolved;\n\n try {\n searchPath = realpathSync(resolved);\n } catch {\n searchPath = resolved;\n }\n\n try {\n return statSync(searchPath).isDirectory() ? searchPath : path.dirname(searchPath);\n } catch {\n return path.dirname(resolved);\n }\n}\n\nfunction readPackageMetadata(packageJsonPath: string): PackageMetadata | undefined {\n const parsed = JSON.parse(readFileSync(packageJsonPath, \"utf8\")) as {\n name?: unknown;\n version?: unknown;\n };\n const metadata: PackageMetadata = { path: packageJsonPath };\n\n if (typeof parsed.name === \"string\") {\n metadata.name = parsed.name;\n }\n\n if (typeof parsed.version === \"string\") {\n metadata.version = parsed.version;\n }\n\n return metadata;\n}\n\nexport function findPackageMetadata(from: PackageMetadataInput): PackageMetadata | undefined {\n let current = getSearchDirectory(from);\n\n while (true) {\n const packageJsonPath = path.join(current, \"package.json\");\n\n if (existsSync(packageJsonPath)) {\n return readPackageMetadata(packageJsonPath);\n }\n\n const parent = path.dirname(current);\n\n if (parent === current) {\n return undefined;\n }\n\n current = parent;\n }\n}\n\nexport function packageMetadata(from: PackageMetadataInput = process.cwd()): PackageMetadata {\n const metadata = findPackageMetadata(from);\n\n if (metadata === undefined) {\n throw new Error(`No package.json found from ${pathFromInput(from)}.`);\n }\n\n return metadata;\n}\n\nexport function findEntrypointPackageMetadata(entrypoint: string | undefined): PackageMetadata | undefined {\n if (entrypoint === undefined || entrypoint.length === 0) {\n return undefined;\n }\n\n if (!path.isAbsolute(entrypoint) && !entrypoint.startsWith(\"file:\")) {\n return undefined;\n }\n\n return findPackageMetadata(entrypoint);\n}\n", "import { randomUUID } from \"node:crypto\";\nimport { TerminalSession } from \"./terminal-session.js\";\n\nconst DEFAULT_COLS = 120;\nconst DEFAULT_ROWS = 40;\n\nexport interface NewSessionOptions {\n command: string;\n args?: string[];\n cwd?: string;\n env?: Record<string, string>;\n cols?: number;\n rows?: number;\n observe?: boolean;\n}\n\nexport class TerminalPilot {\n private readonly sessionMap = new Map<string, TerminalSession>();\n\n static async launch(): Promise<TerminalPilot> {\n return new TerminalPilot();\n }\n\n async newSession(opts: NewSessionOptions): Promise<TerminalSession> {\n const session = new TerminalSession({\n id: randomUUID(),\n command: opts.command,\n args: opts.args,\n cwd: opts.cwd,\n env: opts.env,\n cols: opts.cols ?? DEFAULT_COLS,\n rows: opts.rows ?? DEFAULT_ROWS,\n observe: opts.observe ?? false\n });\n\n this.sessionMap.set(session.id, session);\n return session;\n }\n\n getSession(id: string): TerminalSession {\n const session = this.sessionMap.get(id);\n\n if (session === undefined) {\n throw new Error(`Session not found: ${id}`);\n }\n\n return session;\n }\n\n deleteSession(id: string): void {\n this.sessionMap.delete(id);\n }\n\n sessions(): TerminalSession[] {\n return [...this.sessionMap.values()].filter((s) => s.exitCode === null);\n }\n\n async close(): Promise<void> {\n const sessions = [...this.sessionMap.values()];\n\n await Promise.all(\n sessions.map(async (session) => {\n await session.close();\n this.sessionMap.delete(session.id);\n })\n );\n }\n}\n", "import { EventEmitter } from \"node:events\";\nimport { accessSync, chmodSync, constants } from \"node:fs\";\nimport { createRequire } from \"node:module\";\nimport { dirname, join } from \"node:path\";\nimport * as nodePty from \"node-pty\";\nimport { stripAnsi } from \"./ansi.js\";\nimport { hasOwnErrorCode } from \"./errors.js\";\nimport { TerminalBuffer } from \"./terminal-buffer.js\";\nimport { keyToSequence, type TerminalKey } from \"./keys.js\";\nimport { TerminalScreen } from \"./terminal-screen.js\";\n\nconst DEFAULT_COLS = 120;\nconst DEFAULT_ROWS = 40;\nconst DEFAULT_TIMEOUT_MS = 10_000;\nconst WAIT_FOR_POLL_MS = 10;\nconst TYPE_DELAY_MS = 15;\nconst CLOSE_AFTER_SIGNAL_GRACE_MS = 250;\nconst CLOSE_AFTER_SIGTERM_MS = 1000;\nconst CLOSE_AFTER_SIGKILL_MS = 1000;\n\ntype TerminalSessionOptions = {\n id: string;\n command: string;\n args?: string[];\n cwd?: string;\n env?: Record<string, string | undefined>;\n cols?: number;\n rows?: number;\n observe?: boolean;\n};\n\nexport type WaitForOptions = {\n timeout?: number;\n scope?: \"history\" | \"screen\";\n};\n\nexport type HistoryOptions = {\n last?: number;\n};\n\ntype PtyLike = {\n readonly pid: number;\n write(data: string): void;\n resize(cols: number, rows: number): void;\n kill(signal?: string): void;\n onData(listener: (chunk: string) => void): { dispose(): void };\n onExit(listener: (event: { exitCode: number; signal?: number }) => void): { dispose(): void };\n};\n\nexport class TerminalSession {\n readonly id: string;\n readonly command: string;\n readonly pid: number;\n exitCode: number | null = null;\n\n private readonly pty: PtyLike;\n private readonly terminal: TerminalBuffer;\n private readonly emitter = new EventEmitter();\n private readonly exitPromise: Promise<number>;\n private rawBuffer = \"\";\n private lastDataAt = Date.now();\n private currentCols: number;\n private currentRows: number;\n private closePromise: Promise<number> | null = null;\n\n constructor({\n id,\n command,\n args = [],\n cwd = process.cwd(),\n env = process.env,\n cols = DEFAULT_COLS,\n rows = DEFAULT_ROWS,\n observe = false\n }: TerminalSessionOptions) {\n assertTerminalGeometry(cols, rows);\n this.id = id;\n this.command = command;\n this.currentCols = cols;\n this.currentRows = rows;\n this.terminal = new TerminalBuffer(cols, rows);\n this.pty = createPtyProcess({ command, args, cwd, env, cols, rows });\n this.pid = this.pty.pid;\n\n const dataSubscription = this.pty.onData((chunk) => {\n this.rawBuffer += chunk;\n this.lastDataAt = Date.now();\n this.terminal.write(chunk);\n\n if (observe) {\n process.stderr.write(chunk);\n }\n });\n\n let exitSubscription: { dispose(): void } | undefined;\n\n this.exitPromise = new Promise<number>((resolve) => {\n exitSubscription = this.pty.onExit(({ exitCode }) => {\n if (this.exitCode !== null) {\n resolve(this.exitCode);\n return;\n }\n\n this.exitCode = exitCode;\n dataSubscription.dispose();\n exitSubscription?.dispose();\n this.emitter.emit(\"exit\", exitCode);\n resolve(exitCode);\n });\n });\n }\n\n async type(text: string): Promise<void> {\n for (const character of text) {\n await this.send(character);\n await sleep(TYPE_DELAY_MS);\n }\n }\n\n async fill(text: string): Promise<void> {\n await this.send(text.replace(/\\r?\\n/g, \"\\r\"));\n }\n\n async press(key: TerminalKey): Promise<void> {\n await this.send(keyToSequence(key));\n }\n\n async send(raw: string): Promise<void> {\n if (this.exitCode !== null) {\n throw new Error(`Terminal session \"${this.id}\" has already exited.`);\n }\n\n this.pty.write(raw);\n }\n\n async signal(sig: string): Promise<void> {\n if (this.exitCode !== null) {\n return;\n }\n\n this.pty.kill(sig);\n }\n\n async waitFor(pattern: string | RegExp, opts?: WaitForOptions): Promise<string> {\n const timeout = opts?.timeout ?? DEFAULT_TIMEOUT_MS;\n const scope = opts?.scope ?? \"history\";\n assertTimeout(timeout);\n assertWaitScope(scope);\n const startedAt = Date.now();\n\n while (Date.now() - startedAt <= timeout) {\n const source = scope === \"screen\" ? (await this.screen()).text : this.rawBuffer;\n const matched = matchPattern(source, pattern);\n if (matched !== null) {\n return matched;\n }\n\n if (this.exitCode !== null) {\n throw new Error(`Terminal session \"${this.id}\" exited before matching pattern: ${String(pattern)}`);\n }\n\n await sleep(WAIT_FOR_POLL_MS);\n }\n\n throw new Error(`Timed out waiting for pattern after ${timeout}ms: ${String(pattern)}`);\n }\n\n async waitForQuiet(ms: number): Promise<void> {\n assertQuietPeriod(ms);\n while (true) {\n const remaining = ms - (Date.now() - this.lastDataAt);\n if (remaining <= 0) {\n return;\n }\n\n await sleep(remaining);\n }\n }\n\n async screen(): Promise<TerminalScreen> {\n const rawLines: string[] = [];\n\n for (let row = 0; row < this.currentRows; row += 1) {\n rawLines.push(this.terminal.renderLine(row));\n }\n\n return new TerminalScreen({\n lines: rawLines,\n rawLines,\n cursor: {\n row: this.terminal.displayBuffer.cursorY,\n col: this.terminal.displayBuffer.cursorX\n },\n size: {\n rows: this.currentRows,\n cols: this.currentCols\n }\n });\n }\n\n async history(opts?: HistoryOptions): Promise<string[]> {\n const normalized = normalizeHistoryBuffer(stripAnsi(this.rawBuffer));\n const lines = splitHistoryLines(normalized);\n\n if (opts?.last === undefined) {\n return lines;\n }\n\n if (!Number.isInteger(opts.last) || opts.last < 0) {\n throw new Error(\"History last must be a non-negative integer.\");\n }\n\n const start = Math.max(0, lines.length - opts.last);\n return lines.slice(start);\n }\n\n async resize(cols: number, rows: number): Promise<void> {\n assertTerminalGeometry(cols, rows);\n this.currentCols = cols;\n this.currentRows = rows;\n if (this.exitCode === null) {\n this.pty.resize(cols, rows);\n }\n this.terminal.resize(cols, rows);\n }\n\n async waitForExit(opts?: { timeout?: number }): Promise<number> {\n if (opts?.timeout !== undefined) {\n assertTimeout(opts.timeout);\n }\n\n if (this.exitCode !== null) {\n return this.exitCode;\n }\n\n if (opts?.timeout !== undefined) {\n const result = await waitForExit(this.exitPromise, opts.timeout);\n if (result === null) {\n throw new Error(`Timed out waiting for process to exit after ${opts.timeout}ms`);\n }\n return result;\n }\n\n return this.exitPromise;\n }\n\n async close(): Promise<number> {\n if (this.exitCode !== null) {\n return this.exitCode;\n }\n\n this.closePromise ??= this.closeProcess().catch((error: unknown) => {\n this.closePromise = null;\n throw error;\n });\n return this.closePromise;\n }\n\n private async closeProcess(): Promise<number> {\n const gracefulExitCode = await waitForExit(this.exitPromise, CLOSE_AFTER_SIGNAL_GRACE_MS);\n if (gracefulExitCode !== null) {\n return gracefulExitCode;\n }\n\n if (this.exitCode === null) {\n this.pty.kill(\"SIGTERM\");\n const afterSigterm = await waitForExit(this.exitPromise, CLOSE_AFTER_SIGTERM_MS);\n if (afterSigterm !== null) {\n return afterSigterm;\n }\n }\n\n if (this.exitCode === null) {\n this.pty.kill(\"SIGKILL\");\n const afterSigkill = await waitForExit(this.exitPromise, CLOSE_AFTER_SIGKILL_MS);\n if (afterSigkill !== null) {\n return afterSigkill;\n }\n }\n\n throw new Error(\"Timed out waiting for process to exit after SIGKILL.\");\n }\n\n on(event: \"exit\", cb: (code: number) => void): void {\n this.emitter.on(event, cb);\n }\n}\n\nfunction assertTerminalGeometry(cols: number, rows: number): void {\n if (!Number.isInteger(cols) || cols <= 0 || !Number.isInteger(rows) || rows <= 0) {\n throw new Error(\"Terminal columns and rows must be positive integers.\");\n }\n}\n\nfunction assertTimeout(timeout: number): void {\n if (!Number.isFinite(timeout) || timeout < 0) {\n throw new Error(\"Timeout must be a finite non-negative number.\");\n }\n}\n\nfunction assertWaitScope(scope: string): void {\n if (scope !== \"history\" && scope !== \"screen\") {\n throw new Error('Wait scope must be either \"history\" or \"screen\".');\n }\n}\n\nfunction assertQuietPeriod(duration: number): void {\n if (!Number.isFinite(duration) || duration < 0) {\n throw new Error(\"Quiet period must be a finite non-negative number.\");\n }\n}\n\nfunction createPtyProcess({\n command,\n args,\n cwd,\n env,\n cols,\n rows\n}: {\n command: string;\n args: string[];\n cwd: string;\n env: Record<string, string | undefined>;\n cols: number;\n rows: number;\n}): PtyLike {\n ensureSpawnHelperExecutable();\n return nodePty.spawn(command, args, {\n cwd,\n env,\n cols,\n rows,\n encoding: \"utf8\"\n });\n}\n\nlet spawnHelperChecked = false;\n\nfunction ensureSpawnHelperExecutable(): void {\n if (spawnHelperChecked) return;\n spawnHelperChecked = true;\n\n const require = createRequire(import.meta.url);\n const nodePtyDir = dirname(require.resolve(\"node-pty\"));\n const helper = join(nodePtyDir, \"..\", \"prebuilds\", `${process.platform}-${process.arch}`, \"spawn-helper\");\n\n try {\n accessSync(helper, constants.X_OK);\n } catch (error) {\n if (isMissingFileError(error)) {\n return;\n }\n\n try {\n chmodSync(helper, 0o755);\n } catch (chmodError) {\n if (isMissingFileError(chmodError)) {\n return;\n }\n\n throw chmodError;\n }\n }\n}\n\nfunction isMissingFileError(error: unknown): boolean {\n return hasOwnErrorCode(error, \"ENOENT\");\n}\n\nfunction matchPattern(buffer: string, pattern: string | RegExp): string | null {\n const clean = normalizeHistoryBuffer(stripAnsi(buffer));\n\n for (const line of clean.split(\"\\n\")) {\n if (typeof pattern === \"string\") {\n if (line.includes(pattern)) return line;\n } else {\n const flags = removeCharacter(pattern.flags, \"g\");\n if (new RegExp(pattern.source, flags).test(line)) return line;\n }\n }\n\n return null;\n}\n\nfunction removeCharacter(input: string, charToRemove: string): string {\n let output = \"\";\n\n for (const character of input) {\n if (character !== charToRemove) {\n output += character;\n }\n }\n\n return output;\n}\n\n\nfunction splitHistoryLines(input: string): string[] {\n const lines = input.split(\"\\n\");\n\n if (lines.length > 0 && lines[lines.length - 1] === \"\") {\n lines.pop();\n }\n\n return lines;\n}\n\nfunction normalizeHistoryBuffer(input: string): string {\n let output = \"\";\n let line = \"\";\n let cursor = 0;\n\n for (const character of input) {\n if (character === \"\\r\") {\n cursor = 0;\n continue;\n }\n\n if (character === \"\\b\") {\n cursor = Math.max(0, cursor - 1);\n continue;\n }\n\n if (character === \"\\n\") {\n output += `${line}\\n`;\n line = \"\";\n cursor = 0;\n continue;\n }\n\n line = `${line.slice(0, cursor)}${character}${line.slice(cursor + 1)}`;\n cursor += 1;\n }\n\n return output + line;\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => {\n setTimeout(resolve, ms);\n });\n}\n\nasync function waitForExit(exitPromise: Promise<number>, timeout: number): Promise<number | null> {\n return new Promise((resolve) => {\n let settled = false;\n\n const timer = setTimeout(() => {\n if (settled) {\n return;\n }\n\n settled = true;\n resolve(null);\n }, timeout);\n\n void exitPromise.then((code) => {\n if (settled) {\n return;\n }\n\n settled = true;\n clearTimeout(timer);\n resolve(code);\n });\n });\n}\n", "const ESC = 0x1b;\nconst BEL = 0x07;\nconst ST = 0x9c;\nconst CSI = 0x9b;\nconst OSC = 0x9d;\nconst DCS = 0x90;\nconst SOS = 0x98;\nconst PM = 0x9e;\nconst APC = 0x9f;\n\nexport function stripAnsi(input: string): string {\n let output = \"\";\n\n for (let index = 0; index < input.length; index += 1) {\n const code = input.charCodeAt(index);\n\n if (code === ESC) {\n const nextCode = input.charCodeAt(index + 1);\n\n if (nextCode === 0x5b) {\n index = consumeCsi(input, index + 2);\n continue;\n }\n\n if (nextCode === 0x5d) {\n index = consumeTerminatedString(input, index + 2, true);\n continue;\n }\n\n if (nextCode === 0x50 || nextCode === 0x58 || nextCode === 0x5e || nextCode === 0x5f) {\n index = consumeTerminatedString(input, index + 2, false);\n continue;\n }\n\n if (!Number.isNaN(nextCode)) {\n index += 1;\n }\n\n continue;\n }\n\n if (code === CSI) {\n index = consumeCsi(input, index + 1);\n continue;\n }\n\n if (code === OSC) {\n index = consumeTerminatedString(input, index + 1, true);\n continue;\n }\n\n if (code === DCS || code === SOS || code === PM || code === APC) {\n index = consumeTerminatedString(input, index + 1, false);\n continue;\n }\n\n output += input[index];\n }\n\n return output;\n}\n\nfunction consumeCsi(input: string, index: number): number {\n while (index < input.length) {\n const code = input.charCodeAt(index);\n if (code >= 0x40 && code <= 0x7e) {\n return index;\n }\n\n index += 1;\n }\n\n return input.length;\n}\n\nfunction consumeTerminatedString(\n input: string,\n index: number,\n allowBellTerminator: boolean\n): number {\n while (index < input.length) {\n const code = input.charCodeAt(index);\n\n if (code === ST || (allowBellTerminator && code === BEL)) {\n return index;\n }\n\n if (code === ESC && input.charCodeAt(index + 1) === 0x5c) {\n return index + 1;\n }\n\n index += 1;\n }\n\n return input.length;\n}\n", "export function hasOwnErrorCode(error: unknown, code: string): boolean {\n return (\n error instanceof Error &&\n Object.prototype.hasOwnProperty.call(error, \"code\") &&\n (error as { code?: unknown }).code === code\n );\n}\n", "type Cell = ([number, string] & { style?: string }) | null;\ntype Row = Cell[];\n\ninterface SgrStyleState {\n bold: boolean;\n dim: boolean;\n italic: boolean;\n underline: boolean;\n inverse: boolean;\n conceal: boolean;\n strikethrough: boolean;\n fg?: number[];\n bg?: number[];\n}\n\ninterface SavedCursorState {\n x: number;\n y: number;\n autoWrap: boolean;\n style: SgrStyleState;\n styleSequence: string;\n}\n\ninterface PrimaryScreenState {\n screen: Row[];\n cursorX: number;\n cursorY: number;\n pendingWrap: boolean;\n style: SgrStyleState;\n styleSequence: string;\n}\n\nconst RESET_SGR = \"\\x1b[0m\";\nconst DEC_SPECIAL_GRAPHICS: Record<string, string> = {\n j: \"\u2518\",\n k: \"\u2510\",\n l: \"\u250C\",\n m: \"\u2514\",\n n: \"\u253C\",\n q: \"\u2500\",\n t: \"\u251C\",\n u: \"\u2524\",\n v: \"\u2534\",\n w: \"\u252C\",\n x: \"\u2502\"\n};\n\nconst enum State {\n Normal,\n Escape,\n Csi,\n Osc,\n Str,\n StringEscape,\n EscCharset,\n EscHash\n}\n\nexport class TerminalBuffer {\n private _cols: number;\n private _rows: number;\n private _screen: Row[];\n private _primaryScreen: PrimaryScreenState | null = null;\n private _cursorX = 0;\n private _cursorY = 0;\n private _savedCursor: SavedCursorState;\n private _scrollTop = 0;\n private _scrollBottom: number;\n private _state = State.Normal;\n private _csiParams = \"\";\n private _csiPrivate = \"\";\n private _autoWrap = true;\n private _pendingWrap = false;\n private _originMode = false;\n private _insertMode = false;\n private _tabStops: Set<number>;\n private _lastPrintedChar: string | null = null;\n private _style: SgrStyleState = createDefaultStyleState();\n private _styleSequence = \"\";\n private _stringState = State.Normal;\n private _charsetTarget: \"g0\" | \"g1\" | null = null;\n private _g0Charset: \"ascii\" | \"graphics\" = \"ascii\";\n private _g1Charset: \"ascii\" | \"graphics\" = \"ascii\";\n private _shiftOut = false;\n\n readonly displayBuffer: {\n readonly cursorX: number;\n readonly cursorY: number;\n readonly data: Array<Row | undefined>;\n };\n\n constructor(cols: number, rows: number) {\n this._cols = cols;\n this._rows = rows;\n this._scrollBottom = rows - 1;\n this._screen = this._makeScreen(cols, rows);\n this._tabStops = this._createDefaultTabStops(cols);\n this._savedCursor = this._createSavedCursorState();\n\n this.displayBuffer = Object.defineProperties(\n {} as {\n readonly cursorX: number;\n readonly cursorY: number;\n readonly data: Array<Row | undefined>;\n },\n {\n cursorX: { get: () => this._cursorX, enumerable: true },\n cursorY: { get: () => this._cursorY, enumerable: true },\n data: { get: () => this._screen as Array<Row | undefined>, enumerable: true }\n }\n );\n }\n\n write(data: string): void {\n for (const ch of data) {\n this._feed(ch);\n }\n }\n\n renderLine(row: number): string {\n const cells = this._screen[row] ?? [];\n let lastVisibleCell = -1;\n\n for (let index = cells.length - 1; index >= 0; index -= 1) {\n if (cells[index] !== null) {\n lastVisibleCell = index;\n break;\n }\n }\n\n if (lastVisibleCell === -1) {\n return \"\";\n }\n\n let line = \"\";\n let activeStyle = \"\";\n\n for (let index = 0; index <= lastVisibleCell; index += 1) {\n const cell = cells[index];\n const cellStyle = cell?.style ?? \"\";\n\n if (cellStyle !== activeStyle) {\n line += cellStyle.length > 0 ? cellStyle : RESET_SGR;\n activeStyle = cellStyle;\n }\n\n line += cell?.[1] ?? \" \";\n }\n\n if (activeStyle.length > 0) {\n line += RESET_SGR;\n }\n\n return line;\n }\n\n resize(cols: number, rows: number): void {\n // Adjust row count\n while (this._screen.length < rows) {\n this._screen.push(this._makeRow(cols));\n }\n this._screen.length = rows;\n\n // Adjust col count for each row\n for (let y = 0; y < rows; y++) {\n const row = this._screen[y] ?? this._makeRow(cols);\n while (row.length < cols) row.push(null);\n row.length = cols;\n this._screen[y] = row;\n }\n\n this._cols = cols;\n this._rows = rows;\n this._scrollTop = this._clamp(this._scrollTop, 0, rows - 1);\n this._scrollBottom = this._clamp(this._scrollBottom, 0, rows - 1);\n if (this._scrollTop >= this._scrollBottom) {\n this._scrollTop = 0;\n this._scrollBottom = rows - 1;\n }\n this._cursorX = this._clamp(this._cursorX, 0, cols - 1);\n this._cursorY = this._clamp(this._cursorY, 0, rows - 1);\n }\n\n private _makeScreen(cols: number, rows: number): Row[] {\n return Array.from({ length: rows }, () => this._makeRow(cols));\n }\n\n private _makeRow(cols: number): Row {\n return Array(cols).fill(null) as Row;\n }\n\n private _createDefaultTabStops(cols: number): Set<number> {\n const tabStops = new Set<number>();\n for (let column = 8; column < cols; column += 8) {\n tabStops.add(column);\n }\n return tabStops;\n }\n\n private _clamp(value: number, min: number, max: number): number {\n return Math.max(min, Math.min(max, value));\n }\n\n private _createSavedCursorState(): SavedCursorState {\n return {\n x: this._cursorX,\n y: this._cursorY,\n autoWrap: this._autoWrap,\n style: { ...this._style, fg: this._style.fg?.slice(), bg: this._style.bg?.slice() },\n styleSequence: this._styleSequence\n };\n }\n\n private _saveCursor(): void {\n this._savedCursor = this._createSavedCursorState();\n }\n\n private _restoreCursor(): void {\n this._cursorX = this._clamp(this._savedCursor.x, 0, this._cols - 1);\n this._cursorY = this._clamp(this._savedCursor.y, 0, this._rows - 1);\n this._autoWrap = this._savedCursor.autoWrap;\n this._style = {\n ...this._savedCursor.style,\n fg: this._savedCursor.style.fg?.slice(),\n bg: this._savedCursor.style.bg?.slice()\n };\n this._styleSequence = this._savedCursor.styleSequence;\n }\n\n private _resetModes(): void {\n this._autoWrap = true;\n this._originMode = false;\n this._insertMode = false;\n this._pendingWrap = false;\n this._tabStops = this._createDefaultTabStops(this._cols);\n this._g0Charset = \"ascii\";\n this._g1Charset = \"ascii\";\n this._shiftOut = false;\n this._resetStyle();\n }\n\n private _writePrintable(ch: string): void {\n const width = this._cellWidth(ch);\n\n if (width === 0) {\n this._appendCombiningMark(ch);\n return;\n }\n\n if (this._autoWrap && this._pendingWrap) {\n this._cursorX = 0;\n this._newline();\n } else if (this._autoWrap && this._cursorX + width > this._cols) {\n this._cursorX = 0;\n this._newline();\n }\n\n if (this._insertMode) {\n const row = this._screen[this._cursorY];\n if (row) {\n row.splice(this._cursorX, 0, ...(Array(width).fill(null) as Cell[]));\n row.splice(this._cols);\n }\n }\n\n this._setChar(this._cursorY, this._cursorX, ch);\n for (let column = 1; column < width && this._cursorX + column < this._cols; column += 1) {\n const row = this._screen[this._cursorY];\n if (row) row[this._cursorX + column] = null;\n }\n this._lastPrintedChar = ch;\n\n if (!this._autoWrap) {\n this._cursorX = Math.min(this._cursorX + width, this._cols - 1);\n this._pendingWrap = false;\n } else if (this._cursorX + width >= this._cols) {\n this._cursorX = this._cols - 1;\n this._pendingWrap = true;\n } else {\n this._cursorX += width;\n this._pendingWrap = false;\n }\n }\n\n private _cellWidth(ch: string): number {\n const codePoint = ch.codePointAt(0);\n if (codePoint === undefined) return 0;\n if (isCombiningCodePoint(codePoint)) {\n return 0;\n }\n if (\n (codePoint >= 0x1100 && codePoint <= 0x115f) ||\n codePoint === 0x2329 ||\n codePoint === 0x232a ||\n (codePoint >= 0x2e80 && codePoint <= 0x303e) ||\n (codePoint >= 0x3041 && codePoint <= 0x33bf) ||\n (codePoint >= 0x3400 && codePoint <= 0x4dbf) ||\n (codePoint >= 0x4e00 && codePoint <= 0xa4cf) ||\n (codePoint >= 0xac00 && codePoint <= 0xd7af) ||\n (codePoint >= 0xf900 && codePoint <= 0xfaff) ||\n (codePoint >= 0xfe10 && codePoint <= 0xfe19) ||\n (codePoint >= 0xfe30 && codePoint <= 0xfe6f) ||\n (codePoint >= 0xff00 && codePoint <= 0xff60) ||\n (codePoint >= 0xffe0 && codePoint <= 0xffe6) ||\n (codePoint >= 0x1f200 && codePoint <= 0x1fffd) ||\n (codePoint >= 0x20000 && codePoint <= 0x3fffd)\n ) {\n return Math.min(2, this._cols);\n }\n return 1;\n }\n\n private _appendCombiningMark(ch: string): void {\n const target = this._findCombiningTarget();\n if (target === null) {\n return;\n }\n\n const cell = this._screen[target.y]?.[target.x];\n if (cell === null || cell === undefined) {\n return;\n }\n\n cell[1] += ch;\n }\n\n private _findCombiningTarget(): { x: number; y: number } | null {\n const startX = this._pendingWrap ? this._cursorX : this._cursorX - 1;\n\n for (let y = this._cursorY; y >= 0; y -= 1) {\n const row = this._screen[y];\n if (row === undefined) {\n continue;\n }\n\n for (let x = y === this._cursorY ? startX : this._cols - 1; x >= 0; x -= 1) {\n if (row[x] !== null) {\n return { x, y };\n }\n }\n }\n\n return null;\n }\n\n private _setChar(y: number, x: number, ch: string): void {\n const row = this._screen[y];\n if (row && x >= 0 && x < this._cols) {\n const renderedChar = this._style.conceal ? \" \" : ch;\n const cell = [renderedChar.charCodeAt(0), renderedChar] as Exclude<Cell, null>;\n\n if (this._styleSequence.length > 0) {\n Object.defineProperty(cell, \"style\", {\n value: this._styleSequence,\n writable: true,\n configurable: true\n });\n }\n\n row[x] = cell;\n }\n }\n\n private _eraseLine(y: number, fromX: number, toX: number): void {\n const row = this._screen[y];\n if (!row) return;\n for (let x = fromX; x <= toX && x < this._cols; x++) {\n row[x] = null;\n }\n }\n\n private _scrollUp(count: number): void {\n for (let i = 0; i < count; i++) {\n this._screen.splice(this._scrollTop, 1);\n this._screen.splice(this._scrollBottom, 0, this._makeRow(this._cols));\n }\n }\n\n private _scrollDown(count: number): void {\n for (let i = 0; i < count; i++) {\n this._screen.splice(this._scrollBottom, 1);\n this._screen.splice(this._scrollTop, 0, this._makeRow(this._cols));\n }\n }\n\n private _newline(): void {\n this._pendingWrap = false;\n if (this._cursorY === this._scrollBottom) {\n this._scrollUp(1);\n } else {\n this._cursorY = Math.min(this._cursorY + 1, this._rows - 1);\n }\n }\n\n private _parseCsiParams(): number[] {\n if (!this._csiParams) return [];\n const values = this._csiParams\n .split(\";\")\n .flatMap((segment) => segment.split(\":\"))\n .map((segment) => (segment === \"\" ? 0 : parseInt(segment, 10)));\n if ((values[0] === 38 || values[0] === 48) && values[1] === 2 && values[2] === 0) {\n values.splice(2, 1);\n }\n return values;\n }\n\n private _execCsi(final: string): void {\n const params = this._parseCsiParams();\n const p0 = params[0] ?? 0;\n const p1 = params[1] ?? 0;\n\n if (this._csiPrivate === \"?\") {\n if (final === \"h\" || final === \"l\") {\n if (params.includes(7)) {\n this._autoWrap = final === \"h\";\n }\n\n if (params.includes(6)) {\n this._originMode = final === \"h\";\n this._cursorX = 0;\n this._cursorY = this._originMode ? this._scrollTop : 0;\n }\n\n if (params.includes(1049)) {\n if (final === \"h\") {\n this._primaryScreen = {\n screen: this._screen,\n cursorX: this._cursorX,\n cursorY: this._cursorY,\n pendingWrap: this._pendingWrap,\n style: { ...this._style, fg: this._style.fg?.slice(), bg: this._style.bg?.slice() },\n styleSequence: this._styleSequence\n };\n this._screen = this._makeScreen(this._cols, this._rows);\n this._cursorX = 0;\n this._cursorY = 0;\n this._pendingWrap = false;\n } else {\n if (this._primaryScreen !== null) {\n this._screen = this._primaryScreen.screen;\n this._cursorX = this._primaryScreen.cursorX;\n this._cursorY = this._primaryScreen.cursorY;\n this._pendingWrap = this._primaryScreen.pendingWrap;\n this._style = this._primaryScreen.style;\n this._styleSequence = this._primaryScreen.styleSequence;\n this._primaryScreen = null;\n }\n }\n if (final === \"h\") this._resetStyle();\n }\n }\n return;\n }\n\n if ((final === \"h\" || final === \"l\") && params.includes(4)) {\n this._insertMode = final === \"h\";\n return;\n }\n\n switch (final) {\n case \"A\": // cursor up\n this._cursorY = this._clamp(this._cursorY - Math.max(1, p0), 0, this._rows - 1);\n break;\n case \"B\": // cursor down\n this._cursorY = this._clamp(this._cursorY + Math.max(1, p0), 0, this._rows - 1);\n break;\n case \"C\": // cursor forward\n case \"a\":\n this._cursorX = this._clamp(this._cursorX + Math.max(1, p0), 0, this._cols - 1);\n break;\n case \"D\": // cursor backward\n this._cursorX = this._clamp(this._cursorX - Math.max(1, p0), 0, this._cols - 1);\n break;\n case \"E\": // cursor next line\n this._cursorY = this._clamp(this._cursorY + Math.max(1, p0), 0, this._rows - 1);\n this._cursorX = 0;\n break;\n case \"F\": // cursor preceding line\n this._cursorY = this._clamp(this._cursorY - Math.max(1, p0), 0, this._rows - 1);\n this._cursorX = 0;\n break;\n case \"G\": // cursor horizontal absolute\n case \"`\":\n this._cursorX = this._clamp(Math.max(1, p0) - 1, 0, this._cols - 1);\n break;\n case \"H\": // cursor position\n case \"f\":\n this._cursorY = this._originMode\n ? this._clamp(this._scrollTop + Math.max(1, p0) - 1, this._scrollTop, this._scrollBottom)\n : this._clamp(Math.max(1, p0) - 1, 0, this._rows - 1);\n this._cursorX = this._clamp(Math.max(1, p1) - 1, 0, this._cols - 1);\n break;\n case \"I\": // cursor forward tabulation\n for (let i = 0; i < Math.max(1, p0); i++) {\n this._cursorX = Math.min(this._cols - 1, (Math.floor(this._cursorX / 8) + 1) * 8);\n }\n break;\n case \"J\": // erase in display\n if (p0 === 0) {\n this._eraseLine(this._cursorY, this._cursorX, this._cols - 1);\n for (let y = this._cursorY + 1; y < this._rows; y++)\n this._eraseLine(y, 0, this._cols - 1);\n } else if (p0 === 1) {\n for (let y = 0; y < this._cursorY; y++) this._eraseLine(y, 0, this._cols - 1);\n this._eraseLine(this._cursorY, 0, this._cursorX);\n } else if (p0 === 2) {\n for (let y = 0; y < this._rows; y++) this._eraseLine(y, 0, this._cols - 1);\n }\n break;\n case \"K\": // erase in line\n if (p0 === 0) this._eraseLine(this._cursorY, this._cursorX, this._cols - 1);\n else if (p0 === 1) this._eraseLine(this._cursorY, 0, this._cursorX);\n else if (p0 === 2) this._eraseLine(this._cursorY, 0, this._cols - 1);\n break;\n case \"X\": // erase characters (ECH)\n this._eraseLine(this._cursorY, this._cursorX, this._cursorX + Math.max(1, p0) - 1);\n break;\n case \"L\": {\n // insert lines\n if (this._cursorY < this._scrollTop || this._cursorY > this._scrollBottom) {\n break;\n }\n const n = Math.max(1, p0);\n for (let i = 0; i < n; i++) {\n this._screen.splice(this._scrollBottom, 1);\n this._screen.splice(this._cursorY, 0, this._makeRow(this._cols));\n }\n break;\n }\n case \"M\": {\n // delete lines\n if (this._cursorY < this._scrollTop || this._cursorY > this._scrollBottom) {\n break;\n }\n const n = Math.max(1, p0);\n for (let i = 0; i < n; i++) {\n this._screen.splice(this._cursorY, 1);\n this._screen.splice(this._scrollBottom, 0, this._makeRow(this._cols));\n }\n break;\n }\n case \"P\": {\n // delete characters\n const row = this._screen[this._cursorY];\n if (row) {\n const n = Math.max(1, p0);\n row.splice(this._cursorX, n);\n while (row.length < this._cols) row.push(null);\n }\n break;\n }\n case \"@\": {\n // insert blank characters\n const row = this._screen[this._cursorY];\n if (row) {\n const n = Math.max(1, p0);\n for (let i = 0; i < n; i++) row.splice(this._cursorX, 0, null);\n row.splice(this._cols);\n }\n break;\n }\n case \"S\": // scroll up\n this._scrollUp(Math.max(1, p0));\n break;\n case \"T\": // scroll down\n if (params.length <= 1) this._scrollDown(Math.max(1, p0));\n break;\n case \"Z\": {\n // cursor backward tabulation\n const n = Math.max(1, p0);\n for (let i = 0; i < n; i++) {\n this._cursorX = Math.max(0, (Math.ceil(this._cursorX / 8) - 1) * 8);\n }\n break;\n }\n case \"b\": // repeat preceding character\n if (this._lastPrintedChar !== null) {\n for (let index = 0; index < Math.max(1, p0); index += 1) {\n this._writePrintable(this._lastPrintedChar);\n }\n }\n break;\n case \"d\": // line position absolute\n this._cursorY = this._clamp(Math.max(1, p0) - 1, 0, this._rows - 1);\n break;\n case \"e\": // vertical position relative\n this._cursorY = this._clamp(this._cursorY + Math.max(1, p0), 0, this._rows - 1);\n break;\n case \"r\": {\n // set scrolling region\n const top = this._clamp(Math.max(1, p0) - 1, 0, this._rows - 1);\n const bottom = this._clamp((p1 === 0 ? this._rows : p1) - 1, 0, this._rows - 1);\n if (top < bottom) {\n this._scrollTop = top;\n this._scrollBottom = bottom;\n }\n this._cursorX = 0;\n this._cursorY = this._originMode ? this._scrollTop : 0;\n break;\n }\n case \"s\": // save cursor\n this._saveCursor();\n break;\n case \"u\": // restore cursor\n this._restoreCursor();\n break;\n case \"p\":\n if (this._csiPrivate === \"!\") {\n this._resetModes();\n }\n break;\n case \"m\":\n this._applySgr(params);\n break;\n default:\n break;\n }\n }\n\n private _feed(ch: string): void {\n const code = ch.charCodeAt(0);\n\n if (this._state !== State.Normal && (code === 0x18 || code === 0x1a)) {\n this._state = State.Normal;\n return;\n }\n\n if (this._state === State.Csi && code === 0x1b) {\n this._state = State.Escape;\n return;\n }\n\n switch (this._state) {\n case State.Normal:\n this._feedNormal(ch, code);\n break;\n case State.Escape:\n this._feedEscape(ch, code);\n break;\n case State.Csi:\n this._feedCsi(ch, code);\n break;\n case State.Osc:\n // consume until BEL or ST\n if (code === 0x07 || code === 0x9c) {\n this._state = State.Normal;\n } else if (code === 0x1b) {\n this._stringState = State.Osc;\n this._state = State.StringEscape;\n }\n break;\n case State.Str:\n // consume until ST\n if (code === 0x9c) {\n this._state = State.Normal;\n } else if (code === 0x1b) {\n this._stringState = State.Str;\n this._state = State.StringEscape;\n }\n break;\n case State.StringEscape:\n this._state = ch === \"\\\\\" ? State.Normal : this._stringState;\n break;\n case State.EscCharset:\n if (this._charsetTarget === \"g0\") this._g0Charset = ch === \"0\" ? \"graphics\" : \"ascii\";\n if (this._charsetTarget === \"g1\") this._g1Charset = ch === \"0\" ? \"graphics\" : \"ascii\";\n this._charsetTarget = null;\n this._state = State.Normal;\n break;\n case State.EscHash:\n if (ch === \"8\") {\n for (let row = 0; row < this._rows; row += 1) {\n for (let column = 0; column < this._cols; column += 1) {\n this._setChar(row, column, \"E\");\n }\n }\n this._cursorX = 0;\n this._cursorY = 0;\n }\n this._state = State.Normal;\n break;\n }\n }\n\n private _feedNormal(ch: string, code: number): void {\n if (code === 0x1b) {\n this._state = State.Escape;\n } else if (code === 0x9b) {\n // C1 CSI\n this._csiParams = \"\";\n this._csiPrivate = \"\";\n this._state = State.Csi;\n } else if (code === 0x9d) {\n // C1 OSC\n this._state = State.Osc;\n } else if (code === 0x90 || code === 0x98 || code === 0x9e || code === 0x9f) {\n // DCS, SOS, PM, APC\n this._state = State.Str;\n } else if (code === 0x85) {\n // C1 NEL = next line\n this._cursorX = 0;\n this._newline();\n } else if (code === 0x9c) {\n // C1 ST outside a string has no visible effect\n } else if (code === 0x07 || code === 0x05 || code === 0x06) {\n // BEL, ENQ, ACK \u2014 ignore\n } else if (code === 0x08) {\n // BS\n this._pendingWrap = false;\n if (this._cursorX > 0) this._cursorX--;\n } else if (code === 0x7f) {\n // DEL \u2014 ignore in displayed output\n } else if (code === 0x09) {\n // HT\n const nextTabStop = [...this._tabStops]\n .sort((left, right) => left - right)\n .find((tabStop) => tabStop > this._cursorX);\n this._cursorX = nextTabStop ?? this._cols - 1;\n } else if (code === 0x0a || code === 0x0b || code === 0x0c) {\n // LF, VT, FF\n this._newline();\n } else if (code === 0x0d) {\n // CR\n this._pendingWrap = false;\n this._cursorX = 0;\n } else if (code === 0x0e || code === 0x0f) {\n // SO, SI \u2014 shift between G1 and G0 character sets\n this._shiftOut = code === 0x0e;\n } else if (code >= 0x20 && code !== 0x7f) {\n // Printable character (including multi-byte Unicode via code points)\n const charset = this._shiftOut ? this._g1Charset : this._g0Charset;\n this._writePrintable(charset === \"graphics\" ? (DEC_SPECIAL_GRAPHICS[ch] ?? ch) : ch);\n }\n }\n\n private _feedEscape(ch: string, code: number): void {\n this._state = State.Normal;\n\n if (code === 0x5b) {\n // ESC [ = CSI\n this._csiParams = \"\";\n this._csiPrivate = \"\";\n this._state = State.Csi;\n } else if (code === 0x5d) {\n // ESC ] = OSC\n this._state = State.Osc;\n } else if (code === 0x50 || code === 0x58 || code === 0x5e || code === 0x5f) {\n // DCS, SOS, PM, APC\n this._state = State.Str;\n } else if (\n code === 0x28 ||\n code === 0x29 ||\n code === 0x2a ||\n code === 0x2b ||\n code === 0x2d ||\n code === 0x2e\n ) {\n // ESC ( ) * + - . = charset designation (consume next char)\n this._charsetTarget = code === 0x28 ? \"g0\" : code === 0x29 ? \"g1\" : null;\n this._state = State.EscCharset;\n } else if (code === 0x23) {\n // ESC # = line attributes (consume next char)\n this._state = State.EscHash;\n } else if (code === 0x37) {\n // ESC 7 = save cursor\n this._saveCursor();\n } else if (code === 0x38) {\n // ESC 8 = restore cursor\n this._restoreCursor();\n } else if (code === 0x44) {\n // ESC D = index (LF)\n this._newline();\n } else if (code === 0x45) {\n // ESC E = next line\n this._cursorX = 0;\n this._newline();\n } else if (code === 0x4d) {\n // ESC M = reverse index\n if (this._cursorY === this._scrollTop) {\n this._scrollDown(1);\n } else {\n this._cursorY = Math.max(0, this._cursorY - 1);\n }\n } else if (code === 0x48) {\n // ESC H = horizontal tab set\n this._tabStops.add(this._cursorX);\n } else if (code === 0x63) {\n // ESC c = full reset\n this._screen = this._makeScreen(this._cols, this._rows);\n this._cursorX = 0;\n this._cursorY = 0;\n this._scrollTop = 0;\n this._scrollBottom = this._rows - 1;\n this._resetModes();\n this._savedCursor = this._createSavedCursorState();\n }\n // All other ESC sequences: two-char, already consumed \u2014 ignore\n }\n\n private _feedCsi(ch: string, code: number): void {\n if (code >= 0x40 && code <= 0x7e) {\n // Final byte\n this._execCsi(ch);\n this._state = State.Normal;\n } else if (code === 0x3f || code === 0x21 || code === 0x3e || code === 0x20) {\n // Private/intermediate marker (?, !, >, space)\n this._csiPrivate = ch;\n } else if ((code >= 0x30 && code <= 0x39) || code === 0x3b || code === 0x3a) {\n // Digit, semicolon, or colon \u2014 parameter byte\n this._csiParams += ch;\n }\n // Other bytes ignored\n }\n\n private _resetStyle(): void {\n this._style = createDefaultStyleState();\n this._styleSequence = \"\";\n }\n\n private _applySgr(params: number[]): void {\n const normalizedParams = params.length === 0 ? [0] : params;\n\n for (let index = 0; index < normalizedParams.length; index += 1) {\n const value = normalizedParams[index] ?? 0;\n\n switch (value) {\n case 0:\n this._resetStyle();\n break;\n case 1:\n this._style.bold = true;\n break;\n case 2:\n this._style.dim = true;\n break;\n case 3:\n this._style.italic = true;\n break;\n case 4:\n this._style.underline = true;\n break;\n case 7:\n this._style.inverse = true;\n break;\n case 8:\n this._style.conceal = true;\n break;\n case 9:\n this._style.strikethrough = true;\n break;\n case 21:\n case 22:\n this._style.bold = false;\n this._style.dim = false;\n break;\n case 23:\n this._style.italic = false;\n break;\n case 24:\n this._style.underline = false;\n break;\n case 27:\n this._style.inverse = false;\n break;\n case 28:\n this._style.conceal = false;\n break;\n case 29:\n this._style.strikethrough = false;\n break;\n case 39:\n this._style.fg = undefined;\n break;\n case 49:\n this._style.bg = undefined;\n break;\n case 38:\n case 48:\n index = this._applyExtendedColor(value, normalizedParams, index);\n break;\n default:\n if ((value >= 30 && value <= 37) || (value >= 90 && value <= 97)) {\n this._style.fg = [value];\n } else if ((value >= 40 && value <= 47) || (value >= 100 && value <= 107)) {\n this._style.bg = [value];\n }\n break;\n }\n }\n\n this._styleSequence = serializeStyleState(this._style);\n }\n\n private _applyExtendedColor(control: 38 | 48, params: number[], index: number): number {\n const mode = params[index + 1];\n const target = control === 38 ? \"fg\" : \"bg\";\n\n if (mode === 5) {\n const paletteIndex = params[index + 2];\n if (paletteIndex !== undefined) {\n this._style[target] = [control, 5, paletteIndex];\n return index + 2;\n }\n\n return index;\n }\n\n if (mode === 2) {\n const red = params[index + 2];\n const green = params[index + 3];\n const blue = params[index + 4];\n if (red !== undefined && green !== undefined && blue !== undefined) {\n this._style[target] = [control, 2, red, green, blue];\n return index + 4;\n }\n }\n\n return index;\n }\n}\n\nfunction createDefaultStyleState(): SgrStyleState {\n return {\n bold: false,\n dim: false,\n italic: false,\n underline: false,\n inverse: false,\n conceal: false,\n strikethrough: false\n };\n}\n\nfunction isCombiningCodePoint(codePoint: number): boolean {\n return (\n (codePoint >= 0x0300 && codePoint <= 0x036f) ||\n (codePoint >= 0x1ab0 && codePoint <= 0x1aff) ||\n (codePoint >= 0x1dc0 && codePoint <= 0x1dff) ||\n (codePoint >= 0x20d0 && codePoint <= 0x20ff) ||\n (codePoint >= 0xfe20 && codePoint <= 0xfe2f)\n );\n}\n\nfunction serializeStyleState(state: SgrStyleState): string {\n const codes: number[] = [];\n\n if (state.bold) {\n codes.push(1);\n }\n if (state.dim) {\n codes.push(2);\n }\n if (state.italic) {\n codes.push(3);\n }\n if (state.underline) {\n codes.push(4);\n }\n if (state.inverse) {\n codes.push(7);\n }\n if (state.conceal) {\n codes.push(8);\n }\n if (state.strikethrough) {\n codes.push(9);\n }\n if (state.fg !== undefined) {\n codes.push(...state.fg);\n }\n if (state.bg !== undefined) {\n codes.push(...state.bg);\n }\n\n return codes.length === 0 ? \"\" : `\\x1b[${codes.join(\";\")}m`;\n}\n", "const NAMED_KEY_SEQUENCES = {\n Enter: \"\\r\",\n Tab: \"\\t\",\n Escape: \"\\x1b\",\n Backspace: \"\\x7f\",\n Delete: \"\\x1b[3~\",\n ArrowUp: \"\\x1b[A\",\n ArrowDown: \"\\x1b[B\",\n ArrowRight: \"\\x1b[C\",\n ArrowLeft: \"\\x1b[D\",\n Home: \"\\x1b[H\",\n End: \"\\x1b[F\",\n PageUp: \"\\x1b[5~\",\n PageDown: \"\\x1b[6~\",\n Space: \" \"\n} as const;\n\nconst NAMED_KEY_LOWER = new Map(\n (Object.entries(NAMED_KEY_SEQUENCES) as [string, string][]).map(([k, v]) => [k.toLowerCase(), v])\n);\n\nconst VALID_KEYS_HINT = `Valid keys: ${Object.keys(NAMED_KEY_SEQUENCES).join(\", \")}, Control+<letter>, Alt+<key>`;\nconst NAMED_KEY_PATTERN = Object.keys(NAMED_KEY_SEQUENCES).map(caseInsensitivePattern).join(\"|\");\n\nexport const TERMINAL_KEY_PATTERN = `^(?:${NAMED_KEY_PATTERN}|.|[Cc][Oo][Nn][Tt][Rr][Oo][Ll]\\\\+[A-Za-z]|[Aa][Ll][Tt]\\\\+.+)$`;\n\nfunction unknownKeyError(key: string): Error {\n return new Error(`Unknown terminal key: ${key}. ${VALID_KEYS_HINT}`);\n}\n\nexport type TerminalKey =\n | \"Enter\"\n | \"Tab\"\n | \"Escape\"\n | \"Backspace\"\n | \"Delete\"\n | \"ArrowUp\"\n | \"ArrowDown\"\n | \"ArrowLeft\"\n | \"ArrowRight\"\n | \"Home\"\n | \"End\"\n | \"PageUp\"\n | \"PageDown\"\n | \"Space\"\n | `Control+${string}`\n | `Alt+${string}`;\n\nexport function keyToSequence(key: TerminalKey): string {\n const lowerKey = (key as string).toLowerCase();\n\n const namedSequence = NAMED_KEY_LOWER.get(lowerKey);\n if (namedSequence !== undefined) {\n return namedSequence;\n }\n\n if (lowerKey.startsWith(\"control+\")) {\n return controlKeyToSequence((key as string).slice(\"control+\".length));\n }\n\n if (lowerKey.startsWith(\"alt+\")) {\n const nestedKey = (key as string).slice(\"alt+\".length);\n if (nestedKey.length === 0) {\n throw unknownKeyError(key);\n }\n\n if (nestedKey.length === 1) {\n return \"\\x1b\" + nestedKey;\n }\n\n try {\n return \"\\x1b\" + keyToSequence(nestedKey as TerminalKey);\n } catch {\n throw unknownKeyError(key);\n }\n }\n\n if ((key as string).length === 1) {\n return key as string;\n }\n\n throw unknownKeyError(key);\n}\n\nfunction controlKeyToSequence(controlKey: string): string {\n if (controlKey.length !== 1) {\n throw unknownKeyError(`Control+${controlKey}`);\n }\n\n const uppercaseLetter = controlKey.toUpperCase();\n const charCode = uppercaseLetter.charCodeAt(0);\n if (charCode < 65 || charCode > 90) {\n throw unknownKeyError(`Control+${controlKey}`);\n }\n\n return String.fromCharCode(charCode - 64);\n}\n\nfunction caseInsensitivePattern(value: string): string {\n let pattern = \"\";\n\n for (const character of value) {\n const lower = character.toLowerCase();\n const upper = character.toUpperCase();\n pattern += lower === upper ? escapePatternCharacter(character) : `[${upper}${lower}]`;\n }\n\n return pattern;\n}\n\nfunction escapePatternCharacter(character: string): string {\n return character.replace(/[\\\\^$.*+?()[\\]{}|]/g, \"\\\\$&\");\n}\n", "import { stripAnsi } from \"./ansi.js\";\n\nexport class TerminalScreen {\n readonly lines: readonly string[];\n readonly rawLines: readonly string[];\n readonly cursor: { row: number; col: number };\n readonly size: { rows: number; cols: number };\n\n constructor({\n lines,\n rawLines,\n cursor,\n size\n }: {\n lines: string[];\n rawLines: string[];\n cursor: { row: number; col: number };\n size: { rows: number; cols: number };\n }) {\n this.lines = Object.freeze(lines.map((line) => stripAnsi(line)));\n this.rawLines = Object.freeze([...rawLines]);\n this.cursor = Object.freeze({ ...cursor });\n this.size = Object.freeze({ ...size });\n\n Object.freeze(this);\n }\n\n get text(): string {\n return this.lines.join(\"\\n\");\n }\n\n contains(substring: string): boolean {\n return this.text.includes(substring);\n }\n\n line(index: number): string {\n const normalizedIndex = index < 0 ? this.lines.length + index : index;\n const line = this.lines[normalizedIndex];\n\n if (line === undefined) {\n throw new RangeError(`Line index out of bounds: ${index}`);\n }\n\n return line;\n }\n}\n", "import { UserError } from \"toolcraft\";\nimport type { HandlerEnv } from \"toolcraft\";\nimport type { TerminalPilotInstallerServices } from \"./installer.js\";\nimport { TerminalPilot, type NewSessionOptions } from \"../terminal-pilot.js\";\nimport type { TerminalSession } from \"../terminal-session.js\";\n\nexport const SESSION_ENV_VAR = \"TERMINAL_PILOT_SESSION\";\n\ntype SessionLike = Pick<\n TerminalSession,\n | \"id\"\n | \"command\"\n | \"pid\"\n | \"exitCode\"\n | \"fill\"\n | \"type\"\n | \"press\"\n | \"signal\"\n | \"waitFor\"\n | \"waitForExit\"\n | \"screen\"\n | \"history\"\n | \"resize\"\n | \"close\"\n>;\n\ntype PilotLike = Pick<TerminalPilot, \"newSession\" | \"getSession\" | \"deleteSession\" | \"sessions\">;\ntype ClosablePilotLike = PilotLike & Pick<TerminalPilot, \"close\">;\n\ntype NamedSession = {\n name: string;\n session: SessionLike;\n};\n\ntype CreateSessionParams = NewSessionOptions & {\n session?: string;\n};\n\nexport interface TerminalPilotRuntime {\n createSession(params: CreateSessionParams, env?: HandlerEnv): Promise<NamedSession>;\n resolveSession(name: string | undefined, env?: HandlerEnv): Promise<NamedSession>;\n closeSession(\n name: string | undefined,\n env?: HandlerEnv\n ): Promise<{ exitCode: number; name: string }>;\n listSessions(): Promise<NamedSession[]>;\n hasRetainedSessions(): Promise<boolean>;\n close(): Promise<void>;\n}\n\nexport interface TerminalPilotCommandServices {\n terminalPilotRuntime?: TerminalPilotRuntime;\n terminalPilotInstaller?: TerminalPilotInstallerServices;\n}\n\ninterface CreateTerminalPilotRuntimeOptions {\n launchPilot?: () => Promise<ClosablePilotLike>;\n}\n\nlet sharedRuntime: TerminalPilotRuntime | undefined;\n\nexport function getTerminalPilotRuntime(\n runtime: TerminalPilotRuntime | undefined\n): TerminalPilotRuntime {\n if (runtime !== undefined) {\n return runtime;\n }\n\n sharedRuntime ??= createTerminalPilotRuntime();\n return sharedRuntime;\n}\n\nexport function createTerminalPilotRuntime(\n options: CreateTerminalPilotRuntimeOptions = {}\n): TerminalPilotRuntime {\n const launchPilot = options.launchPilot ?? TerminalPilot.launch;\n const nameToId = new Map<string, string>();\n const idToName = new Map<string, string>();\n const pendingNames = new Set<string>();\n let pilotPromise: Promise<ClosablePilotLike> | undefined;\n\n function getRequestedName(name: string | undefined, env?: HandlerEnv): string | undefined {\n const requestedName = name ?? env?.get(SESSION_ENV_VAR);\n\n if (requestedName !== undefined && requestedName.trim().length === 0) {\n throw new UserError(\"Session name must not be empty.\");\n }\n\n return requestedName;\n }\n\n async function getPilot(): Promise<ClosablePilotLike> {\n pilotPromise ??= launchPilot();\n return pilotPromise;\n }\n\n function nextSessionName(): string {\n let index = 1;\n\n while (nameToId.has(`s${index}`) || pendingNames.has(`s${index}`)) {\n index += 1;\n }\n\n return `s${index}`;\n }\n\n function rememberSession(name: string, session: SessionLike): NamedSession {\n nameToId.set(name, session.id);\n idToName.set(session.id, name);\n return { name, session };\n }\n\n function forgetSession(name: string, sessionId: string): void {\n if (nameToId.get(name) === sessionId) {\n nameToId.delete(name);\n }\n if (idToName.get(sessionId) === name) {\n idToName.delete(sessionId);\n }\n }\n\n function formatAvailableSessions(names: string[]): string {\n if (names.length === 0) {\n return \"No active sessions are available.\";\n }\n\n return `Available sessions: ${names.join(\", \")}.`;\n }\n\n async function lookupNamedSession(name: string): Promise<NamedSession> {\n const sessionId = nameToId.get(name);\n\n if (sessionId === undefined) {\n const active = await listSessions();\n throw new UserError(\n `Session \"${name}\" was not found. ${formatAvailableSessions(active.map((entry) => entry.name))}`\n );\n }\n\n const pilot = await getPilot();\n\n try {\n return { name, session: pilot.getSession(sessionId) };\n } catch {\n forgetSession(name, sessionId);\n const active = await listSessions();\n throw new UserError(\n `Session \"${name}\" was not found. ${formatAvailableSessions(active.map((entry) => entry.name))}`\n );\n }\n }\n\n async function listSessions(): Promise<NamedSession[]> {\n const pilot = await getPilot();\n\n return pilot.sessions().flatMap((session) => {\n const name = idToName.get(session.id);\n\n if (name === undefined) {\n return [];\n }\n\n return [{ name, session }];\n });\n }\n\n async function discardExitedSessionName(name: string): Promise<void> {\n const sessionId = nameToId.get(name);\n if (sessionId === undefined) {\n return;\n }\n\n const pilot = await getPilot();\n try {\n const session = pilot.getSession(sessionId);\n if (session.exitCode === null) {\n return;\n }\n pilot.deleteSession(sessionId);\n } catch {\n // Missing sessions no longer reserve public names.\n }\n forgetSession(name, sessionId);\n }\n\n return {\n async createSession(params: CreateSessionParams, env?: HandlerEnv): Promise<NamedSession> {\n if (params.command.trim().length === 0) {\n throw new UserError(\"Command must not be empty.\");\n }\n\n const requestedName = getRequestedName(params.session, env) ?? nextSessionName();\n\n await discardExitedSessionName(requestedName);\n\n if (nameToId.has(requestedName) || pendingNames.has(requestedName)) {\n throw new UserError(`Session \"${requestedName}\" already exists.`);\n }\n\n pendingNames.add(requestedName);\n try {\n const pilot = await getPilot();\n const session = await pilot.newSession({\n command: params.command,\n args: params.args,\n cwd: params.cwd,\n cols: params.cols,\n rows: params.rows,\n observe: params.observe\n });\n\n return rememberSession(requestedName, session);\n } finally {\n pendingNames.delete(requestedName);\n }\n },\n\n async resolveSession(name: string | undefined, env?: HandlerEnv): Promise<NamedSession> {\n const requestedName = getRequestedName(name, env);\n\n if (requestedName !== undefined) {\n return lookupNamedSession(requestedName);\n }\n\n const active = await listSessions();\n\n if (active.length === 1) {\n return active[0] as NamedSession;\n }\n\n if (active.length === 0) {\n throw new UserError(\"No active sessions. Create one with create-session.\");\n }\n\n throw new UserError(\n `Multiple active sessions require an explicit session name. Pass --session or set ${SESSION_ENV_VAR}. ${formatAvailableSessions(active.map((entry) => entry.name))}`\n );\n },\n\n async closeSession(\n name: string | undefined,\n env?: HandlerEnv\n ): Promise<{ exitCode: number; name: string }> {\n const namedSession = await this.resolveSession(name, env);\n const exitCode = await namedSession.session.close();\n const pilot = await getPilot();\n\n pilot.deleteSession(namedSession.session.id);\n forgetSession(namedSession.name, namedSession.session.id);\n\n return {\n exitCode,\n name: namedSession.name\n };\n },\n listSessions,\n\n async hasRetainedSessions(): Promise<boolean> {\n return nameToId.size > 0 || pendingNames.size > 0;\n },\n\n async close(): Promise<void> {\n if (pilotPromise === undefined) {\n return;\n }\n\n const pilot = await pilotPromise;\n await pilot.close();\n pilotPromise = undefined;\n nameToId.clear();\n idToName.clear();\n pendingNames.clear();\n }\n };\n}\n\nexport async function closeSharedTerminalPilotRuntime(): Promise<void> {\n if (sharedRuntime === undefined) {\n return;\n }\n\n await sharedRuntime.close();\n sharedRuntime = undefined;\n}\n", "import { defineCommand, S } from \"toolcraft\";\nimport { getTerminalPilotRuntime, type TerminalPilotCommandServices } from \"./runtime.js\";\n\nconst params = S.Object({\n session: S.Optional(\n S.String({ short: \"s\", description: \"Session name\", minLength: 1, pattern: \"\\\\S\" })\n )\n});\n\nexport const closeSession = defineCommand<\n TerminalPilotCommandServices,\n \"close-session\",\n typeof params,\n undefined,\n { exitCode: number },\n readonly [\"cli\", \"mcp\", \"sdk\"]\n>({\n name: \"close-session\",\n description: \"Close an active terminal session\",\n scope: [\"cli\", \"mcp\", \"sdk\"],\n params,\n handler: async ({ params, env, terminalPilotRuntime }) => {\n const { exitCode } = await getTerminalPilotRuntime(terminalPilotRuntime).closeSession(\n params.session,\n env\n );\n return { exitCode };\n }\n});\n"],
5
5
  "mappings": ";AAAA,SAAS,iBAAAA,sBAAqB;;;ACAvB,IAAM,YAAN,cAAwB,MAAM;AAAA,EACnC,YAAY,SAAiB,SAAwB;AACnD,UAAM,SAAS,OAAO;AACtB,SAAK,OAAO;AAAA,EACd;AACF;;;ACGO,SAAS,4BAAqE,QAK5E;AACP,QAAM,QAAQ,MAAM,QAAQ,OAAO,QAAQ,IAAI,UAAU;AAEzD,MAAI,OAAO,YAAY,QAAQ,OAAO,gBAAgB,UAAa,OAAO,gBAAgB,MAAM;AAC9F,UAAM,IAAI,MAAM,GAAG,KAAK,KAAK,OAAO,IAAI,gDAAgD;AAAA,EAC1F;AAEA,MAAI,OAAO,gBAAgB,UAAa,OAAO,gBAAgB,MAAM;AACnE;AAAA,EACF;AAEA,MAAI,OAAO,YAAY,SAAS,UAAU,OAAO,YAAY,SAAS,SAAS;AAC7E,UAAM,IAAI,MAAM,GAAG,KAAK,KAAK,OAAO,IAAI,+CAA+C;AAAA,EACzF;AAEA,MAAI,OAAO,OAAO,YAAY,YAAY,YAAY;AACpD,UAAM,IAAI,MAAM,GAAG,KAAK,KAAK,OAAO,IAAI,2CAA2C;AAAA,EACrF;AAEA,MAAI,OAAO,YAAY,SAAS,UAAa,OAAO,OAAO,YAAY,SAAS,YAAY;AAC1F,UAAM,IAAI,MAAM,GAAG,KAAK,KAAK,OAAO,IAAI,wCAAwC;AAAA,EAClF;AACF;AAEO,SAAS,0BAId,kBACA,kBACsC;AACtC,MAAI,qBAAqB,QAAW;AAClC,WAAO;AAAA,EACT;AAEA,SAAO;AACT;;;ACvCO,SAAS,OAAwB;AACtC,SAAO;AAAA,IACL,MAAM;AAAA,EACR;AACF;;;ACKA,SAAS,oBACP,UACA,eACM;AACN,MAAI,OAAO,KAAK,QAAQ,EAAE,WAAW,GAAG;AACtC,UAAM,IAAI,MAAM,2CAA2C;AAAA,EAC7D;AAEA,aAAW,CAAC,YAAY,MAAM,KAAK,OAAO,QAAQ,QAAQ,GAAG;AAC3D,QAAI,OAAO,UAAU,eAAe,KAAK,OAAO,OAAO,aAAa,GAAG;AACrE,YAAM,IAAI;AAAA,QACR,iBAAiB,UAAU,2CAA2C,aAAa;AAAA,MACrF;AAAA,IACF;AAAA,EACF;AACF;AAEO,SAAS,MAGd,QAGyC;AACzC,sBAAoB,OAAO,UAAU,OAAO,aAAa;AAEzD,SAAO;AAAA,IACL,MAAM;AAAA,IACN,eAAe,OAAO;AAAA,IACtB,UAAU,OAAO;AAAA,EACnB;AACF;;;AC3CO,SAAS,OAAiC,OAAqC;AACpF,SAAO;AAAA,IACL,MAAM;AAAA,IACN;AAAA,EACF;AACF;;;ACHA,SAAS,iBAAiB,QAAwD;AAChF,SAAO,OAAO,SAAS;AACzB;AAEA,SAAS,gBAAgB,QAAqC;AAC5D,SAAO,OAAO,KAAK,OAAO,KAAK,EAC5B,OAAO,CAAC,QAAQ,CAAC,iBAAiB,OAAO,MAAM,GAAG,CAAc,CAAC,EACjE,KAAK;AACV;AAEO,SAAS,0BAA0B,QAAmC;AAC3E,SAAO,gBAAgB,MAAM,EAAE,KAAK,GAAG;AACzC;AAEA,SAAS,oCAAoC,UAA8C;AACzF,QAAM,eAAe,oBAAI,IAAoD;AAE7E,WAAS,QAAQ,CAAC,QAAQ,UAAU;AAClC,UAAM,eAAe,gBAAgB,MAAM;AAC3C,UAAM,cAAc,KAAK,UAAU,YAAY;AAC/C,UAAM,WAAW,aAAa,IAAI,WAAW;AAE7C,QAAI,aAAa,QAAW;AAC1B,mBAAa,IAAI,aAAa;AAAA,QAC5B,SAAS,aAAa,KAAK,GAAG;AAAA,QAC9B,SAAS,CAAC,KAAK;AAAA,MACjB,CAAC;AACD;AAAA,IACF;AAEA,aAAS,QAAQ,KAAK,KAAK;AAAA,EAC7B,CAAC;AAED,aAAW,EAAE,SAAS,QAAQ,KAAK,aAAa,OAAO,GAAG;AACxD,QAAI,QAAQ,SAAS,GAAG;AACtB,YAAM,IAAI;AAAA,QACR,mBAAmB,QAAQ,KAAK,IAAI,CAAC,qCAAqC,OAAO;AAAA,MACnF;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAASC,qBAAoB,UAA8C;AACzE,MAAI,SAAS,WAAW,GAAG;AACzB,UAAM,IAAI,MAAM,2CAA2C;AAAA,EAC7D;AAEA,sCAAoC,QAAQ;AAC9C;AAEO,SAAS,MACd,UACwB;AACxB,EAAAA,qBAAoB,QAAQ;AAE5B,SAAO;AAAA,IACL,MAAM;AAAA,IACN;AAAA,EACF;AACF;;;AC9CA,IAAM,eAAe,uBAAO,cAAc;AAEnC,SAAS,SACd,QACA,OAC6B;AAC7B,QAAM,QAAyB,EAAE,QAAQ,CAAC,EAAE;AAC5C,QAAM,SAAS,WAAW,QAAQ,OAAO,CAAC,GAAG,KAAK;AAElD,MAAI,MAAM,OAAO,SAAS,GAAG;AAC3B,WAAO,EAAE,IAAI,OAAO,QAAQ,MAAM,OAAO;AAAA,EAC3C;AAEA,SAAO,EAAE,IAAI,MAAM,OAAQ,OAAO,UAAU,OAAO,QAAQ,OAAwB;AACrF;AAEA,SAAS,WACP,QACA,OACAC,OACA,OACY;AACZ,MAAI,OAAO,SAAS,YAAY;AAC9B,WAAO,aAAa,QAAQ,OAAOA,OAAM,KAAK;AAAA,EAChD;AAEA,MAAI,UAAU,cAAc;AAC1B;AAAA,MACE;AAAA,MACAA;AAAA,MACA,YAAY,MAAM;AAAA,MAClB;AAAA,MACA,YAAY,YAAY,MAAM,CAAC,OAAO,WAAWA,KAAI,CAAC;AAAA,IACxD;AACA,WAAO,EAAE,SAAS,MAAM;AAAA,EAC1B;AAEA,MAAI,UAAU,QAAQ,OAAO,aAAa,MAAM;AAC9C,WAAO,EAAE,SAAS,MAAM,MAAM;AAAA,EAChC;AAEA,UAAQ,OAAO,MAAM;AAAA,IACnB,KAAK;AACH,aAAO,WAAW,QAAQ,OAAOA,OAAM,KAAK;AAAA,IAE9C,KAAK;AACH,aAAO,WAAW,QAAQ,OAAOA,OAAM,KAAK;AAAA,IAE9C,KAAK;AACH,aAAO,YAAY,OAAOA,OAAM,KAAK;AAAA,IAEvC,KAAK;AACH,aAAO,SAAS,QAAQ,OAAOA,OAAM,KAAK;AAAA,IAE5C,KAAK;AACH,aAAO,UAAU,QAAQ,OAAOA,OAAM,KAAK;AAAA,IAE7C,KAAK;AACH,aAAO,WAAW,QAAQ,OAAOA,OAAM,KAAK;AAAA,IAE9C,KAAK;AACH,aAAO,UAAU,QAAQ,OAAOA,OAAM,KAAK;AAAA,IAE7C,KAAK;AACH,aAAO,UAAU,QAAQ,OAAOA,OAAM,KAAK;AAAA,IAE7C,KAAK;AACH,aAAO,WAAW,QAAQ,OAAOA,OAAM,KAAK;AAAA,IAE9C,KAAK;AACH,aAAO,SAAS,OAAOA,OAAM,KAAK;AAAA,EACtC;AACF;AAEA,SAAS,aACP,QACA,OACAA,OACA,OACY;AACZ,MAAI,UAAU,gBAAgB,UAAU,QAAW;AACjD,UAAM,eAAe,WAAW,OAAO,KAAK;AAE5C,QAAI,aAAa,SAAS;AACxB,aAAO,WAAW,OAAO,OAAO,aAAa,aAAa,KAAK,GAAGA,OAAM,KAAK;AAAA,IAC/E;AAEA,WAAO,EAAE,SAAS,MAAM;AAAA,EAC1B;AAEA,SAAO,WAAW,OAAO,OAAO,OAAOA,OAAM,KAAK;AACpD;AAEA,SAAS,WACP,QACA,OACAA,OACA,OACY;AACZ,MAAI,OAAO,UAAU,UAAU;AAC7B,qBAAiB,OAAOA,OAAM,UAAU,KAAK;AAC7C,WAAO,EAAE,SAAS,MAAM,MAAM;AAAA,EAChC;AAEA,MAAI,OAAO,cAAc,UAAa,MAAM,SAAS,OAAO,WAAW;AACrE,UAAM,WAAW,+BAA+B,OAAO,SAAS;AAChE;AAAA,MACE;AAAA,MACAA;AAAA,MACA;AAAA,MACA,sBAAsB,MAAM,MAAM;AAAA,MAClC,YAAY,QAAQ,OAAO,WAAWA,KAAI,CAAC;AAAA,IAC7C;AAAA,EACF;AAEA,MAAI,OAAO,cAAc,UAAa,MAAM,SAAS,OAAO,WAAW;AACrE,UAAM,WAAW,8BAA8B,OAAO,SAAS;AAC/D;AAAA,MACE;AAAA,MACAA;AAAA,MACA;AAAA,MACA,sBAAsB,MAAM,MAAM;AAAA,MAClC,YAAY,QAAQ,OAAO,WAAWA,KAAI,CAAC;AAAA,IAC7C;AAAA,EACF;AAEA,MAAI,OAAO,YAAY,QAAW;AAChC,UAAM,UAAU,eAAe,OAAO,OAAO;AAE7C,QAAI,YAAY,UAAa,CAAC,QAAQ,KAAK,KAAK,GAAG;AACjD,YAAM,WAAW,2BAA2B,OAAO,OAAO;AAC1D,eAAS,OAAOA,OAAM,UAAU,OAAO,YAAY,QAAQ,OAAO,WAAWA,KAAI,CAAC,EAAE;AAAA,IACtF;AAAA,EACF;AAEA,SAAO,EAAE,SAAS,MAAM,MAAM;AAChC;AAEA,SAAS,WACP,QACA,OACAA,OACA,OACY;AACZ,MAAI,OAAO,UAAU,YAAY,CAAC,OAAO,SAAS,KAAK,GAAG;AACxD,qBAAiB,OAAOA,OAAM,OAAO,aAAa,YAAY,YAAY,UAAU,KAAK;AACzF,WAAO,EAAE,SAAS,MAAM,MAAM;AAAA,EAChC;AAEA,MAAI,OAAO,aAAa,aAAa,CAAC,OAAO,UAAU,KAAK,GAAG;AAC7D,qBAAiB,OAAOA,OAAM,WAAW,KAAK;AAAA,EAChD;AAEA,MAAI,OAAO,YAAY,UAAa,QAAQ,OAAO,SAAS;AAC1D,UAAM,WAAW,mCAAmC,OAAO,OAAO;AAClE,aAAS,OAAOA,OAAM,UAAU,OAAO,KAAK,GAAG,YAAY,QAAQ,OAAO,WAAWA,KAAI,CAAC,EAAE;AAAA,EAC9F;AAEA,MAAI,OAAO,YAAY,UAAa,QAAQ,OAAO,SAAS;AAC1D,UAAM,WAAW,gCAAgC,OAAO,OAAO;AAC/D,aAAS,OAAOA,OAAM,UAAU,OAAO,KAAK,GAAG,YAAY,QAAQ,OAAO,WAAWA,KAAI,CAAC,EAAE;AAAA,EAC9F;AAEA,SAAO,EAAE,SAAS,MAAM,MAAM;AAChC;AAEA,SAAS,YAAY,OAAgBA,OAAyB,OAAoC;AAChG,MAAI,OAAO,UAAU,WAAW;AAC9B,qBAAiB,OAAOA,OAAM,WAAW,KAAK;AAAA,EAChD;AAEA,SAAO,EAAE,SAAS,MAAM,MAAM;AAChC;AAEA,SAAS,SACP,QACA,OACAA,OACA,OACY;AACZ,MAAI,CAAC,OAAO,OAAO,SAAS,KAAc,GAAG;AAC3C,UAAM,WAAW,UAAU,OAAO,OAAO,KAAK,IAAI,CAAC;AACnD;AAAA,MACE;AAAA,MACAA;AAAA,MACA;AAAA,MACA,cAAc,KAAK;AAAA,MACnB,YAAY,QAAQ,OAAO,WAAWA,KAAI,CAAC;AAAA,IAC7C;AAAA,EACF;AAEA,SAAO,EAAE,SAAS,MAAM,MAAM;AAChC;AAEA,SAAS,UACP,QACA,OACAA,OACA,OACY;AACZ,MAAI,CAAC,MAAM,QAAQ,KAAK,GAAG;AACzB,qBAAiB,OAAOA,OAAM,SAAS,KAAK;AAC5C,WAAO,EAAE,SAAS,MAAM,MAAM;AAAA,EAChC;AAEA,MAAI,OAAO,aAAa,UAAa,MAAM,SAAS,OAAO,UAAU;AACnE,UAAM,WAAW,uBAAuB,OAAO,QAAQ;AACvD;AAAA,MACE;AAAA,MACAA;AAAA,MACA;AAAA,MACA,cAAc,MAAM,MAAM;AAAA,MAC1B,YAAY,QAAQ,OAAO,WAAWA,KAAI,CAAC;AAAA,IAC7C;AAAA,EACF;AAEA,MAAI,OAAO,aAAa,UAAa,MAAM,SAAS,OAAO,UAAU;AACnE,UAAM,WAAW,sBAAsB,OAAO,QAAQ;AACtD;AAAA,MACE;AAAA,MACAA;AAAA,MACA;AAAA,MACA,cAAc,MAAM,MAAM;AAAA,MAC1B,YAAY,QAAQ,OAAO,WAAWA,KAAI,CAAC;AAAA,IAC7C;AAAA,EACF;AAEA,QAAM,YAAY,MAAM,IAAI,CAAC,MAAM,UAAU;AAC3C,UAAM,SAAS,WAAW,OAAO,MAAM,MAAM,CAAC,GAAGA,OAAM,OAAO,KAAK,CAAC,GAAG,KAAK;AAE5E,WAAO,OAAO,UAAU,OAAO,QAAQ;AAAA,EACzC,CAAC;AAED,SAAO,EAAE,SAAS,MAAM,OAAO,UAAU;AAC3C;AAEA,SAAS,WACP,QACA,OACAA,OACA,OACA,qBAA8C,CAAC,GACnC;AACZ,MAAI,CAAC,cAAc,KAAK,GAAG;AACzB,qBAAiB,OAAOA,OAAM,UAAU,KAAK;AAC7C,WAAO,EAAE,SAAS,MAAM,MAAM;AAAA,EAChC;AAEA,QAAM,YAAqC,CAAC;AAC5C,QAAM,cAAc,oBAAI,IAAI,CAAC,GAAG,OAAO,KAAK,OAAO,KAAK,GAAG,GAAG,OAAO,KAAK,kBAAkB,CAAC,CAAC;AAE9F,aAAW,CAAC,KAAK,cAAc,KAAK,OAAO,QAAQ,OAAO,KAAK,GAAiC;AAC9F,UAAM,gBAAgB,OAAO,OAAO,OAAO,GAAG,IAAI,MAAM,GAAG,IAAI;AAC/D,UAAM,SAAS,WAAW,gBAAgB,eAAe,CAAC,GAAGA,OAAM,GAAG,GAAG,KAAK;AAE9E,QAAI,OAAO,SAAS;AAClB,kBAAY,WAAW,KAAK,OAAO,KAAK;AAAA,IAC1C;AAAA,EACF;AAEA,aAAW,CAAC,KAAK,aAAa,KAAK,OAAO,QAAQ,kBAAkB,GAAG;AACrE,QAAI,OAAO,OAAO,OAAO,GAAG,GAAG;AAC7B,kBAAY,WAAW,KAAK,MAAM,GAAG,CAAC;AAAA,IACxC,OAAO;AACL,kBAAY,WAAW,KAAK,aAAa;AAAA,IAC3C;AAAA,EACF;AAEA,aAAW,CAAC,KAAK,aAAa,KAAK,OAAO,QAAQ,KAAK,GAAG;AACxD,QAAI,YAAY,IAAI,GAAG,GAAG;AACxB;AAAA,IACF;AAEA,QAAI,OAAO,yBAAyB,MAAM;AACxC,kBAAY,WAAW,KAAK,aAAa;AAAA,IAC3C,OAAO;AACL,iCAA2B,OAAO,CAAC,GAAGA,OAAM,GAAG,CAAC;AAAA,IAClD;AAAA,EACF;AAEA,SAAO,EAAE,SAAS,MAAM,OAAO,UAAU;AAC3C;AAEA,SAAS,UACP,QACA,OACAA,OACA,OACY;AACZ,MAAI,CAAC,cAAc,KAAK,GAAG;AACzB,qBAAiB,OAAOA,OAAM,UAAU,KAAK;AAC7C,WAAO,EAAE,SAAS,MAAM,MAAM;AAAA,EAChC;AAEA,QAAM,qBAAqB,MAAM,OAAO,aAAa;AACrD,QAAM,oBAAoB,CAAC,GAAGA,OAAM,OAAO,aAAa;AACxD,QAAM,eAAe,OAAO,KAAK,OAAO,QAAQ;AAChD,QAAM,WAAW,UAAU,aAAa,KAAK,IAAI,CAAC;AAElD,MAAI,CAAC,OAAO,OAAO,OAAO,OAAO,aAAa,GAAG;AAC/C;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,0BAA0B,OAAO,aAAa,QAAQ,WAAWA,KAAI,CAAC,sBAAsB,aAAa,KAAK,IAAI,CAAC;AAAA,IACrH;AACA,WAAO,EAAE,SAAS,MAAM,MAAM;AAAA,EAChC;AAEA,MACE,OAAO,uBAAuB,YAC9B,CAAC,OAAO,OAAO,OAAO,UAAU,kBAAkB,GAClD;AACA;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA,cAAc,kBAAkB;AAAA,MAChC,YAAY,QAAQ,OAAO,WAAW,iBAAiB,CAAC,SAAS,4BAA4B,kBAAkB,CAAC;AAAA,IAClH;AACA,WAAO,EAAE,SAAS,MAAM,MAAM;AAAA,EAChC;AAEA,SAAO,WAAW,OAAO,SAAS,kBAAkB,GAAG,OAAOA,OAAM,OAAO;AAAA,IACzE,CAAC,OAAO,aAAa,GAAG;AAAA,EAC1B,CAAC;AACH;AAEA,SAAS,UACP,QACA,OACAA,OACA,OACY;AACZ,MAAI,cAAc,KAAK,GAAG;AACxB,UAAM,oBAAoB,OAAO,SAAS,OAAO,CAAC,WAAW,gBAAgB,QAAQ,KAAK,CAAC;AAE3F,QAAI,kBAAkB,WAAW,GAAG;AAClC,aAAO,WAAW,kBAAkB,CAAC,GAAG,OAAOA,OAAM,KAAK;AAAA,IAC5D;AAAA,EACF;AAEA,QAAM,UAA0D,CAAC;AAEjE,aAAW,UAAU,OAAO,UAAU;AACpC,UAAM,cAA+B,EAAE,QAAQ,CAAC,EAAE;AAClD,UAAM,SAAS,WAAW,QAAQ,OAAOA,OAAM,WAAW;AAE1D,QAAI,YAAY,OAAO,WAAW,KAAK,OAAO,SAAS;AACrD,cAAQ,KAAK,EAAE,aAAa,0BAA0B,MAAM,GAAG,OAAO,OAAO,MAAM,CAAC;AAAA,IACtF;AAAA,EACF;AAEA,MAAI,QAAQ,WAAW,GAAG;AACxB,WAAO,EAAE,SAAS,MAAM,OAAO,QAAQ,CAAC,EAAE,MAAM;AAAA,EAClD;AAEA,MAAI,QAAQ,WAAW,GAAG;AACxB,UAAM,qBAAqB,OAAO,SAAS,IAAI,CAAC,WAAW,0BAA0B,MAAM,CAAC;AAC5F;AAAA,MACE;AAAA,MACAA;AAAA,MACA;AAAA,MACA;AAAA,MACA,8BAA8B,WAAWA,KAAI,CAAC,WAAW,OAAO,SAAS,MAAM,+BAA+B,mBAAmB,KAAK,KAAK,CAAC;AAAA,IAC9I;AACA,WAAO,EAAE,SAAS,MAAM,MAAM;AAAA,EAChC;AAEA;AAAA,IACE;AAAA,IACAA;AAAA,IACA;AAAA,IACA,GAAG,QAAQ,MAAM;AAAA,IACjB,wCAAwC,WAAWA,KAAI,CAAC,uCAAuC,QAAQ,IAAI,CAAC,UAAU,MAAM,WAAW,EAAE,KAAK,KAAK,CAAC;AAAA,EACtJ;AACA,SAAO,EAAE,SAAS,MAAM,MAAM;AAChC;AAEA,SAAS,gBAAgB,QAA2B,OAAyC;AAC3F,aAAW,CAAC,KAAK,cAAc,KAAK,OAAO,QAAQ,OAAO,KAAK,GAAiC;AAC9F,QAAI,eAAe,SAAS,cAAc,CAAC,OAAO,OAAO,OAAO,GAAG,GAAG;AACpE,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,WACP,QACA,OACAA,OACA,OACY;AACZ,MAAI,CAAC,cAAc,KAAK,GAAG;AACzB,qBAAiB,OAAOA,OAAM,UAAU,KAAK;AAC7C,WAAO,EAAE,SAAS,MAAM,MAAM;AAAA,EAChC;AAEA,QAAM,YAAqC,CAAC;AAE5C,aAAW,CAAC,KAAK,aAAa,KAAK,OAAO,QAAQ,KAAK,GAAG;AACxD,UAAM,SAAS,WAAW,OAAO,OAAO,eAAe,CAAC,GAAGA,OAAM,GAAG,GAAG,KAAK;AAE5E,QAAI,OAAO,SAAS;AAClB,kBAAY,WAAW,KAAK,OAAO,KAAK;AAAA,IAC1C;AAAA,EACF;AAEA,SAAO,EAAE,SAAS,MAAM,OAAO,UAAU;AAC3C;AAEA,SAAS,SAAS,OAAgBA,OAAyB,OAAoC;AAC7F,MAAI,YAAY,KAAK,GAAG;AACtB,WAAO,EAAE,SAAS,MAAM,MAAM;AAAA,EAChC;AAEA,mBAAiB,OAAOA,OAAM,cAAc,KAAK;AACjD,SAAO,EAAE,SAAS,MAAM,MAAM;AAChC;AAEA,SAAS,WAAW,QAA+B;AACjD,MAAI,OAAO,YAAY,QAAW;AAChC,WAAO,EAAE,SAAS,MAAM,OAAO,OAAO,QAAQ;AAAA,EAChD;AAEA,MAAI,OAAO,SAAS,YAAY;AAC9B,WAAO,WAAW,OAAO,KAAK;AAAA,EAChC;AAEA,SAAO,EAAE,SAAS,MAAM;AAC1B;AAEA,SAAS,cAAc,OAAkD;AACvE,MAAI,OAAO,UAAU,YAAY,UAAU,QAAQ,MAAM,QAAQ,KAAK,GAAG;AACvE,WAAO;AAAA,EACT;AAEA,QAAM,YAAY,OAAO,eAAe,KAAK;AAE7C,SAAO,cAAc,OAAO,aAAa,cAAc;AACzD;AAEA,SAAS,YAAY,OAAgB,YAAyB,oBAAI,IAAI,GAAY;AAChF,MACE,UAAU,QACV,OAAO,UAAU,YACjB,OAAO,UAAU,YACjB,OAAO,UAAU,WACjB;AACA,WAAO,OAAO,UAAU,YAAY,OAAO,SAAS,KAAK;AAAA,EAC3D;AAEA,MAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,QAAI,UAAU,IAAI,KAAK,GAAG;AACxB,aAAO;AAAA,IACT;AACA,cAAU,IAAI,KAAK;AACnB,UAAM,SAAS,MAAM,MAAM,CAAC,SAAS,YAAY,MAAM,SAAS,CAAC;AACjE,cAAU,OAAO,KAAK;AACtB,WAAO;AAAA,EACT;AAEA,MAAI,cAAc,KAAK,GAAG;AACxB,QAAI,UAAU,IAAI,KAAK,GAAG;AACxB,aAAO;AAAA,IACT;AACA,cAAU,IAAI,KAAK;AACnB,UAAM,SAAS,OAAO,OAAO,KAAK,EAAE,MAAM,CAAC,SAAS,YAAY,MAAM,SAAS,CAAC;AAChF,cAAU,OAAO,KAAK;AACtB,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEA,SAAS,aAAa,OAAyB;AAC7C,SAAO,gBAAgB,KAAK;AAC9B;AAEA,SAAS,YAAY,QAAiC,KAAa,OAAsB;AACvF,SAAO,eAAe,QAAQ,KAAK;AAAA,IACjC,cAAc;AAAA,IACd,YAAY;AAAA,IACZ,UAAU;AAAA,IACV;AAAA,EACF,CAAC;AACH;AAEA,SAAS,YAAY,QAA2B;AAC9C,UAAQ,OAAO,MAAM;AAAA,IACnB,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO,OAAO,aAAa,YAAY,YAAY;AAAA,IACrD,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO,UAAU,OAAO,OAAO,KAAK,IAAI,CAAC;AAAA,IAC3C,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO,YAAY,OAAO,KAAK;AAAA,EACnC;AACF;AAEA,SAAS,iBACP,OACAA,OACA,UACA,OACM;AACN;AAAA,IACE;AAAA,IACAA;AAAA,IACA;AAAA,IACA,aAAa,KAAK;AAAA,IAClB,YAAY,QAAQ,OAAO,WAAWA,KAAI,CAAC;AAAA,EAC7C;AACF;AAEA,SAAS,2BAA2B,OAAwBA,OAA+B;AACzF;AAAA,IACE;AAAA,IACAA;AAAA,IACA;AAAA,IACA;AAAA,IACA,uBAAuB,WAAWA,KAAI,CAAC;AAAA,EACzC;AACF;AAEA,SAAS,SACP,OACAA,OACA,UACA,UACA,UACM;AACN,QAAM,OAAO,KAAK;AAAA,IAChB,MAAAA;AAAA,IACA;AAAA,IACA;AAAA,IACA,SAAS,mBAAmB,UAAUA,OAAM,QAAQ;AAAA,EACtD,CAAC;AACH;AAEA,SAAS,oBACP,OACAA,OACA,UACA,UACA,SACM;AACN,QAAM,OAAO,KAAK;AAAA,IAChB,MAAAA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AACH;AAEA,SAAS,mBAAmB,UAAkBA,OAAyB,UAA0B;AAC/F,SAAO,YAAY,QAAQ,OAAO,WAAWA,KAAI,CAAC,SAAS,QAAQ;AACrE;AAEA,SAAS,WAAWA,OAAiC;AACnD,SAAOA,MAAK,WAAW,IAAI,UAAUA,MAAK,KAAK,GAAG;AACpD;AAEA,SAAS,eAAe,SAAqC;AAC3D,MAAI;AACF,WAAO,IAAI,OAAO,OAAO;AAAA,EAC3B,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,aAAa,OAAwB;AAC5C,MAAI,UAAU,MAAM;AAClB,WAAO;AAAA,EACT;AAEA,MAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,WAAO;AAAA,EACT;AAEA,MAAI,OAAO,UAAU,YAAY,OAAO,UAAU,KAAK,GAAG;AACxD,WAAO;AAAA,EACT;AAEA,SAAO,OAAO;AAChB;AAEA,SAAS,cAAc,OAAwB;AAC7C,MAAI,OAAO,UAAU,UAAU;AAC7B,WAAO;AAAA,EACT;AAEA,MAAI,UAAU,QAAW;AACvB,WAAO;AAAA,EACT;AAEA,SAAO,OAAO,KAAK;AACrB;AAEA,SAAS,4BAA4B,OAAwB;AAC3D,MAAI,OAAO,UAAU,UAAU;AAC7B,WAAO,KAAK,UAAU,KAAK;AAAA,EAC7B;AAEA,SAAO,cAAc,KAAK;AAC5B;;;AC3VA,SAAS,sBAAsB,QAAwC;AACrE,MAAI,OAAO,WAAW,GAAG;AACvB,UAAM,IAAI,MAAM,yCAAyC;AAAA,EAC3D;AAEA,QAAM,eAAe,IAAI,IAAI,MAAM;AAEnC,MAAI,aAAa,SAAS,OAAO,QAAQ;AACvC,UAAM,IAAI,MAAM,mCAAmC;AAAA,EACrD;AAEA,MAAI,OAAO,KAAK,CAAC,UAAU,OAAO,UAAU,YAAY,CAAC,OAAO,SAAS,KAAK,CAAC,GAAG;AAChF,UAAM,IAAI,MAAM,2CAA2C;AAAA,EAC7D;AACF;AAEA,SAAS,yBAAyB,OAA2B,MAAoB;AAC/E,MAAI,UAAU,WAAc,CAAC,OAAO,UAAU,KAAK,KAAK,QAAQ,IAAI;AAClE,UAAM,IAAI,MAAM,GAAG,IAAI,iCAAiC;AAAA,EAC1D;AACF;AAEA,SAAS,mBAAmB,OAA2B,MAAoB;AACzE,MAAI,UAAU,UAAa,CAAC,OAAO,SAAS,KAAK,GAAG;AAClD,UAAM,IAAI,MAAM,GAAG,IAAI,iBAAiB;AAAA,EAC1C;AACF;AAEA,SAAS,kBACP,SACA,SACA,aACA,aACM;AACN,MAAI,YAAY,UAAa,YAAY,UAAa,UAAU,SAAS;AACvE,UAAM,IAAI,MAAM,GAAG,WAAW,kCAAkC,WAAW,EAAE;AAAA,EAC/E;AACF;AAEA,SAAS,mBAAmB,QAAyB;AACnD,MAAI,OAAO,YAAY,QAAW;AAChC;AAAA,EACF;AAEA,QAAM,SAAS,SAAS,QAAQ,OAAO,OAAO;AAC9C,MAAI,CAAC,OAAO,IAAI;AACd,UAAM,IAAI;AAAA,MACR,gCAAgC,OAAO,OAAO,CAAC,GAAG,WAAW,iBAAiB;AAAA,IAChF;AAAA,EACF;AACF;AAEA,SAAS,cAAc,SAAmC;AACxD,MAAI,YAAY,QAAW;AACzB;AAAA,EACF;AACA,MAAI;AACF,QAAI,OAAO,OAAO;AAAA,EACpB,QAAQ;AACN,UAAM,IAAI,MAAM,4CAA4C;AAAA,EAC9D;AACF;AAiCO,IAAM,IAAI;AAAA,EACf,OACE,UAAoB,CAAC,GACiB;AACtC,6BAAyB,QAAQ,WAAW,WAAW;AACvD,6BAAyB,QAAQ,WAAW,WAAW;AACvD,sBAAkB,QAAQ,WAAW,QAAQ,WAAW,aAAa,WAAW;AAChF,kBAAc,QAAQ,OAAO;AAC7B,UAAM,SAAuB;AAAA,MAC3B,MAAM;AAAA,MACN,GAAG;AAAA,IACL;AACA,uBAAmB,MAAM;AACzB,WAAO;AAAA,EACT;AAAA,EAEA,OAGE,UAAoB,CAAC,GAAqD;AAC1E,uBAAmB,QAAQ,SAAS,SAAS;AAC7C,uBAAmB,QAAQ,SAAS,SAAS;AAC7C,sBAAkB,QAAQ,SAAS,QAAQ,SAAS,WAAW,SAAS;AACxE,uBAAmB,QAAQ,SAAS,SAAS;AAC7C,QACE,QAAQ,aAAa,aACrB,QAAQ,YAAY,UACpB,CAAC,OAAO,UAAU,QAAQ,OAAO,GACjC;AACA,YAAM,IAAI,MAAM,4BAA4B;AAAA,IAC9C;AACA,UAAM,SAAuB;AAAA,MAC3B,MAAM;AAAA,MACN,GAAG;AAAA,IACL;AACA,uBAAmB,MAAM;AACzB,WAAO;AAAA,EACT;AAAA,EAEA,QACE,UAAoB,CAAC,GACkB;AACvC,UAAM,SAAwB;AAAA,MAC5B,MAAM;AAAA,MACN,GAAG;AAAA,IACL;AACA,uBAAmB,MAAM;AACzB,WAAO;AAAA,EACT;AAAA,EAEA,KAUE,QACA,UAAoB,CAAC,GACwB;AAC7C,0BAAsB,MAAM;AAC5B,QACE,QAAQ,aAAa,aACrB,OAAO,KAAK,CAAC,UAAU,OAAO,UAAU,YAAY,CAAC,OAAO,UAAU,KAAK,CAAC,GAC5E;AACA,YAAM,IAAI,MAAM,sCAAsC;AAAA,IACxD;AAEA,UAAM,SAA8B;AAAA,MAClC,MAAM;AAAA,MACN;AAAA,MACA,GAAG;AAAA,IACL;AACA,uBAAmB,MAAM;AACzB,WAAO;AAAA,EACT;AAAA,EAEA,MAGE,MAAa,UAAoB,CAAC,GAA2D;AAC7F,6BAAyB,QAAQ,UAAU,UAAU;AACrD,6BAAyB,QAAQ,UAAU,UAAU;AACrD,sBAAkB,QAAQ,UAAU,QAAQ,UAAU,YAAY,UAAU;AAC5E,UAAM,SAA6B;AAAA,MACjC,MAAM;AAAA,MACN;AAAA,MACA,GAAG;AAAA,IACL;AACA,uBAAmB,MAAM;AACzB,WAAO;AAAA,EACT;AAAA,EAEA,OAIE,OACA,UAAoB,CAAC,GACyB;AAC9C,UAAM,SAA+B;AAAA,MACnC,MAAM;AAAA,MACN;AAAA,MACA,GAAG;AAAA,IACL;AACA,uBAAmB,MAAM;AACzB,WAAO;AAAA,EACT;AAAA,EAEA,SAAmC,OAAuC;AACxE,WAAO;AAAA,MACL,MAAM;AAAA,MACN;AAAA,IACF;AAAA,EACF;AAAA,EAEA;AAAA,EAEA;AAAA,EAEA;AAAA,EAEA;AACF;;;AC3eO,IAAM,aAAa,OAAO,OAAO;AAAA,EACtC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAwC;;;AChCxC,SAAS,YAAY,cAAc,cAAc,gBAAgB;AACjE,OAAO,UAAU;AACjB,SAAS,qBAAqB;;;AVsB9B,IAAM,sBAAsB,uBAAO,0BAA0B;AAE7D,IAAM,0BAA0B,uBAAO,8BAA8B;AA6UrE,SAAS,WAAW,OAAiD;AACnE,SAAO,UAAU,SAAY,SAAY,CAAC,GAAG,KAAK;AACpD;AAEA,SAAS,sBAAsB,QAA4C;AACzE,SAAO;AAAA,IACL,KAAK,OAAO;AAAA,IACZ,aAAa,OAAO;AAAA,IACpB,UAAU,OAAO;AAAA,EACnB;AACF;AAEA,SAAS,aAAa,SAA6D;AACjF,MAAI,YAAY,QAAW;AACzB,WAAO,CAAC;AAAA,EACV;AAEA,SAAO,OAAO;AAAA,IACZ,OAAO,QAAQ,OAAO,EAAE,IAAI,CAAC,CAAC,KAAK,MAAM,MAAM,CAAC,KAAK,sBAAsB,MAAM,CAAC,CAAC;AAAA,EACrF;AACF;AAEA,SAAS,cACP,UACgC;AAChC,MAAI,aAAa,QAAW;AAC1B,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL,MAAM,SAAS;AAAA,IACf,YAAY,SAAS;AAAA,IACrB,OAAO,SAAS;AAAA,EAClB;AACF;AAMA,SAAS,qBAAqB,UAA0D;AACtF,UAAQ,YAAY,CAAC,GAAG,IAAI,CAAC,aAAa;AAAA,IACxC,OAAO,QAAQ;AAAA,IACf,QAAQ,EAAE,GAAG,QAAQ,OAAO;AAAA,EAC9B,EAAE;AACJ;AAkEA,SAAS,eAAe,WAAuC;AAC7D,MAAI,UAAU,WAAW,SAAS,GAAG;AACnC,QAAI;AACF,aAAOC,eAAc,SAAS;AAAA,IAChC,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AAEA,MAAI,UAAU,WAAW,GAAG,GAAG;AAC7B,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEA,SAAS,iBAAiB,MAAkC;AAC1D,QAAM,UAAU,KAAK,KAAK;AAC1B,QAAM,YAAY,QAAQ,QAAQ,SAAS;AAE3C,MAAI,aAAa,GAAG;AAClB,UAAMC,YAAW,QAAQ,MAAM,SAAS;AACxC,UAAMC,kBAAiBD,UAAS,YAAY,GAAG;AAC/C,UAAME,0BACJD,mBAAkB,IAAID,UAAS,YAAY,KAAKC,kBAAiB,CAAC,IAAI;AACxE,UAAME,aACJF,mBAAkB,KAAKC,2BAA0B,IAC7CF,UAAS,MAAM,GAAGE,uBAAsB,IACxCF;AAEN,WAAO,eAAeG,UAAS;AAAA,EACjC;AAEA,QAAM,aAAa,QAAQ,QAAQ,GAAG;AACtC,MAAI,aAAa,GAAG;AAClB,WAAO;AAAA,EACT;AAEA,QAAM,WAAW,QAAQ,MAAM,UAAU;AACzC,QAAM,iBAAiB,SAAS,YAAY,GAAG;AAC/C,QAAM,yBACJ,kBAAkB,IAAI,SAAS,YAAY,KAAK,iBAAiB,CAAC,IAAI;AACxE,QAAM,YACJ,kBAAkB,KAAK,0BAA0B,IAC7C,SAAS,MAAM,GAAG,sBAAsB,IACxC;AAEN,SAAO,eAAe,SAAS;AACjC;AAEA,SAAS,yBAA6C;AACpD,QAAM,QAAQ,IAAI,MAAM,EAAE;AAE1B,MAAI,OAAO,UAAU,UAAU;AAC7B,WAAO;AAAA,EACT;AAEA,aAAW,QAAQ,MAAM,MAAM,IAAI,EAAE,MAAM,CAAC,GAAG;AAC7C,UAAM,YAAY,iBAAiB,IAAI;AAEvC,QAAI,cAAc,QAAW;AAC3B;AAAA,IACF;AAEA,QACE,UAAU,SAAS,kCAAkC,KACrD,UAAU,SAAS,mCAAmC,KACtD,UAAU,SAAS,uCAAuC,GAC1D;AACA;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEA,SAAS,cACP,aACA,YACoC;AACpC,MAAI,gBAAgB,QAAW;AAC7B,WAAO;AAAA,EACT;AAEA,MAAI,eAAe,QAAW;AAC5B,WAAO;AAAA,EACT;AAEA,SAAO,OAAO,QAAQ;AACpB,UAAM,eAAe,MAAM,YAAY,GAAG;AAC1C,QAAI,CAAC,aAAa,IAAI;AACpB,aAAO;AAAA,IACT;AAEA,WAAO,WAAW,GAAG;AAAA,EACvB;AACF;AAEA,SAAS,cACP,QACA,OAC2B;AAC3B,MAAI,WAAW,UAAa,UAAU,QAAW;AAC/C,WAAO;AAAA,EACT;AAEA,QAAM,SAAwB;AAAA,IAC5B,MAAM,OAAO,QAAQ,QAAQ;AAAA,IAC7B,YAAY,OAAO,cAAc,QAAQ;AAAA,IACzC,OAAO,cAAc,QAAQ,OAAO,OAAO,KAAK;AAAA,EAClD;AAEA,MAAI,OAAO,SAAS,UAAa,OAAO,eAAe,UAAa,OAAO,UAAU,QAAW;AAC9F,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AA2JA,SAAS,aAAa,QAA4B,OAA+C;AAC/F,SAAO,aAAa;AAAA,IAClB,GAAG;AAAA,IACH,GAAG;AAAA,EACL,CAAC;AACH;AAEA,SAAS,oBACP,UACA,gBACS;AACT,SAAO,WAAW,YAAY,cAAc,KAAK,CAAC,OAAO,KAAK;AAChE;AASA,SAAS,kBAMP,QACsD;AACtD,QAAM,UAAgE;AAAA,IACpE,MAAM;AAAA,IACN,MAAM,OAAO;AAAA,IACb,aAAa,OAAO;AAAA,IACpB,QAAQ,OAAO,UAAU;AAAA,IACzB,UAAU,qBAAqB,OAAO,QAAQ;AAAA,IAC9C,SAAS,CAAC,GAAI,OAAO,WAAW,CAAC,CAAE;AAAA,IACnC,YAAY,CAAC,GAAI,OAAO,cAAc,CAAC,CAAE;AAAA,IACzC,QAAQ,OAAO;AAAA,IACf,QAAQ,OAAO;AAAA,IACf,QAAQ;AAAA,IACR,SAAS,aAAa,OAAO,OAAO;AAAA,IACpC,OAAO,oBAAoB,OAAO,OAAO,MAAS;AAAA,IAClD,SAAS,OAAO,WAAW;AAAA,IAC3B,aAAa,OAAO;AAAA,IACpB,UAAU,cAAc,OAAO,QAAQ;AAAA,IACvC,SAAS,OAAO;AAAA,IAChB,QAAQ,OAAO;AAAA,EACjB;AAEA,SAAO,eAAe,SAAS,qBAAqB;AAAA,IAClD,OAAO;AAAA,MACL,OAAO,WAAW,OAAO,KAAK;AAAA,MAC9B,QAAQ,OAAO,UAAU;AAAA,MACzB,UAAU,qBAAqB,OAAO,QAAQ;AAAA,MAC9C,QAAQ,OAAO;AAAA,MACf,aAAa,OAAO;AAAA,MACpB,SAAS,aAAa,OAAO,OAAO;AAAA,MACpC,UAAU,cAAc,OAAO,QAAQ;AAAA,MACvC,YAAY,uBAAuB;AAAA,IACrC;AAAA,EACF,CAAC;AAED,SAAO;AACT;AAmCA,SAAS,yBAAyB,SAA6D;AAC7F,SACE,QACA,mBAAmB;AACvB;AAUA,SAAS,mBAMP,SACA,WACsD;AACtD,QAAM,WAAW,yBAAyB,OAAO;AAEjD,QAAM,eAAqE;AAAA,IACzE,MAAM;AAAA,IACN,MAAM,QAAQ;AAAA,IACd,aAAa,QAAQ;AAAA,IACrB,QAAQ,SAAS;AAAA,IACjB,UAAU,qBAAqB,SAAS,QAAQ;AAAA,IAChD,SAAS,CAAC,GAAG,QAAQ,OAAO;AAAA,IAC5B,YAAY,CAAC,GAAG,QAAQ,UAAU;AAAA,IAClC,QAAQ,QAAQ;AAAA,IAChB,QAAQ,SAAS;AAAA,IACjB,QAAQ,QAAQ;AAAA,IAChB,SAAS,aAAa,UAAU,SAAS,SAAS,OAAO;AAAA,IACzD,OAAO,oBAAoB,SAAS,OAAO,UAAU,KAAK;AAAA,IAC1D,SAAS,QAAQ;AAAA,IACjB,aAAa,0BAA0B,UAAU,aAAa,SAAS,WAAW;AAAA,IAClF,UAAU,cAAc,UAAU,UAAU,SAAS,QAAQ;AAAA,IAC7D,SAAS,QAAQ;AAAA,IACjB,QAAQ,QAAQ;AAAA,EAClB;AAEA,SAAO,eAAe,cAAc,qBAAqB;AAAA,IACvD,OAAO;AAAA,MACL,OAAO,WAAW,SAAS,KAAK;AAAA,MAChC,QAAQ,SAAS;AAAA,MACjB,UAAU,qBAAqB,SAAS,QAAQ;AAAA,MAChD,QAAQ,SAAS;AAAA,MACjB,aAAa,SAAS;AAAA,MACtB,SAAS,aAAa,SAAS,OAAO;AAAA,MACtC,UAAU,cAAc,SAAS,QAAQ;AAAA,MACzC,YAAY,SAAS;AAAA,IACvB;AAAA,EACF,CAAC;AAED,SAAO,eAAe,cAAc,yBAAyB;AAAA,IAC3D,OAAO,SAAS;AAAA,EAClB,CAAC;AAED,SAAO;AACT;AAoFO,SAAS,cASd,QAeE;AACF,8BAA4B,MAAM;AAElC,SAAO;AAAA,IACL,kBAAkB,MAAoE;AAAA,IACtF;AAAA,MACE,OAAO;AAAA,MACP,aAAa;AAAA,MACb,SAAS,CAAC;AAAA,MACV,UAAU;AAAA,IACZ;AAAA,EACF;AAQF;;;AWxgCA,SAAS,kBAAkB;;;ACA3B,SAAS,oBAAoB;AAC7B,SAAS,YAAY,WAAW,iBAAiB;AACjD,SAAS,qBAAqB;AAC9B,SAAS,SAAS,YAAY;AAC9B,YAAY,aAAa;;;ACJzB,IAAM,MAAM;AACZ,IAAM,MAAM;AACZ,IAAM,KAAK;AACX,IAAM,MAAM;AACZ,IAAM,MAAM;AACZ,IAAM,MAAM;AACZ,IAAM,MAAM;AACZ,IAAM,KAAK;AACX,IAAM,MAAM;AAEL,SAAS,UAAU,OAAuB;AAC/C,MAAI,SAAS;AAEb,WAAS,QAAQ,GAAG,QAAQ,MAAM,QAAQ,SAAS,GAAG;AACpD,UAAM,OAAO,MAAM,WAAW,KAAK;AAEnC,QAAI,SAAS,KAAK;AAChB,YAAM,WAAW,MAAM,WAAW,QAAQ,CAAC;AAE3C,UAAI,aAAa,IAAM;AACrB,gBAAQ,WAAW,OAAO,QAAQ,CAAC;AACnC;AAAA,MACF;AAEA,UAAI,aAAa,IAAM;AACrB,gBAAQ,wBAAwB,OAAO,QAAQ,GAAG,IAAI;AACtD;AAAA,MACF;AAEA,UAAI,aAAa,MAAQ,aAAa,MAAQ,aAAa,MAAQ,aAAa,IAAM;AACpF,gBAAQ,wBAAwB,OAAO,QAAQ,GAAG,KAAK;AACvD;AAAA,MACF;AAEA,UAAI,CAAC,OAAO,MAAM,QAAQ,GAAG;AAC3B,iBAAS;AAAA,MACX;AAEA;AAAA,IACF;AAEA,QAAI,SAAS,KAAK;AAChB,cAAQ,WAAW,OAAO,QAAQ,CAAC;AACnC;AAAA,IACF;AAEA,QAAI,SAAS,KAAK;AAChB,cAAQ,wBAAwB,OAAO,QAAQ,GAAG,IAAI;AACtD;AAAA,IACF;AAEA,QAAI,SAAS,OAAO,SAAS,OAAO,SAAS,MAAM,SAAS,KAAK;AAC/D,cAAQ,wBAAwB,OAAO,QAAQ,GAAG,KAAK;AACvD;AAAA,IACF;AAEA,cAAU,MAAM,KAAK;AAAA,EACvB;AAEA,SAAO;AACT;AAEA,SAAS,WAAW,OAAe,OAAuB;AACxD,SAAO,QAAQ,MAAM,QAAQ;AAC3B,UAAM,OAAO,MAAM,WAAW,KAAK;AACnC,QAAI,QAAQ,MAAQ,QAAQ,KAAM;AAChC,aAAO;AAAA,IACT;AAEA,aAAS;AAAA,EACX;AAEA,SAAO,MAAM;AACf;AAEA,SAAS,wBACP,OACA,OACA,qBACQ;AACR,SAAO,QAAQ,MAAM,QAAQ;AAC3B,UAAM,OAAO,MAAM,WAAW,KAAK;AAEnC,QAAI,SAAS,MAAO,uBAAuB,SAAS,KAAM;AACxD,aAAO;AAAA,IACT;AAEA,QAAI,SAAS,OAAO,MAAM,WAAW,QAAQ,CAAC,MAAM,IAAM;AACxD,aAAO,QAAQ;AAAA,IACjB;AAEA,aAAS;AAAA,EACX;AAEA,SAAO,MAAM;AACf;;;AC/FO,SAAS,gBAAgB,OAAgB,MAAuB;AACrE,SACE,iBAAiB,SACjB,OAAO,UAAU,eAAe,KAAK,OAAO,MAAM,KACjD,MAA6B,SAAS;AAE3C;;;AC0BA,IAAM,YAAY;AAClB,IAAM,uBAA+C;AAAA,EACnD,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AACL;AAaO,IAAM,iBAAN,MAAqB;AAAA,EAClB;AAAA,EACA;AAAA,EACA;AAAA,EACA,iBAA4C;AAAA,EAC5C,WAAW;AAAA,EACX,WAAW;AAAA,EACX;AAAA,EACA,aAAa;AAAA,EACb;AAAA,EACA,SAAS;AAAA,EACT,aAAa;AAAA,EACb,cAAc;AAAA,EACd,YAAY;AAAA,EACZ,eAAe;AAAA,EACf,cAAc;AAAA,EACd,cAAc;AAAA,EACd;AAAA,EACA,mBAAkC;AAAA,EAClC,SAAwB,wBAAwB;AAAA,EAChD,iBAAiB;AAAA,EACjB,eAAe;AAAA,EACf,iBAAqC;AAAA,EACrC,aAAmC;AAAA,EACnC,aAAmC;AAAA,EACnC,YAAY;AAAA,EAEX;AAAA,EAMT,YAAY,MAAc,MAAc;AACtC,SAAK,QAAQ;AACb,SAAK,QAAQ;AACb,SAAK,gBAAgB,OAAO;AAC5B,SAAK,UAAU,KAAK,YAAY,MAAM,IAAI;AAC1C,SAAK,YAAY,KAAK,uBAAuB,IAAI;AACjD,SAAK,eAAe,KAAK,wBAAwB;AAEjD,SAAK,gBAAgB,OAAO;AAAA,MAC1B,CAAC;AAAA,MAKD;AAAA,QACE,SAAS,EAAE,KAAK,MAAM,KAAK,UAAU,YAAY,KAAK;AAAA,QACtD,SAAS,EAAE,KAAK,MAAM,KAAK,UAAU,YAAY,KAAK;AAAA,QACtD,MAAM,EAAE,KAAK,MAAM,KAAK,SAAmC,YAAY,KAAK;AAAA,MAC9E;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,MAAoB;AACxB,eAAW,MAAM,MAAM;AACrB,WAAK,MAAM,EAAE;AAAA,IACf;AAAA,EACF;AAAA,EAEA,WAAW,KAAqB;AAC9B,UAAM,QAAQ,KAAK,QAAQ,GAAG,KAAK,CAAC;AACpC,QAAI,kBAAkB;AAEtB,aAAS,QAAQ,MAAM,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG;AACzD,UAAI,MAAM,KAAK,MAAM,MAAM;AACzB,0BAAkB;AAClB;AAAA,MACF;AAAA,IACF;AAEA,QAAI,oBAAoB,IAAI;AAC1B,aAAO;AAAA,IACT;AAEA,QAAI,OAAO;AACX,QAAI,cAAc;AAElB,aAAS,QAAQ,GAAG,SAAS,iBAAiB,SAAS,GAAG;AACxD,YAAM,OAAO,MAAM,KAAK;AACxB,YAAM,YAAY,MAAM,SAAS;AAEjC,UAAI,cAAc,aAAa;AAC7B,gBAAQ,UAAU,SAAS,IAAI,YAAY;AAC3C,sBAAc;AAAA,MAChB;AAEA,cAAQ,OAAO,CAAC,KAAK;AAAA,IACvB;AAEA,QAAI,YAAY,SAAS,GAAG;AAC1B,cAAQ;AAAA,IACV;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,OAAO,MAAc,MAAoB;AAEvC,WAAO,KAAK,QAAQ,SAAS,MAAM;AACjC,WAAK,QAAQ,KAAK,KAAK,SAAS,IAAI,CAAC;AAAA,IACvC;AACA,SAAK,QAAQ,SAAS;AAGtB,aAAS,IAAI,GAAG,IAAI,MAAM,KAAK;AAC7B,YAAM,MAAM,KAAK,QAAQ,CAAC,KAAK,KAAK,SAAS,IAAI;AACjD,aAAO,IAAI,SAAS,KAAM,KAAI,KAAK,IAAI;AACvC,UAAI,SAAS;AACb,WAAK,QAAQ,CAAC,IAAI;AAAA,IACpB;AAEA,SAAK,QAAQ;AACb,SAAK,QAAQ;AACb,SAAK,aAAa,KAAK,OAAO,KAAK,YAAY,GAAG,OAAO,CAAC;AAC1D,SAAK,gBAAgB,KAAK,OAAO,KAAK,eAAe,GAAG,OAAO,CAAC;AAChE,QAAI,KAAK,cAAc,KAAK,eAAe;AACzC,WAAK,aAAa;AAClB,WAAK,gBAAgB,OAAO;AAAA,IAC9B;AACA,SAAK,WAAW,KAAK,OAAO,KAAK,UAAU,GAAG,OAAO,CAAC;AACtD,SAAK,WAAW,KAAK,OAAO,KAAK,UAAU,GAAG,OAAO,CAAC;AAAA,EACxD;AAAA,EAEQ,YAAY,MAAc,MAAqB;AACrD,WAAO,MAAM,KAAK,EAAE,QAAQ,KAAK,GAAG,MAAM,KAAK,SAAS,IAAI,CAAC;AAAA,EAC/D;AAAA,EAEQ,SAAS,MAAmB;AAClC,WAAO,MAAM,IAAI,EAAE,KAAK,IAAI;AAAA,EAC9B;AAAA,EAEQ,uBAAuB,MAA2B;AACxD,UAAM,WAAW,oBAAI,IAAY;AACjC,aAAS,SAAS,GAAG,SAAS,MAAM,UAAU,GAAG;AAC/C,eAAS,IAAI,MAAM;AAAA,IACrB;AACA,WAAO;AAAA,EACT;AAAA,EAEQ,OAAO,OAAe,KAAa,KAAqB;AAC9D,WAAO,KAAK,IAAI,KAAK,KAAK,IAAI,KAAK,KAAK,CAAC;AAAA,EAC3C;AAAA,EAEQ,0BAA4C;AAClD,WAAO;AAAA,MACL,GAAG,KAAK;AAAA,MACR,GAAG,KAAK;AAAA,MACR,UAAU,KAAK;AAAA,MACf,OAAO,EAAE,GAAG,KAAK,QAAQ,IAAI,KAAK,OAAO,IAAI,MAAM,GAAG,IAAI,KAAK,OAAO,IAAI,MAAM,EAAE;AAAA,MAClF,eAAe,KAAK;AAAA,IACtB;AAAA,EACF;AAAA,EAEQ,cAAoB;AAC1B,SAAK,eAAe,KAAK,wBAAwB;AAAA,EACnD;AAAA,EAEQ,iBAAuB;AAC7B,SAAK,WAAW,KAAK,OAAO,KAAK,aAAa,GAAG,GAAG,KAAK,QAAQ,CAAC;AAClE,SAAK,WAAW,KAAK,OAAO,KAAK,aAAa,GAAG,GAAG,KAAK,QAAQ,CAAC;AAClE,SAAK,YAAY,KAAK,aAAa;AACnC,SAAK,SAAS;AAAA,MACZ,GAAG,KAAK,aAAa;AAAA,MACrB,IAAI,KAAK,aAAa,MAAM,IAAI,MAAM;AAAA,MACtC,IAAI,KAAK,aAAa,MAAM,IAAI,MAAM;AAAA,IACxC;AACA,SAAK,iBAAiB,KAAK,aAAa;AAAA,EAC1C;AAAA,EAEQ,cAAoB;AAC1B,SAAK,YAAY;AACjB,SAAK,cAAc;AACnB,SAAK,cAAc;AACnB,SAAK,eAAe;AACpB,SAAK,YAAY,KAAK,uBAAuB,KAAK,KAAK;AACvD,SAAK,aAAa;AAClB,SAAK,aAAa;AAClB,SAAK,YAAY;AACjB,SAAK,YAAY;AAAA,EACnB;AAAA,EAEQ,gBAAgB,IAAkB;AACxC,UAAM,QAAQ,KAAK,WAAW,EAAE;AAEhC,QAAI,UAAU,GAAG;AACf,WAAK,qBAAqB,EAAE;AAC5B;AAAA,IACF;AAEA,QAAI,KAAK,aAAa,KAAK,cAAc;AACvC,WAAK,WAAW;AAChB,WAAK,SAAS;AAAA,IAChB,WAAW,KAAK,aAAa,KAAK,WAAW,QAAQ,KAAK,OAAO;AAC/D,WAAK,WAAW;AAChB,WAAK,SAAS;AAAA,IAChB;AAEA,QAAI,KAAK,aAAa;AACpB,YAAM,MAAM,KAAK,QAAQ,KAAK,QAAQ;AACtC,UAAI,KAAK;AACP,YAAI,OAAO,KAAK,UAAU,GAAG,GAAI,MAAM,KAAK,EAAE,KAAK,IAAI,CAAY;AACnE,YAAI,OAAO,KAAK,KAAK;AAAA,MACvB;AAAA,IACF;AAEA,SAAK,SAAS,KAAK,UAAU,KAAK,UAAU,EAAE;AAC9C,aAAS,SAAS,GAAG,SAAS,SAAS,KAAK,WAAW,SAAS,KAAK,OAAO,UAAU,GAAG;AACvF,YAAM,MAAM,KAAK,QAAQ,KAAK,QAAQ;AACtC,UAAI,IAAK,KAAI,KAAK,WAAW,MAAM,IAAI;AAAA,IACzC;AACA,SAAK,mBAAmB;AAExB,QAAI,CAAC,KAAK,WAAW;AACnB,WAAK,WAAW,KAAK,IAAI,KAAK,WAAW,OAAO,KAAK,QAAQ,CAAC;AAC9D,WAAK,eAAe;AAAA,IACtB,WAAW,KAAK,WAAW,SAAS,KAAK,OAAO;AAC9C,WAAK,WAAW,KAAK,QAAQ;AAC7B,WAAK,eAAe;AAAA,IACtB,OAAO;AACL,WAAK,YAAY;AACjB,WAAK,eAAe;AAAA,IACtB;AAAA,EACF;AAAA,EAEQ,WAAW,IAAoB;AACrC,UAAM,YAAY,GAAG,YAAY,CAAC;AAClC,QAAI,cAAc,OAAW,QAAO;AACpC,QAAI,qBAAqB,SAAS,GAAG;AACnC,aAAO;AAAA,IACT;AACA,QACG,aAAa,QAAU,aAAa,QACrC,cAAc,QACd,cAAc,QACb,aAAa,SAAU,aAAa,SACpC,aAAa,SAAU,aAAa,SACpC,aAAa,SAAU,aAAa,SACpC,aAAa,SAAU,aAAa,SACpC,aAAa,SAAU,aAAa,SACpC,aAAa,SAAU,aAAa,SACpC,aAAa,SAAU,aAAa,SACpC,aAAa,SAAU,aAAa,SACpC,aAAa,SAAU,aAAa,SACpC,aAAa,SAAU,aAAa,SACpC,aAAa,UAAW,aAAa,UACrC,aAAa,UAAW,aAAa,QACtC;AACA,aAAO,KAAK,IAAI,GAAG,KAAK,KAAK;AAAA,IAC/B;AACA,WAAO;AAAA,EACT;AAAA,EAEQ,qBAAqB,IAAkB;AAC7C,UAAM,SAAS,KAAK,qBAAqB;AACzC,QAAI,WAAW,MAAM;AACnB;AAAA,IACF;AAEA,UAAM,OAAO,KAAK,QAAQ,OAAO,CAAC,IAAI,OAAO,CAAC;AAC9C,QAAI,SAAS,QAAQ,SAAS,QAAW;AACvC;AAAA,IACF;AAEA,SAAK,CAAC,KAAK;AAAA,EACb;AAAA,EAEQ,uBAAwD;AAC9D,UAAM,SAAS,KAAK,eAAe,KAAK,WAAW,KAAK,WAAW;AAEnE,aAAS,IAAI,KAAK,UAAU,KAAK,GAAG,KAAK,GAAG;AAC1C,YAAM,MAAM,KAAK,QAAQ,CAAC;AAC1B,UAAI,QAAQ,QAAW;AACrB;AAAA,MACF;AAEA,eAAS,IAAI,MAAM,KAAK,WAAW,SAAS,KAAK,QAAQ,GAAG,KAAK,GAAG,KAAK,GAAG;AAC1E,YAAI,IAAI,CAAC,MAAM,MAAM;AACnB,iBAAO,EAAE,GAAG,EAAE;AAAA,QAChB;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,SAAS,GAAW,GAAW,IAAkB;AACvD,UAAM,MAAM,KAAK,QAAQ,CAAC;AAC1B,QAAI,OAAO,KAAK,KAAK,IAAI,KAAK,OAAO;AACnC,YAAM,eAAe,KAAK,OAAO,UAAU,MAAM;AACjD,YAAM,OAAO,CAAC,aAAa,WAAW,CAAC,GAAG,YAAY;AAEtD,UAAI,KAAK,eAAe,SAAS,GAAG;AAClC,eAAO,eAAe,MAAM,SAAS;AAAA,UACnC,OAAO,KAAK;AAAA,UACZ,UAAU;AAAA,UACV,cAAc;AAAA,QAChB,CAAC;AAAA,MACH;AAEA,UAAI,CAAC,IAAI;AAAA,IACX;AAAA,EACF;AAAA,EAEQ,WAAW,GAAW,OAAe,KAAmB;AAC9D,UAAM,MAAM,KAAK,QAAQ,CAAC;AAC1B,QAAI,CAAC,IAAK;AACV,aAAS,IAAI,OAAO,KAAK,OAAO,IAAI,KAAK,OAAO,KAAK;AACnD,UAAI,CAAC,IAAI;AAAA,IACX;AAAA,EACF;AAAA,EAEQ,UAAU,OAAqB;AACrC,aAAS,IAAI,GAAG,IAAI,OAAO,KAAK;AAC9B,WAAK,QAAQ,OAAO,KAAK,YAAY,CAAC;AACtC,WAAK,QAAQ,OAAO,KAAK,eAAe,GAAG,KAAK,SAAS,KAAK,KAAK,CAAC;AAAA,IACtE;AAAA,EACF;AAAA,EAEQ,YAAY,OAAqB;AACvC,aAAS,IAAI,GAAG,IAAI,OAAO,KAAK;AAC9B,WAAK,QAAQ,OAAO,KAAK,eAAe,CAAC;AACzC,WAAK,QAAQ,OAAO,KAAK,YAAY,GAAG,KAAK,SAAS,KAAK,KAAK,CAAC;AAAA,IACnE;AAAA,EACF;AAAA,EAEQ,WAAiB;AACvB,SAAK,eAAe;AACpB,QAAI,KAAK,aAAa,KAAK,eAAe;AACxC,WAAK,UAAU,CAAC;AAAA,IAClB,OAAO;AACL,WAAK,WAAW,KAAK,IAAI,KAAK,WAAW,GAAG,KAAK,QAAQ,CAAC;AAAA,IAC5D;AAAA,EACF;AAAA,EAEQ,kBAA4B;AAClC,QAAI,CAAC,KAAK,WAAY,QAAO,CAAC;AAC9B,UAAM,SAAS,KAAK,WACjB,MAAM,GAAG,EACT,QAAQ,CAAC,YAAY,QAAQ,MAAM,GAAG,CAAC,EACvC,IAAI,CAAC,YAAa,YAAY,KAAK,IAAI,SAAS,SAAS,EAAE,CAAE;AAChE,SAAK,OAAO,CAAC,MAAM,MAAM,OAAO,CAAC,MAAM,OAAO,OAAO,CAAC,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG;AAChF,aAAO,OAAO,GAAG,CAAC;AAAA,IACpB;AACA,WAAO;AAAA,EACT;AAAA,EAEQ,SAAS,OAAqB;AACpC,UAAMC,UAAS,KAAK,gBAAgB;AACpC,UAAM,KAAKA,QAAO,CAAC,KAAK;AACxB,UAAM,KAAKA,QAAO,CAAC,KAAK;AAExB,QAAI,KAAK,gBAAgB,KAAK;AAC5B,UAAI,UAAU,OAAO,UAAU,KAAK;AAClC,YAAIA,QAAO,SAAS,CAAC,GAAG;AACtB,eAAK,YAAY,UAAU;AAAA,QAC7B;AAEA,YAAIA,QAAO,SAAS,CAAC,GAAG;AACtB,eAAK,cAAc,UAAU;AAC7B,eAAK,WAAW;AAChB,eAAK,WAAW,KAAK,cAAc,KAAK,aAAa;AAAA,QACvD;AAEA,YAAIA,QAAO,SAAS,IAAI,GAAG;AACzB,cAAI,UAAU,KAAK;AACjB,iBAAK,iBAAiB;AAAA,cACpB,QAAQ,KAAK;AAAA,cACb,SAAS,KAAK;AAAA,cACd,SAAS,KAAK;AAAA,cACd,aAAa,KAAK;AAAA,cAClB,OAAO,EAAE,GAAG,KAAK,QAAQ,IAAI,KAAK,OAAO,IAAI,MAAM,GAAG,IAAI,KAAK,OAAO,IAAI,MAAM,EAAE;AAAA,cAClF,eAAe,KAAK;AAAA,YACtB;AACA,iBAAK,UAAU,KAAK,YAAY,KAAK,OAAO,KAAK,KAAK;AACtD,iBAAK,WAAW;AAChB,iBAAK,WAAW;AAChB,iBAAK,eAAe;AAAA,UACtB,OAAO;AACL,gBAAI,KAAK,mBAAmB,MAAM;AAChC,mBAAK,UAAU,KAAK,eAAe;AACnC,mBAAK,WAAW,KAAK,eAAe;AACpC,mBAAK,WAAW,KAAK,eAAe;AACpC,mBAAK,eAAe,KAAK,eAAe;AACxC,mBAAK,SAAS,KAAK,eAAe;AAClC,mBAAK,iBAAiB,KAAK,eAAe;AAC1C,mBAAK,iBAAiB;AAAA,YACxB;AAAA,UACF;AACA,cAAI,UAAU,IAAK,MAAK,YAAY;AAAA,QACtC;AAAA,MACF;AACA;AAAA,IACF;AAEA,SAAK,UAAU,OAAO,UAAU,QAAQA,QAAO,SAAS,CAAC,GAAG;AAC1D,WAAK,cAAc,UAAU;AAC7B;AAAA,IACF;AAEA,YAAQ,OAAO;AAAA,MACb,KAAK;AACH,aAAK,WAAW,KAAK,OAAO,KAAK,WAAW,KAAK,IAAI,GAAG,EAAE,GAAG,GAAG,KAAK,QAAQ,CAAC;AAC9E;AAAA,MACF,KAAK;AACH,aAAK,WAAW,KAAK,OAAO,KAAK,WAAW,KAAK,IAAI,GAAG,EAAE,GAAG,GAAG,KAAK,QAAQ,CAAC;AAC9E;AAAA,MACF,KAAK;AAAA;AAAA,MACL,KAAK;AACH,aAAK,WAAW,KAAK,OAAO,KAAK,WAAW,KAAK,IAAI,GAAG,EAAE,GAAG,GAAG,KAAK,QAAQ,CAAC;AAC9E;AAAA,MACF,KAAK;AACH,aAAK,WAAW,KAAK,OAAO,KAAK,WAAW,KAAK,IAAI,GAAG,EAAE,GAAG,GAAG,KAAK,QAAQ,CAAC;AAC9E;AAAA,MACF,KAAK;AACH,aAAK,WAAW,KAAK,OAAO,KAAK,WAAW,KAAK,IAAI,GAAG,EAAE,GAAG,GAAG,KAAK,QAAQ,CAAC;AAC9E,aAAK,WAAW;AAChB;AAAA,MACF,KAAK;AACH,aAAK,WAAW,KAAK,OAAO,KAAK,WAAW,KAAK,IAAI,GAAG,EAAE,GAAG,GAAG,KAAK,QAAQ,CAAC;AAC9E,aAAK,WAAW;AAChB;AAAA,MACF,KAAK;AAAA;AAAA,MACL,KAAK;AACH,aAAK,WAAW,KAAK,OAAO,KAAK,IAAI,GAAG,EAAE,IAAI,GAAG,GAAG,KAAK,QAAQ,CAAC;AAClE;AAAA,MACF,KAAK;AAAA;AAAA,MACL,KAAK;AACH,aAAK,WAAW,KAAK,cACjB,KAAK,OAAO,KAAK,aAAa,KAAK,IAAI,GAAG,EAAE,IAAI,GAAG,KAAK,YAAY,KAAK,aAAa,IACtF,KAAK,OAAO,KAAK,IAAI,GAAG,EAAE,IAAI,GAAG,GAAG,KAAK,QAAQ,CAAC;AACtD,aAAK,WAAW,KAAK,OAAO,KAAK,IAAI,GAAG,EAAE,IAAI,GAAG,GAAG,KAAK,QAAQ,CAAC;AAClE;AAAA,MACF,KAAK;AACH,iBAAS,IAAI,GAAG,IAAI,KAAK,IAAI,GAAG,EAAE,GAAG,KAAK;AACxC,eAAK,WAAW,KAAK,IAAI,KAAK,QAAQ,IAAI,KAAK,MAAM,KAAK,WAAW,CAAC,IAAI,KAAK,CAAC;AAAA,QAClF;AACA;AAAA,MACF,KAAK;AACH,YAAI,OAAO,GAAG;AACZ,eAAK,WAAW,KAAK,UAAU,KAAK,UAAU,KAAK,QAAQ,CAAC;AAC5D,mBAAS,IAAI,KAAK,WAAW,GAAG,IAAI,KAAK,OAAO;AAC9C,iBAAK,WAAW,GAAG,GAAG,KAAK,QAAQ,CAAC;AAAA,QACxC,WAAW,OAAO,GAAG;AACnB,mBAAS,IAAI,GAAG,IAAI,KAAK,UAAU,IAAK,MAAK,WAAW,GAAG,GAAG,KAAK,QAAQ,CAAC;AAC5E,eAAK,WAAW,KAAK,UAAU,GAAG,KAAK,QAAQ;AAAA,QACjD,WAAW,OAAO,GAAG;AACnB,mBAAS,IAAI,GAAG,IAAI,KAAK,OAAO,IAAK,MAAK,WAAW,GAAG,GAAG,KAAK,QAAQ,CAAC;AAAA,QAC3E;AACA;AAAA,MACF,KAAK;AACH,YAAI,OAAO,EAAG,MAAK,WAAW,KAAK,UAAU,KAAK,UAAU,KAAK,QAAQ,CAAC;AAAA,iBACjE,OAAO,EAAG,MAAK,WAAW,KAAK,UAAU,GAAG,KAAK,QAAQ;AAAA,iBACzD,OAAO,EAAG,MAAK,WAAW,KAAK,UAAU,GAAG,KAAK,QAAQ,CAAC;AACnE;AAAA,MACF,KAAK;AACH,aAAK,WAAW,KAAK,UAAU,KAAK,UAAU,KAAK,WAAW,KAAK,IAAI,GAAG,EAAE,IAAI,CAAC;AACjF;AAAA,MACF,KAAK,KAAK;AAER,YAAI,KAAK,WAAW,KAAK,cAAc,KAAK,WAAW,KAAK,eAAe;AACzE;AAAA,QACF;AACA,cAAM,IAAI,KAAK,IAAI,GAAG,EAAE;AACxB,iBAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,eAAK,QAAQ,OAAO,KAAK,eAAe,CAAC;AACzC,eAAK,QAAQ,OAAO,KAAK,UAAU,GAAG,KAAK,SAAS,KAAK,KAAK,CAAC;AAAA,QACjE;AACA;AAAA,MACF;AAAA,MACA,KAAK,KAAK;AAER,YAAI,KAAK,WAAW,KAAK,cAAc,KAAK,WAAW,KAAK,eAAe;AACzE;AAAA,QACF;AACA,cAAM,IAAI,KAAK,IAAI,GAAG,EAAE;AACxB,iBAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,eAAK,QAAQ,OAAO,KAAK,UAAU,CAAC;AACpC,eAAK,QAAQ,OAAO,KAAK,eAAe,GAAG,KAAK,SAAS,KAAK,KAAK,CAAC;AAAA,QACtE;AACA;AAAA,MACF;AAAA,MACA,KAAK,KAAK;AAER,cAAM,MAAM,KAAK,QAAQ,KAAK,QAAQ;AACtC,YAAI,KAAK;AACP,gBAAM,IAAI,KAAK,IAAI,GAAG,EAAE;AACxB,cAAI,OAAO,KAAK,UAAU,CAAC;AAC3B,iBAAO,IAAI,SAAS,KAAK,MAAO,KAAI,KAAK,IAAI;AAAA,QAC/C;AACA;AAAA,MACF;AAAA,MACA,KAAK,KAAK;AAER,cAAM,MAAM,KAAK,QAAQ,KAAK,QAAQ;AACtC,YAAI,KAAK;AACP,gBAAM,IAAI,KAAK,IAAI,GAAG,EAAE;AACxB,mBAAS,IAAI,GAAG,IAAI,GAAG,IAAK,KAAI,OAAO,KAAK,UAAU,GAAG,IAAI;AAC7D,cAAI,OAAO,KAAK,KAAK;AAAA,QACvB;AACA;AAAA,MACF;AAAA,MACA,KAAK;AACH,aAAK,UAAU,KAAK,IAAI,GAAG,EAAE,CAAC;AAC9B;AAAA,MACF,KAAK;AACH,YAAIA,QAAO,UAAU,EAAG,MAAK,YAAY,KAAK,IAAI,GAAG,EAAE,CAAC;AACxD;AAAA,MACF,KAAK,KAAK;AAER,cAAM,IAAI,KAAK,IAAI,GAAG,EAAE;AACxB,iBAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,eAAK,WAAW,KAAK,IAAI,IAAI,KAAK,KAAK,KAAK,WAAW,CAAC,IAAI,KAAK,CAAC;AAAA,QACpE;AACA;AAAA,MACF;AAAA,MACA,KAAK;AACH,YAAI,KAAK,qBAAqB,MAAM;AAClC,mBAAS,QAAQ,GAAG,QAAQ,KAAK,IAAI,GAAG,EAAE,GAAG,SAAS,GAAG;AACvD,iBAAK,gBAAgB,KAAK,gBAAgB;AAAA,UAC5C;AAAA,QACF;AACA;AAAA,MACF,KAAK;AACH,aAAK,WAAW,KAAK,OAAO,KAAK,IAAI,GAAG,EAAE,IAAI,GAAG,GAAG,KAAK,QAAQ,CAAC;AAClE;AAAA,MACF,KAAK;AACH,aAAK,WAAW,KAAK,OAAO,KAAK,WAAW,KAAK,IAAI,GAAG,EAAE,GAAG,GAAG,KAAK,QAAQ,CAAC;AAC9E;AAAA,MACF,KAAK,KAAK;AAER,cAAM,MAAM,KAAK,OAAO,KAAK,IAAI,GAAG,EAAE,IAAI,GAAG,GAAG,KAAK,QAAQ,CAAC;AAC9D,cAAM,SAAS,KAAK,QAAQ,OAAO,IAAI,KAAK,QAAQ,MAAM,GAAG,GAAG,KAAK,QAAQ,CAAC;AAC9E,YAAI,MAAM,QAAQ;AAChB,eAAK,aAAa;AAClB,eAAK,gBAAgB;AAAA,QACvB;AACA,aAAK,WAAW;AAChB,aAAK,WAAW,KAAK,cAAc,KAAK,aAAa;AACrD;AAAA,MACF;AAAA,MACA,KAAK;AACH,aAAK,YAAY;AACjB;AAAA,MACF,KAAK;AACH,aAAK,eAAe;AACpB;AAAA,MACF,KAAK;AACH,YAAI,KAAK,gBAAgB,KAAK;AAC5B,eAAK,YAAY;AAAA,QACnB;AACA;AAAA,MACF,KAAK;AACH,aAAK,UAAUA,OAAM;AACrB;AAAA,MACF;AACE;AAAA,IACJ;AAAA,EACF;AAAA,EAEQ,MAAM,IAAkB;AAC9B,UAAM,OAAO,GAAG,WAAW,CAAC;AAE5B,QAAI,KAAK,WAAW,mBAAiB,SAAS,MAAQ,SAAS,KAAO;AACpE,WAAK,SAAS;AACd;AAAA,IACF;AAEA,QAAI,KAAK,WAAW,eAAa,SAAS,IAAM;AAC9C,WAAK,SAAS;AACd;AAAA,IACF;AAEA,YAAQ,KAAK,QAAQ;AAAA,MACnB,KAAK;AACH,aAAK,YAAY,IAAI,IAAI;AACzB;AAAA,MACF,KAAK;AACH,aAAK,YAAY,IAAI,IAAI;AACzB;AAAA,MACF,KAAK;AACH,aAAK,SAAS,IAAI,IAAI;AACtB;AAAA,MACF,KAAK;AAEH,YAAI,SAAS,KAAQ,SAAS,KAAM;AAClC,eAAK,SAAS;AAAA,QAChB,WAAW,SAAS,IAAM;AACxB,eAAK,eAAe;AACpB,eAAK,SAAS;AAAA,QAChB;AACA;AAAA,MACF,KAAK;AAEH,YAAI,SAAS,KAAM;AACjB,eAAK,SAAS;AAAA,QAChB,WAAW,SAAS,IAAM;AACxB,eAAK,eAAe;AACpB,eAAK,SAAS;AAAA,QAChB;AACA;AAAA,MACF,KAAK;AACH,aAAK,SAAS,OAAO,OAAO,iBAAe,KAAK;AAChD;AAAA,MACF,KAAK;AACH,YAAI,KAAK,mBAAmB,KAAM,MAAK,aAAa,OAAO,MAAM,aAAa;AAC9E,YAAI,KAAK,mBAAmB,KAAM,MAAK,aAAa,OAAO,MAAM,aAAa;AAC9E,aAAK,iBAAiB;AACtB,aAAK,SAAS;AACd;AAAA,MACF,KAAK;AACH,YAAI,OAAO,KAAK;AACd,mBAAS,MAAM,GAAG,MAAM,KAAK,OAAO,OAAO,GAAG;AAC5C,qBAAS,SAAS,GAAG,SAAS,KAAK,OAAO,UAAU,GAAG;AACrD,mBAAK,SAAS,KAAK,QAAQ,GAAG;AAAA,YAChC;AAAA,UACF;AACA,eAAK,WAAW;AAChB,eAAK,WAAW;AAAA,QAClB;AACA,aAAK,SAAS;AACd;AAAA,IACJ;AAAA,EACF;AAAA,EAEQ,YAAY,IAAY,MAAoB;AAClD,QAAI,SAAS,IAAM;AACjB,WAAK,SAAS;AAAA,IAChB,WAAW,SAAS,KAAM;AAExB,WAAK,aAAa;AAClB,WAAK,cAAc;AACnB,WAAK,SAAS;AAAA,IAChB,WAAW,SAAS,KAAM;AAExB,WAAK,SAAS;AAAA,IAChB,WAAW,SAAS,OAAQ,SAAS,OAAQ,SAAS,OAAQ,SAAS,KAAM;AAE3E,WAAK,SAAS;AAAA,IAChB,WAAW,SAAS,KAAM;AAExB,WAAK,WAAW;AAChB,WAAK,SAAS;AAAA,IAChB,WAAW,SAAS,KAAM;AAAA,IAE1B,WAAW,SAAS,KAAQ,SAAS,KAAQ,SAAS,GAAM;AAAA,IAE5D,WAAW,SAAS,GAAM;AAExB,WAAK,eAAe;AACpB,UAAI,KAAK,WAAW,EAAG,MAAK;AAAA,IAC9B,WAAW,SAAS,KAAM;AAAA,IAE1B,WAAW,SAAS,GAAM;AAExB,YAAM,cAAc,CAAC,GAAG,KAAK,SAAS,EACnC,KAAK,CAAC,MAAM,UAAU,OAAO,KAAK,EAClC,KAAK,CAAC,YAAY,UAAU,KAAK,QAAQ;AAC5C,WAAK,WAAW,eAAe,KAAK,QAAQ;AAAA,IAC9C,WAAW,SAAS,MAAQ,SAAS,MAAQ,SAAS,IAAM;AAE1D,WAAK,SAAS;AAAA,IAChB,WAAW,SAAS,IAAM;AAExB,WAAK,eAAe;AACpB,WAAK,WAAW;AAAA,IAClB,WAAW,SAAS,MAAQ,SAAS,IAAM;AAEzC,WAAK,YAAY,SAAS;AAAA,IAC5B,WAAW,QAAQ,MAAQ,SAAS,KAAM;AAExC,YAAM,UAAU,KAAK,YAAY,KAAK,aAAa,KAAK;AACxD,WAAK,gBAAgB,YAAY,aAAc,qBAAqB,EAAE,KAAK,KAAM,EAAE;AAAA,IACrF;AAAA,EACF;AAAA,EAEQ,YAAY,IAAY,MAAoB;AAClD,SAAK,SAAS;AAEd,QAAI,SAAS,IAAM;AAEjB,WAAK,aAAa;AAClB,WAAK,cAAc;AACnB,WAAK,SAAS;AAAA,IAChB,WAAW,SAAS,IAAM;AAExB,WAAK,SAAS;AAAA,IAChB,WAAW,SAAS,MAAQ,SAAS,MAAQ,SAAS,MAAQ,SAAS,IAAM;AAE3E,WAAK,SAAS;AAAA,IAChB,WACE,SAAS,MACT,SAAS,MACT,SAAS,MACT,SAAS,MACT,SAAS,MACT,SAAS,IACT;AAEA,WAAK,iBAAiB,SAAS,KAAO,OAAO,SAAS,KAAO,OAAO;AACpE,WAAK,SAAS;AAAA,IAChB,WAAW,SAAS,IAAM;AAExB,WAAK,SAAS;AAAA,IAChB,WAAW,SAAS,IAAM;AAExB,WAAK,YAAY;AAAA,IACnB,WAAW,SAAS,IAAM;AAExB,WAAK,eAAe;AAAA,IACtB,WAAW,SAAS,IAAM;AAExB,WAAK,SAAS;AAAA,IAChB,WAAW,SAAS,IAAM;AAExB,WAAK,WAAW;AAChB,WAAK,SAAS;AAAA,IAChB,WAAW,SAAS,IAAM;AAExB,UAAI,KAAK,aAAa,KAAK,YAAY;AACrC,aAAK,YAAY,CAAC;AAAA,MACpB,OAAO;AACL,aAAK,WAAW,KAAK,IAAI,GAAG,KAAK,WAAW,CAAC;AAAA,MAC/C;AAAA,IACF,WAAW,SAAS,IAAM;AAExB,WAAK,UAAU,IAAI,KAAK,QAAQ;AAAA,IAClC,WAAW,SAAS,IAAM;AAExB,WAAK,UAAU,KAAK,YAAY,KAAK,OAAO,KAAK,KAAK;AACtD,WAAK,WAAW;AAChB,WAAK,WAAW;AAChB,WAAK,aAAa;AAClB,WAAK,gBAAgB,KAAK,QAAQ;AAClC,WAAK,YAAY;AACjB,WAAK,eAAe,KAAK,wBAAwB;AAAA,IACnD;AAAA,EAEF;AAAA,EAEQ,SAAS,IAAY,MAAoB;AAC/C,QAAI,QAAQ,MAAQ,QAAQ,KAAM;AAEhC,WAAK,SAAS,EAAE;AAChB,WAAK,SAAS;AAAA,IAChB,WAAW,SAAS,MAAQ,SAAS,MAAQ,SAAS,MAAQ,SAAS,IAAM;AAE3E,WAAK,cAAc;AAAA,IACrB,WAAY,QAAQ,MAAQ,QAAQ,MAAS,SAAS,MAAQ,SAAS,IAAM;AAE3E,WAAK,cAAc;AAAA,IACrB;AAAA,EAEF;AAAA,EAEQ,cAAoB;AAC1B,SAAK,SAAS,wBAAwB;AACtC,SAAK,iBAAiB;AAAA,EACxB;AAAA,EAEQ,UAAUA,SAAwB;AACxC,UAAM,mBAAmBA,QAAO,WAAW,IAAI,CAAC,CAAC,IAAIA;AAErD,aAAS,QAAQ,GAAG,QAAQ,iBAAiB,QAAQ,SAAS,GAAG;AAC/D,YAAM,QAAQ,iBAAiB,KAAK,KAAK;AAEzC,cAAQ,OAAO;AAAA,QACb,KAAK;AACH,eAAK,YAAY;AACjB;AAAA,QACF,KAAK;AACH,eAAK,OAAO,OAAO;AACnB;AAAA,QACF,KAAK;AACH,eAAK,OAAO,MAAM;AAClB;AAAA,QACF,KAAK;AACH,eAAK,OAAO,SAAS;AACrB;AAAA,QACF,KAAK;AACH,eAAK,OAAO,YAAY;AACxB;AAAA,QACF,KAAK;AACH,eAAK,OAAO,UAAU;AACtB;AAAA,QACF,KAAK;AACH,eAAK,OAAO,UAAU;AACtB;AAAA,QACF,KAAK;AACH,eAAK,OAAO,gBAAgB;AAC5B;AAAA,QACF,KAAK;AAAA,QACL,KAAK;AACH,eAAK,OAAO,OAAO;AACnB,eAAK,OAAO,MAAM;AAClB;AAAA,QACF,KAAK;AACH,eAAK,OAAO,SAAS;AACrB;AAAA,QACF,KAAK;AACH,eAAK,OAAO,YAAY;AACxB;AAAA,QACF,KAAK;AACH,eAAK,OAAO,UAAU;AACtB;AAAA,QACF,KAAK;AACH,eAAK,OAAO,UAAU;AACtB;AAAA,QACF,KAAK;AACH,eAAK,OAAO,gBAAgB;AAC5B;AAAA,QACF,KAAK;AACH,eAAK,OAAO,KAAK;AACjB;AAAA,QACF,KAAK;AACH,eAAK,OAAO,KAAK;AACjB;AAAA,QACF,KAAK;AAAA,QACL,KAAK;AACH,kBAAQ,KAAK,oBAAoB,OAAO,kBAAkB,KAAK;AAC/D;AAAA,QACF;AACE,cAAK,SAAS,MAAM,SAAS,MAAQ,SAAS,MAAM,SAAS,IAAK;AAChE,iBAAK,OAAO,KAAK,CAAC,KAAK;AAAA,UACzB,WAAY,SAAS,MAAM,SAAS,MAAQ,SAAS,OAAO,SAAS,KAAM;AACzE,iBAAK,OAAO,KAAK,CAAC,KAAK;AAAA,UACzB;AACA;AAAA,MACJ;AAAA,IACF;AAEA,SAAK,iBAAiB,oBAAoB,KAAK,MAAM;AAAA,EACvD;AAAA,EAEQ,oBAAoB,SAAkBA,SAAkB,OAAuB;AACrF,UAAM,OAAOA,QAAO,QAAQ,CAAC;AAC7B,UAAM,SAAS,YAAY,KAAK,OAAO;AAEvC,QAAI,SAAS,GAAG;AACd,YAAM,eAAeA,QAAO,QAAQ,CAAC;AACrC,UAAI,iBAAiB,QAAW;AAC9B,aAAK,OAAO,MAAM,IAAI,CAAC,SAAS,GAAG,YAAY;AAC/C,eAAO,QAAQ;AAAA,MACjB;AAEA,aAAO;AAAA,IACT;AAEA,QAAI,SAAS,GAAG;AACd,YAAM,MAAMA,QAAO,QAAQ,CAAC;AAC5B,YAAM,QAAQA,QAAO,QAAQ,CAAC;AAC9B,YAAM,OAAOA,QAAO,QAAQ,CAAC;AAC7B,UAAI,QAAQ,UAAa,UAAU,UAAa,SAAS,QAAW;AAClE,aAAK,OAAO,MAAM,IAAI,CAAC,SAAS,GAAG,KAAK,OAAO,IAAI;AACnD,eAAO,QAAQ;AAAA,MACjB;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AACF;AAEA,SAAS,0BAAyC;AAChD,SAAO;AAAA,IACL,MAAM;AAAA,IACN,KAAK;AAAA,IACL,QAAQ;AAAA,IACR,WAAW;AAAA,IACX,SAAS;AAAA,IACT,SAAS;AAAA,IACT,eAAe;AAAA,EACjB;AACF;AAEA,SAAS,qBAAqB,WAA4B;AACxD,SACG,aAAa,OAAU,aAAa,OACpC,aAAa,QAAU,aAAa,QACpC,aAAa,QAAU,aAAa,QACpC,aAAa,QAAU,aAAa,QACpC,aAAa,SAAU,aAAa;AAEzC;AAEA,SAAS,oBAAoB,OAA8B;AACzD,QAAM,QAAkB,CAAC;AAEzB,MAAI,MAAM,MAAM;AACd,UAAM,KAAK,CAAC;AAAA,EACd;AACA,MAAI,MAAM,KAAK;AACb,UAAM,KAAK,CAAC;AAAA,EACd;AACA,MAAI,MAAM,QAAQ;AAChB,UAAM,KAAK,CAAC;AAAA,EACd;AACA,MAAI,MAAM,WAAW;AACnB,UAAM,KAAK,CAAC;AAAA,EACd;AACA,MAAI,MAAM,SAAS;AACjB,UAAM,KAAK,CAAC;AAAA,EACd;AACA,MAAI,MAAM,SAAS;AACjB,UAAM,KAAK,CAAC;AAAA,EACd;AACA,MAAI,MAAM,eAAe;AACvB,UAAM,KAAK,CAAC;AAAA,EACd;AACA,MAAI,MAAM,OAAO,QAAW;AAC1B,UAAM,KAAK,GAAG,MAAM,EAAE;AAAA,EACxB;AACA,MAAI,MAAM,OAAO,QAAW;AAC1B,UAAM,KAAK,GAAG,MAAM,EAAE;AAAA,EACxB;AAEA,SAAO,MAAM,WAAW,IAAI,KAAK,QAAQ,MAAM,KAAK,GAAG,CAAC;AAC1D;;;AC/8BA,IAAM,sBAAsB;AAAA,EAC1B,OAAO;AAAA,EACP,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,WAAW;AAAA,EACX,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,MAAM;AAAA,EACN,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,OAAO;AACT;AAEA,IAAM,kBAAkB,IAAI;AAAA,EACzB,OAAO,QAAQ,mBAAmB,EAAyB,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,YAAY,GAAG,CAAC,CAAC;AAClG;AAEA,IAAM,kBAAkB,eAAe,OAAO,KAAK,mBAAmB,EAAE,KAAK,IAAI,CAAC;AAClF,IAAM,oBAAoB,OAAO,KAAK,mBAAmB,EAAE,IAAI,sBAAsB,EAAE,KAAK,GAAG;AAExF,IAAM,uBAAuB,OAAO,iBAAiB;AAE5D,SAAS,gBAAgB,KAAoB;AAC3C,SAAO,IAAI,MAAM,yBAAyB,GAAG,KAAK,eAAe,EAAE;AACrE;AAoBO,SAAS,cAAc,KAA0B;AACtD,QAAM,WAAY,IAAe,YAAY;AAE7C,QAAM,gBAAgB,gBAAgB,IAAI,QAAQ;AAClD,MAAI,kBAAkB,QAAW;AAC/B,WAAO;AAAA,EACT;AAEA,MAAI,SAAS,WAAW,UAAU,GAAG;AACnC,WAAO,qBAAsB,IAAe,MAAM,WAAW,MAAM,CAAC;AAAA,EACtE;AAEA,MAAI,SAAS,WAAW,MAAM,GAAG;AAC/B,UAAM,YAAa,IAAe,MAAM,OAAO,MAAM;AACrD,QAAI,UAAU,WAAW,GAAG;AAC1B,YAAM,gBAAgB,GAAG;AAAA,IAC3B;AAEA,QAAI,UAAU,WAAW,GAAG;AAC1B,aAAO,SAAS;AAAA,IAClB;AAEA,QAAI;AACF,aAAO,SAAS,cAAc,SAAwB;AAAA,IACxD,QAAQ;AACN,YAAM,gBAAgB,GAAG;AAAA,IAC3B;AAAA,EACF;AAEA,MAAK,IAAe,WAAW,GAAG;AAChC,WAAO;AAAA,EACT;AAEA,QAAM,gBAAgB,GAAG;AAC3B;AAEA,SAAS,qBAAqB,YAA4B;AACxD,MAAI,WAAW,WAAW,GAAG;AAC3B,UAAM,gBAAgB,WAAW,UAAU,EAAE;AAAA,EAC/C;AAEA,QAAM,kBAAkB,WAAW,YAAY;AAC/C,QAAM,WAAW,gBAAgB,WAAW,CAAC;AAC7C,MAAI,WAAW,MAAM,WAAW,IAAI;AAClC,UAAM,gBAAgB,WAAW,UAAU,EAAE;AAAA,EAC/C;AAEA,SAAO,OAAO,aAAa,WAAW,EAAE;AAC1C;AAEA,SAAS,uBAAuB,OAAuB;AACrD,MAAI,UAAU;AAEd,aAAW,aAAa,OAAO;AAC7B,UAAM,QAAQ,UAAU,YAAY;AACpC,UAAM,QAAQ,UAAU,YAAY;AACpC,eAAW,UAAU,QAAQ,uBAAuB,SAAS,IAAI,IAAI,KAAK,GAAG,KAAK;AAAA,EACpF;AAEA,SAAO;AACT;AAEA,SAAS,uBAAuB,WAA2B;AACzD,SAAO,UAAU,QAAQ,uBAAuB,MAAM;AACxD;;;AC9GO,IAAM,iBAAN,MAAqB;AAAA,EACjB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAET,YAAY;AAAA,IACV;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,GAKG;AACD,SAAK,QAAQ,OAAO,OAAO,MAAM,IAAI,CAAC,SAAS,UAAU,IAAI,CAAC,CAAC;AAC/D,SAAK,WAAW,OAAO,OAAO,CAAC,GAAG,QAAQ,CAAC;AAC3C,SAAK,SAAS,OAAO,OAAO,EAAE,GAAG,OAAO,CAAC;AACzC,SAAK,OAAO,OAAO,OAAO,EAAE,GAAG,KAAK,CAAC;AAErC,WAAO,OAAO,IAAI;AAAA,EACpB;AAAA,EAEA,IAAI,OAAe;AACjB,WAAO,KAAK,MAAM,KAAK,IAAI;AAAA,EAC7B;AAAA,EAEA,SAAS,WAA4B;AACnC,WAAO,KAAK,KAAK,SAAS,SAAS;AAAA,EACrC;AAAA,EAEA,KAAK,OAAuB;AAC1B,UAAM,kBAAkB,QAAQ,IAAI,KAAK,MAAM,SAAS,QAAQ;AAChE,UAAM,OAAO,KAAK,MAAM,eAAe;AAEvC,QAAI,SAAS,QAAW;AACtB,YAAM,IAAI,WAAW,6BAA6B,KAAK,EAAE;AAAA,IAC3D;AAEA,WAAO;AAAA,EACT;AACF;;;ALlCA,IAAM,eAAe;AACrB,IAAM,eAAe;AACrB,IAAM,qBAAqB;AAC3B,IAAM,mBAAmB;AACzB,IAAM,gBAAgB;AACtB,IAAM,8BAA8B;AACpC,IAAM,yBAAyB;AAC/B,IAAM,yBAAyB;AA+BxB,IAAM,kBAAN,MAAsB;AAAA,EAClB;AAAA,EACA;AAAA,EACA;AAAA,EACT,WAA0B;AAAA,EAET;AAAA,EACA;AAAA,EACA,UAAU,IAAI,aAAa;AAAA,EAC3B;AAAA,EACT,YAAY;AAAA,EACZ,aAAa,KAAK,IAAI;AAAA,EACtB;AAAA,EACA;AAAA,EACA,eAAuC;AAAA,EAE/C,YAAY;AAAA,IACV;AAAA,IACA;AAAA,IACA,OAAO,CAAC;AAAA,IACR,MAAM,QAAQ,IAAI;AAAA,IAClB,MAAM,QAAQ;AAAA,IACd,OAAO;AAAA,IACP,OAAO;AAAA,IACP,UAAU;AAAA,EACZ,GAA2B;AACzB,2BAAuB,MAAM,IAAI;AACjC,SAAK,KAAK;AACV,SAAK,UAAU;AACf,SAAK,cAAc;AACnB,SAAK,cAAc;AACnB,SAAK,WAAW,IAAI,eAAe,MAAM,IAAI;AAC7C,SAAK,MAAM,iBAAiB,EAAE,SAAS,MAAM,KAAK,KAAK,MAAM,KAAK,CAAC;AACnE,SAAK,MAAM,KAAK,IAAI;AAEpB,UAAM,mBAAmB,KAAK,IAAI,OAAO,CAAC,UAAU;AAClD,WAAK,aAAa;AAClB,WAAK,aAAa,KAAK,IAAI;AAC3B,WAAK,SAAS,MAAM,KAAK;AAEzB,UAAI,SAAS;AACX,gBAAQ,OAAO,MAAM,KAAK;AAAA,MAC5B;AAAA,IACF,CAAC;AAED,QAAI;AAEJ,SAAK,cAAc,IAAI,QAAgB,CAAC,YAAY;AAClD,yBAAmB,KAAK,IAAI,OAAO,CAAC,EAAE,SAAS,MAAM;AACnD,YAAI,KAAK,aAAa,MAAM;AAC1B,kBAAQ,KAAK,QAAQ;AACrB;AAAA,QACF;AAEA,aAAK,WAAW;AAChB,yBAAiB,QAAQ;AACzB,0BAAkB,QAAQ;AAC1B,aAAK,QAAQ,KAAK,QAAQ,QAAQ;AAClC,gBAAQ,QAAQ;AAAA,MAClB,CAAC;AAAA,IACH,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,KAAK,MAA6B;AACtC,eAAW,aAAa,MAAM;AAC5B,YAAM,KAAK,KAAK,SAAS;AACzB,YAAM,MAAM,aAAa;AAAA,IAC3B;AAAA,EACF;AAAA,EAEA,MAAM,KAAK,MAA6B;AACtC,UAAM,KAAK,KAAK,KAAK,QAAQ,UAAU,IAAI,CAAC;AAAA,EAC9C;AAAA,EAEA,MAAM,MAAM,KAAiC;AAC3C,UAAM,KAAK,KAAK,cAAc,GAAG,CAAC;AAAA,EACpC;AAAA,EAEA,MAAM,KAAK,KAA4B;AACrC,QAAI,KAAK,aAAa,MAAM;AAC1B,YAAM,IAAI,MAAM,qBAAqB,KAAK,EAAE,uBAAuB;AAAA,IACrE;AAEA,SAAK,IAAI,MAAM,GAAG;AAAA,EACpB;AAAA,EAEA,MAAM,OAAO,KAA4B;AACvC,QAAI,KAAK,aAAa,MAAM;AAC1B;AAAA,IACF;AAEA,SAAK,IAAI,KAAK,GAAG;AAAA,EACnB;AAAA,EAEA,MAAM,QAAQ,SAA0B,MAAwC;AAC9E,UAAM,UAAU,MAAM,WAAW;AACjC,UAAM,QAAQ,MAAM,SAAS;AAC7B,kBAAc,OAAO;AACrB,oBAAgB,KAAK;AACrB,UAAM,YAAY,KAAK,IAAI;AAE3B,WAAO,KAAK,IAAI,IAAI,aAAa,SAAS;AACxC,YAAM,SAAS,UAAU,YAAY,MAAM,KAAK,OAAO,GAAG,OAAO,KAAK;AACtE,YAAM,UAAU,aAAa,QAAQ,OAAO;AAC5C,UAAI,YAAY,MAAM;AACpB,eAAO;AAAA,MACT;AAEA,UAAI,KAAK,aAAa,MAAM;AAC1B,cAAM,IAAI,MAAM,qBAAqB,KAAK,EAAE,qCAAqC,OAAO,OAAO,CAAC,EAAE;AAAA,MACpG;AAEA,YAAM,MAAM,gBAAgB;AAAA,IAC9B;AAEA,UAAM,IAAI,MAAM,uCAAuC,OAAO,OAAO,OAAO,OAAO,CAAC,EAAE;AAAA,EACxF;AAAA,EAEA,MAAM,aAAa,IAA2B;AAC5C,sBAAkB,EAAE;AACpB,WAAO,MAAM;AACX,YAAM,YAAY,MAAM,KAAK,IAAI,IAAI,KAAK;AAC1C,UAAI,aAAa,GAAG;AAClB;AAAA,MACF;AAEA,YAAM,MAAM,SAAS;AAAA,IACvB;AAAA,EACF;AAAA,EAEA,MAAM,SAAkC;AACtC,UAAM,WAAqB,CAAC;AAE5B,aAAS,MAAM,GAAG,MAAM,KAAK,aAAa,OAAO,GAAG;AAClD,eAAS,KAAK,KAAK,SAAS,WAAW,GAAG,CAAC;AAAA,IAC7C;AAEA,WAAO,IAAI,eAAe;AAAA,MACxB,OAAO;AAAA,MACP;AAAA,MACA,QAAQ;AAAA,QACN,KAAK,KAAK,SAAS,cAAc;AAAA,QACjC,KAAK,KAAK,SAAS,cAAc;AAAA,MACnC;AAAA,MACA,MAAM;AAAA,QACJ,MAAM,KAAK;AAAA,QACX,MAAM,KAAK;AAAA,MACb;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,QAAQ,MAA0C;AACtD,UAAM,aAAa,uBAAuB,UAAU,KAAK,SAAS,CAAC;AACnE,UAAM,QAAQ,kBAAkB,UAAU;AAE1C,QAAI,MAAM,SAAS,QAAW;AAC5B,aAAO;AAAA,IACT;AAEA,QAAI,CAAC,OAAO,UAAU,KAAK,IAAI,KAAK,KAAK,OAAO,GAAG;AACjD,YAAM,IAAI,MAAM,8CAA8C;AAAA,IAChE;AAEA,UAAM,QAAQ,KAAK,IAAI,GAAG,MAAM,SAAS,KAAK,IAAI;AAClD,WAAO,MAAM,MAAM,KAAK;AAAA,EAC1B;AAAA,EAEA,MAAM,OAAO,MAAc,MAA6B;AACtD,2BAAuB,MAAM,IAAI;AACjC,SAAK,cAAc;AACnB,SAAK,cAAc;AACnB,QAAI,KAAK,aAAa,MAAM;AAC1B,WAAK,IAAI,OAAO,MAAM,IAAI;AAAA,IAC5B;AACA,SAAK,SAAS,OAAO,MAAM,IAAI;AAAA,EACjC;AAAA,EAEA,MAAM,YAAY,MAA8C;AAC9D,QAAI,MAAM,YAAY,QAAW;AAC/B,oBAAc,KAAK,OAAO;AAAA,IAC5B;AAEA,QAAI,KAAK,aAAa,MAAM;AAC1B,aAAO,KAAK;AAAA,IACd;AAEA,QAAI,MAAM,YAAY,QAAW;AAC/B,YAAM,SAAS,MAAM,YAAY,KAAK,aAAa,KAAK,OAAO;AAC/D,UAAI,WAAW,MAAM;AACnB,cAAM,IAAI,MAAM,+CAA+C,KAAK,OAAO,IAAI;AAAA,MACjF;AACA,aAAO;AAAA,IACT;AAEA,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,MAAM,QAAyB;AAC7B,QAAI,KAAK,aAAa,MAAM;AAC1B,aAAO,KAAK;AAAA,IACd;AAEA,SAAK,iBAAiB,KAAK,aAAa,EAAE,MAAM,CAAC,UAAmB;AAClE,WAAK,eAAe;AACpB,YAAM;AAAA,IACR,CAAC;AACD,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,MAAc,eAAgC;AAC5C,UAAM,mBAAmB,MAAM,YAAY,KAAK,aAAa,2BAA2B;AACxF,QAAI,qBAAqB,MAAM;AAC7B,aAAO;AAAA,IACT;AAEA,QAAI,KAAK,aAAa,MAAM;AAC1B,WAAK,IAAI,KAAK,SAAS;AACvB,YAAM,eAAe,MAAM,YAAY,KAAK,aAAa,sBAAsB;AAC/E,UAAI,iBAAiB,MAAM;AACzB,eAAO;AAAA,MACT;AAAA,IACF;AAEA,QAAI,KAAK,aAAa,MAAM;AAC1B,WAAK,IAAI,KAAK,SAAS;AACvB,YAAM,eAAe,MAAM,YAAY,KAAK,aAAa,sBAAsB;AAC/E,UAAI,iBAAiB,MAAM;AACzB,eAAO;AAAA,MACT;AAAA,IACF;AAEA,UAAM,IAAI,MAAM,sDAAsD;AAAA,EACxE;AAAA,EAEA,GAAG,OAAe,IAAkC;AAClD,SAAK,QAAQ,GAAG,OAAO,EAAE;AAAA,EAC3B;AACF;AAEA,SAAS,uBAAuB,MAAc,MAAoB;AAChE,MAAI,CAAC,OAAO,UAAU,IAAI,KAAK,QAAQ,KAAK,CAAC,OAAO,UAAU,IAAI,KAAK,QAAQ,GAAG;AAChF,UAAM,IAAI,MAAM,sDAAsD;AAAA,EACxE;AACF;AAEA,SAAS,cAAc,SAAuB;AAC5C,MAAI,CAAC,OAAO,SAAS,OAAO,KAAK,UAAU,GAAG;AAC5C,UAAM,IAAI,MAAM,+CAA+C;AAAA,EACjE;AACF;AAEA,SAAS,gBAAgB,OAAqB;AAC5C,MAAI,UAAU,aAAa,UAAU,UAAU;AAC7C,UAAM,IAAI,MAAM,kDAAkD;AAAA,EACpE;AACF;AAEA,SAAS,kBAAkB,UAAwB;AACjD,MAAI,CAAC,OAAO,SAAS,QAAQ,KAAK,WAAW,GAAG;AAC9C,UAAM,IAAI,MAAM,oDAAoD;AAAA,EACtE;AACF;AAEA,SAAS,iBAAiB;AAAA,EACxB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAOY;AACV,8BAA4B;AAC5B,SAAe,cAAM,SAAS,MAAM;AAAA,IAClC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,UAAU;AAAA,EACZ,CAAC;AACH;AAEA,IAAI,qBAAqB;AAEzB,SAAS,8BAAoC;AAC3C,MAAI,mBAAoB;AACxB,uBAAqB;AAErB,QAAMC,WAAU,cAAc,YAAY,GAAG;AAC7C,QAAM,aAAa,QAAQA,SAAQ,QAAQ,UAAU,CAAC;AACtD,QAAM,SAAS,KAAK,YAAY,MAAM,aAAa,GAAG,QAAQ,QAAQ,IAAI,QAAQ,IAAI,IAAI,cAAc;AAExG,MAAI;AACF,eAAW,QAAQ,UAAU,IAAI;AAAA,EACnC,SAAS,OAAO;AACd,QAAI,mBAAmB,KAAK,GAAG;AAC7B;AAAA,IACF;AAEA,QAAI;AACF,gBAAU,QAAQ,GAAK;AAAA,IACzB,SAAS,YAAY;AACnB,UAAI,mBAAmB,UAAU,GAAG;AAClC;AAAA,MACF;AAEA,YAAM;AAAA,IACR;AAAA,EACF;AACF;AAEA,SAAS,mBAAmB,OAAyB;AACnD,SAAO,gBAAgB,OAAO,QAAQ;AACxC;AAEA,SAAS,aAAa,QAAgB,SAAyC;AAC7E,QAAM,QAAQ,uBAAuB,UAAU,MAAM,CAAC;AAEtD,aAAW,QAAQ,MAAM,MAAM,IAAI,GAAG;AACpC,QAAI,OAAO,YAAY,UAAU;AAC/B,UAAI,KAAK,SAAS,OAAO,EAAG,QAAO;AAAA,IACrC,OAAO;AACL,YAAM,QAAQ,gBAAgB,QAAQ,OAAO,GAAG;AAChD,UAAI,IAAI,OAAO,QAAQ,QAAQ,KAAK,EAAE,KAAK,IAAI,EAAG,QAAO;AAAA,IAC3D;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,gBAAgB,OAAe,cAA8B;AACpE,MAAI,SAAS;AAEb,aAAW,aAAa,OAAO;AAC7B,QAAI,cAAc,cAAc;AAC9B,gBAAU;AAAA,IACZ;AAAA,EACF;AAEA,SAAO;AACT;AAGA,SAAS,kBAAkB,OAAyB;AAClD,QAAM,QAAQ,MAAM,MAAM,IAAI;AAE9B,MAAI,MAAM,SAAS,KAAK,MAAM,MAAM,SAAS,CAAC,MAAM,IAAI;AACtD,UAAM,IAAI;AAAA,EACZ;AAEA,SAAO;AACT;AAEA,SAAS,uBAAuB,OAAuB;AACrD,MAAI,SAAS;AACb,MAAI,OAAO;AACX,MAAI,SAAS;AAEb,aAAW,aAAa,OAAO;AAC7B,QAAI,cAAc,MAAM;AACtB,eAAS;AACT;AAAA,IACF;AAEA,QAAI,cAAc,MAAM;AACtB,eAAS,KAAK,IAAI,GAAG,SAAS,CAAC;AAC/B;AAAA,IACF;AAEA,QAAI,cAAc,MAAM;AACtB,gBAAU,GAAG,IAAI;AAAA;AACjB,aAAO;AACP,eAAS;AACT;AAAA,IACF;AAEA,WAAO,GAAG,KAAK,MAAM,GAAG,MAAM,CAAC,GAAG,SAAS,GAAG,KAAK,MAAM,SAAS,CAAC,CAAC;AACpE,cAAU;AAAA,EACZ;AAEA,SAAO,SAAS;AAClB;AAEA,SAAS,MAAM,IAA2B;AACxC,SAAO,IAAI,QAAQ,CAAC,YAAY;AAC9B,eAAW,SAAS,EAAE;AAAA,EACxB,CAAC;AACH;AAEA,eAAe,YAAY,aAA8B,SAAyC;AAChG,SAAO,IAAI,QAAQ,CAAC,YAAY;AAC9B,QAAI,UAAU;AAEd,UAAM,QAAQ,WAAW,MAAM;AAC7B,UAAI,SAAS;AACX;AAAA,MACF;AAEA,gBAAU;AACV,cAAQ,IAAI;AAAA,IACd,GAAG,OAAO;AAEV,SAAK,YAAY,KAAK,CAAC,SAAS;AAC9B,UAAI,SAAS;AACX;AAAA,MACF;AAEA,gBAAU;AACV,mBAAa,KAAK;AAClB,cAAQ,IAAI;AAAA,IACd,CAAC;AAAA,EACH,CAAC;AACH;;;ADhdA,IAAMC,gBAAe;AACrB,IAAMC,gBAAe;AAYd,IAAM,gBAAN,MAAM,eAAc;AAAA,EACR,aAAa,oBAAI,IAA6B;AAAA,EAE/D,aAAa,SAAiC;AAC5C,WAAO,IAAI,eAAc;AAAA,EAC3B;AAAA,EAEA,MAAM,WAAW,MAAmD;AAClE,UAAM,UAAU,IAAI,gBAAgB;AAAA,MAClC,IAAI,WAAW;AAAA,MACf,SAAS,KAAK;AAAA,MACd,MAAM,KAAK;AAAA,MACX,KAAK,KAAK;AAAA,MACV,KAAK,KAAK;AAAA,MACV,MAAM,KAAK,QAAQD;AAAA,MACnB,MAAM,KAAK,QAAQC;AAAA,MACnB,SAAS,KAAK,WAAW;AAAA,IAC3B,CAAC;AAED,SAAK,WAAW,IAAI,QAAQ,IAAI,OAAO;AACvC,WAAO;AAAA,EACT;AAAA,EAEA,WAAW,IAA6B;AACtC,UAAM,UAAU,KAAK,WAAW,IAAI,EAAE;AAEtC,QAAI,YAAY,QAAW;AACzB,YAAM,IAAI,MAAM,sBAAsB,EAAE,EAAE;AAAA,IAC5C;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,cAAc,IAAkB;AAC9B,SAAK,WAAW,OAAO,EAAE;AAAA,EAC3B;AAAA,EAEA,WAA8B;AAC5B,WAAO,CAAC,GAAG,KAAK,WAAW,OAAO,CAAC,EAAE,OAAO,CAAC,MAAM,EAAE,aAAa,IAAI;AAAA,EACxE;AAAA,EAEA,MAAM,QAAuB;AAC3B,UAAM,WAAW,CAAC,GAAG,KAAK,WAAW,OAAO,CAAC;AAE7C,UAAM,QAAQ;AAAA,MACZ,SAAS,IAAI,OAAO,YAAY;AAC9B,cAAM,QAAQ,MAAM;AACpB,aAAK,WAAW,OAAO,QAAQ,EAAE;AAAA,MACnC,CAAC;AAAA,IACH;AAAA,EACF;AACF;;;AO7DO,IAAM,kBAAkB;AAqD/B,IAAI;AAEG,SAAS,wBACd,SACsB;AACtB,MAAI,YAAY,QAAW;AACzB,WAAO;AAAA,EACT;AAEA,oBAAkB,2BAA2B;AAC7C,SAAO;AACT;AAEO,SAAS,2BACd,UAA6C,CAAC,GACxB;AACtB,QAAM,cAAc,QAAQ,eAAe,cAAc;AACzD,QAAM,WAAW,oBAAI,IAAoB;AACzC,QAAM,WAAW,oBAAI,IAAoB;AACzC,QAAM,eAAe,oBAAI,IAAY;AACrC,MAAI;AAEJ,WAAS,iBAAiB,MAA0B,KAAsC;AACxF,UAAM,gBAAgB,QAAQ,KAAK,IAAI,eAAe;AAEtD,QAAI,kBAAkB,UAAa,cAAc,KAAK,EAAE,WAAW,GAAG;AACpE,YAAM,IAAI,UAAU,iCAAiC;AAAA,IACvD;AAEA,WAAO;AAAA,EACT;AAEA,iBAAe,WAAuC;AACpD,qBAAiB,YAAY;AAC7B,WAAO;AAAA,EACT;AAEA,WAAS,kBAA0B;AACjC,QAAI,QAAQ;AAEZ,WAAO,SAAS,IAAI,IAAI,KAAK,EAAE,KAAK,aAAa,IAAI,IAAI,KAAK,EAAE,GAAG;AACjE,eAAS;AAAA,IACX;AAEA,WAAO,IAAI,KAAK;AAAA,EAClB;AAEA,WAAS,gBAAgB,MAAc,SAAoC;AACzE,aAAS,IAAI,MAAM,QAAQ,EAAE;AAC7B,aAAS,IAAI,QAAQ,IAAI,IAAI;AAC7B,WAAO,EAAE,MAAM,QAAQ;AAAA,EACzB;AAEA,WAAS,cAAc,MAAc,WAAyB;AAC5D,QAAI,SAAS,IAAI,IAAI,MAAM,WAAW;AACpC,eAAS,OAAO,IAAI;AAAA,IACtB;AACA,QAAI,SAAS,IAAI,SAAS,MAAM,MAAM;AACpC,eAAS,OAAO,SAAS;AAAA,IAC3B;AAAA,EACF;AAEA,WAAS,wBAAwB,OAAyB;AACxD,QAAI,MAAM,WAAW,GAAG;AACtB,aAAO;AAAA,IACT;AAEA,WAAO,uBAAuB,MAAM,KAAK,IAAI,CAAC;AAAA,EAChD;AAEA,iBAAe,mBAAmB,MAAqC;AACrE,UAAM,YAAY,SAAS,IAAI,IAAI;AAEnC,QAAI,cAAc,QAAW;AAC3B,YAAM,SAAS,MAAM,aAAa;AAClC,YAAM,IAAI;AAAA,QACR,YAAY,IAAI,oBAAoB,wBAAwB,OAAO,IAAI,CAAC,UAAU,MAAM,IAAI,CAAC,CAAC;AAAA,MAChG;AAAA,IACF;AAEA,UAAM,QAAQ,MAAM,SAAS;AAE7B,QAAI;AACF,aAAO,EAAE,MAAM,SAAS,MAAM,WAAW,SAAS,EAAE;AAAA,IACtD,QAAQ;AACN,oBAAc,MAAM,SAAS;AAC7B,YAAM,SAAS,MAAM,aAAa;AAClC,YAAM,IAAI;AAAA,QACR,YAAY,IAAI,oBAAoB,wBAAwB,OAAO,IAAI,CAAC,UAAU,MAAM,IAAI,CAAC,CAAC;AAAA,MAChG;AAAA,IACF;AAAA,EACF;AAEA,iBAAe,eAAwC;AACrD,UAAM,QAAQ,MAAM,SAAS;AAE7B,WAAO,MAAM,SAAS,EAAE,QAAQ,CAAC,YAAY;AAC3C,YAAM,OAAO,SAAS,IAAI,QAAQ,EAAE;AAEpC,UAAI,SAAS,QAAW;AACtB,eAAO,CAAC;AAAA,MACV;AAEA,aAAO,CAAC,EAAE,MAAM,QAAQ,CAAC;AAAA,IAC3B,CAAC;AAAA,EACH;AAEA,iBAAe,yBAAyB,MAA6B;AACnE,UAAM,YAAY,SAAS,IAAI,IAAI;AACnC,QAAI,cAAc,QAAW;AAC3B;AAAA,IACF;AAEA,UAAM,QAAQ,MAAM,SAAS;AAC7B,QAAI;AACF,YAAM,UAAU,MAAM,WAAW,SAAS;AAC1C,UAAI,QAAQ,aAAa,MAAM;AAC7B;AAAA,MACF;AACA,YAAM,cAAc,SAAS;AAAA,IAC/B,QAAQ;AAAA,IAER;AACA,kBAAc,MAAM,SAAS;AAAA,EAC/B;AAEA,SAAO;AAAA,IACL,MAAM,cAAcC,SAA6B,KAAyC;AACxF,UAAIA,QAAO,QAAQ,KAAK,EAAE,WAAW,GAAG;AACtC,cAAM,IAAI,UAAU,4BAA4B;AAAA,MAClD;AAEA,YAAM,gBAAgB,iBAAiBA,QAAO,SAAS,GAAG,KAAK,gBAAgB;AAE/E,YAAM,yBAAyB,aAAa;AAE5C,UAAI,SAAS,IAAI,aAAa,KAAK,aAAa,IAAI,aAAa,GAAG;AAClE,cAAM,IAAI,UAAU,YAAY,aAAa,mBAAmB;AAAA,MAClE;AAEA,mBAAa,IAAI,aAAa;AAC9B,UAAI;AACF,cAAM,QAAQ,MAAM,SAAS;AAC7B,cAAM,UAAU,MAAM,MAAM,WAAW;AAAA,UACrC,SAASA,QAAO;AAAA,UAChB,MAAMA,QAAO;AAAA,UACb,KAAKA,QAAO;AAAA,UACZ,MAAMA,QAAO;AAAA,UACb,MAAMA,QAAO;AAAA,UACb,SAASA,QAAO;AAAA,QAClB,CAAC;AAED,eAAO,gBAAgB,eAAe,OAAO;AAAA,MAC/C,UAAE;AACA,qBAAa,OAAO,aAAa;AAAA,MACnC;AAAA,IACF;AAAA,IAEA,MAAM,eAAe,MAA0B,KAAyC;AACtF,YAAM,gBAAgB,iBAAiB,MAAM,GAAG;AAEhD,UAAI,kBAAkB,QAAW;AAC/B,eAAO,mBAAmB,aAAa;AAAA,MACzC;AAEA,YAAM,SAAS,MAAM,aAAa;AAElC,UAAI,OAAO,WAAW,GAAG;AACvB,eAAO,OAAO,CAAC;AAAA,MACjB;AAEA,UAAI,OAAO,WAAW,GAAG;AACvB,cAAM,IAAI,UAAU,qDAAqD;AAAA,MAC3E;AAEA,YAAM,IAAI;AAAA,QACR,oFAAoF,eAAe,KAAK,wBAAwB,OAAO,IAAI,CAAC,UAAU,MAAM,IAAI,CAAC,CAAC;AAAA,MACpK;AAAA,IACF;AAAA,IAEA,MAAM,aACJ,MACA,KAC6C;AAC7C,YAAM,eAAe,MAAM,KAAK,eAAe,MAAM,GAAG;AACxD,YAAM,WAAW,MAAM,aAAa,QAAQ,MAAM;AAClD,YAAM,QAAQ,MAAM,SAAS;AAE7B,YAAM,cAAc,aAAa,QAAQ,EAAE;AAC3C,oBAAc,aAAa,MAAM,aAAa,QAAQ,EAAE;AAExD,aAAO;AAAA,QACL;AAAA,QACA,MAAM,aAAa;AAAA,MACrB;AAAA,IACF;AAAA,IACA;AAAA,IAEA,MAAM,sBAAwC;AAC5C,aAAO,SAAS,OAAO,KAAK,aAAa,OAAO;AAAA,IAClD;AAAA,IAEA,MAAM,QAAuB;AAC3B,UAAI,iBAAiB,QAAW;AAC9B;AAAA,MACF;AAEA,YAAM,QAAQ,MAAM;AACpB,YAAM,MAAM,MAAM;AAClB,qBAAe;AACf,eAAS,MAAM;AACf,eAAS,MAAM;AACf,mBAAa,MAAM;AAAA,IACrB;AAAA,EACF;AACF;;;AC/QA,IAAM,SAAS,EAAE,OAAO;AAAA,EACtB,SAAS,EAAE;AAAA,IACT,EAAE,OAAO,EAAE,OAAO,KAAK,aAAa,gBAAgB,WAAW,GAAG,SAAS,MAAM,CAAC;AAAA,EACpF;AACF,CAAC;AAEM,IAAM,eAAe,cAO1B;AAAA,EACA,MAAM;AAAA,EACN,aAAa;AAAA,EACb,OAAO,CAAC,OAAO,OAAO,KAAK;AAAA,EAC3B;AAAA,EACA,SAAS,OAAO,EAAE,QAAAC,SAAQ,KAAK,qBAAqB,MAAM;AACxD,UAAM,EAAE,SAAS,IAAI,MAAM,wBAAwB,oBAAoB,EAAE;AAAA,MACvEA,QAAO;AAAA,MACP;AAAA,IACF;AACA,WAAO,EAAE,SAAS;AAAA,EACpB;AACF,CAAC;",
6
6
  "names": ["fileURLToPath", "assertValidBranches", "path", "fileURLToPath", "location", "separatorIndex", "previousSeparatorIndex", "candidate", "params", "require", "DEFAULT_COLS", "DEFAULT_ROWS", "params", "params"]
7
7
  }