@churivibhav/reqex 0.1.1 → 0.1.2
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 +0 -1
- package/dist/cli.js.map +1 -1
- package/package.json +1 -1
package/dist/cli.js
CHANGED
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":["#!/usr/bin/env node\nimport 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":"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","names":["path","process","path","path","path","path","path","path","path","process"]}
|
|
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":"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","names":["path","process","path","path","path","path","path","path","path","process"]}
|