@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 +129 -23
- package/dist/cli.js +0 -1
- package/dist/cli.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,57 +1,163 @@
|
|
|
1
1
|
# reqex
|
|
2
2
|
|
|
3
|
-
|
|
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
|
-
|
|
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
|
-
##
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
149
|
+
## Requirements
|
|
40
150
|
|
|
41
|
-
|
|
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
|
-
|
|
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
|
-
##
|
|
157
|
+
## Contributing
|
|
51
158
|
|
|
52
|
-
|
|
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
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/cli.ts","../src/config/keybindings.ts","../src/engine/io-provider.ts","../src/engine/region-resolver.ts","../src/engine/store.ts","../src/engine/send.ts","../src/keymap/dispatcher.ts","../src/workspace/index.ts","../src/workspace/discovery.ts","../src/state/types.ts","../src/state/send-controller.ts","../src/state/commands.ts","../src/ui/app-view.ts","../src/utils/http-syntax.ts","../src/utils/clipboard.ts","../src/utils/git.ts"],"sourcesContent":["#!/usr/bin/env node\nimport path from \"node:path\";\nimport process from \"node:process\";\n\nimport { createNodeApp, type NodeApp } from \"@rezi-ui/node\";\nimport type { UiEvent } from \"@rezi-ui/core\";\n\nimport { loadKeybindings, watchKeybindings } from \"./config/keybindings.js\";\nimport { initEngineProviders, resolveRegionAtLine } from \"./engine/index.js\";\nimport { buildBindingMap, commandFromPaletteId } from \"./keymap/index.js\";\nimport { createCommandContext, createInitialState, type CommandBus } from \"./state/commands.js\";\nimport type { AppState, FocusPane } from \"./state/types.js\";\nimport { contentFromLines, resolveLayoutMode } from \"./state/types.js\";\nimport { focusPaneId, renderApp } from \"./ui/app-view.js\";\nimport { copyToClipboard, disableFlowControl } from \"./utils/clipboard.js\";\nimport { getGitBranch } from \"./utils/git.js\";\nimport { Workspace, flattenFiles } from \"./workspace/index.js\";\n\nasync function main(): Promise<void> {\n initEngineProviders();\n\n const workspaceRoot = path.resolve(process.argv[2] ?? process.cwd());\n const workspace = new Workspace(workspaceRoot);\n const tree = await workspace.open();\n\n let currentState = createInitialState(workspaceRoot);\n currentState = {\n ...currentState,\n fileTree: tree,\n expandedPaths: tree.filter((n) => n.kind === \"directory\").map((n) => n.path),\n ui: {\n ...currentState.ui,\n gitBranch: await getGitBranch(workspaceRoot),\n },\n };\n\n let app: NodeApp<AppState> | null = null;\n let bus: CommandBus | null = null;\n\n const refreshGitBranch = async () => {\n const branch = await getGitBranch(workspaceRoot);\n app?.update((prev) => ({\n ...prev,\n ui: { ...prev.ui, gitBranch: branch },\n }));\n };\n\n const reloadKeybindings = () => {\n if (!app || !bus) {\n return;\n }\n const loaded = loadKeybindings(workspaceRoot);\n app.keys({\n ...buildBindingMap(loaded.bindings, (command) => {\n if (command === \"response.copy\") {\n void handleCopy(app!, currentState);\n }\n bus!.execute(command);\n }),\n enter: {\n handler: () => bus!.execute(\"env.apply\"),\n when: (ctx) => ctx.state.ui.overlay === \"env\",\n description: \"Apply selected environment\",\n },\n up: {\n handler: () => {\n if (currentState.ui.overlay === \"env\") {\n bus!.execute(\"env.selectPrev\");\n }\n },\n when: (ctx) =>\n ctx.state.ui.overlay === \"env\" || ctx.state.ui.overlay === \"commandPalette\",\n },\n down: {\n handler: () => {\n if (currentState.ui.overlay === \"env\") {\n bus!.execute(\"env.selectNext\");\n }\n },\n when: (ctx) =>\n ctx.state.ui.overlay === \"env\" || ctx.state.ui.overlay === \"commandPalette\",\n },\n });\n app.update((state) => ({\n ...state,\n settings: {\n keymapPreset: loaded.preset,\n keybindings: loaded.bindings,\n },\n }));\n };\n\n bus = createCommandContext({\n workspace,\n getState: () => currentState,\n update: (updater) => {\n app?.update((prev) => {\n currentState = typeof updater === \"function\" ? updater(prev) : updater;\n return currentState;\n });\n },\n quit: () => {\n void workspace.close().finally(() => {\n app?.stop().finally(() => process.exit(0));\n });\n },\n reloadKeybindings,\n });\n\n app = createNodeApp({ initialState: currentState });\n reloadKeybindings();\n disableFlowControl();\n\n const stopWatch = watchKeybindings(workspaceRoot, reloadKeybindings);\n\n workspace.on(\"change\", () => {\n void bus!.refreshWorkspace();\n void refreshGitBranch();\n });\n\n app.view((state) =>\n renderApp(state, {\n onEditorChange: (lines, cursor) => {\n app?.update((prev) => {\n const activeRegion = prev.parsedFile\n ? resolveRegionAtLine(prev.parsedFile.regions, cursor.line)\n : null;\n return {\n ...prev,\n fileLines: [...lines],\n dirty: contentFromLines(lines) !== prev.fileContent,\n activeRegion,\n ui: { ...prev.ui, focusPane: \"editor\" },\n editor: { ...prev.editor, cursor },\n };\n });\n },\n onEditorSelection: (selection) => {\n app?.update((prev) => {\n const cursorLine = selection?.active.line ?? prev.editor.cursor.line;\n const activeRegion = prev.parsedFile\n ? resolveRegionAtLine(prev.parsedFile.regions, cursorLine)\n : null;\n return {\n ...prev,\n activeRegion,\n ui: { ...prev.ui, focusPane: \"editor\" },\n editor: {\n ...prev.editor,\n selection,\n cursor: selection?.active ?? prev.editor.cursor,\n },\n };\n });\n },\n onEditorScroll: (scrollTop, scrollLeft) => {\n app?.update((prev) => ({\n ...prev,\n editor: { ...prev.editor, scrollTop, scrollLeft },\n }));\n },\n onTreeSelect: (node) => {\n if (node.kind === \"file\") {\n void bus!.openFile(node.path);\n }\n },\n onTreeToggle: (node, expanded) => {\n app?.update((prev) => ({\n ...prev,\n expandedPaths: expanded\n ? [...prev.expandedPaths, node.path]\n : prev.expandedPaths.filter((p) => p !== node.path),\n }));\n },\n onTreePress: (node) => {\n if (node.kind === \"file\") {\n void bus!.openFile(node.path);\n }\n },\n onResponseTab: (tab) => {\n app?.update((prev) => ({\n ...prev,\n ui: { ...prev.ui, responseTab: tab },\n responseEditor: {\n ...prev.responseEditor,\n scrollTop: 0,\n scrollLeft: 0,\n cursor: { line: 0, column: 0 },\n selection: null,\n },\n }));\n },\n onResponseScroll: (scrollTop, scrollLeft) => {\n app?.update((prev) => ({\n ...prev,\n responseEditor: { ...prev.responseEditor, scrollTop, scrollLeft },\n }));\n },\n onResponseSelection: (selection) => {\n app?.update((prev) => ({\n ...prev,\n ui: { ...prev.ui, focusPane: \"response\" },\n responseEditor: {\n ...prev.responseEditor,\n selection,\n cursor: selection?.active ?? prev.responseEditor.cursor,\n },\n }));\n },\n onResponseChange: (cursor) => {\n app?.update((prev) => ({\n ...prev,\n ui: { ...prev.ui, focusPane: \"response\" },\n responseEditor: { ...prev.responseEditor, cursor },\n }));\n },\n onSplitChange: (sizes) => {\n if (sizes.length === 3) {\n app?.update((prev) => ({\n ...prev,\n ui: { ...prev.ui, splitSizes: [sizes[0]!, sizes[1]!, sizes[2]!] },\n }));\n }\n },\n onCommandPaletteChange: (query) => {\n app?.update((prev) => ({\n ...prev,\n ui: {\n ...prev.ui,\n commandPalette: { ...prev.ui.commandPalette, query, selectedIndex: 0 },\n },\n }));\n },\n onCommandPaletteSelectionChange: (index) => {\n app?.update((prev) => ({\n ...prev,\n ui: {\n ...prev.ui,\n commandPalette: { ...prev.ui.commandPalette, selectedIndex: index },\n },\n }));\n },\n onCommandPaletteSelect: (id) => {\n bus?.execute(\"overlay.close\");\n const command = commandFromPaletteId(id);\n if (command && command !== \"palette.commands\") {\n bus?.execute(command);\n }\n },\n onOverlayClose: () => {\n bus?.execute(\"overlay.close\");\n },\n onEnvSelect: (index) => {\n app?.update((prev) => ({\n ...prev,\n ui: { ...prev.ui, envSelectedIndex: index },\n }));\n },\n onResponseSearch: (query) => {\n app?.update((prev) => ({\n ...prev,\n editor: { ...prev.editor, searchQuery: query },\n }));\n },\n }),\n );\n\n app.onEvent((event) => handleUiEvent(event, app!));\n\n const files = flattenFiles(tree).filter((node) => node.kind === \"file\");\n if (files[0]) {\n await bus.openFile(files[0].path);\n }\n\n await app.run();\n stopWatch();\n}\n\nasync function handleCopy(app: NodeApp<AppState>, state: AppState): Promise<void> {\n const result = state.request.result;\n if (!result) {\n return;\n }\n let text = result.body;\n if (state.ui.responseTab === \"pretty\") {\n text = result.prettyBody || result.body;\n } else if (state.ui.responseTab === \"headers\") {\n text = result.headers.map((h) => `${h.name}: ${h.value}`).join(\"\\n\");\n }\n const ok = await copyToClipboard(text);\n app.update((prev) => ({\n ...prev,\n ui: { ...prev.ui, statusMessage: ok ? \"Copied\" : \"Copy failed\" },\n }));\n}\n\nfunction handleUiEvent(event: UiEvent, app: NodeApp<AppState>): void {\n if (event.kind === \"engine\" && event.event.kind === \"resize\") {\n const resize = event.event;\n app.update((prev) => ({\n ...prev,\n ui: {\n ...prev.ui,\n viewportWidth: resize.cols,\n viewportHeight: resize.rows,\n layoutMode: resolveLayoutMode(resize.cols),\n sidebarVisible:\n resolveLayoutMode(resize.cols) === \"sidebar-overlay\"\n ? prev.ui.sidebarVisible\n : true,\n },\n }));\n return;\n }\n\n if (event.kind !== \"engine\" || event.event.kind !== \"mouse\") {\n return;\n }\n\n const { x, y } = event.event;\n const panes: Array<{ id: string; pane: FocusPane }> = [\n { id: \"pane-files\", pane: \"files\" },\n { id: \"pane-editor\", pane: \"editor\" },\n { id: \"pane-response\", pane: \"response\" },\n ];\n\n for (const entry of panes) {\n const rect = app.measureElement(entry.id);\n if (!rect) {\n continue;\n }\n if (x >= rect.x && x < rect.x + rect.w && y >= rect.y && y < rect.y + rect.h) {\n app.update((prev) => ({\n ...prev,\n ui: { ...prev.ui, focusPane: entry.pane },\n }));\n break;\n }\n }\n}\n\nvoid main().catch((error) => {\n console.error(error);\n process.exit(1);\n});\n\nexport { focusPaneId };\n","import fs from \"node:fs\";\nimport os from \"node:os\";\nimport path from \"node:path\";\n\nimport type { CommandId } from \"../state/types.js\";\n\nexport type KeymapPreset = \"vscode\" | \"vim\";\n\nexport type KeybindingConfig = Readonly<{\n preset?: KeymapPreset;\n bindings?: Readonly<Record<string, CommandId>>;\n}>;\n\nconst VSCODE_DEFAULTS: Record<string, CommandId> = {\n F5: \"request.send\",\n \"ctrl+enter\": \"request.send\",\n \"alt+enter\": \"request.send\",\n tab: \"pane.focusNext\",\n \"shift+tab\": \"pane.focusPrev\",\n \"ctrl+1\": \"pane.focusFiles\",\n \"ctrl+2\": \"pane.focusEditor\",\n \"ctrl+3\": \"pane.focusResponse\",\n \"alt+1\": \"pane.focusFiles\",\n \"alt+2\": \"pane.focusEditor\",\n \"alt+3\": \"pane.focusResponse\",\n \"ctrl+b\": \"sidebar.toggle\",\n \"ctrl+p\": \"palette.files\",\n \"ctrl+shift+p\": \"palette.commands\",\n F2: \"palette.commands\",\n \"ctrl+s\": \"file.save\",\n \"ctrl+e\": \"env.switcher\",\n F11: \"pane.zoom\",\n z: \"pane.zoom\",\n F1: \"help.show\",\n \"?\": \"help.show\",\n \"ctrl+/\": \"keybindings.show\",\n escape: \"overlay.close\",\n \"ctrl+q\": \"app.quit\",\n \"ctrl+x\": \"request.cancel\",\n \"ctrl+shift+c\": \"response.copy\",\n \"ctrl+f\": \"response.search\",\n \"ctrl+tab\": \"response.tab.next\",\n \"ctrl+shift+tab\": \"response.tab.prev\",\n};\n\nconst VIM_DEFAULTS: Record<string, CommandId> = {\n ...VSCODE_DEFAULTS,\n \"ctrl+w h\": \"pane.focusFiles\",\n \"ctrl+w l\": \"pane.focusResponse\",\n \"ctrl+w k\": \"pane.focusEditor\",\n};\n\nexport const COMMAND_LABELS: Record<CommandId, string> = {\n \"request.send\": \"Send request\",\n \"request.cancel\": \"Cancel request\",\n \"pane.focusNext\": \"Focus next pane\",\n \"pane.focusPrev\": \"Focus previous pane\",\n \"pane.focusFiles\": \"Focus files pane\",\n \"pane.focusEditor\": \"Focus editor pane\",\n \"pane.focusResponse\": \"Focus response pane\",\n \"sidebar.toggle\": \"Toggle sidebar\",\n \"file.save\": \"Save file\",\n \"env.switcher\": \"Environment switcher\",\n \"env.selectNext\": \"Next environment\",\n \"env.selectPrev\": \"Previous environment\",\n \"env.apply\": \"Apply environment\",\n \"overlay.close\": \"Close overlay\",\n \"app.quit\": \"Quit\",\n \"palette.commands\": \"Command palette\",\n \"palette.files\": \"Open file\",\n \"help.show\": \"Help\",\n \"keybindings.show\": \"Show keybindings\",\n \"pane.zoom\": \"Zoom pane\",\n \"response.tab.next\": \"Next response tab\",\n \"response.tab.prev\": \"Previous response tab\",\n \"response.copy\": \"Copy response\",\n \"response.search\": \"Search response\",\n \"editor.searchNext\": \"Find next in editor\",\n};\n\nconst CHORD_PART_LABELS: Record<string, string> = {\n ctrl: \"Ctrl\",\n shift: \"Shift\",\n alt: \"Alt\",\n meta: \"Meta\",\n escape: \"Esc\",\n tab: \"Tab\",\n enter: \"Enter\",\n space: \"Space\",\n backspace: \"Backspace\",\n delete: \"Delete\",\n up: \"Up\",\n down: \"Down\",\n left: \"Left\",\n right: \"Right\",\n};\n\nexport function formatKeyChord(key: string): string {\n if (/^F\\d+$/u.test(key)) {\n return key;\n }\n if (key.length === 1) {\n return key === \"?\" ? \"?\" : key.toUpperCase();\n }\n\n return key\n .split(\"+\")\n .map((part) => CHORD_PART_LABELS[part] ?? part.toUpperCase())\n .join(\"+\");\n}\n\nexport function buildKeybindingsViewLines(\n bindings: Record<string, CommandId>,\n maxLines?: number,\n): string[] {\n const byCommand = new Map<CommandId, string[]>();\n for (const [key, command] of Object.entries(bindings)) {\n const keys = byCommand.get(command) ?? [];\n keys.push(key);\n byCommand.set(command, keys);\n }\n\n const rows = [...byCommand.entries()]\n .map(([command, keys]) => {\n const formattedKeys = keys\n .sort((a, b) => a.localeCompare(b))\n .map(formatKeyChord)\n .join(\" / \");\n const label = COMMAND_LABELS[command] ?? command;\n return { label, row: `${formattedKeys.padEnd(28)} ${label}` };\n })\n .sort((a, b) => a.label.localeCompare(b.label))\n .map((entry) => entry.row);\n\n if (maxLines !== undefined && rows.length > maxLines) {\n const hidden = rows.length - maxLines + 1;\n return [...rows.slice(0, maxLines - 1), `… ${hidden} more`];\n }\n return rows;\n}\n\nexport function getConfigDir(): string {\n if (process.env.REQEX_CONFIG_DIR) {\n return process.env.REQEX_CONFIG_DIR;\n }\n if (process.platform === \"win32\") {\n const appData = process.env.APPDATA ?? path.join(os.homedir(), \"AppData\", \"Roaming\");\n return path.join(appData, \"reqex\");\n }\n if (process.platform === \"darwin\") {\n return path.join(os.homedir(), \"Library\", \"Application Support\", \"reqex\");\n }\n const xdg = process.env.XDG_CONFIG_HOME ?? path.join(os.homedir(), \".config\");\n return path.join(xdg, \"reqex\");\n}\n\nexport function getProjectConfigDir(workspaceRoot: string): string {\n return path.join(workspaceRoot, \".reqex\");\n}\n\nfunction readJsonIfExists(filePath: string): KeybindingConfig | null {\n try {\n if (!fs.existsSync(filePath)) {\n return null;\n }\n const raw = fs.readFileSync(filePath, \"utf8\");\n return JSON.parse(raw) as KeybindingConfig;\n } catch {\n return null;\n }\n}\n\nexport function loadKeybindings(workspaceRoot: string): {\n preset: KeymapPreset;\n bindings: Record<string, CommandId>;\n} {\n const userConfig = readJsonIfExists(path.join(getConfigDir(), \"keybindings.json\"));\n const projectConfig = readJsonIfExists(\n path.join(getProjectConfigDir(workspaceRoot), \"keybindings.json\"),\n );\n\n const preset =\n projectConfig?.preset ?? userConfig?.preset ?? (\"vscode\" as KeymapPreset);\n const defaults = preset === \"vim\" ? VIM_DEFAULTS : VSCODE_DEFAULTS;\n\n return {\n preset,\n bindings: {\n ...defaults,\n ...userConfig?.bindings,\n ...projectConfig?.bindings,\n },\n };\n}\n\nexport function watchKeybindings(\n workspaceRoot: string,\n onChange: () => void,\n): () => void {\n const dirs = [getConfigDir(), getProjectConfigDir(workspaceRoot)];\n const watchers = dirs.map((dir) => {\n try {\n fs.mkdirSync(dir, { recursive: true });\n } catch {\n // ignore\n }\n return fs.watch(dir, { persistent: false }, () => onChange());\n });\n return () => {\n for (const watcher of watchers) {\n watcher.close();\n }\n };\n}\n\nexport type FooterHintContext = Readonly<{\n focusPane: \"files\" | \"editor\" | \"response\";\n overlay: \"none\" | \"env\" | \"help\" | \"commandPalette\" | \"filePicker\" | \"keybindings\";\n viewportWidth: number;\n sending?: boolean;\n}>;\n\nconst FOOTER_HINTS: Record<string, readonly string[]> = {\n editor: [\"F5 Send\", \"Ctrl+S Save\", \"Tab Panes\", \"F2 Palette\"],\n response: [\"Tab Panes\", \"Ctrl+Shift+C Copy\", \"F5 Send\", \"F2 Palette\"],\n files: [\"Enter Open\", \"Tab Panes\", \"Ctrl+P Files\", \"F2 Palette\"],\n overlay: [\"↑↓ Navigate\", \"Enter Select\", \"Esc Close\"],\n sending: [\"Ctrl+X Cancel\", \"Tab Panes\", \"Ctrl+Q Quit\"],\n};\n\nexport function footerHints(context: FooterHintContext): string {\n let hints: readonly string[];\n if (context.overlay !== \"none\") {\n hints = FOOTER_HINTS.overlay!;\n } else if (context.sending) {\n hints = FOOTER_HINTS.sending!;\n } else {\n hints = FOOTER_HINTS[context.focusPane] ?? FOOTER_HINTS.editor!;\n }\n\n const leftBudget = 48;\n const maxWidth = Math.max(20, context.viewportWidth - leftBudget);\n let text = hints.join(\" · \");\n if (text.length > maxWidth) {\n text = `${text.slice(0, maxWidth - 1)}…`;\n }\n return text;\n}\n\nexport const HELP_HINT_LINES: readonly string[] = [\n \"F5 Send request under cursor\",\n \"Tab / Shift+Tab Cycle panes\",\n \"Ctrl+S Save file\",\n \"Ctrl+E Environment switcher\",\n \"F2 / Ctrl+Shift+P Command palette\",\n \"Ctrl+Shift+C Copy response tab\",\n \"Ctrl+X Cancel request · Ctrl+Q Quit\",\n \"Ctrl+/ Full keybindings · F1 Quick help\",\n];\n","import { cli, io } from \"httpyac\";\nimport type { PromptHandler } from \"./types.js\";\n\nlet promptHandler: PromptHandler = async () => undefined;\n\nexport function setPromptHandler(handler: PromptHandler): void {\n promptHandler = handler;\n}\n\nexport function initEngineProviders(): void {\n cli.initFileProvider();\n io.userInteractionProvider.isTrusted = () => true;\n io.userInteractionProvider.showNote = async (message) => {\n const result = await promptHandler({ kind: \"confirm\", message });\n return result === true;\n };\n io.userInteractionProvider.showInputPrompt = async (message, defaultValue, masked) => {\n const result = await promptHandler({\n kind: \"input\",\n message,\n defaultValue,\n masked: masked ?? false,\n });\n return typeof result === \"string\" ? result : undefined;\n };\n io.userInteractionProvider.showListPrompt = async (message, values) => {\n const result = await promptHandler({ kind: \"list\", message, values });\n return typeof result === \"string\" ? result : undefined;\n };\n io.userInteractionProvider.showInformationMessage = async (message) => {\n await promptHandler({ kind: \"confirm\", message });\n return undefined;\n };\n io.userInteractionProvider.showWarnMessage = async (message) => {\n await promptHandler({ kind: \"confirm\", message });\n return undefined;\n };\n io.userInteractionProvider.showErrorMessage = async (message) => {\n await promptHandler({ kind: \"confirm\", message });\n return undefined;\n };\n}\n","import type { RequestRegion } from \"./types.js\";\n\n/** Resolve the innermost request region containing a 0-based editor line. */\nexport function resolveRegionAtLine(\n regions: readonly RequestRegion[],\n line: number,\n): RequestRegion | null {\n const candidates = regions.filter(\n (region) =>\n region.hasRequest &&\n !region.isGlobal &&\n region.startLine <= line &&\n line <= region.endLine,\n );\n\n if (candidates.length === 0) {\n return null;\n }\n\n return candidates.reduce((best, current) => {\n const bestSpan = best.endLine - best.startLine;\n const currentSpan = current.endLine - current.startLine;\n if (currentSpan < bestSpan) {\n return current;\n }\n if (currentSpan === bestSpan && current.startLine > best.startLine) {\n return current;\n }\n return best;\n });\n}\n\nexport function regionContainsLine(region: RequestRegion, line: number): boolean {\n return line >= region.startLine && line <= region.endLine;\n}\n\nconst HTTP_METHOD_PREFIX =\n /^\\s*(GET|POST|PUT|PATCH|DELETE|HEAD|OPTIONS|CONNECT|TRACE|GRAPHQL)\\b/u;\n\nfunction markerColumnAfterMethod(line: string): number {\n const match = HTTP_METHOD_PREFIX.exec(line);\n return match ? match[0].length : 0;\n}\n\nexport function buildRegionDiagnostics(\n regions: readonly RequestRegion[],\n activeRegionId: string | null,\n fileLines: readonly string[],\n): ReadonlyArray<{\n line: number;\n startColumn: number;\n endColumn: number;\n severity: \"info\" | \"hint\";\n message?: string;\n}> {\n const markers: Array<{\n line: number;\n startColumn: number;\n endColumn: number;\n severity: \"info\" | \"hint\";\n message?: string;\n }> = [];\n\n for (const region of regions) {\n if (!region.hasRequest || region.isGlobal) {\n continue;\n }\n const isActive = region.id === activeRegionId;\n const line = fileLines[region.startLine] ?? \"\";\n const markerCol = markerColumnAfterMethod(line);\n markers.push({\n line: region.startLine,\n startColumn: markerCol,\n endColumn: markerCol + 1,\n severity: isActive ? \"hint\" : \"info\",\n message: `${region.method ?? \"REQ\"} ${region.name}`,\n });\n }\n\n return markers;\n}\n","import { store as httpyacStoreModule } from \"httpyac\";\nimport type { HttpFile, HttpRegion } from \"httpyac/dist/models/index.js\";\n\nimport type { ParsedFile, RequestRegion } from \"./types.js\";\n\nconst store = new httpyacStoreModule.HttpFileStore();\nconst versions = new Map<string, number>();\n\nfunction toRegion(region: HttpRegion): RequestRegion {\n return {\n id: region.id,\n name: region.symbol.name,\n method: region.request?.method,\n url: region.request?.url,\n startLine: region.symbol.startLine,\n endLine: region.symbol.endLine,\n isGlobal: region.isGlobal(),\n hasRequest: Boolean(region.request),\n };\n}\n\nexport function bumpParseVersion(filePath: string): number {\n const next = (versions.get(filePath) ?? 0) + 1;\n versions.set(filePath, next);\n return next;\n}\n\nexport function getParseVersion(filePath: string): number {\n return versions.get(filePath) ?? 0;\n}\n\nexport async function parseFile(\n filePath: string,\n getText: () => Promise<string>,\n workingDir: string,\n version?: number,\n): Promise<ParsedFile> {\n const parseVersion = version ?? getParseVersion(filePath);\n const httpFile = await store.getOrCreate(filePath, getText, parseVersion, {\n workingDir,\n });\n\n const regions = httpFile.httpRegions.map(toRegion);\n return {\n path: filePath,\n regions,\n version: parseVersion,\n };\n}\n\nexport function getHttpFile(filePath: string): HttpFile | undefined {\n return store.get(filePath);\n}\n\nexport function getHttpRegion(filePath: string, regionId: string): HttpRegion | undefined {\n const httpFile = store.get(filePath);\n return httpFile?.httpRegions.find((region: HttpRegion) => region.id === regionId);\n}\n\nexport { store as httpFileStore };\n","import { getEnvironments, getVariables, send } from \"httpyac\";\nimport type { HttpResponse } from \"httpyac/dist/models/httpResponse.js\";\n\nimport { getHttpFile, getHttpRegion } from \"./store.js\";\nimport type { ExecResult, ResponseHeaderRow, TestResultDto } from \"./types.js\";\n\nfunction formatBody(body: unknown): string {\n if (body === undefined || body === null) {\n return \"\";\n }\n if (typeof body === \"string\") {\n return body;\n }\n if (Buffer.isBuffer(body)) {\n return body.toString(\"utf8\");\n }\n try {\n return JSON.stringify(body, null, 2);\n } catch {\n return String(body);\n }\n}\n\nfunction prettyBody(response: HttpResponse | undefined): string {\n if (!response) {\n return \"\";\n }\n if (response.prettyPrintBody) {\n return response.prettyPrintBody;\n }\n return formatBody(response.body);\n}\n\nfunction toHeaders(response: HttpResponse | undefined): ResponseHeaderRow[] {\n if (!response?.headers) {\n return [];\n }\n return Object.entries(response.headers).map(([name, value]) => ({\n name,\n value: Array.isArray(value) ? value.join(\", \") : String(value ?? \"\"),\n }));\n}\n\nfunction toTestResults(region: { testResults?: Array<{ message: string; status: string; error?: { displayMessage?: string } }> }): TestResultDto[] {\n if (!region.testResults) {\n return [];\n }\n return region.testResults.map((result) => ({\n message: result.message,\n status: result.status as TestResultDto[\"status\"],\n detail: result.error?.displayMessage,\n }));\n}\n\nexport async function sendRegion(options: {\n filePath: string;\n regionId: string;\n workingDir: string;\n activeEnvironment?: string[];\n variables?: Record<string, unknown>;\n}): Promise<ExecResult> {\n const httpFile = getHttpFile(options.filePath);\n const httpRegion = getHttpRegion(options.filePath, options.regionId);\n\n if (!httpFile || !httpRegion) {\n return {\n headers: [],\n body: \"\",\n prettyBody: \"\",\n testResults: [],\n error: \"Request region not found\",\n };\n }\n\n delete httpRegion.response;\n delete httpRegion.testResults;\n\n let capturedResponse: HttpResponse | undefined;\n const logResponse = async (response: HttpResponse | undefined) => {\n capturedResponse = response;\n };\n\n try {\n await send({\n httpFile,\n httpRegion,\n activeEnvironment: options.activeEnvironment,\n variables: options.variables,\n logResponse,\n });\n\n const response = capturedResponse ?? httpRegion.response;\n return {\n statusCode: response?.statusCode,\n statusMessage: response?.statusMessage,\n protocol: response?.protocol,\n headers: toHeaders(response),\n body: formatBody(response?.body),\n prettyBody: prettyBody(response),\n durationMs: response?.timings?.total,\n testResults: toTestResults(httpRegion),\n };\n } catch (error) {\n return {\n headers: [],\n body: \"\",\n prettyBody: \"\",\n testResults: toTestResults(httpRegion),\n error: error instanceof Error ? error.message : String(error),\n };\n }\n}\n\nexport async function listEnvironments(filePath: string): Promise<string[]> {\n const httpFile = getHttpFile(filePath);\n if (!httpFile) {\n return [];\n }\n return getEnvironments({ httpFile });\n}\n\nexport async function listVariables(\n filePath: string,\n activeEnvironment: string[] | undefined,\n): Promise<Record<string, unknown>> {\n const httpFile = getHttpFile(filePath);\n if (!httpFile) {\n return {};\n }\n return getVariables({ httpFile, activeEnvironment });\n}\n","import type { BindingMap, KeyContext } from \"@rezi-ui/core\";\n\nimport type { AppState, CommandId } from \"../state/types.js\";\n\nexport type CommandExecutor = (command: CommandId) => void;\n\nexport function buildBindingMap<S extends AppState>(\n bindings: Record<string, CommandId>,\n execute: CommandExecutor,\n): BindingMap<KeyContext<S>> {\n const map: Record<string, (ctx: KeyContext<S>) => void> = {};\n\n for (const [key, command] of Object.entries(bindings)) {\n map[key] = () => execute(command);\n }\n\n return map;\n}\n\nexport function commandFromPaletteId(id: string): CommandId | null {\n const known: Record<string, CommandId> = {\n \"request.send\": \"request.send\",\n \"request.cancel\": \"request.cancel\",\n \"file.save\": \"file.save\",\n \"env.switcher\": \"env.switcher\",\n \"palette.commands\": \"palette.commands\",\n \"help.show\": \"help.show\",\n \"keybindings.show\": \"keybindings.show\",\n \"pane.zoom\": \"pane.zoom\",\n \"sidebar.toggle\": \"sidebar.toggle\",\n };\n return known[id] ?? null;\n}\n\nexport const COMMAND_ITEMS: ReadonlyArray<{\n id: CommandId;\n label: string;\n description: string;\n shortcut?: string;\n}> = [\n { id: \"request.send\", label: \"Send Request\", description: \"Send request under cursor\", shortcut: \"F5\" },\n { id: \"request.cancel\", label: \"Cancel Request\", description: \"Cancel in-flight request\", shortcut: \"Ctrl+X\" },\n { id: \"file.save\", label: \"Save File\", description: \"Write editor to disk\", shortcut: \"Ctrl+S\" },\n { id: \"env.switcher\", label: \"Switch Environment\", description: \"Choose active environment\", shortcut: \"Ctrl+E\" },\n { id: \"sidebar.toggle\", label: \"Toggle Sidebar\", description: \"Show/hide file tree\", shortcut: \"Ctrl+B\" },\n { id: \"pane.zoom\", label: \"Zoom Pane\", description: \"Zoom focused pane\", shortcut: \"F11\" },\n { id: \"help.show\", label: \"Help\", description: \"Show quick help\", shortcut: \"F1\" },\n { id: \"keybindings.show\", label: \"Keybindings\", description: \"Show all keybindings\", shortcut: \"Ctrl+/\" },\n];\n","import { readFile, writeFile } from \"node:fs/promises\";\n\nimport chokidar, { type FSWatcher } from \"chokidar\";\nimport { EventEmitter } from \"node:events\";\n\nimport { discoverFileTree } from \"./discovery.js\";\nimport type { WorkspaceChangeEvent, WorkspaceFileNode } from \"./types.js\";\n\nexport class Workspace extends EventEmitter {\n readonly rootDir: string;\n private watcher: FSWatcher | null = null;\n private tree: WorkspaceFileNode[] = [];\n\n constructor(rootDir: string) {\n super();\n this.rootDir = rootDir;\n }\n\n async open(): Promise<WorkspaceFileNode[]> {\n this.tree = await discoverFileTree(this.rootDir);\n await this.startWatcher();\n this.emitChange({ type: \"ready\" });\n return this.tree;\n }\n\n getTree(): readonly WorkspaceFileNode[] {\n return this.tree;\n }\n\n async refresh(): Promise<WorkspaceFileNode[]> {\n this.tree = await discoverFileTree(this.rootDir);\n return this.tree;\n }\n\n async readFile(filePath: string): Promise<string> {\n return readFile(filePath, \"utf8\");\n }\n\n async writeFile(filePath: string, content: string): Promise<void> {\n await writeFile(filePath, content, \"utf8\");\n }\n\n async close(): Promise<void> {\n await this.watcher?.close();\n this.watcher = null;\n }\n\n private async startWatcher(): Promise<void> {\n await this.watcher?.close();\n this.watcher = chokidar.watch(this.rootDir, {\n ignoreInitial: true,\n ignored: [\n /(^|[/\\\\])\\../,\n \"**/node_modules/**\",\n \"**/.git/**\",\n \"**/dist/**\",\n ],\n awaitWriteFinish: { stabilityThreshold: 100, pollInterval: 50 },\n });\n\n const handle = async (type: WorkspaceChangeEvent[\"type\"], path: string) => {\n try {\n this.tree = await discoverFileTree(this.rootDir);\n this.emitChange({ type, path });\n } catch (error) {\n this.emit(\"error\", error instanceof Error ? error : new Error(String(error)));\n }\n };\n\n this.watcher.on(\"add\", (path) => void handle(\"add\", path));\n this.watcher.on(\"change\", (path) => void handle(\"change\", path));\n this.watcher.on(\"unlink\", (path) => void handle(\"unlink\", path));\n this.watcher.on(\"error\", (error) => {\n this.emit(\"error\", error instanceof Error ? error : new Error(String(error)));\n });\n }\n\n private emitChange(event: WorkspaceChangeEvent): void {\n this.emit(\"change\", event);\n }\n}\n\nexport { discoverFileTree, flattenFiles, findNodeByPath, isWorkspaceFile } from \"./discovery.js\";\n","import { readdir, stat } from \"node:fs/promises\";\nimport path from \"node:path\";\n\nimport type { WorkspaceFileKind, WorkspaceFileNode } from \"./types.js\";\n\nconst SKIP_DIRS = new Set([\n \".git\",\n \"node_modules\",\n \".reqex\",\n \"dist\",\n \".cursor\",\n]);\n\nconst FILE_KINDS: ReadonlyArray<{ ext: string; kind: WorkspaceFileKind }> = [\n { ext: \".http\", kind: \"http\" },\n { ext: \".rest\", kind: \"rest\" },\n { ext: \".env\", kind: \"env\" },\n { ext: \".env.json\", kind: \"env-json\" },\n];\n\nexport function classifyFile(filePath: string): WorkspaceFileKind | null {\n const base = path.basename(filePath);\n for (const { ext, kind } of FILE_KINDS) {\n if (base === ext || base.endsWith(ext)) {\n return kind;\n }\n }\n if (base.endsWith(\".env.json\")) {\n return \"env-json\";\n }\n return null;\n}\n\nexport function isWorkspaceFile(filePath: string): boolean {\n return classifyFile(filePath) !== null;\n}\n\nexport async function discoverFileTree(rootDir: string): Promise<WorkspaceFileNode[]> {\n return discoverDirectory(rootDir, rootDir);\n}\n\nasync function discoverDirectory(\n rootDir: string,\n currentDir: string,\n): Promise<WorkspaceFileNode[]> {\n let entries: string[];\n try {\n entries = await readdir(currentDir);\n } catch {\n return [];\n }\n\n entries.sort((a, b) => a.localeCompare(b));\n const nodes: WorkspaceFileNode[] = [];\n\n for (const entry of entries) {\n if (entry.startsWith(\".\") && entry !== \".env\" && !entry.endsWith(\".env.json\")) {\n if (SKIP_DIRS.has(entry)) {\n continue;\n }\n }\n\n const fullPath = path.join(currentDir, entry);\n let entryStat;\n try {\n entryStat = await stat(fullPath);\n } catch {\n continue;\n }\n\n if (entryStat.isDirectory()) {\n if (SKIP_DIRS.has(entry)) {\n continue;\n }\n const children = await discoverDirectory(rootDir, fullPath);\n if (children.length > 0) {\n nodes.push({\n name: entry,\n path: fullPath,\n kind: \"directory\",\n children,\n });\n }\n continue;\n }\n\n const fileKind = classifyFile(fullPath);\n if (!fileKind) {\n continue;\n }\n\n nodes.push({\n name: entry,\n path: fullPath,\n kind: \"file\",\n fileKind,\n });\n }\n\n return nodes;\n}\n\nexport function flattenFiles(nodes: readonly WorkspaceFileNode[]): WorkspaceFileNode[] {\n const files: WorkspaceFileNode[] = [];\n for (const node of nodes) {\n if (node.kind === \"file\") {\n files.push(node);\n } else if (node.children) {\n files.push(...flattenFiles(node.children));\n }\n }\n return files;\n}\n\nexport function findNodeByPath(\n nodes: readonly WorkspaceFileNode[],\n targetPath: string,\n): WorkspaceFileNode | null {\n for (const node of nodes) {\n if (node.path === targetPath) {\n return node;\n }\n if (node.children) {\n const found = findNodeByPath(node.children, targetPath);\n if (found) {\n return found;\n }\n }\n }\n return null;\n}\n\nexport function collectDirectoryPaths(nodes: readonly WorkspaceFileNode[]): string[] {\n const paths: string[] = [];\n for (const node of nodes) {\n if (node.kind === \"directory\") {\n paths.push(node.path);\n if (node.children) {\n paths.push(...collectDirectoryPaths(node.children));\n }\n }\n }\n return paths;\n}\n","import type { CursorPosition, EditorSelection } from \"@rezi-ui/core\";\n\nimport type { ExecResult, ParsedFile, RequestRegion } from \"../engine/types.js\";\nimport type { WorkspaceFileNode } from \"../workspace/types.js\";\n\nexport type FocusPane = \"files\" | \"editor\" | \"response\";\nexport type ResponseTab = \"pretty\" | \"raw\" | \"headers\" | \"variables\" | \"tests\";\nexport type OverlayKind = \"none\" | \"env\" | \"help\" | \"keybindings\" | \"commandPalette\" | \"filePicker\";\nexport type LayoutMode = \"three-pane\" | \"sidebar-overlay\" | \"stacked\";\n\nexport type AppState = Readonly<{\n workspaceRoot: string;\n fileTree: readonly WorkspaceFileNode[];\n expandedPaths: readonly string[];\n selectedFilePath: string | null;\n fileContent: string;\n fileLines: readonly string[];\n dirty: boolean;\n parseVersion: number;\n parsedFile: ParsedFile | null;\n activeRegion: RequestRegion | null;\n responseEditor: Readonly<{\n scrollTop: number;\n scrollLeft: number;\n cursor: CursorPosition;\n selection: EditorSelection | null;\n }>;\n resultGeneration: number;\n editor: Readonly<{\n cursor: CursorPosition;\n selection: EditorSelection | null;\n scrollTop: number;\n scrollLeft: number;\n searchQuery: string;\n }>;\n request: Readonly<{\n sending: boolean;\n error: string | null;\n result: ExecResult | null;\n activeEnvironment: readonly string[];\n environments: readonly string[];\n variables: Record<string, unknown>;\n }>;\n ui: Readonly<{\n focusPane: FocusPane;\n zoomPane: FocusPane | null;\n sidebarVisible: boolean;\n layoutMode: LayoutMode;\n viewportWidth: number;\n viewportHeight: number;\n overlay: OverlayKind;\n responseTab: ResponseTab;\n splitSizes: readonly [number, number, number];\n envSelectedIndex: number;\n commandPalette: Readonly<{\n open: boolean;\n query: string;\n selectedIndex: number;\n }>;\n pendingPrompt: Readonly<{\n kind: \"confirm\" | \"input\" | \"list\";\n message: string;\n values?: readonly string[];\n defaultValue?: string;\n masked?: boolean;\n }> | null;\n statusMessage: string | null;\n gitBranch: string | null;\n }>;\n settings: Readonly<{\n keymapPreset: \"vscode\" | \"vim\";\n keybindings: Readonly<Record<string, string>>;\n }>;\n}>;\n\nexport type CommandContext = Readonly<{\n state: Readonly<AppState>;\n update: (updater: AppState | ((prev: Readonly<AppState>) => AppState)) => void;\n runSend: () => Promise<void>;\n openFile: (path: string) => Promise<void>;\n saveFile: () => Promise<void>;\n refreshWorkspace: () => Promise<void>;\n reloadKeybindings: () => void;\n quit: () => void;\n}>;\n\nexport type CommandId =\n | \"request.send\"\n | \"request.cancel\"\n | \"pane.focusNext\"\n | \"pane.focusPrev\"\n | \"pane.focusFiles\"\n | \"pane.focusEditor\"\n | \"pane.focusResponse\"\n | \"sidebar.toggle\"\n | \"file.save\"\n | \"env.switcher\"\n | \"env.selectNext\"\n | \"env.selectPrev\"\n | \"env.apply\"\n | \"overlay.close\"\n | \"app.quit\"\n | \"palette.commands\"\n | \"palette.files\"\n | \"help.show\"\n | \"keybindings.show\"\n | \"pane.zoom\"\n | \"response.tab.next\"\n | \"response.tab.prev\"\n | \"response.copy\"\n | \"response.search\"\n | \"editor.searchNext\";\n\nexport const FOCUS_PANES: readonly FocusPane[] = [\"files\", \"editor\", \"response\"];\nexport const RESPONSE_TABS: readonly ResponseTab[] = [\n \"pretty\",\n \"raw\",\n \"headers\",\n \"variables\",\n \"tests\",\n];\n\nexport function createInitialState(workspaceRoot: string): AppState {\n return {\n workspaceRoot,\n fileTree: [],\n expandedPaths: [],\n selectedFilePath: null,\n fileContent: \"\",\n fileLines: [\"\"],\n dirty: false,\n parseVersion: 0,\n parsedFile: null,\n activeRegion: null,\n responseEditor: {\n scrollTop: 0,\n scrollLeft: 0,\n cursor: { line: 0, column: 0 },\n selection: null,\n },\n resultGeneration: 0,\n editor: {\n cursor: { line: 0, column: 0 },\n selection: null,\n scrollTop: 0,\n scrollLeft: 0,\n searchQuery: \"\",\n },\n request: {\n sending: false,\n error: null,\n result: null,\n activeEnvironment: [],\n environments: [],\n variables: {},\n },\n ui: {\n focusPane: \"editor\",\n zoomPane: null,\n sidebarVisible: true,\n layoutMode: \"three-pane\",\n viewportWidth: 120,\n viewportHeight: 40,\n overlay: \"none\",\n responseTab: \"pretty\",\n splitSizes: [22, 40, 38],\n envSelectedIndex: 0,\n commandPalette: { open: false, query: \"\", selectedIndex: 0 },\n pendingPrompt: null,\n statusMessage: null,\n gitBranch: null,\n },\n settings: {\n keymapPreset: \"vscode\",\n keybindings: {},\n },\n };\n}\n\nexport function linesFromContent(content: string): string[] {\n if (content.length === 0) {\n return [\"\"];\n }\n return content.split(/\\r?\\n/u);\n}\n\nexport function contentFromLines(lines: readonly string[]): string {\n return lines.join(\"\\n\");\n}\n\nexport function resolveLayoutMode(width: number): LayoutMode {\n if (width < 80) {\n return \"stacked\";\n }\n if (width < 120) {\n return \"sidebar-overlay\";\n }\n return \"three-pane\";\n}\n\nexport function nextPane(current: FocusPane): FocusPane {\n const index = FOCUS_PANES.indexOf(current);\n return FOCUS_PANES[(index + 1) % FOCUS_PANES.length] ?? \"editor\";\n}\n\nexport function prevPane(current: FocusPane): FocusPane {\n const index = FOCUS_PANES.indexOf(current);\n return FOCUS_PANES[(index + FOCUS_PANES.length - 1) % FOCUS_PANES.length] ?? \"editor\";\n}\n\nexport function nextResponseTab(current: ResponseTab): ResponseTab {\n const index = RESPONSE_TABS.indexOf(current);\n return RESPONSE_TABS[(index + 1) % RESPONSE_TABS.length] ?? \"pretty\";\n}\n\nexport function prevResponseTab(current: ResponseTab): ResponseTab {\n const index = RESPONSE_TABS.indexOf(current);\n return RESPONSE_TABS[(index + RESPONSE_TABS.length - 1) % RESPONSE_TABS.length] ?? \"pretty\";\n}\n","export type SendController = Readonly<{\n beginSend: () => number;\n cancelSend: () => number;\n isCurrent: (generation: number) => boolean;\n}>;\n\nexport function createSendController(): SendController {\n let sendGeneration = 0;\n\n return {\n beginSend(): number {\n sendGeneration += 1;\n return sendGeneration;\n },\n cancelSend(): number {\n sendGeneration += 1;\n return sendGeneration;\n },\n isCurrent(generation: number): boolean {\n return generation === sendGeneration;\n },\n };\n}\n","import {\n bumpParseVersion,\n listEnvironments,\n listVariables,\n parseFile,\n resolveRegionAtLine,\n sendRegion,\n setPromptHandler,\n} from \"../engine/index.js\";\nimport { flattenFiles, type Workspace } from \"../workspace/index.js\";\nimport {\n contentFromLines,\n createInitialState,\n linesFromContent,\n nextPane,\n prevPane,\n prevResponseTab,\n nextResponseTab,\n type AppState,\n type CommandContext,\n type CommandId,\n type FocusPane,\n} from \"./types.js\";\nimport { createSendController } from \"./send-controller.js\";\n\nexport function createCommandContext(deps: {\n workspace: Workspace;\n update: CommandContext[\"update\"];\n getState: () => AppState;\n quit: () => void;\n reloadKeybindings: () => void;\n}): CommandBus {\n setPromptHandler(async (request) => {\n return new Promise((resolve) => {\n deps.update((state) => ({\n ...state,\n ui: {\n ...state.ui,\n overlay: \"none\",\n pendingPrompt: {\n kind: request.kind,\n message: request.message,\n values: request.kind === \"list\" ? request.values : undefined,\n defaultValue: request.kind === \"input\" ? request.defaultValue : undefined,\n masked: request.kind === \"input\" ? request.masked : undefined,\n },\n },\n }));\n promptResolvers.push(resolve);\n });\n });\n\n const promptResolvers: Array<(value: string | boolean | undefined) => void> = [];\n const sendController = createSendController();\n\n const resolvePrompt = (value: string | boolean | undefined) => {\n const resolver = promptResolvers.pop();\n resolver?.(value);\n deps.update((state) => ({\n ...state,\n ui: { ...state.ui, pendingPrompt: null },\n }));\n };\n\n const openFile = async (path: string) => {\n const content = await deps.workspace.readFile(path);\n const lines = linesFromContent(content);\n const parsed = await parseFile(path, async () => content, deps.workspace.rootDir);\n const environments = await listEnvironments(path);\n const variables = await listVariables(path, [...deps.getState().request.activeEnvironment]);\n const activeRegion = resolveRegionAtLine(parsed.regions, 0);\n\n deps.update((state) => ({\n ...state,\n selectedFilePath: path,\n fileContent: content,\n fileLines: lines,\n dirty: false,\n parseVersion: parsed.version,\n parsedFile: parsed,\n activeRegion,\n editor: {\n ...state.editor,\n cursor: { line: activeRegion?.startLine ?? 0, column: 0 },\n selection: null,\n scrollTop: activeRegion?.startLine ?? 0,\n },\n request: {\n ...state.request,\n error: null,\n result: null,\n environments,\n variables,\n },\n ui: {\n ...state.ui,\n focusPane: \"editor\",\n statusMessage: null,\n },\n }));\n };\n\n const refreshWorkspace = async () => {\n const tree = await deps.workspace.refresh();\n deps.update((state) => ({ ...state, fileTree: tree }));\n };\n\n const saveFile = async () => {\n const state = deps.getState();\n if (!state.selectedFilePath || !state.dirty) {\n return;\n }\n const content = contentFromLines(state.fileLines);\n await deps.workspace.writeFile(state.selectedFilePath, content);\n const version = bumpParseVersion(state.selectedFilePath);\n const parsed = await parseFile(\n state.selectedFilePath,\n async () => content,\n deps.workspace.rootDir,\n version,\n );\n const activeRegion = state.activeRegion\n ? parsed.regions.find((region) => region.id === state.activeRegion?.id) ??\n resolveRegionAtLine(parsed.regions, state.editor.cursor.line)\n : resolveRegionAtLine(parsed.regions, state.editor.cursor.line);\n\n deps.update((s) => ({\n ...s,\n fileContent: content,\n dirty: false,\n parsedFile: parsed,\n activeRegion: activeRegion ?? null,\n ui: { ...s.ui, statusMessage: \"Saved\" },\n }));\n };\n\n const runSend = async () => {\n const state = deps.getState();\n if (!state.selectedFilePath || !state.parsedFile) {\n return;\n }\n\n const region = resolveRegionAtLine(state.parsedFile.regions, state.editor.cursor.line);\n if (!region) {\n deps.update((s) => ({\n ...s,\n request: { ...s.request, error: \"No request region under cursor\" },\n ui: { ...s.ui, focusPane: \"response\" },\n }));\n return;\n }\n\n const gen = sendController.beginSend();\n\n deps.update((s) => ({\n ...s,\n activeRegion: region,\n request: { ...s.request, sending: true, error: null, result: null },\n responseEditor: {\n scrollTop: 0,\n scrollLeft: 0,\n cursor: { line: 0, column: 0 },\n selection: null,\n },\n resultGeneration: s.resultGeneration + 1,\n ui: { ...s.ui, focusPane: \"response\", responseTab: \"pretty\" },\n }));\n\n await new Promise<void>((resolve) => setImmediate(resolve));\n\n const result = await sendRegion({\n filePath: state.selectedFilePath,\n regionId: region.id,\n workingDir: deps.workspace.rootDir,\n activeEnvironment: [...state.request.activeEnvironment],\n variables: state.request.variables,\n });\n\n if (!sendController.isCurrent(gen)) {\n return;\n }\n\n const variables = await listVariables(state.selectedFilePath, [\n ...deps.getState().request.activeEnvironment,\n ]);\n\n if (!sendController.isCurrent(gen)) {\n return;\n }\n\n deps.update((s) => ({\n ...s,\n request: {\n ...s.request,\n sending: false,\n result,\n error: result.error ?? null,\n variables,\n },\n }));\n };\n\n const focusPane = (pane: FocusPane) => {\n deps.update((state) => ({\n ...state,\n ui: { ...state.ui, focusPane: pane },\n }));\n };\n\n const execute = (command: CommandId) => {\n const state = deps.getState();\n\n switch (command) {\n case \"request.send\":\n void runSend();\n break;\n case \"request.cancel\":\n if (!state.request.sending) {\n break;\n }\n sendController.cancelSend();\n deps.update((s) => ({\n ...s,\n request: {\n ...s.request,\n sending: false,\n error: \"Request cancelled\",\n result: null,\n },\n ui: { ...s.ui, statusMessage: \"Request cancelled\" },\n }));\n break;\n case \"pane.focusNext\":\n focusPane(nextPane(state.ui.focusPane));\n break;\n case \"pane.focusPrev\":\n focusPane(prevPane(state.ui.focusPane));\n break;\n case \"pane.focusFiles\":\n focusPane(\"files\");\n break;\n case \"pane.focusEditor\":\n focusPane(\"editor\");\n break;\n case \"pane.focusResponse\":\n focusPane(\"response\");\n break;\n case \"sidebar.toggle\":\n deps.update((s) => ({\n ...s,\n ui: { ...s.ui, sidebarVisible: !s.ui.sidebarVisible },\n }));\n break;\n case \"file.save\":\n void saveFile();\n break;\n case \"env.switcher\":\n deps.update((s) => ({\n ...s,\n ui: {\n ...s.ui,\n overlay: s.ui.overlay === \"env\" ? \"none\" : \"env\",\n envSelectedIndex: Math.max(\n 0,\n s.request.environments.indexOf(s.request.activeEnvironment.join(\",\")) || 0,\n ),\n },\n }));\n break;\n case \"env.selectNext\":\n if (state.ui.overlay === \"env\") {\n deps.update((s) => ({\n ...s,\n ui: {\n ...s.ui,\n envSelectedIndex: Math.min(\n s.request.environments.length,\n s.ui.envSelectedIndex + 1,\n ),\n },\n }));\n }\n break;\n case \"env.selectPrev\":\n if (state.ui.overlay === \"env\") {\n deps.update((s) => ({\n ...s,\n ui: {\n ...s.ui,\n envSelectedIndex: Math.max(0, s.ui.envSelectedIndex - 1),\n },\n }));\n }\n break;\n case \"env.apply\": {\n const envName = state.request.environments[state.ui.envSelectedIndex];\n void (async () => {\n const activeEnvironment = envName ? [envName] : [];\n const variables = state.selectedFilePath\n ? await listVariables(state.selectedFilePath, activeEnvironment)\n : {};\n deps.update((s) => ({\n ...s,\n request: { ...s.request, activeEnvironment, variables },\n ui: { ...s.ui, overlay: \"none\" },\n }));\n })();\n break;\n }\n case \"overlay.close\":\n deps.update((s) => ({\n ...s,\n ui: {\n ...s.ui,\n overlay: \"none\",\n commandPalette: { ...s.ui.commandPalette, open: false },\n pendingPrompt: null,\n },\n }));\n resolvePrompt(undefined);\n break;\n case \"app.quit\":\n deps.quit();\n break;\n case \"palette.commands\":\n deps.update((s) => ({\n ...s,\n ui: {\n ...s.ui,\n overlay: \"commandPalette\",\n commandPalette: { open: true, query: \"\", selectedIndex: 0 },\n },\n }));\n break;\n case \"palette.files\": {\n const files = flattenFiles(state.fileTree).filter((node) => node.kind === \"file\");\n const first = files[0]?.path;\n if (first) {\n void openFile(first);\n }\n break;\n }\n case \"help.show\":\n deps.update((s) => ({\n ...s,\n ui: { ...s.ui, overlay: s.ui.overlay === \"help\" ? \"none\" : \"help\" },\n }));\n break;\n case \"keybindings.show\":\n deps.update((s) => ({\n ...s,\n ui: {\n ...s.ui,\n overlay: s.ui.overlay === \"keybindings\" ? \"none\" : \"keybindings\",\n },\n }));\n break;\n case \"pane.zoom\":\n deps.update((s) => ({\n ...s,\n ui: {\n ...s.ui,\n zoomPane: s.ui.zoomPane ? null : s.ui.focusPane,\n },\n }));\n break;\n case \"response.tab.next\":\n deps.update((s) => ({\n ...s,\n ui: { ...s.ui, responseTab: nextResponseTab(s.ui.responseTab) },\n }));\n break;\n case \"response.tab.prev\":\n deps.update((s) => ({\n ...s,\n ui: { ...s.ui, responseTab: prevResponseTab(s.ui.responseTab) },\n }));\n break;\n case \"response.copy\":\n deps.update((s) => ({\n ...s,\n ui: { ...s.ui, statusMessage: \"Copy requested (see clipboard handler)\" },\n }));\n break;\n case \"response.search\":\n deps.update((s) => ({\n ...s,\n ui: { ...s.ui, focusPane: \"response\", responseTab: \"pretty\" },\n }));\n break;\n case \"editor.searchNext\":\n break;\n default:\n break;\n }\n };\n\n const context: CommandContext & { execute: (command: CommandId) => void } = {\n get state() {\n return deps.getState();\n },\n update: deps.update,\n runSend,\n openFile,\n saveFile,\n refreshWorkspace,\n reloadKeybindings: deps.reloadKeybindings,\n quit: deps.quit,\n execute,\n };\n\n return context;\n}\n\nexport type CommandBus = CommandContext & { execute: (command: CommandId) => void };\n\nexport { createInitialState };\n","import path from \"node:path\";\n\nimport {\n rgb,\n ui,\n type CursorPosition,\n type EditorSelection,\n type VNode,\n} from \"@rezi-ui/core\";\n\nimport { buildRegionDiagnostics, resolveRegionAtLine } from \"../engine/index.js\";\nimport { buildKeybindingsViewLines, footerHints, HELP_HINT_LINES } from \"../config/keybindings.js\";\nimport { COMMAND_ITEMS } from \"../keymap/index.js\";\nimport type { AppState, CommandId, FocusPane } from \"../state/types.js\";\nimport { contentFromLines, resolveLayoutMode } from \"../state/types.js\";\nimport type { WorkspaceFileNode } from \"../workspace/types.js\";\nimport { methodColor, prettyJsonIfPossible, statusTone, tokenizeHttpLine } from \"../utils/http-syntax.js\";\n\nexport type ViewDeps = Readonly<{\n onEditorChange: (lines: readonly string[], cursor: CursorPosition) => void;\n onEditorSelection: (selection: EditorSelection | null) => void;\n onEditorScroll: (scrollTop: number, scrollLeft: number) => void;\n onTreeSelect: (node: WorkspaceFileNode) => void;\n onTreeToggle: (node: WorkspaceFileNode, expanded: boolean) => void;\n onTreePress: (node: WorkspaceFileNode) => void;\n onResponseTab: (tab: AppState[\"ui\"][\"responseTab\"]) => void;\n onResponseScroll: (scrollTop: number, scrollLeft: number) => void;\n onResponseSelection: (selection: EditorSelection | null) => void;\n onResponseChange: (cursor: CursorPosition) => void;\n onSplitChange: (sizes: readonly number[]) => void;\n onCommandPaletteChange: (query: string) => void;\n onCommandPaletteSelect: (id: string) => void;\n onCommandPaletteSelectionChange: (index: number) => void;\n onOverlayClose: () => void;\n onEnvSelect: (index: number) => void;\n onResponseSearch: (query: string) => void;\n}>;\n\nfunction paneStyle(focused: boolean): { fg?: ReturnType<typeof rgb>; bold?: boolean } {\n return focused ? { fg: rgb(180, 220, 255), bold: true } : { fg: rgb(120, 120, 120) };\n}\n\nfunction renderFileTree(state: AppState, deps: ViewDeps): VNode {\n return ui.panel(\n {\n id: \"pane-files\",\n title: state.ui.focusPane === \"files\" ? \"● Files\" : \"Files\",\n style: paneStyle(state.ui.focusPane === \"files\"),\n },\n [\n ui.tree({\n id: \"file-tree\",\n data: state.fileTree,\n expanded: state.expandedPaths,\n selected: state.selectedFilePath ?? undefined,\n getKey: (node: WorkspaceFileNode) => node.path,\n getChildren: (node) =>\n node.kind === \"directory\" ? (node.children as WorkspaceFileNode[] | undefined) : undefined,\n onChange: (node, expanded) => deps.onTreeToggle(node, expanded),\n onSelect: (node) => deps.onTreeSelect(node),\n onPress: (node) => deps.onTreePress(node),\n renderNode: (node, _depth, nodeState) =>\n ui.row({ gap: 1 }, [\n ui.text(nodeState.selected ? `▸ ${node.name}` : node.name, {\n style: nodeState.selected\n ? { fg: rgb(255, 220, 120), bold: true }\n : state.dirty && node.path === state.selectedFilePath\n ? { fg: rgb(255, 180, 80) }\n : undefined,\n }),\n ]),\n flex: 1,\n minHeight: 8,\n }),\n ],\n );\n}\n\nfunction renderEditor(state: AppState, deps: ViewDeps, readOnly: boolean): VNode {\n const activeRegion =\n state.activeRegion ??\n (state.parsedFile\n ? resolveRegionAtLine(state.parsedFile.regions, state.editor.cursor.line)\n : null);\n\n const titleParts = [\n state.ui.focusPane === \"editor\" ? \"● Editor\" : \"Editor\",\n state.selectedFilePath ? state.selectedFilePath.split(\"/\").pop() : \"No file\",\n state.dirty ? \" ●\" : \"\",\n activeRegion ? ` | ${activeRegion.method ?? \"?\"} ${activeRegion.name}` : \"\",\n ];\n\n const diagnostics = state.parsedFile\n ? buildRegionDiagnostics(\n state.parsedFile.regions,\n activeRegion?.id ?? null,\n state.fileLines,\n )\n : [];\n\n return ui.panel(\n {\n id: \"pane-editor\",\n title: titleParts.join(\"\"),\n style: paneStyle(state.ui.focusPane === \"editor\"),\n },\n [\n ui.codeEditor({\n id: \"editor\",\n lines: state.fileLines,\n cursor: state.editor.cursor,\n selection: state.editor.selection,\n scrollTop: state.editor.scrollTop,\n scrollLeft: state.editor.scrollLeft,\n readOnly,\n lineNumbers: true,\n syntaxLanguage: \"plain\",\n tokenizeLine: tokenizeHttpLine,\n diagnostics,\n onChange: (lines, cursor) => deps.onEditorChange(lines, cursor),\n onSelectionChange: deps.onEditorSelection,\n onScroll: deps.onEditorScroll,\n flex: 1,\n minHeight: 8,\n }),\n ],\n );\n}\n\nfunction responseScrollProps(state: AppState, deps: ViewDeps) {\n return {\n scrollTop: state.responseEditor.scrollTop,\n scrollLeft: state.responseEditor.scrollLeft,\n onScroll: deps.onResponseScroll,\n };\n}\n\nfunction responseCursorProps(state: AppState, deps: ViewDeps) {\n return {\n cursor: state.responseEditor.cursor,\n selection: state.responseEditor.selection,\n onChange: (_lines: readonly string[], cursor: CursorPosition) => {\n deps.onResponseChange(cursor);\n },\n onSelectionChange: deps.onResponseSelection,\n };\n}\n\nfunction renderResponseBody(state: AppState, deps: ViewDeps): VNode {\n const result = state.request.result;\n const scroll = responseScrollProps(state, deps);\n const cursor = responseCursorProps(state, deps);\n const gen = state.resultGeneration;\n\n if (state.request.sending) {\n return ui.center(ui.spinner({ label: \"Waiting for response…\" }));\n }\n if (state.request.error && !result) {\n return ui.errorDisplay(state.request.error);\n }\n if (!result) {\n return ui.empty(\"No response\", {\n description: \"Press F5 to send the request under cursor\",\n });\n }\n\n switch (state.ui.responseTab) {\n case \"headers\":\n return ui.table({\n id: `response-headers-${gen}`,\n columns: [\n { key: \"name\", header: \"Header\", width: 24 },\n { key: \"value\", header: \"Value\", flex: 1 },\n ],\n data: [...result.headers],\n getRowKey: (row) => row.name,\n flex: 1,\n minHeight: 6,\n });\n case \"raw\":\n return ui.codeEditor({\n id: `response-raw-${gen}`,\n lines: result.body ? result.body.split(\"\\n\") : [\"\"],\n readOnly: true,\n lineNumbers: true,\n syntaxLanguage: \"plain\",\n ...cursor,\n ...scroll,\n flex: 1,\n });\n case \"variables\":\n return ui.codeEditor({\n id: `response-vars-${gen}`,\n lines: [JSON.stringify(state.request.variables, null, 2)],\n readOnly: true,\n syntaxLanguage: \"json\",\n ...cursor,\n ...scroll,\n flex: 1,\n });\n case \"tests\":\n return ui.column({ gap: 1, flex: 1 }, [\n ...result.testResults.map((test) =>\n ui.text(`${test.status === \"SUCCESS\" ? \"✓\" : \"✗\"} ${test.message}`, {\n style: {\n fg:\n test.status === \"SUCCESS\"\n ? rgb(120, 220, 120)\n : test.status === \"SKIPPED\"\n ? rgb(220, 220, 120)\n : rgb(220, 120, 120),\n },\n }),\n ),\n ]);\n case \"pretty\":\n default:\n return ui.codeEditor({\n id: `response-pretty-${gen}`,\n lines: prettyJsonIfPossible(result.prettyBody || result.body).split(\"\\n\"),\n readOnly: true,\n lineNumbers: true,\n syntaxLanguage: \"json\",\n searchQuery: state.editor.searchQuery || undefined,\n ...cursor,\n ...scroll,\n flex: 1,\n });\n }\n}\n\nfunction renderResponse(state: AppState, deps: ViewDeps): VNode {\n const result = state.request.result;\n const statusLine =\n state.request.sending || !result\n ? null\n : `${result.protocol ?? \"HTTP\"} ${result.statusCode ?? \"?\"} ${result.statusMessage ?? \"\"} · ${result.durationMs ?? \"?\"} ms`;\n\n const tabItems = [\n { key: \"pretty\", label: \"Pretty\" },\n { key: \"raw\", label: \"Raw\" },\n { key: \"headers\", label: \"Headers\" },\n { key: \"variables\", label: \"Vars\" },\n { key: \"tests\", label: \"Tests\" },\n ] as const;\n\n return ui.panel(\n {\n id: \"pane-response\",\n title: state.ui.focusPane === \"response\" ? \"● Response\" : \"Response\",\n style: paneStyle(state.ui.focusPane === \"response\"),\n },\n [\n ui.row({ gap: 2 }, [\n state.request.sending\n ? ui.spinner({ label: \"Sending request…\" })\n : ui.text(statusLine ?? \"Ready\", {\n style: { fg: rgb(...statusColor(result?.statusCode)), bold: true },\n }),\n result?.error && !state.request.sending\n ? ui.badge(result.error, { variant: \"error\" })\n : null,\n ]),\n ui.row({ gap: 1 }, [\n ...tabItems.map((tab) =>\n ui.button({\n id: `tab-${tab.key}`,\n label: tab.label,\n disabled: state.request.sending,\n onPress: () => deps.onResponseTab(tab.key),\n }),\n ),\n ]),\n renderResponseBody(state, deps),\n ],\n );\n}\n\nfunction statusColor(code: number | undefined): [number, number, number] {\n const tone = statusTone(code);\n switch (tone) {\n case \"green\":\n return [120, 220, 140];\n case \"yellow\":\n return [240, 200, 100];\n case \"red\":\n return [240, 120, 120];\n default:\n return [140, 200, 240];\n }\n}\n\nfunction renderMainLayout(state: AppState, deps: ViewDeps): VNode {\n const layoutMode = resolveLayoutMode(state.ui.viewportWidth);\n const zoom = state.ui.zoomPane;\n\n if (zoom) {\n if (zoom === \"files\") return renderFileTree(state, deps);\n if (zoom === \"editor\") return renderEditor(state, deps, false);\n return renderResponse(state, deps);\n }\n\n if (layoutMode === \"stacked\") {\n const pane =\n state.ui.focusPane === \"files\"\n ? renderFileTree(state, deps)\n : state.ui.focusPane === \"response\"\n ? renderResponse(state, deps)\n : renderEditor(state, deps, false);\n return pane;\n }\n\n if (layoutMode === \"sidebar-overlay\") {\n return ui.row({ gap: 1, flex: 1 }, [\n state.ui.sidebarVisible\n ? ui.box({ width: 28, flex: 0 }, [renderFileTree(state, deps)])\n : null,\n ui.column({ gap: 1, flex: 1 }, [\n renderEditor(state, deps, false),\n renderResponse(state, deps),\n ]),\n ]);\n }\n\n return ui.column({ gap: 1, flex: 1 }, [\n ui.splitPane(\n {\n id: \"main-split\",\n direction: \"horizontal\",\n sizes: [...state.ui.splitSizes],\n minSizes: [18, 24, 24],\n onChange: deps.onSplitChange,\n },\n [\n renderFileTree(state, deps),\n renderEditor(state, deps, false),\n renderResponse(state, deps),\n ],\n ),\n ]);\n}\n\nfunction renderFooter(state: AppState): VNode {\n const env =\n state.request.activeEnvironment.length > 0\n ? state.request.activeEnvironment.join(\",\")\n : \"none\";\n const dirName = path.basename(state.workspaceRoot);\n const branch = state.ui.gitBranch ?? \"—\";\n const fileName = state.selectedFilePath\n ? path.basename(state.selectedFilePath)\n : null;\n\n const hints = footerHints({\n focusPane: state.ui.focusPane,\n overlay: state.ui.overlay,\n viewportWidth: state.ui.viewportWidth,\n sending: state.request.sending,\n });\n\n return ui.statusBar({\n id: \"status-bar\",\n left: [\n ui.text(dirName, { style: { fg: rgb(180, 220, 255), bold: true } }),\n ui.text(` ⎇ ${branch}`, { style: { fg: rgb(160, 220, 160) } }),\n fileName ? ui.text(` | ${fileName}`) : null,\n state.dirty ? ui.text(\" ●\", { style: { fg: rgb(255, 180, 80) } }) : null,\n ui.text(` | env: ${env}`, { style: { fg: rgb(160, 200, 255) } }),\n state.ui.statusMessage ? ui.text(` | ${state.ui.statusMessage}`) : null,\n ].filter(Boolean) as VNode[],\n right: [ui.text(hints)],\n });\n}\n\nfunction renderOverlayContent(state: AppState, deps: ViewDeps): VNode {\n switch (state.ui.overlay) {\n case \"env\":\n return ui.modal({\n id: \"env-modal\",\n title: \"Environment\",\n content: ui.column({ gap: 1 }, [\n ui.text(\"Select environment (Enter to apply, Esc to close)\"),\n ui.text(\"(none)\", {\n style:\n state.ui.envSelectedIndex === 0\n ? { fg: rgb(255, 220, 120), bold: true }\n : undefined,\n }),\n ...state.request.environments.map((env, index) =>\n ui.text(env, {\n style:\n index + 1 === state.ui.envSelectedIndex\n ? { fg: rgb(255, 220, 120), bold: true }\n : undefined,\n }),\n ),\n ]),\n onClose: deps.onOverlayClose,\n width: 50,\n height: 16,\n });\n case \"help\":\n return ui.modal({\n id: \"help-modal\",\n title: \"reqex help\",\n content: ui.column({ gap: 1 }, HELP_HINT_LINES.map((line) => ui.text(line))),\n onClose: deps.onOverlayClose,\n width: 70,\n height: 14,\n });\n case \"keybindings\": {\n const maxLines = Math.max(8, Math.min(26, state.ui.viewportHeight - 8));\n const lines = buildKeybindingsViewLines(\n state.settings.keybindings as Record<string, CommandId>,\n maxLines,\n );\n return ui.modal({\n id: \"keybindings-modal\",\n title: \"Keybindings\",\n content: ui.column({ gap: 0 }, lines.map((line) => ui.text(line))),\n onClose: deps.onOverlayClose,\n width: 72,\n height: Math.min(maxLines + 4, 28),\n });\n }\n case \"commandPalette\":\n return ui.center(\n ui.commandPalette({\n id: \"command-palette\",\n open: true,\n query: state.ui.commandPalette.query,\n selectedIndex: state.ui.commandPalette.selectedIndex,\n sources: [\n {\n id: \"commands\",\n name: \"Commands\",\n getItems: (query) =>\n COMMAND_ITEMS.filter((item) =>\n item.label.toLowerCase().includes(query.toLowerCase()),\n ).map((item) => ({\n id: item.id,\n label: item.label,\n description: item.description,\n shortcut: item.shortcut,\n sourceId: \"commands\",\n })),\n },\n ],\n onChange: deps.onCommandPaletteChange,\n onSelect: (item) => deps.onCommandPaletteSelect(item.id),\n onClose: deps.onOverlayClose,\n onSelectionChange: deps.onCommandPaletteSelectionChange,\n width: 60,\n }),\n );\n default:\n return ui.text(\"\");\n }\n}\n\nexport function renderApp(state: AppState, deps: ViewDeps): VNode {\n const base = ui.column({ gap: 1, flex: 1 }, [\n renderMainLayout(state, deps),\n renderFooter(state),\n ]);\n\n if (state.ui.overlay === \"none\") {\n return base;\n }\n\n return ui.layers([\n base,\n ui.layer({\n id: \"overlay-layer\",\n modal: true,\n backdrop: \"dim\",\n closeOnEscape: true,\n onClose: deps.onOverlayClose,\n content: renderOverlayContent(state, deps),\n }),\n ]);\n}\n\nexport function focusPaneId(pane: FocusPane): string {\n switch (pane) {\n case \"files\":\n return \"pane-files\";\n case \"editor\":\n return \"pane-editor\";\n case \"response\":\n return \"pane-response\";\n }\n}\n\nexport { contentFromLines, methodColor };\n","import type { CodeEditorSyntaxToken, CodeEditorTokenizeContext } from \"@rezi-ui/core\";\n\nconst KEYWORDS = new Set([\n \"GET\",\n \"POST\",\n \"PUT\",\n \"PATCH\",\n \"DELETE\",\n \"HEAD\",\n \"OPTIONS\",\n \"CONNECT\",\n \"TRACE\",\n \"GRAPHQL\",\n]);\n\nexport function tokenizeHttpLine(\n line: string,\n _context: CodeEditorTokenizeContext,\n): readonly CodeEditorSyntaxToken[] {\n const tokens: CodeEditorSyntaxToken[] = [];\n const methodMatch = /^\\s*(GET|POST|PUT|PATCH|DELETE|HEAD|OPTIONS|CONNECT|TRACE|GRAPHQL)\\b/u.exec(\n line,\n );\n if (methodMatch) {\n const method = methodMatch[1] ?? \"\";\n tokens.push({ text: method, kind: \"keyword\" });\n const rest = line.slice(methodMatch[0].length);\n if (rest.length > 0) {\n tokens.push({ text: rest, kind: \"string\" });\n }\n return tokens;\n }\n\n if (/^\\s*#/u.test(line)) {\n return [{ text: line, kind: \"comment\" }];\n }\n if (/^\\s*\\/\\//u.test(line)) {\n return [{ text: line, kind: \"comment\" }];\n }\n if (/^\\s*@/u.test(line)) {\n return [{ text: line, kind: \"type\" }];\n }\n\n const headerMatch = /^\\s*([!#$%&'*+\\-.^_`|~0-9A-Za-z]+)(\\s*:\\s*)(.*)$/u.exec(line);\n if (headerMatch) {\n tokens.push({ text: headerMatch[1] ?? \"\", kind: \"function\" });\n tokens.push({ text: headerMatch[2] ?? \"\", kind: \"operator\" });\n tokens.push({ text: headerMatch[3] ?? \"\", kind: \"string\" });\n return tokens;\n }\n\n const words = line.split(/(\\s+)/u);\n for (const word of words) {\n if (KEYWORDS.has(word)) {\n tokens.push({ text: word, kind: \"keyword\" });\n } else if (word.length > 0) {\n tokens.push({ text: word, kind: \"plain\" });\n }\n }\n return tokens.length > 0 ? tokens : [{ text: line, kind: \"plain\" }];\n}\n\nexport function prettyJsonIfPossible(text: string): string {\n const trimmed = text.trim();\n if (!trimmed) {\n return text;\n }\n try {\n return JSON.stringify(JSON.parse(trimmed), null, 2);\n } catch {\n return text;\n }\n}\n\nexport function methodColor(method: string | undefined): \"green\" | \"yellow\" | \"red\" | \"cyan\" {\n switch ((method ?? \"GET\").toUpperCase()) {\n case \"GET\":\n case \"HEAD\":\n case \"OPTIONS\":\n return \"green\";\n case \"POST\":\n case \"PUT\":\n case \"PATCH\":\n return \"yellow\";\n case \"DELETE\":\n return \"red\";\n default:\n return \"cyan\";\n }\n}\n\nexport function statusTone(statusCode: number | undefined): \"green\" | \"yellow\" | \"red\" | \"cyan\" {\n if (!statusCode) {\n return \"cyan\";\n }\n if (statusCode >= 200 && statusCode < 300) {\n return \"green\";\n }\n if (statusCode >= 400 && statusCode < 500) {\n return \"yellow\";\n }\n if (statusCode >= 500) {\n return \"red\";\n }\n return \"cyan\";\n}\n","import clipboard from \"clipboardy\";\n\nexport async function copyToClipboard(text: string): Promise<boolean> {\n try {\n await clipboard.write(text);\n return true;\n } catch {\n if (process.stdout.write(`\\x1b]52;c;${Buffer.from(text, \"utf8\").toString(\"base64\")}\\x07`)) {\n return true;\n }\n return false;\n }\n}\n\nexport function disableFlowControl(): void {\n if (process.stdin.isTTY) {\n try {\n process.stdin.setRawMode?.(true);\n } catch {\n // ignore\n }\n }\n}\n","import { execFile } from \"node:child_process\";\nimport { promisify } from \"node:util\";\n\nconst execFileAsync = promisify(execFile);\n\nexport async function getGitBranch(root: string): Promise<string | null> {\n try {\n const { stdout } = await execFileAsync(\n \"git\",\n [\"-C\", root, \"rev-parse\", \"--abbrev-ref\", \"HEAD\"],\n { timeout: 2000 },\n );\n const branch = stdout.trim();\n return branch.length > 0 ? branch : null;\n } catch {\n return null;\n }\n}\n"],"mappings":"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","names":["path","process","path","path","path","path","path","path","path","process"]}
|
|
1
|
+
{"version":3,"sources":["../src/cli.ts","../src/config/keybindings.ts","../src/engine/io-provider.ts","../src/engine/region-resolver.ts","../src/engine/store.ts","../src/engine/send.ts","../src/keymap/dispatcher.ts","../src/workspace/index.ts","../src/workspace/discovery.ts","../src/state/types.ts","../src/state/send-controller.ts","../src/state/commands.ts","../src/ui/app-view.ts","../src/utils/http-syntax.ts","../src/utils/clipboard.ts","../src/utils/git.ts"],"sourcesContent":["import path from \"node:path\";\nimport process from \"node:process\";\n\nimport { createNodeApp, type NodeApp } from \"@rezi-ui/node\";\nimport type { UiEvent } from \"@rezi-ui/core\";\n\nimport { loadKeybindings, watchKeybindings } from \"./config/keybindings.js\";\nimport { initEngineProviders, resolveRegionAtLine } from \"./engine/index.js\";\nimport { buildBindingMap, commandFromPaletteId } from \"./keymap/index.js\";\nimport { createCommandContext, createInitialState, type CommandBus } from \"./state/commands.js\";\nimport type { AppState, FocusPane } from \"./state/types.js\";\nimport { contentFromLines, resolveLayoutMode } from \"./state/types.js\";\nimport { focusPaneId, renderApp } from \"./ui/app-view.js\";\nimport { copyToClipboard, disableFlowControl } from \"./utils/clipboard.js\";\nimport { getGitBranch } from \"./utils/git.js\";\nimport { Workspace, flattenFiles } from \"./workspace/index.js\";\n\nasync function main(): Promise<void> {\n initEngineProviders();\n\n const workspaceRoot = path.resolve(process.argv[2] ?? process.cwd());\n const workspace = new Workspace(workspaceRoot);\n const tree = await workspace.open();\n\n let currentState = createInitialState(workspaceRoot);\n currentState = {\n ...currentState,\n fileTree: tree,\n expandedPaths: tree.filter((n) => n.kind === \"directory\").map((n) => n.path),\n ui: {\n ...currentState.ui,\n gitBranch: await getGitBranch(workspaceRoot),\n },\n };\n\n let app: NodeApp<AppState> | null = null;\n let bus: CommandBus | null = null;\n\n const refreshGitBranch = async () => {\n const branch = await getGitBranch(workspaceRoot);\n app?.update((prev) => ({\n ...prev,\n ui: { ...prev.ui, gitBranch: branch },\n }));\n };\n\n const reloadKeybindings = () => {\n if (!app || !bus) {\n return;\n }\n const loaded = loadKeybindings(workspaceRoot);\n app.keys({\n ...buildBindingMap(loaded.bindings, (command) => {\n if (command === \"response.copy\") {\n void handleCopy(app!, currentState);\n }\n bus!.execute(command);\n }),\n enter: {\n handler: () => bus!.execute(\"env.apply\"),\n when: (ctx) => ctx.state.ui.overlay === \"env\",\n description: \"Apply selected environment\",\n },\n up: {\n handler: () => {\n if (currentState.ui.overlay === \"env\") {\n bus!.execute(\"env.selectPrev\");\n }\n },\n when: (ctx) =>\n ctx.state.ui.overlay === \"env\" || ctx.state.ui.overlay === \"commandPalette\",\n },\n down: {\n handler: () => {\n if (currentState.ui.overlay === \"env\") {\n bus!.execute(\"env.selectNext\");\n }\n },\n when: (ctx) =>\n ctx.state.ui.overlay === \"env\" || ctx.state.ui.overlay === \"commandPalette\",\n },\n });\n app.update((state) => ({\n ...state,\n settings: {\n keymapPreset: loaded.preset,\n keybindings: loaded.bindings,\n },\n }));\n };\n\n bus = createCommandContext({\n workspace,\n getState: () => currentState,\n update: (updater) => {\n app?.update((prev) => {\n currentState = typeof updater === \"function\" ? updater(prev) : updater;\n return currentState;\n });\n },\n quit: () => {\n void workspace.close().finally(() => {\n app?.stop().finally(() => process.exit(0));\n });\n },\n reloadKeybindings,\n });\n\n app = createNodeApp({ initialState: currentState });\n reloadKeybindings();\n disableFlowControl();\n\n const stopWatch = watchKeybindings(workspaceRoot, reloadKeybindings);\n\n workspace.on(\"change\", () => {\n void bus!.refreshWorkspace();\n void refreshGitBranch();\n });\n\n app.view((state) =>\n renderApp(state, {\n onEditorChange: (lines, cursor) => {\n app?.update((prev) => {\n const activeRegion = prev.parsedFile\n ? resolveRegionAtLine(prev.parsedFile.regions, cursor.line)\n : null;\n return {\n ...prev,\n fileLines: [...lines],\n dirty: contentFromLines(lines) !== prev.fileContent,\n activeRegion,\n ui: { ...prev.ui, focusPane: \"editor\" },\n editor: { ...prev.editor, cursor },\n };\n });\n },\n onEditorSelection: (selection) => {\n app?.update((prev) => {\n const cursorLine = selection?.active.line ?? prev.editor.cursor.line;\n const activeRegion = prev.parsedFile\n ? resolveRegionAtLine(prev.parsedFile.regions, cursorLine)\n : null;\n return {\n ...prev,\n activeRegion,\n ui: { ...prev.ui, focusPane: \"editor\" },\n editor: {\n ...prev.editor,\n selection,\n cursor: selection?.active ?? prev.editor.cursor,\n },\n };\n });\n },\n onEditorScroll: (scrollTop, scrollLeft) => {\n app?.update((prev) => ({\n ...prev,\n editor: { ...prev.editor, scrollTop, scrollLeft },\n }));\n },\n onTreeSelect: (node) => {\n if (node.kind === \"file\") {\n void bus!.openFile(node.path);\n }\n },\n onTreeToggle: (node, expanded) => {\n app?.update((prev) => ({\n ...prev,\n expandedPaths: expanded\n ? [...prev.expandedPaths, node.path]\n : prev.expandedPaths.filter((p) => p !== node.path),\n }));\n },\n onTreePress: (node) => {\n if (node.kind === \"file\") {\n void bus!.openFile(node.path);\n }\n },\n onResponseTab: (tab) => {\n app?.update((prev) => ({\n ...prev,\n ui: { ...prev.ui, responseTab: tab },\n responseEditor: {\n ...prev.responseEditor,\n scrollTop: 0,\n scrollLeft: 0,\n cursor: { line: 0, column: 0 },\n selection: null,\n },\n }));\n },\n onResponseScroll: (scrollTop, scrollLeft) => {\n app?.update((prev) => ({\n ...prev,\n responseEditor: { ...prev.responseEditor, scrollTop, scrollLeft },\n }));\n },\n onResponseSelection: (selection) => {\n app?.update((prev) => ({\n ...prev,\n ui: { ...prev.ui, focusPane: \"response\" },\n responseEditor: {\n ...prev.responseEditor,\n selection,\n cursor: selection?.active ?? prev.responseEditor.cursor,\n },\n }));\n },\n onResponseChange: (cursor) => {\n app?.update((prev) => ({\n ...prev,\n ui: { ...prev.ui, focusPane: \"response\" },\n responseEditor: { ...prev.responseEditor, cursor },\n }));\n },\n onSplitChange: (sizes) => {\n if (sizes.length === 3) {\n app?.update((prev) => ({\n ...prev,\n ui: { ...prev.ui, splitSizes: [sizes[0]!, sizes[1]!, sizes[2]!] },\n }));\n }\n },\n onCommandPaletteChange: (query) => {\n app?.update((prev) => ({\n ...prev,\n ui: {\n ...prev.ui,\n commandPalette: { ...prev.ui.commandPalette, query, selectedIndex: 0 },\n },\n }));\n },\n onCommandPaletteSelectionChange: (index) => {\n app?.update((prev) => ({\n ...prev,\n ui: {\n ...prev.ui,\n commandPalette: { ...prev.ui.commandPalette, selectedIndex: index },\n },\n }));\n },\n onCommandPaletteSelect: (id) => {\n bus?.execute(\"overlay.close\");\n const command = commandFromPaletteId(id);\n if (command && command !== \"palette.commands\") {\n bus?.execute(command);\n }\n },\n onOverlayClose: () => {\n bus?.execute(\"overlay.close\");\n },\n onEnvSelect: (index) => {\n app?.update((prev) => ({\n ...prev,\n ui: { ...prev.ui, envSelectedIndex: index },\n }));\n },\n onResponseSearch: (query) => {\n app?.update((prev) => ({\n ...prev,\n editor: { ...prev.editor, searchQuery: query },\n }));\n },\n }),\n );\n\n app.onEvent((event) => handleUiEvent(event, app!));\n\n const files = flattenFiles(tree).filter((node) => node.kind === \"file\");\n if (files[0]) {\n await bus.openFile(files[0].path);\n }\n\n await app.run();\n stopWatch();\n}\n\nasync function handleCopy(app: NodeApp<AppState>, state: AppState): Promise<void> {\n const result = state.request.result;\n if (!result) {\n return;\n }\n let text = result.body;\n if (state.ui.responseTab === \"pretty\") {\n text = result.prettyBody || result.body;\n } else if (state.ui.responseTab === \"headers\") {\n text = result.headers.map((h) => `${h.name}: ${h.value}`).join(\"\\n\");\n }\n const ok = await copyToClipboard(text);\n app.update((prev) => ({\n ...prev,\n ui: { ...prev.ui, statusMessage: ok ? \"Copied\" : \"Copy failed\" },\n }));\n}\n\nfunction handleUiEvent(event: UiEvent, app: NodeApp<AppState>): void {\n if (event.kind === \"engine\" && event.event.kind === \"resize\") {\n const resize = event.event;\n app.update((prev) => ({\n ...prev,\n ui: {\n ...prev.ui,\n viewportWidth: resize.cols,\n viewportHeight: resize.rows,\n layoutMode: resolveLayoutMode(resize.cols),\n sidebarVisible:\n resolveLayoutMode(resize.cols) === \"sidebar-overlay\"\n ? prev.ui.sidebarVisible\n : true,\n },\n }));\n return;\n }\n\n if (event.kind !== \"engine\" || event.event.kind !== \"mouse\") {\n return;\n }\n\n const { x, y } = event.event;\n const panes: Array<{ id: string; pane: FocusPane }> = [\n { id: \"pane-files\", pane: \"files\" },\n { id: \"pane-editor\", pane: \"editor\" },\n { id: \"pane-response\", pane: \"response\" },\n ];\n\n for (const entry of panes) {\n const rect = app.measureElement(entry.id);\n if (!rect) {\n continue;\n }\n if (x >= rect.x && x < rect.x + rect.w && y >= rect.y && y < rect.y + rect.h) {\n app.update((prev) => ({\n ...prev,\n ui: { ...prev.ui, focusPane: entry.pane },\n }));\n break;\n }\n }\n}\n\nvoid main().catch((error) => {\n console.error(error);\n process.exit(1);\n});\n\nexport { focusPaneId };\n","import fs from \"node:fs\";\nimport os from \"node:os\";\nimport path from \"node:path\";\n\nimport type { CommandId } from \"../state/types.js\";\n\nexport type KeymapPreset = \"vscode\" | \"vim\";\n\nexport type KeybindingConfig = Readonly<{\n preset?: KeymapPreset;\n bindings?: Readonly<Record<string, CommandId>>;\n}>;\n\nconst VSCODE_DEFAULTS: Record<string, CommandId> = {\n F5: \"request.send\",\n \"ctrl+enter\": \"request.send\",\n \"alt+enter\": \"request.send\",\n tab: \"pane.focusNext\",\n \"shift+tab\": \"pane.focusPrev\",\n \"ctrl+1\": \"pane.focusFiles\",\n \"ctrl+2\": \"pane.focusEditor\",\n \"ctrl+3\": \"pane.focusResponse\",\n \"alt+1\": \"pane.focusFiles\",\n \"alt+2\": \"pane.focusEditor\",\n \"alt+3\": \"pane.focusResponse\",\n \"ctrl+b\": \"sidebar.toggle\",\n \"ctrl+p\": \"palette.files\",\n \"ctrl+shift+p\": \"palette.commands\",\n F2: \"palette.commands\",\n \"ctrl+s\": \"file.save\",\n \"ctrl+e\": \"env.switcher\",\n F11: \"pane.zoom\",\n z: \"pane.zoom\",\n F1: \"help.show\",\n \"?\": \"help.show\",\n \"ctrl+/\": \"keybindings.show\",\n escape: \"overlay.close\",\n \"ctrl+q\": \"app.quit\",\n \"ctrl+x\": \"request.cancel\",\n \"ctrl+shift+c\": \"response.copy\",\n \"ctrl+f\": \"response.search\",\n \"ctrl+tab\": \"response.tab.next\",\n \"ctrl+shift+tab\": \"response.tab.prev\",\n};\n\nconst VIM_DEFAULTS: Record<string, CommandId> = {\n ...VSCODE_DEFAULTS,\n \"ctrl+w h\": \"pane.focusFiles\",\n \"ctrl+w l\": \"pane.focusResponse\",\n \"ctrl+w k\": \"pane.focusEditor\",\n};\n\nexport const COMMAND_LABELS: Record<CommandId, string> = {\n \"request.send\": \"Send request\",\n \"request.cancel\": \"Cancel request\",\n \"pane.focusNext\": \"Focus next pane\",\n \"pane.focusPrev\": \"Focus previous pane\",\n \"pane.focusFiles\": \"Focus files pane\",\n \"pane.focusEditor\": \"Focus editor pane\",\n \"pane.focusResponse\": \"Focus response pane\",\n \"sidebar.toggle\": \"Toggle sidebar\",\n \"file.save\": \"Save file\",\n \"env.switcher\": \"Environment switcher\",\n \"env.selectNext\": \"Next environment\",\n \"env.selectPrev\": \"Previous environment\",\n \"env.apply\": \"Apply environment\",\n \"overlay.close\": \"Close overlay\",\n \"app.quit\": \"Quit\",\n \"palette.commands\": \"Command palette\",\n \"palette.files\": \"Open file\",\n \"help.show\": \"Help\",\n \"keybindings.show\": \"Show keybindings\",\n \"pane.zoom\": \"Zoom pane\",\n \"response.tab.next\": \"Next response tab\",\n \"response.tab.prev\": \"Previous response tab\",\n \"response.copy\": \"Copy response\",\n \"response.search\": \"Search response\",\n \"editor.searchNext\": \"Find next in editor\",\n};\n\nconst CHORD_PART_LABELS: Record<string, string> = {\n ctrl: \"Ctrl\",\n shift: \"Shift\",\n alt: \"Alt\",\n meta: \"Meta\",\n escape: \"Esc\",\n tab: \"Tab\",\n enter: \"Enter\",\n space: \"Space\",\n backspace: \"Backspace\",\n delete: \"Delete\",\n up: \"Up\",\n down: \"Down\",\n left: \"Left\",\n right: \"Right\",\n};\n\nexport function formatKeyChord(key: string): string {\n if (/^F\\d+$/u.test(key)) {\n return key;\n }\n if (key.length === 1) {\n return key === \"?\" ? \"?\" : key.toUpperCase();\n }\n\n return key\n .split(\"+\")\n .map((part) => CHORD_PART_LABELS[part] ?? part.toUpperCase())\n .join(\"+\");\n}\n\nexport function buildKeybindingsViewLines(\n bindings: Record<string, CommandId>,\n maxLines?: number,\n): string[] {\n const byCommand = new Map<CommandId, string[]>();\n for (const [key, command] of Object.entries(bindings)) {\n const keys = byCommand.get(command) ?? [];\n keys.push(key);\n byCommand.set(command, keys);\n }\n\n const rows = [...byCommand.entries()]\n .map(([command, keys]) => {\n const formattedKeys = keys\n .sort((a, b) => a.localeCompare(b))\n .map(formatKeyChord)\n .join(\" / \");\n const label = COMMAND_LABELS[command] ?? command;\n return { label, row: `${formattedKeys.padEnd(28)} ${label}` };\n })\n .sort((a, b) => a.label.localeCompare(b.label))\n .map((entry) => entry.row);\n\n if (maxLines !== undefined && rows.length > maxLines) {\n const hidden = rows.length - maxLines + 1;\n return [...rows.slice(0, maxLines - 1), `… ${hidden} more`];\n }\n return rows;\n}\n\nexport function getConfigDir(): string {\n if (process.env.REQEX_CONFIG_DIR) {\n return process.env.REQEX_CONFIG_DIR;\n }\n if (process.platform === \"win32\") {\n const appData = process.env.APPDATA ?? path.join(os.homedir(), \"AppData\", \"Roaming\");\n return path.join(appData, \"reqex\");\n }\n if (process.platform === \"darwin\") {\n return path.join(os.homedir(), \"Library\", \"Application Support\", \"reqex\");\n }\n const xdg = process.env.XDG_CONFIG_HOME ?? path.join(os.homedir(), \".config\");\n return path.join(xdg, \"reqex\");\n}\n\nexport function getProjectConfigDir(workspaceRoot: string): string {\n return path.join(workspaceRoot, \".reqex\");\n}\n\nfunction readJsonIfExists(filePath: string): KeybindingConfig | null {\n try {\n if (!fs.existsSync(filePath)) {\n return null;\n }\n const raw = fs.readFileSync(filePath, \"utf8\");\n return JSON.parse(raw) as KeybindingConfig;\n } catch {\n return null;\n }\n}\n\nexport function loadKeybindings(workspaceRoot: string): {\n preset: KeymapPreset;\n bindings: Record<string, CommandId>;\n} {\n const userConfig = readJsonIfExists(path.join(getConfigDir(), \"keybindings.json\"));\n const projectConfig = readJsonIfExists(\n path.join(getProjectConfigDir(workspaceRoot), \"keybindings.json\"),\n );\n\n const preset =\n projectConfig?.preset ?? userConfig?.preset ?? (\"vscode\" as KeymapPreset);\n const defaults = preset === \"vim\" ? VIM_DEFAULTS : VSCODE_DEFAULTS;\n\n return {\n preset,\n bindings: {\n ...defaults,\n ...userConfig?.bindings,\n ...projectConfig?.bindings,\n },\n };\n}\n\nexport function watchKeybindings(\n workspaceRoot: string,\n onChange: () => void,\n): () => void {\n const dirs = [getConfigDir(), getProjectConfigDir(workspaceRoot)];\n const watchers = dirs.map((dir) => {\n try {\n fs.mkdirSync(dir, { recursive: true });\n } catch {\n // ignore\n }\n return fs.watch(dir, { persistent: false }, () => onChange());\n });\n return () => {\n for (const watcher of watchers) {\n watcher.close();\n }\n };\n}\n\nexport type FooterHintContext = Readonly<{\n focusPane: \"files\" | \"editor\" | \"response\";\n overlay: \"none\" | \"env\" | \"help\" | \"commandPalette\" | \"filePicker\" | \"keybindings\";\n viewportWidth: number;\n sending?: boolean;\n}>;\n\nconst FOOTER_HINTS: Record<string, readonly string[]> = {\n editor: [\"F5 Send\", \"Ctrl+S Save\", \"Tab Panes\", \"F2 Palette\"],\n response: [\"Tab Panes\", \"Ctrl+Shift+C Copy\", \"F5 Send\", \"F2 Palette\"],\n files: [\"Enter Open\", \"Tab Panes\", \"Ctrl+P Files\", \"F2 Palette\"],\n overlay: [\"↑↓ Navigate\", \"Enter Select\", \"Esc Close\"],\n sending: [\"Ctrl+X Cancel\", \"Tab Panes\", \"Ctrl+Q Quit\"],\n};\n\nexport function footerHints(context: FooterHintContext): string {\n let hints: readonly string[];\n if (context.overlay !== \"none\") {\n hints = FOOTER_HINTS.overlay!;\n } else if (context.sending) {\n hints = FOOTER_HINTS.sending!;\n } else {\n hints = FOOTER_HINTS[context.focusPane] ?? FOOTER_HINTS.editor!;\n }\n\n const leftBudget = 48;\n const maxWidth = Math.max(20, context.viewportWidth - leftBudget);\n let text = hints.join(\" · \");\n if (text.length > maxWidth) {\n text = `${text.slice(0, maxWidth - 1)}…`;\n }\n return text;\n}\n\nexport const HELP_HINT_LINES: readonly string[] = [\n \"F5 Send request under cursor\",\n \"Tab / Shift+Tab Cycle panes\",\n \"Ctrl+S Save file\",\n \"Ctrl+E Environment switcher\",\n \"F2 / Ctrl+Shift+P Command palette\",\n \"Ctrl+Shift+C Copy response tab\",\n \"Ctrl+X Cancel request · Ctrl+Q Quit\",\n \"Ctrl+/ Full keybindings · F1 Quick help\",\n];\n","import { cli, io } from \"httpyac\";\nimport type { PromptHandler } from \"./types.js\";\n\nlet promptHandler: PromptHandler = async () => undefined;\n\nexport function setPromptHandler(handler: PromptHandler): void {\n promptHandler = handler;\n}\n\nexport function initEngineProviders(): void {\n cli.initFileProvider();\n io.userInteractionProvider.isTrusted = () => true;\n io.userInteractionProvider.showNote = async (message) => {\n const result = await promptHandler({ kind: \"confirm\", message });\n return result === true;\n };\n io.userInteractionProvider.showInputPrompt = async (message, defaultValue, masked) => {\n const result = await promptHandler({\n kind: \"input\",\n message,\n defaultValue,\n masked: masked ?? false,\n });\n return typeof result === \"string\" ? result : undefined;\n };\n io.userInteractionProvider.showListPrompt = async (message, values) => {\n const result = await promptHandler({ kind: \"list\", message, values });\n return typeof result === \"string\" ? result : undefined;\n };\n io.userInteractionProvider.showInformationMessage = async (message) => {\n await promptHandler({ kind: \"confirm\", message });\n return undefined;\n };\n io.userInteractionProvider.showWarnMessage = async (message) => {\n await promptHandler({ kind: \"confirm\", message });\n return undefined;\n };\n io.userInteractionProvider.showErrorMessage = async (message) => {\n await promptHandler({ kind: \"confirm\", message });\n return undefined;\n };\n}\n","import type { RequestRegion } from \"./types.js\";\n\n/** Resolve the innermost request region containing a 0-based editor line. */\nexport function resolveRegionAtLine(\n regions: readonly RequestRegion[],\n line: number,\n): RequestRegion | null {\n const candidates = regions.filter(\n (region) =>\n region.hasRequest &&\n !region.isGlobal &&\n region.startLine <= line &&\n line <= region.endLine,\n );\n\n if (candidates.length === 0) {\n return null;\n }\n\n return candidates.reduce((best, current) => {\n const bestSpan = best.endLine - best.startLine;\n const currentSpan = current.endLine - current.startLine;\n if (currentSpan < bestSpan) {\n return current;\n }\n if (currentSpan === bestSpan && current.startLine > best.startLine) {\n return current;\n }\n return best;\n });\n}\n\nexport function regionContainsLine(region: RequestRegion, line: number): boolean {\n return line >= region.startLine && line <= region.endLine;\n}\n\nconst HTTP_METHOD_PREFIX =\n /^\\s*(GET|POST|PUT|PATCH|DELETE|HEAD|OPTIONS|CONNECT|TRACE|GRAPHQL)\\b/u;\n\nfunction markerColumnAfterMethod(line: string): number {\n const match = HTTP_METHOD_PREFIX.exec(line);\n return match ? match[0].length : 0;\n}\n\nexport function buildRegionDiagnostics(\n regions: readonly RequestRegion[],\n activeRegionId: string | null,\n fileLines: readonly string[],\n): ReadonlyArray<{\n line: number;\n startColumn: number;\n endColumn: number;\n severity: \"info\" | \"hint\";\n message?: string;\n}> {\n const markers: Array<{\n line: number;\n startColumn: number;\n endColumn: number;\n severity: \"info\" | \"hint\";\n message?: string;\n }> = [];\n\n for (const region of regions) {\n if (!region.hasRequest || region.isGlobal) {\n continue;\n }\n const isActive = region.id === activeRegionId;\n const line = fileLines[region.startLine] ?? \"\";\n const markerCol = markerColumnAfterMethod(line);\n markers.push({\n line: region.startLine,\n startColumn: markerCol,\n endColumn: markerCol + 1,\n severity: isActive ? \"hint\" : \"info\",\n message: `${region.method ?? \"REQ\"} ${region.name}`,\n });\n }\n\n return markers;\n}\n","import { store as httpyacStoreModule } from \"httpyac\";\nimport type { HttpFile, HttpRegion } from \"httpyac/dist/models/index.js\";\n\nimport type { ParsedFile, RequestRegion } from \"./types.js\";\n\nconst store = new httpyacStoreModule.HttpFileStore();\nconst versions = new Map<string, number>();\n\nfunction toRegion(region: HttpRegion): RequestRegion {\n return {\n id: region.id,\n name: region.symbol.name,\n method: region.request?.method,\n url: region.request?.url,\n startLine: region.symbol.startLine,\n endLine: region.symbol.endLine,\n isGlobal: region.isGlobal(),\n hasRequest: Boolean(region.request),\n };\n}\n\nexport function bumpParseVersion(filePath: string): number {\n const next = (versions.get(filePath) ?? 0) + 1;\n versions.set(filePath, next);\n return next;\n}\n\nexport function getParseVersion(filePath: string): number {\n return versions.get(filePath) ?? 0;\n}\n\nexport async function parseFile(\n filePath: string,\n getText: () => Promise<string>,\n workingDir: string,\n version?: number,\n): Promise<ParsedFile> {\n const parseVersion = version ?? getParseVersion(filePath);\n const httpFile = await store.getOrCreate(filePath, getText, parseVersion, {\n workingDir,\n });\n\n const regions = httpFile.httpRegions.map(toRegion);\n return {\n path: filePath,\n regions,\n version: parseVersion,\n };\n}\n\nexport function getHttpFile(filePath: string): HttpFile | undefined {\n return store.get(filePath);\n}\n\nexport function getHttpRegion(filePath: string, regionId: string): HttpRegion | undefined {\n const httpFile = store.get(filePath);\n return httpFile?.httpRegions.find((region: HttpRegion) => region.id === regionId);\n}\n\nexport { store as httpFileStore };\n","import { getEnvironments, getVariables, send } from \"httpyac\";\nimport type { HttpResponse } from \"httpyac/dist/models/httpResponse.js\";\n\nimport { getHttpFile, getHttpRegion } from \"./store.js\";\nimport type { ExecResult, ResponseHeaderRow, TestResultDto } from \"./types.js\";\n\nfunction formatBody(body: unknown): string {\n if (body === undefined || body === null) {\n return \"\";\n }\n if (typeof body === \"string\") {\n return body;\n }\n if (Buffer.isBuffer(body)) {\n return body.toString(\"utf8\");\n }\n try {\n return JSON.stringify(body, null, 2);\n } catch {\n return String(body);\n }\n}\n\nfunction prettyBody(response: HttpResponse | undefined): string {\n if (!response) {\n return \"\";\n }\n if (response.prettyPrintBody) {\n return response.prettyPrintBody;\n }\n return formatBody(response.body);\n}\n\nfunction toHeaders(response: HttpResponse | undefined): ResponseHeaderRow[] {\n if (!response?.headers) {\n return [];\n }\n return Object.entries(response.headers).map(([name, value]) => ({\n name,\n value: Array.isArray(value) ? value.join(\", \") : String(value ?? \"\"),\n }));\n}\n\nfunction toTestResults(region: { testResults?: Array<{ message: string; status: string; error?: { displayMessage?: string } }> }): TestResultDto[] {\n if (!region.testResults) {\n return [];\n }\n return region.testResults.map((result) => ({\n message: result.message,\n status: result.status as TestResultDto[\"status\"],\n detail: result.error?.displayMessage,\n }));\n}\n\nexport async function sendRegion(options: {\n filePath: string;\n regionId: string;\n workingDir: string;\n activeEnvironment?: string[];\n variables?: Record<string, unknown>;\n}): Promise<ExecResult> {\n const httpFile = getHttpFile(options.filePath);\n const httpRegion = getHttpRegion(options.filePath, options.regionId);\n\n if (!httpFile || !httpRegion) {\n return {\n headers: [],\n body: \"\",\n prettyBody: \"\",\n testResults: [],\n error: \"Request region not found\",\n };\n }\n\n delete httpRegion.response;\n delete httpRegion.testResults;\n\n let capturedResponse: HttpResponse | undefined;\n const logResponse = async (response: HttpResponse | undefined) => {\n capturedResponse = response;\n };\n\n try {\n await send({\n httpFile,\n httpRegion,\n activeEnvironment: options.activeEnvironment,\n variables: options.variables,\n logResponse,\n });\n\n const response = capturedResponse ?? httpRegion.response;\n return {\n statusCode: response?.statusCode,\n statusMessage: response?.statusMessage,\n protocol: response?.protocol,\n headers: toHeaders(response),\n body: formatBody(response?.body),\n prettyBody: prettyBody(response),\n durationMs: response?.timings?.total,\n testResults: toTestResults(httpRegion),\n };\n } catch (error) {\n return {\n headers: [],\n body: \"\",\n prettyBody: \"\",\n testResults: toTestResults(httpRegion),\n error: error instanceof Error ? error.message : String(error),\n };\n }\n}\n\nexport async function listEnvironments(filePath: string): Promise<string[]> {\n const httpFile = getHttpFile(filePath);\n if (!httpFile) {\n return [];\n }\n return getEnvironments({ httpFile });\n}\n\nexport async function listVariables(\n filePath: string,\n activeEnvironment: string[] | undefined,\n): Promise<Record<string, unknown>> {\n const httpFile = getHttpFile(filePath);\n if (!httpFile) {\n return {};\n }\n return getVariables({ httpFile, activeEnvironment });\n}\n","import type { BindingMap, KeyContext } from \"@rezi-ui/core\";\n\nimport type { AppState, CommandId } from \"../state/types.js\";\n\nexport type CommandExecutor = (command: CommandId) => void;\n\nexport function buildBindingMap<S extends AppState>(\n bindings: Record<string, CommandId>,\n execute: CommandExecutor,\n): BindingMap<KeyContext<S>> {\n const map: Record<string, (ctx: KeyContext<S>) => void> = {};\n\n for (const [key, command] of Object.entries(bindings)) {\n map[key] = () => execute(command);\n }\n\n return map;\n}\n\nexport function commandFromPaletteId(id: string): CommandId | null {\n const known: Record<string, CommandId> = {\n \"request.send\": \"request.send\",\n \"request.cancel\": \"request.cancel\",\n \"file.save\": \"file.save\",\n \"env.switcher\": \"env.switcher\",\n \"palette.commands\": \"palette.commands\",\n \"help.show\": \"help.show\",\n \"keybindings.show\": \"keybindings.show\",\n \"pane.zoom\": \"pane.zoom\",\n \"sidebar.toggle\": \"sidebar.toggle\",\n };\n return known[id] ?? null;\n}\n\nexport const COMMAND_ITEMS: ReadonlyArray<{\n id: CommandId;\n label: string;\n description: string;\n shortcut?: string;\n}> = [\n { id: \"request.send\", label: \"Send Request\", description: \"Send request under cursor\", shortcut: \"F5\" },\n { id: \"request.cancel\", label: \"Cancel Request\", description: \"Cancel in-flight request\", shortcut: \"Ctrl+X\" },\n { id: \"file.save\", label: \"Save File\", description: \"Write editor to disk\", shortcut: \"Ctrl+S\" },\n { id: \"env.switcher\", label: \"Switch Environment\", description: \"Choose active environment\", shortcut: \"Ctrl+E\" },\n { id: \"sidebar.toggle\", label: \"Toggle Sidebar\", description: \"Show/hide file tree\", shortcut: \"Ctrl+B\" },\n { id: \"pane.zoom\", label: \"Zoom Pane\", description: \"Zoom focused pane\", shortcut: \"F11\" },\n { id: \"help.show\", label: \"Help\", description: \"Show quick help\", shortcut: \"F1\" },\n { id: \"keybindings.show\", label: \"Keybindings\", description: \"Show all keybindings\", shortcut: \"Ctrl+/\" },\n];\n","import { readFile, writeFile } from \"node:fs/promises\";\n\nimport chokidar, { type FSWatcher } from \"chokidar\";\nimport { EventEmitter } from \"node:events\";\n\nimport { discoverFileTree } from \"./discovery.js\";\nimport type { WorkspaceChangeEvent, WorkspaceFileNode } from \"./types.js\";\n\nexport class Workspace extends EventEmitter {\n readonly rootDir: string;\n private watcher: FSWatcher | null = null;\n private tree: WorkspaceFileNode[] = [];\n\n constructor(rootDir: string) {\n super();\n this.rootDir = rootDir;\n }\n\n async open(): Promise<WorkspaceFileNode[]> {\n this.tree = await discoverFileTree(this.rootDir);\n await this.startWatcher();\n this.emitChange({ type: \"ready\" });\n return this.tree;\n }\n\n getTree(): readonly WorkspaceFileNode[] {\n return this.tree;\n }\n\n async refresh(): Promise<WorkspaceFileNode[]> {\n this.tree = await discoverFileTree(this.rootDir);\n return this.tree;\n }\n\n async readFile(filePath: string): Promise<string> {\n return readFile(filePath, \"utf8\");\n }\n\n async writeFile(filePath: string, content: string): Promise<void> {\n await writeFile(filePath, content, \"utf8\");\n }\n\n async close(): Promise<void> {\n await this.watcher?.close();\n this.watcher = null;\n }\n\n private async startWatcher(): Promise<void> {\n await this.watcher?.close();\n this.watcher = chokidar.watch(this.rootDir, {\n ignoreInitial: true,\n ignored: [\n /(^|[/\\\\])\\../,\n \"**/node_modules/**\",\n \"**/.git/**\",\n \"**/dist/**\",\n ],\n awaitWriteFinish: { stabilityThreshold: 100, pollInterval: 50 },\n });\n\n const handle = async (type: WorkspaceChangeEvent[\"type\"], path: string) => {\n try {\n this.tree = await discoverFileTree(this.rootDir);\n this.emitChange({ type, path });\n } catch (error) {\n this.emit(\"error\", error instanceof Error ? error : new Error(String(error)));\n }\n };\n\n this.watcher.on(\"add\", (path) => void handle(\"add\", path));\n this.watcher.on(\"change\", (path) => void handle(\"change\", path));\n this.watcher.on(\"unlink\", (path) => void handle(\"unlink\", path));\n this.watcher.on(\"error\", (error) => {\n this.emit(\"error\", error instanceof Error ? error : new Error(String(error)));\n });\n }\n\n private emitChange(event: WorkspaceChangeEvent): void {\n this.emit(\"change\", event);\n }\n}\n\nexport { discoverFileTree, flattenFiles, findNodeByPath, isWorkspaceFile } from \"./discovery.js\";\n","import { readdir, stat } from \"node:fs/promises\";\nimport path from \"node:path\";\n\nimport type { WorkspaceFileKind, WorkspaceFileNode } from \"./types.js\";\n\nconst SKIP_DIRS = new Set([\n \".git\",\n \"node_modules\",\n \".reqex\",\n \"dist\",\n \".cursor\",\n]);\n\nconst FILE_KINDS: ReadonlyArray<{ ext: string; kind: WorkspaceFileKind }> = [\n { ext: \".http\", kind: \"http\" },\n { ext: \".rest\", kind: \"rest\" },\n { ext: \".env\", kind: \"env\" },\n { ext: \".env.json\", kind: \"env-json\" },\n];\n\nexport function classifyFile(filePath: string): WorkspaceFileKind | null {\n const base = path.basename(filePath);\n for (const { ext, kind } of FILE_KINDS) {\n if (base === ext || base.endsWith(ext)) {\n return kind;\n }\n }\n if (base.endsWith(\".env.json\")) {\n return \"env-json\";\n }\n return null;\n}\n\nexport function isWorkspaceFile(filePath: string): boolean {\n return classifyFile(filePath) !== null;\n}\n\nexport async function discoverFileTree(rootDir: string): Promise<WorkspaceFileNode[]> {\n return discoverDirectory(rootDir, rootDir);\n}\n\nasync function discoverDirectory(\n rootDir: string,\n currentDir: string,\n): Promise<WorkspaceFileNode[]> {\n let entries: string[];\n try {\n entries = await readdir(currentDir);\n } catch {\n return [];\n }\n\n entries.sort((a, b) => a.localeCompare(b));\n const nodes: WorkspaceFileNode[] = [];\n\n for (const entry of entries) {\n if (entry.startsWith(\".\") && entry !== \".env\" && !entry.endsWith(\".env.json\")) {\n if (SKIP_DIRS.has(entry)) {\n continue;\n }\n }\n\n const fullPath = path.join(currentDir, entry);\n let entryStat;\n try {\n entryStat = await stat(fullPath);\n } catch {\n continue;\n }\n\n if (entryStat.isDirectory()) {\n if (SKIP_DIRS.has(entry)) {\n continue;\n }\n const children = await discoverDirectory(rootDir, fullPath);\n if (children.length > 0) {\n nodes.push({\n name: entry,\n path: fullPath,\n kind: \"directory\",\n children,\n });\n }\n continue;\n }\n\n const fileKind = classifyFile(fullPath);\n if (!fileKind) {\n continue;\n }\n\n nodes.push({\n name: entry,\n path: fullPath,\n kind: \"file\",\n fileKind,\n });\n }\n\n return nodes;\n}\n\nexport function flattenFiles(nodes: readonly WorkspaceFileNode[]): WorkspaceFileNode[] {\n const files: WorkspaceFileNode[] = [];\n for (const node of nodes) {\n if (node.kind === \"file\") {\n files.push(node);\n } else if (node.children) {\n files.push(...flattenFiles(node.children));\n }\n }\n return files;\n}\n\nexport function findNodeByPath(\n nodes: readonly WorkspaceFileNode[],\n targetPath: string,\n): WorkspaceFileNode | null {\n for (const node of nodes) {\n if (node.path === targetPath) {\n return node;\n }\n if (node.children) {\n const found = findNodeByPath(node.children, targetPath);\n if (found) {\n return found;\n }\n }\n }\n return null;\n}\n\nexport function collectDirectoryPaths(nodes: readonly WorkspaceFileNode[]): string[] {\n const paths: string[] = [];\n for (const node of nodes) {\n if (node.kind === \"directory\") {\n paths.push(node.path);\n if (node.children) {\n paths.push(...collectDirectoryPaths(node.children));\n }\n }\n }\n return paths;\n}\n","import type { CursorPosition, EditorSelection } from \"@rezi-ui/core\";\n\nimport type { ExecResult, ParsedFile, RequestRegion } from \"../engine/types.js\";\nimport type { WorkspaceFileNode } from \"../workspace/types.js\";\n\nexport type FocusPane = \"files\" | \"editor\" | \"response\";\nexport type ResponseTab = \"pretty\" | \"raw\" | \"headers\" | \"variables\" | \"tests\";\nexport type OverlayKind = \"none\" | \"env\" | \"help\" | \"keybindings\" | \"commandPalette\" | \"filePicker\";\nexport type LayoutMode = \"three-pane\" | \"sidebar-overlay\" | \"stacked\";\n\nexport type AppState = Readonly<{\n workspaceRoot: string;\n fileTree: readonly WorkspaceFileNode[];\n expandedPaths: readonly string[];\n selectedFilePath: string | null;\n fileContent: string;\n fileLines: readonly string[];\n dirty: boolean;\n parseVersion: number;\n parsedFile: ParsedFile | null;\n activeRegion: RequestRegion | null;\n responseEditor: Readonly<{\n scrollTop: number;\n scrollLeft: number;\n cursor: CursorPosition;\n selection: EditorSelection | null;\n }>;\n resultGeneration: number;\n editor: Readonly<{\n cursor: CursorPosition;\n selection: EditorSelection | null;\n scrollTop: number;\n scrollLeft: number;\n searchQuery: string;\n }>;\n request: Readonly<{\n sending: boolean;\n error: string | null;\n result: ExecResult | null;\n activeEnvironment: readonly string[];\n environments: readonly string[];\n variables: Record<string, unknown>;\n }>;\n ui: Readonly<{\n focusPane: FocusPane;\n zoomPane: FocusPane | null;\n sidebarVisible: boolean;\n layoutMode: LayoutMode;\n viewportWidth: number;\n viewportHeight: number;\n overlay: OverlayKind;\n responseTab: ResponseTab;\n splitSizes: readonly [number, number, number];\n envSelectedIndex: number;\n commandPalette: Readonly<{\n open: boolean;\n query: string;\n selectedIndex: number;\n }>;\n pendingPrompt: Readonly<{\n kind: \"confirm\" | \"input\" | \"list\";\n message: string;\n values?: readonly string[];\n defaultValue?: string;\n masked?: boolean;\n }> | null;\n statusMessage: string | null;\n gitBranch: string | null;\n }>;\n settings: Readonly<{\n keymapPreset: \"vscode\" | \"vim\";\n keybindings: Readonly<Record<string, string>>;\n }>;\n}>;\n\nexport type CommandContext = Readonly<{\n state: Readonly<AppState>;\n update: (updater: AppState | ((prev: Readonly<AppState>) => AppState)) => void;\n runSend: () => Promise<void>;\n openFile: (path: string) => Promise<void>;\n saveFile: () => Promise<void>;\n refreshWorkspace: () => Promise<void>;\n reloadKeybindings: () => void;\n quit: () => void;\n}>;\n\nexport type CommandId =\n | \"request.send\"\n | \"request.cancel\"\n | \"pane.focusNext\"\n | \"pane.focusPrev\"\n | \"pane.focusFiles\"\n | \"pane.focusEditor\"\n | \"pane.focusResponse\"\n | \"sidebar.toggle\"\n | \"file.save\"\n | \"env.switcher\"\n | \"env.selectNext\"\n | \"env.selectPrev\"\n | \"env.apply\"\n | \"overlay.close\"\n | \"app.quit\"\n | \"palette.commands\"\n | \"palette.files\"\n | \"help.show\"\n | \"keybindings.show\"\n | \"pane.zoom\"\n | \"response.tab.next\"\n | \"response.tab.prev\"\n | \"response.copy\"\n | \"response.search\"\n | \"editor.searchNext\";\n\nexport const FOCUS_PANES: readonly FocusPane[] = [\"files\", \"editor\", \"response\"];\nexport const RESPONSE_TABS: readonly ResponseTab[] = [\n \"pretty\",\n \"raw\",\n \"headers\",\n \"variables\",\n \"tests\",\n];\n\nexport function createInitialState(workspaceRoot: string): AppState {\n return {\n workspaceRoot,\n fileTree: [],\n expandedPaths: [],\n selectedFilePath: null,\n fileContent: \"\",\n fileLines: [\"\"],\n dirty: false,\n parseVersion: 0,\n parsedFile: null,\n activeRegion: null,\n responseEditor: {\n scrollTop: 0,\n scrollLeft: 0,\n cursor: { line: 0, column: 0 },\n selection: null,\n },\n resultGeneration: 0,\n editor: {\n cursor: { line: 0, column: 0 },\n selection: null,\n scrollTop: 0,\n scrollLeft: 0,\n searchQuery: \"\",\n },\n request: {\n sending: false,\n error: null,\n result: null,\n activeEnvironment: [],\n environments: [],\n variables: {},\n },\n ui: {\n focusPane: \"editor\",\n zoomPane: null,\n sidebarVisible: true,\n layoutMode: \"three-pane\",\n viewportWidth: 120,\n viewportHeight: 40,\n overlay: \"none\",\n responseTab: \"pretty\",\n splitSizes: [22, 40, 38],\n envSelectedIndex: 0,\n commandPalette: { open: false, query: \"\", selectedIndex: 0 },\n pendingPrompt: null,\n statusMessage: null,\n gitBranch: null,\n },\n settings: {\n keymapPreset: \"vscode\",\n keybindings: {},\n },\n };\n}\n\nexport function linesFromContent(content: string): string[] {\n if (content.length === 0) {\n return [\"\"];\n }\n return content.split(/\\r?\\n/u);\n}\n\nexport function contentFromLines(lines: readonly string[]): string {\n return lines.join(\"\\n\");\n}\n\nexport function resolveLayoutMode(width: number): LayoutMode {\n if (width < 80) {\n return \"stacked\";\n }\n if (width < 120) {\n return \"sidebar-overlay\";\n }\n return \"three-pane\";\n}\n\nexport function nextPane(current: FocusPane): FocusPane {\n const index = FOCUS_PANES.indexOf(current);\n return FOCUS_PANES[(index + 1) % FOCUS_PANES.length] ?? \"editor\";\n}\n\nexport function prevPane(current: FocusPane): FocusPane {\n const index = FOCUS_PANES.indexOf(current);\n return FOCUS_PANES[(index + FOCUS_PANES.length - 1) % FOCUS_PANES.length] ?? \"editor\";\n}\n\nexport function nextResponseTab(current: ResponseTab): ResponseTab {\n const index = RESPONSE_TABS.indexOf(current);\n return RESPONSE_TABS[(index + 1) % RESPONSE_TABS.length] ?? \"pretty\";\n}\n\nexport function prevResponseTab(current: ResponseTab): ResponseTab {\n const index = RESPONSE_TABS.indexOf(current);\n return RESPONSE_TABS[(index + RESPONSE_TABS.length - 1) % RESPONSE_TABS.length] ?? \"pretty\";\n}\n","export type SendController = Readonly<{\n beginSend: () => number;\n cancelSend: () => number;\n isCurrent: (generation: number) => boolean;\n}>;\n\nexport function createSendController(): SendController {\n let sendGeneration = 0;\n\n return {\n beginSend(): number {\n sendGeneration += 1;\n return sendGeneration;\n },\n cancelSend(): number {\n sendGeneration += 1;\n return sendGeneration;\n },\n isCurrent(generation: number): boolean {\n return generation === sendGeneration;\n },\n };\n}\n","import {\n bumpParseVersion,\n listEnvironments,\n listVariables,\n parseFile,\n resolveRegionAtLine,\n sendRegion,\n setPromptHandler,\n} from \"../engine/index.js\";\nimport { flattenFiles, type Workspace } from \"../workspace/index.js\";\nimport {\n contentFromLines,\n createInitialState,\n linesFromContent,\n nextPane,\n prevPane,\n prevResponseTab,\n nextResponseTab,\n type AppState,\n type CommandContext,\n type CommandId,\n type FocusPane,\n} from \"./types.js\";\nimport { createSendController } from \"./send-controller.js\";\n\nexport function createCommandContext(deps: {\n workspace: Workspace;\n update: CommandContext[\"update\"];\n getState: () => AppState;\n quit: () => void;\n reloadKeybindings: () => void;\n}): CommandBus {\n setPromptHandler(async (request) => {\n return new Promise((resolve) => {\n deps.update((state) => ({\n ...state,\n ui: {\n ...state.ui,\n overlay: \"none\",\n pendingPrompt: {\n kind: request.kind,\n message: request.message,\n values: request.kind === \"list\" ? request.values : undefined,\n defaultValue: request.kind === \"input\" ? request.defaultValue : undefined,\n masked: request.kind === \"input\" ? request.masked : undefined,\n },\n },\n }));\n promptResolvers.push(resolve);\n });\n });\n\n const promptResolvers: Array<(value: string | boolean | undefined) => void> = [];\n const sendController = createSendController();\n\n const resolvePrompt = (value: string | boolean | undefined) => {\n const resolver = promptResolvers.pop();\n resolver?.(value);\n deps.update((state) => ({\n ...state,\n ui: { ...state.ui, pendingPrompt: null },\n }));\n };\n\n const openFile = async (path: string) => {\n const content = await deps.workspace.readFile(path);\n const lines = linesFromContent(content);\n const parsed = await parseFile(path, async () => content, deps.workspace.rootDir);\n const environments = await listEnvironments(path);\n const variables = await listVariables(path, [...deps.getState().request.activeEnvironment]);\n const activeRegion = resolveRegionAtLine(parsed.regions, 0);\n\n deps.update((state) => ({\n ...state,\n selectedFilePath: path,\n fileContent: content,\n fileLines: lines,\n dirty: false,\n parseVersion: parsed.version,\n parsedFile: parsed,\n activeRegion,\n editor: {\n ...state.editor,\n cursor: { line: activeRegion?.startLine ?? 0, column: 0 },\n selection: null,\n scrollTop: activeRegion?.startLine ?? 0,\n },\n request: {\n ...state.request,\n error: null,\n result: null,\n environments,\n variables,\n },\n ui: {\n ...state.ui,\n focusPane: \"editor\",\n statusMessage: null,\n },\n }));\n };\n\n const refreshWorkspace = async () => {\n const tree = await deps.workspace.refresh();\n deps.update((state) => ({ ...state, fileTree: tree }));\n };\n\n const saveFile = async () => {\n const state = deps.getState();\n if (!state.selectedFilePath || !state.dirty) {\n return;\n }\n const content = contentFromLines(state.fileLines);\n await deps.workspace.writeFile(state.selectedFilePath, content);\n const version = bumpParseVersion(state.selectedFilePath);\n const parsed = await parseFile(\n state.selectedFilePath,\n async () => content,\n deps.workspace.rootDir,\n version,\n );\n const activeRegion = state.activeRegion\n ? parsed.regions.find((region) => region.id === state.activeRegion?.id) ??\n resolveRegionAtLine(parsed.regions, state.editor.cursor.line)\n : resolveRegionAtLine(parsed.regions, state.editor.cursor.line);\n\n deps.update((s) => ({\n ...s,\n fileContent: content,\n dirty: false,\n parsedFile: parsed,\n activeRegion: activeRegion ?? null,\n ui: { ...s.ui, statusMessage: \"Saved\" },\n }));\n };\n\n const runSend = async () => {\n const state = deps.getState();\n if (!state.selectedFilePath || !state.parsedFile) {\n return;\n }\n\n const region = resolveRegionAtLine(state.parsedFile.regions, state.editor.cursor.line);\n if (!region) {\n deps.update((s) => ({\n ...s,\n request: { ...s.request, error: \"No request region under cursor\" },\n ui: { ...s.ui, focusPane: \"response\" },\n }));\n return;\n }\n\n const gen = sendController.beginSend();\n\n deps.update((s) => ({\n ...s,\n activeRegion: region,\n request: { ...s.request, sending: true, error: null, result: null },\n responseEditor: {\n scrollTop: 0,\n scrollLeft: 0,\n cursor: { line: 0, column: 0 },\n selection: null,\n },\n resultGeneration: s.resultGeneration + 1,\n ui: { ...s.ui, focusPane: \"response\", responseTab: \"pretty\" },\n }));\n\n await new Promise<void>((resolve) => setImmediate(resolve));\n\n const result = await sendRegion({\n filePath: state.selectedFilePath,\n regionId: region.id,\n workingDir: deps.workspace.rootDir,\n activeEnvironment: [...state.request.activeEnvironment],\n variables: state.request.variables,\n });\n\n if (!sendController.isCurrent(gen)) {\n return;\n }\n\n const variables = await listVariables(state.selectedFilePath, [\n ...deps.getState().request.activeEnvironment,\n ]);\n\n if (!sendController.isCurrent(gen)) {\n return;\n }\n\n deps.update((s) => ({\n ...s,\n request: {\n ...s.request,\n sending: false,\n result,\n error: result.error ?? null,\n variables,\n },\n }));\n };\n\n const focusPane = (pane: FocusPane) => {\n deps.update((state) => ({\n ...state,\n ui: { ...state.ui, focusPane: pane },\n }));\n };\n\n const execute = (command: CommandId) => {\n const state = deps.getState();\n\n switch (command) {\n case \"request.send\":\n void runSend();\n break;\n case \"request.cancel\":\n if (!state.request.sending) {\n break;\n }\n sendController.cancelSend();\n deps.update((s) => ({\n ...s,\n request: {\n ...s.request,\n sending: false,\n error: \"Request cancelled\",\n result: null,\n },\n ui: { ...s.ui, statusMessage: \"Request cancelled\" },\n }));\n break;\n case \"pane.focusNext\":\n focusPane(nextPane(state.ui.focusPane));\n break;\n case \"pane.focusPrev\":\n focusPane(prevPane(state.ui.focusPane));\n break;\n case \"pane.focusFiles\":\n focusPane(\"files\");\n break;\n case \"pane.focusEditor\":\n focusPane(\"editor\");\n break;\n case \"pane.focusResponse\":\n focusPane(\"response\");\n break;\n case \"sidebar.toggle\":\n deps.update((s) => ({\n ...s,\n ui: { ...s.ui, sidebarVisible: !s.ui.sidebarVisible },\n }));\n break;\n case \"file.save\":\n void saveFile();\n break;\n case \"env.switcher\":\n deps.update((s) => ({\n ...s,\n ui: {\n ...s.ui,\n overlay: s.ui.overlay === \"env\" ? \"none\" : \"env\",\n envSelectedIndex: Math.max(\n 0,\n s.request.environments.indexOf(s.request.activeEnvironment.join(\",\")) || 0,\n ),\n },\n }));\n break;\n case \"env.selectNext\":\n if (state.ui.overlay === \"env\") {\n deps.update((s) => ({\n ...s,\n ui: {\n ...s.ui,\n envSelectedIndex: Math.min(\n s.request.environments.length,\n s.ui.envSelectedIndex + 1,\n ),\n },\n }));\n }\n break;\n case \"env.selectPrev\":\n if (state.ui.overlay === \"env\") {\n deps.update((s) => ({\n ...s,\n ui: {\n ...s.ui,\n envSelectedIndex: Math.max(0, s.ui.envSelectedIndex - 1),\n },\n }));\n }\n break;\n case \"env.apply\": {\n const envName = state.request.environments[state.ui.envSelectedIndex];\n void (async () => {\n const activeEnvironment = envName ? [envName] : [];\n const variables = state.selectedFilePath\n ? await listVariables(state.selectedFilePath, activeEnvironment)\n : {};\n deps.update((s) => ({\n ...s,\n request: { ...s.request, activeEnvironment, variables },\n ui: { ...s.ui, overlay: \"none\" },\n }));\n })();\n break;\n }\n case \"overlay.close\":\n deps.update((s) => ({\n ...s,\n ui: {\n ...s.ui,\n overlay: \"none\",\n commandPalette: { ...s.ui.commandPalette, open: false },\n pendingPrompt: null,\n },\n }));\n resolvePrompt(undefined);\n break;\n case \"app.quit\":\n deps.quit();\n break;\n case \"palette.commands\":\n deps.update((s) => ({\n ...s,\n ui: {\n ...s.ui,\n overlay: \"commandPalette\",\n commandPalette: { open: true, query: \"\", selectedIndex: 0 },\n },\n }));\n break;\n case \"palette.files\": {\n const files = flattenFiles(state.fileTree).filter((node) => node.kind === \"file\");\n const first = files[0]?.path;\n if (first) {\n void openFile(first);\n }\n break;\n }\n case \"help.show\":\n deps.update((s) => ({\n ...s,\n ui: { ...s.ui, overlay: s.ui.overlay === \"help\" ? \"none\" : \"help\" },\n }));\n break;\n case \"keybindings.show\":\n deps.update((s) => ({\n ...s,\n ui: {\n ...s.ui,\n overlay: s.ui.overlay === \"keybindings\" ? \"none\" : \"keybindings\",\n },\n }));\n break;\n case \"pane.zoom\":\n deps.update((s) => ({\n ...s,\n ui: {\n ...s.ui,\n zoomPane: s.ui.zoomPane ? null : s.ui.focusPane,\n },\n }));\n break;\n case \"response.tab.next\":\n deps.update((s) => ({\n ...s,\n ui: { ...s.ui, responseTab: nextResponseTab(s.ui.responseTab) },\n }));\n break;\n case \"response.tab.prev\":\n deps.update((s) => ({\n ...s,\n ui: { ...s.ui, responseTab: prevResponseTab(s.ui.responseTab) },\n }));\n break;\n case \"response.copy\":\n deps.update((s) => ({\n ...s,\n ui: { ...s.ui, statusMessage: \"Copy requested (see clipboard handler)\" },\n }));\n break;\n case \"response.search\":\n deps.update((s) => ({\n ...s,\n ui: { ...s.ui, focusPane: \"response\", responseTab: \"pretty\" },\n }));\n break;\n case \"editor.searchNext\":\n break;\n default:\n break;\n }\n };\n\n const context: CommandContext & { execute: (command: CommandId) => void } = {\n get state() {\n return deps.getState();\n },\n update: deps.update,\n runSend,\n openFile,\n saveFile,\n refreshWorkspace,\n reloadKeybindings: deps.reloadKeybindings,\n quit: deps.quit,\n execute,\n };\n\n return context;\n}\n\nexport type CommandBus = CommandContext & { execute: (command: CommandId) => void };\n\nexport { createInitialState };\n","import path from \"node:path\";\n\nimport {\n rgb,\n ui,\n type CursorPosition,\n type EditorSelection,\n type VNode,\n} from \"@rezi-ui/core\";\n\nimport { buildRegionDiagnostics, resolveRegionAtLine } from \"../engine/index.js\";\nimport { buildKeybindingsViewLines, footerHints, HELP_HINT_LINES } from \"../config/keybindings.js\";\nimport { COMMAND_ITEMS } from \"../keymap/index.js\";\nimport type { AppState, CommandId, FocusPane } from \"../state/types.js\";\nimport { contentFromLines, resolveLayoutMode } from \"../state/types.js\";\nimport type { WorkspaceFileNode } from \"../workspace/types.js\";\nimport { methodColor, prettyJsonIfPossible, statusTone, tokenizeHttpLine } from \"../utils/http-syntax.js\";\n\nexport type ViewDeps = Readonly<{\n onEditorChange: (lines: readonly string[], cursor: CursorPosition) => void;\n onEditorSelection: (selection: EditorSelection | null) => void;\n onEditorScroll: (scrollTop: number, scrollLeft: number) => void;\n onTreeSelect: (node: WorkspaceFileNode) => void;\n onTreeToggle: (node: WorkspaceFileNode, expanded: boolean) => void;\n onTreePress: (node: WorkspaceFileNode) => void;\n onResponseTab: (tab: AppState[\"ui\"][\"responseTab\"]) => void;\n onResponseScroll: (scrollTop: number, scrollLeft: number) => void;\n onResponseSelection: (selection: EditorSelection | null) => void;\n onResponseChange: (cursor: CursorPosition) => void;\n onSplitChange: (sizes: readonly number[]) => void;\n onCommandPaletteChange: (query: string) => void;\n onCommandPaletteSelect: (id: string) => void;\n onCommandPaletteSelectionChange: (index: number) => void;\n onOverlayClose: () => void;\n onEnvSelect: (index: number) => void;\n onResponseSearch: (query: string) => void;\n}>;\n\nfunction paneStyle(focused: boolean): { fg?: ReturnType<typeof rgb>; bold?: boolean } {\n return focused ? { fg: rgb(180, 220, 255), bold: true } : { fg: rgb(120, 120, 120) };\n}\n\nfunction renderFileTree(state: AppState, deps: ViewDeps): VNode {\n return ui.panel(\n {\n id: \"pane-files\",\n title: state.ui.focusPane === \"files\" ? \"● Files\" : \"Files\",\n style: paneStyle(state.ui.focusPane === \"files\"),\n },\n [\n ui.tree({\n id: \"file-tree\",\n data: state.fileTree,\n expanded: state.expandedPaths,\n selected: state.selectedFilePath ?? undefined,\n getKey: (node: WorkspaceFileNode) => node.path,\n getChildren: (node) =>\n node.kind === \"directory\" ? (node.children as WorkspaceFileNode[] | undefined) : undefined,\n onChange: (node, expanded) => deps.onTreeToggle(node, expanded),\n onSelect: (node) => deps.onTreeSelect(node),\n onPress: (node) => deps.onTreePress(node),\n renderNode: (node, _depth, nodeState) =>\n ui.row({ gap: 1 }, [\n ui.text(nodeState.selected ? `▸ ${node.name}` : node.name, {\n style: nodeState.selected\n ? { fg: rgb(255, 220, 120), bold: true }\n : state.dirty && node.path === state.selectedFilePath\n ? { fg: rgb(255, 180, 80) }\n : undefined,\n }),\n ]),\n flex: 1,\n minHeight: 8,\n }),\n ],\n );\n}\n\nfunction renderEditor(state: AppState, deps: ViewDeps, readOnly: boolean): VNode {\n const activeRegion =\n state.activeRegion ??\n (state.parsedFile\n ? resolveRegionAtLine(state.parsedFile.regions, state.editor.cursor.line)\n : null);\n\n const titleParts = [\n state.ui.focusPane === \"editor\" ? \"● Editor\" : \"Editor\",\n state.selectedFilePath ? state.selectedFilePath.split(\"/\").pop() : \"No file\",\n state.dirty ? \" ●\" : \"\",\n activeRegion ? ` | ${activeRegion.method ?? \"?\"} ${activeRegion.name}` : \"\",\n ];\n\n const diagnostics = state.parsedFile\n ? buildRegionDiagnostics(\n state.parsedFile.regions,\n activeRegion?.id ?? null,\n state.fileLines,\n )\n : [];\n\n return ui.panel(\n {\n id: \"pane-editor\",\n title: titleParts.join(\"\"),\n style: paneStyle(state.ui.focusPane === \"editor\"),\n },\n [\n ui.codeEditor({\n id: \"editor\",\n lines: state.fileLines,\n cursor: state.editor.cursor,\n selection: state.editor.selection,\n scrollTop: state.editor.scrollTop,\n scrollLeft: state.editor.scrollLeft,\n readOnly,\n lineNumbers: true,\n syntaxLanguage: \"plain\",\n tokenizeLine: tokenizeHttpLine,\n diagnostics,\n onChange: (lines, cursor) => deps.onEditorChange(lines, cursor),\n onSelectionChange: deps.onEditorSelection,\n onScroll: deps.onEditorScroll,\n flex: 1,\n minHeight: 8,\n }),\n ],\n );\n}\n\nfunction responseScrollProps(state: AppState, deps: ViewDeps) {\n return {\n scrollTop: state.responseEditor.scrollTop,\n scrollLeft: state.responseEditor.scrollLeft,\n onScroll: deps.onResponseScroll,\n };\n}\n\nfunction responseCursorProps(state: AppState, deps: ViewDeps) {\n return {\n cursor: state.responseEditor.cursor,\n selection: state.responseEditor.selection,\n onChange: (_lines: readonly string[], cursor: CursorPosition) => {\n deps.onResponseChange(cursor);\n },\n onSelectionChange: deps.onResponseSelection,\n };\n}\n\nfunction renderResponseBody(state: AppState, deps: ViewDeps): VNode {\n const result = state.request.result;\n const scroll = responseScrollProps(state, deps);\n const cursor = responseCursorProps(state, deps);\n const gen = state.resultGeneration;\n\n if (state.request.sending) {\n return ui.center(ui.spinner({ label: \"Waiting for response…\" }));\n }\n if (state.request.error && !result) {\n return ui.errorDisplay(state.request.error);\n }\n if (!result) {\n return ui.empty(\"No response\", {\n description: \"Press F5 to send the request under cursor\",\n });\n }\n\n switch (state.ui.responseTab) {\n case \"headers\":\n return ui.table({\n id: `response-headers-${gen}`,\n columns: [\n { key: \"name\", header: \"Header\", width: 24 },\n { key: \"value\", header: \"Value\", flex: 1 },\n ],\n data: [...result.headers],\n getRowKey: (row) => row.name,\n flex: 1,\n minHeight: 6,\n });\n case \"raw\":\n return ui.codeEditor({\n id: `response-raw-${gen}`,\n lines: result.body ? result.body.split(\"\\n\") : [\"\"],\n readOnly: true,\n lineNumbers: true,\n syntaxLanguage: \"plain\",\n ...cursor,\n ...scroll,\n flex: 1,\n });\n case \"variables\":\n return ui.codeEditor({\n id: `response-vars-${gen}`,\n lines: [JSON.stringify(state.request.variables, null, 2)],\n readOnly: true,\n syntaxLanguage: \"json\",\n ...cursor,\n ...scroll,\n flex: 1,\n });\n case \"tests\":\n return ui.column({ gap: 1, flex: 1 }, [\n ...result.testResults.map((test) =>\n ui.text(`${test.status === \"SUCCESS\" ? \"✓\" : \"✗\"} ${test.message}`, {\n style: {\n fg:\n test.status === \"SUCCESS\"\n ? rgb(120, 220, 120)\n : test.status === \"SKIPPED\"\n ? rgb(220, 220, 120)\n : rgb(220, 120, 120),\n },\n }),\n ),\n ]);\n case \"pretty\":\n default:\n return ui.codeEditor({\n id: `response-pretty-${gen}`,\n lines: prettyJsonIfPossible(result.prettyBody || result.body).split(\"\\n\"),\n readOnly: true,\n lineNumbers: true,\n syntaxLanguage: \"json\",\n searchQuery: state.editor.searchQuery || undefined,\n ...cursor,\n ...scroll,\n flex: 1,\n });\n }\n}\n\nfunction renderResponse(state: AppState, deps: ViewDeps): VNode {\n const result = state.request.result;\n const statusLine =\n state.request.sending || !result\n ? null\n : `${result.protocol ?? \"HTTP\"} ${result.statusCode ?? \"?\"} ${result.statusMessage ?? \"\"} · ${result.durationMs ?? \"?\"} ms`;\n\n const tabItems = [\n { key: \"pretty\", label: \"Pretty\" },\n { key: \"raw\", label: \"Raw\" },\n { key: \"headers\", label: \"Headers\" },\n { key: \"variables\", label: \"Vars\" },\n { key: \"tests\", label: \"Tests\" },\n ] as const;\n\n return ui.panel(\n {\n id: \"pane-response\",\n title: state.ui.focusPane === \"response\" ? \"● Response\" : \"Response\",\n style: paneStyle(state.ui.focusPane === \"response\"),\n },\n [\n ui.row({ gap: 2 }, [\n state.request.sending\n ? ui.spinner({ label: \"Sending request…\" })\n : ui.text(statusLine ?? \"Ready\", {\n style: { fg: rgb(...statusColor(result?.statusCode)), bold: true },\n }),\n result?.error && !state.request.sending\n ? ui.badge(result.error, { variant: \"error\" })\n : null,\n ]),\n ui.row({ gap: 1 }, [\n ...tabItems.map((tab) =>\n ui.button({\n id: `tab-${tab.key}`,\n label: tab.label,\n disabled: state.request.sending,\n onPress: () => deps.onResponseTab(tab.key),\n }),\n ),\n ]),\n renderResponseBody(state, deps),\n ],\n );\n}\n\nfunction statusColor(code: number | undefined): [number, number, number] {\n const tone = statusTone(code);\n switch (tone) {\n case \"green\":\n return [120, 220, 140];\n case \"yellow\":\n return [240, 200, 100];\n case \"red\":\n return [240, 120, 120];\n default:\n return [140, 200, 240];\n }\n}\n\nfunction renderMainLayout(state: AppState, deps: ViewDeps): VNode {\n const layoutMode = resolveLayoutMode(state.ui.viewportWidth);\n const zoom = state.ui.zoomPane;\n\n if (zoom) {\n if (zoom === \"files\") return renderFileTree(state, deps);\n if (zoom === \"editor\") return renderEditor(state, deps, false);\n return renderResponse(state, deps);\n }\n\n if (layoutMode === \"stacked\") {\n const pane =\n state.ui.focusPane === \"files\"\n ? renderFileTree(state, deps)\n : state.ui.focusPane === \"response\"\n ? renderResponse(state, deps)\n : renderEditor(state, deps, false);\n return pane;\n }\n\n if (layoutMode === \"sidebar-overlay\") {\n return ui.row({ gap: 1, flex: 1 }, [\n state.ui.sidebarVisible\n ? ui.box({ width: 28, flex: 0 }, [renderFileTree(state, deps)])\n : null,\n ui.column({ gap: 1, flex: 1 }, [\n renderEditor(state, deps, false),\n renderResponse(state, deps),\n ]),\n ]);\n }\n\n return ui.column({ gap: 1, flex: 1 }, [\n ui.splitPane(\n {\n id: \"main-split\",\n direction: \"horizontal\",\n sizes: [...state.ui.splitSizes],\n minSizes: [18, 24, 24],\n onChange: deps.onSplitChange,\n },\n [\n renderFileTree(state, deps),\n renderEditor(state, deps, false),\n renderResponse(state, deps),\n ],\n ),\n ]);\n}\n\nfunction renderFooter(state: AppState): VNode {\n const env =\n state.request.activeEnvironment.length > 0\n ? state.request.activeEnvironment.join(\",\")\n : \"none\";\n const dirName = path.basename(state.workspaceRoot);\n const branch = state.ui.gitBranch ?? \"—\";\n const fileName = state.selectedFilePath\n ? path.basename(state.selectedFilePath)\n : null;\n\n const hints = footerHints({\n focusPane: state.ui.focusPane,\n overlay: state.ui.overlay,\n viewportWidth: state.ui.viewportWidth,\n sending: state.request.sending,\n });\n\n return ui.statusBar({\n id: \"status-bar\",\n left: [\n ui.text(dirName, { style: { fg: rgb(180, 220, 255), bold: true } }),\n ui.text(` ⎇ ${branch}`, { style: { fg: rgb(160, 220, 160) } }),\n fileName ? ui.text(` | ${fileName}`) : null,\n state.dirty ? ui.text(\" ●\", { style: { fg: rgb(255, 180, 80) } }) : null,\n ui.text(` | env: ${env}`, { style: { fg: rgb(160, 200, 255) } }),\n state.ui.statusMessage ? ui.text(` | ${state.ui.statusMessage}`) : null,\n ].filter(Boolean) as VNode[],\n right: [ui.text(hints)],\n });\n}\n\nfunction renderOverlayContent(state: AppState, deps: ViewDeps): VNode {\n switch (state.ui.overlay) {\n case \"env\":\n return ui.modal({\n id: \"env-modal\",\n title: \"Environment\",\n content: ui.column({ gap: 1 }, [\n ui.text(\"Select environment (Enter to apply, Esc to close)\"),\n ui.text(\"(none)\", {\n style:\n state.ui.envSelectedIndex === 0\n ? { fg: rgb(255, 220, 120), bold: true }\n : undefined,\n }),\n ...state.request.environments.map((env, index) =>\n ui.text(env, {\n style:\n index + 1 === state.ui.envSelectedIndex\n ? { fg: rgb(255, 220, 120), bold: true }\n : undefined,\n }),\n ),\n ]),\n onClose: deps.onOverlayClose,\n width: 50,\n height: 16,\n });\n case \"help\":\n return ui.modal({\n id: \"help-modal\",\n title: \"reqex help\",\n content: ui.column({ gap: 1 }, HELP_HINT_LINES.map((line) => ui.text(line))),\n onClose: deps.onOverlayClose,\n width: 70,\n height: 14,\n });\n case \"keybindings\": {\n const maxLines = Math.max(8, Math.min(26, state.ui.viewportHeight - 8));\n const lines = buildKeybindingsViewLines(\n state.settings.keybindings as Record<string, CommandId>,\n maxLines,\n );\n return ui.modal({\n id: \"keybindings-modal\",\n title: \"Keybindings\",\n content: ui.column({ gap: 0 }, lines.map((line) => ui.text(line))),\n onClose: deps.onOverlayClose,\n width: 72,\n height: Math.min(maxLines + 4, 28),\n });\n }\n case \"commandPalette\":\n return ui.center(\n ui.commandPalette({\n id: \"command-palette\",\n open: true,\n query: state.ui.commandPalette.query,\n selectedIndex: state.ui.commandPalette.selectedIndex,\n sources: [\n {\n id: \"commands\",\n name: \"Commands\",\n getItems: (query) =>\n COMMAND_ITEMS.filter((item) =>\n item.label.toLowerCase().includes(query.toLowerCase()),\n ).map((item) => ({\n id: item.id,\n label: item.label,\n description: item.description,\n shortcut: item.shortcut,\n sourceId: \"commands\",\n })),\n },\n ],\n onChange: deps.onCommandPaletteChange,\n onSelect: (item) => deps.onCommandPaletteSelect(item.id),\n onClose: deps.onOverlayClose,\n onSelectionChange: deps.onCommandPaletteSelectionChange,\n width: 60,\n }),\n );\n default:\n return ui.text(\"\");\n }\n}\n\nexport function renderApp(state: AppState, deps: ViewDeps): VNode {\n const base = ui.column({ gap: 1, flex: 1 }, [\n renderMainLayout(state, deps),\n renderFooter(state),\n ]);\n\n if (state.ui.overlay === \"none\") {\n return base;\n }\n\n return ui.layers([\n base,\n ui.layer({\n id: \"overlay-layer\",\n modal: true,\n backdrop: \"dim\",\n closeOnEscape: true,\n onClose: deps.onOverlayClose,\n content: renderOverlayContent(state, deps),\n }),\n ]);\n}\n\nexport function focusPaneId(pane: FocusPane): string {\n switch (pane) {\n case \"files\":\n return \"pane-files\";\n case \"editor\":\n return \"pane-editor\";\n case \"response\":\n return \"pane-response\";\n }\n}\n\nexport { contentFromLines, methodColor };\n","import type { CodeEditorSyntaxToken, CodeEditorTokenizeContext } from \"@rezi-ui/core\";\n\nconst KEYWORDS = new Set([\n \"GET\",\n \"POST\",\n \"PUT\",\n \"PATCH\",\n \"DELETE\",\n \"HEAD\",\n \"OPTIONS\",\n \"CONNECT\",\n \"TRACE\",\n \"GRAPHQL\",\n]);\n\nexport function tokenizeHttpLine(\n line: string,\n _context: CodeEditorTokenizeContext,\n): readonly CodeEditorSyntaxToken[] {\n const tokens: CodeEditorSyntaxToken[] = [];\n const methodMatch = /^\\s*(GET|POST|PUT|PATCH|DELETE|HEAD|OPTIONS|CONNECT|TRACE|GRAPHQL)\\b/u.exec(\n line,\n );\n if (methodMatch) {\n const method = methodMatch[1] ?? \"\";\n tokens.push({ text: method, kind: \"keyword\" });\n const rest = line.slice(methodMatch[0].length);\n if (rest.length > 0) {\n tokens.push({ text: rest, kind: \"string\" });\n }\n return tokens;\n }\n\n if (/^\\s*#/u.test(line)) {\n return [{ text: line, kind: \"comment\" }];\n }\n if (/^\\s*\\/\\//u.test(line)) {\n return [{ text: line, kind: \"comment\" }];\n }\n if (/^\\s*@/u.test(line)) {\n return [{ text: line, kind: \"type\" }];\n }\n\n const headerMatch = /^\\s*([!#$%&'*+\\-.^_`|~0-9A-Za-z]+)(\\s*:\\s*)(.*)$/u.exec(line);\n if (headerMatch) {\n tokens.push({ text: headerMatch[1] ?? \"\", kind: \"function\" });\n tokens.push({ text: headerMatch[2] ?? \"\", kind: \"operator\" });\n tokens.push({ text: headerMatch[3] ?? \"\", kind: \"string\" });\n return tokens;\n }\n\n const words = line.split(/(\\s+)/u);\n for (const word of words) {\n if (KEYWORDS.has(word)) {\n tokens.push({ text: word, kind: \"keyword\" });\n } else if (word.length > 0) {\n tokens.push({ text: word, kind: \"plain\" });\n }\n }\n return tokens.length > 0 ? tokens : [{ text: line, kind: \"plain\" }];\n}\n\nexport function prettyJsonIfPossible(text: string): string {\n const trimmed = text.trim();\n if (!trimmed) {\n return text;\n }\n try {\n return JSON.stringify(JSON.parse(trimmed), null, 2);\n } catch {\n return text;\n }\n}\n\nexport function methodColor(method: string | undefined): \"green\" | \"yellow\" | \"red\" | \"cyan\" {\n switch ((method ?? \"GET\").toUpperCase()) {\n case \"GET\":\n case \"HEAD\":\n case \"OPTIONS\":\n return \"green\";\n case \"POST\":\n case \"PUT\":\n case \"PATCH\":\n return \"yellow\";\n case \"DELETE\":\n return \"red\";\n default:\n return \"cyan\";\n }\n}\n\nexport function statusTone(statusCode: number | undefined): \"green\" | \"yellow\" | \"red\" | \"cyan\" {\n if (!statusCode) {\n return \"cyan\";\n }\n if (statusCode >= 200 && statusCode < 300) {\n return \"green\";\n }\n if (statusCode >= 400 && statusCode < 500) {\n return \"yellow\";\n }\n if (statusCode >= 500) {\n return \"red\";\n }\n return \"cyan\";\n}\n","import clipboard from \"clipboardy\";\n\nexport async function copyToClipboard(text: string): Promise<boolean> {\n try {\n await clipboard.write(text);\n return true;\n } catch {\n if (process.stdout.write(`\\x1b]52;c;${Buffer.from(text, \"utf8\").toString(\"base64\")}\\x07`)) {\n return true;\n }\n return false;\n }\n}\n\nexport function disableFlowControl(): void {\n if (process.stdin.isTTY) {\n try {\n process.stdin.setRawMode?.(true);\n } catch {\n // ignore\n }\n }\n}\n","import { execFile } from \"node:child_process\";\nimport { promisify } from \"node:util\";\n\nconst execFileAsync = promisify(execFile);\n\nexport async function getGitBranch(root: string): Promise<string | null> {\n try {\n const { stdout } = await execFileAsync(\n \"git\",\n [\"-C\", root, \"rev-parse\", \"--abbrev-ref\", \"HEAD\"],\n { timeout: 2000 },\n );\n const branch = stdout.trim();\n return branch.length > 0 ? branch : null;\n } catch {\n return null;\n }\n}\n"],"mappings":"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","names":["path","process","path","path","path","path","path","path","path","process"]}
|