@churivibhav/reqex 0.1.2 → 0.1.3

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.
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/cli.ts","../src/config/keybindings.ts","../src/engine/io-provider.ts","../src/engine/region-resolver.ts","../src/engine/store.ts","../src/engine/send.ts","../src/keymap/dispatcher.ts","../src/workspace/index.ts","../src/workspace/discovery.ts","../src/state/types.ts","../src/state/send-controller.ts","../src/state/commands.ts","../src/ui/app-view.ts","../src/utils/http-syntax.ts","../src/utils/clipboard.ts","../src/utils/git.ts"],"sourcesContent":["import path from \"node:path\";\nimport process from \"node:process\";\n\nimport { createNodeApp, type NodeApp } from \"@rezi-ui/node\";\nimport type { UiEvent } from \"@rezi-ui/core\";\n\nimport { loadKeybindings, watchKeybindings } from \"./config/keybindings.js\";\nimport { initEngineProviders, resolveRegionAtLine } from \"./engine/index.js\";\nimport { buildBindingMap, commandFromPaletteId } from \"./keymap/index.js\";\nimport { createCommandContext, createInitialState, type CommandBus } from \"./state/commands.js\";\nimport type { AppState, FocusPane } from \"./state/types.js\";\nimport { contentFromLines, resolveLayoutMode } from \"./state/types.js\";\nimport { focusPaneId, renderApp } from \"./ui/app-view.js\";\nimport { copyToClipboard, disableFlowControl } from \"./utils/clipboard.js\";\nimport { getGitBranch } from \"./utils/git.js\";\nimport { Workspace, flattenFiles } from \"./workspace/index.js\";\n\nasync function main(): Promise<void> {\n initEngineProviders();\n\n const workspaceRoot = path.resolve(process.argv[2] ?? process.cwd());\n const workspace = new Workspace(workspaceRoot);\n const tree = await workspace.open();\n\n let currentState = createInitialState(workspaceRoot);\n currentState = {\n ...currentState,\n fileTree: tree,\n expandedPaths: tree.filter((n) => n.kind === \"directory\").map((n) => n.path),\n ui: {\n ...currentState.ui,\n gitBranch: await getGitBranch(workspaceRoot),\n },\n };\n\n let app: NodeApp<AppState> | null = null;\n let bus: CommandBus | null = null;\n\n const refreshGitBranch = async () => {\n const branch = await getGitBranch(workspaceRoot);\n app?.update((prev) => ({\n ...prev,\n ui: { ...prev.ui, gitBranch: branch },\n }));\n };\n\n const reloadKeybindings = () => {\n if (!app || !bus) {\n return;\n }\n const loaded = loadKeybindings(workspaceRoot);\n app.keys({\n ...buildBindingMap(loaded.bindings, (command) => {\n if (command === \"response.copy\") {\n void handleCopy(app!, currentState);\n }\n bus!.execute(command);\n }),\n enter: {\n handler: () => bus!.execute(\"env.apply\"),\n when: (ctx) => ctx.state.ui.overlay === \"env\",\n description: \"Apply selected environment\",\n },\n up: {\n handler: () => {\n if (currentState.ui.overlay === \"env\") {\n bus!.execute(\"env.selectPrev\");\n }\n },\n when: (ctx) =>\n ctx.state.ui.overlay === \"env\" || ctx.state.ui.overlay === \"commandPalette\",\n },\n down: {\n handler: () => {\n if (currentState.ui.overlay === \"env\") {\n bus!.execute(\"env.selectNext\");\n }\n },\n when: (ctx) =>\n ctx.state.ui.overlay === \"env\" || ctx.state.ui.overlay === \"commandPalette\",\n },\n });\n app.update((state) => ({\n ...state,\n settings: {\n keymapPreset: loaded.preset,\n keybindings: loaded.bindings,\n },\n }));\n };\n\n bus = createCommandContext({\n workspace,\n getState: () => currentState,\n update: (updater) => {\n app?.update((prev) => {\n currentState = typeof updater === \"function\" ? updater(prev) : updater;\n return currentState;\n });\n },\n quit: () => {\n void workspace.close().finally(() => {\n app?.stop().finally(() => process.exit(0));\n });\n },\n reloadKeybindings,\n });\n\n app = createNodeApp({ initialState: currentState });\n reloadKeybindings();\n disableFlowControl();\n\n const stopWatch = watchKeybindings(workspaceRoot, reloadKeybindings);\n\n workspace.on(\"change\", () => {\n void bus!.refreshWorkspace();\n void refreshGitBranch();\n });\n\n app.view((state) =>\n renderApp(state, {\n onEditorChange: (lines, cursor) => {\n app?.update((prev) => {\n const activeRegion = prev.parsedFile\n ? resolveRegionAtLine(prev.parsedFile.regions, cursor.line)\n : null;\n return {\n ...prev,\n fileLines: [...lines],\n dirty: contentFromLines(lines) !== prev.fileContent,\n activeRegion,\n ui: { ...prev.ui, focusPane: \"editor\" },\n editor: { ...prev.editor, cursor },\n };\n });\n },\n onEditorSelection: (selection) => {\n app?.update((prev) => {\n const cursorLine = selection?.active.line ?? prev.editor.cursor.line;\n const activeRegion = prev.parsedFile\n ? resolveRegionAtLine(prev.parsedFile.regions, cursorLine)\n : null;\n return {\n ...prev,\n activeRegion,\n ui: { ...prev.ui, focusPane: \"editor\" },\n editor: {\n ...prev.editor,\n selection,\n cursor: selection?.active ?? prev.editor.cursor,\n },\n };\n });\n },\n onEditorScroll: (scrollTop, scrollLeft) => {\n app?.update((prev) => ({\n ...prev,\n editor: { ...prev.editor, scrollTop, scrollLeft },\n }));\n },\n onTreeSelect: (node) => {\n if (node.kind === \"file\") {\n void bus!.openFile(node.path);\n }\n },\n onTreeToggle: (node, expanded) => {\n app?.update((prev) => ({\n ...prev,\n expandedPaths: expanded\n ? [...prev.expandedPaths, node.path]\n : prev.expandedPaths.filter((p) => p !== node.path),\n }));\n },\n onTreePress: (node) => {\n if (node.kind === \"file\") {\n void bus!.openFile(node.path);\n }\n },\n onResponseTab: (tab) => {\n app?.update((prev) => ({\n ...prev,\n ui: { ...prev.ui, responseTab: tab },\n responseEditor: {\n ...prev.responseEditor,\n scrollTop: 0,\n scrollLeft: 0,\n cursor: { line: 0, column: 0 },\n selection: null,\n },\n }));\n },\n onResponseScroll: (scrollTop, scrollLeft) => {\n app?.update((prev) => ({\n ...prev,\n responseEditor: { ...prev.responseEditor, scrollTop, scrollLeft },\n }));\n },\n onResponseSelection: (selection) => {\n app?.update((prev) => ({\n ...prev,\n ui: { ...prev.ui, focusPane: \"response\" },\n responseEditor: {\n ...prev.responseEditor,\n selection,\n cursor: selection?.active ?? prev.responseEditor.cursor,\n },\n }));\n },\n onResponseChange: (cursor) => {\n app?.update((prev) => ({\n ...prev,\n ui: { ...prev.ui, focusPane: \"response\" },\n responseEditor: { ...prev.responseEditor, cursor },\n }));\n },\n onSplitChange: (sizes) => {\n if (sizes.length === 3) {\n app?.update((prev) => ({\n ...prev,\n ui: { ...prev.ui, splitSizes: [sizes[0]!, sizes[1]!, sizes[2]!] },\n }));\n }\n },\n onCommandPaletteChange: (query) => {\n app?.update((prev) => ({\n ...prev,\n ui: {\n ...prev.ui,\n commandPalette: { ...prev.ui.commandPalette, query, selectedIndex: 0 },\n },\n }));\n },\n onCommandPaletteSelectionChange: (index) => {\n app?.update((prev) => ({\n ...prev,\n ui: {\n ...prev.ui,\n commandPalette: { ...prev.ui.commandPalette, selectedIndex: index },\n },\n }));\n },\n onCommandPaletteSelect: (id) => {\n bus?.execute(\"overlay.close\");\n const command = commandFromPaletteId(id);\n if (command && command !== \"palette.commands\") {\n bus?.execute(command);\n }\n },\n onOverlayClose: () => {\n bus?.execute(\"overlay.close\");\n },\n onEnvSelect: (index) => {\n app?.update((prev) => ({\n ...prev,\n ui: { ...prev.ui, envSelectedIndex: index },\n }));\n },\n onResponseSearch: (query) => {\n app?.update((prev) => ({\n ...prev,\n editor: { ...prev.editor, searchQuery: query },\n }));\n },\n }),\n );\n\n app.onEvent((event) => handleUiEvent(event, app!));\n\n const files = flattenFiles(tree).filter((node) => node.kind === \"file\");\n if (files[0]) {\n await bus.openFile(files[0].path);\n }\n\n await app.run();\n stopWatch();\n}\n\nasync function handleCopy(app: NodeApp<AppState>, state: AppState): Promise<void> {\n const result = state.request.result;\n if (!result) {\n return;\n }\n let text = result.body;\n if (state.ui.responseTab === \"pretty\") {\n text = result.prettyBody || result.body;\n } else if (state.ui.responseTab === \"headers\") {\n text = result.headers.map((h) => `${h.name}: ${h.value}`).join(\"\\n\");\n }\n const ok = await copyToClipboard(text);\n app.update((prev) => ({\n ...prev,\n ui: { ...prev.ui, statusMessage: ok ? \"Copied\" : \"Copy failed\" },\n }));\n}\n\nfunction handleUiEvent(event: UiEvent, app: NodeApp<AppState>): void {\n if (event.kind === \"engine\" && event.event.kind === \"resize\") {\n const resize = event.event;\n app.update((prev) => ({\n ...prev,\n ui: {\n ...prev.ui,\n viewportWidth: resize.cols,\n viewportHeight: resize.rows,\n layoutMode: resolveLayoutMode(resize.cols),\n sidebarVisible:\n resolveLayoutMode(resize.cols) === \"sidebar-overlay\"\n ? prev.ui.sidebarVisible\n : true,\n },\n }));\n return;\n }\n\n if (event.kind !== \"engine\" || event.event.kind !== \"mouse\") {\n return;\n }\n\n const { x, y } = event.event;\n const panes: Array<{ id: string; pane: FocusPane }> = [\n { id: \"pane-files\", pane: \"files\" },\n { id: \"pane-editor\", pane: \"editor\" },\n { id: \"pane-response\", pane: \"response\" },\n ];\n\n for (const entry of panes) {\n const rect = app.measureElement(entry.id);\n if (!rect) {\n continue;\n }\n if (x >= rect.x && x < rect.x + rect.w && y >= rect.y && y < rect.y + rect.h) {\n app.update((prev) => ({\n ...prev,\n ui: { ...prev.ui, focusPane: entry.pane },\n }));\n break;\n }\n }\n}\n\nvoid main().catch((error) => {\n console.error(error);\n process.exit(1);\n});\n\nexport { focusPaneId };\n","import fs from \"node:fs\";\nimport os from \"node:os\";\nimport path from \"node:path\";\n\nimport type { CommandId } from \"../state/types.js\";\n\nexport type KeymapPreset = \"vscode\" | \"vim\";\n\nexport type KeybindingConfig = Readonly<{\n preset?: KeymapPreset;\n bindings?: Readonly<Record<string, CommandId>>;\n}>;\n\nconst VSCODE_DEFAULTS: Record<string, CommandId> = {\n F5: \"request.send\",\n \"ctrl+enter\": \"request.send\",\n \"alt+enter\": \"request.send\",\n tab: \"pane.focusNext\",\n \"shift+tab\": \"pane.focusPrev\",\n \"ctrl+1\": \"pane.focusFiles\",\n \"ctrl+2\": \"pane.focusEditor\",\n \"ctrl+3\": \"pane.focusResponse\",\n \"alt+1\": \"pane.focusFiles\",\n \"alt+2\": \"pane.focusEditor\",\n \"alt+3\": \"pane.focusResponse\",\n \"ctrl+b\": \"sidebar.toggle\",\n \"ctrl+p\": \"palette.files\",\n \"ctrl+shift+p\": \"palette.commands\",\n F2: \"palette.commands\",\n \"ctrl+s\": \"file.save\",\n \"ctrl+e\": \"env.switcher\",\n F11: \"pane.zoom\",\n z: \"pane.zoom\",\n F1: \"help.show\",\n \"?\": \"help.show\",\n \"ctrl+/\": \"keybindings.show\",\n escape: \"overlay.close\",\n \"ctrl+q\": \"app.quit\",\n \"ctrl+x\": \"request.cancel\",\n \"ctrl+shift+c\": \"response.copy\",\n \"ctrl+f\": \"response.search\",\n \"ctrl+tab\": \"response.tab.next\",\n \"ctrl+shift+tab\": \"response.tab.prev\",\n};\n\nconst VIM_DEFAULTS: Record<string, CommandId> = {\n ...VSCODE_DEFAULTS,\n \"ctrl+w h\": \"pane.focusFiles\",\n \"ctrl+w l\": \"pane.focusResponse\",\n \"ctrl+w k\": \"pane.focusEditor\",\n};\n\nexport const COMMAND_LABELS: Record<CommandId, string> = {\n \"request.send\": \"Send request\",\n \"request.cancel\": \"Cancel request\",\n \"pane.focusNext\": \"Focus next pane\",\n \"pane.focusPrev\": \"Focus previous pane\",\n \"pane.focusFiles\": \"Focus files pane\",\n \"pane.focusEditor\": \"Focus editor pane\",\n \"pane.focusResponse\": \"Focus response pane\",\n \"sidebar.toggle\": \"Toggle sidebar\",\n \"file.save\": \"Save file\",\n \"env.switcher\": \"Environment switcher\",\n \"env.selectNext\": \"Next environment\",\n \"env.selectPrev\": \"Previous environment\",\n \"env.apply\": \"Apply environment\",\n \"overlay.close\": \"Close overlay\",\n \"app.quit\": \"Quit\",\n \"palette.commands\": \"Command palette\",\n \"palette.files\": \"Open file\",\n \"help.show\": \"Help\",\n \"keybindings.show\": \"Show keybindings\",\n \"pane.zoom\": \"Zoom pane\",\n \"response.tab.next\": \"Next response tab\",\n \"response.tab.prev\": \"Previous response tab\",\n \"response.copy\": \"Copy response\",\n \"response.search\": \"Search response\",\n \"editor.searchNext\": \"Find next in editor\",\n};\n\nconst CHORD_PART_LABELS: Record<string, string> = {\n ctrl: \"Ctrl\",\n shift: \"Shift\",\n alt: \"Alt\",\n meta: \"Meta\",\n escape: \"Esc\",\n tab: \"Tab\",\n enter: \"Enter\",\n space: \"Space\",\n backspace: \"Backspace\",\n delete: \"Delete\",\n up: \"Up\",\n down: \"Down\",\n left: \"Left\",\n right: \"Right\",\n};\n\nexport function formatKeyChord(key: string): string {\n if (/^F\\d+$/u.test(key)) {\n return key;\n }\n if (key.length === 1) {\n return key === \"?\" ? \"?\" : key.toUpperCase();\n }\n\n return key\n .split(\"+\")\n .map((part) => CHORD_PART_LABELS[part] ?? part.toUpperCase())\n .join(\"+\");\n}\n\nexport function buildKeybindingsViewLines(\n bindings: Record<string, CommandId>,\n maxLines?: number,\n): string[] {\n const byCommand = new Map<CommandId, string[]>();\n for (const [key, command] of Object.entries(bindings)) {\n const keys = byCommand.get(command) ?? [];\n keys.push(key);\n byCommand.set(command, keys);\n }\n\n const rows = [...byCommand.entries()]\n .map(([command, keys]) => {\n const formattedKeys = keys\n .sort((a, b) => a.localeCompare(b))\n .map(formatKeyChord)\n .join(\" / \");\n const label = COMMAND_LABELS[command] ?? command;\n return { label, row: `${formattedKeys.padEnd(28)} ${label}` };\n })\n .sort((a, b) => a.label.localeCompare(b.label))\n .map((entry) => entry.row);\n\n if (maxLines !== undefined && rows.length > maxLines) {\n const hidden = rows.length - maxLines + 1;\n return [...rows.slice(0, maxLines - 1), `… ${hidden} more`];\n }\n return rows;\n}\n\nexport function getConfigDir(): string {\n if (process.env.REQEX_CONFIG_DIR) {\n return process.env.REQEX_CONFIG_DIR;\n }\n if (process.platform === \"win32\") {\n const appData = process.env.APPDATA ?? path.join(os.homedir(), \"AppData\", \"Roaming\");\n return path.join(appData, \"reqex\");\n }\n if (process.platform === \"darwin\") {\n return path.join(os.homedir(), \"Library\", \"Application Support\", \"reqex\");\n }\n const xdg = process.env.XDG_CONFIG_HOME ?? path.join(os.homedir(), \".config\");\n return path.join(xdg, \"reqex\");\n}\n\nexport function getProjectConfigDir(workspaceRoot: string): string {\n return path.join(workspaceRoot, \".reqex\");\n}\n\nfunction readJsonIfExists(filePath: string): KeybindingConfig | null {\n try {\n if (!fs.existsSync(filePath)) {\n return null;\n }\n const raw = fs.readFileSync(filePath, \"utf8\");\n return JSON.parse(raw) as KeybindingConfig;\n } catch {\n return null;\n }\n}\n\nexport function loadKeybindings(workspaceRoot: string): {\n preset: KeymapPreset;\n bindings: Record<string, CommandId>;\n} {\n const userConfig = readJsonIfExists(path.join(getConfigDir(), \"keybindings.json\"));\n const projectConfig = readJsonIfExists(\n path.join(getProjectConfigDir(workspaceRoot), \"keybindings.json\"),\n );\n\n const preset =\n projectConfig?.preset ?? userConfig?.preset ?? (\"vscode\" as KeymapPreset);\n const defaults = preset === \"vim\" ? VIM_DEFAULTS : VSCODE_DEFAULTS;\n\n return {\n preset,\n bindings: {\n ...defaults,\n ...userConfig?.bindings,\n ...projectConfig?.bindings,\n },\n };\n}\n\nexport function watchKeybindings(\n workspaceRoot: string,\n onChange: () => void,\n): () => void {\n const dirs = [getConfigDir(), getProjectConfigDir(workspaceRoot)];\n const watchers = dirs.map((dir) => {\n try {\n fs.mkdirSync(dir, { recursive: true });\n } catch {\n // ignore\n }\n return fs.watch(dir, { persistent: false }, () => onChange());\n });\n return () => {\n for (const watcher of watchers) {\n watcher.close();\n }\n };\n}\n\nexport type FooterHintContext = Readonly<{\n focusPane: \"files\" | \"editor\" | \"response\";\n overlay: \"none\" | \"env\" | \"help\" | \"commandPalette\" | \"filePicker\" | \"keybindings\";\n viewportWidth: number;\n sending?: boolean;\n}>;\n\nconst FOOTER_HINTS: Record<string, readonly string[]> = {\n editor: [\"F5 Send\", \"Ctrl+S Save\", \"Tab Panes\", \"F2 Palette\"],\n response: [\"Tab Panes\", \"Ctrl+Shift+C Copy\", \"F5 Send\", \"F2 Palette\"],\n files: [\"Enter Open\", \"Tab Panes\", \"Ctrl+P Files\", \"F2 Palette\"],\n overlay: [\"↑↓ Navigate\", \"Enter Select\", \"Esc Close\"],\n sending: [\"Ctrl+X Cancel\", \"Tab Panes\", \"Ctrl+Q Quit\"],\n};\n\nexport function footerHints(context: FooterHintContext): string {\n let hints: readonly string[];\n if (context.overlay !== \"none\") {\n hints = FOOTER_HINTS.overlay!;\n } else if (context.sending) {\n hints = FOOTER_HINTS.sending!;\n } else {\n hints = FOOTER_HINTS[context.focusPane] ?? FOOTER_HINTS.editor!;\n }\n\n const leftBudget = 48;\n const maxWidth = Math.max(20, context.viewportWidth - leftBudget);\n let text = hints.join(\" · \");\n if (text.length > maxWidth) {\n text = `${text.slice(0, maxWidth - 1)}…`;\n }\n return text;\n}\n\nexport const HELP_HINT_LINES: readonly string[] = [\n \"F5 Send request under cursor\",\n \"Tab / Shift+Tab Cycle panes\",\n \"Ctrl+S Save file\",\n \"Ctrl+E Environment switcher\",\n \"F2 / Ctrl+Shift+P Command palette\",\n \"Ctrl+Shift+C Copy response tab\",\n \"Ctrl+X Cancel request · Ctrl+Q Quit\",\n \"Ctrl+/ Full keybindings · F1 Quick help\",\n];\n","import { cli, io } from \"httpyac\";\nimport type { PromptHandler } from \"./types.js\";\n\nlet promptHandler: PromptHandler = async () => undefined;\n\nexport function setPromptHandler(handler: PromptHandler): void {\n promptHandler = handler;\n}\n\nexport function initEngineProviders(): void {\n cli.initFileProvider();\n io.userInteractionProvider.isTrusted = () => true;\n io.userInteractionProvider.showNote = async (message) => {\n const result = await promptHandler({ kind: \"confirm\", message });\n return result === true;\n };\n io.userInteractionProvider.showInputPrompt = async (message, defaultValue, masked) => {\n const result = await promptHandler({\n kind: \"input\",\n message,\n defaultValue,\n masked: masked ?? false,\n });\n return typeof result === \"string\" ? result : undefined;\n };\n io.userInteractionProvider.showListPrompt = async (message, values) => {\n const result = await promptHandler({ kind: \"list\", message, values });\n return typeof result === \"string\" ? result : undefined;\n };\n io.userInteractionProvider.showInformationMessage = async (message) => {\n await promptHandler({ kind: \"confirm\", message });\n return undefined;\n };\n io.userInteractionProvider.showWarnMessage = async (message) => {\n await promptHandler({ kind: \"confirm\", message });\n return undefined;\n };\n io.userInteractionProvider.showErrorMessage = async (message) => {\n await promptHandler({ kind: \"confirm\", message });\n return undefined;\n };\n}\n","import type { RequestRegion } from \"./types.js\";\n\n/** Resolve the innermost request region containing a 0-based editor line. */\nexport function resolveRegionAtLine(\n regions: readonly RequestRegion[],\n line: number,\n): RequestRegion | null {\n const candidates = regions.filter(\n (region) =>\n region.hasRequest &&\n !region.isGlobal &&\n region.startLine <= line &&\n line <= region.endLine,\n );\n\n if (candidates.length === 0) {\n return null;\n }\n\n return candidates.reduce((best, current) => {\n const bestSpan = best.endLine - best.startLine;\n const currentSpan = current.endLine - current.startLine;\n if (currentSpan < bestSpan) {\n return current;\n }\n if (currentSpan === bestSpan && current.startLine > best.startLine) {\n return current;\n }\n return best;\n });\n}\n\nexport function regionContainsLine(region: RequestRegion, line: number): boolean {\n return line >= region.startLine && line <= region.endLine;\n}\n\nconst HTTP_METHOD_PREFIX =\n /^\\s*(GET|POST|PUT|PATCH|DELETE|HEAD|OPTIONS|CONNECT|TRACE|GRAPHQL)\\b/u;\n\nfunction markerColumnAfterMethod(line: string): number {\n const match = HTTP_METHOD_PREFIX.exec(line);\n return match ? match[0].length : 0;\n}\n\nexport function buildRegionDiagnostics(\n regions: readonly RequestRegion[],\n activeRegionId: string | null,\n fileLines: readonly string[],\n): ReadonlyArray<{\n line: number;\n startColumn: number;\n endColumn: number;\n severity: \"info\" | \"hint\";\n message?: string;\n}> {\n const markers: Array<{\n line: number;\n startColumn: number;\n endColumn: number;\n severity: \"info\" | \"hint\";\n message?: string;\n }> = [];\n\n for (const region of regions) {\n if (!region.hasRequest || region.isGlobal) {\n continue;\n }\n const isActive = region.id === activeRegionId;\n const line = fileLines[region.startLine] ?? \"\";\n const markerCol = markerColumnAfterMethod(line);\n markers.push({\n line: region.startLine,\n startColumn: markerCol,\n endColumn: markerCol + 1,\n severity: isActive ? \"hint\" : \"info\",\n message: `${region.method ?? \"REQ\"} ${region.name}`,\n });\n }\n\n return markers;\n}\n","import { store as httpyacStoreModule } from \"httpyac\";\nimport type { HttpFile, HttpRegion } from \"httpyac/dist/models/index.js\";\n\nimport type { ParsedFile, RequestRegion } from \"./types.js\";\n\nconst store = new httpyacStoreModule.HttpFileStore();\nconst versions = new Map<string, number>();\n\nfunction toRegion(region: HttpRegion): RequestRegion {\n return {\n id: region.id,\n name: region.symbol.name,\n method: region.request?.method,\n url: region.request?.url,\n startLine: region.symbol.startLine,\n endLine: region.symbol.endLine,\n isGlobal: region.isGlobal(),\n hasRequest: Boolean(region.request),\n };\n}\n\nexport function bumpParseVersion(filePath: string): number {\n const next = (versions.get(filePath) ?? 0) + 1;\n versions.set(filePath, next);\n return next;\n}\n\nexport function getParseVersion(filePath: string): number {\n return versions.get(filePath) ?? 0;\n}\n\nexport async function parseFile(\n filePath: string,\n getText: () => Promise<string>,\n workingDir: string,\n version?: number,\n): Promise<ParsedFile> {\n const parseVersion = version ?? getParseVersion(filePath);\n const httpFile = await store.getOrCreate(filePath, getText, parseVersion, {\n workingDir,\n });\n\n const regions = httpFile.httpRegions.map(toRegion);\n return {\n path: filePath,\n regions,\n version: parseVersion,\n };\n}\n\nexport function getHttpFile(filePath: string): HttpFile | undefined {\n return store.get(filePath);\n}\n\nexport function getHttpRegion(filePath: string, regionId: string): HttpRegion | undefined {\n const httpFile = store.get(filePath);\n return httpFile?.httpRegions.find((region: HttpRegion) => region.id === regionId);\n}\n\nexport { store as httpFileStore };\n","import { getEnvironments, getVariables, send } from \"httpyac\";\nimport type { HttpResponse } from \"httpyac/dist/models/httpResponse.js\";\n\nimport { getHttpFile, getHttpRegion } from \"./store.js\";\nimport type { ExecResult, ResponseHeaderRow, TestResultDto } from \"./types.js\";\n\nfunction formatBody(body: unknown): string {\n if (body === undefined || body === null) {\n return \"\";\n }\n if (typeof body === \"string\") {\n return body;\n }\n if (Buffer.isBuffer(body)) {\n return body.toString(\"utf8\");\n }\n try {\n return JSON.stringify(body, null, 2);\n } catch {\n return String(body);\n }\n}\n\nfunction prettyBody(response: HttpResponse | undefined): string {\n if (!response) {\n return \"\";\n }\n if (response.prettyPrintBody) {\n return response.prettyPrintBody;\n }\n return formatBody(response.body);\n}\n\nfunction toHeaders(response: HttpResponse | undefined): ResponseHeaderRow[] {\n if (!response?.headers) {\n return [];\n }\n return Object.entries(response.headers).map(([name, value]) => ({\n name,\n value: Array.isArray(value) ? value.join(\", \") : String(value ?? \"\"),\n }));\n}\n\nfunction toTestResults(region: { testResults?: Array<{ message: string; status: string; error?: { displayMessage?: string } }> }): TestResultDto[] {\n if (!region.testResults) {\n return [];\n }\n return region.testResults.map((result) => ({\n message: result.message,\n status: result.status as TestResultDto[\"status\"],\n detail: result.error?.displayMessage,\n }));\n}\n\nexport async function sendRegion(options: {\n filePath: string;\n regionId: string;\n workingDir: string;\n activeEnvironment?: string[];\n variables?: Record<string, unknown>;\n}): Promise<ExecResult> {\n const httpFile = getHttpFile(options.filePath);\n const httpRegion = getHttpRegion(options.filePath, options.regionId);\n\n if (!httpFile || !httpRegion) {\n return {\n headers: [],\n body: \"\",\n prettyBody: \"\",\n testResults: [],\n error: \"Request region not found\",\n };\n }\n\n delete httpRegion.response;\n delete httpRegion.testResults;\n\n let capturedResponse: HttpResponse | undefined;\n const logResponse = async (response: HttpResponse | undefined) => {\n capturedResponse = response;\n };\n\n try {\n await send({\n httpFile,\n httpRegion,\n activeEnvironment: options.activeEnvironment,\n variables: options.variables,\n logResponse,\n });\n\n const response = capturedResponse ?? httpRegion.response;\n return {\n statusCode: response?.statusCode,\n statusMessage: response?.statusMessage,\n protocol: response?.protocol,\n headers: toHeaders(response),\n body: formatBody(response?.body),\n prettyBody: prettyBody(response),\n durationMs: response?.timings?.total,\n testResults: toTestResults(httpRegion),\n };\n } catch (error) {\n return {\n headers: [],\n body: \"\",\n prettyBody: \"\",\n testResults: toTestResults(httpRegion),\n error: error instanceof Error ? error.message : String(error),\n };\n }\n}\n\nexport async function listEnvironments(filePath: string): Promise<string[]> {\n const httpFile = getHttpFile(filePath);\n if (!httpFile) {\n return [];\n }\n return getEnvironments({ httpFile });\n}\n\nexport async function listVariables(\n filePath: string,\n activeEnvironment: string[] | undefined,\n): Promise<Record<string, unknown>> {\n const httpFile = getHttpFile(filePath);\n if (!httpFile) {\n return {};\n }\n return getVariables({ httpFile, activeEnvironment });\n}\n","import type { BindingMap, KeyContext } from \"@rezi-ui/core\";\n\nimport type { AppState, CommandId } from \"../state/types.js\";\n\nexport type CommandExecutor = (command: CommandId) => void;\n\nexport function buildBindingMap<S extends AppState>(\n bindings: Record<string, CommandId>,\n execute: CommandExecutor,\n): BindingMap<KeyContext<S>> {\n const map: Record<string, (ctx: KeyContext<S>) => void> = {};\n\n for (const [key, command] of Object.entries(bindings)) {\n map[key] = () => execute(command);\n }\n\n return map;\n}\n\nexport function commandFromPaletteId(id: string): CommandId | null {\n const known: Record<string, CommandId> = {\n \"request.send\": \"request.send\",\n \"request.cancel\": \"request.cancel\",\n \"file.save\": \"file.save\",\n \"env.switcher\": \"env.switcher\",\n \"palette.commands\": \"palette.commands\",\n \"help.show\": \"help.show\",\n \"keybindings.show\": \"keybindings.show\",\n \"pane.zoom\": \"pane.zoom\",\n \"sidebar.toggle\": \"sidebar.toggle\",\n };\n return known[id] ?? null;\n}\n\nexport const COMMAND_ITEMS: ReadonlyArray<{\n id: CommandId;\n label: string;\n description: string;\n shortcut?: string;\n}> = [\n { id: \"request.send\", label: \"Send Request\", description: \"Send request under cursor\", shortcut: \"F5\" },\n { id: \"request.cancel\", label: \"Cancel Request\", description: \"Cancel in-flight request\", shortcut: \"Ctrl+X\" },\n { id: \"file.save\", label: \"Save File\", description: \"Write editor to disk\", shortcut: \"Ctrl+S\" },\n { id: \"env.switcher\", label: \"Switch Environment\", description: \"Choose active environment\", shortcut: \"Ctrl+E\" },\n { id: \"sidebar.toggle\", label: \"Toggle Sidebar\", description: \"Show/hide file tree\", shortcut: \"Ctrl+B\" },\n { id: \"pane.zoom\", label: \"Zoom Pane\", description: \"Zoom focused pane\", shortcut: \"F11\" },\n { id: \"help.show\", label: \"Help\", description: \"Show quick help\", shortcut: \"F1\" },\n { id: \"keybindings.show\", label: \"Keybindings\", description: \"Show all keybindings\", shortcut: \"Ctrl+/\" },\n];\n","import { readFile, writeFile } from \"node:fs/promises\";\n\nimport chokidar, { type FSWatcher } from \"chokidar\";\nimport { EventEmitter } from \"node:events\";\n\nimport { discoverFileTree } from \"./discovery.js\";\nimport type { WorkspaceChangeEvent, WorkspaceFileNode } from \"./types.js\";\n\nexport class Workspace extends EventEmitter {\n readonly rootDir: string;\n private watcher: FSWatcher | null = null;\n private tree: WorkspaceFileNode[] = [];\n\n constructor(rootDir: string) {\n super();\n this.rootDir = rootDir;\n }\n\n async open(): Promise<WorkspaceFileNode[]> {\n this.tree = await discoverFileTree(this.rootDir);\n await this.startWatcher();\n this.emitChange({ type: \"ready\" });\n return this.tree;\n }\n\n getTree(): readonly WorkspaceFileNode[] {\n return this.tree;\n }\n\n async refresh(): Promise<WorkspaceFileNode[]> {\n this.tree = await discoverFileTree(this.rootDir);\n return this.tree;\n }\n\n async readFile(filePath: string): Promise<string> {\n return readFile(filePath, \"utf8\");\n }\n\n async writeFile(filePath: string, content: string): Promise<void> {\n await writeFile(filePath, content, \"utf8\");\n }\n\n async close(): Promise<void> {\n await this.watcher?.close();\n this.watcher = null;\n }\n\n private async startWatcher(): Promise<void> {\n await this.watcher?.close();\n this.watcher = chokidar.watch(this.rootDir, {\n ignoreInitial: true,\n ignored: [\n /(^|[/\\\\])\\../,\n \"**/node_modules/**\",\n \"**/.git/**\",\n \"**/dist/**\",\n ],\n awaitWriteFinish: { stabilityThreshold: 100, pollInterval: 50 },\n });\n\n const handle = async (type: WorkspaceChangeEvent[\"type\"], path: string) => {\n try {\n this.tree = await discoverFileTree(this.rootDir);\n this.emitChange({ type, path });\n } catch (error) {\n this.emit(\"error\", error instanceof Error ? error : new Error(String(error)));\n }\n };\n\n this.watcher.on(\"add\", (path) => void handle(\"add\", path));\n this.watcher.on(\"change\", (path) => void handle(\"change\", path));\n this.watcher.on(\"unlink\", (path) => void handle(\"unlink\", path));\n this.watcher.on(\"error\", (error) => {\n this.emit(\"error\", error instanceof Error ? error : new Error(String(error)));\n });\n }\n\n private emitChange(event: WorkspaceChangeEvent): void {\n this.emit(\"change\", event);\n }\n}\n\nexport { discoverFileTree, flattenFiles, findNodeByPath, isWorkspaceFile } from \"./discovery.js\";\n","import { readdir, stat } from \"node:fs/promises\";\nimport path from \"node:path\";\n\nimport type { WorkspaceFileKind, WorkspaceFileNode } from \"./types.js\";\n\nconst SKIP_DIRS = new Set([\n \".git\",\n \"node_modules\",\n \".reqex\",\n \"dist\",\n \".cursor\",\n]);\n\nconst FILE_KINDS: ReadonlyArray<{ ext: string; kind: WorkspaceFileKind }> = [\n { ext: \".http\", kind: \"http\" },\n { ext: \".rest\", kind: \"rest\" },\n { ext: \".env\", kind: \"env\" },\n { ext: \".env.json\", kind: \"env-json\" },\n];\n\nexport function classifyFile(filePath: string): WorkspaceFileKind | null {\n const base = path.basename(filePath);\n for (const { ext, kind } of FILE_KINDS) {\n if (base === ext || base.endsWith(ext)) {\n return kind;\n }\n }\n if (base.endsWith(\".env.json\")) {\n return \"env-json\";\n }\n return null;\n}\n\nexport function isWorkspaceFile(filePath: string): boolean {\n return classifyFile(filePath) !== null;\n}\n\nexport async function discoverFileTree(rootDir: string): Promise<WorkspaceFileNode[]> {\n return discoverDirectory(rootDir, rootDir);\n}\n\nasync function discoverDirectory(\n rootDir: string,\n currentDir: string,\n): Promise<WorkspaceFileNode[]> {\n let entries: string[];\n try {\n entries = await readdir(currentDir);\n } catch {\n return [];\n }\n\n entries.sort((a, b) => a.localeCompare(b));\n const nodes: WorkspaceFileNode[] = [];\n\n for (const entry of entries) {\n if (entry.startsWith(\".\") && entry !== \".env\" && !entry.endsWith(\".env.json\")) {\n if (SKIP_DIRS.has(entry)) {\n continue;\n }\n }\n\n const fullPath = path.join(currentDir, entry);\n let entryStat;\n try {\n entryStat = await stat(fullPath);\n } catch {\n continue;\n }\n\n if (entryStat.isDirectory()) {\n if (SKIP_DIRS.has(entry)) {\n continue;\n }\n const children = await discoverDirectory(rootDir, fullPath);\n if (children.length > 0) {\n nodes.push({\n name: entry,\n path: fullPath,\n kind: \"directory\",\n children,\n });\n }\n continue;\n }\n\n const fileKind = classifyFile(fullPath);\n if (!fileKind) {\n continue;\n }\n\n nodes.push({\n name: entry,\n path: fullPath,\n kind: \"file\",\n fileKind,\n });\n }\n\n return nodes;\n}\n\nexport function flattenFiles(nodes: readonly WorkspaceFileNode[]): WorkspaceFileNode[] {\n const files: WorkspaceFileNode[] = [];\n for (const node of nodes) {\n if (node.kind === \"file\") {\n files.push(node);\n } else if (node.children) {\n files.push(...flattenFiles(node.children));\n }\n }\n return files;\n}\n\nexport function findNodeByPath(\n nodes: readonly WorkspaceFileNode[],\n targetPath: string,\n): WorkspaceFileNode | null {\n for (const node of nodes) {\n if (node.path === targetPath) {\n return node;\n }\n if (node.children) {\n const found = findNodeByPath(node.children, targetPath);\n if (found) {\n return found;\n }\n }\n }\n return null;\n}\n\nexport function collectDirectoryPaths(nodes: readonly WorkspaceFileNode[]): string[] {\n const paths: string[] = [];\n for (const node of nodes) {\n if (node.kind === \"directory\") {\n paths.push(node.path);\n if (node.children) {\n paths.push(...collectDirectoryPaths(node.children));\n }\n }\n }\n return paths;\n}\n","import type { CursorPosition, EditorSelection } from \"@rezi-ui/core\";\n\nimport type { ExecResult, ParsedFile, RequestRegion } from \"../engine/types.js\";\nimport type { WorkspaceFileNode } from \"../workspace/types.js\";\n\nexport type FocusPane = \"files\" | \"editor\" | \"response\";\nexport type ResponseTab = \"pretty\" | \"raw\" | \"headers\" | \"variables\" | \"tests\";\nexport type OverlayKind = \"none\" | \"env\" | \"help\" | \"keybindings\" | \"commandPalette\" | \"filePicker\";\nexport type LayoutMode = \"three-pane\" | \"sidebar-overlay\" | \"stacked\";\n\nexport type AppState = Readonly<{\n workspaceRoot: string;\n fileTree: readonly WorkspaceFileNode[];\n expandedPaths: readonly string[];\n selectedFilePath: string | null;\n fileContent: string;\n fileLines: readonly string[];\n dirty: boolean;\n parseVersion: number;\n parsedFile: ParsedFile | null;\n activeRegion: RequestRegion | null;\n responseEditor: Readonly<{\n scrollTop: number;\n scrollLeft: number;\n cursor: CursorPosition;\n selection: EditorSelection | null;\n }>;\n resultGeneration: number;\n editor: Readonly<{\n cursor: CursorPosition;\n selection: EditorSelection | null;\n scrollTop: number;\n scrollLeft: number;\n searchQuery: string;\n }>;\n request: Readonly<{\n sending: boolean;\n error: string | null;\n result: ExecResult | null;\n activeEnvironment: readonly string[];\n environments: readonly string[];\n variables: Record<string, unknown>;\n }>;\n ui: Readonly<{\n focusPane: FocusPane;\n zoomPane: FocusPane | null;\n sidebarVisible: boolean;\n layoutMode: LayoutMode;\n viewportWidth: number;\n viewportHeight: number;\n overlay: OverlayKind;\n responseTab: ResponseTab;\n splitSizes: readonly [number, number, number];\n envSelectedIndex: number;\n commandPalette: Readonly<{\n open: boolean;\n query: string;\n selectedIndex: number;\n }>;\n pendingPrompt: Readonly<{\n kind: \"confirm\" | \"input\" | \"list\";\n message: string;\n values?: readonly string[];\n defaultValue?: string;\n masked?: boolean;\n }> | null;\n statusMessage: string | null;\n gitBranch: string | null;\n }>;\n settings: Readonly<{\n keymapPreset: \"vscode\" | \"vim\";\n keybindings: Readonly<Record<string, string>>;\n }>;\n}>;\n\nexport type CommandContext = Readonly<{\n state: Readonly<AppState>;\n update: (updater: AppState | ((prev: Readonly<AppState>) => AppState)) => void;\n runSend: () => Promise<void>;\n openFile: (path: string) => Promise<void>;\n saveFile: () => Promise<void>;\n refreshWorkspace: () => Promise<void>;\n reloadKeybindings: () => void;\n quit: () => void;\n}>;\n\nexport type CommandId =\n | \"request.send\"\n | \"request.cancel\"\n | \"pane.focusNext\"\n | \"pane.focusPrev\"\n | \"pane.focusFiles\"\n | \"pane.focusEditor\"\n | \"pane.focusResponse\"\n | \"sidebar.toggle\"\n | \"file.save\"\n | \"env.switcher\"\n | \"env.selectNext\"\n | \"env.selectPrev\"\n | \"env.apply\"\n | \"overlay.close\"\n | \"app.quit\"\n | \"palette.commands\"\n | \"palette.files\"\n | \"help.show\"\n | \"keybindings.show\"\n | \"pane.zoom\"\n | \"response.tab.next\"\n | \"response.tab.prev\"\n | \"response.copy\"\n | \"response.search\"\n | \"editor.searchNext\";\n\nexport const FOCUS_PANES: readonly FocusPane[] = [\"files\", \"editor\", \"response\"];\nexport const RESPONSE_TABS: readonly ResponseTab[] = [\n \"pretty\",\n \"raw\",\n \"headers\",\n \"variables\",\n \"tests\",\n];\n\nexport function createInitialState(workspaceRoot: string): AppState {\n return {\n workspaceRoot,\n fileTree: [],\n expandedPaths: [],\n selectedFilePath: null,\n fileContent: \"\",\n fileLines: [\"\"],\n dirty: false,\n parseVersion: 0,\n parsedFile: null,\n activeRegion: null,\n responseEditor: {\n scrollTop: 0,\n scrollLeft: 0,\n cursor: { line: 0, column: 0 },\n selection: null,\n },\n resultGeneration: 0,\n editor: {\n cursor: { line: 0, column: 0 },\n selection: null,\n scrollTop: 0,\n scrollLeft: 0,\n searchQuery: \"\",\n },\n request: {\n sending: false,\n error: null,\n result: null,\n activeEnvironment: [],\n environments: [],\n variables: {},\n },\n ui: {\n focusPane: \"editor\",\n zoomPane: null,\n sidebarVisible: true,\n layoutMode: \"three-pane\",\n viewportWidth: 120,\n viewportHeight: 40,\n overlay: \"none\",\n responseTab: \"pretty\",\n splitSizes: [22, 40, 38],\n envSelectedIndex: 0,\n commandPalette: { open: false, query: \"\", selectedIndex: 0 },\n pendingPrompt: null,\n statusMessage: null,\n gitBranch: null,\n },\n settings: {\n keymapPreset: \"vscode\",\n keybindings: {},\n },\n };\n}\n\nexport function linesFromContent(content: string): string[] {\n if (content.length === 0) {\n return [\"\"];\n }\n return content.split(/\\r?\\n/u);\n}\n\nexport function contentFromLines(lines: readonly string[]): string {\n return lines.join(\"\\n\");\n}\n\nexport function resolveLayoutMode(width: number): LayoutMode {\n if (width < 80) {\n return \"stacked\";\n }\n if (width < 120) {\n return \"sidebar-overlay\";\n }\n return \"three-pane\";\n}\n\nexport function nextPane(current: FocusPane): FocusPane {\n const index = FOCUS_PANES.indexOf(current);\n return FOCUS_PANES[(index + 1) % FOCUS_PANES.length] ?? \"editor\";\n}\n\nexport function prevPane(current: FocusPane): FocusPane {\n const index = FOCUS_PANES.indexOf(current);\n return FOCUS_PANES[(index + FOCUS_PANES.length - 1) % FOCUS_PANES.length] ?? \"editor\";\n}\n\nexport function nextResponseTab(current: ResponseTab): ResponseTab {\n const index = RESPONSE_TABS.indexOf(current);\n return RESPONSE_TABS[(index + 1) % RESPONSE_TABS.length] ?? \"pretty\";\n}\n\nexport function prevResponseTab(current: ResponseTab): ResponseTab {\n const index = RESPONSE_TABS.indexOf(current);\n return RESPONSE_TABS[(index + RESPONSE_TABS.length - 1) % RESPONSE_TABS.length] ?? \"pretty\";\n}\n","export type SendController = Readonly<{\n beginSend: () => number;\n cancelSend: () => number;\n isCurrent: (generation: number) => boolean;\n}>;\n\nexport function createSendController(): SendController {\n let sendGeneration = 0;\n\n return {\n beginSend(): number {\n sendGeneration += 1;\n return sendGeneration;\n },\n cancelSend(): number {\n sendGeneration += 1;\n return sendGeneration;\n },\n isCurrent(generation: number): boolean {\n return generation === sendGeneration;\n },\n };\n}\n","import {\n bumpParseVersion,\n listEnvironments,\n listVariables,\n parseFile,\n resolveRegionAtLine,\n sendRegion,\n setPromptHandler,\n} from \"../engine/index.js\";\nimport { flattenFiles, type Workspace } from \"../workspace/index.js\";\nimport {\n contentFromLines,\n createInitialState,\n linesFromContent,\n nextPane,\n prevPane,\n prevResponseTab,\n nextResponseTab,\n type AppState,\n type CommandContext,\n type CommandId,\n type FocusPane,\n} from \"./types.js\";\nimport { createSendController } from \"./send-controller.js\";\n\nexport function createCommandContext(deps: {\n workspace: Workspace;\n update: CommandContext[\"update\"];\n getState: () => AppState;\n quit: () => void;\n reloadKeybindings: () => void;\n}): CommandBus {\n setPromptHandler(async (request) => {\n return new Promise((resolve) => {\n deps.update((state) => ({\n ...state,\n ui: {\n ...state.ui,\n overlay: \"none\",\n pendingPrompt: {\n kind: request.kind,\n message: request.message,\n values: request.kind === \"list\" ? request.values : undefined,\n defaultValue: request.kind === \"input\" ? request.defaultValue : undefined,\n masked: request.kind === \"input\" ? request.masked : undefined,\n },\n },\n }));\n promptResolvers.push(resolve);\n });\n });\n\n const promptResolvers: Array<(value: string | boolean | undefined) => void> = [];\n const sendController = createSendController();\n\n const resolvePrompt = (value: string | boolean | undefined) => {\n const resolver = promptResolvers.pop();\n resolver?.(value);\n deps.update((state) => ({\n ...state,\n ui: { ...state.ui, pendingPrompt: null },\n }));\n };\n\n const openFile = async (path: string) => {\n const content = await deps.workspace.readFile(path);\n const lines = linesFromContent(content);\n const parsed = await parseFile(path, async () => content, deps.workspace.rootDir);\n const environments = await listEnvironments(path);\n const variables = await listVariables(path, [...deps.getState().request.activeEnvironment]);\n const activeRegion = resolveRegionAtLine(parsed.regions, 0);\n\n deps.update((state) => ({\n ...state,\n selectedFilePath: path,\n fileContent: content,\n fileLines: lines,\n dirty: false,\n parseVersion: parsed.version,\n parsedFile: parsed,\n activeRegion,\n editor: {\n ...state.editor,\n cursor: { line: activeRegion?.startLine ?? 0, column: 0 },\n selection: null,\n scrollTop: activeRegion?.startLine ?? 0,\n },\n request: {\n ...state.request,\n error: null,\n result: null,\n environments,\n variables,\n },\n ui: {\n ...state.ui,\n focusPane: \"editor\",\n statusMessage: null,\n },\n }));\n };\n\n const refreshWorkspace = async () => {\n const tree = await deps.workspace.refresh();\n deps.update((state) => ({ ...state, fileTree: tree }));\n };\n\n const saveFile = async () => {\n const state = deps.getState();\n if (!state.selectedFilePath || !state.dirty) {\n return;\n }\n const content = contentFromLines(state.fileLines);\n await deps.workspace.writeFile(state.selectedFilePath, content);\n const version = bumpParseVersion(state.selectedFilePath);\n const parsed = await parseFile(\n state.selectedFilePath,\n async () => content,\n deps.workspace.rootDir,\n version,\n );\n const activeRegion = state.activeRegion\n ? parsed.regions.find((region) => region.id === state.activeRegion?.id) ??\n resolveRegionAtLine(parsed.regions, state.editor.cursor.line)\n : resolveRegionAtLine(parsed.regions, state.editor.cursor.line);\n\n deps.update((s) => ({\n ...s,\n fileContent: content,\n dirty: false,\n parsedFile: parsed,\n activeRegion: activeRegion ?? null,\n ui: { ...s.ui, statusMessage: \"Saved\" },\n }));\n };\n\n const runSend = async () => {\n const state = deps.getState();\n if (!state.selectedFilePath || !state.parsedFile) {\n return;\n }\n\n const region = resolveRegionAtLine(state.parsedFile.regions, state.editor.cursor.line);\n if (!region) {\n deps.update((s) => ({\n ...s,\n request: { ...s.request, error: \"No request region under cursor\" },\n ui: { ...s.ui, focusPane: \"response\" },\n }));\n return;\n }\n\n const gen = sendController.beginSend();\n\n deps.update((s) => ({\n ...s,\n activeRegion: region,\n request: { ...s.request, sending: true, error: null, result: null },\n responseEditor: {\n scrollTop: 0,\n scrollLeft: 0,\n cursor: { line: 0, column: 0 },\n selection: null,\n },\n resultGeneration: s.resultGeneration + 1,\n ui: { ...s.ui, focusPane: \"response\", responseTab: \"pretty\" },\n }));\n\n await new Promise<void>((resolve) => setImmediate(resolve));\n\n const result = await sendRegion({\n filePath: state.selectedFilePath,\n regionId: region.id,\n workingDir: deps.workspace.rootDir,\n activeEnvironment: [...state.request.activeEnvironment],\n variables: state.request.variables,\n });\n\n if (!sendController.isCurrent(gen)) {\n return;\n }\n\n const variables = await listVariables(state.selectedFilePath, [\n ...deps.getState().request.activeEnvironment,\n ]);\n\n if (!sendController.isCurrent(gen)) {\n return;\n }\n\n deps.update((s) => ({\n ...s,\n request: {\n ...s.request,\n sending: false,\n result,\n error: result.error ?? null,\n variables,\n },\n }));\n };\n\n const focusPane = (pane: FocusPane) => {\n deps.update((state) => ({\n ...state,\n ui: { ...state.ui, focusPane: pane },\n }));\n };\n\n const execute = (command: CommandId) => {\n const state = deps.getState();\n\n switch (command) {\n case \"request.send\":\n void runSend();\n break;\n case \"request.cancel\":\n if (!state.request.sending) {\n break;\n }\n sendController.cancelSend();\n deps.update((s) => ({\n ...s,\n request: {\n ...s.request,\n sending: false,\n error: \"Request cancelled\",\n result: null,\n },\n ui: { ...s.ui, statusMessage: \"Request cancelled\" },\n }));\n break;\n case \"pane.focusNext\":\n focusPane(nextPane(state.ui.focusPane));\n break;\n case \"pane.focusPrev\":\n focusPane(prevPane(state.ui.focusPane));\n break;\n case \"pane.focusFiles\":\n focusPane(\"files\");\n break;\n case \"pane.focusEditor\":\n focusPane(\"editor\");\n break;\n case \"pane.focusResponse\":\n focusPane(\"response\");\n break;\n case \"sidebar.toggle\":\n deps.update((s) => ({\n ...s,\n ui: { ...s.ui, sidebarVisible: !s.ui.sidebarVisible },\n }));\n break;\n case \"file.save\":\n void saveFile();\n break;\n case \"env.switcher\":\n deps.update((s) => ({\n ...s,\n ui: {\n ...s.ui,\n overlay: s.ui.overlay === \"env\" ? \"none\" : \"env\",\n envSelectedIndex: Math.max(\n 0,\n s.request.environments.indexOf(s.request.activeEnvironment.join(\",\")) || 0,\n ),\n },\n }));\n break;\n case \"env.selectNext\":\n if (state.ui.overlay === \"env\") {\n deps.update((s) => ({\n ...s,\n ui: {\n ...s.ui,\n envSelectedIndex: Math.min(\n s.request.environments.length,\n s.ui.envSelectedIndex + 1,\n ),\n },\n }));\n }\n break;\n case \"env.selectPrev\":\n if (state.ui.overlay === \"env\") {\n deps.update((s) => ({\n ...s,\n ui: {\n ...s.ui,\n envSelectedIndex: Math.max(0, s.ui.envSelectedIndex - 1),\n },\n }));\n }\n break;\n case \"env.apply\": {\n const envName = state.request.environments[state.ui.envSelectedIndex];\n void (async () => {\n const activeEnvironment = envName ? [envName] : [];\n const variables = state.selectedFilePath\n ? await listVariables(state.selectedFilePath, activeEnvironment)\n : {};\n deps.update((s) => ({\n ...s,\n request: { ...s.request, activeEnvironment, variables },\n ui: { ...s.ui, overlay: \"none\" },\n }));\n })();\n break;\n }\n case \"overlay.close\":\n deps.update((s) => ({\n ...s,\n ui: {\n ...s.ui,\n overlay: \"none\",\n commandPalette: { ...s.ui.commandPalette, open: false },\n pendingPrompt: null,\n },\n }));\n resolvePrompt(undefined);\n break;\n case \"app.quit\":\n deps.quit();\n break;\n case \"palette.commands\":\n deps.update((s) => ({\n ...s,\n ui: {\n ...s.ui,\n overlay: \"commandPalette\",\n commandPalette: { open: true, query: \"\", selectedIndex: 0 },\n },\n }));\n break;\n case \"palette.files\": {\n const files = flattenFiles(state.fileTree).filter((node) => node.kind === \"file\");\n const first = files[0]?.path;\n if (first) {\n void openFile(first);\n }\n break;\n }\n case \"help.show\":\n deps.update((s) => ({\n ...s,\n ui: { ...s.ui, overlay: s.ui.overlay === \"help\" ? \"none\" : \"help\" },\n }));\n break;\n case \"keybindings.show\":\n deps.update((s) => ({\n ...s,\n ui: {\n ...s.ui,\n overlay: s.ui.overlay === \"keybindings\" ? \"none\" : \"keybindings\",\n },\n }));\n break;\n case \"pane.zoom\":\n deps.update((s) => ({\n ...s,\n ui: {\n ...s.ui,\n zoomPane: s.ui.zoomPane ? null : s.ui.focusPane,\n },\n }));\n break;\n case \"response.tab.next\":\n deps.update((s) => ({\n ...s,\n ui: { ...s.ui, responseTab: nextResponseTab(s.ui.responseTab) },\n }));\n break;\n case \"response.tab.prev\":\n deps.update((s) => ({\n ...s,\n ui: { ...s.ui, responseTab: prevResponseTab(s.ui.responseTab) },\n }));\n break;\n case \"response.copy\":\n deps.update((s) => ({\n ...s,\n ui: { ...s.ui, statusMessage: \"Copy requested (see clipboard handler)\" },\n }));\n break;\n case \"response.search\":\n deps.update((s) => ({\n ...s,\n ui: { ...s.ui, focusPane: \"response\", responseTab: \"pretty\" },\n }));\n break;\n case \"editor.searchNext\":\n break;\n default:\n break;\n }\n };\n\n const context: CommandContext & { execute: (command: CommandId) => void } = {\n get state() {\n return deps.getState();\n },\n update: deps.update,\n runSend,\n openFile,\n saveFile,\n refreshWorkspace,\n reloadKeybindings: deps.reloadKeybindings,\n quit: deps.quit,\n execute,\n };\n\n return context;\n}\n\nexport type CommandBus = CommandContext & { execute: (command: CommandId) => void };\n\nexport { createInitialState };\n","import path from \"node:path\";\n\nimport {\n rgb,\n ui,\n type CursorPosition,\n type EditorSelection,\n type VNode,\n} from \"@rezi-ui/core\";\n\nimport { buildRegionDiagnostics, resolveRegionAtLine } from \"../engine/index.js\";\nimport { buildKeybindingsViewLines, footerHints, HELP_HINT_LINES } from \"../config/keybindings.js\";\nimport { COMMAND_ITEMS } from \"../keymap/index.js\";\nimport type { AppState, CommandId, FocusPane } from \"../state/types.js\";\nimport { contentFromLines, resolveLayoutMode } from \"../state/types.js\";\nimport type { WorkspaceFileNode } from \"../workspace/types.js\";\nimport { methodColor, prettyJsonIfPossible, statusTone, tokenizeHttpLine } from \"../utils/http-syntax.js\";\n\nexport type ViewDeps = Readonly<{\n onEditorChange: (lines: readonly string[], cursor: CursorPosition) => void;\n onEditorSelection: (selection: EditorSelection | null) => void;\n onEditorScroll: (scrollTop: number, scrollLeft: number) => void;\n onTreeSelect: (node: WorkspaceFileNode) => void;\n onTreeToggle: (node: WorkspaceFileNode, expanded: boolean) => void;\n onTreePress: (node: WorkspaceFileNode) => void;\n onResponseTab: (tab: AppState[\"ui\"][\"responseTab\"]) => void;\n onResponseScroll: (scrollTop: number, scrollLeft: number) => void;\n onResponseSelection: (selection: EditorSelection | null) => void;\n onResponseChange: (cursor: CursorPosition) => void;\n onSplitChange: (sizes: readonly number[]) => void;\n onCommandPaletteChange: (query: string) => void;\n onCommandPaletteSelect: (id: string) => void;\n onCommandPaletteSelectionChange: (index: number) => void;\n onOverlayClose: () => void;\n onEnvSelect: (index: number) => void;\n onResponseSearch: (query: string) => void;\n}>;\n\nfunction paneStyle(focused: boolean): { fg?: ReturnType<typeof rgb>; bold?: boolean } {\n return focused ? { fg: rgb(180, 220, 255), bold: true } : { fg: rgb(120, 120, 120) };\n}\n\nfunction renderFileTree(state: AppState, deps: ViewDeps): VNode {\n return ui.panel(\n {\n id: \"pane-files\",\n title: state.ui.focusPane === \"files\" ? \"● Files\" : \"Files\",\n style: paneStyle(state.ui.focusPane === \"files\"),\n },\n [\n ui.tree({\n id: \"file-tree\",\n data: state.fileTree,\n expanded: state.expandedPaths,\n selected: state.selectedFilePath ?? undefined,\n getKey: (node: WorkspaceFileNode) => node.path,\n getChildren: (node) =>\n node.kind === \"directory\" ? (node.children as WorkspaceFileNode[] | undefined) : undefined,\n onChange: (node, expanded) => deps.onTreeToggle(node, expanded),\n onSelect: (node) => deps.onTreeSelect(node),\n onPress: (node) => deps.onTreePress(node),\n renderNode: (node, _depth, nodeState) =>\n ui.row({ gap: 1 }, [\n ui.text(nodeState.selected ? `▸ ${node.name}` : node.name, {\n style: nodeState.selected\n ? { fg: rgb(255, 220, 120), bold: true }\n : state.dirty && node.path === state.selectedFilePath\n ? { fg: rgb(255, 180, 80) }\n : undefined,\n }),\n ]),\n flex: 1,\n minHeight: 8,\n }),\n ],\n );\n}\n\nfunction renderEditor(state: AppState, deps: ViewDeps, readOnly: boolean): VNode {\n const activeRegion =\n state.activeRegion ??\n (state.parsedFile\n ? resolveRegionAtLine(state.parsedFile.regions, state.editor.cursor.line)\n : null);\n\n const titleParts = [\n state.ui.focusPane === \"editor\" ? \"● Editor\" : \"Editor\",\n state.selectedFilePath ? state.selectedFilePath.split(\"/\").pop() : \"No file\",\n state.dirty ? \" ●\" : \"\",\n activeRegion ? ` | ${activeRegion.method ?? \"?\"} ${activeRegion.name}` : \"\",\n ];\n\n const diagnostics = state.parsedFile\n ? buildRegionDiagnostics(\n state.parsedFile.regions,\n activeRegion?.id ?? null,\n state.fileLines,\n )\n : [];\n\n return ui.panel(\n {\n id: \"pane-editor\",\n title: titleParts.join(\"\"),\n style: paneStyle(state.ui.focusPane === \"editor\"),\n },\n [\n ui.codeEditor({\n id: \"editor\",\n lines: state.fileLines,\n cursor: state.editor.cursor,\n selection: state.editor.selection,\n scrollTop: state.editor.scrollTop,\n scrollLeft: state.editor.scrollLeft,\n readOnly,\n lineNumbers: true,\n syntaxLanguage: \"plain\",\n tokenizeLine: tokenizeHttpLine,\n diagnostics,\n onChange: (lines, cursor) => deps.onEditorChange(lines, cursor),\n onSelectionChange: deps.onEditorSelection,\n onScroll: deps.onEditorScroll,\n flex: 1,\n minHeight: 8,\n }),\n ],\n );\n}\n\nfunction responseScrollProps(state: AppState, deps: ViewDeps) {\n return {\n scrollTop: state.responseEditor.scrollTop,\n scrollLeft: state.responseEditor.scrollLeft,\n onScroll: deps.onResponseScroll,\n };\n}\n\nfunction responseCursorProps(state: AppState, deps: ViewDeps) {\n return {\n cursor: state.responseEditor.cursor,\n selection: state.responseEditor.selection,\n onChange: (_lines: readonly string[], cursor: CursorPosition) => {\n deps.onResponseChange(cursor);\n },\n onSelectionChange: deps.onResponseSelection,\n };\n}\n\nfunction renderResponseBody(state: AppState, deps: ViewDeps): VNode {\n const result = state.request.result;\n const scroll = responseScrollProps(state, deps);\n const cursor = responseCursorProps(state, deps);\n const gen = state.resultGeneration;\n\n if (state.request.sending) {\n return ui.center(ui.spinner({ label: \"Waiting for response…\" }));\n }\n if (state.request.error && !result) {\n return ui.errorDisplay(state.request.error);\n }\n if (!result) {\n return ui.empty(\"No response\", {\n description: \"Press F5 to send the request under cursor\",\n });\n }\n\n switch (state.ui.responseTab) {\n case \"headers\":\n return ui.table({\n id: `response-headers-${gen}`,\n columns: [\n { key: \"name\", header: \"Header\", width: 24 },\n { key: \"value\", header: \"Value\", flex: 1 },\n ],\n data: [...result.headers],\n getRowKey: (row) => row.name,\n flex: 1,\n minHeight: 6,\n });\n case \"raw\":\n return ui.codeEditor({\n id: `response-raw-${gen}`,\n lines: result.body ? result.body.split(\"\\n\") : [\"\"],\n readOnly: true,\n lineNumbers: true,\n syntaxLanguage: \"plain\",\n ...cursor,\n ...scroll,\n flex: 1,\n });\n case \"variables\":\n return ui.codeEditor({\n id: `response-vars-${gen}`,\n lines: [JSON.stringify(state.request.variables, null, 2)],\n readOnly: true,\n syntaxLanguage: \"json\",\n ...cursor,\n ...scroll,\n flex: 1,\n });\n case \"tests\":\n return ui.column({ gap: 1, flex: 1 }, [\n ...result.testResults.map((test) =>\n ui.text(`${test.status === \"SUCCESS\" ? \"✓\" : \"✗\"} ${test.message}`, {\n style: {\n fg:\n test.status === \"SUCCESS\"\n ? rgb(120, 220, 120)\n : test.status === \"SKIPPED\"\n ? rgb(220, 220, 120)\n : rgb(220, 120, 120),\n },\n }),\n ),\n ]);\n case \"pretty\":\n default:\n return ui.codeEditor({\n id: `response-pretty-${gen}`,\n lines: prettyJsonIfPossible(result.prettyBody || result.body).split(\"\\n\"),\n readOnly: true,\n lineNumbers: true,\n syntaxLanguage: \"json\",\n searchQuery: state.editor.searchQuery || undefined,\n ...cursor,\n ...scroll,\n flex: 1,\n });\n }\n}\n\nfunction renderResponse(state: AppState, deps: ViewDeps): VNode {\n const result = state.request.result;\n const statusLine =\n state.request.sending || !result\n ? null\n : `${result.protocol ?? \"HTTP\"} ${result.statusCode ?? \"?\"} ${result.statusMessage ?? \"\"} · ${result.durationMs ?? \"?\"} ms`;\n\n const tabItems = [\n { key: \"pretty\", label: \"Pretty\" },\n { key: \"raw\", label: \"Raw\" },\n { key: \"headers\", label: \"Headers\" },\n { key: \"variables\", label: \"Vars\" },\n { key: \"tests\", label: \"Tests\" },\n ] as const;\n\n return ui.panel(\n {\n id: \"pane-response\",\n title: state.ui.focusPane === \"response\" ? \"● Response\" : \"Response\",\n style: paneStyle(state.ui.focusPane === \"response\"),\n },\n [\n ui.row({ gap: 2 }, [\n state.request.sending\n ? ui.spinner({ label: \"Sending request…\" })\n : ui.text(statusLine ?? \"Ready\", {\n style: { fg: rgb(...statusColor(result?.statusCode)), bold: true },\n }),\n result?.error && !state.request.sending\n ? ui.badge(result.error, { variant: \"error\" })\n : null,\n ]),\n ui.row({ gap: 1 }, [\n ...tabItems.map((tab) =>\n ui.button({\n id: `tab-${tab.key}`,\n label: tab.label,\n disabled: state.request.sending,\n onPress: () => deps.onResponseTab(tab.key),\n }),\n ),\n ]),\n renderResponseBody(state, deps),\n ],\n );\n}\n\nfunction statusColor(code: number | undefined): [number, number, number] {\n const tone = statusTone(code);\n switch (tone) {\n case \"green\":\n return [120, 220, 140];\n case \"yellow\":\n return [240, 200, 100];\n case \"red\":\n return [240, 120, 120];\n default:\n return [140, 200, 240];\n }\n}\n\nfunction renderMainLayout(state: AppState, deps: ViewDeps): VNode {\n const layoutMode = resolveLayoutMode(state.ui.viewportWidth);\n const zoom = state.ui.zoomPane;\n\n if (zoom) {\n if (zoom === \"files\") return renderFileTree(state, deps);\n if (zoom === \"editor\") return renderEditor(state, deps, false);\n return renderResponse(state, deps);\n }\n\n if (layoutMode === \"stacked\") {\n const pane =\n state.ui.focusPane === \"files\"\n ? renderFileTree(state, deps)\n : state.ui.focusPane === \"response\"\n ? renderResponse(state, deps)\n : renderEditor(state, deps, false);\n return pane;\n }\n\n if (layoutMode === \"sidebar-overlay\") {\n return ui.row({ gap: 1, flex: 1 }, [\n state.ui.sidebarVisible\n ? ui.box({ width: 28, flex: 0 }, [renderFileTree(state, deps)])\n : null,\n ui.column({ gap: 1, flex: 1 }, [\n renderEditor(state, deps, false),\n renderResponse(state, deps),\n ]),\n ]);\n }\n\n return ui.column({ gap: 1, flex: 1 }, [\n ui.splitPane(\n {\n id: \"main-split\",\n direction: \"horizontal\",\n sizes: [...state.ui.splitSizes],\n minSizes: [18, 24, 24],\n onChange: deps.onSplitChange,\n },\n [\n renderFileTree(state, deps),\n renderEditor(state, deps, false),\n renderResponse(state, deps),\n ],\n ),\n ]);\n}\n\nfunction renderFooter(state: AppState): VNode {\n const env =\n state.request.activeEnvironment.length > 0\n ? state.request.activeEnvironment.join(\",\")\n : \"none\";\n const dirName = path.basename(state.workspaceRoot);\n const branch = state.ui.gitBranch ?? \"—\";\n const fileName = state.selectedFilePath\n ? path.basename(state.selectedFilePath)\n : null;\n\n const hints = footerHints({\n focusPane: state.ui.focusPane,\n overlay: state.ui.overlay,\n viewportWidth: state.ui.viewportWidth,\n sending: state.request.sending,\n });\n\n return ui.statusBar({\n id: \"status-bar\",\n left: [\n ui.text(dirName, { style: { fg: rgb(180, 220, 255), bold: true } }),\n ui.text(` ⎇ ${branch}`, { style: { fg: rgb(160, 220, 160) } }),\n fileName ? ui.text(` | ${fileName}`) : null,\n state.dirty ? ui.text(\" ●\", { style: { fg: rgb(255, 180, 80) } }) : null,\n ui.text(` | env: ${env}`, { style: { fg: rgb(160, 200, 255) } }),\n state.ui.statusMessage ? ui.text(` | ${state.ui.statusMessage}`) : null,\n ].filter(Boolean) as VNode[],\n right: [ui.text(hints)],\n });\n}\n\nfunction renderOverlayContent(state: AppState, deps: ViewDeps): VNode {\n switch (state.ui.overlay) {\n case \"env\":\n return ui.modal({\n id: \"env-modal\",\n title: \"Environment\",\n content: ui.column({ gap: 1 }, [\n ui.text(\"Select environment (Enter to apply, Esc to close)\"),\n ui.text(\"(none)\", {\n style:\n state.ui.envSelectedIndex === 0\n ? { fg: rgb(255, 220, 120), bold: true }\n : undefined,\n }),\n ...state.request.environments.map((env, index) =>\n ui.text(env, {\n style:\n index + 1 === state.ui.envSelectedIndex\n ? { fg: rgb(255, 220, 120), bold: true }\n : undefined,\n }),\n ),\n ]),\n onClose: deps.onOverlayClose,\n width: 50,\n height: 16,\n });\n case \"help\":\n return ui.modal({\n id: \"help-modal\",\n title: \"reqex help\",\n content: ui.column({ gap: 1 }, HELP_HINT_LINES.map((line) => ui.text(line))),\n onClose: deps.onOverlayClose,\n width: 70,\n height: 14,\n });\n case \"keybindings\": {\n const maxLines = Math.max(8, Math.min(26, state.ui.viewportHeight - 8));\n const lines = buildKeybindingsViewLines(\n state.settings.keybindings as Record<string, CommandId>,\n maxLines,\n );\n return ui.modal({\n id: \"keybindings-modal\",\n title: \"Keybindings\",\n content: ui.column({ gap: 0 }, lines.map((line) => ui.text(line))),\n onClose: deps.onOverlayClose,\n width: 72,\n height: Math.min(maxLines + 4, 28),\n });\n }\n case \"commandPalette\":\n return ui.center(\n ui.commandPalette({\n id: \"command-palette\",\n open: true,\n query: state.ui.commandPalette.query,\n selectedIndex: state.ui.commandPalette.selectedIndex,\n sources: [\n {\n id: \"commands\",\n name: \"Commands\",\n getItems: (query) =>\n COMMAND_ITEMS.filter((item) =>\n item.label.toLowerCase().includes(query.toLowerCase()),\n ).map((item) => ({\n id: item.id,\n label: item.label,\n description: item.description,\n shortcut: item.shortcut,\n sourceId: \"commands\",\n })),\n },\n ],\n onChange: deps.onCommandPaletteChange,\n onSelect: (item) => deps.onCommandPaletteSelect(item.id),\n onClose: deps.onOverlayClose,\n onSelectionChange: deps.onCommandPaletteSelectionChange,\n width: 60,\n }),\n );\n default:\n return ui.text(\"\");\n }\n}\n\nexport function renderApp(state: AppState, deps: ViewDeps): VNode {\n const base = ui.column({ gap: 1, flex: 1 }, [\n renderMainLayout(state, deps),\n renderFooter(state),\n ]);\n\n if (state.ui.overlay === \"none\") {\n return base;\n }\n\n return ui.layers([\n base,\n ui.layer({\n id: \"overlay-layer\",\n modal: true,\n backdrop: \"dim\",\n closeOnEscape: true,\n onClose: deps.onOverlayClose,\n content: renderOverlayContent(state, deps),\n }),\n ]);\n}\n\nexport function focusPaneId(pane: FocusPane): string {\n switch (pane) {\n case \"files\":\n return \"pane-files\";\n case \"editor\":\n return \"pane-editor\";\n case \"response\":\n return \"pane-response\";\n }\n}\n\nexport { contentFromLines, methodColor };\n","import type { CodeEditorSyntaxToken, CodeEditorTokenizeContext } from \"@rezi-ui/core\";\n\nconst KEYWORDS = new Set([\n \"GET\",\n \"POST\",\n \"PUT\",\n \"PATCH\",\n \"DELETE\",\n \"HEAD\",\n \"OPTIONS\",\n \"CONNECT\",\n \"TRACE\",\n \"GRAPHQL\",\n]);\n\nexport function tokenizeHttpLine(\n line: string,\n _context: CodeEditorTokenizeContext,\n): readonly CodeEditorSyntaxToken[] {\n const tokens: CodeEditorSyntaxToken[] = [];\n const methodMatch = /^\\s*(GET|POST|PUT|PATCH|DELETE|HEAD|OPTIONS|CONNECT|TRACE|GRAPHQL)\\b/u.exec(\n line,\n );\n if (methodMatch) {\n const method = methodMatch[1] ?? \"\";\n tokens.push({ text: method, kind: \"keyword\" });\n const rest = line.slice(methodMatch[0].length);\n if (rest.length > 0) {\n tokens.push({ text: rest, kind: \"string\" });\n }\n return tokens;\n }\n\n if (/^\\s*#/u.test(line)) {\n return [{ text: line, kind: \"comment\" }];\n }\n if (/^\\s*\\/\\//u.test(line)) {\n return [{ text: line, kind: \"comment\" }];\n }\n if (/^\\s*@/u.test(line)) {\n return [{ text: line, kind: \"type\" }];\n }\n\n const headerMatch = /^\\s*([!#$%&'*+\\-.^_`|~0-9A-Za-z]+)(\\s*:\\s*)(.*)$/u.exec(line);\n if (headerMatch) {\n tokens.push({ text: headerMatch[1] ?? \"\", kind: \"function\" });\n tokens.push({ text: headerMatch[2] ?? \"\", kind: \"operator\" });\n tokens.push({ text: headerMatch[3] ?? \"\", kind: \"string\" });\n return tokens;\n }\n\n const words = line.split(/(\\s+)/u);\n for (const word of words) {\n if (KEYWORDS.has(word)) {\n tokens.push({ text: word, kind: \"keyword\" });\n } else if (word.length > 0) {\n tokens.push({ text: word, kind: \"plain\" });\n }\n }\n return tokens.length > 0 ? tokens : [{ text: line, kind: \"plain\" }];\n}\n\nexport function prettyJsonIfPossible(text: string): string {\n const trimmed = text.trim();\n if (!trimmed) {\n return text;\n }\n try {\n return JSON.stringify(JSON.parse(trimmed), null, 2);\n } catch {\n return text;\n }\n}\n\nexport function methodColor(method: string | undefined): \"green\" | \"yellow\" | \"red\" | \"cyan\" {\n switch ((method ?? \"GET\").toUpperCase()) {\n case \"GET\":\n case \"HEAD\":\n case \"OPTIONS\":\n return \"green\";\n case \"POST\":\n case \"PUT\":\n case \"PATCH\":\n return \"yellow\";\n case \"DELETE\":\n return \"red\";\n default:\n return \"cyan\";\n }\n}\n\nexport function statusTone(statusCode: number | undefined): \"green\" | \"yellow\" | \"red\" | \"cyan\" {\n if (!statusCode) {\n return \"cyan\";\n }\n if (statusCode >= 200 && statusCode < 300) {\n return \"green\";\n }\n if (statusCode >= 400 && statusCode < 500) {\n return \"yellow\";\n }\n if (statusCode >= 500) {\n return \"red\";\n }\n return \"cyan\";\n}\n","import clipboard from \"clipboardy\";\n\nexport async function copyToClipboard(text: string): Promise<boolean> {\n try {\n await clipboard.write(text);\n return true;\n } catch {\n if (process.stdout.write(`\\x1b]52;c;${Buffer.from(text, \"utf8\").toString(\"base64\")}\\x07`)) {\n return true;\n }\n return false;\n }\n}\n\nexport function disableFlowControl(): void {\n if (process.stdin.isTTY) {\n try {\n process.stdin.setRawMode?.(true);\n } catch {\n // ignore\n }\n }\n}\n","import { execFile } from \"node:child_process\";\nimport { promisify } from \"node:util\";\n\nconst execFileAsync = promisify(execFile);\n\nexport async function getGitBranch(root: string): Promise<string | null> {\n try {\n const { stdout } = await execFileAsync(\n \"git\",\n [\"-C\", root, \"rev-parse\", \"--abbrev-ref\", \"HEAD\"],\n { timeout: 2000 },\n );\n const branch = stdout.trim();\n return branch.length > 0 ? branch : null;\n } catch {\n return null;\n }\n}\n"],"mappings":";;;AAAA,OAAOA,WAAU;AACjB,OAAOC,cAAa;AAEpB,SAAS,qBAAmC;;;ACH5C,OAAO,QAAQ;AACf,OAAO,QAAQ;AACf,OAAO,UAAU;AAWjB,IAAM,kBAA6C;AAAA,EACjD,IAAI;AAAA,EACJ,cAAc;AAAA,EACd,aAAa;AAAA,EACb,KAAK;AAAA,EACL,aAAa;AAAA,EACb,UAAU;AAAA,EACV,UAAU;AAAA,EACV,UAAU;AAAA,EACV,SAAS;AAAA,EACT,SAAS;AAAA,EACT,SAAS;AAAA,EACT,UAAU;AAAA,EACV,UAAU;AAAA,EACV,gBAAgB;AAAA,EAChB,IAAI;AAAA,EACJ,UAAU;AAAA,EACV,UAAU;AAAA,EACV,KAAK;AAAA,EACL,GAAG;AAAA,EACH,IAAI;AAAA,EACJ,KAAK;AAAA,EACL,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,UAAU;AAAA,EACV,gBAAgB;AAAA,EAChB,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,kBAAkB;AACpB;AAEA,IAAM,eAA0C;AAAA,EAC9C,GAAG;AAAA,EACH,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AACd;AAEO,IAAM,iBAA4C;AAAA,EACvD,gBAAgB;AAAA,EAChB,kBAAkB;AAAA,EAClB,kBAAkB;AAAA,EAClB,kBAAkB;AAAA,EAClB,mBAAmB;AAAA,EACnB,oBAAoB;AAAA,EACpB,sBAAsB;AAAA,EACtB,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,gBAAgB;AAAA,EAChB,kBAAkB;AAAA,EAClB,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,iBAAiB;AAAA,EACjB,YAAY;AAAA,EACZ,oBAAoB;AAAA,EACpB,iBAAiB;AAAA,EACjB,aAAa;AAAA,EACb,oBAAoB;AAAA,EACpB,aAAa;AAAA,EACb,qBAAqB;AAAA,EACrB,qBAAqB;AAAA,EACrB,iBAAiB;AAAA,EACjB,mBAAmB;AAAA,EACnB,qBAAqB;AACvB;AAEA,IAAM,oBAA4C;AAAA,EAChD,MAAM;AAAA,EACN,OAAO;AAAA,EACP,KAAK;AAAA,EACL,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,KAAK;AAAA,EACL,OAAO;AAAA,EACP,OAAO;AAAA,EACP,WAAW;AAAA,EACX,QAAQ;AAAA,EACR,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,MAAM;AAAA,EACN,OAAO;AACT;AAEO,SAAS,eAAe,KAAqB;AAClD,MAAI,UAAU,KAAK,GAAG,GAAG;AACvB,WAAO;AAAA,EACT;AACA,MAAI,IAAI,WAAW,GAAG;AACpB,WAAO,QAAQ,MAAM,MAAM,IAAI,YAAY;AAAA,EAC7C;AAEA,SAAO,IACJ,MAAM,GAAG,EACT,IAAI,CAAC,SAAS,kBAAkB,IAAI,KAAK,KAAK,YAAY,CAAC,EAC3D,KAAK,GAAG;AACb;AAEO,SAAS,0BACd,UACA,UACU;AACV,QAAM,YAAY,oBAAI,IAAyB;AAC/C,aAAW,CAAC,KAAK,OAAO,KAAK,OAAO,QAAQ,QAAQ,GAAG;AACrD,UAAM,OAAO,UAAU,IAAI,OAAO,KAAK,CAAC;AACxC,SAAK,KAAK,GAAG;AACb,cAAU,IAAI,SAAS,IAAI;AAAA,EAC7B;AAEA,QAAM,OAAO,CAAC,GAAG,UAAU,QAAQ,CAAC,EACjC,IAAI,CAAC,CAAC,SAAS,IAAI,MAAM;AACxB,UAAM,gBAAgB,KACnB,KAAK,CAAC,GAAG,MAAM,EAAE,cAAc,CAAC,CAAC,EACjC,IAAI,cAAc,EAClB,KAAK,KAAK;AACb,UAAM,QAAQ,eAAe,OAAO,KAAK;AACzC,WAAO,EAAE,OAAO,KAAK,GAAG,cAAc,OAAO,EAAE,CAAC,KAAK,KAAK,GAAG;AAAA,EAC/D,CAAC,EACA,KAAK,CAAC,GAAG,MAAM,EAAE,MAAM,cAAc,EAAE,KAAK,CAAC,EAC7C,IAAI,CAAC,UAAU,MAAM,GAAG;AAE3B,MAAI,aAAa,UAAa,KAAK,SAAS,UAAU;AACpD,UAAM,SAAS,KAAK,SAAS,WAAW;AACxC,WAAO,CAAC,GAAG,KAAK,MAAM,GAAG,WAAW,CAAC,GAAG,UAAK,MAAM,OAAO;AAAA,EAC5D;AACA,SAAO;AACT;AAEO,SAAS,eAAuB;AACrC,MAAI,QAAQ,IAAI,kBAAkB;AAChC,WAAO,QAAQ,IAAI;AAAA,EACrB;AACA,MAAI,QAAQ,aAAa,SAAS;AAChC,UAAM,UAAU,QAAQ,IAAI,WAAW,KAAK,KAAK,GAAG,QAAQ,GAAG,WAAW,SAAS;AACnF,WAAO,KAAK,KAAK,SAAS,OAAO;AAAA,EACnC;AACA,MAAI,QAAQ,aAAa,UAAU;AACjC,WAAO,KAAK,KAAK,GAAG,QAAQ,GAAG,WAAW,uBAAuB,OAAO;AAAA,EAC1E;AACA,QAAM,MAAM,QAAQ,IAAI,mBAAmB,KAAK,KAAK,GAAG,QAAQ,GAAG,SAAS;AAC5E,SAAO,KAAK,KAAK,KAAK,OAAO;AAC/B;AAEO,SAAS,oBAAoB,eAA+B;AACjE,SAAO,KAAK,KAAK,eAAe,QAAQ;AAC1C;AAEA,SAAS,iBAAiB,UAA2C;AACnE,MAAI;AACF,QAAI,CAAC,GAAG,WAAW,QAAQ,GAAG;AAC5B,aAAO;AAAA,IACT;AACA,UAAM,MAAM,GAAG,aAAa,UAAU,MAAM;AAC5C,WAAO,KAAK,MAAM,GAAG;AAAA,EACvB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,SAAS,gBAAgB,eAG9B;AACA,QAAM,aAAa,iBAAiB,KAAK,KAAK,aAAa,GAAG,kBAAkB,CAAC;AACjF,QAAM,gBAAgB;AAAA,IACpB,KAAK,KAAK,oBAAoB,aAAa,GAAG,kBAAkB;AAAA,EAClE;AAEA,QAAM,SACJ,eAAe,UAAU,YAAY,UAAW;AAClD,QAAM,WAAW,WAAW,QAAQ,eAAe;AAEnD,SAAO;AAAA,IACL;AAAA,IACA,UAAU;AAAA,MACR,GAAG;AAAA,MACH,GAAG,YAAY;AAAA,MACf,GAAG,eAAe;AAAA,IACpB;AAAA,EACF;AACF;AAEO,SAAS,iBACd,eACA,UACY;AACZ,QAAM,OAAO,CAAC,aAAa,GAAG,oBAAoB,aAAa,CAAC;AAChE,QAAM,WAAW,KAAK,IAAI,CAAC,QAAQ;AACjC,QAAI;AACF,SAAG,UAAU,KAAK,EAAE,WAAW,KAAK,CAAC;AAAA,IACvC,QAAQ;AAAA,IAER;AACA,WAAO,GAAG,MAAM,KAAK,EAAE,YAAY,MAAM,GAAG,MAAM,SAAS,CAAC;AAAA,EAC9D,CAAC;AACD,SAAO,MAAM;AACX,eAAW,WAAW,UAAU;AAC9B,cAAQ,MAAM;AAAA,IAChB;AAAA,EACF;AACF;AASA,IAAM,eAAkD;AAAA,EACtD,QAAQ,CAAC,WAAW,eAAe,aAAa,YAAY;AAAA,EAC5D,UAAU,CAAC,aAAa,qBAAqB,WAAW,YAAY;AAAA,EACpE,OAAO,CAAC,cAAc,aAAa,gBAAgB,YAAY;AAAA,EAC/D,SAAS,CAAC,yBAAe,gBAAgB,WAAW;AAAA,EACpD,SAAS,CAAC,iBAAiB,aAAa,aAAa;AACvD;AAEO,SAAS,YAAY,SAAoC;AAC9D,MAAI;AACJ,MAAI,QAAQ,YAAY,QAAQ;AAC9B,YAAQ,aAAa;AAAA,EACvB,WAAW,QAAQ,SAAS;AAC1B,YAAQ,aAAa;AAAA,EACvB,OAAO;AACL,YAAQ,aAAa,QAAQ,SAAS,KAAK,aAAa;AAAA,EAC1D;AAEA,QAAM,aAAa;AACnB,QAAM,WAAW,KAAK,IAAI,IAAI,QAAQ,gBAAgB,UAAU;AAChE,MAAI,OAAO,MAAM,KAAK,QAAK;AAC3B,MAAI,KAAK,SAAS,UAAU;AAC1B,WAAO,GAAG,KAAK,MAAM,GAAG,WAAW,CAAC,CAAC;AAAA,EACvC;AACA,SAAO;AACT;AAEO,IAAM,kBAAqC;AAAA,EAChD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;;;AClQA,SAAS,KAAK,UAAU;AAGxB,IAAI,gBAA+B,YAAY;AAExC,SAAS,iBAAiB,SAA8B;AAC7D,kBAAgB;AAClB;AAEO,SAAS,sBAA4B;AAC1C,MAAI,iBAAiB;AACrB,KAAG,wBAAwB,YAAY,MAAM;AAC7C,KAAG,wBAAwB,WAAW,OAAO,YAAY;AACvD,UAAM,SAAS,MAAM,cAAc,EAAE,MAAM,WAAW,QAAQ,CAAC;AAC/D,WAAO,WAAW;AAAA,EACpB;AACA,KAAG,wBAAwB,kBAAkB,OAAO,SAAS,cAAc,WAAW;AACpF,UAAM,SAAS,MAAM,cAAc;AAAA,MACjC,MAAM;AAAA,MACN;AAAA,MACA;AAAA,MACA,QAAQ,UAAU;AAAA,IACpB,CAAC;AACD,WAAO,OAAO,WAAW,WAAW,SAAS;AAAA,EAC/C;AACA,KAAG,wBAAwB,iBAAiB,OAAO,SAAS,WAAW;AACrE,UAAM,SAAS,MAAM,cAAc,EAAE,MAAM,QAAQ,SAAS,OAAO,CAAC;AACpE,WAAO,OAAO,WAAW,WAAW,SAAS;AAAA,EAC/C;AACA,KAAG,wBAAwB,yBAAyB,OAAO,YAAY;AACrE,UAAM,cAAc,EAAE,MAAM,WAAW,QAAQ,CAAC;AAChD,WAAO;AAAA,EACT;AACA,KAAG,wBAAwB,kBAAkB,OAAO,YAAY;AAC9D,UAAM,cAAc,EAAE,MAAM,WAAW,QAAQ,CAAC;AAChD,WAAO;AAAA,EACT;AACA,KAAG,wBAAwB,mBAAmB,OAAO,YAAY;AAC/D,UAAM,cAAc,EAAE,MAAM,WAAW,QAAQ,CAAC;AAChD,WAAO;AAAA,EACT;AACF;;;ACtCO,SAAS,oBACd,SACA,MACsB;AACtB,QAAM,aAAa,QAAQ;AAAA,IACzB,CAAC,WACC,OAAO,cACP,CAAC,OAAO,YACR,OAAO,aAAa,QACpB,QAAQ,OAAO;AAAA,EACnB;AAEA,MAAI,WAAW,WAAW,GAAG;AAC3B,WAAO;AAAA,EACT;AAEA,SAAO,WAAW,OAAO,CAAC,MAAM,YAAY;AAC1C,UAAM,WAAW,KAAK,UAAU,KAAK;AACrC,UAAM,cAAc,QAAQ,UAAU,QAAQ;AAC9C,QAAI,cAAc,UAAU;AAC1B,aAAO;AAAA,IACT;AACA,QAAI,gBAAgB,YAAY,QAAQ,YAAY,KAAK,WAAW;AAClE,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT,CAAC;AACH;AAMA,IAAM,qBACJ;AAEF,SAAS,wBAAwB,MAAsB;AACrD,QAAM,QAAQ,mBAAmB,KAAK,IAAI;AAC1C,SAAO,QAAQ,MAAM,CAAC,EAAE,SAAS;AACnC;AAEO,SAAS,uBACd,SACA,gBACA,WAOC;AACD,QAAM,UAMD,CAAC;AAEN,aAAW,UAAU,SAAS;AAC5B,QAAI,CAAC,OAAO,cAAc,OAAO,UAAU;AACzC;AAAA,IACF;AACA,UAAM,WAAW,OAAO,OAAO;AAC/B,UAAM,OAAO,UAAU,OAAO,SAAS,KAAK;AAC5C,UAAM,YAAY,wBAAwB,IAAI;AAC9C,YAAQ,KAAK;AAAA,MACX,MAAM,OAAO;AAAA,MACb,aAAa;AAAA,MACb,WAAW,YAAY;AAAA,MACvB,UAAU,WAAW,SAAS;AAAA,MAC9B,SAAS,GAAG,OAAO,UAAU,KAAK,IAAI,OAAO,IAAI;AAAA,IACnD,CAAC;AAAA,EACH;AAEA,SAAO;AACT;;;AChFA,SAAS,SAAS,0BAA0B;AAK5C,IAAM,QAAQ,IAAI,mBAAmB,cAAc;AACnD,IAAM,WAAW,oBAAI,IAAoB;AAEzC,SAAS,SAAS,QAAmC;AACnD,SAAO;AAAA,IACL,IAAI,OAAO;AAAA,IACX,MAAM,OAAO,OAAO;AAAA,IACpB,QAAQ,OAAO,SAAS;AAAA,IACxB,KAAK,OAAO,SAAS;AAAA,IACrB,WAAW,OAAO,OAAO;AAAA,IACzB,SAAS,OAAO,OAAO;AAAA,IACvB,UAAU,OAAO,SAAS;AAAA,IAC1B,YAAY,QAAQ,OAAO,OAAO;AAAA,EACpC;AACF;AAEO,SAAS,iBAAiB,UAA0B;AACzD,QAAM,QAAQ,SAAS,IAAI,QAAQ,KAAK,KAAK;AAC7C,WAAS,IAAI,UAAU,IAAI;AAC3B,SAAO;AACT;AAEO,SAAS,gBAAgB,UAA0B;AACxD,SAAO,SAAS,IAAI,QAAQ,KAAK;AACnC;AAEA,eAAsB,UACpB,UACA,SACA,YACA,SACqB;AACrB,QAAM,eAAe,WAAW,gBAAgB,QAAQ;AACxD,QAAM,WAAW,MAAM,MAAM,YAAY,UAAU,SAAS,cAAc;AAAA,IACxE;AAAA,EACF,CAAC;AAED,QAAM,UAAU,SAAS,YAAY,IAAI,QAAQ;AACjD,SAAO;AAAA,IACL,MAAM;AAAA,IACN;AAAA,IACA,SAAS;AAAA,EACX;AACF;AAEO,SAAS,YAAY,UAAwC;AAClE,SAAO,MAAM,IAAI,QAAQ;AAC3B;AAEO,SAAS,cAAc,UAAkB,UAA0C;AACxF,QAAM,WAAW,MAAM,IAAI,QAAQ;AACnC,SAAO,UAAU,YAAY,KAAK,CAAC,WAAuB,OAAO,OAAO,QAAQ;AAClF;;;ACzDA,SAAS,iBAAiB,cAAc,YAAY;AAMpD,SAAS,WAAW,MAAuB;AACzC,MAAI,SAAS,UAAa,SAAS,MAAM;AACvC,WAAO;AAAA,EACT;AACA,MAAI,OAAO,SAAS,UAAU;AAC5B,WAAO;AAAA,EACT;AACA,MAAI,OAAO,SAAS,IAAI,GAAG;AACzB,WAAO,KAAK,SAAS,MAAM;AAAA,EAC7B;AACA,MAAI;AACF,WAAO,KAAK,UAAU,MAAM,MAAM,CAAC;AAAA,EACrC,QAAQ;AACN,WAAO,OAAO,IAAI;AAAA,EACpB;AACF;AAEA,SAAS,WAAW,UAA4C;AAC9D,MAAI,CAAC,UAAU;AACb,WAAO;AAAA,EACT;AACA,MAAI,SAAS,iBAAiB;AAC5B,WAAO,SAAS;AAAA,EAClB;AACA,SAAO,WAAW,SAAS,IAAI;AACjC;AAEA,SAAS,UAAU,UAAyD;AAC1E,MAAI,CAAC,UAAU,SAAS;AACtB,WAAO,CAAC;AAAA,EACV;AACA,SAAO,OAAO,QAAQ,SAAS,OAAO,EAAE,IAAI,CAAC,CAAC,MAAM,KAAK,OAAO;AAAA,IAC9D;AAAA,IACA,OAAO,MAAM,QAAQ,KAAK,IAAI,MAAM,KAAK,IAAI,IAAI,OAAO,SAAS,EAAE;AAAA,EACrE,EAAE;AACJ;AAEA,SAAS,cAAc,QAA4H;AACjJ,MAAI,CAAC,OAAO,aAAa;AACvB,WAAO,CAAC;AAAA,EACV;AACA,SAAO,OAAO,YAAY,IAAI,CAAC,YAAY;AAAA,IACzC,SAAS,OAAO;AAAA,IAChB,QAAQ,OAAO;AAAA,IACf,QAAQ,OAAO,OAAO;AAAA,EACxB,EAAE;AACJ;AAEA,eAAsB,WAAW,SAMT;AACtB,QAAM,WAAW,YAAY,QAAQ,QAAQ;AAC7C,QAAM,aAAa,cAAc,QAAQ,UAAU,QAAQ,QAAQ;AAEnE,MAAI,CAAC,YAAY,CAAC,YAAY;AAC5B,WAAO;AAAA,MACL,SAAS,CAAC;AAAA,MACV,MAAM;AAAA,MACN,YAAY;AAAA,MACZ,aAAa,CAAC;AAAA,MACd,OAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO,WAAW;AAClB,SAAO,WAAW;AAElB,MAAI;AACJ,QAAM,cAAc,OAAO,aAAuC;AAChE,uBAAmB;AAAA,EACrB;AAEA,MAAI;AACF,UAAM,KAAK;AAAA,MACT;AAAA,MACA;AAAA,MACA,mBAAmB,QAAQ;AAAA,MAC3B,WAAW,QAAQ;AAAA,MACnB;AAAA,IACF,CAAC;AAED,UAAM,WAAW,oBAAoB,WAAW;AAChD,WAAO;AAAA,MACL,YAAY,UAAU;AAAA,MACtB,eAAe,UAAU;AAAA,MACzB,UAAU,UAAU;AAAA,MACpB,SAAS,UAAU,QAAQ;AAAA,MAC3B,MAAM,WAAW,UAAU,IAAI;AAAA,MAC/B,YAAY,WAAW,QAAQ;AAAA,MAC/B,YAAY,UAAU,SAAS;AAAA,MAC/B,aAAa,cAAc,UAAU;AAAA,IACvC;AAAA,EACF,SAAS,OAAO;AACd,WAAO;AAAA,MACL,SAAS,CAAC;AAAA,MACV,MAAM;AAAA,MACN,YAAY;AAAA,MACZ,aAAa,cAAc,UAAU;AAAA,MACrC,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,IAC9D;AAAA,EACF;AACF;AAEA,eAAsB,iBAAiB,UAAqC;AAC1E,QAAM,WAAW,YAAY,QAAQ;AACrC,MAAI,CAAC,UAAU;AACb,WAAO,CAAC;AAAA,EACV;AACA,SAAO,gBAAgB,EAAE,SAAS,CAAC;AACrC;AAEA,eAAsB,cACpB,UACA,mBACkC;AAClC,QAAM,WAAW,YAAY,QAAQ;AACrC,MAAI,CAAC,UAAU;AACb,WAAO,CAAC;AAAA,EACV;AACA,SAAO,aAAa,EAAE,UAAU,kBAAkB,CAAC;AACrD;;;AC5HO,SAAS,gBACd,UACA,SAC2B;AAC3B,QAAM,MAAoD,CAAC;AAE3D,aAAW,CAAC,KAAK,OAAO,KAAK,OAAO,QAAQ,QAAQ,GAAG;AACrD,QAAI,GAAG,IAAI,MAAM,QAAQ,OAAO;AAAA,EAClC;AAEA,SAAO;AACT;AAEO,SAAS,qBAAqB,IAA8B;AACjE,QAAM,QAAmC;AAAA,IACvC,gBAAgB;AAAA,IAChB,kBAAkB;AAAA,IAClB,aAAa;AAAA,IACb,gBAAgB;AAAA,IAChB,oBAAoB;AAAA,IACpB,aAAa;AAAA,IACb,oBAAoB;AAAA,IACpB,aAAa;AAAA,IACb,kBAAkB;AAAA,EACpB;AACA,SAAO,MAAM,EAAE,KAAK;AACtB;AAEO,IAAM,gBAKR;AAAA,EACH,EAAE,IAAI,gBAAgB,OAAO,gBAAgB,aAAa,6BAA6B,UAAU,KAAK;AAAA,EACtG,EAAE,IAAI,kBAAkB,OAAO,kBAAkB,aAAa,4BAA4B,UAAU,SAAS;AAAA,EAC7G,EAAE,IAAI,aAAa,OAAO,aAAa,aAAa,wBAAwB,UAAU,SAAS;AAAA,EAC/F,EAAE,IAAI,gBAAgB,OAAO,sBAAsB,aAAa,6BAA6B,UAAU,SAAS;AAAA,EAChH,EAAE,IAAI,kBAAkB,OAAO,kBAAkB,aAAa,uBAAuB,UAAU,SAAS;AAAA,EACxG,EAAE,IAAI,aAAa,OAAO,aAAa,aAAa,qBAAqB,UAAU,MAAM;AAAA,EACzF,EAAE,IAAI,aAAa,OAAO,QAAQ,aAAa,mBAAmB,UAAU,KAAK;AAAA,EACjF,EAAE,IAAI,oBAAoB,OAAO,eAAe,aAAa,wBAAwB,UAAU,SAAS;AAC1G;;;AChDA,SAAS,UAAU,iBAAiB;AAEpC,OAAO,cAAkC;AACzC,SAAS,oBAAoB;;;ACH7B,SAAS,SAAS,YAAY;AAC9B,OAAOC,WAAU;AAIjB,IAAM,YAAY,oBAAI,IAAI;AAAA,EACxB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAED,IAAM,aAAsE;AAAA,EAC1E,EAAE,KAAK,SAAS,MAAM,OAAO;AAAA,EAC7B,EAAE,KAAK,SAAS,MAAM,OAAO;AAAA,EAC7B,EAAE,KAAK,QAAQ,MAAM,MAAM;AAAA,EAC3B,EAAE,KAAK,aAAa,MAAM,WAAW;AACvC;AAEO,SAAS,aAAa,UAA4C;AACvE,QAAM,OAAOA,MAAK,SAAS,QAAQ;AACnC,aAAW,EAAE,KAAK,KAAK,KAAK,YAAY;AACtC,QAAI,SAAS,OAAO,KAAK,SAAS,GAAG,GAAG;AACtC,aAAO;AAAA,IACT;AAAA,EACF;AACA,MAAI,KAAK,SAAS,WAAW,GAAG;AAC9B,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAMA,eAAsB,iBAAiB,SAA+C;AACpF,SAAO,kBAAkB,SAAS,OAAO;AAC3C;AAEA,eAAe,kBACb,SACA,YAC8B;AAC9B,MAAI;AACJ,MAAI;AACF,cAAU,MAAM,QAAQ,UAAU;AAAA,EACpC,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AAEA,UAAQ,KAAK,CAAC,GAAG,MAAM,EAAE,cAAc,CAAC,CAAC;AACzC,QAAM,QAA6B,CAAC;AAEpC,aAAW,SAAS,SAAS;AAC3B,QAAI,MAAM,WAAW,GAAG,KAAK,UAAU,UAAU,CAAC,MAAM,SAAS,WAAW,GAAG;AAC7E,UAAI,UAAU,IAAI,KAAK,GAAG;AACxB;AAAA,MACF;AAAA,IACF;AAEA,UAAM,WAAWC,MAAK,KAAK,YAAY,KAAK;AAC5C,QAAI;AACJ,QAAI;AACF,kBAAY,MAAM,KAAK,QAAQ;AAAA,IACjC,QAAQ;AACN;AAAA,IACF;AAEA,QAAI,UAAU,YAAY,GAAG;AAC3B,UAAI,UAAU,IAAI,KAAK,GAAG;AACxB;AAAA,MACF;AACA,YAAM,WAAW,MAAM,kBAAkB,SAAS,QAAQ;AAC1D,UAAI,SAAS,SAAS,GAAG;AACvB,cAAM,KAAK;AAAA,UACT,MAAM;AAAA,UACN,MAAM;AAAA,UACN,MAAM;AAAA,UACN;AAAA,QACF,CAAC;AAAA,MACH;AACA;AAAA,IACF;AAEA,UAAM,WAAW,aAAa,QAAQ;AACtC,QAAI,CAAC,UAAU;AACb;AAAA,IACF;AAEA,UAAM,KAAK;AAAA,MACT,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,MACN;AAAA,IACF,CAAC;AAAA,EACH;AAEA,SAAO;AACT;AAEO,SAAS,aAAa,OAA0D;AACrF,QAAM,QAA6B,CAAC;AACpC,aAAW,QAAQ,OAAO;AACxB,QAAI,KAAK,SAAS,QAAQ;AACxB,YAAM,KAAK,IAAI;AAAA,IACjB,WAAW,KAAK,UAAU;AACxB,YAAM,KAAK,GAAG,aAAa,KAAK,QAAQ,CAAC;AAAA,IAC3C;AAAA,EACF;AACA,SAAO;AACT;;;ADxGO,IAAM,YAAN,cAAwB,aAAa;AAAA,EACjC;AAAA,EACD,UAA4B;AAAA,EAC5B,OAA4B,CAAC;AAAA,EAErC,YAAY,SAAiB;AAC3B,UAAM;AACN,SAAK,UAAU;AAAA,EACjB;AAAA,EAEA,MAAM,OAAqC;AACzC,SAAK,OAAO,MAAM,iBAAiB,KAAK,OAAO;AAC/C,UAAM,KAAK,aAAa;AACxB,SAAK,WAAW,EAAE,MAAM,QAAQ,CAAC;AACjC,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,UAAwC;AACtC,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,MAAM,UAAwC;AAC5C,SAAK,OAAO,MAAM,iBAAiB,KAAK,OAAO;AAC/C,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,MAAM,SAAS,UAAmC;AAChD,WAAO,SAAS,UAAU,MAAM;AAAA,EAClC;AAAA,EAEA,MAAM,UAAU,UAAkB,SAAgC;AAChE,UAAM,UAAU,UAAU,SAAS,MAAM;AAAA,EAC3C;AAAA,EAEA,MAAM,QAAuB;AAC3B,UAAM,KAAK,SAAS,MAAM;AAC1B,SAAK,UAAU;AAAA,EACjB;AAAA,EAEA,MAAc,eAA8B;AAC1C,UAAM,KAAK,SAAS,MAAM;AAC1B,SAAK,UAAU,SAAS,MAAM,KAAK,SAAS;AAAA,MAC1C,eAAe;AAAA,MACf,SAAS;AAAA,QACP;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,MACA,kBAAkB,EAAE,oBAAoB,KAAK,cAAc,GAAG;AAAA,IAChE,CAAC;AAED,UAAM,SAAS,OAAO,MAAoCC,UAAiB;AACzE,UAAI;AACF,aAAK,OAAO,MAAM,iBAAiB,KAAK,OAAO;AAC/C,aAAK,WAAW,EAAE,MAAM,MAAAA,MAAK,CAAC;AAAA,MAChC,SAAS,OAAO;AACd,aAAK,KAAK,SAAS,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,KAAK,CAAC,CAAC;AAAA,MAC9E;AAAA,IACF;AAEA,SAAK,QAAQ,GAAG,OAAO,CAACA,UAAS,KAAK,OAAO,OAAOA,KAAI,CAAC;AACzD,SAAK,QAAQ,GAAG,UAAU,CAACA,UAAS,KAAK,OAAO,UAAUA,KAAI,CAAC;AAC/D,SAAK,QAAQ,GAAG,UAAU,CAACA,UAAS,KAAK,OAAO,UAAUA,KAAI,CAAC;AAC/D,SAAK,QAAQ,GAAG,SAAS,CAAC,UAAU;AAClC,WAAK,KAAK,SAAS,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,KAAK,CAAC,CAAC;AAAA,IAC9E,CAAC;AAAA,EACH;AAAA,EAEQ,WAAW,OAAmC;AACpD,SAAK,KAAK,UAAU,KAAK;AAAA,EAC3B;AACF;;;AEiCO,IAAM,cAAoC,CAAC,SAAS,UAAU,UAAU;AACxE,IAAM,gBAAwC;AAAA,EACnD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEO,SAAS,mBAAmB,eAAiC;AAClE,SAAO;AAAA,IACL;AAAA,IACA,UAAU,CAAC;AAAA,IACX,eAAe,CAAC;AAAA,IAChB,kBAAkB;AAAA,IAClB,aAAa;AAAA,IACb,WAAW,CAAC,EAAE;AAAA,IACd,OAAO;AAAA,IACP,cAAc;AAAA,IACd,YAAY;AAAA,IACZ,cAAc;AAAA,IACd,gBAAgB;AAAA,MACd,WAAW;AAAA,MACX,YAAY;AAAA,MACZ,QAAQ,EAAE,MAAM,GAAG,QAAQ,EAAE;AAAA,MAC7B,WAAW;AAAA,IACb;AAAA,IACA,kBAAkB;AAAA,IAClB,QAAQ;AAAA,MACN,QAAQ,EAAE,MAAM,GAAG,QAAQ,EAAE;AAAA,MAC7B,WAAW;AAAA,MACX,WAAW;AAAA,MACX,YAAY;AAAA,MACZ,aAAa;AAAA,IACf;AAAA,IACA,SAAS;AAAA,MACP,SAAS;AAAA,MACT,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,mBAAmB,CAAC;AAAA,MACpB,cAAc,CAAC;AAAA,MACf,WAAW,CAAC;AAAA,IACd;AAAA,IACA,IAAI;AAAA,MACF,WAAW;AAAA,MACX,UAAU;AAAA,MACV,gBAAgB;AAAA,MAChB,YAAY;AAAA,MACZ,eAAe;AAAA,MACf,gBAAgB;AAAA,MAChB,SAAS;AAAA,MACT,aAAa;AAAA,MACb,YAAY,CAAC,IAAI,IAAI,EAAE;AAAA,MACvB,kBAAkB;AAAA,MAClB,gBAAgB,EAAE,MAAM,OAAO,OAAO,IAAI,eAAe,EAAE;AAAA,MAC3D,eAAe;AAAA,MACf,eAAe;AAAA,MACf,WAAW;AAAA,IACb;AAAA,IACA,UAAU;AAAA,MACR,cAAc;AAAA,MACd,aAAa,CAAC;AAAA,IAChB;AAAA,EACF;AACF;AAEO,SAAS,iBAAiB,SAA2B;AAC1D,MAAI,QAAQ,WAAW,GAAG;AACxB,WAAO,CAAC,EAAE;AAAA,EACZ;AACA,SAAO,QAAQ,MAAM,QAAQ;AAC/B;AAEO,SAAS,iBAAiB,OAAkC;AACjE,SAAO,MAAM,KAAK,IAAI;AACxB;AAEO,SAAS,kBAAkB,OAA2B;AAC3D,MAAI,QAAQ,IAAI;AACd,WAAO;AAAA,EACT;AACA,MAAI,QAAQ,KAAK;AACf,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEO,SAAS,SAAS,SAA+B;AACtD,QAAM,QAAQ,YAAY,QAAQ,OAAO;AACzC,SAAO,aAAa,QAAQ,KAAK,YAAY,MAAM,KAAK;AAC1D;AAEO,SAAS,SAAS,SAA+B;AACtD,QAAM,QAAQ,YAAY,QAAQ,OAAO;AACzC,SAAO,aAAa,QAAQ,YAAY,SAAS,KAAK,YAAY,MAAM,KAAK;AAC/E;AAEO,SAAS,gBAAgB,SAAmC;AACjE,QAAM,QAAQ,cAAc,QAAQ,OAAO;AAC3C,SAAO,eAAe,QAAQ,KAAK,cAAc,MAAM,KAAK;AAC9D;AAEO,SAAS,gBAAgB,SAAmC;AACjE,QAAM,QAAQ,cAAc,QAAQ,OAAO;AAC3C,SAAO,eAAe,QAAQ,cAAc,SAAS,KAAK,cAAc,MAAM,KAAK;AACrF;;;ACpNO,SAAS,uBAAuC;AACrD,MAAI,iBAAiB;AAErB,SAAO;AAAA,IACL,YAAoB;AAClB,wBAAkB;AAClB,aAAO;AAAA,IACT;AAAA,IACA,aAAqB;AACnB,wBAAkB;AAClB,aAAO;AAAA,IACT;AAAA,IACA,UAAU,YAA6B;AACrC,aAAO,eAAe;AAAA,IACxB;AAAA,EACF;AACF;;;ACGO,SAAS,qBAAqB,MAMtB;AACb,mBAAiB,OAAO,YAAY;AAClC,WAAO,IAAI,QAAQ,CAAC,YAAY;AAC9B,WAAK,OAAO,CAAC,WAAW;AAAA,QACtB,GAAG;AAAA,QACH,IAAI;AAAA,UACF,GAAG,MAAM;AAAA,UACT,SAAS;AAAA,UACT,eAAe;AAAA,YACb,MAAM,QAAQ;AAAA,YACd,SAAS,QAAQ;AAAA,YACjB,QAAQ,QAAQ,SAAS,SAAS,QAAQ,SAAS;AAAA,YACnD,cAAc,QAAQ,SAAS,UAAU,QAAQ,eAAe;AAAA,YAChE,QAAQ,QAAQ,SAAS,UAAU,QAAQ,SAAS;AAAA,UACtD;AAAA,QACF;AAAA,MACF,EAAE;AACF,sBAAgB,KAAK,OAAO;AAAA,IAC9B,CAAC;AAAA,EACH,CAAC;AAED,QAAM,kBAAwE,CAAC;AAC/E,QAAM,iBAAiB,qBAAqB;AAE5C,QAAM,gBAAgB,CAAC,UAAwC;AAC7D,UAAM,WAAW,gBAAgB,IAAI;AACrC,eAAW,KAAK;AAChB,SAAK,OAAO,CAAC,WAAW;AAAA,MACtB,GAAG;AAAA,MACH,IAAI,EAAE,GAAG,MAAM,IAAI,eAAe,KAAK;AAAA,IACzC,EAAE;AAAA,EACJ;AAEA,QAAM,WAAW,OAAOC,UAAiB;AACvC,UAAM,UAAU,MAAM,KAAK,UAAU,SAASA,KAAI;AAClD,UAAM,QAAQ,iBAAiB,OAAO;AACtC,UAAM,SAAS,MAAM,UAAUA,OAAM,YAAY,SAAS,KAAK,UAAU,OAAO;AAChF,UAAM,eAAe,MAAM,iBAAiBA,KAAI;AAChD,UAAM,YAAY,MAAM,cAAcA,OAAM,CAAC,GAAG,KAAK,SAAS,EAAE,QAAQ,iBAAiB,CAAC;AAC1F,UAAM,eAAe,oBAAoB,OAAO,SAAS,CAAC;AAE1D,SAAK,OAAO,CAAC,WAAW;AAAA,MACtB,GAAG;AAAA,MACH,kBAAkBA;AAAA,MAClB,aAAa;AAAA,MACb,WAAW;AAAA,MACX,OAAO;AAAA,MACP,cAAc,OAAO;AAAA,MACrB,YAAY;AAAA,MACZ;AAAA,MACA,QAAQ;AAAA,QACN,GAAG,MAAM;AAAA,QACT,QAAQ,EAAE,MAAM,cAAc,aAAa,GAAG,QAAQ,EAAE;AAAA,QACxD,WAAW;AAAA,QACX,WAAW,cAAc,aAAa;AAAA,MACxC;AAAA,MACA,SAAS;AAAA,QACP,GAAG,MAAM;AAAA,QACT,OAAO;AAAA,QACP,QAAQ;AAAA,QACR;AAAA,QACA;AAAA,MACF;AAAA,MACA,IAAI;AAAA,QACF,GAAG,MAAM;AAAA,QACT,WAAW;AAAA,QACX,eAAe;AAAA,MACjB;AAAA,IACF,EAAE;AAAA,EACJ;AAEA,QAAM,mBAAmB,YAAY;AACnC,UAAM,OAAO,MAAM,KAAK,UAAU,QAAQ;AAC1C,SAAK,OAAO,CAAC,WAAW,EAAE,GAAG,OAAO,UAAU,KAAK,EAAE;AAAA,EACvD;AAEA,QAAM,WAAW,YAAY;AAC3B,UAAM,QAAQ,KAAK,SAAS;AAC5B,QAAI,CAAC,MAAM,oBAAoB,CAAC,MAAM,OAAO;AAC3C;AAAA,IACF;AACA,UAAM,UAAU,iBAAiB,MAAM,SAAS;AAChD,UAAM,KAAK,UAAU,UAAU,MAAM,kBAAkB,OAAO;AAC9D,UAAM,UAAU,iBAAiB,MAAM,gBAAgB;AACvD,UAAM,SAAS,MAAM;AAAA,MACnB,MAAM;AAAA,MACN,YAAY;AAAA,MACZ,KAAK,UAAU;AAAA,MACf;AAAA,IACF;AACA,UAAM,eAAe,MAAM,eACvB,OAAO,QAAQ,KAAK,CAAC,WAAW,OAAO,OAAO,MAAM,cAAc,EAAE,KACpE,oBAAoB,OAAO,SAAS,MAAM,OAAO,OAAO,IAAI,IAC5D,oBAAoB,OAAO,SAAS,MAAM,OAAO,OAAO,IAAI;AAEhE,SAAK,OAAO,CAAC,OAAO;AAAA,MAClB,GAAG;AAAA,MACH,aAAa;AAAA,MACb,OAAO;AAAA,MACP,YAAY;AAAA,MACZ,cAAc,gBAAgB;AAAA,MAC9B,IAAI,EAAE,GAAG,EAAE,IAAI,eAAe,QAAQ;AAAA,IACxC,EAAE;AAAA,EACJ;AAEA,QAAM,UAAU,YAAY;AAC1B,UAAM,QAAQ,KAAK,SAAS;AAC5B,QAAI,CAAC,MAAM,oBAAoB,CAAC,MAAM,YAAY;AAChD;AAAA,IACF;AAEA,UAAM,SAAS,oBAAoB,MAAM,WAAW,SAAS,MAAM,OAAO,OAAO,IAAI;AACrF,QAAI,CAAC,QAAQ;AACX,WAAK,OAAO,CAAC,OAAO;AAAA,QAClB,GAAG;AAAA,QACH,SAAS,EAAE,GAAG,EAAE,SAAS,OAAO,iCAAiC;AAAA,QACjE,IAAI,EAAE,GAAG,EAAE,IAAI,WAAW,WAAW;AAAA,MACvC,EAAE;AACF;AAAA,IACF;AAEA,UAAM,MAAM,eAAe,UAAU;AAErC,SAAK,OAAO,CAAC,OAAO;AAAA,MAClB,GAAG;AAAA,MACH,cAAc;AAAA,MACd,SAAS,EAAE,GAAG,EAAE,SAAS,SAAS,MAAM,OAAO,MAAM,QAAQ,KAAK;AAAA,MAClE,gBAAgB;AAAA,QACd,WAAW;AAAA,QACX,YAAY;AAAA,QACZ,QAAQ,EAAE,MAAM,GAAG,QAAQ,EAAE;AAAA,QAC7B,WAAW;AAAA,MACb;AAAA,MACA,kBAAkB,EAAE,mBAAmB;AAAA,MACvC,IAAI,EAAE,GAAG,EAAE,IAAI,WAAW,YAAY,aAAa,SAAS;AAAA,IAC9D,EAAE;AAEF,UAAM,IAAI,QAAc,CAAC,YAAY,aAAa,OAAO,CAAC;AAE1D,UAAM,SAAS,MAAM,WAAW;AAAA,MAC9B,UAAU,MAAM;AAAA,MAChB,UAAU,OAAO;AAAA,MACjB,YAAY,KAAK,UAAU;AAAA,MAC3B,mBAAmB,CAAC,GAAG,MAAM,QAAQ,iBAAiB;AAAA,MACtD,WAAW,MAAM,QAAQ;AAAA,IAC3B,CAAC;AAED,QAAI,CAAC,eAAe,UAAU,GAAG,GAAG;AAClC;AAAA,IACF;AAEA,UAAM,YAAY,MAAM,cAAc,MAAM,kBAAkB;AAAA,MAC5D,GAAG,KAAK,SAAS,EAAE,QAAQ;AAAA,IAC7B,CAAC;AAED,QAAI,CAAC,eAAe,UAAU,GAAG,GAAG;AAClC;AAAA,IACF;AAEA,SAAK,OAAO,CAAC,OAAO;AAAA,MAClB,GAAG;AAAA,MACH,SAAS;AAAA,QACP,GAAG,EAAE;AAAA,QACL,SAAS;AAAA,QACT;AAAA,QACA,OAAO,OAAO,SAAS;AAAA,QACvB;AAAA,MACF;AAAA,IACF,EAAE;AAAA,EACJ;AAEA,QAAM,YAAY,CAAC,SAAoB;AACrC,SAAK,OAAO,CAAC,WAAW;AAAA,MACtB,GAAG;AAAA,MACH,IAAI,EAAE,GAAG,MAAM,IAAI,WAAW,KAAK;AAAA,IACrC,EAAE;AAAA,EACJ;AAEA,QAAM,UAAU,CAAC,YAAuB;AACtC,UAAM,QAAQ,KAAK,SAAS;AAE5B,YAAQ,SAAS;AAAA,MACf,KAAK;AACH,aAAK,QAAQ;AACb;AAAA,MACF,KAAK;AACH,YAAI,CAAC,MAAM,QAAQ,SAAS;AAC1B;AAAA,QACF;AACA,uBAAe,WAAW;AAC1B,aAAK,OAAO,CAAC,OAAO;AAAA,UAClB,GAAG;AAAA,UACH,SAAS;AAAA,YACP,GAAG,EAAE;AAAA,YACL,SAAS;AAAA,YACT,OAAO;AAAA,YACP,QAAQ;AAAA,UACV;AAAA,UACA,IAAI,EAAE,GAAG,EAAE,IAAI,eAAe,oBAAoB;AAAA,QACpD,EAAE;AACF;AAAA,MACF,KAAK;AACH,kBAAU,SAAS,MAAM,GAAG,SAAS,CAAC;AACtC;AAAA,MACF,KAAK;AACH,kBAAU,SAAS,MAAM,GAAG,SAAS,CAAC;AACtC;AAAA,MACF,KAAK;AACH,kBAAU,OAAO;AACjB;AAAA,MACF,KAAK;AACH,kBAAU,QAAQ;AAClB;AAAA,MACF,KAAK;AACH,kBAAU,UAAU;AACpB;AAAA,MACF,KAAK;AACH,aAAK,OAAO,CAAC,OAAO;AAAA,UAClB,GAAG;AAAA,UACH,IAAI,EAAE,GAAG,EAAE,IAAI,gBAAgB,CAAC,EAAE,GAAG,eAAe;AAAA,QACtD,EAAE;AACF;AAAA,MACF,KAAK;AACH,aAAK,SAAS;AACd;AAAA,MACF,KAAK;AACH,aAAK,OAAO,CAAC,OAAO;AAAA,UAClB,GAAG;AAAA,UACH,IAAI;AAAA,YACF,GAAG,EAAE;AAAA,YACL,SAAS,EAAE,GAAG,YAAY,QAAQ,SAAS;AAAA,YAC3C,kBAAkB,KAAK;AAAA,cACrB;AAAA,cACA,EAAE,QAAQ,aAAa,QAAQ,EAAE,QAAQ,kBAAkB,KAAK,GAAG,CAAC,KAAK;AAAA,YAC3E;AAAA,UACF;AAAA,QACF,EAAE;AACF;AAAA,MACF,KAAK;AACH,YAAI,MAAM,GAAG,YAAY,OAAO;AAC9B,eAAK,OAAO,CAAC,OAAO;AAAA,YAClB,GAAG;AAAA,YACH,IAAI;AAAA,cACF,GAAG,EAAE;AAAA,cACL,kBAAkB,KAAK;AAAA,gBACrB,EAAE,QAAQ,aAAa;AAAA,gBACvB,EAAE,GAAG,mBAAmB;AAAA,cAC1B;AAAA,YACF;AAAA,UACF,EAAE;AAAA,QACJ;AACA;AAAA,MACF,KAAK;AACH,YAAI,MAAM,GAAG,YAAY,OAAO;AAC9B,eAAK,OAAO,CAAC,OAAO;AAAA,YAClB,GAAG;AAAA,YACH,IAAI;AAAA,cACF,GAAG,EAAE;AAAA,cACL,kBAAkB,KAAK,IAAI,GAAG,EAAE,GAAG,mBAAmB,CAAC;AAAA,YACzD;AAAA,UACF,EAAE;AAAA,QACJ;AACA;AAAA,MACF,KAAK,aAAa;AAChB,cAAM,UAAU,MAAM,QAAQ,aAAa,MAAM,GAAG,gBAAgB;AACpE,cAAM,YAAY;AAChB,gBAAM,oBAAoB,UAAU,CAAC,OAAO,IAAI,CAAC;AACjD,gBAAM,YAAY,MAAM,mBACpB,MAAM,cAAc,MAAM,kBAAkB,iBAAiB,IAC7D,CAAC;AACL,eAAK,OAAO,CAAC,OAAO;AAAA,YAClB,GAAG;AAAA,YACH,SAAS,EAAE,GAAG,EAAE,SAAS,mBAAmB,UAAU;AAAA,YACtD,IAAI,EAAE,GAAG,EAAE,IAAI,SAAS,OAAO;AAAA,UACjC,EAAE;AAAA,QACJ,GAAG;AACH;AAAA,MACF;AAAA,MACA,KAAK;AACH,aAAK,OAAO,CAAC,OAAO;AAAA,UAClB,GAAG;AAAA,UACH,IAAI;AAAA,YACF,GAAG,EAAE;AAAA,YACL,SAAS;AAAA,YACT,gBAAgB,EAAE,GAAG,EAAE,GAAG,gBAAgB,MAAM,MAAM;AAAA,YACtD,eAAe;AAAA,UACjB;AAAA,QACF,EAAE;AACF,sBAAc,MAAS;AACvB;AAAA,MACF,KAAK;AACH,aAAK,KAAK;AACV;AAAA,MACF,KAAK;AACH,aAAK,OAAO,CAAC,OAAO;AAAA,UAClB,GAAG;AAAA,UACH,IAAI;AAAA,YACF,GAAG,EAAE;AAAA,YACL,SAAS;AAAA,YACT,gBAAgB,EAAE,MAAM,MAAM,OAAO,IAAI,eAAe,EAAE;AAAA,UAC5D;AAAA,QACF,EAAE;AACF;AAAA,MACF,KAAK,iBAAiB;AACpB,cAAM,QAAQ,aAAa,MAAM,QAAQ,EAAE,OAAO,CAAC,SAAS,KAAK,SAAS,MAAM;AAChF,cAAM,QAAQ,MAAM,CAAC,GAAG;AACxB,YAAI,OAAO;AACT,eAAK,SAAS,KAAK;AAAA,QACrB;AACA;AAAA,MACF;AAAA,MACA,KAAK;AACH,aAAK,OAAO,CAAC,OAAO;AAAA,UAClB,GAAG;AAAA,UACH,IAAI,EAAE,GAAG,EAAE,IAAI,SAAS,EAAE,GAAG,YAAY,SAAS,SAAS,OAAO;AAAA,QACpE,EAAE;AACF;AAAA,MACF,KAAK;AACH,aAAK,OAAO,CAAC,OAAO;AAAA,UAClB,GAAG;AAAA,UACH,IAAI;AAAA,YACF,GAAG,EAAE;AAAA,YACL,SAAS,EAAE,GAAG,YAAY,gBAAgB,SAAS;AAAA,UACrD;AAAA,QACF,EAAE;AACF;AAAA,MACF,KAAK;AACH,aAAK,OAAO,CAAC,OAAO;AAAA,UAClB,GAAG;AAAA,UACH,IAAI;AAAA,YACF,GAAG,EAAE;AAAA,YACL,UAAU,EAAE,GAAG,WAAW,OAAO,EAAE,GAAG;AAAA,UACxC;AAAA,QACF,EAAE;AACF;AAAA,MACF,KAAK;AACH,aAAK,OAAO,CAAC,OAAO;AAAA,UAClB,GAAG;AAAA,UACH,IAAI,EAAE,GAAG,EAAE,IAAI,aAAa,gBAAgB,EAAE,GAAG,WAAW,EAAE;AAAA,QAChE,EAAE;AACF;AAAA,MACF,KAAK;AACH,aAAK,OAAO,CAAC,OAAO;AAAA,UAClB,GAAG;AAAA,UACH,IAAI,EAAE,GAAG,EAAE,IAAI,aAAa,gBAAgB,EAAE,GAAG,WAAW,EAAE;AAAA,QAChE,EAAE;AACF;AAAA,MACF,KAAK;AACH,aAAK,OAAO,CAAC,OAAO;AAAA,UAClB,GAAG;AAAA,UACH,IAAI,EAAE,GAAG,EAAE,IAAI,eAAe,yCAAyC;AAAA,QACzE,EAAE;AACF;AAAA,MACF,KAAK;AACH,aAAK,OAAO,CAAC,OAAO;AAAA,UAClB,GAAG;AAAA,UACH,IAAI,EAAE,GAAG,EAAE,IAAI,WAAW,YAAY,aAAa,SAAS;AAAA,QAC9D,EAAE;AACF;AAAA,MACF,KAAK;AACH;AAAA,MACF;AACE;AAAA,IACJ;AAAA,EACF;AAEA,QAAM,UAAsE;AAAA,IAC1E,IAAI,QAAQ;AACV,aAAO,KAAK,SAAS;AAAA,IACvB;AAAA,IACA,QAAQ,KAAK;AAAA,IACb;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,mBAAmB,KAAK;AAAA,IACxB,MAAM,KAAK;AAAA,IACX;AAAA,EACF;AAEA,SAAO;AACT;;;AC5ZA,OAAOC,WAAU;AAEjB;AAAA,EACE;AAAA,EACA;AAAA,OAIK;;;ACNP,IAAM,WAAW,oBAAI,IAAI;AAAA,EACvB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAEM,SAAS,iBACd,MACA,UACkC;AAClC,QAAM,SAAkC,CAAC;AACzC,QAAM,cAAc,wEAAwE;AAAA,IAC1F;AAAA,EACF;AACA,MAAI,aAAa;AACf,UAAM,SAAS,YAAY,CAAC,KAAK;AACjC,WAAO,KAAK,EAAE,MAAM,QAAQ,MAAM,UAAU,CAAC;AAC7C,UAAM,OAAO,KAAK,MAAM,YAAY,CAAC,EAAE,MAAM;AAC7C,QAAI,KAAK,SAAS,GAAG;AACnB,aAAO,KAAK,EAAE,MAAM,MAAM,MAAM,SAAS,CAAC;AAAA,IAC5C;AACA,WAAO;AAAA,EACT;AAEA,MAAI,SAAS,KAAK,IAAI,GAAG;AACvB,WAAO,CAAC,EAAE,MAAM,MAAM,MAAM,UAAU,CAAC;AAAA,EACzC;AACA,MAAI,YAAY,KAAK,IAAI,GAAG;AAC1B,WAAO,CAAC,EAAE,MAAM,MAAM,MAAM,UAAU,CAAC;AAAA,EACzC;AACA,MAAI,SAAS,KAAK,IAAI,GAAG;AACvB,WAAO,CAAC,EAAE,MAAM,MAAM,MAAM,OAAO,CAAC;AAAA,EACtC;AAEA,QAAM,cAAc,oDAAoD,KAAK,IAAI;AACjF,MAAI,aAAa;AACf,WAAO,KAAK,EAAE,MAAM,YAAY,CAAC,KAAK,IAAI,MAAM,WAAW,CAAC;AAC5D,WAAO,KAAK,EAAE,MAAM,YAAY,CAAC,KAAK,IAAI,MAAM,WAAW,CAAC;AAC5D,WAAO,KAAK,EAAE,MAAM,YAAY,CAAC,KAAK,IAAI,MAAM,SAAS,CAAC;AAC1D,WAAO;AAAA,EACT;AAEA,QAAM,QAAQ,KAAK,MAAM,QAAQ;AACjC,aAAW,QAAQ,OAAO;AACxB,QAAI,SAAS,IAAI,IAAI,GAAG;AACtB,aAAO,KAAK,EAAE,MAAM,MAAM,MAAM,UAAU,CAAC;AAAA,IAC7C,WAAW,KAAK,SAAS,GAAG;AAC1B,aAAO,KAAK,EAAE,MAAM,MAAM,MAAM,QAAQ,CAAC;AAAA,IAC3C;AAAA,EACF;AACA,SAAO,OAAO,SAAS,IAAI,SAAS,CAAC,EAAE,MAAM,MAAM,MAAM,QAAQ,CAAC;AACpE;AAEO,SAAS,qBAAqB,MAAsB;AACzD,QAAM,UAAU,KAAK,KAAK;AAC1B,MAAI,CAAC,SAAS;AACZ,WAAO;AAAA,EACT;AACA,MAAI;AACF,WAAO,KAAK,UAAU,KAAK,MAAM,OAAO,GAAG,MAAM,CAAC;AAAA,EACpD,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAmBO,SAAS,WAAW,YAAqE;AAC9F,MAAI,CAAC,YAAY;AACf,WAAO;AAAA,EACT;AACA,MAAI,cAAc,OAAO,aAAa,KAAK;AACzC,WAAO;AAAA,EACT;AACA,MAAI,cAAc,OAAO,aAAa,KAAK;AACzC,WAAO;AAAA,EACT;AACA,MAAI,cAAc,KAAK;AACrB,WAAO;AAAA,EACT;AACA,SAAO;AACT;;;ADnEA,SAAS,UAAU,SAAmE;AACpF,SAAO,UAAU,EAAE,IAAI,IAAI,KAAK,KAAK,GAAG,GAAG,MAAM,KAAK,IAAI,EAAE,IAAI,IAAI,KAAK,KAAK,GAAG,EAAE;AACrF;AAEA,SAAS,eAAe,OAAiB,MAAuB;AAC9D,SAAO,GAAG;AAAA,IACR;AAAA,MACE,IAAI;AAAA,MACJ,OAAO,MAAM,GAAG,cAAc,UAAU,iBAAY;AAAA,MACpD,OAAO,UAAU,MAAM,GAAG,cAAc,OAAO;AAAA,IACjD;AAAA,IACA;AAAA,MACE,GAAG,KAAK;AAAA,QACN,IAAI;AAAA,QACJ,MAAM,MAAM;AAAA,QACZ,UAAU,MAAM;AAAA,QAChB,UAAU,MAAM,oBAAoB;AAAA,QACpC,QAAQ,CAAC,SAA4B,KAAK;AAAA,QAC1C,aAAa,CAAC,SACZ,KAAK,SAAS,cAAe,KAAK,WAA+C;AAAA,QACnF,UAAU,CAAC,MAAM,aAAa,KAAK,aAAa,MAAM,QAAQ;AAAA,QAC9D,UAAU,CAAC,SAAS,KAAK,aAAa,IAAI;AAAA,QAC1C,SAAS,CAAC,SAAS,KAAK,YAAY,IAAI;AAAA,QACxC,YAAY,CAAC,MAAM,QAAQ,cACzB,GAAG,IAAI,EAAE,KAAK,EAAE,GAAG;AAAA,UACjB,GAAG,KAAK,UAAU,WAAW,UAAK,KAAK,IAAI,KAAK,KAAK,MAAM;AAAA,YACzD,OAAO,UAAU,WACb,EAAE,IAAI,IAAI,KAAK,KAAK,GAAG,GAAG,MAAM,KAAK,IACrC,MAAM,SAAS,KAAK,SAAS,MAAM,mBACjC,EAAE,IAAI,IAAI,KAAK,KAAK,EAAE,EAAE,IACxB;AAAA,UACR,CAAC;AAAA,QACH,CAAC;AAAA,QACH,MAAM;AAAA,QACN,WAAW;AAAA,MACb,CAAC;AAAA,IACH;AAAA,EACF;AACF;AAEA,SAAS,aAAa,OAAiB,MAAgB,UAA0B;AAC/E,QAAM,eACJ,MAAM,iBACL,MAAM,aACH,oBAAoB,MAAM,WAAW,SAAS,MAAM,OAAO,OAAO,IAAI,IACtE;AAEN,QAAM,aAAa;AAAA,IACjB,MAAM,GAAG,cAAc,WAAW,kBAAa;AAAA,IAC/C,MAAM,mBAAmB,MAAM,iBAAiB,MAAM,GAAG,EAAE,IAAI,IAAI;AAAA,IACnE,MAAM,QAAQ,YAAO;AAAA,IACrB,eAAe,MAAM,aAAa,UAAU,GAAG,IAAI,aAAa,IAAI,KAAK;AAAA,EAC3E;AAEA,QAAM,cAAc,MAAM,aACtB;AAAA,IACE,MAAM,WAAW;AAAA,IACjB,cAAc,MAAM;AAAA,IACpB,MAAM;AAAA,EACR,IACA,CAAC;AAEL,SAAO,GAAG;AAAA,IACR;AAAA,MACE,IAAI;AAAA,MACJ,OAAO,WAAW,KAAK,EAAE;AAAA,MACzB,OAAO,UAAU,MAAM,GAAG,cAAc,QAAQ;AAAA,IAClD;AAAA,IACA;AAAA,MACE,GAAG,WAAW;AAAA,QACZ,IAAI;AAAA,QACJ,OAAO,MAAM;AAAA,QACb,QAAQ,MAAM,OAAO;AAAA,QACrB,WAAW,MAAM,OAAO;AAAA,QACxB,WAAW,MAAM,OAAO;AAAA,QACxB,YAAY,MAAM,OAAO;AAAA,QACzB;AAAA,QACA,aAAa;AAAA,QACb,gBAAgB;AAAA,QAChB,cAAc;AAAA,QACd;AAAA,QACA,UAAU,CAAC,OAAO,WAAW,KAAK,eAAe,OAAO,MAAM;AAAA,QAC9D,mBAAmB,KAAK;AAAA,QACxB,UAAU,KAAK;AAAA,QACf,MAAM;AAAA,QACN,WAAW;AAAA,MACb,CAAC;AAAA,IACH;AAAA,EACF;AACF;AAEA,SAAS,oBAAoB,OAAiB,MAAgB;AAC5D,SAAO;AAAA,IACL,WAAW,MAAM,eAAe;AAAA,IAChC,YAAY,MAAM,eAAe;AAAA,IACjC,UAAU,KAAK;AAAA,EACjB;AACF;AAEA,SAAS,oBAAoB,OAAiB,MAAgB;AAC5D,SAAO;AAAA,IACL,QAAQ,MAAM,eAAe;AAAA,IAC7B,WAAW,MAAM,eAAe;AAAA,IAChC,UAAU,CAAC,QAA2B,WAA2B;AAC/D,WAAK,iBAAiB,MAAM;AAAA,IAC9B;AAAA,IACA,mBAAmB,KAAK;AAAA,EAC1B;AACF;AAEA,SAAS,mBAAmB,OAAiB,MAAuB;AAClE,QAAM,SAAS,MAAM,QAAQ;AAC7B,QAAM,SAAS,oBAAoB,OAAO,IAAI;AAC9C,QAAM,SAAS,oBAAoB,OAAO,IAAI;AAC9C,QAAM,MAAM,MAAM;AAElB,MAAI,MAAM,QAAQ,SAAS;AACzB,WAAO,GAAG,OAAO,GAAG,QAAQ,EAAE,OAAO,6BAAwB,CAAC,CAAC;AAAA,EACjE;AACA,MAAI,MAAM,QAAQ,SAAS,CAAC,QAAQ;AAClC,WAAO,GAAG,aAAa,MAAM,QAAQ,KAAK;AAAA,EAC5C;AACA,MAAI,CAAC,QAAQ;AACX,WAAO,GAAG,MAAM,eAAe;AAAA,MAC7B,aAAa;AAAA,IACf,CAAC;AAAA,EACH;AAEA,UAAQ,MAAM,GAAG,aAAa;AAAA,IAC5B,KAAK;AACH,aAAO,GAAG,MAAM;AAAA,QACd,IAAI,oBAAoB,GAAG;AAAA,QAC3B,SAAS;AAAA,UACP,EAAE,KAAK,QAAQ,QAAQ,UAAU,OAAO,GAAG;AAAA,UAC3C,EAAE,KAAK,SAAS,QAAQ,SAAS,MAAM,EAAE;AAAA,QAC3C;AAAA,QACA,MAAM,CAAC,GAAG,OAAO,OAAO;AAAA,QACxB,WAAW,CAAC,QAAQ,IAAI;AAAA,QACxB,MAAM;AAAA,QACN,WAAW;AAAA,MACb,CAAC;AAAA,IACH,KAAK;AACH,aAAO,GAAG,WAAW;AAAA,QACnB,IAAI,gBAAgB,GAAG;AAAA,QACvB,OAAO,OAAO,OAAO,OAAO,KAAK,MAAM,IAAI,IAAI,CAAC,EAAE;AAAA,QAClD,UAAU;AAAA,QACV,aAAa;AAAA,QACb,gBAAgB;AAAA,QAChB,GAAG;AAAA,QACH,GAAG;AAAA,QACH,MAAM;AAAA,MACR,CAAC;AAAA,IACH,KAAK;AACH,aAAO,GAAG,WAAW;AAAA,QACnB,IAAI,iBAAiB,GAAG;AAAA,QACxB,OAAO,CAAC,KAAK,UAAU,MAAM,QAAQ,WAAW,MAAM,CAAC,CAAC;AAAA,QACxD,UAAU;AAAA,QACV,gBAAgB;AAAA,QAChB,GAAG;AAAA,QACH,GAAG;AAAA,QACH,MAAM;AAAA,MACR,CAAC;AAAA,IACH,KAAK;AACH,aAAO,GAAG,OAAO,EAAE,KAAK,GAAG,MAAM,EAAE,GAAG;AAAA,QACpC,GAAG,OAAO,YAAY;AAAA,UAAI,CAAC,SACzB,GAAG,KAAK,GAAG,KAAK,WAAW,YAAY,WAAM,QAAG,IAAI,KAAK,OAAO,IAAI;AAAA,YAClE,OAAO;AAAA,cACL,IACE,KAAK,WAAW,YACZ,IAAI,KAAK,KAAK,GAAG,IACjB,KAAK,WAAW,YACd,IAAI,KAAK,KAAK,GAAG,IACjB,IAAI,KAAK,KAAK,GAAG;AAAA,YAC3B;AAAA,UACF,CAAC;AAAA,QACH;AAAA,MACF,CAAC;AAAA,IACH,KAAK;AAAA,IACL;AACE,aAAO,GAAG,WAAW;AAAA,QACnB,IAAI,mBAAmB,GAAG;AAAA,QAC1B,OAAO,qBAAqB,OAAO,cAAc,OAAO,IAAI,EAAE,MAAM,IAAI;AAAA,QACxE,UAAU;AAAA,QACV,aAAa;AAAA,QACb,gBAAgB;AAAA,QAChB,aAAa,MAAM,OAAO,eAAe;AAAA,QACzC,GAAG;AAAA,QACH,GAAG;AAAA,QACH,MAAM;AAAA,MACR,CAAC;AAAA,EACL;AACF;AAEA,SAAS,eAAe,OAAiB,MAAuB;AAC9D,QAAM,SAAS,MAAM,QAAQ;AAC7B,QAAM,aACJ,MAAM,QAAQ,WAAW,CAAC,SACtB,OACA,GAAG,OAAO,YAAY,MAAM,IAAI,OAAO,cAAc,GAAG,IAAI,OAAO,iBAAiB,EAAE,SAAM,OAAO,cAAc,GAAG;AAE1H,QAAM,WAAW;AAAA,IACf,EAAE,KAAK,UAAU,OAAO,SAAS;AAAA,IACjC,EAAE,KAAK,OAAO,OAAO,MAAM;AAAA,IAC3B,EAAE,KAAK,WAAW,OAAO,UAAU;AAAA,IACnC,EAAE,KAAK,aAAa,OAAO,OAAO;AAAA,IAClC,EAAE,KAAK,SAAS,OAAO,QAAQ;AAAA,EACjC;AAEA,SAAO,GAAG;AAAA,IACR;AAAA,MACE,IAAI;AAAA,MACJ,OAAO,MAAM,GAAG,cAAc,aAAa,oBAAe;AAAA,MAC1D,OAAO,UAAU,MAAM,GAAG,cAAc,UAAU;AAAA,IACpD;AAAA,IACA;AAAA,MACE,GAAG,IAAI,EAAE,KAAK,EAAE,GAAG;AAAA,QACjB,MAAM,QAAQ,UACV,GAAG,QAAQ,EAAE,OAAO,wBAAmB,CAAC,IACxC,GAAG,KAAK,cAAc,SAAS;AAAA,UAC7B,OAAO,EAAE,IAAI,IAAI,GAAG,YAAY,QAAQ,UAAU,CAAC,GAAG,MAAM,KAAK;AAAA,QACnE,CAAC;AAAA,QACL,QAAQ,SAAS,CAAC,MAAM,QAAQ,UAC5B,GAAG,MAAM,OAAO,OAAO,EAAE,SAAS,QAAQ,CAAC,IAC3C;AAAA,MACN,CAAC;AAAA,MACD,GAAG,IAAI,EAAE,KAAK,EAAE,GAAG;AAAA,QACjB,GAAG,SAAS;AAAA,UAAI,CAAC,QACf,GAAG,OAAO;AAAA,YACR,IAAI,OAAO,IAAI,GAAG;AAAA,YAClB,OAAO,IAAI;AAAA,YACX,UAAU,MAAM,QAAQ;AAAA,YACxB,SAAS,MAAM,KAAK,cAAc,IAAI,GAAG;AAAA,UAC3C,CAAC;AAAA,QACH;AAAA,MACF,CAAC;AAAA,MACD,mBAAmB,OAAO,IAAI;AAAA,IAChC;AAAA,EACF;AACF;AAEA,SAAS,YAAY,MAAoD;AACvE,QAAM,OAAO,WAAW,IAAI;AAC5B,UAAQ,MAAM;AAAA,IACZ,KAAK;AACH,aAAO,CAAC,KAAK,KAAK,GAAG;AAAA,IACvB,KAAK;AACH,aAAO,CAAC,KAAK,KAAK,GAAG;AAAA,IACvB,KAAK;AACH,aAAO,CAAC,KAAK,KAAK,GAAG;AAAA,IACvB;AACE,aAAO,CAAC,KAAK,KAAK,GAAG;AAAA,EACzB;AACF;AAEA,SAAS,iBAAiB,OAAiB,MAAuB;AAChE,QAAM,aAAa,kBAAkB,MAAM,GAAG,aAAa;AAC3D,QAAM,OAAO,MAAM,GAAG;AAEtB,MAAI,MAAM;AACR,QAAI,SAAS,QAAS,QAAO,eAAe,OAAO,IAAI;AACvD,QAAI,SAAS,SAAU,QAAO,aAAa,OAAO,MAAM,KAAK;AAC7D,WAAO,eAAe,OAAO,IAAI;AAAA,EACnC;AAEA,MAAI,eAAe,WAAW;AAC5B,UAAM,OACJ,MAAM,GAAG,cAAc,UACnB,eAAe,OAAO,IAAI,IAC1B,MAAM,GAAG,cAAc,aACrB,eAAe,OAAO,IAAI,IAC1B,aAAa,OAAO,MAAM,KAAK;AACvC,WAAO;AAAA,EACT;AAEA,MAAI,eAAe,mBAAmB;AACpC,WAAO,GAAG,IAAI,EAAE,KAAK,GAAG,MAAM,EAAE,GAAG;AAAA,MACjC,MAAM,GAAG,iBACL,GAAG,IAAI,EAAE,OAAO,IAAI,MAAM,EAAE,GAAG,CAAC,eAAe,OAAO,IAAI,CAAC,CAAC,IAC5D;AAAA,MACJ,GAAG,OAAO,EAAE,KAAK,GAAG,MAAM,EAAE,GAAG;AAAA,QAC7B,aAAa,OAAO,MAAM,KAAK;AAAA,QAC/B,eAAe,OAAO,IAAI;AAAA,MAC5B,CAAC;AAAA,IACH,CAAC;AAAA,EACH;AAEA,SAAO,GAAG,OAAO,EAAE,KAAK,GAAG,MAAM,EAAE,GAAG;AAAA,IACpC,GAAG;AAAA,MACD;AAAA,QACE,IAAI;AAAA,QACJ,WAAW;AAAA,QACX,OAAO,CAAC,GAAG,MAAM,GAAG,UAAU;AAAA,QAC9B,UAAU,CAAC,IAAI,IAAI,EAAE;AAAA,QACrB,UAAU,KAAK;AAAA,MACjB;AAAA,MACA;AAAA,QACE,eAAe,OAAO,IAAI;AAAA,QAC1B,aAAa,OAAO,MAAM,KAAK;AAAA,QAC/B,eAAe,OAAO,IAAI;AAAA,MAC5B;AAAA,IACF;AAAA,EACF,CAAC;AACH;AAEA,SAAS,aAAa,OAAwB;AAC5C,QAAM,MACJ,MAAM,QAAQ,kBAAkB,SAAS,IACrC,MAAM,QAAQ,kBAAkB,KAAK,GAAG,IACxC;AACN,QAAM,UAAUC,MAAK,SAAS,MAAM,aAAa;AACjD,QAAM,SAAS,MAAM,GAAG,aAAa;AACrC,QAAM,WAAW,MAAM,mBACnBA,MAAK,SAAS,MAAM,gBAAgB,IACpC;AAEJ,QAAM,QAAQ,YAAY;AAAA,IACxB,WAAW,MAAM,GAAG;AAAA,IACpB,SAAS,MAAM,GAAG;AAAA,IAClB,eAAe,MAAM,GAAG;AAAA,IACxB,SAAS,MAAM,QAAQ;AAAA,EACzB,CAAC;AAED,SAAO,GAAG,UAAU;AAAA,IAClB,IAAI;AAAA,IACJ,MAAM;AAAA,MACJ,GAAG,KAAK,SAAS,EAAE,OAAO,EAAE,IAAI,IAAI,KAAK,KAAK,GAAG,GAAG,MAAM,KAAK,EAAE,CAAC;AAAA,MAClE,GAAG,KAAK,WAAM,MAAM,IAAI,EAAE,OAAO,EAAE,IAAI,IAAI,KAAK,KAAK,GAAG,EAAE,EAAE,CAAC;AAAA,MAC7D,WAAW,GAAG,KAAK,MAAM,QAAQ,EAAE,IAAI;AAAA,MACvC,MAAM,QAAQ,GAAG,KAAK,WAAM,EAAE,OAAO,EAAE,IAAI,IAAI,KAAK,KAAK,EAAE,EAAE,EAAE,CAAC,IAAI;AAAA,MACpE,GAAG,KAAK,WAAW,GAAG,IAAI,EAAE,OAAO,EAAE,IAAI,IAAI,KAAK,KAAK,GAAG,EAAE,EAAE,CAAC;AAAA,MAC/D,MAAM,GAAG,gBAAgB,GAAG,KAAK,MAAM,MAAM,GAAG,aAAa,EAAE,IAAI;AAAA,IACrE,EAAE,OAAO,OAAO;AAAA,IAChB,OAAO,CAAC,GAAG,KAAK,KAAK,CAAC;AAAA,EACxB,CAAC;AACH;AAEA,SAAS,qBAAqB,OAAiB,MAAuB;AACpE,UAAQ,MAAM,GAAG,SAAS;AAAA,IACxB,KAAK;AACH,aAAO,GAAG,MAAM;AAAA,QACd,IAAI;AAAA,QACJ,OAAO;AAAA,QACP,SAAS,GAAG,OAAO,EAAE,KAAK,EAAE,GAAG;AAAA,UAC7B,GAAG,KAAK,mDAAmD;AAAA,UAC3D,GAAG,KAAK,UAAU;AAAA,YAChB,OACE,MAAM,GAAG,qBAAqB,IAC1B,EAAE,IAAI,IAAI,KAAK,KAAK,GAAG,GAAG,MAAM,KAAK,IACrC;AAAA,UACR,CAAC;AAAA,UACD,GAAG,MAAM,QAAQ,aAAa;AAAA,YAAI,CAAC,KAAK,UACtC,GAAG,KAAK,KAAK;AAAA,cACX,OACE,QAAQ,MAAM,MAAM,GAAG,mBACnB,EAAE,IAAI,IAAI,KAAK,KAAK,GAAG,GAAG,MAAM,KAAK,IACrC;AAAA,YACR,CAAC;AAAA,UACH;AAAA,QACF,CAAC;AAAA,QACD,SAAS,KAAK;AAAA,QACd,OAAO;AAAA,QACP,QAAQ;AAAA,MACV,CAAC;AAAA,IACH,KAAK;AACH,aAAO,GAAG,MAAM;AAAA,QACd,IAAI;AAAA,QACJ,OAAO;AAAA,QACP,SAAS,GAAG,OAAO,EAAE,KAAK,EAAE,GAAG,gBAAgB,IAAI,CAAC,SAAS,GAAG,KAAK,IAAI,CAAC,CAAC;AAAA,QAC3E,SAAS,KAAK;AAAA,QACd,OAAO;AAAA,QACP,QAAQ;AAAA,MACV,CAAC;AAAA,IACH,KAAK,eAAe;AAClB,YAAM,WAAW,KAAK,IAAI,GAAG,KAAK,IAAI,IAAI,MAAM,GAAG,iBAAiB,CAAC,CAAC;AACtE,YAAM,QAAQ;AAAA,QACZ,MAAM,SAAS;AAAA,QACf;AAAA,MACF;AACA,aAAO,GAAG,MAAM;AAAA,QACd,IAAI;AAAA,QACJ,OAAO;AAAA,QACP,SAAS,GAAG,OAAO,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,SAAS,GAAG,KAAK,IAAI,CAAC,CAAC;AAAA,QACjE,SAAS,KAAK;AAAA,QACd,OAAO;AAAA,QACP,QAAQ,KAAK,IAAI,WAAW,GAAG,EAAE;AAAA,MACnC,CAAC;AAAA,IACH;AAAA,IACA,KAAK;AACH,aAAO,GAAG;AAAA,QACR,GAAG,eAAe;AAAA,UAChB,IAAI;AAAA,UACJ,MAAM;AAAA,UACN,OAAO,MAAM,GAAG,eAAe;AAAA,UAC/B,eAAe,MAAM,GAAG,eAAe;AAAA,UACvC,SAAS;AAAA,YACP;AAAA,cACE,IAAI;AAAA,cACJ,MAAM;AAAA,cACN,UAAU,CAAC,UACT,cAAc;AAAA,gBAAO,CAAC,SACpB,KAAK,MAAM,YAAY,EAAE,SAAS,MAAM,YAAY,CAAC;AAAA,cACvD,EAAE,IAAI,CAAC,UAAU;AAAA,gBACf,IAAI,KAAK;AAAA,gBACT,OAAO,KAAK;AAAA,gBACZ,aAAa,KAAK;AAAA,gBAClB,UAAU,KAAK;AAAA,gBACf,UAAU;AAAA,cACZ,EAAE;AAAA,YACN;AAAA,UACF;AAAA,UACA,UAAU,KAAK;AAAA,UACf,UAAU,CAAC,SAAS,KAAK,uBAAuB,KAAK,EAAE;AAAA,UACvD,SAAS,KAAK;AAAA,UACd,mBAAmB,KAAK;AAAA,UACxB,OAAO;AAAA,QACT,CAAC;AAAA,MACH;AAAA,IACF;AACE,aAAO,GAAG,KAAK,EAAE;AAAA,EACrB;AACF;AAEO,SAAS,UAAU,OAAiB,MAAuB;AAChE,QAAM,OAAO,GAAG,OAAO,EAAE,KAAK,GAAG,MAAM,EAAE,GAAG;AAAA,IAC1C,iBAAiB,OAAO,IAAI;AAAA,IAC5B,aAAa,KAAK;AAAA,EACpB,CAAC;AAED,MAAI,MAAM,GAAG,YAAY,QAAQ;AAC/B,WAAO;AAAA,EACT;AAEA,SAAO,GAAG,OAAO;AAAA,IACf;AAAA,IACA,GAAG,MAAM;AAAA,MACP,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,UAAU;AAAA,MACV,eAAe;AAAA,MACf,SAAS,KAAK;AAAA,MACd,SAAS,qBAAqB,OAAO,IAAI;AAAA,IAC3C,CAAC;AAAA,EACH,CAAC;AACH;AAEO,SAAS,YAAY,MAAyB;AACnD,UAAQ,MAAM;AAAA,IACZ,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,EACX;AACF;;;AE5eA,OAAO,eAAe;AAEtB,eAAsB,gBAAgB,MAAgC;AACpE,MAAI;AACF,UAAM,UAAU,MAAM,IAAI;AAC1B,WAAO;AAAA,EACT,QAAQ;AACN,QAAI,QAAQ,OAAO,MAAM,aAAa,OAAO,KAAK,MAAM,MAAM,EAAE,SAAS,QAAQ,CAAC,MAAM,GAAG;AACzF,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT;AACF;AAEO,SAAS,qBAA2B;AACzC,MAAI,QAAQ,MAAM,OAAO;AACvB,QAAI;AACF,cAAQ,MAAM,aAAa,IAAI;AAAA,IACjC,QAAQ;AAAA,IAER;AAAA,EACF;AACF;;;ACtBA,SAAS,gBAAgB;AACzB,SAAS,iBAAiB;AAE1B,IAAM,gBAAgB,UAAU,QAAQ;AAExC,eAAsB,aAAa,MAAsC;AACvE,MAAI;AACF,UAAM,EAAE,OAAO,IAAI,MAAM;AAAA,MACvB;AAAA,MACA,CAAC,MAAM,MAAM,aAAa,gBAAgB,MAAM;AAAA,MAChD,EAAE,SAAS,IAAK;AAAA,IAClB;AACA,UAAM,SAAS,OAAO,KAAK;AAC3B,WAAO,OAAO,SAAS,IAAI,SAAS;AAAA,EACtC,QAAQ;AACN,WAAO;AAAA,EACT;AACF;;;AfAA,eAAe,OAAsB;AACnC,sBAAoB;AAEpB,QAAM,gBAAgBC,MAAK,QAAQC,SAAQ,KAAK,CAAC,KAAKA,SAAQ,IAAI,CAAC;AACnE,QAAM,YAAY,IAAI,UAAU,aAAa;AAC7C,QAAM,OAAO,MAAM,UAAU,KAAK;AAElC,MAAI,eAAe,mBAAmB,aAAa;AACnD,iBAAe;AAAA,IACb,GAAG;AAAA,IACH,UAAU;AAAA,IACV,eAAe,KAAK,OAAO,CAAC,MAAM,EAAE,SAAS,WAAW,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI;AAAA,IAC3E,IAAI;AAAA,MACF,GAAG,aAAa;AAAA,MAChB,WAAW,MAAM,aAAa,aAAa;AAAA,IAC7C;AAAA,EACF;AAEA,MAAI,MAAgC;AACpC,MAAI,MAAyB;AAE7B,QAAM,mBAAmB,YAAY;AACnC,UAAM,SAAS,MAAM,aAAa,aAAa;AAC/C,SAAK,OAAO,CAAC,UAAU;AAAA,MACrB,GAAG;AAAA,MACH,IAAI,EAAE,GAAG,KAAK,IAAI,WAAW,OAAO;AAAA,IACtC,EAAE;AAAA,EACJ;AAEA,QAAM,oBAAoB,MAAM;AAC9B,QAAI,CAAC,OAAO,CAAC,KAAK;AAChB;AAAA,IACF;AACA,UAAM,SAAS,gBAAgB,aAAa;AAC5C,QAAI,KAAK;AAAA,MACP,GAAG,gBAAgB,OAAO,UAAU,CAAC,YAAY;AAC/C,YAAI,YAAY,iBAAiB;AAC/B,eAAK,WAAW,KAAM,YAAY;AAAA,QACpC;AACA,YAAK,QAAQ,OAAO;AAAA,MACtB,CAAC;AAAA,MACD,OAAO;AAAA,QACL,SAAS,MAAM,IAAK,QAAQ,WAAW;AAAA,QACvC,MAAM,CAAC,QAAQ,IAAI,MAAM,GAAG,YAAY;AAAA,QACxC,aAAa;AAAA,MACf;AAAA,MACA,IAAI;AAAA,QACF,SAAS,MAAM;AACb,cAAI,aAAa,GAAG,YAAY,OAAO;AACrC,gBAAK,QAAQ,gBAAgB;AAAA,UAC/B;AAAA,QACF;AAAA,QACA,MAAM,CAAC,QACL,IAAI,MAAM,GAAG,YAAY,SAAS,IAAI,MAAM,GAAG,YAAY;AAAA,MAC/D;AAAA,MACA,MAAM;AAAA,QACJ,SAAS,MAAM;AACb,cAAI,aAAa,GAAG,YAAY,OAAO;AACrC,gBAAK,QAAQ,gBAAgB;AAAA,UAC/B;AAAA,QACF;AAAA,QACA,MAAM,CAAC,QACL,IAAI,MAAM,GAAG,YAAY,SAAS,IAAI,MAAM,GAAG,YAAY;AAAA,MAC/D;AAAA,IACF,CAAC;AACD,QAAI,OAAO,CAAC,WAAW;AAAA,MACrB,GAAG;AAAA,MACH,UAAU;AAAA,QACR,cAAc,OAAO;AAAA,QACrB,aAAa,OAAO;AAAA,MACtB;AAAA,IACF,EAAE;AAAA,EACJ;AAEA,QAAM,qBAAqB;AAAA,IACzB;AAAA,IACA,UAAU,MAAM;AAAA,IAChB,QAAQ,CAAC,YAAY;AACnB,WAAK,OAAO,CAAC,SAAS;AACpB,uBAAe,OAAO,YAAY,aAAa,QAAQ,IAAI,IAAI;AAC/D,eAAO;AAAA,MACT,CAAC;AAAA,IACH;AAAA,IACA,MAAM,MAAM;AACV,WAAK,UAAU,MAAM,EAAE,QAAQ,MAAM;AACnC,aAAK,KAAK,EAAE,QAAQ,MAAMA,SAAQ,KAAK,CAAC,CAAC;AAAA,MAC3C,CAAC;AAAA,IACH;AAAA,IACA;AAAA,EACF,CAAC;AAED,QAAM,cAAc,EAAE,cAAc,aAAa,CAAC;AAClD,oBAAkB;AAClB,qBAAmB;AAEnB,QAAM,YAAY,iBAAiB,eAAe,iBAAiB;AAEnE,YAAU,GAAG,UAAU,MAAM;AAC3B,SAAK,IAAK,iBAAiB;AAC3B,SAAK,iBAAiB;AAAA,EACxB,CAAC;AAED,MAAI;AAAA,IAAK,CAAC,UACR,UAAU,OAAO;AAAA,MACf,gBAAgB,CAAC,OAAO,WAAW;AACjC,aAAK,OAAO,CAAC,SAAS;AACpB,gBAAM,eAAe,KAAK,aACtB,oBAAoB,KAAK,WAAW,SAAS,OAAO,IAAI,IACxD;AACJ,iBAAO;AAAA,YACL,GAAG;AAAA,YACH,WAAW,CAAC,GAAG,KAAK;AAAA,YACpB,OAAO,iBAAiB,KAAK,MAAM,KAAK;AAAA,YACxC;AAAA,YACA,IAAI,EAAE,GAAG,KAAK,IAAI,WAAW,SAAS;AAAA,YACtC,QAAQ,EAAE,GAAG,KAAK,QAAQ,OAAO;AAAA,UACnC;AAAA,QACF,CAAC;AAAA,MACH;AAAA,MACA,mBAAmB,CAAC,cAAc;AAChC,aAAK,OAAO,CAAC,SAAS;AACpB,gBAAM,aAAa,WAAW,OAAO,QAAQ,KAAK,OAAO,OAAO;AAChE,gBAAM,eAAe,KAAK,aACtB,oBAAoB,KAAK,WAAW,SAAS,UAAU,IACvD;AACJ,iBAAO;AAAA,YACL,GAAG;AAAA,YACH;AAAA,YACA,IAAI,EAAE,GAAG,KAAK,IAAI,WAAW,SAAS;AAAA,YACtC,QAAQ;AAAA,cACN,GAAG,KAAK;AAAA,cACR;AAAA,cACA,QAAQ,WAAW,UAAU,KAAK,OAAO;AAAA,YAC3C;AAAA,UACF;AAAA,QACF,CAAC;AAAA,MACH;AAAA,MACA,gBAAgB,CAAC,WAAW,eAAe;AACzC,aAAK,OAAO,CAAC,UAAU;AAAA,UACrB,GAAG;AAAA,UACH,QAAQ,EAAE,GAAG,KAAK,QAAQ,WAAW,WAAW;AAAA,QAClD,EAAE;AAAA,MACJ;AAAA,MACA,cAAc,CAAC,SAAS;AACtB,YAAI,KAAK,SAAS,QAAQ;AACxB,eAAK,IAAK,SAAS,KAAK,IAAI;AAAA,QAC9B;AAAA,MACF;AAAA,MACA,cAAc,CAAC,MAAM,aAAa;AAChC,aAAK,OAAO,CAAC,UAAU;AAAA,UACrB,GAAG;AAAA,UACH,eAAe,WACX,CAAC,GAAG,KAAK,eAAe,KAAK,IAAI,IACjC,KAAK,cAAc,OAAO,CAAC,MAAM,MAAM,KAAK,IAAI;AAAA,QACtD,EAAE;AAAA,MACJ;AAAA,MACA,aAAa,CAAC,SAAS;AACrB,YAAI,KAAK,SAAS,QAAQ;AACxB,eAAK,IAAK,SAAS,KAAK,IAAI;AAAA,QAC9B;AAAA,MACF;AAAA,MACA,eAAe,CAAC,QAAQ;AACtB,aAAK,OAAO,CAAC,UAAU;AAAA,UACrB,GAAG;AAAA,UACH,IAAI,EAAE,GAAG,KAAK,IAAI,aAAa,IAAI;AAAA,UACnC,gBAAgB;AAAA,YACd,GAAG,KAAK;AAAA,YACR,WAAW;AAAA,YACX,YAAY;AAAA,YACZ,QAAQ,EAAE,MAAM,GAAG,QAAQ,EAAE;AAAA,YAC7B,WAAW;AAAA,UACb;AAAA,QACF,EAAE;AAAA,MACJ;AAAA,MACA,kBAAkB,CAAC,WAAW,eAAe;AAC3C,aAAK,OAAO,CAAC,UAAU;AAAA,UACrB,GAAG;AAAA,UACH,gBAAgB,EAAE,GAAG,KAAK,gBAAgB,WAAW,WAAW;AAAA,QAClE,EAAE;AAAA,MACJ;AAAA,MACA,qBAAqB,CAAC,cAAc;AAClC,aAAK,OAAO,CAAC,UAAU;AAAA,UACrB,GAAG;AAAA,UACH,IAAI,EAAE,GAAG,KAAK,IAAI,WAAW,WAAW;AAAA,UACxC,gBAAgB;AAAA,YACd,GAAG,KAAK;AAAA,YACR;AAAA,YACA,QAAQ,WAAW,UAAU,KAAK,eAAe;AAAA,UACnD;AAAA,QACF,EAAE;AAAA,MACJ;AAAA,MACA,kBAAkB,CAAC,WAAW;AAC5B,aAAK,OAAO,CAAC,UAAU;AAAA,UACrB,GAAG;AAAA,UACH,IAAI,EAAE,GAAG,KAAK,IAAI,WAAW,WAAW;AAAA,UACxC,gBAAgB,EAAE,GAAG,KAAK,gBAAgB,OAAO;AAAA,QACnD,EAAE;AAAA,MACJ;AAAA,MACA,eAAe,CAAC,UAAU;AACxB,YAAI,MAAM,WAAW,GAAG;AACtB,eAAK,OAAO,CAAC,UAAU;AAAA,YACrB,GAAG;AAAA,YACH,IAAI,EAAE,GAAG,KAAK,IAAI,YAAY,CAAC,MAAM,CAAC,GAAI,MAAM,CAAC,GAAI,MAAM,CAAC,CAAE,EAAE;AAAA,UAClE,EAAE;AAAA,QACJ;AAAA,MACF;AAAA,MACA,wBAAwB,CAAC,UAAU;AACjC,aAAK,OAAO,CAAC,UAAU;AAAA,UACrB,GAAG;AAAA,UACH,IAAI;AAAA,YACF,GAAG,KAAK;AAAA,YACR,gBAAgB,EAAE,GAAG,KAAK,GAAG,gBAAgB,OAAO,eAAe,EAAE;AAAA,UACvE;AAAA,QACF,EAAE;AAAA,MACJ;AAAA,MACA,iCAAiC,CAAC,UAAU;AAC1C,aAAK,OAAO,CAAC,UAAU;AAAA,UACrB,GAAG;AAAA,UACH,IAAI;AAAA,YACF,GAAG,KAAK;AAAA,YACR,gBAAgB,EAAE,GAAG,KAAK,GAAG,gBAAgB,eAAe,MAAM;AAAA,UACpE;AAAA,QACF,EAAE;AAAA,MACJ;AAAA,MACA,wBAAwB,CAAC,OAAO;AAC9B,aAAK,QAAQ,eAAe;AAC5B,cAAM,UAAU,qBAAqB,EAAE;AACvC,YAAI,WAAW,YAAY,oBAAoB;AAC7C,eAAK,QAAQ,OAAO;AAAA,QACtB;AAAA,MACF;AAAA,MACA,gBAAgB,MAAM;AACpB,aAAK,QAAQ,eAAe;AAAA,MAC9B;AAAA,MACA,aAAa,CAAC,UAAU;AACtB,aAAK,OAAO,CAAC,UAAU;AAAA,UACrB,GAAG;AAAA,UACH,IAAI,EAAE,GAAG,KAAK,IAAI,kBAAkB,MAAM;AAAA,QAC5C,EAAE;AAAA,MACJ;AAAA,MACA,kBAAkB,CAAC,UAAU;AAC3B,aAAK,OAAO,CAAC,UAAU;AAAA,UACrB,GAAG;AAAA,UACH,QAAQ,EAAE,GAAG,KAAK,QAAQ,aAAa,MAAM;AAAA,QAC/C,EAAE;AAAA,MACJ;AAAA,IACF,CAAC;AAAA,EACH;AAEA,MAAI,QAAQ,CAAC,UAAU,cAAc,OAAO,GAAI,CAAC;AAEjD,QAAM,QAAQ,aAAa,IAAI,EAAE,OAAO,CAAC,SAAS,KAAK,SAAS,MAAM;AACtE,MAAI,MAAM,CAAC,GAAG;AACZ,UAAM,IAAI,SAAS,MAAM,CAAC,EAAE,IAAI;AAAA,EAClC;AAEA,QAAM,IAAI,IAAI;AACd,YAAU;AACZ;AAEA,eAAe,WAAW,KAAwB,OAAgC;AAChF,QAAM,SAAS,MAAM,QAAQ;AAC7B,MAAI,CAAC,QAAQ;AACX;AAAA,EACF;AACA,MAAI,OAAO,OAAO;AAClB,MAAI,MAAM,GAAG,gBAAgB,UAAU;AACrC,WAAO,OAAO,cAAc,OAAO;AAAA,EACrC,WAAW,MAAM,GAAG,gBAAgB,WAAW;AAC7C,WAAO,OAAO,QAAQ,IAAI,CAAC,MAAM,GAAG,EAAE,IAAI,KAAK,EAAE,KAAK,EAAE,EAAE,KAAK,IAAI;AAAA,EACrE;AACA,QAAM,KAAK,MAAM,gBAAgB,IAAI;AACrC,MAAI,OAAO,CAAC,UAAU;AAAA,IACpB,GAAG;AAAA,IACH,IAAI,EAAE,GAAG,KAAK,IAAI,eAAe,KAAK,WAAW,cAAc;AAAA,EACjE,EAAE;AACJ;AAEA,SAAS,cAAc,OAAgB,KAA8B;AACnE,MAAI,MAAM,SAAS,YAAY,MAAM,MAAM,SAAS,UAAU;AAC5D,UAAM,SAAS,MAAM;AACrB,QAAI,OAAO,CAAC,UAAU;AAAA,MACpB,GAAG;AAAA,MACH,IAAI;AAAA,QACF,GAAG,KAAK;AAAA,QACR,eAAe,OAAO;AAAA,QACtB,gBAAgB,OAAO;AAAA,QACvB,YAAY,kBAAkB,OAAO,IAAI;AAAA,QACzC,gBACE,kBAAkB,OAAO,IAAI,MAAM,oBAC/B,KAAK,GAAG,iBACR;AAAA,MACR;AAAA,IACF,EAAE;AACF;AAAA,EACF;AAEA,MAAI,MAAM,SAAS,YAAY,MAAM,MAAM,SAAS,SAAS;AAC3D;AAAA,EACF;AAEA,QAAM,EAAE,GAAG,EAAE,IAAI,MAAM;AACvB,QAAM,QAAgD;AAAA,IACpD,EAAE,IAAI,cAAc,MAAM,QAAQ;AAAA,IAClC,EAAE,IAAI,eAAe,MAAM,SAAS;AAAA,IACpC,EAAE,IAAI,iBAAiB,MAAM,WAAW;AAAA,EAC1C;AAEA,aAAW,SAAS,OAAO;AACzB,UAAM,OAAO,IAAI,eAAe,MAAM,EAAE;AACxC,QAAI,CAAC,MAAM;AACT;AAAA,IACF;AACA,QAAI,KAAK,KAAK,KAAK,IAAI,KAAK,IAAI,KAAK,KAAK,KAAK,KAAK,KAAK,IAAI,KAAK,IAAI,KAAK,GAAG;AAC5E,UAAI,OAAO,CAAC,UAAU;AAAA,QACpB,GAAG;AAAA,QACH,IAAI,EAAE,GAAG,KAAK,IAAI,WAAW,MAAM,KAAK;AAAA,MAC1C,EAAE;AACF;AAAA,IACF;AAAA,EACF;AACF;AAEA,KAAK,KAAK,EAAE,MAAM,CAAC,UAAU;AAC3B,UAAQ,MAAM,KAAK;AACnB,EAAAA,SAAQ,KAAK,CAAC;AAChB,CAAC;","names":["path","process","path","path","path","path","path","path","path","process"]}
1
+ {"version":3,"sources":["../src/cli.ts","../src/config/config.ts","../src/config/paths.ts","../src/config/keybindings.ts","../src/engine/io-provider.ts","../src/engine/region-resolver.ts","../src/engine/store.ts","../src/engine/env-config.ts","../src/engine/send.ts","../src/keymap/dispatcher.ts","../src/workspace/index.ts","../src/workspace/discovery.ts","../src/state/types.ts","../src/state/send-controller.ts","../src/utils/http-syntax.ts","../src/utils/json-folding.ts","../src/state/commands.ts","../src/state/editor-edit.ts","../src/ui/theme-colors.ts","../src/ui/app-view.ts","../src/ui/editor-gutter.ts","../src/ui/scroll.ts","../src/utils/clipboard.ts","../src/utils/git.ts","../src/utils/terminal-theme.ts"],"sourcesContent":["import path from \"node:path\";\nimport process from \"node:process\";\n\nimport type { UiEvent, ZrevEvent } from \"@rezi-ui/core\";\nimport { ZR_MOD_CTRL, ZR_MOD_SHIFT } from \"@rezi-ui/core/keybindings\";\n\nimport { createNodeApp, type NodeApp } from \"@rezi-ui/node\";\n\nimport { loadConfig, watchConfig, type ThemePreference } from \"./config/config.js\";\nimport { loadKeybindings, watchKeybindings } from \"./config/keybindings.js\";\nimport { initEngineProviders } from \"./engine/index.js\";\nimport { buildBindingMap, commandFromPaletteId } from \"./keymap/index.js\";\nimport { createCommandContext, createInitialState, type CommandBus } from \"./state/commands.js\";\nimport { pasteIntoEditor } from \"./state/editor-edit.js\";\nimport type { AppState, CommandId, FocusPane, ThemeMode } from \"./state/types.js\";\nimport { contentFromLines, resolveLayoutMode } from \"./state/types.js\";\nimport { themeForMode } from \"./ui/theme-colors.js\";\nimport { focusPaneId, renderApp } from \"./ui/app-view.js\";\nimport {\n sourceCursorFromEditorPoint,\n sourceCursorFromEditor,\n sourceSelectionFromEditor,\n stripEditorLines,\n prefixEditorLines,\n} from \"./ui/editor-gutter.js\";\nimport { resolveWheelScroll } from \"./ui/scroll.js\";\nimport { copyToClipboard, readFromClipboard } from \"./utils/clipboard.js\";\nimport { getGitBranch } from \"./utils/git.js\";\nimport { prettyJsonIfPossible } from \"./utils/http-syntax.js\";\nimport { buildFoldableJsonView } from \"./utils/json-folding.js\";\nimport { resolveThemeMode } from \"./utils/terminal-theme.js\";\nimport { Workspace, flattenFiles } from \"./workspace/index.js\";\n\ntype ElementRect = Readonly<{ x: number; y: number; w: number; h: number }>;\n\nfunction isPointInRect(x: number, y: number, rect: ElementRect): boolean {\n return x >= rect.x && x < rect.x + rect.w && y >= rect.y && y < rect.y + rect.h;\n}\n\nfunction responseEditorId(state: AppState): string | null {\n switch (state.ui.responseTab) {\n case \"pretty\":\n return `response-pretty-${state.resultGeneration}`;\n case \"raw\":\n return `response-raw-${state.resultGeneration}`;\n case \"variables\":\n return `response-vars-${state.resultGeneration}`;\n case \"headers\":\n case \"tests\":\n return null;\n }\n}\n\nfunction responseEditorLines(state: AppState): readonly string[] | null {\n const result = state.request.result;\n if (!result) {\n return null;\n }\n\n switch (state.ui.responseTab) {\n case \"pretty\":\n return buildFoldableJsonView(\n prettyJsonIfPossible(result.prettyBody || result.body),\n state.responseEditor.foldedJsonPaths,\n ).lines;\n case \"raw\":\n return result.body ? result.body.split(\"\\n\") : [\"\"];\n case \"variables\":\n return JSON.stringify(state.request.variables, null, 2).split(\"\\n\");\n case \"headers\":\n case \"tests\":\n return null;\n }\n}\n\nfunction handleWheelEvent(event: ZrevEvent, app: NodeApp<AppState>): boolean {\n if (event.kind !== \"mouse\" || event.mouseKind !== 5) {\n return false;\n }\n\n let handled = false;\n app.update((prev) => {\n const editorRect = app.measureElement(\"editor\");\n if (editorRect && isPointInRect(event.x, event.y, editorRect)) {\n handled = true;\n const next = resolveWheelScroll(\n event,\n prev.editor,\n prefixEditorLines(prev.fileLines, null),\n { width: editorRect.w, height: editorRect.h },\n );\n return {\n ...prev,\n ui: { ...prev.ui, focusPane: \"editor\" },\n editor: next\n ? { ...prev.editor, scrollTop: next.scrollTop, scrollLeft: next.scrollLeft }\n : prev.editor,\n };\n }\n\n const id = responseEditorId(prev);\n const responseRect = id ? app.measureElement(id) : null;\n if (responseRect && isPointInRect(event.x, event.y, responseRect)) {\n handled = true;\n const lines = responseEditorLines(prev);\n const next = lines\n ? resolveWheelScroll(event, prev.responseEditor, lines, {\n width: responseRect.w,\n height: responseRect.h,\n })\n : null;\n return {\n ...prev,\n ui: { ...prev.ui, focusPane: \"response\" },\n responseEditor: next\n ? { ...prev.responseEditor, scrollTop: next.scrollTop, scrollLeft: next.scrollLeft }\n : prev.responseEditor,\n };\n }\n\n return prev;\n });\n\n return handled;\n}\n\nasync function main(): Promise<void> {\n initEngineProviders();\n\n const workspaceRoot = path.resolve(process.argv[2] ?? process.cwd());\n const workspace = new Workspace(workspaceRoot);\n const tree = await workspace.open();\n\n const config = loadConfig(workspaceRoot);\n const initialThemeMode = await resolveThemeMode(config.theme);\n\n let currentState = createInitialState(workspaceRoot);\n currentState = {\n ...currentState,\n fileTree: tree,\n expandedPaths: tree.filter((n) => n.kind === \"directory\").map((n) => n.path),\n settings: {\n ...currentState.settings,\n theme: config.theme,\n themeMode: initialThemeMode,\n },\n ui: {\n ...currentState.ui,\n gitBranch: await getGitBranch(workspaceRoot),\n },\n };\n\n let app: NodeApp<AppState> | null = null;\n let bus: CommandBus | null = null;\n\n const refreshGitBranch = async () => {\n const branch = await getGitBranch(workspaceRoot);\n app?.update((prev) => ({\n ...prev,\n ui: { ...prev.ui, gitBranch: branch },\n }));\n };\n\n const reloadKeybindings = () => {\n if (!app || !bus) {\n return;\n }\n const loaded = loadKeybindings(workspaceRoot);\n app.keys({\n ...buildBindingMap(loaded.bindings, (command, ctx) => {\n currentState = ctx.state as AppState;\n if (command === \"response.copy\") {\n void handleCopy(app!, currentState);\n }\n bus!.execute(command);\n }),\n enter: {\n handler: (ctx) => {\n currentState = ctx.state as AppState;\n bus!.execute(\"env.apply\");\n },\n when: (ctx) => ctx.state.ui.overlay === \"env\",\n description: \"Apply selected environment\",\n },\n up: {\n handler: (ctx) => {\n currentState = ctx.state as AppState;\n if (currentState.ui.overlay === \"env\") {\n bus!.execute(\"env.selectPrev\");\n }\n },\n when: (ctx) =>\n ctx.state.ui.overlay === \"env\" || ctx.state.ui.overlay === \"commandPalette\",\n },\n down: {\n handler: (ctx) => {\n currentState = ctx.state as AppState;\n if (currentState.ui.overlay === \"env\") {\n bus!.execute(\"env.selectNext\");\n }\n },\n when: (ctx) =>\n ctx.state.ui.overlay === \"env\" || ctx.state.ui.overlay === \"commandPalette\",\n },\n });\n app.update((state) => ({\n ...state,\n settings: {\n ...state.settings,\n keymapPreset: loaded.preset,\n keybindings: loaded.bindings,\n },\n }));\n };\n\n const applyTheme = async (preference: ThemePreference) => {\n if (!app) {\n return;\n }\n const themeMode: ThemeMode = await resolveThemeMode(preference, {\n allowProbe: false,\n fallbackMode: currentState.settings.themeMode,\n });\n app.setTheme(themeForMode(themeMode));\n app.update((state) => ({\n ...state,\n settings: {\n ...state.settings,\n theme: preference,\n themeMode,\n },\n }));\n };\n\n const reloadConfig = () => {\n void applyTheme(loadConfig(workspaceRoot).theme);\n };\n\n bus = createCommandContext({\n workspace,\n getState: () => currentState,\n update: (updater) => {\n app?.update((prev) => {\n currentState = typeof updater === \"function\" ? updater(prev) : updater;\n return currentState;\n });\n },\n quit: () => {\n void workspace.close().finally(async () => {\n await app?.stop();\n await app?.dispose();\n process.exit(0);\n });\n },\n reloadKeybindings,\n });\n\n app = createNodeApp({ initialState: currentState, theme: themeForMode(initialThemeMode) });\n reloadKeybindings();\n\n const executeCommand = (command: CommandId) => {\n if (!bus || !app) {\n return;\n }\n if (command === \"response.copy\") {\n void handleCopy(app, currentState);\n }\n bus.execute(command);\n };\n\n const stopKeybindingWatch = watchKeybindings(workspaceRoot, reloadKeybindings);\n const stopConfigWatch = watchConfig(workspaceRoot, reloadConfig);\n\n workspace.on(\"change\", () => {\n void bus!.refreshWorkspace();\n void refreshGitBranch();\n });\n\n app.view((state) =>\n renderApp(state, {\n onEditorChange: (lines, cursor) => {\n app?.update((prev) => {\n const fileLines = stripEditorLines(lines);\n const sourceCursor = sourceCursorFromEditor(cursor);\n return {\n ...prev,\n fileLines,\n dirty: contentFromLines(fileLines) !== prev.fileContent,\n ui: { ...prev.ui, focusPane: \"editor\" },\n editor: { ...prev.editor, cursor: sourceCursor },\n };\n });\n },\n onEditorSelection: (selection) => {\n app?.update((prev) => {\n const sourceSelection = sourceSelectionFromEditor(selection);\n return {\n ...prev,\n ui: { ...prev.ui, focusPane: \"editor\" },\n editor: {\n ...prev.editor,\n selection: sourceSelection,\n cursor: sourceSelection?.active ?? prev.editor.cursor,\n },\n };\n });\n },\n onEditorScroll: (scrollTop, scrollLeft) => {\n app?.update((prev) => ({\n ...prev,\n editor: { ...prev.editor, scrollTop, scrollLeft },\n }));\n },\n onTreeSelect: (node) => {\n if (node.kind === \"file\") {\n void bus!.openFile(node.path);\n }\n },\n onTreeToggle: (node, expanded) => {\n app?.update((prev) => ({\n ...prev,\n expandedPaths: expanded\n ? [...prev.expandedPaths, node.path]\n : prev.expandedPaths.filter((p) => p !== node.path),\n }));\n },\n onTreePress: (node) => {\n if (node.kind === \"file\") {\n void bus!.openFile(node.path);\n }\n },\n onResponseTab: (tab) => {\n app?.update((prev) => ({\n ...prev,\n ui: { ...prev.ui, responseTab: tab },\n responseEditor: {\n ...prev.responseEditor,\n scrollTop: 0,\n scrollLeft: 0,\n cursor: { line: 0, column: 0 },\n selection: null,\n },\n }));\n },\n onResponseScroll: (scrollTop, scrollLeft) => {\n app?.update((prev) => ({\n ...prev,\n responseEditor: { ...prev.responseEditor, scrollTop, scrollLeft },\n }));\n },\n onResponseSelection: (selection) => {\n app?.update((prev) => ({\n ...prev,\n ui: { ...prev.ui, focusPane: \"response\" },\n responseEditor: {\n ...prev.responseEditor,\n selection,\n cursor: selection?.active ?? prev.responseEditor.cursor,\n },\n }));\n },\n onResponseChange: (cursor) => {\n app?.update((prev) => ({\n ...prev,\n ui: { ...prev.ui, focusPane: \"response\" },\n responseEditor: { ...prev.responseEditor, cursor },\n }));\n },\n onResponseJsonFoldToggle: () => {\n bus?.execute(\"response.jsonFoldToggle\");\n },\n onResponseJsonUnfoldAll: () => {\n bus?.execute(\"response.jsonUnfoldAll\");\n },\n onSplitChange: (sizes) => {\n if (sizes.length === 3) {\n app?.update((prev) => ({\n ...prev,\n ui: { ...prev.ui, splitSizes: [sizes[0]!, sizes[1]!, sizes[2]!] },\n }));\n }\n },\n onCommandPaletteChange: (query) => {\n app?.update((prev) => ({\n ...prev,\n ui: {\n ...prev.ui,\n commandPalette: { ...prev.ui.commandPalette, query, selectedIndex: 0 },\n },\n }));\n },\n onCommandPaletteSelectionChange: (index) => {\n app?.update((prev) => ({\n ...prev,\n ui: {\n ...prev.ui,\n commandPalette: { ...prev.ui.commandPalette, selectedIndex: index },\n },\n }));\n },\n onCommandPaletteSelect: (id) => {\n bus?.execute(\"overlay.close\");\n const command = commandFromPaletteId(id);\n if (command && command !== \"palette.commands\") {\n bus?.execute(command);\n }\n },\n onOverlayClose: () => {\n bus?.execute(\"overlay.close\");\n },\n onEnvSelect: (index) => {\n app?.update((prev) => {\n currentState = {\n ...prev,\n ui: { ...prev.ui, envSelectedIndex: index },\n };\n return currentState;\n });\n bus?.execute(\"env.apply\");\n },\n onResponseSearch: (query) => {\n app?.update((prev) => ({\n ...prev,\n editor: { ...prev.editor, searchQuery: query },\n }));\n },\n onCommand: executeCommand,\n }),\n );\n\n app.onEvent((event) => {\n void handleUiEvent(event, app!);\n });\n\n const files = flattenFiles(tree).filter((node) => node.kind === \"file\");\n if (files[0]) {\n await bus.openFile(files[0].path);\n }\n\n await app.run();\n stopKeybindingWatch();\n stopConfigWatch();\n}\n\nasync function handleCopy(app: NodeApp<AppState>, state: AppState): Promise<void> {\n const result = state.request.result;\n if (!result) {\n return;\n }\n let text = result.body;\n if (state.ui.responseTab === \"pretty\") {\n text = result.prettyBody || result.body;\n } else if (state.ui.responseTab === \"headers\") {\n text = result.headers.map((h) => `${h.name}: ${h.value}`).join(\"\\n\");\n }\n const ok = await copyToClipboard(text);\n app.update((prev) => ({\n ...prev,\n ui: { ...prev.ui, statusMessage: ok ? \"Copied\" : \"Copy failed\" },\n }));\n}\n\nasync function handlePaste(app: NodeApp<AppState>): Promise<void> {\n const text = await readFromClipboard();\n app.update((prev) => {\n if (prev.ui.overlay !== \"none\" || prev.ui.focusPane !== \"editor\") {\n return prev;\n }\n if (!text) {\n return {\n ...prev,\n ui: { ...prev.ui, statusMessage: text === \"\" ? \"Clipboard empty\" : \"Paste failed\" },\n };\n }\n\n const next = pasteIntoEditor({\n lines: prev.fileLines,\n cursor: prev.editor.cursor,\n selection: prev.editor.selection,\n text,\n });\n return {\n ...prev,\n fileLines: next.lines,\n dirty: contentFromLines(next.lines) !== prev.fileContent,\n editor: {\n ...prev.editor,\n cursor: next.cursor,\n selection: next.selection,\n },\n ui: { ...prev.ui, focusPane: \"editor\", statusMessage: \"Pasted\" },\n };\n });\n}\n\nasync function handleUiEvent(event: UiEvent, app: NodeApp<AppState>): Promise<void> {\n if (event.kind === \"engine\" && event.event.kind === \"resize\") {\n const resize = event.event;\n app.update((prev) => ({\n ...prev,\n ui: {\n ...prev.ui,\n viewportWidth: resize.cols,\n viewportHeight: resize.rows,\n layoutMode: resolveLayoutMode(resize.cols),\n sidebarVisible:\n resolveLayoutMode(resize.cols) === \"sidebar-overlay\"\n ? prev.ui.sidebarVisible\n : true,\n },\n }));\n return;\n }\n\n if (\n event.kind === \"engine\" &&\n event.event.kind === \"key\" &&\n event.event.action === \"down\" &&\n (event.event.mods & ZR_MOD_CTRL) !== 0 &&\n event.event.key === 86\n ) {\n await handlePaste(app);\n return;\n }\n\n if (event.kind !== \"engine\" || event.event.kind !== \"mouse\") {\n return;\n }\n\n if (handleWheelEvent(event.event, app)) {\n return;\n }\n\n const { x, y, mouseKind, mods } = event.event;\n if (mouseKind === 3) {\n const editorRect = app.measureElement(\"editor\");\n if (\n editorRect &&\n isPointInRect(x, y, editorRect)\n ) {\n app.update((prev) => {\n const cursor = sourceCursorFromEditorPoint({\n x,\n y,\n rect: editorRect,\n lines: prev.fileLines,\n scrollTop: prev.editor.scrollTop,\n scrollLeft: prev.editor.scrollLeft,\n });\n if (!cursor) {\n return prev;\n }\n const extendSelection = (mods & ZR_MOD_SHIFT) !== 0;\n return {\n ...prev,\n ui: { ...prev.ui, focusPane: \"editor\" },\n editor: {\n ...prev.editor,\n cursor,\n selection: extendSelection ? { anchor: prev.editor.cursor, active: cursor } : null,\n },\n };\n });\n return;\n }\n }\n\n const panes: Array<{ id: string; pane: FocusPane }> = [\n { id: \"pane-files\", pane: \"files\" },\n { id: \"pane-editor\", pane: \"editor\" },\n { id: \"pane-response\", pane: \"response\" },\n ];\n\n for (const entry of panes) {\n const rect = app.measureElement(entry.id);\n if (!rect) {\n continue;\n }\n if (isPointInRect(x, y, rect)) {\n app.update((prev) => ({\n ...prev,\n ui: { ...prev.ui, focusPane: entry.pane },\n }));\n break;\n }\n }\n}\n\nvoid main().catch((error) => {\n console.error(error);\n process.exit(1);\n});\n\nexport { focusPaneId };\n","import fs from \"node:fs\";\nimport path from \"node:path\";\n\nimport { getConfigDir, getProjectConfigDir } from \"./paths.js\";\n\nexport type ThemePreference = \"auto\" | \"light\" | \"dark\";\n\nexport type AppConfig = Readonly<{\n theme?: ThemePreference;\n}>;\n\nconst DEFAULT_THEME: ThemePreference = \"auto\";\n\nfunction readJsonIfExists(filePath: string): AppConfig | null {\n try {\n if (!fs.existsSync(filePath)) {\n return null;\n }\n const raw = fs.readFileSync(filePath, \"utf8\");\n return JSON.parse(raw) as AppConfig;\n } catch {\n return null;\n }\n}\n\nfunction parseThemePreference(value: string | undefined): ThemePreference | null {\n if (value === \"auto\" || value === \"light\" || value === \"dark\") {\n return value;\n }\n return null;\n}\n\nexport function loadConfig(workspaceRoot: string): { theme: ThemePreference } {\n const userConfig = readJsonIfExists(path.join(getConfigDir(), \"config.json\"));\n const projectConfig = readJsonIfExists(\n path.join(getProjectConfigDir(workspaceRoot), \"config.json\"),\n );\n\n const envTheme = parseThemePreference(process.env.REQEX_THEME);\n const fileTheme = projectConfig?.theme ?? userConfig?.theme ?? DEFAULT_THEME;\n\n return {\n theme: envTheme ?? fileTheme,\n };\n}\n\nexport function watchConfig(workspaceRoot: string, onChange: () => void): () => void {\n const files = [\n path.join(getConfigDir(), \"config.json\"),\n path.join(getProjectConfigDir(workspaceRoot), \"config.json\"),\n ];\n const watchers = files.map((filePath) => {\n const dir = path.dirname(filePath);\n try {\n fs.mkdirSync(dir, { recursive: true });\n } catch {\n // ignore\n }\n return fs.watch(dir, { persistent: false }, (_event, filename) => {\n if (filename === \"config.json\") {\n onChange();\n }\n });\n });\n return () => {\n for (const watcher of watchers) {\n watcher.close();\n }\n };\n}\n","import os from \"node:os\";\nimport path from \"node:path\";\n\nexport function getConfigDir(): string {\n if (process.env.REQEX_CONFIG_DIR) {\n return process.env.REQEX_CONFIG_DIR;\n }\n if (process.platform === \"win32\") {\n const appData = process.env.APPDATA ?? path.join(os.homedir(), \"AppData\", \"Roaming\");\n return path.join(appData, \"reqex\");\n }\n if (process.platform === \"darwin\") {\n return path.join(os.homedir(), \"Library\", \"Application Support\", \"reqex\");\n }\n const xdg = process.env.XDG_CONFIG_HOME ?? path.join(os.homedir(), \".config\");\n return path.join(xdg, \"reqex\");\n}\n\nexport function getProjectConfigDir(workspaceRoot: string): string {\n return path.join(workspaceRoot, \".reqex\");\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\n\nimport type { CommandId } from \"../state/types.js\";\nimport { getConfigDir, getProjectConfigDir } from \"./paths.js\";\n\nexport type KeymapPreset = \"vscode\" | \"vim\";\n\nexport type KeybindingConfig = Readonly<{\n preset?: KeymapPreset;\n bindings?: Readonly<Record<string, CommandId>>;\n}>;\n\nconst VSCODE_DEFAULTS: Record<string, CommandId> = {\n F5: \"request.send\",\n \"ctrl+enter\": \"request.send\",\n \"alt+enter\": \"request.send\",\n tab: \"pane.focusNext\",\n \"shift+tab\": \"pane.focusPrev\",\n \"ctrl+1\": \"pane.focusFiles\",\n \"ctrl+2\": \"pane.focusEditor\",\n \"ctrl+3\": \"pane.focusResponse\",\n \"alt+1\": \"pane.focusFiles\",\n \"alt+2\": \"pane.focusEditor\",\n \"alt+3\": \"pane.focusResponse\",\n \"ctrl+b\": \"sidebar.toggle\",\n \"ctrl+p\": \"palette.files\",\n \"ctrl+shift+p\": \"palette.commands\",\n F2: \"palette.commands\",\n \"ctrl+s\": \"file.save\",\n \"ctrl+e\": \"env.switcher\",\n F11: \"pane.zoom\",\n z: \"pane.zoom\",\n F1: \"help.show\",\n \"ctrl+/\": \"keybindings.show\",\n escape: \"overlay.close\",\n \"ctrl+q\": \"app.quit\",\n \"ctrl+x\": \"request.cancel\",\n \"ctrl+shift+c\": \"response.copy\",\n \"ctrl+f\": \"response.search\",\n \"ctrl+[\": \"response.jsonFoldToggle\",\n \"ctrl+]\": \"response.jsonUnfoldAll\",\n \"ctrl+tab\": \"response.tab.next\",\n \"ctrl+shift+tab\": \"response.tab.prev\",\n};\n\nconst VIM_DEFAULTS: Record<string, CommandId> = {\n ...VSCODE_DEFAULTS,\n \"ctrl+w h\": \"pane.focusFiles\",\n \"ctrl+w l\": \"pane.focusResponse\",\n \"ctrl+w k\": \"pane.focusEditor\",\n};\n\nexport const COMMAND_LABELS: Record<CommandId, string> = {\n \"request.send\": \"Send request\",\n \"request.cancel\": \"Cancel request\",\n \"pane.focusNext\": \"Focus next pane\",\n \"pane.focusPrev\": \"Focus previous pane\",\n \"pane.focusFiles\": \"Focus files pane\",\n \"pane.focusEditor\": \"Focus editor pane\",\n \"pane.focusResponse\": \"Focus response pane\",\n \"sidebar.toggle\": \"Toggle sidebar\",\n \"file.save\": \"Save file\",\n \"env.switcher\": \"Environment switcher\",\n \"env.selectNext\": \"Next environment\",\n \"env.selectPrev\": \"Previous environment\",\n \"env.apply\": \"Apply environment\",\n \"overlay.close\": \"Close overlay\",\n \"app.quit\": \"Quit\",\n \"palette.commands\": \"Command palette\",\n \"palette.files\": \"Open file\",\n \"help.show\": \"Help\",\n \"keybindings.show\": \"Show keybindings\",\n \"pane.zoom\": \"Zoom pane\",\n \"response.tab.next\": \"Next response tab\",\n \"response.tab.prev\": \"Previous response tab\",\n \"response.copy\": \"Copy response\",\n \"response.search\": \"Search response\",\n \"response.jsonFoldToggle\": \"Fold/unfold JSON node\",\n \"response.jsonUnfoldAll\": \"Unfold all JSON\",\n \"editor.searchNext\": \"Find next in editor\",\n};\n\nconst CHORD_PART_LABELS: Record<string, string> = {\n ctrl: \"Ctrl\",\n shift: \"Shift\",\n alt: \"Alt\",\n meta: \"Meta\",\n escape: \"Esc\",\n tab: \"Tab\",\n enter: \"Enter\",\n space: \"Space\",\n backspace: \"Backspace\",\n delete: \"Delete\",\n up: \"Up\",\n down: \"Down\",\n left: \"Left\",\n right: \"Right\",\n};\n\nexport function formatKeyChord(key: string): string {\n if (/^F\\d+$/u.test(key)) {\n return key;\n }\n if (key.length === 1) {\n return key === \"?\" ? \"?\" : key.toUpperCase();\n }\n\n return key\n .split(\"+\")\n .map((part) => CHORD_PART_LABELS[part] ?? part.toUpperCase())\n .join(\"+\");\n}\n\nexport function buildKeybindingsViewLines(\n bindings: Record<string, CommandId>,\n maxLines?: number,\n): string[] {\n const byCommand = new Map<CommandId, string[]>();\n for (const [key, command] of Object.entries(bindings)) {\n const keys = byCommand.get(command) ?? [];\n keys.push(key);\n byCommand.set(command, keys);\n }\n\n const rows = [...byCommand.entries()]\n .map(([command, keys]) => {\n const formattedKeys = keys\n .sort((a, b) => a.localeCompare(b))\n .map(formatKeyChord)\n .join(\" / \");\n const label = COMMAND_LABELS[command] ?? command;\n return { label, row: `${formattedKeys.padEnd(28)} ${label}` };\n })\n .sort((a, b) => a.label.localeCompare(b.label))\n .map((entry) => entry.row);\n\n if (maxLines !== undefined && rows.length > maxLines) {\n const hidden = rows.length - maxLines + 1;\n return [...rows.slice(0, maxLines - 1), `… ${hidden} more`];\n }\n return rows;\n}\n\nexport { getConfigDir, getProjectConfigDir } from \"./paths.js\";\n\nfunction readJsonIfExists(filePath: string): KeybindingConfig | null {\n try {\n if (!fs.existsSync(filePath)) {\n return null;\n }\n const raw = fs.readFileSync(filePath, \"utf8\");\n return JSON.parse(raw) as KeybindingConfig;\n } catch {\n return null;\n }\n}\n\nexport function loadKeybindings(workspaceRoot: string): {\n preset: KeymapPreset;\n bindings: Record<string, CommandId>;\n} {\n const userConfig = readJsonIfExists(path.join(getConfigDir(), \"keybindings.json\"));\n const projectConfig = readJsonIfExists(\n path.join(getProjectConfigDir(workspaceRoot), \"keybindings.json\"),\n );\n\n const preset =\n projectConfig?.preset ?? userConfig?.preset ?? (\"vscode\" as KeymapPreset);\n const defaults = preset === \"vim\" ? VIM_DEFAULTS : VSCODE_DEFAULTS;\n\n return {\n preset,\n bindings: {\n ...defaults,\n ...userConfig?.bindings,\n ...projectConfig?.bindings,\n },\n };\n}\n\nexport function watchKeybindings(\n workspaceRoot: string,\n onChange: () => void,\n): () => void {\n const dirs = [getConfigDir(), getProjectConfigDir(workspaceRoot)];\n const watchers = dirs.map((dir) => {\n try {\n fs.mkdirSync(dir, { recursive: true });\n } catch {\n // ignore\n }\n return fs.watch(dir, { persistent: false }, () => onChange());\n });\n return () => {\n for (const watcher of watchers) {\n watcher.close();\n }\n };\n}\n\nexport type FooterHintContext = Readonly<{\n focusPane: \"files\" | \"editor\" | \"response\";\n overlay: \"none\" | \"env\" | \"help\" | \"commandPalette\" | \"filePicker\" | \"keybindings\";\n viewportWidth: number;\n sending?: boolean;\n bindings?: Readonly<Record<string, string>>;\n responseTab?: \"pretty\" | \"raw\" | \"headers\" | \"variables\" | \"tests\";\n hasResponse?: boolean;\n hasFoldedJson?: boolean;\n}>;\n\nexport type FooterHintItem = Readonly<{\n command: CommandId;\n label: string;\n key: string;\n}>;\n\nconst FOOTER_COMMANDS: Record<string, readonly CommandId[]> = {\n editor: [\"file.save\", \"palette.commands\"],\n response: [\"response.copy\", \"response.jsonFoldToggle\", \"response.jsonUnfoldAll\"],\n files: [\"palette.files\", \"pane.focusNext\", \"palette.commands\"],\n overlay: [\"overlay.close\"],\n sending: [\"pane.focusNext\", \"app.quit\"],\n};\n\nconst FOOTER_LABELS: Record<CommandId, string> = {\n \"request.send\": \"Send\",\n \"request.cancel\": \"Cancel\",\n \"pane.focusNext\": \"Panes\",\n \"pane.focusPrev\": \"Prev pane\",\n \"pane.focusFiles\": \"Files pane\",\n \"pane.focusEditor\": \"Editor pane\",\n \"pane.focusResponse\": \"Response pane\",\n \"sidebar.toggle\": \"Sidebar\",\n \"file.save\": \"Save\",\n \"env.switcher\": \"Env\",\n \"env.selectNext\": \"Next env\",\n \"env.selectPrev\": \"Prev env\",\n \"env.apply\": \"Select\",\n \"overlay.close\": \"Close\",\n \"app.quit\": \"Quit\",\n \"palette.commands\": \"Palette\",\n \"palette.files\": \"Files\",\n \"help.show\": \"Help\",\n \"keybindings.show\": \"Keys\",\n \"pane.zoom\": \"Zoom\",\n \"response.tab.next\": \"Next tab\",\n \"response.tab.prev\": \"Prev tab\",\n \"response.copy\": \"Copy\",\n \"response.search\": \"Search\",\n \"response.jsonFoldToggle\": \"Fold\",\n \"response.jsonUnfoldAll\": \"Unfold\",\n \"editor.searchNext\": \"Find next\",\n};\n\nconst PREFERRED_FOOTER_KEYS: Record<CommandId, readonly string[]> = {\n \"request.send\": [\"F5\", \"ctrl+enter\", \"alt+enter\"],\n \"request.cancel\": [\"ctrl+x\"],\n \"pane.focusNext\": [\"tab\"],\n \"pane.focusPrev\": [\"shift+tab\"],\n \"pane.focusFiles\": [\"ctrl+1\", \"alt+1\"],\n \"pane.focusEditor\": [\"ctrl+2\", \"alt+2\"],\n \"pane.focusResponse\": [\"ctrl+3\", \"alt+3\"],\n \"sidebar.toggle\": [\"ctrl+b\"],\n \"file.save\": [\"ctrl+s\"],\n \"env.switcher\": [\"ctrl+e\"],\n \"env.selectNext\": [\"down\"],\n \"env.selectPrev\": [\"up\"],\n \"env.apply\": [\"enter\"],\n \"overlay.close\": [\"escape\"],\n \"app.quit\": [\"ctrl+q\"],\n \"palette.commands\": [\"F2\", \"ctrl+shift+p\"],\n \"palette.files\": [\"ctrl+p\"],\n \"help.show\": [\"F1\"],\n \"keybindings.show\": [\"ctrl+/\"],\n \"pane.zoom\": [\"F11\", \"z\"],\n \"response.tab.next\": [\"ctrl+tab\"],\n \"response.tab.prev\": [\"ctrl+shift+tab\"],\n \"response.copy\": [\"ctrl+shift+c\"],\n \"response.search\": [\"ctrl+f\"],\n \"response.jsonFoldToggle\": [\"ctrl+[\"],\n \"response.jsonUnfoldAll\": [\"ctrl+]\"],\n \"editor.searchNext\": [],\n};\n\nfunction commandKey(\n bindings: Readonly<Record<string, string>>,\n command: CommandId,\n): string | null {\n const keys = Object.entries(bindings)\n .filter(([, boundCommand]) => boundCommand === command)\n .map(([key]) => key);\n if (command === \"help.show\" && keys.length === 0) {\n return \"F1\";\n }\n if (keys.length === 0) {\n return null;\n }\n const preferred = PREFERRED_FOOTER_KEYS[command] ?? [];\n keys.sort((a, b) => {\n const aPreferred = preferred.indexOf(a);\n const bPreferred = preferred.indexOf(b);\n if (aPreferred !== -1 || bPreferred !== -1) {\n return (aPreferred === -1 ? Number.MAX_SAFE_INTEGER : aPreferred) -\n (bPreferred === -1 ? Number.MAX_SAFE_INTEGER : bPreferred);\n }\n return formatKeyChord(a).length - formatKeyChord(b).length || a.localeCompare(b);\n });\n return keys[0] ?? null;\n}\n\nfunction footerCommandList(context: FooterHintContext): CommandId[] {\n const action: CommandId = context.sending ? \"request.cancel\" : \"request.send\";\n let contextual: readonly CommandId[];\n if (context.overlay !== \"none\") {\n contextual = FOOTER_COMMANDS.overlay!;\n } else if (context.sending) {\n contextual = FOOTER_COMMANDS.sending!;\n } else {\n contextual = FOOTER_COMMANDS[context.focusPane] ?? FOOTER_COMMANDS.editor!;\n }\n\n const commands = [action, ...contextual];\n if (!context.hasResponse) {\n return commands.filter(\n (command) =>\n command !== \"response.copy\" &&\n command !== \"response.jsonFoldToggle\" &&\n command !== \"response.jsonUnfoldAll\",\n );\n }\n if (context.responseTab !== \"pretty\") {\n return commands.filter(\n (command) =>\n command !== \"response.jsonFoldToggle\" && command !== \"response.jsonUnfoldAll\",\n );\n }\n if (!context.hasFoldedJson) {\n return commands.filter((command) => command !== \"response.jsonUnfoldAll\");\n }\n return commands;\n}\n\nexport function footerHintItems(context: FooterHintContext): FooterHintItem[] {\n const bindings = context.bindings ?? {};\n const seen = new Set<CommandId>();\n const commands = [...footerCommandList(context), \"help.show\" as const].filter((command) => {\n if (command === \"help.show\") {\n seen.delete(command);\n }\n if (seen.has(command)) {\n return false;\n }\n seen.add(command);\n return true;\n });\n\n const items = commands.flatMap((command): FooterHintItem[] => {\n const key = commandKey(bindings, command);\n if (!key) {\n return [];\n }\n const formattedKey = command === \"help.show\" ? \"F1\" : formatKeyChord(key);\n return [{ command, key: formattedKey, label: `${formattedKey} ${FOOTER_LABELS[command]}` }];\n });\n\n const leftBudget = 48;\n const maxWidth = Math.max(20, context.viewportWidth - leftBudget);\n const pinned = items.filter(\n (item) => item.command === \"request.send\" || item.command === \"request.cancel\" || item.command === \"help.show\",\n );\n const middle = items.filter((item) => !pinned.includes(item));\n const selected: FooterHintItem[] = [];\n const append = (item: FooterHintItem) => {\n selected.push(item);\n };\n append(pinned[0] ?? items[0]!);\n for (const item of middle) {\n const candidate = [...selected, item, pinned[pinned.length - 1]!].filter(Boolean);\n if (candidate.map((entry) => entry.label).join(\" · \").length <= maxWidth) {\n append(item);\n }\n }\n const help = pinned.find((item) => item.command === \"help.show\");\n if (help && selected[selected.length - 1]?.command !== \"help.show\") {\n append(help);\n }\n return selected.filter(Boolean);\n}\n\nexport function footerHints(context: FooterHintContext): string {\n return footerHintItems(context)\n .map((item) => item.label)\n .join(\" · \");\n}\n\nexport const HELP_HINT_LINES: readonly string[] = [\n \"F5 Send request under cursor\",\n \"Tab / Shift+Tab Cycle panes\",\n \"Ctrl+S Save file\",\n \"Mouse click Place editor cursor · Shift+click Select\",\n \"Ctrl+A/C/X/V Select all, copy, cut, paste in editor\",\n \"Ctrl+E Environment switcher\",\n \"F2 / Ctrl+Shift+P Command palette\",\n \"Ctrl+Shift+C Copy response tab\",\n \"Ctrl+X Cancel request · Ctrl+Q Quit\",\n \"Ctrl+/ Full keybindings · F1 Quick help\",\n];\n","import { cli, io } from \"httpyac\";\nimport type { PromptHandler } from \"./types.js\";\n\nlet promptHandler: PromptHandler = async () => undefined;\n\nexport function setPromptHandler(handler: PromptHandler): void {\n promptHandler = handler;\n}\n\nexport function initEngineProviders(): void {\n cli.initFileProvider();\n io.userInteractionProvider.isTrusted = () => true;\n io.userInteractionProvider.showNote = async (message) => {\n const result = await promptHandler({ kind: \"confirm\", message });\n return result === true;\n };\n io.userInteractionProvider.showInputPrompt = async (message, defaultValue, masked) => {\n const result = await promptHandler({\n kind: \"input\",\n message,\n defaultValue,\n masked: masked ?? false,\n });\n return typeof result === \"string\" ? result : undefined;\n };\n io.userInteractionProvider.showListPrompt = async (message, values) => {\n const result = await promptHandler({ kind: \"list\", message, values });\n return typeof result === \"string\" ? result : undefined;\n };\n io.userInteractionProvider.showInformationMessage = async (message) => {\n await promptHandler({ kind: \"confirm\", message });\n return undefined;\n };\n io.userInteractionProvider.showWarnMessage = async (message) => {\n await promptHandler({ kind: \"confirm\", message });\n return undefined;\n };\n io.userInteractionProvider.showErrorMessage = async (message) => {\n await promptHandler({ kind: \"confirm\", message });\n return undefined;\n };\n}\n","import type { ParsedFile, RequestRegion } from \"./types.js\";\n\n/** Resolve the innermost request region containing a 0-based editor line. */\nexport function resolveRegionAtLine(\n regions: readonly RequestRegion[],\n line: number,\n): RequestRegion | null {\n const candidates = regions.filter(\n (region) =>\n region.hasRequest &&\n !region.isGlobal &&\n region.startLine <= line &&\n line <= region.endLine,\n );\n\n if (candidates.length === 0) {\n return null;\n }\n\n return candidates.reduce((best, current) => {\n const bestSpan = best.endLine - best.startLine;\n const currentSpan = current.endLine - current.startLine;\n if (currentSpan < bestSpan) {\n return current;\n }\n if (currentSpan === bestSpan && current.startLine > best.startLine) {\n return current;\n }\n return best;\n });\n}\n\nexport function regionContainsLine(region: RequestRegion, line: number): boolean {\n return line >= region.startLine && line <= region.endLine;\n}\n\n/** Active request region under the editor cursor. */\nexport function resolveActiveRegion(\n parsedFile: ParsedFile | null,\n cursorLine: number,\n): RequestRegion | null {\n if (!parsedFile) {\n return null;\n }\n return resolveRegionAtLine(parsedFile.regions, cursorLine);\n}\n\nconst HTTP_METHOD_PREFIX =\n /^\\s*(GET|POST|PUT|PATCH|DELETE|HEAD|OPTIONS|CONNECT|TRACE|GRAPHQL)\\b/u;\n\n/** First HTTP method line in the file, for initial editor placement. */\nexport function firstRequestLine(\n regions: readonly RequestRegion[],\n fileLines: readonly string[],\n): number | null {\n const firstRegion = regions.find((region) => region.hasRequest && !region.isGlobal);\n if (!firstRegion) {\n return null;\n }\n\n for (let line = firstRegion.startLine; line <= firstRegion.endLine; line++) {\n if (HTTP_METHOD_PREFIX.test(fileLines[line] ?? \"\")) {\n return line;\n }\n }\n\n return firstRegion.startLine;\n}\n\nfunction markerColumnAfterMethod(line: string): number {\n const match = HTTP_METHOD_PREFIX.exec(line);\n return match ? match[0].length : 0;\n}\n\nexport function buildRegionDiagnostics(\n regions: readonly RequestRegion[],\n activeRegionId: string | null,\n fileLines: readonly string[],\n): ReadonlyArray<{\n line: number;\n startColumn: number;\n endColumn: number;\n severity: \"info\" | \"hint\";\n message?: string;\n}> {\n const markers: Array<{\n line: number;\n startColumn: number;\n endColumn: number;\n severity: \"info\" | \"hint\";\n message?: string;\n }> = [];\n\n for (const region of regions) {\n if (!region.hasRequest || region.isGlobal) {\n continue;\n }\n const isActive = region.id === activeRegionId;\n const line = fileLines[region.startLine] ?? \"\";\n const markerCol = markerColumnAfterMethod(line);\n markers.push({\n line: region.startLine,\n startColumn: markerCol,\n endColumn: markerCol + 1,\n severity: isActive ? \"hint\" : \"info\",\n message: `${region.method ?? \"REQ\"} ${region.name}`,\n });\n }\n\n return markers;\n}\n","import { store as httpyacStoreModule } from \"httpyac\";\nimport type { HttpFile, HttpRegion } from \"httpyac/dist/models/index.js\";\n\nimport { loadEnvironmentConfig } from \"./env-config.js\";\nimport type { ParsedFile, RequestRegion } from \"./types.js\";\n\nconst store = new httpyacStoreModule.HttpFileStore();\nconst versions = new Map<string, number>();\n\nfunction toRegion(region: HttpRegion): RequestRegion {\n return {\n id: region.id,\n name: region.symbol.name,\n method: region.request?.method,\n url: region.request?.url,\n startLine: region.symbol.startLine,\n endLine: region.symbol.endLine,\n isGlobal: region.isGlobal(),\n hasRequest: Boolean(region.request),\n };\n}\n\nexport function bumpParseVersion(filePath: string): number {\n const next = (versions.get(filePath) ?? 0) + 1;\n versions.set(filePath, next);\n return next;\n}\n\nexport function getParseVersion(filePath: string): number {\n return versions.get(filePath) ?? 0;\n}\n\nexport async function parseFile(\n filePath: string,\n getText: () => Promise<string>,\n workingDir: string,\n version?: number,\n): Promise<ParsedFile> {\n const parseVersion = version ?? getParseVersion(filePath);\n const config = await loadEnvironmentConfig(filePath, workingDir);\n const httpFile = await store.getOrCreate(filePath, getText, parseVersion, {\n config,\n workingDir,\n });\n\n const regions = httpFile.httpRegions.map(toRegion);\n return {\n path: filePath,\n regions,\n version: parseVersion,\n };\n}\n\nexport function getHttpFile(filePath: string): HttpFile | undefined {\n return store.get(filePath);\n}\n\nexport function getHttpRegion(filePath: string, regionId: string): HttpRegion | undefined {\n const httpFile = store.get(filePath);\n return httpFile?.httpRegions.find((region: HttpRegion) => region.id === regionId);\n}\n\nexport { store as httpFileStore };\n","import fs from \"node:fs/promises\";\nimport path from \"node:path\";\n\nimport type { EnvironmentConfig, Variables } from \"httpyac/dist/models/index.js\";\n\nconst ENV_FILE_NAMES = [\n \".env.json\",\n \"http-client.env.json\",\n \"http-client.private.env.json\",\n] as const;\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction mergeVariables(\n target: Record<string, Variables>,\n source: Record<string, unknown>,\n): void {\n for (const [envName, variables] of Object.entries(source)) {\n if (!isRecord(variables)) {\n continue;\n }\n target[envName] = {\n ...(target[envName] ?? {}),\n ...variables,\n };\n }\n}\n\nfunction directoriesToSearch(filePath: string, workingDir: string): string[] {\n const root = path.resolve(workingDir);\n const dirs: string[] = [];\n let current = path.dirname(path.resolve(filePath));\n\n while (current.startsWith(root)) {\n dirs.unshift(current);\n const parent = path.dirname(current);\n if (parent === current) {\n break;\n }\n current = parent;\n }\n\n return dirs.length > 0 ? dirs : [path.dirname(path.resolve(filePath))];\n}\n\nasync function readEnvFile(filePath: string): Promise<Record<string, unknown> | null> {\n try {\n const raw = await fs.readFile(filePath, \"utf8\");\n const parsed = JSON.parse(raw) as unknown;\n return isRecord(parsed) ? parsed : null;\n } catch (error) {\n if (\n error &&\n typeof error === \"object\" &&\n \"code\" in error &&\n (error as { code?: string }).code === \"ENOENT\"\n ) {\n return null;\n }\n return null;\n }\n}\n\nexport async function loadEnvironmentConfig(\n filePath: string,\n workingDir: string,\n): Promise<EnvironmentConfig> {\n const environments: Record<string, Variables> = {};\n\n for (const dir of directoriesToSearch(filePath, workingDir)) {\n for (const fileName of ENV_FILE_NAMES) {\n const parsed = await readEnvFile(path.join(dir, fileName));\n if (parsed) {\n mergeVariables(environments, parsed);\n }\n }\n }\n\n return Object.keys(environments).length > 0 ? { environments } : {};\n}\n","import { getEnvironments, getVariables, send } from \"httpyac\";\nimport type { HttpResponse } from \"httpyac/dist/models/httpResponse.js\";\n\nimport { loadEnvironmentConfig } from \"./env-config.js\";\nimport { getHttpFile, getHttpRegion } from \"./store.js\";\nimport type { ExecResult, ResponseHeaderRow, TestResultDto } from \"./types.js\";\n\nfunction formatBody(body: unknown): string {\n if (body === undefined || body === null) {\n return \"\";\n }\n if (typeof body === \"string\") {\n return body;\n }\n if (Buffer.isBuffer(body)) {\n return body.toString(\"utf8\");\n }\n try {\n return JSON.stringify(body, null, 2);\n } catch {\n return String(body);\n }\n}\n\nfunction prettyBody(response: HttpResponse | undefined): string {\n if (!response) {\n return \"\";\n }\n if (response.prettyPrintBody) {\n return response.prettyPrintBody;\n }\n return formatBody(response.body);\n}\n\nfunction toHeaders(response: HttpResponse | undefined): ResponseHeaderRow[] {\n if (!response?.headers) {\n return [];\n }\n return Object.entries(response.headers).map(([name, value]) => ({\n name,\n value: Array.isArray(value) ? value.join(\", \") : String(value ?? \"\"),\n }));\n}\n\nfunction toTestResults(region: { testResults?: Array<{ message: string; status: string; error?: { displayMessage?: string } }> }): TestResultDto[] {\n if (!region.testResults) {\n return [];\n }\n return region.testResults.map((result) => ({\n message: result.message,\n status: result.status as TestResultDto[\"status\"],\n detail: result.error?.displayMessage,\n }));\n}\n\nexport async function sendRegion(options: {\n filePath: string;\n regionId: string;\n workingDir: string;\n activeEnvironment?: string[];\n variables?: Record<string, unknown>;\n}): Promise<ExecResult> {\n const httpFile = getHttpFile(options.filePath);\n const httpRegion = getHttpRegion(options.filePath, options.regionId);\n\n if (!httpFile || !httpRegion) {\n return {\n headers: [],\n body: \"\",\n prettyBody: \"\",\n testResults: [],\n error: \"Request region not found\",\n };\n }\n\n delete httpRegion.response;\n delete httpRegion.testResults;\n\n let capturedResponse: HttpResponse | undefined;\n const logResponse = async (response: HttpResponse | undefined) => {\n capturedResponse = response;\n };\n const config = await loadEnvironmentConfig(options.filePath, options.workingDir);\n\n try {\n await send({\n httpFile,\n httpRegion,\n activeEnvironment: options.activeEnvironment,\n config,\n variables: options.variables,\n logResponse,\n });\n\n const response = capturedResponse ?? httpRegion.response;\n return {\n statusCode: response?.statusCode,\n statusMessage: response?.statusMessage,\n protocol: response?.protocol,\n headers: toHeaders(response),\n body: formatBody(response?.body),\n prettyBody: prettyBody(response),\n durationMs: response?.timings?.total,\n testResults: toTestResults(httpRegion),\n };\n } catch (error) {\n return {\n headers: [],\n body: \"\",\n prettyBody: \"\",\n testResults: toTestResults(httpRegion),\n error: error instanceof Error ? error.message : String(error),\n };\n }\n}\n\nexport async function listEnvironments(filePath: string, workingDir: string): Promise<string[]> {\n const httpFile = getHttpFile(filePath);\n if (!httpFile) {\n return [];\n }\n const config = await loadEnvironmentConfig(filePath, workingDir);\n return getEnvironments({ httpFile, config });\n}\n\nexport async function listVariables(\n filePath: string,\n workingDir: string,\n activeEnvironment: string[] | undefined,\n): Promise<Record<string, unknown>> {\n const httpFile = getHttpFile(filePath);\n if (!httpFile) {\n return {};\n }\n const config = await loadEnvironmentConfig(filePath, workingDir);\n return getVariables({ httpFile, activeEnvironment, config });\n}\n","import type { BindingMap, KeyContext } from \"@rezi-ui/core\";\n\nimport type { AppState, CommandId } from \"../state/types.js\";\n\nexport type CommandExecutor<S extends AppState> = (command: CommandId, ctx: KeyContext<S>) => void;\n\nexport function buildBindingMap<S extends AppState>(\n bindings: Record<string, CommandId>,\n execute: CommandExecutor<S>,\n): BindingMap<KeyContext<S>> {\n const map: Record<string, (ctx: KeyContext<S>) => void> = {};\n\n for (const [key, command] of Object.entries(bindings)) {\n map[key] = (ctx) => execute(command, ctx);\n }\n\n return map;\n}\n\nexport function commandFromPaletteId(id: string): CommandId | null {\n const known: Record<string, CommandId> = {\n \"request.send\": \"request.send\",\n \"request.cancel\": \"request.cancel\",\n \"file.save\": \"file.save\",\n \"env.switcher\": \"env.switcher\",\n \"palette.commands\": \"palette.commands\",\n \"help.show\": \"help.show\",\n \"keybindings.show\": \"keybindings.show\",\n \"response.jsonFoldToggle\": \"response.jsonFoldToggle\",\n \"response.jsonUnfoldAll\": \"response.jsonUnfoldAll\",\n \"pane.zoom\": \"pane.zoom\",\n \"sidebar.toggle\": \"sidebar.toggle\",\n };\n return known[id] ?? null;\n}\n\nexport const COMMAND_ITEMS: ReadonlyArray<{\n id: CommandId;\n label: string;\n description: string;\n shortcut?: string;\n}> = [\n { id: \"request.send\", label: \"Send Request\", description: \"Send request under cursor\", shortcut: \"F5\" },\n { id: \"request.cancel\", label: \"Cancel Request\", description: \"Cancel in-flight request\", shortcut: \"Ctrl+X\" },\n { id: \"file.save\", label: \"Save File\", description: \"Write editor to disk\", shortcut: \"Ctrl+S\" },\n { id: \"env.switcher\", label: \"Switch Environment\", description: \"Choose active environment\", shortcut: \"Ctrl+E\" },\n { id: \"sidebar.toggle\", label: \"Toggle Sidebar\", description: \"Show/hide file tree\", shortcut: \"Ctrl+B\" },\n { id: \"response.jsonFoldToggle\", label: \"Fold/Unfold JSON\", description: \"Toggle JSON node in pretty response\", shortcut: \"Ctrl+[\" },\n { id: \"response.jsonUnfoldAll\", label: \"Unfold All JSON\", description: \"Expand folded pretty response JSON\", shortcut: \"Ctrl+]\" },\n { id: \"pane.zoom\", label: \"Zoom Pane\", description: \"Zoom focused pane\", shortcut: \"F11\" },\n { id: \"help.show\", label: \"Help\", description: \"Show quick help\", shortcut: \"F1\" },\n { id: \"keybindings.show\", label: \"Keybindings\", description: \"Show all keybindings\", shortcut: \"Ctrl+/\" },\n];\n","import { readFile, writeFile } from \"node:fs/promises\";\n\nimport chokidar, { type FSWatcher } from \"chokidar\";\nimport { EventEmitter } from \"node:events\";\n\nimport { discoverFileTree } from \"./discovery.js\";\nimport type { WorkspaceChangeEvent, WorkspaceFileNode } from \"./types.js\";\n\nexport class Workspace extends EventEmitter {\n readonly rootDir: string;\n private watcher: FSWatcher | null = null;\n private tree: WorkspaceFileNode[] = [];\n\n constructor(rootDir: string) {\n super();\n this.rootDir = rootDir;\n }\n\n async open(): Promise<WorkspaceFileNode[]> {\n this.tree = await discoverFileTree(this.rootDir);\n await this.startWatcher();\n this.emitChange({ type: \"ready\" });\n return this.tree;\n }\n\n getTree(): readonly WorkspaceFileNode[] {\n return this.tree;\n }\n\n async refresh(): Promise<WorkspaceFileNode[]> {\n this.tree = await discoverFileTree(this.rootDir);\n return this.tree;\n }\n\n async readFile(filePath: string): Promise<string> {\n return readFile(filePath, \"utf8\");\n }\n\n async writeFile(filePath: string, content: string): Promise<void> {\n await writeFile(filePath, content, \"utf8\");\n }\n\n async close(): Promise<void> {\n await this.watcher?.close();\n this.watcher = null;\n }\n\n private async startWatcher(): Promise<void> {\n await this.watcher?.close();\n this.watcher = chokidar.watch(this.rootDir, {\n ignoreInitial: true,\n ignored: [\n /(^|[/\\\\])\\../,\n \"**/node_modules/**\",\n \"**/.git/**\",\n \"**/dist/**\",\n ],\n awaitWriteFinish: { stabilityThreshold: 100, pollInterval: 50 },\n });\n\n const handle = async (type: WorkspaceChangeEvent[\"type\"], path: string) => {\n try {\n this.tree = await discoverFileTree(this.rootDir);\n this.emitChange({ type, path });\n } catch (error) {\n this.emit(\"error\", error instanceof Error ? error : new Error(String(error)));\n }\n };\n\n this.watcher.on(\"add\", (path) => void handle(\"add\", path));\n this.watcher.on(\"change\", (path) => void handle(\"change\", path));\n this.watcher.on(\"unlink\", (path) => void handle(\"unlink\", path));\n this.watcher.on(\"error\", (error) => {\n this.emit(\"error\", error instanceof Error ? error : new Error(String(error)));\n });\n }\n\n private emitChange(event: WorkspaceChangeEvent): void {\n this.emit(\"change\", event);\n }\n}\n\nexport { discoverFileTree, flattenFiles, findNodeByPath, isWorkspaceFile } from \"./discovery.js\";\n","import { readdir, stat } from \"node:fs/promises\";\nimport path from \"node:path\";\n\nimport type { WorkspaceFileKind, WorkspaceFileNode } from \"./types.js\";\n\nconst SKIP_DIRS = new Set([\n \".git\",\n \"node_modules\",\n \".reqex\",\n \"dist\",\n \".cursor\",\n]);\n\nconst FILE_KINDS: ReadonlyArray<{ ext: string; kind: WorkspaceFileKind }> = [\n { ext: \".http\", kind: \"http\" },\n { ext: \".rest\", kind: \"rest\" },\n { ext: \".env\", kind: \"env\" },\n { ext: \".env.json\", kind: \"env-json\" },\n];\n\nexport function classifyFile(filePath: string): WorkspaceFileKind | null {\n const base = path.basename(filePath);\n for (const { ext, kind } of FILE_KINDS) {\n if (base === ext || base.endsWith(ext)) {\n return kind;\n }\n }\n if (base.endsWith(\".env.json\")) {\n return \"env-json\";\n }\n return null;\n}\n\nexport function isWorkspaceFile(filePath: string): boolean {\n return classifyFile(filePath) !== null;\n}\n\nexport async function discoverFileTree(rootDir: string): Promise<WorkspaceFileNode[]> {\n return discoverDirectory(rootDir, rootDir);\n}\n\nasync function discoverDirectory(\n rootDir: string,\n currentDir: string,\n): Promise<WorkspaceFileNode[]> {\n let entries: string[];\n try {\n entries = await readdir(currentDir);\n } catch {\n return [];\n }\n\n entries.sort((a, b) => a.localeCompare(b));\n const nodes: WorkspaceFileNode[] = [];\n\n for (const entry of entries) {\n if (entry.startsWith(\".\") && entry !== \".env\" && !entry.endsWith(\".env.json\")) {\n if (SKIP_DIRS.has(entry)) {\n continue;\n }\n }\n\n const fullPath = path.join(currentDir, entry);\n let entryStat;\n try {\n entryStat = await stat(fullPath);\n } catch {\n continue;\n }\n\n if (entryStat.isDirectory()) {\n if (SKIP_DIRS.has(entry)) {\n continue;\n }\n const children = await discoverDirectory(rootDir, fullPath);\n if (children.length > 0) {\n nodes.push({\n name: entry,\n path: fullPath,\n kind: \"directory\",\n children,\n });\n }\n continue;\n }\n\n const fileKind = classifyFile(fullPath);\n if (!fileKind) {\n continue;\n }\n\n nodes.push({\n name: entry,\n path: fullPath,\n kind: \"file\",\n fileKind,\n });\n }\n\n return nodes;\n}\n\nexport function flattenFiles(nodes: readonly WorkspaceFileNode[]): WorkspaceFileNode[] {\n const files: WorkspaceFileNode[] = [];\n for (const node of nodes) {\n if (node.kind === \"file\") {\n files.push(node);\n } else if (node.children) {\n files.push(...flattenFiles(node.children));\n }\n }\n return files;\n}\n\nexport function findNodeByPath(\n nodes: readonly WorkspaceFileNode[],\n targetPath: string,\n): WorkspaceFileNode | null {\n for (const node of nodes) {\n if (node.path === targetPath) {\n return node;\n }\n if (node.children) {\n const found = findNodeByPath(node.children, targetPath);\n if (found) {\n return found;\n }\n }\n }\n return null;\n}\n\nexport function collectDirectoryPaths(nodes: readonly WorkspaceFileNode[]): string[] {\n const paths: string[] = [];\n for (const node of nodes) {\n if (node.kind === \"directory\") {\n paths.push(node.path);\n if (node.children) {\n paths.push(...collectDirectoryPaths(node.children));\n }\n }\n }\n return paths;\n}\n","import type { CursorPosition, EditorSelection } from \"@rezi-ui/core\";\n\nimport type { ExecResult, ParsedFile } from \"../engine/types.js\";\nimport type { WorkspaceFileNode } from \"../workspace/types.js\";\n\nexport type ThemePreference = \"auto\" | \"light\" | \"dark\";\nexport type ThemeMode = \"light\" | \"dark\";\nexport type FocusPane = \"files\" | \"editor\" | \"response\";\nexport type ResponseTab = \"pretty\" | \"raw\" | \"headers\" | \"variables\" | \"tests\";\nexport type OverlayKind = \"none\" | \"env\" | \"help\" | \"keybindings\" | \"commandPalette\" | \"filePicker\";\nexport type LayoutMode = \"three-pane\" | \"sidebar-overlay\" | \"stacked\";\n\nexport type AppState = Readonly<{\n workspaceRoot: string;\n fileTree: readonly WorkspaceFileNode[];\n expandedPaths: readonly string[];\n selectedFilePath: string | null;\n fileContent: string;\n fileLines: readonly string[];\n dirty: boolean;\n parseVersion: number;\n parsedFile: ParsedFile | null;\n responseEditor: Readonly<{\n scrollTop: number;\n scrollLeft: number;\n cursor: CursorPosition;\n selection: EditorSelection | null;\n foldedJsonPaths: readonly string[];\n }>;\n resultGeneration: number;\n editor: Readonly<{\n cursor: CursorPosition;\n selection: EditorSelection | null;\n scrollTop: number;\n scrollLeft: number;\n searchQuery: string;\n }>;\n request: Readonly<{\n sending: boolean;\n error: string | null;\n result: ExecResult | null;\n activeEnvironment: readonly string[];\n environments: readonly string[];\n variables: Record<string, unknown>;\n }>;\n ui: Readonly<{\n focusPane: FocusPane;\n zoomPane: FocusPane | null;\n sidebarVisible: boolean;\n layoutMode: LayoutMode;\n viewportWidth: number;\n viewportHeight: number;\n overlay: OverlayKind;\n responseTab: ResponseTab;\n splitSizes: readonly [number, number, number];\n envSelectedIndex: number;\n commandPalette: Readonly<{\n open: boolean;\n query: string;\n selectedIndex: number;\n }>;\n pendingPrompt: Readonly<{\n kind: \"confirm\" | \"input\" | \"list\";\n message: string;\n values?: readonly string[];\n defaultValue?: string;\n masked?: boolean;\n }> | null;\n statusMessage: string | null;\n gitBranch: string | null;\n }>;\n settings: Readonly<{\n keymapPreset: \"vscode\" | \"vim\";\n keybindings: Readonly<Record<string, string>>;\n theme: ThemePreference;\n themeMode: ThemeMode;\n }>;\n}>;\n\nexport type CommandContext = Readonly<{\n state: Readonly<AppState>;\n update: (updater: AppState | ((prev: Readonly<AppState>) => AppState)) => void;\n runSend: () => Promise<void>;\n openFile: (path: string) => Promise<void>;\n saveFile: () => Promise<void>;\n refreshWorkspace: () => Promise<void>;\n reloadKeybindings: () => void;\n quit: () => void;\n}>;\n\nexport type CommandId =\n | \"request.send\"\n | \"request.cancel\"\n | \"pane.focusNext\"\n | \"pane.focusPrev\"\n | \"pane.focusFiles\"\n | \"pane.focusEditor\"\n | \"pane.focusResponse\"\n | \"sidebar.toggle\"\n | \"file.save\"\n | \"env.switcher\"\n | \"env.selectNext\"\n | \"env.selectPrev\"\n | \"env.apply\"\n | \"overlay.close\"\n | \"app.quit\"\n | \"palette.commands\"\n | \"palette.files\"\n | \"help.show\"\n | \"keybindings.show\"\n | \"pane.zoom\"\n | \"response.tab.next\"\n | \"response.tab.prev\"\n | \"response.copy\"\n | \"response.search\"\n | \"response.jsonFoldToggle\"\n | \"response.jsonUnfoldAll\"\n | \"editor.searchNext\";\n\nexport const FOCUS_PANES: readonly FocusPane[] = [\"files\", \"editor\", \"response\"];\nexport const RESPONSE_TABS: readonly ResponseTab[] = [\n \"pretty\",\n \"raw\",\n \"headers\",\n \"variables\",\n \"tests\",\n];\n\nexport function createInitialState(workspaceRoot: string): AppState {\n return {\n workspaceRoot,\n fileTree: [],\n expandedPaths: [],\n selectedFilePath: null,\n fileContent: \"\",\n fileLines: [\"\"],\n dirty: false,\n parseVersion: 0,\n parsedFile: null,\n responseEditor: {\n scrollTop: 0,\n scrollLeft: 0,\n cursor: { line: 0, column: 0 },\n selection: null,\n foldedJsonPaths: [],\n },\n resultGeneration: 0,\n editor: {\n cursor: { line: 0, column: 0 },\n selection: null,\n scrollTop: 0,\n scrollLeft: 0,\n searchQuery: \"\",\n },\n request: {\n sending: false,\n error: null,\n result: null,\n activeEnvironment: [],\n environments: [],\n variables: {},\n },\n ui: {\n focusPane: \"editor\",\n zoomPane: null,\n sidebarVisible: true,\n layoutMode: \"three-pane\",\n viewportWidth: 120,\n viewportHeight: 40,\n overlay: \"none\",\n responseTab: \"pretty\",\n splitSizes: [22, 40, 38],\n envSelectedIndex: 0,\n commandPalette: { open: false, query: \"\", selectedIndex: 0 },\n pendingPrompt: null,\n statusMessage: null,\n gitBranch: null,\n },\n settings: {\n keymapPreset: \"vscode\",\n keybindings: {},\n theme: \"auto\",\n themeMode: \"dark\",\n },\n };\n}\n\nexport function linesFromContent(content: string): string[] {\n if (content.length === 0) {\n return [\"\"];\n }\n return content.split(/\\r?\\n/u);\n}\n\nexport function contentFromLines(lines: readonly string[]): string {\n return lines.join(\"\\n\");\n}\n\nexport function resolveLayoutMode(width: number): LayoutMode {\n if (width < 80) {\n return \"stacked\";\n }\n if (width < 120) {\n return \"sidebar-overlay\";\n }\n return \"three-pane\";\n}\n\nexport function nextPane(current: FocusPane): FocusPane {\n const index = FOCUS_PANES.indexOf(current);\n return FOCUS_PANES[(index + 1) % FOCUS_PANES.length] ?? \"editor\";\n}\n\nexport function prevPane(current: FocusPane): FocusPane {\n const index = FOCUS_PANES.indexOf(current);\n return FOCUS_PANES[(index + FOCUS_PANES.length - 1) % FOCUS_PANES.length] ?? \"editor\";\n}\n\nexport function nextResponseTab(current: ResponseTab): ResponseTab {\n const index = RESPONSE_TABS.indexOf(current);\n return RESPONSE_TABS[(index + 1) % RESPONSE_TABS.length] ?? \"pretty\";\n}\n\nexport function prevResponseTab(current: ResponseTab): ResponseTab {\n const index = RESPONSE_TABS.indexOf(current);\n return RESPONSE_TABS[(index + RESPONSE_TABS.length - 1) % RESPONSE_TABS.length] ?? \"pretty\";\n}\n","export type SendController = Readonly<{\n beginSend: () => number;\n cancelSend: () => number;\n isCurrent: (generation: number) => boolean;\n}>;\n\nexport function createSendController(): SendController {\n let sendGeneration = 0;\n\n return {\n beginSend(): number {\n sendGeneration += 1;\n return sendGeneration;\n },\n cancelSend(): number {\n sendGeneration += 1;\n return sendGeneration;\n },\n isCurrent(generation: number): boolean {\n return generation === sendGeneration;\n },\n };\n}\n","import type { CodeEditorSyntaxToken, CodeEditorTokenizeContext } from \"@rezi-ui/core\";\n\nconst KEYWORDS = new Set([\n \"GET\",\n \"POST\",\n \"PUT\",\n \"PATCH\",\n \"DELETE\",\n \"HEAD\",\n \"OPTIONS\",\n \"CONNECT\",\n \"TRACE\",\n \"GRAPHQL\",\n]);\n\nexport function tokenizeHttpLine(\n line: string,\n _context: CodeEditorTokenizeContext,\n): readonly CodeEditorSyntaxToken[] {\n const tokens: CodeEditorSyntaxToken[] = [];\n const methodMatch = /^\\s*(GET|POST|PUT|PATCH|DELETE|HEAD|OPTIONS|CONNECT|TRACE|GRAPHQL)\\b/u.exec(\n line,\n );\n if (methodMatch) {\n const method = methodMatch[1] ?? \"\";\n tokens.push({ text: method, kind: \"keyword\" });\n const rest = line.slice(methodMatch[0].length);\n if (rest.length > 0) {\n tokens.push({ text: rest, kind: \"string\" });\n }\n return tokens;\n }\n\n if (/^\\s*#/u.test(line)) {\n return [{ text: line, kind: \"comment\" }];\n }\n if (/^\\s*\\/\\//u.test(line)) {\n return [{ text: line, kind: \"comment\" }];\n }\n if (/^\\s*@/u.test(line)) {\n return [{ text: line, kind: \"type\" }];\n }\n\n const headerMatch = /^\\s*([!#$%&'*+\\-.^_`|~0-9A-Za-z]+)(\\s*:\\s*)(.*)$/u.exec(line);\n if (headerMatch) {\n tokens.push({ text: headerMatch[1] ?? \"\", kind: \"function\" });\n tokens.push({ text: headerMatch[2] ?? \"\", kind: \"operator\" });\n tokens.push({ text: headerMatch[3] ?? \"\", kind: \"string\" });\n return tokens;\n }\n\n const words = line.split(/(\\s+)/u);\n for (const word of words) {\n if (KEYWORDS.has(word)) {\n tokens.push({ text: word, kind: \"keyword\" });\n } else if (word.length > 0) {\n tokens.push({ text: word, kind: \"plain\" });\n }\n }\n return tokens.length > 0 ? tokens : [{ text: line, kind: \"plain\" }];\n}\n\nexport function prettyJsonIfPossible(text: string): string {\n const trimmed = text.trim();\n if (!trimmed) {\n return text;\n }\n try {\n return JSON.stringify(JSON.parse(trimmed), null, 2);\n } catch {\n return text;\n }\n}\n\nexport function methodColor(method: string | undefined): \"green\" | \"yellow\" | \"red\" | \"cyan\" {\n switch ((method ?? \"GET\").toUpperCase()) {\n case \"GET\":\n case \"HEAD\":\n case \"OPTIONS\":\n return \"green\";\n case \"POST\":\n case \"PUT\":\n case \"PATCH\":\n return \"yellow\";\n case \"DELETE\":\n return \"red\";\n default:\n return \"cyan\";\n }\n}\n\nexport function statusTone(statusCode: number | undefined): \"green\" | \"yellow\" | \"red\" | \"cyan\" {\n if (!statusCode) {\n return \"cyan\";\n }\n if (statusCode >= 200 && statusCode < 300) {\n return \"green\";\n }\n if (statusCode >= 400 && statusCode < 500) {\n return \"yellow\";\n }\n if (statusCode >= 500) {\n return \"red\";\n }\n return \"cyan\";\n}\n","export type FoldableJsonView = Readonly<{\n lines: readonly string[];\n lineToFoldPath: readonly (string | null)[];\n}>;\n\nconst INDENT = 2;\n\nfunction escapeJsonPointerSegment(segment: string): string {\n return segment.replace(/~/gu, \"~0\").replace(/\\//gu, \"~1\");\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction primitiveToJson(value: unknown): string {\n return JSON.stringify(value);\n}\n\nfunction summarizeFolded(value: unknown): string {\n if (Array.isArray(value)) {\n return `${value.length} ${value.length === 1 ? \"item\" : \"items\"}`;\n }\n if (isRecord(value)) {\n const count = Object.keys(value).length;\n return `${count} ${count === 1 ? \"property\" : \"properties\"}`;\n }\n return \"\";\n}\n\nfunction renderValue(args: {\n value: unknown;\n path: string;\n parentPath: string | null;\n key?: string;\n indent: number;\n isLast: boolean;\n foldedPaths: ReadonlySet<string>;\n lines: string[];\n lineToFoldPath: Array<string | null>;\n}): void {\n const { value, path, parentPath, key, indent, isLast, foldedPaths, lines, lineToFoldPath } = args;\n const leading = \" \".repeat(indent);\n const keyPrefix = key === undefined ? \"\" : `${JSON.stringify(key)}: `;\n const comma = isLast ? \"\" : \",\";\n\n if (Array.isArray(value) || isRecord(value)) {\n const isArray = Array.isArray(value);\n const open = isArray ? \"[\" : \"{\";\n const close = isArray ? \"]\" : \"}\";\n const entries = isArray ? value.map((item, index) => [String(index), item] as const) : Object.entries(value);\n\n if (entries.length === 0) {\n lines.push(`${leading}${keyPrefix}${open}${close}${comma}`);\n lineToFoldPath.push(parentPath);\n return;\n }\n\n if (foldedPaths.has(path)) {\n lines.push(`${leading}${keyPrefix}${open} ... ${summarizeFolded(value)} ${close}${comma}`);\n lineToFoldPath.push(path);\n return;\n }\n\n lines.push(`${leading}${keyPrefix}${open}`);\n lineToFoldPath.push(path);\n\n entries.forEach(([entryKey, entryValue], index) => {\n const childPath = `${path}/${escapeJsonPointerSegment(entryKey)}`;\n renderValue({\n value: entryValue,\n path: childPath,\n parentPath: path,\n key: isArray ? undefined : entryKey,\n indent: indent + INDENT,\n isLast: index === entries.length - 1,\n foldedPaths,\n lines,\n lineToFoldPath,\n });\n });\n\n lines.push(`${leading}${close}${comma}`);\n lineToFoldPath.push(path);\n return;\n }\n\n lines.push(`${leading}${keyPrefix}${primitiveToJson(value)}${comma}`);\n lineToFoldPath.push(parentPath);\n}\n\nexport function buildFoldableJsonView(\n text: string,\n foldedPaths: readonly string[],\n): FoldableJsonView {\n try {\n const value = JSON.parse(text.trim()) as unknown;\n const lines: string[] = [];\n const lineToFoldPath: Array<string | null> = [];\n renderValue({\n value,\n path: \"\",\n parentPath: null,\n indent: 0,\n isLast: true,\n foldedPaths: new Set(foldedPaths),\n lines,\n lineToFoldPath,\n });\n return { lines, lineToFoldPath };\n } catch {\n return { lines: text.split(\"\\n\"), lineToFoldPath: text.split(\"\\n\").map(() => null) };\n }\n}\n\nexport function toggleJsonFoldAtLine(\n text: string,\n foldedPaths: readonly string[],\n line: number,\n): readonly string[] {\n const view = buildFoldableJsonView(text, foldedPaths);\n const path = view.lineToFoldPath[line] ?? null;\n if (path === null) {\n return foldedPaths;\n }\n\n const next = new Set(foldedPaths);\n if (next.has(path)) {\n next.delete(path);\n } else {\n next.add(path);\n }\n return [...next].sort();\n}\n","import {\n bumpParseVersion,\n listEnvironments,\n listVariables,\n parseFile,\n firstRequestLine,\n resolveActiveRegion,\n sendRegion,\n setPromptHandler,\n} from \"../engine/index.js\";\nimport { flattenFiles, type Workspace } from \"../workspace/index.js\";\nimport {\n contentFromLines,\n createInitialState,\n linesFromContent,\n nextPane,\n prevPane,\n prevResponseTab,\n nextResponseTab,\n type AppState,\n type CommandContext,\n type CommandId,\n type FocusPane,\n} from \"./types.js\";\nimport { createSendController } from \"./send-controller.js\";\nimport { prettyJsonIfPossible } from \"../utils/http-syntax.js\";\nimport { buildFoldableJsonView, toggleJsonFoldAtLine } from \"../utils/json-folding.js\";\n\nexport function envNameFromSelectedIndex(\n environments: readonly string[],\n selectedIndex: number,\n): string | undefined {\n return selectedIndex === 0 ? undefined : environments[selectedIndex - 1];\n}\n\nexport function envSelectedIndexFromActive(\n environments: readonly string[],\n activeEnvironment: readonly string[],\n): number {\n if (activeEnvironment.length === 0) {\n return 0;\n }\n const idx = environments.indexOf(activeEnvironment[0]!);\n return idx === -1 ? 0 : idx + 1;\n}\n\nexport function createCommandContext(deps: {\n workspace: Workspace;\n update: CommandContext[\"update\"];\n getState: () => AppState;\n quit: () => void;\n reloadKeybindings: () => void;\n}): CommandBus {\n setPromptHandler(async (request) => {\n return new Promise((resolve) => {\n deps.update((state) => ({\n ...state,\n ui: {\n ...state.ui,\n overlay: \"none\",\n pendingPrompt: {\n kind: request.kind,\n message: request.message,\n values: request.kind === \"list\" ? request.values : undefined,\n defaultValue: request.kind === \"input\" ? request.defaultValue : undefined,\n masked: request.kind === \"input\" ? request.masked : undefined,\n },\n },\n }));\n promptResolvers.push(resolve);\n });\n });\n\n const promptResolvers: Array<(value: string | boolean | undefined) => void> = [];\n const sendController = createSendController();\n\n const resolvePrompt = (value: string | boolean | undefined) => {\n const resolver = promptResolvers.pop();\n resolver?.(value);\n deps.update((state) => ({\n ...state,\n ui: { ...state.ui, pendingPrompt: null },\n }));\n };\n\n const openFile = async (path: string) => {\n const content = await deps.workspace.readFile(path);\n const lines = linesFromContent(content);\n const parsed = await parseFile(path, async () => content, deps.workspace.rootDir);\n const environments = await listEnvironments(path, deps.workspace.rootDir);\n const variables = await listVariables(path, deps.workspace.rootDir, [\n ...deps.getState().request.activeEnvironment,\n ]);\n const initialLine = firstRequestLine(parsed.regions, lines) ?? 0;\n\n deps.update((state) => ({\n ...state,\n selectedFilePath: path,\n fileContent: content,\n fileLines: lines,\n dirty: false,\n parseVersion: parsed.version,\n parsedFile: parsed,\n editor: {\n ...state.editor,\n cursor: { line: initialLine, column: 0 },\n selection: null,\n scrollTop: initialLine,\n },\n request: {\n ...state.request,\n error: null,\n result: null,\n environments,\n variables,\n },\n ui: {\n ...state.ui,\n focusPane: \"editor\",\n statusMessage: null,\n },\n }));\n };\n\n const refreshWorkspace = async () => {\n const tree = await deps.workspace.refresh();\n deps.update((state) => ({ ...state, fileTree: tree }));\n };\n\n const saveFile = async () => {\n const state = deps.getState();\n if (!state.selectedFilePath || !state.dirty) {\n return;\n }\n const content = contentFromLines(state.fileLines);\n await deps.workspace.writeFile(state.selectedFilePath, content);\n const version = bumpParseVersion(state.selectedFilePath);\n const parsed = await parseFile(\n state.selectedFilePath,\n async () => content,\n deps.workspace.rootDir,\n version,\n );\n deps.update((s) => ({\n ...s,\n fileContent: content,\n dirty: false,\n parsedFile: parsed,\n ui: { ...s.ui, statusMessage: \"Saved\" },\n }));\n };\n\n const runSend = async () => {\n const state = deps.getState();\n if (!state.selectedFilePath) {\n return;\n }\n\n const cursorLine = state.editor.cursor.line;\n const content = contentFromLines(state.fileLines);\n let parsedFile = state.parsedFile;\n if (!parsedFile || state.dirty) {\n const version = bumpParseVersion(state.selectedFilePath);\n parsedFile = await parseFile(\n state.selectedFilePath,\n async () => content,\n deps.workspace.rootDir,\n version,\n );\n deps.update((s) => ({\n ...s,\n parsedFile,\n parseVersion: parsedFile!.version,\n }));\n }\n\n const region = resolveActiveRegion(parsedFile, cursorLine);\n if (!region) {\n deps.update((s) => ({\n ...s,\n request: { ...s.request, error: \"No request region under cursor\" },\n ui: { ...s.ui, focusPane: \"response\" },\n }));\n return;\n }\n\n const gen = sendController.beginSend();\n\n deps.update((s) => ({\n ...s,\n request: { ...s.request, sending: true, error: null, result: null },\n responseEditor: {\n scrollTop: 0,\n scrollLeft: 0,\n cursor: { line: 0, column: 0 },\n selection: null,\n foldedJsonPaths: [],\n },\n resultGeneration: s.resultGeneration + 1,\n ui: { ...s.ui, focusPane: \"response\", responseTab: \"pretty\" },\n }));\n\n await new Promise<void>((resolve) => setImmediate(resolve));\n\n const result = await sendRegion({\n filePath: state.selectedFilePath,\n regionId: region.id,\n workingDir: deps.workspace.rootDir,\n activeEnvironment: [...state.request.activeEnvironment],\n variables: state.request.variables,\n });\n\n if (!sendController.isCurrent(gen)) {\n return;\n }\n\n const variables = await listVariables(\n state.selectedFilePath,\n deps.workspace.rootDir,\n [...deps.getState().request.activeEnvironment],\n );\n\n if (!sendController.isCurrent(gen)) {\n return;\n }\n\n deps.update((s) => ({\n ...s,\n request: {\n ...s.request,\n sending: false,\n result,\n error: result.error ?? null,\n variables,\n },\n }));\n };\n\n const focusPane = (pane: FocusPane) => {\n deps.update((state) => ({\n ...state,\n ui: { ...state.ui, focusPane: pane },\n }));\n };\n\n const execute = (command: CommandId) => {\n const state = deps.getState();\n\n switch (command) {\n case \"request.send\":\n void runSend();\n break;\n case \"request.cancel\":\n if (!state.request.sending) {\n break;\n }\n sendController.cancelSend();\n deps.update((s) => ({\n ...s,\n request: {\n ...s.request,\n sending: false,\n error: \"Request cancelled\",\n result: null,\n },\n ui: { ...s.ui, statusMessage: \"Request cancelled\" },\n }));\n break;\n case \"pane.focusNext\":\n focusPane(nextPane(state.ui.focusPane));\n break;\n case \"pane.focusPrev\":\n focusPane(prevPane(state.ui.focusPane));\n break;\n case \"pane.focusFiles\":\n focusPane(\"files\");\n break;\n case \"pane.focusEditor\":\n focusPane(\"editor\");\n break;\n case \"pane.focusResponse\":\n focusPane(\"response\");\n break;\n case \"sidebar.toggle\":\n deps.update((s) => ({\n ...s,\n ui: { ...s.ui, sidebarVisible: !s.ui.sidebarVisible },\n }));\n break;\n case \"file.save\":\n void saveFile();\n break;\n case \"env.switcher\":\n deps.update((s) => ({\n ...s,\n ui: {\n ...s.ui,\n overlay: s.ui.overlay === \"env\" ? \"none\" : \"env\",\n envSelectedIndex: envSelectedIndexFromActive(\n s.request.environments,\n s.request.activeEnvironment,\n ),\n },\n }));\n break;\n case \"env.selectNext\":\n if (state.ui.overlay === \"env\") {\n deps.update((s) => ({\n ...s,\n ui: {\n ...s.ui,\n envSelectedIndex: Math.min(\n s.request.environments.length,\n s.ui.envSelectedIndex + 1,\n ),\n },\n }));\n }\n break;\n case \"env.selectPrev\":\n if (state.ui.overlay === \"env\") {\n deps.update((s) => ({\n ...s,\n ui: {\n ...s.ui,\n envSelectedIndex: Math.max(0, s.ui.envSelectedIndex - 1),\n },\n }));\n }\n break;\n case \"env.apply\": {\n const envName = envNameFromSelectedIndex(\n state.request.environments,\n state.ui.envSelectedIndex,\n );\n void (async () => {\n const activeEnvironment = envName ? [envName] : [];\n const variables = state.selectedFilePath\n ? await listVariables(state.selectedFilePath, deps.workspace.rootDir, activeEnvironment)\n : {};\n deps.update((s) => ({\n ...s,\n request: { ...s.request, activeEnvironment, variables },\n ui: { ...s.ui, overlay: \"none\" },\n }));\n })();\n break;\n }\n case \"overlay.close\":\n deps.update((s) => ({\n ...s,\n ui: {\n ...s.ui,\n overlay: \"none\",\n commandPalette: { ...s.ui.commandPalette, open: false },\n pendingPrompt: null,\n },\n }));\n resolvePrompt(undefined);\n break;\n case \"app.quit\":\n deps.quit();\n break;\n case \"palette.commands\":\n deps.update((s) => ({\n ...s,\n ui: {\n ...s.ui,\n overlay: \"commandPalette\",\n commandPalette: { open: true, query: \"\", selectedIndex: 0 },\n },\n }));\n break;\n case \"palette.files\": {\n const files = flattenFiles(state.fileTree).filter((node) => node.kind === \"file\");\n const first = files[0]?.path;\n if (first) {\n void openFile(first);\n }\n break;\n }\n case \"help.show\":\n deps.update((s) => ({\n ...s,\n ui: { ...s.ui, overlay: s.ui.overlay === \"help\" ? \"none\" : \"help\" },\n }));\n break;\n case \"keybindings.show\":\n deps.update((s) => ({\n ...s,\n ui: {\n ...s.ui,\n overlay: s.ui.overlay === \"keybindings\" ? \"none\" : \"keybindings\",\n },\n }));\n break;\n case \"pane.zoom\":\n deps.update((s) => ({\n ...s,\n ui: {\n ...s.ui,\n zoomPane: s.ui.zoomPane ? null : s.ui.focusPane,\n },\n }));\n break;\n case \"response.tab.next\":\n deps.update((s) => ({\n ...s,\n ui: { ...s.ui, responseTab: nextResponseTab(s.ui.responseTab) },\n }));\n break;\n case \"response.tab.prev\":\n deps.update((s) => ({\n ...s,\n ui: { ...s.ui, responseTab: prevResponseTab(s.ui.responseTab) },\n }));\n break;\n case \"response.copy\":\n deps.update((s) => ({\n ...s,\n ui: { ...s.ui, statusMessage: \"Copy requested (see clipboard handler)\" },\n }));\n break;\n case \"response.search\":\n deps.update((s) => ({\n ...s,\n ui: { ...s.ui, focusPane: \"response\", responseTab: \"pretty\" },\n }));\n break;\n case \"response.jsonFoldToggle\": {\n const result = state.request.result;\n if (!result || state.ui.responseTab !== \"pretty\") {\n break;\n }\n const text = prettyJsonIfPossible(result.prettyBody || result.body);\n const foldedJsonPaths = toggleJsonFoldAtLine(\n text,\n state.responseEditor.foldedJsonPaths,\n state.responseEditor.cursor.line,\n );\n if (foldedJsonPaths === state.responseEditor.foldedJsonPaths) {\n deps.update((s) => ({\n ...s,\n ui: { ...s.ui, statusMessage: \"No foldable JSON node\" },\n }));\n break;\n }\n const visibleLineCount = buildFoldableJsonView(text, foldedJsonPaths).lines.length;\n deps.update((s) => ({\n ...s,\n responseEditor: {\n ...s.responseEditor,\n foldedJsonPaths,\n cursor: {\n ...s.responseEditor.cursor,\n line: Math.min(s.responseEditor.cursor.line, Math.max(0, visibleLineCount - 1)),\n },\n },\n ui: { ...s.ui, focusPane: \"response\", statusMessage: \"JSON fold toggled\" },\n }));\n break;\n }\n case \"response.jsonUnfoldAll\":\n deps.update((s) => ({\n ...s,\n responseEditor: { ...s.responseEditor, foldedJsonPaths: [] },\n ui: { ...s.ui, focusPane: \"response\", statusMessage: \"JSON unfolded\" },\n }));\n break;\n case \"editor.searchNext\":\n break;\n default:\n break;\n }\n };\n\n const context: CommandContext & { execute: (command: CommandId) => void } = {\n get state() {\n return deps.getState();\n },\n update: deps.update,\n runSend,\n openFile,\n saveFile,\n refreshWorkspace,\n reloadKeybindings: deps.reloadKeybindings,\n quit: deps.quit,\n execute,\n };\n\n return context;\n}\n\nexport type CommandBus = CommandContext & { execute: (command: CommandId) => void };\n\nexport { createInitialState };\n","import type { CursorPosition, EditorSelection } from \"@rezi-ui/core\";\n\nfunction clamp(value: number, min: number, max: number): number {\n return Math.max(min, Math.min(max, value));\n}\n\nfunction clampCursor(lines: readonly string[], cursor: CursorPosition): CursorPosition {\n const lineCount = Math.max(1, lines.length);\n const line = clamp(cursor.line, 0, lineCount - 1);\n const text = lines[line] ?? \"\";\n return { line, column: clamp(cursor.column, 0, text.length) };\n}\n\nfunction normalizeSelection(selection: EditorSelection): readonly [CursorPosition, CursorPosition] {\n const { anchor, active } = selection;\n if (anchor.line < active.line || (anchor.line === active.line && anchor.column <= active.column)) {\n return [anchor, active];\n }\n return [active, anchor];\n}\n\nfunction deleteSelection(\n lines: readonly string[],\n selection: EditorSelection,\n): Readonly<{ lines: readonly string[]; cursor: CursorPosition }> {\n const nextLines = [...lines];\n if (nextLines.length === 0) {\n nextLines.push(\"\");\n }\n\n const [rawStart, rawEnd] = normalizeSelection(selection);\n const start = clampCursor(nextLines, rawStart);\n const end = clampCursor(nextLines, rawEnd);\n const startLine = nextLines[start.line] ?? \"\";\n const endLine = nextLines[end.line] ?? \"\";\n\n if (start.line === end.line) {\n nextLines[start.line] = startLine.slice(0, start.column) + startLine.slice(end.column);\n return { lines: nextLines, cursor: start };\n }\n\n nextLines.splice(\n start.line,\n end.line - start.line + 1,\n startLine.slice(0, start.column) + endLine.slice(end.column),\n );\n return { lines: nextLines, cursor: start };\n}\n\nfunction insertText(\n lines: readonly string[],\n cursor: CursorPosition,\n text: string,\n): Readonly<{ lines: readonly string[]; cursor: CursorPosition }> {\n const nextLines = [...lines];\n if (nextLines.length === 0) {\n nextLines.push(\"\");\n }\n\n const safeCursor = clampCursor(nextLines, cursor);\n const currentLine = nextLines[safeCursor.line] ?? \"\";\n const before = currentLine.slice(0, safeCursor.column);\n const after = currentLine.slice(safeCursor.column);\n const insertLines = text.replace(/\\r\\n?/gu, \"\\n\").split(\"\\n\");\n\n if (insertLines.length === 1) {\n const inserted = insertLines[0] ?? \"\";\n nextLines[safeCursor.line] = before + inserted + after;\n return {\n lines: nextLines,\n cursor: { line: safeCursor.line, column: safeCursor.column + inserted.length },\n };\n }\n\n const first = before + (insertLines[0] ?? \"\");\n const lastInsert = insertLines[insertLines.length - 1] ?? \"\";\n const last = lastInsert + after;\n nextLines.splice(safeCursor.line, 1, first, ...insertLines.slice(1, -1), last);\n\n return {\n lines: nextLines,\n cursor: {\n line: safeCursor.line + insertLines.length - 1,\n column: lastInsert.length,\n },\n };\n}\n\nexport function pasteIntoEditor(args: Readonly<{\n lines: readonly string[];\n cursor: CursorPosition;\n selection: EditorSelection | null;\n text: string;\n}>): Readonly<{ lines: readonly string[]; cursor: CursorPosition; selection: null }> {\n const base = args.selection\n ? deleteSelection(args.lines, args.selection)\n : { lines: args.lines, cursor: args.cursor };\n const next = insertText(base.lines, base.cursor, args.text);\n return { ...next, selection: null };\n}\n","import {\n darkTheme,\n lightTheme,\n resolveColorToken,\n type ThemeDefinition,\n} from \"@rezi-ui/core\";\n\nimport type { ThemeMode } from \"../utils/terminal-theme.js\";\n\nfunction token(theme: ThemeDefinition, path: Parameters<typeof resolveColorToken>[1]): number {\n return resolveColorToken(theme, path) ?? 0;\n}\n\nexport function themeForMode(mode: ThemeMode): ThemeDefinition {\n return mode === \"light\" ? lightTheme : darkTheme;\n}\n\nexport type ThemeColors = Readonly<{\n bgBase: number;\n bgElevated: number;\n bgSubtle: number;\n fgPrimary: number;\n paneFocused: number;\n paneMuted: number;\n selected: number;\n dirty: number;\n success: number;\n warning: number;\n error: number;\n info: number;\n}>;\n\nexport function colorsFor(theme: ThemeDefinition): ThemeColors {\n return {\n bgBase: token(theme, \"bg.base\"),\n bgElevated: token(theme, \"bg.elevated\"),\n bgSubtle: token(theme, \"bg.subtle\"),\n fgPrimary: token(theme, \"fg.primary\"),\n paneFocused: token(theme, \"accent.secondary\"),\n paneMuted: token(theme, \"fg.muted\"),\n selected: token(theme, \"accent.primary\"),\n dirty: token(theme, \"warning\"),\n success: token(theme, \"success\"),\n warning: token(theme, \"warning\"),\n error: token(theme, \"error\"),\n info: token(theme, \"info\"),\n };\n}\n\nexport function colorsForMode(mode: ThemeMode): ThemeColors {\n return colorsFor(themeForMode(mode));\n}\n\nexport function statusColorForTone(\n colors: ThemeColors,\n tone: \"green\" | \"yellow\" | \"red\" | \"cyan\",\n): number {\n switch (tone) {\n case \"green\":\n return colors.success;\n case \"yellow\":\n return colors.warning;\n case \"red\":\n return colors.error;\n default:\n return colors.info;\n }\n}\n","import path from \"node:path\";\n\nimport {\n ui,\n type CursorPosition,\n type EditorSelection,\n type VNode,\n} from \"@rezi-ui/core\";\n\nimport { resolveActiveRegion } from \"../engine/index.js\";\nimport {\n buildKeybindingsViewLines,\n footerHintItems,\n HELP_HINT_LINES,\n} from \"../config/keybindings.js\";\nimport { COMMAND_ITEMS } from \"../keymap/index.js\";\nimport type { AppState, CommandId, FocusPane } from \"../state/types.js\";\nimport { contentFromLines, resolveLayoutMode } from \"../state/types.js\";\nimport type { WorkspaceFileNode } from \"../workspace/types.js\";\nimport { colorsForMode, statusColorForTone, type ThemeColors } from \"./theme-colors.js\";\nimport {\n createRegionAwareTokenizer,\n editorCursorFromSource,\n editorSelectionFromSource,\n prefixEditorLines,\n} from \"./editor-gutter.js\";\nimport { methodColor, prettyJsonIfPossible, statusTone } from \"../utils/http-syntax.js\";\nimport { buildFoldableJsonView } from \"../utils/json-folding.js\";\n\nexport type ViewDeps = Readonly<{\n onEditorChange: (lines: readonly string[], cursor: CursorPosition) => void;\n onEditorSelection: (selection: EditorSelection | null) => void;\n onEditorScroll: (scrollTop: number, scrollLeft: number) => void;\n onTreeSelect: (node: WorkspaceFileNode) => void;\n onTreeToggle: (node: WorkspaceFileNode, expanded: boolean) => void;\n onTreePress: (node: WorkspaceFileNode) => void;\n onResponseTab: (tab: AppState[\"ui\"][\"responseTab\"]) => void;\n onResponseScroll: (scrollTop: number, scrollLeft: number) => void;\n onResponseSelection: (selection: EditorSelection | null) => void;\n onResponseChange: (cursor: CursorPosition) => void;\n onResponseJsonFoldToggle: () => void;\n onResponseJsonUnfoldAll: () => void;\n onSplitChange: (sizes: readonly number[]) => void;\n onCommandPaletteChange: (query: string) => void;\n onCommandPaletteSelect: (id: string) => void;\n onCommandPaletteSelectionChange: (index: number) => void;\n onOverlayClose: () => void;\n onEnvSelect: (index: number) => void;\n onResponseSearch: (query: string) => void;\n onCommand: (command: CommandId) => void;\n}>;\n\nfunction paneStyle(colors: ThemeColors, focused: boolean) {\n return {\n bg: colors.bgElevated,\n ...(focused ? { fg: colors.paneFocused, bold: true } : { fg: colors.paneMuted }),\n };\n}\n\nfunction renderFileTree(state: AppState, deps: ViewDeps, colors: ThemeColors): VNode {\n return ui.panel(\n {\n id: \"pane-files\",\n title: state.ui.focusPane === \"files\" ? \"● Files\" : \"Files\",\n style: paneStyle(colors, state.ui.focusPane === \"files\"),\n },\n [\n ui.tree({\n id: \"file-tree\",\n data: state.fileTree,\n expanded: state.expandedPaths,\n selected: state.selectedFilePath ?? undefined,\n getKey: (node: WorkspaceFileNode) => node.path,\n getChildren: (node) =>\n node.kind === \"directory\" ? (node.children as WorkspaceFileNode[] | undefined) : undefined,\n onChange: (node, expanded) => deps.onTreeToggle(node, expanded),\n onSelect: (node) => deps.onTreeSelect(node),\n onPress: (node) => deps.onTreePress(node),\n renderNode: (node, _depth, nodeState) =>\n ui.row({ gap: 1 }, [\n ui.text(nodeState.selected ? `▸ ${node.name}` : node.name, {\n style: nodeState.selected\n ? { fg: colors.selected, bold: true }\n : state.dirty && node.path === state.selectedFilePath\n ? { fg: colors.dirty }\n : undefined,\n }),\n ]),\n flex: 1,\n minHeight: 8,\n }),\n ],\n );\n}\n\nfunction renderEditor(state: AppState, deps: ViewDeps, readOnly: boolean, colors: ThemeColors): VNode {\n const activeRegion = resolveActiveRegion(state.parsedFile, state.editor.cursor.line);\n\n const titleParts = [\n state.ui.focusPane === \"editor\" ? \"● Editor\" : \"Editor\",\n state.selectedFilePath ? state.selectedFilePath.split(\"/\").pop() : \"No file\",\n state.dirty ? \" ●\" : \"\",\n activeRegion ? ` | ${activeRegion.method ?? \"?\"} ${activeRegion.name}` : \"\",\n ];\n\n return ui.panel(\n {\n id: \"pane-editor\",\n title: titleParts.join(\"\"),\n style: paneStyle(colors, state.ui.focusPane === \"editor\"),\n },\n [\n ui.codeEditor({\n id: \"editor\",\n lines: prefixEditorLines(state.fileLines, activeRegion),\n cursor: editorCursorFromSource(state.editor.cursor),\n selection: editorSelectionFromSource(state.editor.selection),\n scrollTop: state.editor.scrollTop,\n scrollLeft: state.editor.scrollLeft,\n readOnly,\n lineNumbers: true,\n syntaxLanguage: \"plain\",\n tokenizeLine: createRegionAwareTokenizer(activeRegion),\n onChange: (lines, cursor) => deps.onEditorChange(lines, cursor),\n onSelectionChange: deps.onEditorSelection,\n onScroll: deps.onEditorScroll,\n flex: 1,\n minHeight: 8,\n }),\n ],\n );\n}\n\nfunction responseScrollProps(state: AppState, deps: ViewDeps) {\n return {\n scrollTop: state.responseEditor.scrollTop,\n scrollLeft: state.responseEditor.scrollLeft,\n onScroll: deps.onResponseScroll,\n };\n}\n\nfunction responseCursorProps(state: AppState, deps: ViewDeps) {\n return {\n cursor: state.responseEditor.cursor,\n selection: state.responseEditor.selection,\n onChange: (_lines: readonly string[], cursor: CursorPosition) => {\n deps.onResponseChange(cursor);\n },\n onSelectionChange: deps.onResponseSelection,\n };\n}\n\nfunction renderResponseBody(state: AppState, deps: ViewDeps, colors: ThemeColors): VNode {\n const result = state.request.result;\n const scroll = responseScrollProps(state, deps);\n const cursor = responseCursorProps(state, deps);\n const gen = state.resultGeneration;\n\n if (state.request.sending) {\n return ui.center(ui.spinner({ label: \"Waiting for response…\" }));\n }\n if (state.request.error && !result) {\n return ui.errorDisplay(state.request.error);\n }\n if (!result) {\n return ui.empty(\"No response\", {\n description: \"Press F5 to send the request under cursor\",\n });\n }\n\n switch (state.ui.responseTab) {\n case \"headers\":\n return ui.table({\n id: `response-headers-${gen}`,\n columns: [\n { key: \"name\", header: \"Header\", width: 24 },\n { key: \"value\", header: \"Value\", flex: 1 },\n ],\n data: [...result.headers],\n getRowKey: (row) => row.name,\n flex: 1,\n minHeight: 6,\n });\n case \"raw\":\n return ui.codeEditor({\n id: `response-raw-${gen}`,\n lines: result.body ? result.body.split(\"\\n\") : [\"\"],\n readOnly: true,\n lineNumbers: true,\n syntaxLanguage: \"plain\",\n ...cursor,\n ...scroll,\n flex: 1,\n });\n case \"variables\":\n return ui.codeEditor({\n id: `response-vars-${gen}`,\n lines: JSON.stringify(state.request.variables, null, 2).split(\"\\n\"),\n readOnly: true,\n syntaxLanguage: \"json\",\n ...cursor,\n ...scroll,\n flex: 1,\n });\n case \"tests\":\n return ui.column({ gap: 1, flex: 1 }, [\n ...result.testResults.map((test) =>\n ui.text(`${test.status === \"SUCCESS\" ? \"✓\" : \"✗\"} ${test.message}`, {\n style: {\n fg:\n test.status === \"SUCCESS\"\n ? colors.success\n : test.status === \"SKIPPED\"\n ? colors.warning\n : colors.error,\n },\n }),\n ),\n ]);\n case \"pretty\":\n default: {\n const prettyView = buildFoldableJsonView(\n prettyJsonIfPossible(result.prettyBody || result.body),\n state.responseEditor.foldedJsonPaths,\n );\n return ui.codeEditor({\n id: `response-pretty-${gen}`,\n lines: prettyView.lines,\n readOnly: true,\n lineNumbers: true,\n syntaxLanguage: \"json\",\n searchQuery: state.editor.searchQuery || undefined,\n ...cursor,\n ...scroll,\n flex: 1,\n });\n }\n }\n}\n\nfunction renderResponse(state: AppState, deps: ViewDeps, colors: ThemeColors): VNode {\n const result = state.request.result;\n const statusLine =\n state.request.sending || !result\n ? null\n : `${result.protocol ?? \"HTTP\"} ${result.statusCode ?? \"?\"} ${result.statusMessage ?? \"\"} · ${result.durationMs ?? \"?\"} ms`;\n\n const tabItems = [\n { key: \"pretty\", label: \"Pretty\" },\n { key: \"raw\", label: \"Raw\" },\n { key: \"headers\", label: \"Headers\" },\n { key: \"variables\", label: \"Vars\" },\n { key: \"tests\", label: \"Tests\" },\n ] as const;\n\n return ui.panel(\n {\n id: \"pane-response\",\n title: state.ui.focusPane === \"response\" ? \"● Response\" : \"Response\",\n style: paneStyle(colors, state.ui.focusPane === \"response\"),\n },\n [\n ui.row({ gap: 2 }, [\n state.request.sending\n ? ui.spinner({ label: \"Sending request…\" })\n : ui.text(statusLine ?? \"Ready\", {\n style: {\n fg: statusColorForTone(colors, statusTone(result?.statusCode)),\n bold: true,\n },\n }),\n result?.error && !state.request.sending\n ? ui.badge(result.error, { variant: \"error\" })\n : null,\n ]),\n ui.row({ gap: 1 }, [\n ...tabItems.map((tab) =>\n ui.button({\n id: `tab-${tab.key}`,\n label: tab.label,\n disabled: state.request.sending,\n onPress: () => deps.onResponseTab(tab.key),\n }),\n ),\n state.ui.responseTab === \"pretty\" && result\n ? ui.button({\n id: \"response-json-fold\",\n label: \"Fold/Unfold\",\n disabled: state.request.sending,\n onPress: deps.onResponseJsonFoldToggle,\n })\n : null,\n state.ui.responseTab === \"pretty\" && state.responseEditor.foldedJsonPaths.length > 0\n ? ui.button({\n id: \"response-json-unfold-all\",\n label: \"Unfold all\",\n disabled: state.request.sending,\n onPress: deps.onResponseJsonUnfoldAll,\n })\n : null,\n ]),\n renderResponseBody(state, deps, colors),\n ],\n );\n}\n\nfunction renderMainLayout(state: AppState, deps: ViewDeps, colors: ThemeColors): VNode {\n const layoutMode = resolveLayoutMode(state.ui.viewportWidth);\n const zoom = state.ui.zoomPane;\n\n if (zoom) {\n if (zoom === \"files\") return renderFileTree(state, deps, colors);\n if (zoom === \"editor\") return renderEditor(state, deps, false, colors);\n return renderResponse(state, deps, colors);\n }\n\n if (layoutMode === \"stacked\") {\n const pane =\n state.ui.focusPane === \"files\"\n ? renderFileTree(state, deps, colors)\n : state.ui.focusPane === \"response\"\n ? renderResponse(state, deps, colors)\n : renderEditor(state, deps, false, colors);\n return pane;\n }\n\n if (layoutMode === \"sidebar-overlay\") {\n return ui.row({ gap: 1, flex: 1 }, [\n state.ui.sidebarVisible\n ? ui.box({ width: 28, flex: 0 }, [renderFileTree(state, deps, colors)])\n : null,\n ui.column({ gap: 1, flex: 1 }, [\n renderEditor(state, deps, false, colors),\n renderResponse(state, deps, colors),\n ]),\n ]);\n }\n\n return ui.column({ gap: 1, flex: 1 }, [\n ui.splitPane(\n {\n id: \"main-split\",\n direction: \"horizontal\",\n sizes: [...state.ui.splitSizes],\n minSizes: [18, 24, 24],\n onChange: deps.onSplitChange,\n },\n [\n renderFileTree(state, deps, colors),\n renderEditor(state, deps, false, colors),\n renderResponse(state, deps, colors),\n ],\n ),\n ]);\n}\n\nfunction renderFooter(state: AppState, deps: ViewDeps, colors: ThemeColors): VNode {\n const env =\n state.request.activeEnvironment.length > 0\n ? state.request.activeEnvironment.join(\",\")\n : \"none\";\n const dirName = path.basename(state.workspaceRoot);\n const branch = state.ui.gitBranch ?? \"—\";\n const fileName = state.selectedFilePath\n ? path.basename(state.selectedFilePath)\n : null;\n\n const hints = footerHintItems({\n focusPane: state.ui.focusPane,\n overlay: state.ui.overlay,\n viewportWidth: state.ui.viewportWidth,\n sending: state.request.sending,\n bindings: state.settings.keybindings,\n responseTab: state.ui.responseTab,\n hasResponse: Boolean(state.request.result),\n hasFoldedJson: state.responseEditor.foldedJsonPaths.length > 0,\n });\n\n return ui.statusBar({\n id: \"status-bar\",\n style: { bg: colors.bgSubtle, fg: colors.fgPrimary },\n left: [\n ui.text(dirName, { style: { fg: colors.paneFocused, bold: true } }),\n ui.text(` ⎇ ${branch}`, { style: { fg: colors.success } }),\n fileName ? ui.text(` | ${fileName}`) : null,\n state.dirty ? ui.text(\" ●\", { style: { fg: colors.dirty } }) : null,\n ui.button({\n id: \"status-env.switcher\",\n label: ` ^E env: ${env}`,\n onPress: () => deps.onCommand(\"env.switcher\"),\n }),\n state.ui.statusMessage ? ui.text(` | ${state.ui.statusMessage}`) : null,\n ].filter(Boolean) as VNode[],\n right: hints.map((hint) =>\n ui.button({\n id: `status-${hint.command}`,\n label: hint.label,\n onPress: () => deps.onCommand(hint.command),\n }),\n ),\n });\n}\n\nfunction renderOverlayContent(state: AppState, deps: ViewDeps, colors: ThemeColors): VNode {\n switch (state.ui.overlay) {\n case \"env\":\n return ui.modal({\n id: \"env-modal\",\n title: \"Environment\",\n content: ui.column({ gap: 1 }, [\n ui.text(\"Select environment (Enter to apply, Esc to close)\"),\n ui.button({\n id: \"env-option-none\",\n label: \"(none)\",\n onPress: () => deps.onEnvSelect(0),\n style:\n state.ui.envSelectedIndex === 0\n ? { fg: colors.selected, bold: true }\n : undefined,\n }),\n ...state.request.environments.map((env, index) =>\n ui.button({\n id: `env-option-${index}`,\n label: env,\n onPress: () => deps.onEnvSelect(index + 1),\n style:\n index + 1 === state.ui.envSelectedIndex\n ? { fg: colors.selected, bold: true }\n : undefined,\n }),\n ),\n ]),\n onClose: deps.onOverlayClose,\n width: 50,\n height: 16,\n });\n case \"help\":\n return ui.modal({\n id: \"help-modal\",\n title: \"reqex help\",\n content: ui.column({ gap: 1 }, HELP_HINT_LINES.map((line) => ui.text(line))),\n onClose: deps.onOverlayClose,\n width: 70,\n height: 14,\n });\n case \"keybindings\": {\n const maxLines = Math.max(8, Math.min(26, state.ui.viewportHeight - 8));\n const lines = buildKeybindingsViewLines(\n state.settings.keybindings as Record<string, CommandId>,\n maxLines,\n );\n return ui.modal({\n id: \"keybindings-modal\",\n title: \"Keybindings\",\n content: ui.column({ gap: 0 }, lines.map((line) => ui.text(line))),\n onClose: deps.onOverlayClose,\n width: 72,\n height: Math.min(maxLines + 4, 28),\n });\n }\n case \"commandPalette\":\n return ui.center(\n ui.commandPalette({\n id: \"command-palette\",\n open: true,\n query: state.ui.commandPalette.query,\n selectedIndex: state.ui.commandPalette.selectedIndex,\n sources: [\n {\n id: \"commands\",\n name: \"Commands\",\n getItems: (query) =>\n COMMAND_ITEMS.filter((item) =>\n item.label.toLowerCase().includes(query.toLowerCase()),\n ).map((item) => ({\n id: item.id,\n label: item.label,\n description: item.description,\n shortcut: item.shortcut,\n sourceId: \"commands\",\n })),\n },\n ],\n onChange: deps.onCommandPaletteChange,\n onSelect: (item) => deps.onCommandPaletteSelect(item.id),\n onClose: deps.onOverlayClose,\n onSelectionChange: deps.onCommandPaletteSelectionChange,\n width: 60,\n }),\n );\n default:\n return ui.text(\"\");\n }\n}\n\nexport function renderApp(state: AppState, deps: ViewDeps): VNode {\n const colors = colorsForMode(state.settings.themeMode);\n const base = ui.column({ gap: 1, flex: 1, style: { bg: colors.bgBase } }, [\n renderMainLayout(state, deps, colors),\n renderFooter(state, deps, colors),\n ]);\n\n if (state.ui.overlay === \"none\") {\n return base;\n }\n\n return ui.layers([\n base,\n ui.layer({\n id: \"overlay-layer\",\n modal: true,\n backdrop: \"dim\",\n closeOnEscape: true,\n onClose: deps.onOverlayClose,\n content: renderOverlayContent(state, deps, colors),\n }),\n ]);\n}\n\nexport function focusPaneId(pane: FocusPane): string {\n switch (pane) {\n case \"files\":\n return \"pane-files\";\n case \"editor\":\n return \"pane-editor\";\n case \"response\":\n return \"pane-response\";\n }\n}\n\nexport { contentFromLines, methodColor };\n","import type {\n CodeEditorLineTokenizer,\n CodeEditorSyntaxToken,\n CodeEditorSyntaxTokenKind,\n CursorPosition,\n EditorSelection,\n} from \"@rezi-ui/core\";\n\nimport type { RequestRegion } from \"../engine/types.js\";\nimport { tokenizeHttpLine } from \"../utils/http-syntax.js\";\n\nexport const EDITOR_GUTTER_WIDTH = 1;\n\nconst ACTIVE_GUTTER = \"▎\";\nconst INACTIVE_GUTTER = \" \";\n\nfunction clamp(value: number, min: number, max: number): number {\n return Math.max(min, Math.min(max, value));\n}\n\nfunction gutterTokenKind(\n method: string | undefined,\n highlighted: boolean,\n): CodeEditorSyntaxTokenKind {\n if (!highlighted) {\n return \"plain\";\n }\n\n switch ((method ?? \"GET\").toUpperCase()) {\n case \"GET\":\n case \"HEAD\":\n case \"OPTIONS\":\n return \"string\";\n case \"POST\":\n case \"PUT\":\n case \"PATCH\":\n return \"type\";\n case \"DELETE\":\n return \"operator\";\n default:\n return \"keyword\";\n }\n}\n\nexport function prefixEditorLines(\n lines: readonly string[],\n activeRegion: Pick<RequestRegion, \"startLine\" | \"endLine\"> | null,\n): string[] {\n return lines.map((line, index) => {\n const highlighted =\n activeRegion !== null &&\n index >= activeRegion.startLine &&\n index <= activeRegion.endLine;\n return `${highlighted ? ACTIVE_GUTTER : INACTIVE_GUTTER}${line}`;\n });\n}\n\nexport function stripEditorLines(lines: readonly string[]): string[] {\n return lines.map((line) => line.slice(EDITOR_GUTTER_WIDTH));\n}\n\nexport function editorCursorFromSource(cursor: CursorPosition): CursorPosition {\n return {\n line: cursor.line,\n column: cursor.column + EDITOR_GUTTER_WIDTH,\n };\n}\n\nexport function sourceCursorFromEditor(cursor: CursorPosition): CursorPosition {\n return {\n line: cursor.line,\n column: Math.max(0, cursor.column - EDITOR_GUTTER_WIDTH),\n };\n}\n\nexport function sourceCursorFromEditorPoint(args: Readonly<{\n x: number;\n y: number;\n rect: Readonly<{ x: number; y: number; w: number; h: number }>;\n lines: readonly string[];\n scrollTop: number;\n scrollLeft: number;\n lineNumbers?: boolean;\n}>): CursorPosition | null {\n const { x, y, rect, lines, scrollTop, scrollLeft } = args;\n if (rect.w <= 0 || rect.h <= 0 || x < rect.x || x >= rect.x + rect.w || y < rect.y || y >= rect.y + rect.h) {\n return null;\n }\n\n const lineCount = Math.max(1, lines.length);\n const lineNumberWidth = args.lineNumbers === false ? 0 : String(lineCount).length + 1;\n const line = clamp(scrollTop + (y - rect.y), 0, lineCount - 1);\n const lineText = lines[line] ?? \"\";\n const localTextColumn = x - rect.x - lineNumberWidth;\n const editorColumn = Math.max(0, scrollLeft + localTextColumn);\n const sourceColumn = clamp(editorColumn - EDITOR_GUTTER_WIDTH, 0, lineText.length);\n\n return { line, column: sourceColumn };\n}\n\nexport function editorSelectionFromSource(\n selection: EditorSelection | null,\n): EditorSelection | null {\n if (!selection) {\n return null;\n }\n return {\n anchor: editorCursorFromSource(selection.anchor),\n active: editorCursorFromSource(selection.active),\n };\n}\n\nexport function sourceSelectionFromEditor(\n selection: EditorSelection | null,\n): EditorSelection | null {\n if (!selection) {\n return null;\n }\n return {\n anchor: sourceCursorFromEditor(selection.anchor),\n active: sourceCursorFromEditor(selection.active),\n };\n}\n\nexport function createRegionAwareTokenizer(\n activeRegion: RequestRegion | null,\n): CodeEditorLineTokenizer {\n return (line, context) => {\n const gutter = line[0] ?? INACTIVE_GUTTER;\n const body = line.slice(EDITOR_GUTTER_WIDTH);\n const highlighted =\n activeRegion !== null &&\n context.lineNumber >= activeRegion.startLine &&\n context.lineNumber <= activeRegion.endLine;\n\n const tokens: CodeEditorSyntaxToken[] = [\n {\n text: gutter,\n kind: gutterTokenKind(activeRegion?.method, highlighted && gutter !== INACTIVE_GUTTER),\n },\n ];\n\n if (body.length > 0) {\n tokens.push(...tokenizeHttpLine(body, context));\n }\n\n return tokens;\n };\n}\n","import { routeWheel, type ZrevEvent } from \"@rezi-ui/core\";\n\nexport type ScrollState = Readonly<{\n scrollTop: number;\n scrollLeft: number;\n}>;\n\nexport type ScrollViewport = Readonly<{\n width: number;\n height: number;\n lineNumbers?: boolean;\n}>;\n\nexport type ScrollResult = Readonly<{\n scrollTop: number;\n scrollLeft: number;\n}>;\n\nfunction lineNumberWidth(lines: readonly string[], lineNumbers: boolean): number {\n if (!lineNumbers) {\n return 0;\n }\n return String(Math.max(1, lines.length)).length + 1;\n}\n\nfunction maxLineWidth(lines: readonly string[]): number {\n return lines.reduce((max, line) => Math.max(max, line.length), 0);\n}\n\nexport function resolveWheelScroll(\n event: ZrevEvent,\n state: ScrollState,\n lines: readonly string[],\n viewport: ScrollViewport,\n): ScrollResult | null {\n const routed = routeWheel(event, {\n scrollX: state.scrollLeft,\n scrollY: state.scrollTop,\n contentWidth: maxLineWidth(lines),\n contentHeight: Math.max(1, lines.length),\n viewportWidth: Math.max(0, viewport.width - lineNumberWidth(lines, viewport.lineNumbers ?? true)),\n viewportHeight: Math.max(0, viewport.height),\n });\n\n if (routed.nextScrollX === undefined && routed.nextScrollY === undefined) {\n return null;\n }\n\n return {\n scrollTop: routed.nextScrollY ?? state.scrollTop,\n scrollLeft: routed.nextScrollX ?? state.scrollLeft,\n };\n}\n","import clipboard from \"clipboardy\";\n\nexport async function copyToClipboard(text: string): Promise<boolean> {\n try {\n await clipboard.write(text);\n return true;\n } catch {\n if (process.stdout.write(`\\x1b]52;c;${Buffer.from(text, \"utf8\").toString(\"base64\")}\\x07`)) {\n return true;\n }\n return false;\n }\n}\n\nexport async function readFromClipboard(): Promise<string | null> {\n try {\n return await clipboard.read();\n } catch {\n return null;\n }\n}\n","import { execFile } from \"node:child_process\";\nimport { promisify } from \"node:util\";\n\nconst execFileAsync = promisify(execFile);\n\nexport async function getGitBranch(root: string): Promise<string | null> {\n try {\n const { stdout } = await execFileAsync(\n \"git\",\n [\"-C\", root, \"rev-parse\", \"--abbrev-ref\", \"HEAD\"],\n { timeout: 2000 },\n );\n const branch = stdout.trim();\n return branch.length > 0 ? branch : null;\n } catch {\n return null;\n }\n}\n","import process from \"node:process\";\nimport { Readable } from \"node:stream\";\n\nexport type ThemeMode = \"light\" | \"dark\";\n\nconst OSC_11_BACKGROUND_QUERY = \"\\x1b]11;?\\x07\";\n\ntype RgbColor = Readonly<{ red: number; green: number; blue: number }>;\n\nfunction parseHexComponent(value: string): number | null {\n const parsed = Number.parseInt(value, 16);\n if (Number.isNaN(parsed)) {\n return null;\n }\n if (value.length <= 2) {\n return parsed;\n }\n return Math.round((parsed * 255) / 65535);\n}\n\nexport function parseOsc11BackgroundColor(sequence: string): RgbColor | null {\n const rgbMatch =\n /\\x1b\\]11;rgb:([0-9a-f]{1,4})\\/([0-9a-f]{1,4})\\/([0-9a-f]{1,4})(?:\\x07|\\x1b\\\\)/iu.exec(\n sequence,\n );\n if (rgbMatch) {\n const red = parseHexComponent(rgbMatch[1] ?? \"\");\n const green = parseHexComponent(rgbMatch[2] ?? \"\");\n const blue = parseHexComponent(rgbMatch[3] ?? \"\");\n if (red === null || green === null || blue === null) {\n return null;\n }\n return { red, green, blue };\n }\n\n const hexMatch = /\\x1b\\]11;#([0-9a-f]{6})(?:\\x07|\\x1b\\\\)/iu.exec(sequence);\n if (hexMatch) {\n const hex = hexMatch[1] ?? \"\";\n const red = parseHexComponent(hex.slice(0, 2));\n const green = parseHexComponent(hex.slice(2, 4));\n const blue = parseHexComponent(hex.slice(4, 6));\n if (red === null || green === null || blue === null) {\n return null;\n }\n return { red, green, blue };\n }\n\n return null;\n}\n\nexport function themeModeForBackgroundColor({ red, green, blue }: RgbColor): ThemeMode {\n const linear = [red, green, blue].map((component) => {\n const normalized = component / 255;\n return normalized <= 0.03928 ? normalized / 12.92 : ((normalized + 0.055) / 1.055) ** 2.4;\n });\n const luminance = 0.2126 * linear[0]! + 0.7152 * linear[1]! + 0.0722 * linear[2]!;\n return luminance > 0.5 ? \"light\" : \"dark\";\n}\n\nexport function themeModeFromColorFgbg(): ThemeMode | null {\n const colorFgbg = process.env.COLORFGBG;\n if (!colorFgbg) {\n return null;\n }\n const parts = colorFgbg.split(\";\");\n const background = Number.parseInt(parts[parts.length - 1] ?? \"\", 10);\n if (Number.isNaN(background)) {\n return null;\n }\n return background > 7 ? \"light\" : \"dark\";\n}\n\ntype DetectTerminalThemeOptions = Readonly<{\n input?: NodeJS.ReadableStream;\n output?: NodeJS.WritableStream;\n timeoutMs?: number;\n}>;\n\nexport async function detectTerminalThemeMode(\n options: DetectTerminalThemeOptions = {},\n): Promise<ThemeMode | null> {\n const input = options.input ?? process.stdin;\n const output = options.output ?? process.stdout;\n const timeoutMs = options.timeoutMs ?? 150;\n\n if (!(\"isTTY\" in input && input.isTTY) || !(\"isTTY\" in output && output.isTTY)) {\n return null;\n }\n\n const wasRaw = \"isRaw\" in input ? input.isRaw : undefined;\n let settled = false;\n let buffer = \"\";\n\n return await new Promise<ThemeMode | null>((resolve) => {\n const drainInput = () => {\n if (!(input instanceof Readable)) {\n return;\n }\n while (input.readableLength > 0) {\n input.read();\n }\n input.pause();\n };\n\n const cleanup = () => {\n if (settled) {\n return;\n }\n settled = true;\n clearTimeout(timer);\n input.removeListener(\"data\", onData);\n if (wasRaw !== undefined && \"setRawMode\" in input) {\n input.setRawMode?.(wasRaw);\n }\n drainInput();\n };\n\n const finish = (mode: ThemeMode | null) => {\n cleanup();\n resolve(mode);\n };\n\n const timer = setTimeout(() => finish(null), timeoutMs);\n const onData = (chunk: Buffer | string) => {\n buffer += Buffer.isBuffer(chunk) ? chunk.toString(\"utf8\") : chunk;\n const color = parseOsc11BackgroundColor(buffer);\n if (color) {\n finish(themeModeForBackgroundColor(color));\n }\n };\n\n input.setRawMode?.(true);\n if (input instanceof Readable) {\n input.resume();\n }\n input.on(\"data\", onData);\n output.write(OSC_11_BACKGROUND_QUERY);\n });\n}\n\ntype ResolveThemeOptions = Readonly<{\n allowProbe?: boolean;\n fallbackMode?: ThemeMode;\n}>;\n\nexport async function resolveThemeMode(\n preference: \"auto\" | \"light\" | \"dark\",\n options: ResolveThemeOptions = {},\n): Promise<ThemeMode> {\n const { allowProbe = true, fallbackMode = \"dark\" } = options;\n\n if (preference === \"light\") {\n return \"light\";\n }\n if (preference === \"dark\") {\n return \"dark\";\n }\n\n if (allowProbe) {\n const detected = await detectTerminalThemeMode();\n if (detected) {\n return detected;\n }\n }\n\n return themeModeFromColorFgbg() ?? fallbackMode;\n}\n"],"mappings":"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","names":["path","process","path","path","fs","path","readJsonIfExists","fs","path","fs","path","path","path","path","isRecord","path","path","path","path","clamp","lineNumberWidth","path","process","path","process"]}