@churivibhav/reqex 0.1.0 → 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/README.md CHANGED
@@ -1,57 +1,163 @@
1
1
  # reqex
2
2
 
3
- Terminal HTTP client for `.http` / `.rest` files — Postman-like workflow in the TUI.
3
+ **reqex** is a terminal HTTP client for `.http` and `.rest` files. Open a folder of requests, edit them in place, send them, and read the response all in one screen. Think Postman, but in your terminal.
4
4
 
5
- - **UI**: [Rezi](https://rezitui.dev) (`@rezi-ui`) three-pane layout (files | editor | response)
6
- - **Engine**: [httpyac](https://httpyac.github.io/) — full `.http` compatibility
7
- - **Target**: Kitty / glibc Linux, macOS, Windows (Rezi native binaries)
5
+ It uses [httpyac](https://httpyac.github.io/) under the hood, so your existing REST Client / httpyac files work as-is. The UI is built with [Rezi](https://rezitui.dev).
8
6
 
9
7
  ## Install
10
8
 
9
+ You need **Node.js 20 or later**.
10
+
11
11
  ```bash
12
12
  npm install -g @churivibhav/reqex
13
13
  ```
14
14
 
15
- ## Usage
15
+ ## Quick start
16
+
17
+ 1. Put your HTTP files in a folder (`.http`, `.rest`, or environment files like `.env` / `.env.json`).
18
+ 2. Open that folder with reqex:
16
19
 
17
20
  ```bash
18
- reqex # open cwd
19
- reqex ./api # open folder
21
+ reqex # open the current directory
22
+ reqex ./api # open a specific folder
23
+ ```
24
+
25
+ 3. Select a file in the **Files** pane on the left.
26
+ 4. Place your cursor on a request block and press **F5** to send it.
27
+ 5. Read the response in the **Response** pane on the right.
28
+
29
+ That’s the core loop: browse → edit → send → inspect.
30
+
31
+ ## The interface
32
+
33
+ reqex opens a three-pane layout:
34
+
35
+ | Pane | What it does |
36
+ |------|----------------|
37
+ | **Files** | Browse `.http`, `.rest`, and environment files in your workspace |
38
+ | **Editor** | Edit the selected file with HTTP syntax highlighting |
39
+ | **Response** | Status, headers, body, variables, and test results for the last request |
40
+
41
+ Use **Tab** / **Shift+Tab** to move between panes, or **Ctrl+1**, **Ctrl+2**, **Ctrl+3** to jump directly. Press **F11** or **z** to zoom the focused pane.
42
+
43
+ Press **F1** or **?** anytime for in-app quick help. Press **Ctrl+/** for the full keybinding list.
44
+
45
+ ## HTTP files
46
+
47
+ reqex understands the standard `.http` / `.rest` format. A minimal example:
48
+
49
+ ```http
50
+ @baseUrl = https://api.example.com
51
+
52
+ ### List items
53
+ GET {{baseUrl}}/items
54
+ Accept: application/json
55
+
56
+ ### Create item
57
+ POST {{baseUrl}}/items
58
+ Content-Type: application/json
59
+
60
+ {
61
+ "name": "example"
62
+ }
63
+ ```
64
+
65
+ Each request is separated by a line starting with `###`. Variables like `{{baseUrl}}` are resolved when you send.
66
+
67
+ Because reqex uses httpyac, you also get:
68
+
69
+ - **Variables** — file-level `@name = value` and environment files
70
+ - **Environments** — switch between dev/staging/prod with **Ctrl+E**
71
+ - **Chained requests** — reference a previous response with `@name` and `# @ref name`
72
+ - **Tests** — assertions with `??` lines after a request
73
+
74
+ For the full file format, see the [httpyac documentation](https://httpyac.github.io/guide/request.html).
75
+
76
+ ## Sending requests
77
+
78
+ - Put the cursor anywhere inside a request block and press **F5** (or **Ctrl+Enter** / **Alt+Enter** on terminals that support it).
79
+ - To stop a slow request, press **Ctrl+X**.
80
+ - Unsaved edits are marked in the file tree — press **Ctrl+S** to save before sending if you want the file on disk updated.
81
+
82
+ ## Response pane
83
+
84
+ After a request completes, the response pane shows several tabs:
85
+
86
+ | Tab | Shows |
87
+ |-----|--------|
88
+ | **Pretty** | Formatted JSON when applicable |
89
+ | **Raw** | Response body as received |
90
+ | **Headers** | Response headers |
91
+ | **Variables** | Variables set by the request |
92
+ | **Tests** | Test assertion results |
93
+
94
+ Use **Ctrl+Tab** / **Ctrl+Shift+Tab** to cycle tabs, or click a tab header. Copy the visible tab with **Ctrl+Shift+C**.
95
+
96
+ ## Environments
97
+
98
+ If your project defines httpyac environments (for example in `.env` or `.env.json` files), switch between them with **Ctrl+E**. Use the arrow keys to highlight an environment and **Enter** to apply it. Choose **(none)** to clear the active environment.
99
+
100
+ ## Command palette
101
+
102
+ Press **F2** or **Ctrl+Shift+P** to open the command palette. From there you can send requests, save files, switch environments, toggle the sidebar, and more — without memorizing every shortcut.
103
+
104
+ ## Configuration
105
+
106
+ ### Keybindings
107
+
108
+ Default shortcuts follow a VS Code–style preset. Override them in:
109
+
110
+ - **User config:** `~/.config/reqex/keybindings.json` (Linux), `~/Library/Application Support/reqex/keybindings.json` (macOS), or `%APPDATA%\reqex\keybindings.json` (Windows)
111
+ - **Project config:** `.reqex/keybindings.json` in your workspace (overrides user settings)
112
+
113
+ Set `REQEX_CONFIG_DIR` to use a different config directory.
114
+
115
+ Example — remap send to **Ctrl+Return** only and use the vim pane preset:
116
+
117
+ ```json
118
+ {
119
+ "preset": "vim",
120
+ "bindings": {
121
+ "ctrl+return": "request.send"
122
+ }
123
+ }
20
124
  ```
21
125
 
22
- ### Keybindings (default VS Code preset)
126
+ Changes are picked up automatically while reqex is running.
127
+
128
+ ### Common shortcuts
23
129
 
24
130
  | Key | Action |
25
131
  |-----|--------|
26
132
  | `F5` | Send request under cursor |
27
- | `Ctrl+Enter` / `Alt+Enter` | Send (Kitty keyboard protocol) |
133
+ | `Ctrl+Enter` / `Alt+Enter` | Send request |
28
134
  | `Ctrl+X` | Cancel in-flight request |
29
- | `Tab` / `Shift+Tab` | Cycle panes |
30
- | `Ctrl+1/2/3` | Jump to Files / Editor / Response |
31
135
  | `Ctrl+S` | Save file |
32
136
  | `Ctrl+E` | Environment switcher |
137
+ | `Ctrl+B` | Toggle file sidebar |
138
+ | `Ctrl+P` | Quick open files |
33
139
  | `Ctrl+Shift+P` / `F2` | Command palette |
140
+ | `Ctrl+Shift+C` | Copy response tab |
141
+ | `Ctrl+F` | Search in response |
142
+ | `Tab` / `Shift+Tab` | Cycle panes |
143
+ | `Ctrl+1/2/3` | Jump to Files / Editor / Response |
34
144
  | `F1` / `?` | Quick help |
35
145
  | `Ctrl+/` | Full keybindings list |
36
146
  | `F11` / `z` | Zoom pane |
37
147
  | `Ctrl+Q` | Quit |
38
148
 
39
- Configurable bindings: `~/.config/reqex/keybindings.json` (or `%APPDATA%\\reqex` on Windows). Project overrides in `.reqex/keybindings.json`. Set `REQEX_CONFIG_DIR` to override the config root.
149
+ ## Requirements
40
150
 
41
- ## Development
151
+ - **Node.js >= 20**
152
+ - A modern terminal. **Kitty** is recommended on Linux for the best keyboard support.
153
+ - **glibc** Linux (x64 or arm64), macOS, or Windows.
42
154
 
43
- ```bash
44
- npm install
45
- npm run dev
46
- npm test
47
- npm run build
48
- ```
155
+ Alpine Linux and other **musl**-based systems are not supported (Rezi ships native binaries built for glibc).
49
156
 
50
- ## Platform notes
157
+ ## Contributing
51
158
 
52
- - Requires **Node.js >= 20**
53
- - Rezi uses prebuilt native binaries (glibc Linux x64/arm64, macOS, Windows). **Alpine/musl is not supported.**
159
+ See [develop.md](develop.md) for local setup, tests, and publishing.
54
160
 
55
161
  ## License
56
162
 
57
- GPL-3.0-or-later
163
+ GPL-3.0-or-later — see [LICENSE](LICENSE).
package/dist/cli.js CHANGED
@@ -1,5 +1,4 @@
1
1
  #!/usr/bin/env node
2
- #!/usr/bin/env node
3
2
 
4
3
  // src/cli.ts
5
4
  import path4 from "path";
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":";;;AAAA,OAAOA,WAAU;AACjB,OAAOC,cAAa;AAEpB,SAAS,qBAAmC;;;ACH5C,OAAO,QAAQ;AACf,OAAO,QAAQ;AACf,OAAO,UAAU;AAWjB,IAAM,kBAA6C;AAAA,EACjD,IAAI;AAAA,EACJ,cAAc;AAAA,EACd,aAAa;AAAA,EACb,KAAK;AAAA,EACL,aAAa;AAAA,EACb,UAAU;AAAA,EACV,UAAU;AAAA,EACV,UAAU;AAAA,EACV,SAAS;AAAA,EACT,SAAS;AAAA,EACT,SAAS;AAAA,EACT,UAAU;AAAA,EACV,UAAU;AAAA,EACV,gBAAgB;AAAA,EAChB,IAAI;AAAA,EACJ,UAAU;AAAA,EACV,UAAU;AAAA,EACV,KAAK;AAAA,EACL,GAAG;AAAA,EACH,IAAI;AAAA,EACJ,KAAK;AAAA,EACL,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,UAAU;AAAA,EACV,gBAAgB;AAAA,EAChB,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,kBAAkB;AACpB;AAEA,IAAM,eAA0C;AAAA,EAC9C,GAAG;AAAA,EACH,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AACd;AAEO,IAAM,iBAA4C;AAAA,EACvD,gBAAgB;AAAA,EAChB,kBAAkB;AAAA,EAClB,kBAAkB;AAAA,EAClB,kBAAkB;AAAA,EAClB,mBAAmB;AAAA,EACnB,oBAAoB;AAAA,EACpB,sBAAsB;AAAA,EACtB,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,gBAAgB;AAAA,EAChB,kBAAkB;AAAA,EAClB,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,iBAAiB;AAAA,EACjB,YAAY;AAAA,EACZ,oBAAoB;AAAA,EACpB,iBAAiB;AAAA,EACjB,aAAa;AAAA,EACb,oBAAoB;AAAA,EACpB,aAAa;AAAA,EACb,qBAAqB;AAAA,EACrB,qBAAqB;AAAA,EACrB,iBAAiB;AAAA,EACjB,mBAAmB;AAAA,EACnB,qBAAqB;AACvB;AAEA,IAAM,oBAA4C;AAAA,EAChD,MAAM;AAAA,EACN,OAAO;AAAA,EACP,KAAK;AAAA,EACL,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,KAAK;AAAA,EACL,OAAO;AAAA,EACP,OAAO;AAAA,EACP,WAAW;AAAA,EACX,QAAQ;AAAA,EACR,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,MAAM;AAAA,EACN,OAAO;AACT;AAEO,SAAS,eAAe,KAAqB;AAClD,MAAI,UAAU,KAAK,GAAG,GAAG;AACvB,WAAO;AAAA,EACT;AACA,MAAI,IAAI,WAAW,GAAG;AACpB,WAAO,QAAQ,MAAM,MAAM,IAAI,YAAY;AAAA,EAC7C;AAEA,SAAO,IACJ,MAAM,GAAG,EACT,IAAI,CAAC,SAAS,kBAAkB,IAAI,KAAK,KAAK,YAAY,CAAC,EAC3D,KAAK,GAAG;AACb;AAEO,SAAS,0BACd,UACA,UACU;AACV,QAAM,YAAY,oBAAI,IAAyB;AAC/C,aAAW,CAAC,KAAK,OAAO,KAAK,OAAO,QAAQ,QAAQ,GAAG;AACrD,UAAM,OAAO,UAAU,IAAI,OAAO,KAAK,CAAC;AACxC,SAAK,KAAK,GAAG;AACb,cAAU,IAAI,SAAS,IAAI;AAAA,EAC7B;AAEA,QAAM,OAAO,CAAC,GAAG,UAAU,QAAQ,CAAC,EACjC,IAAI,CAAC,CAAC,SAAS,IAAI,MAAM;AACxB,UAAM,gBAAgB,KACnB,KAAK,CAAC,GAAG,MAAM,EAAE,cAAc,CAAC,CAAC,EACjC,IAAI,cAAc,EAClB,KAAK,KAAK;AACb,UAAM,QAAQ,eAAe,OAAO,KAAK;AACzC,WAAO,EAAE,OAAO,KAAK,GAAG,cAAc,OAAO,EAAE,CAAC,KAAK,KAAK,GAAG;AAAA,EAC/D,CAAC,EACA,KAAK,CAAC,GAAG,MAAM,EAAE,MAAM,cAAc,EAAE,KAAK,CAAC,EAC7C,IAAI,CAAC,UAAU,MAAM,GAAG;AAE3B,MAAI,aAAa,UAAa,KAAK,SAAS,UAAU;AACpD,UAAM,SAAS,KAAK,SAAS,WAAW;AACxC,WAAO,CAAC,GAAG,KAAK,MAAM,GAAG,WAAW,CAAC,GAAG,UAAK,MAAM,OAAO;AAAA,EAC5D;AACA,SAAO;AACT;AAEO,SAAS,eAAuB;AACrC,MAAI,QAAQ,IAAI,kBAAkB;AAChC,WAAO,QAAQ,IAAI;AAAA,EACrB;AACA,MAAI,QAAQ,aAAa,SAAS;AAChC,UAAM,UAAU,QAAQ,IAAI,WAAW,KAAK,KAAK,GAAG,QAAQ,GAAG,WAAW,SAAS;AACnF,WAAO,KAAK,KAAK,SAAS,OAAO;AAAA,EACnC;AACA,MAAI,QAAQ,aAAa,UAAU;AACjC,WAAO,KAAK,KAAK,GAAG,QAAQ,GAAG,WAAW,uBAAuB,OAAO;AAAA,EAC1E;AACA,QAAM,MAAM,QAAQ,IAAI,mBAAmB,KAAK,KAAK,GAAG,QAAQ,GAAG,SAAS;AAC5E,SAAO,KAAK,KAAK,KAAK,OAAO;AAC/B;AAEO,SAAS,oBAAoB,eAA+B;AACjE,SAAO,KAAK,KAAK,eAAe,QAAQ;AAC1C;AAEA,SAAS,iBAAiB,UAA2C;AACnE,MAAI;AACF,QAAI,CAAC,GAAG,WAAW,QAAQ,GAAG;AAC5B,aAAO;AAAA,IACT;AACA,UAAM,MAAM,GAAG,aAAa,UAAU,MAAM;AAC5C,WAAO,KAAK,MAAM,GAAG;AAAA,EACvB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,SAAS,gBAAgB,eAG9B;AACA,QAAM,aAAa,iBAAiB,KAAK,KAAK,aAAa,GAAG,kBAAkB,CAAC;AACjF,QAAM,gBAAgB;AAAA,IACpB,KAAK,KAAK,oBAAoB,aAAa,GAAG,kBAAkB;AAAA,EAClE;AAEA,QAAM,SACJ,eAAe,UAAU,YAAY,UAAW;AAClD,QAAM,WAAW,WAAW,QAAQ,eAAe;AAEnD,SAAO;AAAA,IACL;AAAA,IACA,UAAU;AAAA,MACR,GAAG;AAAA,MACH,GAAG,YAAY;AAAA,MACf,GAAG,eAAe;AAAA,IACpB;AAAA,EACF;AACF;AAEO,SAAS,iBACd,eACA,UACY;AACZ,QAAM,OAAO,CAAC,aAAa,GAAG,oBAAoB,aAAa,CAAC;AAChE,QAAM,WAAW,KAAK,IAAI,CAAC,QAAQ;AACjC,QAAI;AACF,SAAG,UAAU,KAAK,EAAE,WAAW,KAAK,CAAC;AAAA,IACvC,QAAQ;AAAA,IAER;AACA,WAAO,GAAG,MAAM,KAAK,EAAE,YAAY,MAAM,GAAG,MAAM,SAAS,CAAC;AAAA,EAC9D,CAAC;AACD,SAAO,MAAM;AACX,eAAW,WAAW,UAAU;AAC9B,cAAQ,MAAM;AAAA,IAChB;AAAA,EACF;AACF;AASA,IAAM,eAAkD;AAAA,EACtD,QAAQ,CAAC,WAAW,eAAe,aAAa,YAAY;AAAA,EAC5D,UAAU,CAAC,aAAa,qBAAqB,WAAW,YAAY;AAAA,EACpE,OAAO,CAAC,cAAc,aAAa,gBAAgB,YAAY;AAAA,EAC/D,SAAS,CAAC,yBAAe,gBAAgB,WAAW;AAAA,EACpD,SAAS,CAAC,iBAAiB,aAAa,aAAa;AACvD;AAEO,SAAS,YAAY,SAAoC;AAC9D,MAAI;AACJ,MAAI,QAAQ,YAAY,QAAQ;AAC9B,YAAQ,aAAa;AAAA,EACvB,WAAW,QAAQ,SAAS;AAC1B,YAAQ,aAAa;AAAA,EACvB,OAAO;AACL,YAAQ,aAAa,QAAQ,SAAS,KAAK,aAAa;AAAA,EAC1D;AAEA,QAAM,aAAa;AACnB,QAAM,WAAW,KAAK,IAAI,IAAI,QAAQ,gBAAgB,UAAU;AAChE,MAAI,OAAO,MAAM,KAAK,QAAK;AAC3B,MAAI,KAAK,SAAS,UAAU;AAC1B,WAAO,GAAG,KAAK,MAAM,GAAG,WAAW,CAAC,CAAC;AAAA,EACvC;AACA,SAAO;AACT;AAEO,IAAM,kBAAqC;AAAA,EAChD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;;;AClQA,SAAS,KAAK,UAAU;AAGxB,IAAI,gBAA+B,YAAY;AAExC,SAAS,iBAAiB,SAA8B;AAC7D,kBAAgB;AAClB;AAEO,SAAS,sBAA4B;AAC1C,MAAI,iBAAiB;AACrB,KAAG,wBAAwB,YAAY,MAAM;AAC7C,KAAG,wBAAwB,WAAW,OAAO,YAAY;AACvD,UAAM,SAAS,MAAM,cAAc,EAAE,MAAM,WAAW,QAAQ,CAAC;AAC/D,WAAO,WAAW;AAAA,EACpB;AACA,KAAG,wBAAwB,kBAAkB,OAAO,SAAS,cAAc,WAAW;AACpF,UAAM,SAAS,MAAM,cAAc;AAAA,MACjC,MAAM;AAAA,MACN;AAAA,MACA;AAAA,MACA,QAAQ,UAAU;AAAA,IACpB,CAAC;AACD,WAAO,OAAO,WAAW,WAAW,SAAS;AAAA,EAC/C;AACA,KAAG,wBAAwB,iBAAiB,OAAO,SAAS,WAAW;AACrE,UAAM,SAAS,MAAM,cAAc,EAAE,MAAM,QAAQ,SAAS,OAAO,CAAC;AACpE,WAAO,OAAO,WAAW,WAAW,SAAS;AAAA,EAC/C;AACA,KAAG,wBAAwB,yBAAyB,OAAO,YAAY;AACrE,UAAM,cAAc,EAAE,MAAM,WAAW,QAAQ,CAAC;AAChD,WAAO;AAAA,EACT;AACA,KAAG,wBAAwB,kBAAkB,OAAO,YAAY;AAC9D,UAAM,cAAc,EAAE,MAAM,WAAW,QAAQ,CAAC;AAChD,WAAO;AAAA,EACT;AACA,KAAG,wBAAwB,mBAAmB,OAAO,YAAY;AAC/D,UAAM,cAAc,EAAE,MAAM,WAAW,QAAQ,CAAC;AAChD,WAAO;AAAA,EACT;AACF;;;ACtCO,SAAS,oBACd,SACA,MACsB;AACtB,QAAM,aAAa,QAAQ;AAAA,IACzB,CAAC,WACC,OAAO,cACP,CAAC,OAAO,YACR,OAAO,aAAa,QACpB,QAAQ,OAAO;AAAA,EACnB;AAEA,MAAI,WAAW,WAAW,GAAG;AAC3B,WAAO;AAAA,EACT;AAEA,SAAO,WAAW,OAAO,CAAC,MAAM,YAAY;AAC1C,UAAM,WAAW,KAAK,UAAU,KAAK;AACrC,UAAM,cAAc,QAAQ,UAAU,QAAQ;AAC9C,QAAI,cAAc,UAAU;AAC1B,aAAO;AAAA,IACT;AACA,QAAI,gBAAgB,YAAY,QAAQ,YAAY,KAAK,WAAW;AAClE,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT,CAAC;AACH;AAMA,IAAM,qBACJ;AAEF,SAAS,wBAAwB,MAAsB;AACrD,QAAM,QAAQ,mBAAmB,KAAK,IAAI;AAC1C,SAAO,QAAQ,MAAM,CAAC,EAAE,SAAS;AACnC;AAEO,SAAS,uBACd,SACA,gBACA,WAOC;AACD,QAAM,UAMD,CAAC;AAEN,aAAW,UAAU,SAAS;AAC5B,QAAI,CAAC,OAAO,cAAc,OAAO,UAAU;AACzC;AAAA,IACF;AACA,UAAM,WAAW,OAAO,OAAO;AAC/B,UAAM,OAAO,UAAU,OAAO,SAAS,KAAK;AAC5C,UAAM,YAAY,wBAAwB,IAAI;AAC9C,YAAQ,KAAK;AAAA,MACX,MAAM,OAAO;AAAA,MACb,aAAa;AAAA,MACb,WAAW,YAAY;AAAA,MACvB,UAAU,WAAW,SAAS;AAAA,MAC9B,SAAS,GAAG,OAAO,UAAU,KAAK,IAAI,OAAO,IAAI;AAAA,IACnD,CAAC;AAAA,EACH;AAEA,SAAO;AACT;;;AChFA,SAAS,SAAS,0BAA0B;AAK5C,IAAM,QAAQ,IAAI,mBAAmB,cAAc;AACnD,IAAM,WAAW,oBAAI,IAAoB;AAEzC,SAAS,SAAS,QAAmC;AACnD,SAAO;AAAA,IACL,IAAI,OAAO;AAAA,IACX,MAAM,OAAO,OAAO;AAAA,IACpB,QAAQ,OAAO,SAAS;AAAA,IACxB,KAAK,OAAO,SAAS;AAAA,IACrB,WAAW,OAAO,OAAO;AAAA,IACzB,SAAS,OAAO,OAAO;AAAA,IACvB,UAAU,OAAO,SAAS;AAAA,IAC1B,YAAY,QAAQ,OAAO,OAAO;AAAA,EACpC;AACF;AAEO,SAAS,iBAAiB,UAA0B;AACzD,QAAM,QAAQ,SAAS,IAAI,QAAQ,KAAK,KAAK;AAC7C,WAAS,IAAI,UAAU,IAAI;AAC3B,SAAO;AACT;AAEO,SAAS,gBAAgB,UAA0B;AACxD,SAAO,SAAS,IAAI,QAAQ,KAAK;AACnC;AAEA,eAAsB,UACpB,UACA,SACA,YACA,SACqB;AACrB,QAAM,eAAe,WAAW,gBAAgB,QAAQ;AACxD,QAAM,WAAW,MAAM,MAAM,YAAY,UAAU,SAAS,cAAc;AAAA,IACxE;AAAA,EACF,CAAC;AAED,QAAM,UAAU,SAAS,YAAY,IAAI,QAAQ;AACjD,SAAO;AAAA,IACL,MAAM;AAAA,IACN;AAAA,IACA,SAAS;AAAA,EACX;AACF;AAEO,SAAS,YAAY,UAAwC;AAClE,SAAO,MAAM,IAAI,QAAQ;AAC3B;AAEO,SAAS,cAAc,UAAkB,UAA0C;AACxF,QAAM,WAAW,MAAM,IAAI,QAAQ;AACnC,SAAO,UAAU,YAAY,KAAK,CAAC,WAAuB,OAAO,OAAO,QAAQ;AAClF;;;ACzDA,SAAS,iBAAiB,cAAc,YAAY;AAMpD,SAAS,WAAW,MAAuB;AACzC,MAAI,SAAS,UAAa,SAAS,MAAM;AACvC,WAAO;AAAA,EACT;AACA,MAAI,OAAO,SAAS,UAAU;AAC5B,WAAO;AAAA,EACT;AACA,MAAI,OAAO,SAAS,IAAI,GAAG;AACzB,WAAO,KAAK,SAAS,MAAM;AAAA,EAC7B;AACA,MAAI;AACF,WAAO,KAAK,UAAU,MAAM,MAAM,CAAC;AAAA,EACrC,QAAQ;AACN,WAAO,OAAO,IAAI;AAAA,EACpB;AACF;AAEA,SAAS,WAAW,UAA4C;AAC9D,MAAI,CAAC,UAAU;AACb,WAAO;AAAA,EACT;AACA,MAAI,SAAS,iBAAiB;AAC5B,WAAO,SAAS;AAAA,EAClB;AACA,SAAO,WAAW,SAAS,IAAI;AACjC;AAEA,SAAS,UAAU,UAAyD;AAC1E,MAAI,CAAC,UAAU,SAAS;AACtB,WAAO,CAAC;AAAA,EACV;AACA,SAAO,OAAO,QAAQ,SAAS,OAAO,EAAE,IAAI,CAAC,CAAC,MAAM,KAAK,OAAO;AAAA,IAC9D;AAAA,IACA,OAAO,MAAM,QAAQ,KAAK,IAAI,MAAM,KAAK,IAAI,IAAI,OAAO,SAAS,EAAE;AAAA,EACrE,EAAE;AACJ;AAEA,SAAS,cAAc,QAA4H;AACjJ,MAAI,CAAC,OAAO,aAAa;AACvB,WAAO,CAAC;AAAA,EACV;AACA,SAAO,OAAO,YAAY,IAAI,CAAC,YAAY;AAAA,IACzC,SAAS,OAAO;AAAA,IAChB,QAAQ,OAAO;AAAA,IACf,QAAQ,OAAO,OAAO;AAAA,EACxB,EAAE;AACJ;AAEA,eAAsB,WAAW,SAMT;AACtB,QAAM,WAAW,YAAY,QAAQ,QAAQ;AAC7C,QAAM,aAAa,cAAc,QAAQ,UAAU,QAAQ,QAAQ;AAEnE,MAAI,CAAC,YAAY,CAAC,YAAY;AAC5B,WAAO;AAAA,MACL,SAAS,CAAC;AAAA,MACV,MAAM;AAAA,MACN,YAAY;AAAA,MACZ,aAAa,CAAC;AAAA,MACd,OAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO,WAAW;AAClB,SAAO,WAAW;AAElB,MAAI;AACJ,QAAM,cAAc,OAAO,aAAuC;AAChE,uBAAmB;AAAA,EACrB;AAEA,MAAI;AACF,UAAM,KAAK;AAAA,MACT;AAAA,MACA;AAAA,MACA,mBAAmB,QAAQ;AAAA,MAC3B,WAAW,QAAQ;AAAA,MACnB;AAAA,IACF,CAAC;AAED,UAAM,WAAW,oBAAoB,WAAW;AAChD,WAAO;AAAA,MACL,YAAY,UAAU;AAAA,MACtB,eAAe,UAAU;AAAA,MACzB,UAAU,UAAU;AAAA,MACpB,SAAS,UAAU,QAAQ;AAAA,MAC3B,MAAM,WAAW,UAAU,IAAI;AAAA,MAC/B,YAAY,WAAW,QAAQ;AAAA,MAC/B,YAAY,UAAU,SAAS;AAAA,MAC/B,aAAa,cAAc,UAAU;AAAA,IACvC;AAAA,EACF,SAAS,OAAO;AACd,WAAO;AAAA,MACL,SAAS,CAAC;AAAA,MACV,MAAM;AAAA,MACN,YAAY;AAAA,MACZ,aAAa,cAAc,UAAU;AAAA,MACrC,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,IAC9D;AAAA,EACF;AACF;AAEA,eAAsB,iBAAiB,UAAqC;AAC1E,QAAM,WAAW,YAAY,QAAQ;AACrC,MAAI,CAAC,UAAU;AACb,WAAO,CAAC;AAAA,EACV;AACA,SAAO,gBAAgB,EAAE,SAAS,CAAC;AACrC;AAEA,eAAsB,cACpB,UACA,mBACkC;AAClC,QAAM,WAAW,YAAY,QAAQ;AACrC,MAAI,CAAC,UAAU;AACb,WAAO,CAAC;AAAA,EACV;AACA,SAAO,aAAa,EAAE,UAAU,kBAAkB,CAAC;AACrD;;;AC5HO,SAAS,gBACd,UACA,SAC2B;AAC3B,QAAM,MAAoD,CAAC;AAE3D,aAAW,CAAC,KAAK,OAAO,KAAK,OAAO,QAAQ,QAAQ,GAAG;AACrD,QAAI,GAAG,IAAI,MAAM,QAAQ,OAAO;AAAA,EAClC;AAEA,SAAO;AACT;AAEO,SAAS,qBAAqB,IAA8B;AACjE,QAAM,QAAmC;AAAA,IACvC,gBAAgB;AAAA,IAChB,kBAAkB;AAAA,IAClB,aAAa;AAAA,IACb,gBAAgB;AAAA,IAChB,oBAAoB;AAAA,IACpB,aAAa;AAAA,IACb,oBAAoB;AAAA,IACpB,aAAa;AAAA,IACb,kBAAkB;AAAA,EACpB;AACA,SAAO,MAAM,EAAE,KAAK;AACtB;AAEO,IAAM,gBAKR;AAAA,EACH,EAAE,IAAI,gBAAgB,OAAO,gBAAgB,aAAa,6BAA6B,UAAU,KAAK;AAAA,EACtG,EAAE,IAAI,kBAAkB,OAAO,kBAAkB,aAAa,4BAA4B,UAAU,SAAS;AAAA,EAC7G,EAAE,IAAI,aAAa,OAAO,aAAa,aAAa,wBAAwB,UAAU,SAAS;AAAA,EAC/F,EAAE,IAAI,gBAAgB,OAAO,sBAAsB,aAAa,6BAA6B,UAAU,SAAS;AAAA,EAChH,EAAE,IAAI,kBAAkB,OAAO,kBAAkB,aAAa,uBAAuB,UAAU,SAAS;AAAA,EACxG,EAAE,IAAI,aAAa,OAAO,aAAa,aAAa,qBAAqB,UAAU,MAAM;AAAA,EACzF,EAAE,IAAI,aAAa,OAAO,QAAQ,aAAa,mBAAmB,UAAU,KAAK;AAAA,EACjF,EAAE,IAAI,oBAAoB,OAAO,eAAe,aAAa,wBAAwB,UAAU,SAAS;AAC1G;;;AChDA,SAAS,UAAU,iBAAiB;AAEpC,OAAO,cAAkC;AACzC,SAAS,oBAAoB;;;ACH7B,SAAS,SAAS,YAAY;AAC9B,OAAOC,WAAU;AAIjB,IAAM,YAAY,oBAAI,IAAI;AAAA,EACxB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAED,IAAM,aAAsE;AAAA,EAC1E,EAAE,KAAK,SAAS,MAAM,OAAO;AAAA,EAC7B,EAAE,KAAK,SAAS,MAAM,OAAO;AAAA,EAC7B,EAAE,KAAK,QAAQ,MAAM,MAAM;AAAA,EAC3B,EAAE,KAAK,aAAa,MAAM,WAAW;AACvC;AAEO,SAAS,aAAa,UAA4C;AACvE,QAAM,OAAOA,MAAK,SAAS,QAAQ;AACnC,aAAW,EAAE,KAAK,KAAK,KAAK,YAAY;AACtC,QAAI,SAAS,OAAO,KAAK,SAAS,GAAG,GAAG;AACtC,aAAO;AAAA,IACT;AAAA,EACF;AACA,MAAI,KAAK,SAAS,WAAW,GAAG;AAC9B,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAMA,eAAsB,iBAAiB,SAA+C;AACpF,SAAO,kBAAkB,SAAS,OAAO;AAC3C;AAEA,eAAe,kBACb,SACA,YAC8B;AAC9B,MAAI;AACJ,MAAI;AACF,cAAU,MAAM,QAAQ,UAAU;AAAA,EACpC,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AAEA,UAAQ,KAAK,CAAC,GAAG,MAAM,EAAE,cAAc,CAAC,CAAC;AACzC,QAAM,QAA6B,CAAC;AAEpC,aAAW,SAAS,SAAS;AAC3B,QAAI,MAAM,WAAW,GAAG,KAAK,UAAU,UAAU,CAAC,MAAM,SAAS,WAAW,GAAG;AAC7E,UAAI,UAAU,IAAI,KAAK,GAAG;AACxB;AAAA,MACF;AAAA,IACF;AAEA,UAAM,WAAWC,MAAK,KAAK,YAAY,KAAK;AAC5C,QAAI;AACJ,QAAI;AACF,kBAAY,MAAM,KAAK,QAAQ;AAAA,IACjC,QAAQ;AACN;AAAA,IACF;AAEA,QAAI,UAAU,YAAY,GAAG;AAC3B,UAAI,UAAU,IAAI,KAAK,GAAG;AACxB;AAAA,MACF;AACA,YAAM,WAAW,MAAM,kBAAkB,SAAS,QAAQ;AAC1D,UAAI,SAAS,SAAS,GAAG;AACvB,cAAM,KAAK;AAAA,UACT,MAAM;AAAA,UACN,MAAM;AAAA,UACN,MAAM;AAAA,UACN;AAAA,QACF,CAAC;AAAA,MACH;AACA;AAAA,IACF;AAEA,UAAM,WAAW,aAAa,QAAQ;AACtC,QAAI,CAAC,UAAU;AACb;AAAA,IACF;AAEA,UAAM,KAAK;AAAA,MACT,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,MACN;AAAA,IACF,CAAC;AAAA,EACH;AAEA,SAAO;AACT;AAEO,SAAS,aAAa,OAA0D;AACrF,QAAM,QAA6B,CAAC;AACpC,aAAW,QAAQ,OAAO;AACxB,QAAI,KAAK,SAAS,QAAQ;AACxB,YAAM,KAAK,IAAI;AAAA,IACjB,WAAW,KAAK,UAAU;AACxB,YAAM,KAAK,GAAG,aAAa,KAAK,QAAQ,CAAC;AAAA,IAC3C;AAAA,EACF;AACA,SAAO;AACT;;;ADxGO,IAAM,YAAN,cAAwB,aAAa;AAAA,EACjC;AAAA,EACD,UAA4B;AAAA,EAC5B,OAA4B,CAAC;AAAA,EAErC,YAAY,SAAiB;AAC3B,UAAM;AACN,SAAK,UAAU;AAAA,EACjB;AAAA,EAEA,MAAM,OAAqC;AACzC,SAAK,OAAO,MAAM,iBAAiB,KAAK,OAAO;AAC/C,UAAM,KAAK,aAAa;AACxB,SAAK,WAAW,EAAE,MAAM,QAAQ,CAAC;AACjC,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,UAAwC;AACtC,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,MAAM,UAAwC;AAC5C,SAAK,OAAO,MAAM,iBAAiB,KAAK,OAAO;AAC/C,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,MAAM,SAAS,UAAmC;AAChD,WAAO,SAAS,UAAU,MAAM;AAAA,EAClC;AAAA,EAEA,MAAM,UAAU,UAAkB,SAAgC;AAChE,UAAM,UAAU,UAAU,SAAS,MAAM;AAAA,EAC3C;AAAA,EAEA,MAAM,QAAuB;AAC3B,UAAM,KAAK,SAAS,MAAM;AAC1B,SAAK,UAAU;AAAA,EACjB;AAAA,EAEA,MAAc,eAA8B;AAC1C,UAAM,KAAK,SAAS,MAAM;AAC1B,SAAK,UAAU,SAAS,MAAM,KAAK,SAAS;AAAA,MAC1C,eAAe;AAAA,MACf,SAAS;AAAA,QACP;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,MACA,kBAAkB,EAAE,oBAAoB,KAAK,cAAc,GAAG;AAAA,IAChE,CAAC;AAED,UAAM,SAAS,OAAO,MAAoCC,UAAiB;AACzE,UAAI;AACF,aAAK,OAAO,MAAM,iBAAiB,KAAK,OAAO;AAC/C,aAAK,WAAW,EAAE,MAAM,MAAAA,MAAK,CAAC;AAAA,MAChC,SAAS,OAAO;AACd,aAAK,KAAK,SAAS,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,KAAK,CAAC,CAAC;AAAA,MAC9E;AAAA,IACF;AAEA,SAAK,QAAQ,GAAG,OAAO,CAACA,UAAS,KAAK,OAAO,OAAOA,KAAI,CAAC;AACzD,SAAK,QAAQ,GAAG,UAAU,CAACA,UAAS,KAAK,OAAO,UAAUA,KAAI,CAAC;AAC/D,SAAK,QAAQ,GAAG,UAAU,CAACA,UAAS,KAAK,OAAO,UAAUA,KAAI,CAAC;AAC/D,SAAK,QAAQ,GAAG,SAAS,CAAC,UAAU;AAClC,WAAK,KAAK,SAAS,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,KAAK,CAAC,CAAC;AAAA,IAC9E,CAAC;AAAA,EACH;AAAA,EAEQ,WAAW,OAAmC;AACpD,SAAK,KAAK,UAAU,KAAK;AAAA,EAC3B;AACF;;;AEiCO,IAAM,cAAoC,CAAC,SAAS,UAAU,UAAU;AACxE,IAAM,gBAAwC;AAAA,EACnD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEO,SAAS,mBAAmB,eAAiC;AAClE,SAAO;AAAA,IACL;AAAA,IACA,UAAU,CAAC;AAAA,IACX,eAAe,CAAC;AAAA,IAChB,kBAAkB;AAAA,IAClB,aAAa;AAAA,IACb,WAAW,CAAC,EAAE;AAAA,IACd,OAAO;AAAA,IACP,cAAc;AAAA,IACd,YAAY;AAAA,IACZ,cAAc;AAAA,IACd,gBAAgB;AAAA,MACd,WAAW;AAAA,MACX,YAAY;AAAA,MACZ,QAAQ,EAAE,MAAM,GAAG,QAAQ,EAAE;AAAA,MAC7B,WAAW;AAAA,IACb;AAAA,IACA,kBAAkB;AAAA,IAClB,QAAQ;AAAA,MACN,QAAQ,EAAE,MAAM,GAAG,QAAQ,EAAE;AAAA,MAC7B,WAAW;AAAA,MACX,WAAW;AAAA,MACX,YAAY;AAAA,MACZ,aAAa;AAAA,IACf;AAAA,IACA,SAAS;AAAA,MACP,SAAS;AAAA,MACT,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,mBAAmB,CAAC;AAAA,MACpB,cAAc,CAAC;AAAA,MACf,WAAW,CAAC;AAAA,IACd;AAAA,IACA,IAAI;AAAA,MACF,WAAW;AAAA,MACX,UAAU;AAAA,MACV,gBAAgB;AAAA,MAChB,YAAY;AAAA,MACZ,eAAe;AAAA,MACf,gBAAgB;AAAA,MAChB,SAAS;AAAA,MACT,aAAa;AAAA,MACb,YAAY,CAAC,IAAI,IAAI,EAAE;AAAA,MACvB,kBAAkB;AAAA,MAClB,gBAAgB,EAAE,MAAM,OAAO,OAAO,IAAI,eAAe,EAAE;AAAA,MAC3D,eAAe;AAAA,MACf,eAAe;AAAA,MACf,WAAW;AAAA,IACb;AAAA,IACA,UAAU;AAAA,MACR,cAAc;AAAA,MACd,aAAa,CAAC;AAAA,IAChB;AAAA,EACF;AACF;AAEO,SAAS,iBAAiB,SAA2B;AAC1D,MAAI,QAAQ,WAAW,GAAG;AACxB,WAAO,CAAC,EAAE;AAAA,EACZ;AACA,SAAO,QAAQ,MAAM,QAAQ;AAC/B;AAEO,SAAS,iBAAiB,OAAkC;AACjE,SAAO,MAAM,KAAK,IAAI;AACxB;AAEO,SAAS,kBAAkB,OAA2B;AAC3D,MAAI,QAAQ,IAAI;AACd,WAAO;AAAA,EACT;AACA,MAAI,QAAQ,KAAK;AACf,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEO,SAAS,SAAS,SAA+B;AACtD,QAAM,QAAQ,YAAY,QAAQ,OAAO;AACzC,SAAO,aAAa,QAAQ,KAAK,YAAY,MAAM,KAAK;AAC1D;AAEO,SAAS,SAAS,SAA+B;AACtD,QAAM,QAAQ,YAAY,QAAQ,OAAO;AACzC,SAAO,aAAa,QAAQ,YAAY,SAAS,KAAK,YAAY,MAAM,KAAK;AAC/E;AAEO,SAAS,gBAAgB,SAAmC;AACjE,QAAM,QAAQ,cAAc,QAAQ,OAAO;AAC3C,SAAO,eAAe,QAAQ,KAAK,cAAc,MAAM,KAAK;AAC9D;AAEO,SAAS,gBAAgB,SAAmC;AACjE,QAAM,QAAQ,cAAc,QAAQ,OAAO;AAC3C,SAAO,eAAe,QAAQ,cAAc,SAAS,KAAK,cAAc,MAAM,KAAK;AACrF;;;ACpNO,SAAS,uBAAuC;AACrD,MAAI,iBAAiB;AAErB,SAAO;AAAA,IACL,YAAoB;AAClB,wBAAkB;AAClB,aAAO;AAAA,IACT;AAAA,IACA,aAAqB;AACnB,wBAAkB;AAClB,aAAO;AAAA,IACT;AAAA,IACA,UAAU,YAA6B;AACrC,aAAO,eAAe;AAAA,IACxB;AAAA,EACF;AACF;;;ACGO,SAAS,qBAAqB,MAMtB;AACb,mBAAiB,OAAO,YAAY;AAClC,WAAO,IAAI,QAAQ,CAAC,YAAY;AAC9B,WAAK,OAAO,CAAC,WAAW;AAAA,QACtB,GAAG;AAAA,QACH,IAAI;AAAA,UACF,GAAG,MAAM;AAAA,UACT,SAAS;AAAA,UACT,eAAe;AAAA,YACb,MAAM,QAAQ;AAAA,YACd,SAAS,QAAQ;AAAA,YACjB,QAAQ,QAAQ,SAAS,SAAS,QAAQ,SAAS;AAAA,YACnD,cAAc,QAAQ,SAAS,UAAU,QAAQ,eAAe;AAAA,YAChE,QAAQ,QAAQ,SAAS,UAAU,QAAQ,SAAS;AAAA,UACtD;AAAA,QACF;AAAA,MACF,EAAE;AACF,sBAAgB,KAAK,OAAO;AAAA,IAC9B,CAAC;AAAA,EACH,CAAC;AAED,QAAM,kBAAwE,CAAC;AAC/E,QAAM,iBAAiB,qBAAqB;AAE5C,QAAM,gBAAgB,CAAC,UAAwC;AAC7D,UAAM,WAAW,gBAAgB,IAAI;AACrC,eAAW,KAAK;AAChB,SAAK,OAAO,CAAC,WAAW;AAAA,MACtB,GAAG;AAAA,MACH,IAAI,EAAE,GAAG,MAAM,IAAI,eAAe,KAAK;AAAA,IACzC,EAAE;AAAA,EACJ;AAEA,QAAM,WAAW,OAAOC,UAAiB;AACvC,UAAM,UAAU,MAAM,KAAK,UAAU,SAASA,KAAI;AAClD,UAAM,QAAQ,iBAAiB,OAAO;AACtC,UAAM,SAAS,MAAM,UAAUA,OAAM,YAAY,SAAS,KAAK,UAAU,OAAO;AAChF,UAAM,eAAe,MAAM,iBAAiBA,KAAI;AAChD,UAAM,YAAY,MAAM,cAAcA,OAAM,CAAC,GAAG,KAAK,SAAS,EAAE,QAAQ,iBAAiB,CAAC;AAC1F,UAAM,eAAe,oBAAoB,OAAO,SAAS,CAAC;AAE1D,SAAK,OAAO,CAAC,WAAW;AAAA,MACtB,GAAG;AAAA,MACH,kBAAkBA;AAAA,MAClB,aAAa;AAAA,MACb,WAAW;AAAA,MACX,OAAO;AAAA,MACP,cAAc,OAAO;AAAA,MACrB,YAAY;AAAA,MACZ;AAAA,MACA,QAAQ;AAAA,QACN,GAAG,MAAM;AAAA,QACT,QAAQ,EAAE,MAAM,cAAc,aAAa,GAAG,QAAQ,EAAE;AAAA,QACxD,WAAW;AAAA,QACX,WAAW,cAAc,aAAa;AAAA,MACxC;AAAA,MACA,SAAS;AAAA,QACP,GAAG,MAAM;AAAA,QACT,OAAO;AAAA,QACP,QAAQ;AAAA,QACR;AAAA,QACA;AAAA,MACF;AAAA,MACA,IAAI;AAAA,QACF,GAAG,MAAM;AAAA,QACT,WAAW;AAAA,QACX,eAAe;AAAA,MACjB;AAAA,IACF,EAAE;AAAA,EACJ;AAEA,QAAM,mBAAmB,YAAY;AACnC,UAAM,OAAO,MAAM,KAAK,UAAU,QAAQ;AAC1C,SAAK,OAAO,CAAC,WAAW,EAAE,GAAG,OAAO,UAAU,KAAK,EAAE;AAAA,EACvD;AAEA,QAAM,WAAW,YAAY;AAC3B,UAAM,QAAQ,KAAK,SAAS;AAC5B,QAAI,CAAC,MAAM,oBAAoB,CAAC,MAAM,OAAO;AAC3C;AAAA,IACF;AACA,UAAM,UAAU,iBAAiB,MAAM,SAAS;AAChD,UAAM,KAAK,UAAU,UAAU,MAAM,kBAAkB,OAAO;AAC9D,UAAM,UAAU,iBAAiB,MAAM,gBAAgB;AACvD,UAAM,SAAS,MAAM;AAAA,MACnB,MAAM;AAAA,MACN,YAAY;AAAA,MACZ,KAAK,UAAU;AAAA,MACf;AAAA,IACF;AACA,UAAM,eAAe,MAAM,eACvB,OAAO,QAAQ,KAAK,CAAC,WAAW,OAAO,OAAO,MAAM,cAAc,EAAE,KACpE,oBAAoB,OAAO,SAAS,MAAM,OAAO,OAAO,IAAI,IAC5D,oBAAoB,OAAO,SAAS,MAAM,OAAO,OAAO,IAAI;AAEhE,SAAK,OAAO,CAAC,OAAO;AAAA,MAClB,GAAG;AAAA,MACH,aAAa;AAAA,MACb,OAAO;AAAA,MACP,YAAY;AAAA,MACZ,cAAc,gBAAgB;AAAA,MAC9B,IAAI,EAAE,GAAG,EAAE,IAAI,eAAe,QAAQ;AAAA,IACxC,EAAE;AAAA,EACJ;AAEA,QAAM,UAAU,YAAY;AAC1B,UAAM,QAAQ,KAAK,SAAS;AAC5B,QAAI,CAAC,MAAM,oBAAoB,CAAC,MAAM,YAAY;AAChD;AAAA,IACF;AAEA,UAAM,SAAS,oBAAoB,MAAM,WAAW,SAAS,MAAM,OAAO,OAAO,IAAI;AACrF,QAAI,CAAC,QAAQ;AACX,WAAK,OAAO,CAAC,OAAO;AAAA,QAClB,GAAG;AAAA,QACH,SAAS,EAAE,GAAG,EAAE,SAAS,OAAO,iCAAiC;AAAA,QACjE,IAAI,EAAE,GAAG,EAAE,IAAI,WAAW,WAAW;AAAA,MACvC,EAAE;AACF;AAAA,IACF;AAEA,UAAM,MAAM,eAAe,UAAU;AAErC,SAAK,OAAO,CAAC,OAAO;AAAA,MAClB,GAAG;AAAA,MACH,cAAc;AAAA,MACd,SAAS,EAAE,GAAG,EAAE,SAAS,SAAS,MAAM,OAAO,MAAM,QAAQ,KAAK;AAAA,MAClE,gBAAgB;AAAA,QACd,WAAW;AAAA,QACX,YAAY;AAAA,QACZ,QAAQ,EAAE,MAAM,GAAG,QAAQ,EAAE;AAAA,QAC7B,WAAW;AAAA,MACb;AAAA,MACA,kBAAkB,EAAE,mBAAmB;AAAA,MACvC,IAAI,EAAE,GAAG,EAAE,IAAI,WAAW,YAAY,aAAa,SAAS;AAAA,IAC9D,EAAE;AAEF,UAAM,IAAI,QAAc,CAAC,YAAY,aAAa,OAAO,CAAC;AAE1D,UAAM,SAAS,MAAM,WAAW;AAAA,MAC9B,UAAU,MAAM;AAAA,MAChB,UAAU,OAAO;AAAA,MACjB,YAAY,KAAK,UAAU;AAAA,MAC3B,mBAAmB,CAAC,GAAG,MAAM,QAAQ,iBAAiB;AAAA,MACtD,WAAW,MAAM,QAAQ;AAAA,IAC3B,CAAC;AAED,QAAI,CAAC,eAAe,UAAU,GAAG,GAAG;AAClC;AAAA,IACF;AAEA,UAAM,YAAY,MAAM,cAAc,MAAM,kBAAkB;AAAA,MAC5D,GAAG,KAAK,SAAS,EAAE,QAAQ;AAAA,IAC7B,CAAC;AAED,QAAI,CAAC,eAAe,UAAU,GAAG,GAAG;AAClC;AAAA,IACF;AAEA,SAAK,OAAO,CAAC,OAAO;AAAA,MAClB,GAAG;AAAA,MACH,SAAS;AAAA,QACP,GAAG,EAAE;AAAA,QACL,SAAS;AAAA,QACT;AAAA,QACA,OAAO,OAAO,SAAS;AAAA,QACvB;AAAA,MACF;AAAA,IACF,EAAE;AAAA,EACJ;AAEA,QAAM,YAAY,CAAC,SAAoB;AACrC,SAAK,OAAO,CAAC,WAAW;AAAA,MACtB,GAAG;AAAA,MACH,IAAI,EAAE,GAAG,MAAM,IAAI,WAAW,KAAK;AAAA,IACrC,EAAE;AAAA,EACJ;AAEA,QAAM,UAAU,CAAC,YAAuB;AACtC,UAAM,QAAQ,KAAK,SAAS;AAE5B,YAAQ,SAAS;AAAA,MACf,KAAK;AACH,aAAK,QAAQ;AACb;AAAA,MACF,KAAK;AACH,YAAI,CAAC,MAAM,QAAQ,SAAS;AAC1B;AAAA,QACF;AACA,uBAAe,WAAW;AAC1B,aAAK,OAAO,CAAC,OAAO;AAAA,UAClB,GAAG;AAAA,UACH,SAAS;AAAA,YACP,GAAG,EAAE;AAAA,YACL,SAAS;AAAA,YACT,OAAO;AAAA,YACP,QAAQ;AAAA,UACV;AAAA,UACA,IAAI,EAAE,GAAG,EAAE,IAAI,eAAe,oBAAoB;AAAA,QACpD,EAAE;AACF;AAAA,MACF,KAAK;AACH,kBAAU,SAAS,MAAM,GAAG,SAAS,CAAC;AACtC;AAAA,MACF,KAAK;AACH,kBAAU,SAAS,MAAM,GAAG,SAAS,CAAC;AACtC;AAAA,MACF,KAAK;AACH,kBAAU,OAAO;AACjB;AAAA,MACF,KAAK;AACH,kBAAU,QAAQ;AAClB;AAAA,MACF,KAAK;AACH,kBAAU,UAAU;AACpB;AAAA,MACF,KAAK;AACH,aAAK,OAAO,CAAC,OAAO;AAAA,UAClB,GAAG;AAAA,UACH,IAAI,EAAE,GAAG,EAAE,IAAI,gBAAgB,CAAC,EAAE,GAAG,eAAe;AAAA,QACtD,EAAE;AACF;AAAA,MACF,KAAK;AACH,aAAK,SAAS;AACd;AAAA,MACF,KAAK;AACH,aAAK,OAAO,CAAC,OAAO;AAAA,UAClB,GAAG;AAAA,UACH,IAAI;AAAA,YACF,GAAG,EAAE;AAAA,YACL,SAAS,EAAE,GAAG,YAAY,QAAQ,SAAS;AAAA,YAC3C,kBAAkB,KAAK;AAAA,cACrB;AAAA,cACA,EAAE,QAAQ,aAAa,QAAQ,EAAE,QAAQ,kBAAkB,KAAK,GAAG,CAAC,KAAK;AAAA,YAC3E;AAAA,UACF;AAAA,QACF,EAAE;AACF;AAAA,MACF,KAAK;AACH,YAAI,MAAM,GAAG,YAAY,OAAO;AAC9B,eAAK,OAAO,CAAC,OAAO;AAAA,YAClB,GAAG;AAAA,YACH,IAAI;AAAA,cACF,GAAG,EAAE;AAAA,cACL,kBAAkB,KAAK;AAAA,gBACrB,EAAE,QAAQ,aAAa;AAAA,gBACvB,EAAE,GAAG,mBAAmB;AAAA,cAC1B;AAAA,YACF;AAAA,UACF,EAAE;AAAA,QACJ;AACA;AAAA,MACF,KAAK;AACH,YAAI,MAAM,GAAG,YAAY,OAAO;AAC9B,eAAK,OAAO,CAAC,OAAO;AAAA,YAClB,GAAG;AAAA,YACH,IAAI;AAAA,cACF,GAAG,EAAE;AAAA,cACL,kBAAkB,KAAK,IAAI,GAAG,EAAE,GAAG,mBAAmB,CAAC;AAAA,YACzD;AAAA,UACF,EAAE;AAAA,QACJ;AACA;AAAA,MACF,KAAK,aAAa;AAChB,cAAM,UAAU,MAAM,QAAQ,aAAa,MAAM,GAAG,gBAAgB;AACpE,cAAM,YAAY;AAChB,gBAAM,oBAAoB,UAAU,CAAC,OAAO,IAAI,CAAC;AACjD,gBAAM,YAAY,MAAM,mBACpB,MAAM,cAAc,MAAM,kBAAkB,iBAAiB,IAC7D,CAAC;AACL,eAAK,OAAO,CAAC,OAAO;AAAA,YAClB,GAAG;AAAA,YACH,SAAS,EAAE,GAAG,EAAE,SAAS,mBAAmB,UAAU;AAAA,YACtD,IAAI,EAAE,GAAG,EAAE,IAAI,SAAS,OAAO;AAAA,UACjC,EAAE;AAAA,QACJ,GAAG;AACH;AAAA,MACF;AAAA,MACA,KAAK;AACH,aAAK,OAAO,CAAC,OAAO;AAAA,UAClB,GAAG;AAAA,UACH,IAAI;AAAA,YACF,GAAG,EAAE;AAAA,YACL,SAAS;AAAA,YACT,gBAAgB,EAAE,GAAG,EAAE,GAAG,gBAAgB,MAAM,MAAM;AAAA,YACtD,eAAe;AAAA,UACjB;AAAA,QACF,EAAE;AACF,sBAAc,MAAS;AACvB;AAAA,MACF,KAAK;AACH,aAAK,KAAK;AACV;AAAA,MACF,KAAK;AACH,aAAK,OAAO,CAAC,OAAO;AAAA,UAClB,GAAG;AAAA,UACH,IAAI;AAAA,YACF,GAAG,EAAE;AAAA,YACL,SAAS;AAAA,YACT,gBAAgB,EAAE,MAAM,MAAM,OAAO,IAAI,eAAe,EAAE;AAAA,UAC5D;AAAA,QACF,EAAE;AACF;AAAA,MACF,KAAK,iBAAiB;AACpB,cAAM,QAAQ,aAAa,MAAM,QAAQ,EAAE,OAAO,CAAC,SAAS,KAAK,SAAS,MAAM;AAChF,cAAM,QAAQ,MAAM,CAAC,GAAG;AACxB,YAAI,OAAO;AACT,eAAK,SAAS,KAAK;AAAA,QACrB;AACA;AAAA,MACF;AAAA,MACA,KAAK;AACH,aAAK,OAAO,CAAC,OAAO;AAAA,UAClB,GAAG;AAAA,UACH,IAAI,EAAE,GAAG,EAAE,IAAI,SAAS,EAAE,GAAG,YAAY,SAAS,SAAS,OAAO;AAAA,QACpE,EAAE;AACF;AAAA,MACF,KAAK;AACH,aAAK,OAAO,CAAC,OAAO;AAAA,UAClB,GAAG;AAAA,UACH,IAAI;AAAA,YACF,GAAG,EAAE;AAAA,YACL,SAAS,EAAE,GAAG,YAAY,gBAAgB,SAAS;AAAA,UACrD;AAAA,QACF,EAAE;AACF;AAAA,MACF,KAAK;AACH,aAAK,OAAO,CAAC,OAAO;AAAA,UAClB,GAAG;AAAA,UACH,IAAI;AAAA,YACF,GAAG,EAAE;AAAA,YACL,UAAU,EAAE,GAAG,WAAW,OAAO,EAAE,GAAG;AAAA,UACxC;AAAA,QACF,EAAE;AACF;AAAA,MACF,KAAK;AACH,aAAK,OAAO,CAAC,OAAO;AAAA,UAClB,GAAG;AAAA,UACH,IAAI,EAAE,GAAG,EAAE,IAAI,aAAa,gBAAgB,EAAE,GAAG,WAAW,EAAE;AAAA,QAChE,EAAE;AACF;AAAA,MACF,KAAK;AACH,aAAK,OAAO,CAAC,OAAO;AAAA,UAClB,GAAG;AAAA,UACH,IAAI,EAAE,GAAG,EAAE,IAAI,aAAa,gBAAgB,EAAE,GAAG,WAAW,EAAE;AAAA,QAChE,EAAE;AACF;AAAA,MACF,KAAK;AACH,aAAK,OAAO,CAAC,OAAO;AAAA,UAClB,GAAG;AAAA,UACH,IAAI,EAAE,GAAG,EAAE,IAAI,eAAe,yCAAyC;AAAA,QACzE,EAAE;AACF;AAAA,MACF,KAAK;AACH,aAAK,OAAO,CAAC,OAAO;AAAA,UAClB,GAAG;AAAA,UACH,IAAI,EAAE,GAAG,EAAE,IAAI,WAAW,YAAY,aAAa,SAAS;AAAA,QAC9D,EAAE;AACF;AAAA,MACF,KAAK;AACH;AAAA,MACF;AACE;AAAA,IACJ;AAAA,EACF;AAEA,QAAM,UAAsE;AAAA,IAC1E,IAAI,QAAQ;AACV,aAAO,KAAK,SAAS;AAAA,IACvB;AAAA,IACA,QAAQ,KAAK;AAAA,IACb;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,mBAAmB,KAAK;AAAA,IACxB,MAAM,KAAK;AAAA,IACX;AAAA,EACF;AAEA,SAAO;AACT;;;AC5ZA,OAAOC,WAAU;AAEjB;AAAA,EACE;AAAA,EACA;AAAA,OAIK;;;ACNP,IAAM,WAAW,oBAAI,IAAI;AAAA,EACvB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAEM,SAAS,iBACd,MACA,UACkC;AAClC,QAAM,SAAkC,CAAC;AACzC,QAAM,cAAc,wEAAwE;AAAA,IAC1F;AAAA,EACF;AACA,MAAI,aAAa;AACf,UAAM,SAAS,YAAY,CAAC,KAAK;AACjC,WAAO,KAAK,EAAE,MAAM,QAAQ,MAAM,UAAU,CAAC;AAC7C,UAAM,OAAO,KAAK,MAAM,YAAY,CAAC,EAAE,MAAM;AAC7C,QAAI,KAAK,SAAS,GAAG;AACnB,aAAO,KAAK,EAAE,MAAM,MAAM,MAAM,SAAS,CAAC;AAAA,IAC5C;AACA,WAAO;AAAA,EACT;AAEA,MAAI,SAAS,KAAK,IAAI,GAAG;AACvB,WAAO,CAAC,EAAE,MAAM,MAAM,MAAM,UAAU,CAAC;AAAA,EACzC;AACA,MAAI,YAAY,KAAK,IAAI,GAAG;AAC1B,WAAO,CAAC,EAAE,MAAM,MAAM,MAAM,UAAU,CAAC;AAAA,EACzC;AACA,MAAI,SAAS,KAAK,IAAI,GAAG;AACvB,WAAO,CAAC,EAAE,MAAM,MAAM,MAAM,OAAO,CAAC;AAAA,EACtC;AAEA,QAAM,cAAc,oDAAoD,KAAK,IAAI;AACjF,MAAI,aAAa;AACf,WAAO,KAAK,EAAE,MAAM,YAAY,CAAC,KAAK,IAAI,MAAM,WAAW,CAAC;AAC5D,WAAO,KAAK,EAAE,MAAM,YAAY,CAAC,KAAK,IAAI,MAAM,WAAW,CAAC;AAC5D,WAAO,KAAK,EAAE,MAAM,YAAY,CAAC,KAAK,IAAI,MAAM,SAAS,CAAC;AAC1D,WAAO;AAAA,EACT;AAEA,QAAM,QAAQ,KAAK,MAAM,QAAQ;AACjC,aAAW,QAAQ,OAAO;AACxB,QAAI,SAAS,IAAI,IAAI,GAAG;AACtB,aAAO,KAAK,EAAE,MAAM,MAAM,MAAM,UAAU,CAAC;AAAA,IAC7C,WAAW,KAAK,SAAS,GAAG;AAC1B,aAAO,KAAK,EAAE,MAAM,MAAM,MAAM,QAAQ,CAAC;AAAA,IAC3C;AAAA,EACF;AACA,SAAO,OAAO,SAAS,IAAI,SAAS,CAAC,EAAE,MAAM,MAAM,MAAM,QAAQ,CAAC;AACpE;AAEO,SAAS,qBAAqB,MAAsB;AACzD,QAAM,UAAU,KAAK,KAAK;AAC1B,MAAI,CAAC,SAAS;AACZ,WAAO;AAAA,EACT;AACA,MAAI;AACF,WAAO,KAAK,UAAU,KAAK,MAAM,OAAO,GAAG,MAAM,CAAC;AAAA,EACpD,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAmBO,SAAS,WAAW,YAAqE;AAC9F,MAAI,CAAC,YAAY;AACf,WAAO;AAAA,EACT;AACA,MAAI,cAAc,OAAO,aAAa,KAAK;AACzC,WAAO;AAAA,EACT;AACA,MAAI,cAAc,OAAO,aAAa,KAAK;AACzC,WAAO;AAAA,EACT;AACA,MAAI,cAAc,KAAK;AACrB,WAAO;AAAA,EACT;AACA,SAAO;AACT;;;ADnEA,SAAS,UAAU,SAAmE;AACpF,SAAO,UAAU,EAAE,IAAI,IAAI,KAAK,KAAK,GAAG,GAAG,MAAM,KAAK,IAAI,EAAE,IAAI,IAAI,KAAK,KAAK,GAAG,EAAE;AACrF;AAEA,SAAS,eAAe,OAAiB,MAAuB;AAC9D,SAAO,GAAG;AAAA,IACR;AAAA,MACE,IAAI;AAAA,MACJ,OAAO,MAAM,GAAG,cAAc,UAAU,iBAAY;AAAA,MACpD,OAAO,UAAU,MAAM,GAAG,cAAc,OAAO;AAAA,IACjD;AAAA,IACA;AAAA,MACE,GAAG,KAAK;AAAA,QACN,IAAI;AAAA,QACJ,MAAM,MAAM;AAAA,QACZ,UAAU,MAAM;AAAA,QAChB,UAAU,MAAM,oBAAoB;AAAA,QACpC,QAAQ,CAAC,SAA4B,KAAK;AAAA,QAC1C,aAAa,CAAC,SACZ,KAAK,SAAS,cAAe,KAAK,WAA+C;AAAA,QACnF,UAAU,CAAC,MAAM,aAAa,KAAK,aAAa,MAAM,QAAQ;AAAA,QAC9D,UAAU,CAAC,SAAS,KAAK,aAAa,IAAI;AAAA,QAC1C,SAAS,CAAC,SAAS,KAAK,YAAY,IAAI;AAAA,QACxC,YAAY,CAAC,MAAM,QAAQ,cACzB,GAAG,IAAI,EAAE,KAAK,EAAE,GAAG;AAAA,UACjB,GAAG,KAAK,UAAU,WAAW,UAAK,KAAK,IAAI,KAAK,KAAK,MAAM;AAAA,YACzD,OAAO,UAAU,WACb,EAAE,IAAI,IAAI,KAAK,KAAK,GAAG,GAAG,MAAM,KAAK,IACrC,MAAM,SAAS,KAAK,SAAS,MAAM,mBACjC,EAAE,IAAI,IAAI,KAAK,KAAK,EAAE,EAAE,IACxB;AAAA,UACR,CAAC;AAAA,QACH,CAAC;AAAA,QACH,MAAM;AAAA,QACN,WAAW;AAAA,MACb,CAAC;AAAA,IACH;AAAA,EACF;AACF;AAEA,SAAS,aAAa,OAAiB,MAAgB,UAA0B;AAC/E,QAAM,eACJ,MAAM,iBACL,MAAM,aACH,oBAAoB,MAAM,WAAW,SAAS,MAAM,OAAO,OAAO,IAAI,IACtE;AAEN,QAAM,aAAa;AAAA,IACjB,MAAM,GAAG,cAAc,WAAW,kBAAa;AAAA,IAC/C,MAAM,mBAAmB,MAAM,iBAAiB,MAAM,GAAG,EAAE,IAAI,IAAI;AAAA,IACnE,MAAM,QAAQ,YAAO;AAAA,IACrB,eAAe,MAAM,aAAa,UAAU,GAAG,IAAI,aAAa,IAAI,KAAK;AAAA,EAC3E;AAEA,QAAM,cAAc,MAAM,aACtB;AAAA,IACE,MAAM,WAAW;AAAA,IACjB,cAAc,MAAM;AAAA,IACpB,MAAM;AAAA,EACR,IACA,CAAC;AAEL,SAAO,GAAG;AAAA,IACR;AAAA,MACE,IAAI;AAAA,MACJ,OAAO,WAAW,KAAK,EAAE;AAAA,MACzB,OAAO,UAAU,MAAM,GAAG,cAAc,QAAQ;AAAA,IAClD;AAAA,IACA;AAAA,MACE,GAAG,WAAW;AAAA,QACZ,IAAI;AAAA,QACJ,OAAO,MAAM;AAAA,QACb,QAAQ,MAAM,OAAO;AAAA,QACrB,WAAW,MAAM,OAAO;AAAA,QACxB,WAAW,MAAM,OAAO;AAAA,QACxB,YAAY,MAAM,OAAO;AAAA,QACzB;AAAA,QACA,aAAa;AAAA,QACb,gBAAgB;AAAA,QAChB,cAAc;AAAA,QACd;AAAA,QACA,UAAU,CAAC,OAAO,WAAW,KAAK,eAAe,OAAO,MAAM;AAAA,QAC9D,mBAAmB,KAAK;AAAA,QACxB,UAAU,KAAK;AAAA,QACf,MAAM;AAAA,QACN,WAAW;AAAA,MACb,CAAC;AAAA,IACH;AAAA,EACF;AACF;AAEA,SAAS,oBAAoB,OAAiB,MAAgB;AAC5D,SAAO;AAAA,IACL,WAAW,MAAM,eAAe;AAAA,IAChC,YAAY,MAAM,eAAe;AAAA,IACjC,UAAU,KAAK;AAAA,EACjB;AACF;AAEA,SAAS,oBAAoB,OAAiB,MAAgB;AAC5D,SAAO;AAAA,IACL,QAAQ,MAAM,eAAe;AAAA,IAC7B,WAAW,MAAM,eAAe;AAAA,IAChC,UAAU,CAAC,QAA2B,WAA2B;AAC/D,WAAK,iBAAiB,MAAM;AAAA,IAC9B;AAAA,IACA,mBAAmB,KAAK;AAAA,EAC1B;AACF;AAEA,SAAS,mBAAmB,OAAiB,MAAuB;AAClE,QAAM,SAAS,MAAM,QAAQ;AAC7B,QAAM,SAAS,oBAAoB,OAAO,IAAI;AAC9C,QAAM,SAAS,oBAAoB,OAAO,IAAI;AAC9C,QAAM,MAAM,MAAM;AAElB,MAAI,MAAM,QAAQ,SAAS;AACzB,WAAO,GAAG,OAAO,GAAG,QAAQ,EAAE,OAAO,6BAAwB,CAAC,CAAC;AAAA,EACjE;AACA,MAAI,MAAM,QAAQ,SAAS,CAAC,QAAQ;AAClC,WAAO,GAAG,aAAa,MAAM,QAAQ,KAAK;AAAA,EAC5C;AACA,MAAI,CAAC,QAAQ;AACX,WAAO,GAAG,MAAM,eAAe;AAAA,MAC7B,aAAa;AAAA,IACf,CAAC;AAAA,EACH;AAEA,UAAQ,MAAM,GAAG,aAAa;AAAA,IAC5B,KAAK;AACH,aAAO,GAAG,MAAM;AAAA,QACd,IAAI,oBAAoB,GAAG;AAAA,QAC3B,SAAS;AAAA,UACP,EAAE,KAAK,QAAQ,QAAQ,UAAU,OAAO,GAAG;AAAA,UAC3C,EAAE,KAAK,SAAS,QAAQ,SAAS,MAAM,EAAE;AAAA,QAC3C;AAAA,QACA,MAAM,CAAC,GAAG,OAAO,OAAO;AAAA,QACxB,WAAW,CAAC,QAAQ,IAAI;AAAA,QACxB,MAAM;AAAA,QACN,WAAW;AAAA,MACb,CAAC;AAAA,IACH,KAAK;AACH,aAAO,GAAG,WAAW;AAAA,QACnB,IAAI,gBAAgB,GAAG;AAAA,QACvB,OAAO,OAAO,OAAO,OAAO,KAAK,MAAM,IAAI,IAAI,CAAC,EAAE;AAAA,QAClD,UAAU;AAAA,QACV,aAAa;AAAA,QACb,gBAAgB;AAAA,QAChB,GAAG;AAAA,QACH,GAAG;AAAA,QACH,MAAM;AAAA,MACR,CAAC;AAAA,IACH,KAAK;AACH,aAAO,GAAG,WAAW;AAAA,QACnB,IAAI,iBAAiB,GAAG;AAAA,QACxB,OAAO,CAAC,KAAK,UAAU,MAAM,QAAQ,WAAW,MAAM,CAAC,CAAC;AAAA,QACxD,UAAU;AAAA,QACV,gBAAgB;AAAA,QAChB,GAAG;AAAA,QACH,GAAG;AAAA,QACH,MAAM;AAAA,MACR,CAAC;AAAA,IACH,KAAK;AACH,aAAO,GAAG,OAAO,EAAE,KAAK,GAAG,MAAM,EAAE,GAAG;AAAA,QACpC,GAAG,OAAO,YAAY;AAAA,UAAI,CAAC,SACzB,GAAG,KAAK,GAAG,KAAK,WAAW,YAAY,WAAM,QAAG,IAAI,KAAK,OAAO,IAAI;AAAA,YAClE,OAAO;AAAA,cACL,IACE,KAAK,WAAW,YACZ,IAAI,KAAK,KAAK,GAAG,IACjB,KAAK,WAAW,YACd,IAAI,KAAK,KAAK,GAAG,IACjB,IAAI,KAAK,KAAK,GAAG;AAAA,YAC3B;AAAA,UACF,CAAC;AAAA,QACH;AAAA,MACF,CAAC;AAAA,IACH,KAAK;AAAA,IACL;AACE,aAAO,GAAG,WAAW;AAAA,QACnB,IAAI,mBAAmB,GAAG;AAAA,QAC1B,OAAO,qBAAqB,OAAO,cAAc,OAAO,IAAI,EAAE,MAAM,IAAI;AAAA,QACxE,UAAU;AAAA,QACV,aAAa;AAAA,QACb,gBAAgB;AAAA,QAChB,aAAa,MAAM,OAAO,eAAe;AAAA,QACzC,GAAG;AAAA,QACH,GAAG;AAAA,QACH,MAAM;AAAA,MACR,CAAC;AAAA,EACL;AACF;AAEA,SAAS,eAAe,OAAiB,MAAuB;AAC9D,QAAM,SAAS,MAAM,QAAQ;AAC7B,QAAM,aACJ,MAAM,QAAQ,WAAW,CAAC,SACtB,OACA,GAAG,OAAO,YAAY,MAAM,IAAI,OAAO,cAAc,GAAG,IAAI,OAAO,iBAAiB,EAAE,SAAM,OAAO,cAAc,GAAG;AAE1H,QAAM,WAAW;AAAA,IACf,EAAE,KAAK,UAAU,OAAO,SAAS;AAAA,IACjC,EAAE,KAAK,OAAO,OAAO,MAAM;AAAA,IAC3B,EAAE,KAAK,WAAW,OAAO,UAAU;AAAA,IACnC,EAAE,KAAK,aAAa,OAAO,OAAO;AAAA,IAClC,EAAE,KAAK,SAAS,OAAO,QAAQ;AAAA,EACjC;AAEA,SAAO,GAAG;AAAA,IACR;AAAA,MACE,IAAI;AAAA,MACJ,OAAO,MAAM,GAAG,cAAc,aAAa,oBAAe;AAAA,MAC1D,OAAO,UAAU,MAAM,GAAG,cAAc,UAAU;AAAA,IACpD;AAAA,IACA;AAAA,MACE,GAAG,IAAI,EAAE,KAAK,EAAE,GAAG;AAAA,QACjB,MAAM,QAAQ,UACV,GAAG,QAAQ,EAAE,OAAO,wBAAmB,CAAC,IACxC,GAAG,KAAK,cAAc,SAAS;AAAA,UAC7B,OAAO,EAAE,IAAI,IAAI,GAAG,YAAY,QAAQ,UAAU,CAAC,GAAG,MAAM,KAAK;AAAA,QACnE,CAAC;AAAA,QACL,QAAQ,SAAS,CAAC,MAAM,QAAQ,UAC5B,GAAG,MAAM,OAAO,OAAO,EAAE,SAAS,QAAQ,CAAC,IAC3C;AAAA,MACN,CAAC;AAAA,MACD,GAAG,IAAI,EAAE,KAAK,EAAE,GAAG;AAAA,QACjB,GAAG,SAAS;AAAA,UAAI,CAAC,QACf,GAAG,OAAO;AAAA,YACR,IAAI,OAAO,IAAI,GAAG;AAAA,YAClB,OAAO,IAAI;AAAA,YACX,UAAU,MAAM,QAAQ;AAAA,YACxB,SAAS,MAAM,KAAK,cAAc,IAAI,GAAG;AAAA,UAC3C,CAAC;AAAA,QACH;AAAA,MACF,CAAC;AAAA,MACD,mBAAmB,OAAO,IAAI;AAAA,IAChC;AAAA,EACF;AACF;AAEA,SAAS,YAAY,MAAoD;AACvE,QAAM,OAAO,WAAW,IAAI;AAC5B,UAAQ,MAAM;AAAA,IACZ,KAAK;AACH,aAAO,CAAC,KAAK,KAAK,GAAG;AAAA,IACvB,KAAK;AACH,aAAO,CAAC,KAAK,KAAK,GAAG;AAAA,IACvB,KAAK;AACH,aAAO,CAAC,KAAK,KAAK,GAAG;AAAA,IACvB;AACE,aAAO,CAAC,KAAK,KAAK,GAAG;AAAA,EACzB;AACF;AAEA,SAAS,iBAAiB,OAAiB,MAAuB;AAChE,QAAM,aAAa,kBAAkB,MAAM,GAAG,aAAa;AAC3D,QAAM,OAAO,MAAM,GAAG;AAEtB,MAAI,MAAM;AACR,QAAI,SAAS,QAAS,QAAO,eAAe,OAAO,IAAI;AACvD,QAAI,SAAS,SAAU,QAAO,aAAa,OAAO,MAAM,KAAK;AAC7D,WAAO,eAAe,OAAO,IAAI;AAAA,EACnC;AAEA,MAAI,eAAe,WAAW;AAC5B,UAAM,OACJ,MAAM,GAAG,cAAc,UACnB,eAAe,OAAO,IAAI,IAC1B,MAAM,GAAG,cAAc,aACrB,eAAe,OAAO,IAAI,IAC1B,aAAa,OAAO,MAAM,KAAK;AACvC,WAAO;AAAA,EACT;AAEA,MAAI,eAAe,mBAAmB;AACpC,WAAO,GAAG,IAAI,EAAE,KAAK,GAAG,MAAM,EAAE,GAAG;AAAA,MACjC,MAAM,GAAG,iBACL,GAAG,IAAI,EAAE,OAAO,IAAI,MAAM,EAAE,GAAG,CAAC,eAAe,OAAO,IAAI,CAAC,CAAC,IAC5D;AAAA,MACJ,GAAG,OAAO,EAAE,KAAK,GAAG,MAAM,EAAE,GAAG;AAAA,QAC7B,aAAa,OAAO,MAAM,KAAK;AAAA,QAC/B,eAAe,OAAO,IAAI;AAAA,MAC5B,CAAC;AAAA,IACH,CAAC;AAAA,EACH;AAEA,SAAO,GAAG,OAAO,EAAE,KAAK,GAAG,MAAM,EAAE,GAAG;AAAA,IACpC,GAAG;AAAA,MACD;AAAA,QACE,IAAI;AAAA,QACJ,WAAW;AAAA,QACX,OAAO,CAAC,GAAG,MAAM,GAAG,UAAU;AAAA,QAC9B,UAAU,CAAC,IAAI,IAAI,EAAE;AAAA,QACrB,UAAU,KAAK;AAAA,MACjB;AAAA,MACA;AAAA,QACE,eAAe,OAAO,IAAI;AAAA,QAC1B,aAAa,OAAO,MAAM,KAAK;AAAA,QAC/B,eAAe,OAAO,IAAI;AAAA,MAC5B;AAAA,IACF;AAAA,EACF,CAAC;AACH;AAEA,SAAS,aAAa,OAAwB;AAC5C,QAAM,MACJ,MAAM,QAAQ,kBAAkB,SAAS,IACrC,MAAM,QAAQ,kBAAkB,KAAK,GAAG,IACxC;AACN,QAAM,UAAUC,MAAK,SAAS,MAAM,aAAa;AACjD,QAAM,SAAS,MAAM,GAAG,aAAa;AACrC,QAAM,WAAW,MAAM,mBACnBA,MAAK,SAAS,MAAM,gBAAgB,IACpC;AAEJ,QAAM,QAAQ,YAAY;AAAA,IACxB,WAAW,MAAM,GAAG;AAAA,IACpB,SAAS,MAAM,GAAG;AAAA,IAClB,eAAe,MAAM,GAAG;AAAA,IACxB,SAAS,MAAM,QAAQ;AAAA,EACzB,CAAC;AAED,SAAO,GAAG,UAAU;AAAA,IAClB,IAAI;AAAA,IACJ,MAAM;AAAA,MACJ,GAAG,KAAK,SAAS,EAAE,OAAO,EAAE,IAAI,IAAI,KAAK,KAAK,GAAG,GAAG,MAAM,KAAK,EAAE,CAAC;AAAA,MAClE,GAAG,KAAK,WAAM,MAAM,IAAI,EAAE,OAAO,EAAE,IAAI,IAAI,KAAK,KAAK,GAAG,EAAE,EAAE,CAAC;AAAA,MAC7D,WAAW,GAAG,KAAK,MAAM,QAAQ,EAAE,IAAI;AAAA,MACvC,MAAM,QAAQ,GAAG,KAAK,WAAM,EAAE,OAAO,EAAE,IAAI,IAAI,KAAK,KAAK,EAAE,EAAE,EAAE,CAAC,IAAI;AAAA,MACpE,GAAG,KAAK,WAAW,GAAG,IAAI,EAAE,OAAO,EAAE,IAAI,IAAI,KAAK,KAAK,GAAG,EAAE,EAAE,CAAC;AAAA,MAC/D,MAAM,GAAG,gBAAgB,GAAG,KAAK,MAAM,MAAM,GAAG,aAAa,EAAE,IAAI;AAAA,IACrE,EAAE,OAAO,OAAO;AAAA,IAChB,OAAO,CAAC,GAAG,KAAK,KAAK,CAAC;AAAA,EACxB,CAAC;AACH;AAEA,SAAS,qBAAqB,OAAiB,MAAuB;AACpE,UAAQ,MAAM,GAAG,SAAS;AAAA,IACxB,KAAK;AACH,aAAO,GAAG,MAAM;AAAA,QACd,IAAI;AAAA,QACJ,OAAO;AAAA,QACP,SAAS,GAAG,OAAO,EAAE,KAAK,EAAE,GAAG;AAAA,UAC7B,GAAG,KAAK,mDAAmD;AAAA,UAC3D,GAAG,KAAK,UAAU;AAAA,YAChB,OACE,MAAM,GAAG,qBAAqB,IAC1B,EAAE,IAAI,IAAI,KAAK,KAAK,GAAG,GAAG,MAAM,KAAK,IACrC;AAAA,UACR,CAAC;AAAA,UACD,GAAG,MAAM,QAAQ,aAAa;AAAA,YAAI,CAAC,KAAK,UACtC,GAAG,KAAK,KAAK;AAAA,cACX,OACE,QAAQ,MAAM,MAAM,GAAG,mBACnB,EAAE,IAAI,IAAI,KAAK,KAAK,GAAG,GAAG,MAAM,KAAK,IACrC;AAAA,YACR,CAAC;AAAA,UACH;AAAA,QACF,CAAC;AAAA,QACD,SAAS,KAAK;AAAA,QACd,OAAO;AAAA,QACP,QAAQ;AAAA,MACV,CAAC;AAAA,IACH,KAAK;AACH,aAAO,GAAG,MAAM;AAAA,QACd,IAAI;AAAA,QACJ,OAAO;AAAA,QACP,SAAS,GAAG,OAAO,EAAE,KAAK,EAAE,GAAG,gBAAgB,IAAI,CAAC,SAAS,GAAG,KAAK,IAAI,CAAC,CAAC;AAAA,QAC3E,SAAS,KAAK;AAAA,QACd,OAAO;AAAA,QACP,QAAQ;AAAA,MACV,CAAC;AAAA,IACH,KAAK,eAAe;AAClB,YAAM,WAAW,KAAK,IAAI,GAAG,KAAK,IAAI,IAAI,MAAM,GAAG,iBAAiB,CAAC,CAAC;AACtE,YAAM,QAAQ;AAAA,QACZ,MAAM,SAAS;AAAA,QACf;AAAA,MACF;AACA,aAAO,GAAG,MAAM;AAAA,QACd,IAAI;AAAA,QACJ,OAAO;AAAA,QACP,SAAS,GAAG,OAAO,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,SAAS,GAAG,KAAK,IAAI,CAAC,CAAC;AAAA,QACjE,SAAS,KAAK;AAAA,QACd,OAAO;AAAA,QACP,QAAQ,KAAK,IAAI,WAAW,GAAG,EAAE;AAAA,MACnC,CAAC;AAAA,IACH;AAAA,IACA,KAAK;AACH,aAAO,GAAG;AAAA,QACR,GAAG,eAAe;AAAA,UAChB,IAAI;AAAA,UACJ,MAAM;AAAA,UACN,OAAO,MAAM,GAAG,eAAe;AAAA,UAC/B,eAAe,MAAM,GAAG,eAAe;AAAA,UACvC,SAAS;AAAA,YACP;AAAA,cACE,IAAI;AAAA,cACJ,MAAM;AAAA,cACN,UAAU,CAAC,UACT,cAAc;AAAA,gBAAO,CAAC,SACpB,KAAK,MAAM,YAAY,EAAE,SAAS,MAAM,YAAY,CAAC;AAAA,cACvD,EAAE,IAAI,CAAC,UAAU;AAAA,gBACf,IAAI,KAAK;AAAA,gBACT,OAAO,KAAK;AAAA,gBACZ,aAAa,KAAK;AAAA,gBAClB,UAAU,KAAK;AAAA,gBACf,UAAU;AAAA,cACZ,EAAE;AAAA,YACN;AAAA,UACF;AAAA,UACA,UAAU,KAAK;AAAA,UACf,UAAU,CAAC,SAAS,KAAK,uBAAuB,KAAK,EAAE;AAAA,UACvD,SAAS,KAAK;AAAA,UACd,mBAAmB,KAAK;AAAA,UACxB,OAAO;AAAA,QACT,CAAC;AAAA,MACH;AAAA,IACF;AACE,aAAO,GAAG,KAAK,EAAE;AAAA,EACrB;AACF;AAEO,SAAS,UAAU,OAAiB,MAAuB;AAChE,QAAM,OAAO,GAAG,OAAO,EAAE,KAAK,GAAG,MAAM,EAAE,GAAG;AAAA,IAC1C,iBAAiB,OAAO,IAAI;AAAA,IAC5B,aAAa,KAAK;AAAA,EACpB,CAAC;AAED,MAAI,MAAM,GAAG,YAAY,QAAQ;AAC/B,WAAO;AAAA,EACT;AAEA,SAAO,GAAG,OAAO;AAAA,IACf;AAAA,IACA,GAAG,MAAM;AAAA,MACP,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,UAAU;AAAA,MACV,eAAe;AAAA,MACf,SAAS,KAAK;AAAA,MACd,SAAS,qBAAqB,OAAO,IAAI;AAAA,IAC3C,CAAC;AAAA,EACH,CAAC;AACH;AAEO,SAAS,YAAY,MAAyB;AACnD,UAAQ,MAAM;AAAA,IACZ,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,EACX;AACF;;;AE5eA,OAAO,eAAe;AAEtB,eAAsB,gBAAgB,MAAgC;AACpE,MAAI;AACF,UAAM,UAAU,MAAM,IAAI;AAC1B,WAAO;AAAA,EACT,QAAQ;AACN,QAAI,QAAQ,OAAO,MAAM,aAAa,OAAO,KAAK,MAAM,MAAM,EAAE,SAAS,QAAQ,CAAC,MAAM,GAAG;AACzF,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT;AACF;AAEO,SAAS,qBAA2B;AACzC,MAAI,QAAQ,MAAM,OAAO;AACvB,QAAI;AACF,cAAQ,MAAM,aAAa,IAAI;AAAA,IACjC,QAAQ;AAAA,IAER;AAAA,EACF;AACF;;;ACtBA,SAAS,gBAAgB;AACzB,SAAS,iBAAiB;AAE1B,IAAM,gBAAgB,UAAU,QAAQ;AAExC,eAAsB,aAAa,MAAsC;AACvE,MAAI;AACF,UAAM,EAAE,OAAO,IAAI,MAAM;AAAA,MACvB;AAAA,MACA,CAAC,MAAM,MAAM,aAAa,gBAAgB,MAAM;AAAA,MAChD,EAAE,SAAS,IAAK;AAAA,IAClB;AACA,UAAM,SAAS,OAAO,KAAK;AAC3B,WAAO,OAAO,SAAS,IAAI,SAAS;AAAA,EACtC,QAAQ;AACN,WAAO;AAAA,EACT;AACF;;;AfAA,eAAe,OAAsB;AACnC,sBAAoB;AAEpB,QAAM,gBAAgBC,MAAK,QAAQC,SAAQ,KAAK,CAAC,KAAKA,SAAQ,IAAI,CAAC;AACnE,QAAM,YAAY,IAAI,UAAU,aAAa;AAC7C,QAAM,OAAO,MAAM,UAAU,KAAK;AAElC,MAAI,eAAe,mBAAmB,aAAa;AACnD,iBAAe;AAAA,IACb,GAAG;AAAA,IACH,UAAU;AAAA,IACV,eAAe,KAAK,OAAO,CAAC,MAAM,EAAE,SAAS,WAAW,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI;AAAA,IAC3E,IAAI;AAAA,MACF,GAAG,aAAa;AAAA,MAChB,WAAW,MAAM,aAAa,aAAa;AAAA,IAC7C;AAAA,EACF;AAEA,MAAI,MAAgC;AACpC,MAAI,MAAyB;AAE7B,QAAM,mBAAmB,YAAY;AACnC,UAAM,SAAS,MAAM,aAAa,aAAa;AAC/C,SAAK,OAAO,CAAC,UAAU;AAAA,MACrB,GAAG;AAAA,MACH,IAAI,EAAE,GAAG,KAAK,IAAI,WAAW,OAAO;AAAA,IACtC,EAAE;AAAA,EACJ;AAEA,QAAM,oBAAoB,MAAM;AAC9B,QAAI,CAAC,OAAO,CAAC,KAAK;AAChB;AAAA,IACF;AACA,UAAM,SAAS,gBAAgB,aAAa;AAC5C,QAAI,KAAK;AAAA,MACP,GAAG,gBAAgB,OAAO,UAAU,CAAC,YAAY;AAC/C,YAAI,YAAY,iBAAiB;AAC/B,eAAK,WAAW,KAAM,YAAY;AAAA,QACpC;AACA,YAAK,QAAQ,OAAO;AAAA,MACtB,CAAC;AAAA,MACD,OAAO;AAAA,QACL,SAAS,MAAM,IAAK,QAAQ,WAAW;AAAA,QACvC,MAAM,CAAC,QAAQ,IAAI,MAAM,GAAG,YAAY;AAAA,QACxC,aAAa;AAAA,MACf;AAAA,MACA,IAAI;AAAA,QACF,SAAS,MAAM;AACb,cAAI,aAAa,GAAG,YAAY,OAAO;AACrC,gBAAK,QAAQ,gBAAgB;AAAA,UAC/B;AAAA,QACF;AAAA,QACA,MAAM,CAAC,QACL,IAAI,MAAM,GAAG,YAAY,SAAS,IAAI,MAAM,GAAG,YAAY;AAAA,MAC/D;AAAA,MACA,MAAM;AAAA,QACJ,SAAS,MAAM;AACb,cAAI,aAAa,GAAG,YAAY,OAAO;AACrC,gBAAK,QAAQ,gBAAgB;AAAA,UAC/B;AAAA,QACF;AAAA,QACA,MAAM,CAAC,QACL,IAAI,MAAM,GAAG,YAAY,SAAS,IAAI,MAAM,GAAG,YAAY;AAAA,MAC/D;AAAA,IACF,CAAC;AACD,QAAI,OAAO,CAAC,WAAW;AAAA,MACrB,GAAG;AAAA,MACH,UAAU;AAAA,QACR,cAAc,OAAO;AAAA,QACrB,aAAa,OAAO;AAAA,MACtB;AAAA,IACF,EAAE;AAAA,EACJ;AAEA,QAAM,qBAAqB;AAAA,IACzB;AAAA,IACA,UAAU,MAAM;AAAA,IAChB,QAAQ,CAAC,YAAY;AACnB,WAAK,OAAO,CAAC,SAAS;AACpB,uBAAe,OAAO,YAAY,aAAa,QAAQ,IAAI,IAAI;AAC/D,eAAO;AAAA,MACT,CAAC;AAAA,IACH;AAAA,IACA,MAAM,MAAM;AACV,WAAK,UAAU,MAAM,EAAE,QAAQ,MAAM;AACnC,aAAK,KAAK,EAAE,QAAQ,MAAMA,SAAQ,KAAK,CAAC,CAAC;AAAA,MAC3C,CAAC;AAAA,IACH;AAAA,IACA;AAAA,EACF,CAAC;AAED,QAAM,cAAc,EAAE,cAAc,aAAa,CAAC;AAClD,oBAAkB;AAClB,qBAAmB;AAEnB,QAAM,YAAY,iBAAiB,eAAe,iBAAiB;AAEnE,YAAU,GAAG,UAAU,MAAM;AAC3B,SAAK,IAAK,iBAAiB;AAC3B,SAAK,iBAAiB;AAAA,EACxB,CAAC;AAED,MAAI;AAAA,IAAK,CAAC,UACR,UAAU,OAAO;AAAA,MACf,gBAAgB,CAAC,OAAO,WAAW;AACjC,aAAK,OAAO,CAAC,SAAS;AACpB,gBAAM,eAAe,KAAK,aACtB,oBAAoB,KAAK,WAAW,SAAS,OAAO,IAAI,IACxD;AACJ,iBAAO;AAAA,YACL,GAAG;AAAA,YACH,WAAW,CAAC,GAAG,KAAK;AAAA,YACpB,OAAO,iBAAiB,KAAK,MAAM,KAAK;AAAA,YACxC;AAAA,YACA,IAAI,EAAE,GAAG,KAAK,IAAI,WAAW,SAAS;AAAA,YACtC,QAAQ,EAAE,GAAG,KAAK,QAAQ,OAAO;AAAA,UACnC;AAAA,QACF,CAAC;AAAA,MACH;AAAA,MACA,mBAAmB,CAAC,cAAc;AAChC,aAAK,OAAO,CAAC,SAAS;AACpB,gBAAM,aAAa,WAAW,OAAO,QAAQ,KAAK,OAAO,OAAO;AAChE,gBAAM,eAAe,KAAK,aACtB,oBAAoB,KAAK,WAAW,SAAS,UAAU,IACvD;AACJ,iBAAO;AAAA,YACL,GAAG;AAAA,YACH;AAAA,YACA,IAAI,EAAE,GAAG,KAAK,IAAI,WAAW,SAAS;AAAA,YACtC,QAAQ;AAAA,cACN,GAAG,KAAK;AAAA,cACR;AAAA,cACA,QAAQ,WAAW,UAAU,KAAK,OAAO;AAAA,YAC3C;AAAA,UACF;AAAA,QACF,CAAC;AAAA,MACH;AAAA,MACA,gBAAgB,CAAC,WAAW,eAAe;AACzC,aAAK,OAAO,CAAC,UAAU;AAAA,UACrB,GAAG;AAAA,UACH,QAAQ,EAAE,GAAG,KAAK,QAAQ,WAAW,WAAW;AAAA,QAClD,EAAE;AAAA,MACJ;AAAA,MACA,cAAc,CAAC,SAAS;AACtB,YAAI,KAAK,SAAS,QAAQ;AACxB,eAAK,IAAK,SAAS,KAAK,IAAI;AAAA,QAC9B;AAAA,MACF;AAAA,MACA,cAAc,CAAC,MAAM,aAAa;AAChC,aAAK,OAAO,CAAC,UAAU;AAAA,UACrB,GAAG;AAAA,UACH,eAAe,WACX,CAAC,GAAG,KAAK,eAAe,KAAK,IAAI,IACjC,KAAK,cAAc,OAAO,CAAC,MAAM,MAAM,KAAK,IAAI;AAAA,QACtD,EAAE;AAAA,MACJ;AAAA,MACA,aAAa,CAAC,SAAS;AACrB,YAAI,KAAK,SAAS,QAAQ;AACxB,eAAK,IAAK,SAAS,KAAK,IAAI;AAAA,QAC9B;AAAA,MACF;AAAA,MACA,eAAe,CAAC,QAAQ;AACtB,aAAK,OAAO,CAAC,UAAU;AAAA,UACrB,GAAG;AAAA,UACH,IAAI,EAAE,GAAG,KAAK,IAAI,aAAa,IAAI;AAAA,UACnC,gBAAgB;AAAA,YACd,GAAG,KAAK;AAAA,YACR,WAAW;AAAA,YACX,YAAY;AAAA,YACZ,QAAQ,EAAE,MAAM,GAAG,QAAQ,EAAE;AAAA,YAC7B,WAAW;AAAA,UACb;AAAA,QACF,EAAE;AAAA,MACJ;AAAA,MACA,kBAAkB,CAAC,WAAW,eAAe;AAC3C,aAAK,OAAO,CAAC,UAAU;AAAA,UACrB,GAAG;AAAA,UACH,gBAAgB,EAAE,GAAG,KAAK,gBAAgB,WAAW,WAAW;AAAA,QAClE,EAAE;AAAA,MACJ;AAAA,MACA,qBAAqB,CAAC,cAAc;AAClC,aAAK,OAAO,CAAC,UAAU;AAAA,UACrB,GAAG;AAAA,UACH,IAAI,EAAE,GAAG,KAAK,IAAI,WAAW,WAAW;AAAA,UACxC,gBAAgB;AAAA,YACd,GAAG,KAAK;AAAA,YACR;AAAA,YACA,QAAQ,WAAW,UAAU,KAAK,eAAe;AAAA,UACnD;AAAA,QACF,EAAE;AAAA,MACJ;AAAA,MACA,kBAAkB,CAAC,WAAW;AAC5B,aAAK,OAAO,CAAC,UAAU;AAAA,UACrB,GAAG;AAAA,UACH,IAAI,EAAE,GAAG,KAAK,IAAI,WAAW,WAAW;AAAA,UACxC,gBAAgB,EAAE,GAAG,KAAK,gBAAgB,OAAO;AAAA,QACnD,EAAE;AAAA,MACJ;AAAA,MACA,eAAe,CAAC,UAAU;AACxB,YAAI,MAAM,WAAW,GAAG;AACtB,eAAK,OAAO,CAAC,UAAU;AAAA,YACrB,GAAG;AAAA,YACH,IAAI,EAAE,GAAG,KAAK,IAAI,YAAY,CAAC,MAAM,CAAC,GAAI,MAAM,CAAC,GAAI,MAAM,CAAC,CAAE,EAAE;AAAA,UAClE,EAAE;AAAA,QACJ;AAAA,MACF;AAAA,MACA,wBAAwB,CAAC,UAAU;AACjC,aAAK,OAAO,CAAC,UAAU;AAAA,UACrB,GAAG;AAAA,UACH,IAAI;AAAA,YACF,GAAG,KAAK;AAAA,YACR,gBAAgB,EAAE,GAAG,KAAK,GAAG,gBAAgB,OAAO,eAAe,EAAE;AAAA,UACvE;AAAA,QACF,EAAE;AAAA,MACJ;AAAA,MACA,iCAAiC,CAAC,UAAU;AAC1C,aAAK,OAAO,CAAC,UAAU;AAAA,UACrB,GAAG;AAAA,UACH,IAAI;AAAA,YACF,GAAG,KAAK;AAAA,YACR,gBAAgB,EAAE,GAAG,KAAK,GAAG,gBAAgB,eAAe,MAAM;AAAA,UACpE;AAAA,QACF,EAAE;AAAA,MACJ;AAAA,MACA,wBAAwB,CAAC,OAAO;AAC9B,aAAK,QAAQ,eAAe;AAC5B,cAAM,UAAU,qBAAqB,EAAE;AACvC,YAAI,WAAW,YAAY,oBAAoB;AAC7C,eAAK,QAAQ,OAAO;AAAA,QACtB;AAAA,MACF;AAAA,MACA,gBAAgB,MAAM;AACpB,aAAK,QAAQ,eAAe;AAAA,MAC9B;AAAA,MACA,aAAa,CAAC,UAAU;AACtB,aAAK,OAAO,CAAC,UAAU;AAAA,UACrB,GAAG;AAAA,UACH,IAAI,EAAE,GAAG,KAAK,IAAI,kBAAkB,MAAM;AAAA,QAC5C,EAAE;AAAA,MACJ;AAAA,MACA,kBAAkB,CAAC,UAAU;AAC3B,aAAK,OAAO,CAAC,UAAU;AAAA,UACrB,GAAG;AAAA,UACH,QAAQ,EAAE,GAAG,KAAK,QAAQ,aAAa,MAAM;AAAA,QAC/C,EAAE;AAAA,MACJ;AAAA,IACF,CAAC;AAAA,EACH;AAEA,MAAI,QAAQ,CAAC,UAAU,cAAc,OAAO,GAAI,CAAC;AAEjD,QAAM,QAAQ,aAAa,IAAI,EAAE,OAAO,CAAC,SAAS,KAAK,SAAS,MAAM;AACtE,MAAI,MAAM,CAAC,GAAG;AACZ,UAAM,IAAI,SAAS,MAAM,CAAC,EAAE,IAAI;AAAA,EAClC;AAEA,QAAM,IAAI,IAAI;AACd,YAAU;AACZ;AAEA,eAAe,WAAW,KAAwB,OAAgC;AAChF,QAAM,SAAS,MAAM,QAAQ;AAC7B,MAAI,CAAC,QAAQ;AACX;AAAA,EACF;AACA,MAAI,OAAO,OAAO;AAClB,MAAI,MAAM,GAAG,gBAAgB,UAAU;AACrC,WAAO,OAAO,cAAc,OAAO;AAAA,EACrC,WAAW,MAAM,GAAG,gBAAgB,WAAW;AAC7C,WAAO,OAAO,QAAQ,IAAI,CAAC,MAAM,GAAG,EAAE,IAAI,KAAK,EAAE,KAAK,EAAE,EAAE,KAAK,IAAI;AAAA,EACrE;AACA,QAAM,KAAK,MAAM,gBAAgB,IAAI;AACrC,MAAI,OAAO,CAAC,UAAU;AAAA,IACpB,GAAG;AAAA,IACH,IAAI,EAAE,GAAG,KAAK,IAAI,eAAe,KAAK,WAAW,cAAc;AAAA,EACjE,EAAE;AACJ;AAEA,SAAS,cAAc,OAAgB,KAA8B;AACnE,MAAI,MAAM,SAAS,YAAY,MAAM,MAAM,SAAS,UAAU;AAC5D,UAAM,SAAS,MAAM;AACrB,QAAI,OAAO,CAAC,UAAU;AAAA,MACpB,GAAG;AAAA,MACH,IAAI;AAAA,QACF,GAAG,KAAK;AAAA,QACR,eAAe,OAAO;AAAA,QACtB,gBAAgB,OAAO;AAAA,QACvB,YAAY,kBAAkB,OAAO,IAAI;AAAA,QACzC,gBACE,kBAAkB,OAAO,IAAI,MAAM,oBAC/B,KAAK,GAAG,iBACR;AAAA,MACR;AAAA,IACF,EAAE;AACF;AAAA,EACF;AAEA,MAAI,MAAM,SAAS,YAAY,MAAM,MAAM,SAAS,SAAS;AAC3D;AAAA,EACF;AAEA,QAAM,EAAE,GAAG,EAAE,IAAI,MAAM;AACvB,QAAM,QAAgD;AAAA,IACpD,EAAE,IAAI,cAAc,MAAM,QAAQ;AAAA,IAClC,EAAE,IAAI,eAAe,MAAM,SAAS;AAAA,IACpC,EAAE,IAAI,iBAAiB,MAAM,WAAW;AAAA,EAC1C;AAEA,aAAW,SAAS,OAAO;AACzB,UAAM,OAAO,IAAI,eAAe,MAAM,EAAE;AACxC,QAAI,CAAC,MAAM;AACT;AAAA,IACF;AACA,QAAI,KAAK,KAAK,KAAK,IAAI,KAAK,IAAI,KAAK,KAAK,KAAK,KAAK,KAAK,IAAI,KAAK,IAAI,KAAK,GAAG;AAC5E,UAAI,OAAO,CAAC,UAAU;AAAA,QACpB,GAAG;AAAA,QACH,IAAI,EAAE,GAAG,KAAK,IAAI,WAAW,MAAM,KAAK;AAAA,MAC1C,EAAE;AACF;AAAA,IACF;AAAA,EACF;AACF;AAEA,KAAK,KAAK,EAAE,MAAM,CAAC,UAAU;AAC3B,UAAQ,MAAM,KAAK;AACnB,EAAAA,SAAQ,KAAK,CAAC;AAChB,CAAC;","names":["path","process","path","path","path","path","path","path","path","process"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@churivibhav/reqex",
3
- "version": "0.1.0",
3
+ "version": "0.1.2",
4
4
  "description": "Terminal HTTP client powered by httpyac and Rezi",
5
5
  "type": "module",
6
6
  "bin": {