File size: 18,715 Bytes
0dbc9de
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
---
title: ์„œ๋ฒ„
description: HTTP๋ฅผ ํ†ตํ•ด OpenCode ์„œ๋ฒ„์™€ ์ƒํ˜ธ ์ž‘์šฉํ•ฉ๋‹ˆ๋‹ค.
---

import config from "../../../../config.mjs"
export const typesUrl = `${config.github}/blob/dev/packages/sdk/js/src/gen/types.gen.ts`

`opencode serve` ๋ช…๋ น์€ opencode ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” OpenAPI ์—”๋“œํฌ์ธํŠธ๋ฅผ ๋…ธ์ถœํ•˜๋Š” headless HTTP ์„œ๋ฒ„๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

---

### ์‚ฌ์šฉ๋ฒ•

```bash
opencode serve [--port <number>] [--hostname <string>] [--cors <origin>]
```

#### ์˜ต์…˜

| ํ”Œ๋ž˜๊ทธ          | ์„ค๋ช…                                  | ๊ธฐ๋ณธ๊ฐ’           |
| --------------- | ------------------------------------- | ---------------- |
| `--port`        | ์ˆ˜์‹  ๋Œ€๊ธฐํ•  ํฌํŠธ                      | `4096`           |
| `--hostname`    | ์ˆ˜์‹  ๋Œ€๊ธฐํ•  ํ˜ธ์ŠคํŠธ๋ช…                  | `127.0.0.1`      |
| `--mdns`        | mDNS ํƒ์ง€ ํ™œ์„ฑํ™”                      | `false`          |
| `--mdns-domain` | mDNS ์„œ๋น„์Šค์˜ ์‚ฌ์šฉ์ž ์ง€์ • ๋„๋ฉ”์ธ ์ด๋ฆ„ | `opencode.local` |
| `--cors`        | ํ—ˆ์šฉํ•  ์ถ”๊ฐ€ ๋ธŒ๋ผ์šฐ์ € origin           | `[]`             |

`--cors`๋Š” ๋‹ค์ˆ˜ ์‹œ๊ฐ„์„ ํ†ต๊ณผ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

```bash
opencode serve --cors http://localhost:5173 --cors https://app.example.com
```

---

### ์ธ์ฆ

`OPENCODE_SERVER_PASSWORD`๋ฅผ ์„ค์ •ํ•˜์—ฌ ์„œ๋ฒ„๋ฅผ HTTP Basic auth๋กœ ๋ณดํ˜ธํ•ฉ๋‹ˆ๋‹ค. `opencode` ๋˜๋Š” `OPENCODE_SERVER_USERNAME`๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋“œ๋กœ ์„ค์ •ํ•˜๋Š” ์‚ฌ์šฉ์ž์˜ ๊ธฐ๋ณธ๊ฐ’. ์ด๊ฒƒ์€ `opencode serve`์™€ `opencode web` ๋‘˜ ๋‹ค์— ์ ์šฉํ•ฉ๋‹ˆ๋‹ค.

```bash
OPENCODE_SERVER_PASSWORD=your-password opencode serve
```

---

### ์ž‘๋™ ๋ฐฉ์‹

`opencode`๋ฅผ ์‹คํ–‰ํ•˜๋ฉด TUI์™€ ์„œ๋ฒ„๋ฅผ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. TUI๋Š” ์–ด๋””์— ์žˆ์Šต๋‹ˆ๊นŒ?
์„œ๋ฒ„์™€ ๋Œ€ํ™”ํ•˜๋Š” ํด๋ผ์ด์–ธํŠธ. ์„œ๋ฒ„๋Š” OpenAPI 3.1 spec์„ ๋…ธ์ถœ
๋์ . ์ด ์—”๋“œํฌ์ธํŠธ๋Š” [SDK](/docs/sdk)์„ ์ƒ์„ฑํ•˜๋Š” ๋ฐ๋„ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

:::tip
opencode ์„œ๋ฒ„๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ opencode programmatically์™€ ์ƒํ˜ธ ์ž‘์šฉํ•ฉ๋‹ˆ๋‹ค.
:::

์ด ์•„ํ‚คํ…์ฒ˜๋Š” opencode ์ง€์› ์—ฌ๋Ÿฌ ํด๋ผ์ด์–ธํŠธ๋ฅผ ํ—ˆ์šฉํ•˜๊ณ  opencode programmatically์™€ ์ƒํ˜ธ ์ž‘์šฉ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋…๋ฆฝ ์„œ๋ฒ„๋ฅผ ์‹œ์ž‘ํ•˜๋ ค๋ฉด `opencode serve`๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹น์‹ ์ด ์žˆ๋Š” ๊ฒฝ์šฐ์—
opencode TUI ์‹คํ–‰, `opencode serve` ์ƒˆ๋กœ์šด ์„œ๋ฒ„๋ฅผ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

---

#### ๊ธฐ์กด ์„œ๋ฒ„์— ์—ฐ๊ฒฐ

TUI๋ฅผ ์‹œ์ž‘ํ•˜๋ฉด ๋ฌด์ž‘์œ„๋กœ ํฌํŠธ์™€ ํ˜ธ์ŠคํŠธ ์ด๋ฆ„์„ ํ• ๋‹นํ•ฉ๋‹ˆ๋‹ค. ๋Œ€์‹  `--hostname`์™€ `--port` [flags](/docs/cli)์—์„œ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ์„œ๋ฒ„์— ์—ฐ๊ฒฐํ•˜์‹ญ์‹œ์˜ค.

[`/tui`](#tui) ์—”๋“œํฌ์ธํŠธ๋Š” ์„œ๋ฒ„๋ฅผ ํ†ตํ•ด TUI๋ฅผ ๊ตฌ๋™ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋ฏธ๋ฆฌ ์ž‘์„ฑํ•˜๊ฑฐ๋‚˜ ํ”„๋กฌํ”„ํŠธ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์„ค์ •์€ opencode [IDE](/docs/ide) ํ”Œ๋Ÿฌ๊ทธ์ธ์— ์˜ํ•ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

---

## ์‚ฌ์–‘

์„œ๋ฒ„๋Š” OpenAPI 3.1 spec์„ ๊ฒŒ์‹œํ•ฉ๋‹ˆ๋‹ค.

```
http://<hostname>:<port>/doc
```

์˜ˆ๋ฅผ ๋“ค์–ด, `http://localhost:4096/doc`. ํด๋ผ์ด์–ธํŠธ๋ฅผ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜ ์š”์ฒญ ๋ฐ ์‘๋‹ต ์œ ํ˜•์„ ๊ฒ€์‚ฌํ•˜๋Š” spec๋ฅผ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค. ๋˜๋Š” Swagger ํƒํ—˜๊ฐ€์—์„œ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

---

## API

opencode ์„œ๋ฒ„๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ API๋ฅผ ๋…ธ์ถœํ•ฉ๋‹ˆ๋‹ค.

---

## ๊ธ€๋กœ๋ฒŒ

| ๋ฐฉ๋ฒ•  | ๊ฒฝ๋กœ             | ์„ค๋ช…                      | ์‘๋‹ต                                 |
| ----- | ---------------- | ------------------------- | ------------------------------------ |
| `GET` | `/global/health` | ์„œ๋ฒ„ ๊ฑด๊ฐ• ๋ฐ ๋ฒ„์ „         | `{ healthy: true, version: string }` |
| `GET` | `/global/event`  | ๊ธ€๋กœ๋ฒŒ ์ด๋ฒคํŠธ(SSE ์ŠคํŠธ๋ฆผ) | ์ด๋ฒคํŠธ ์ŠคํŠธ๋ฆผ                        |

---

## ํ”„๋กœ์ ํŠธ

| ๋ฐฉ๋ฒ•  | ๊ฒฝ๋กœ               | ์„ค๋ช…                    | ์‘๋‹ต                                          |
| ----- | ------------------ | ----------------------- | --------------------------------------------- |
| `GET` | `/project`         | ๋ชจ๋“  ํ”„๋กœ์ ํŠธ ๋ณด๊ธฐ      | <a href={typesUrl}><code>Project[]</code></a> |
| `GET` | `/project/current` | ํ˜„์žฌ ํ”„๋กœ์ ํŠธ ๊ฐ€์ ธ ์˜ค๊ธฐ | <a href={typesUrl}><code>ํ”„๋กœ์ ํŠธ</code></a>  |

---

### ๊ฒฝ๋กœ & VCS

| ๋ฐฉ๋ฒ•  | ๊ฒฝ๋กœ    | ์„ค๋ช…                          | ์‘๋‹ต                                        |
| ----- | ------- | ----------------------------- | ------------------------------------------- |
| `GET` | `/path` | ํ˜„์žฌ ๊ฒฝ๋กœ ๋ฐ›๊ธฐ                | <a href={typesUrl}><code>Path</code></a>    |
| `GET` | `/vcs`  | ํ˜„์žฌ ํ”„๋กœ์ ํŠธ์˜ VCS ์ •๋ณด ๋ฐ›๊ธฐ | <a href={typesUrl}><code>VcsInfo</code></a> |

---

### ์ธ์Šคํ„ด์Šค

| ๋ฐฉ๋ฒ•   | ๊ฒฝ๋กœ                | ์„ค๋ช…                 | ์‘๋‹ต      |
| ------ | ------------------- | -------------------- | --------- |
| `POST` | `/instance/dispose` | ํ˜„์žฌ ์ธ์Šคํ„ด์Šค๋ฅผ ํ•ด์ œ | `boolean` |

---

### ๊ตฌ์„ฑ

| ๋ฐฉ๋ฒ•    | ๊ฒฝ๋กœ                | ์„ค๋ช…                       | ์‘๋‹ต                                                                                     |
| ------- | ------------------- | -------------------------- | ---------------------------------------------------------------------------------------- |
| `GET`   | `/config`           | ๊ตฌ์„ฑ์ •๋ณด                   | <a href={typesUrl}><code>Config</code></a>                                               |
| `PATCH` | `/config`           | ์—…๋ฐ์ดํŠธ ๊ตฌ์„ฑ              | <a href={typesUrl}><code>Config</code></a>                                               |
| `GET`   | `/config/providers` | ๋ชฉ๋ก ์ œ๊ณต์—…์ฒด ๋ฐ ๊ธฐ๋ณธ ๋ชจ๋ธ | `{ providers: `<a href={typesUrl}> ์‚ฌ์ดํŠธ ๋งต</a>`, default: { [key: string]: string } }` |

---

## ๊ณต๊ธ‰์ž

| ๋ฐฉ๋ฒ•   | ๊ฒฝ๋กœ                             | ์„ค๋ช…                        | ์‘๋‹ต                                                                                |
| ------ | -------------------------------- | --------------------------- | ----------------------------------------------------------------------------------- |
| `GET`  | `/provider`                      | ๋ชจ๋“  ๊ณต๊ธ‰์ž ๋ชฉ๋ก            | `{ all: `<a href={typesUrl}>Provider[]</a>`, default: {...}, connected: string[] }` |
| `GET`  | `/provider/auth`                 | ๊ณต๊ธ‰์ž ์ธ์ฆ ๋ฉ”์„œ๋“œ ๊ฐ€์ ธ์˜ค๊ธฐ | `{ [providerID: string]: `<a href={typesUrl}>ProviderAuthMethod[]</a>` }`           |
| `POST` | `/provider/{id}/oauth/authorize` | OAuth๋ฅผ ์‚ฌ์šฉํ•œ ๊ณต๊ธ‰์ž ํ—ˆ๊ฐ€  | <a href={typesUrl}><code>ProviderAuthAuthorization</code></a>                       |
| `POST` | `/provider/{id}/oauth/callback`  | ๊ณต๊ธ‰์ž๋ฅผ ์œ„ํ•œ OAuth ์ฝœ๋ฐฑ    | `boolean`                                                                           |

---

## ์„ธ์…˜

| ๋ฉ”์„œ๋“œ   | ๊ฒฝ๋กœ                                     | ์„ค๋ช…                               | ๋น„๊ณ                                                                           |
| -------- | ---------------------------------------- | ---------------------------------- | ----------------------------------------------------------------------------- |
| `GET`    | `/session`                               | ๋ชจ๋“  ์„ธ์…˜ ์ผ๋žŒํ‘œ                   | ๋ฐ˜ํ™˜ <a href={typesUrl}><code>Session[]</code></a>                            |
| `POST`   | `/session`                               | ์ƒˆ ์„ธ์…˜ ๋งŒ๋“ค๊ธฐ                     | ๋ชธ: `{ parentID?, title? }`, ๋ฐ˜ํ™˜ <a href={typesUrl}><code>Session</code></a> |
| `GET`    | `/session/status`                        | ๋ชจ๋“  ์„ธ์…˜์˜ ์„ธ์…˜ ์ƒํƒœ๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค | `{ [sessionID: string]: `<a href={typesUrl}>SessionStatus</a>` }`             |
| `GET`    | `/session/:id`                           | ์„ธ์…˜ ์ƒ์„ธ๋ณด๊ธฐ                      | ๋ฐ˜ํ’ˆ <a href={typesUrl}><code>Session</code></a>                              |
| `DELETE` | `/session/:id`                           | ์„ธ์…˜ ์‚ญ์ œ ๋ฐ ๋ชจ๋“  ๋ฐ์ดํ„ฐ           | `boolean`                                                                     |
| `PATCH`  | `/session/:id`                           | ์—…๋ฐ์ดํŠธ ์„ธ์…˜ ์†์„ฑ                 | ๋ณธ์ฒด: `{ title? }`, ๋ฐ˜ํ™˜ <a href={typesUrl}><code>Session</code></a>          |
| `GET`    | `/session/:id/children`                  | ์„ธ์…˜์˜ ํ•˜์œ„ ์„ธ์…˜                   | ๋ฆฌํ„ด <a href={typesUrl}><code>Session[]</code></a>                            |
| `GET`    | `/session/:id/todo`                      | ์„ธ์…˜์˜ ํ•  ์ผ(Todo) ๋ชฉ๋ก ๋ฐ›๊ธฐ       | <a href={typesUrl}><code>Todo[]</code></a>                                    |
| `POST`   | `/session/:id/init`                      | ์•ฑ ์ดˆ๊ธฐํ™” ๋ฐ `AGENTS.md` ๋ถ„์„      | ๋ชธ: `{ messageID, providerID, modelID }`, ๋ฐ˜ํ™˜ `boolean`                      |
| `POST`   | `/session/:id/fork`                      | ๋ฉ”์‹œ์ง€์˜ ๊ธฐ์กด ์„ธ์…˜                 | ๋ชธ: `{ messageID? }`, ๋ฐ˜ํ™˜ <a href={typesUrl}><code>Session</code></a>        |
| `POST`   | `/session/:id/abort`                     | ์šด์˜ ์ค‘์ธ ์„ธ์…˜                     | ๋ฐ˜ํ’ˆ `boolean`                                                                |
| `POST`   | `/session/:id/share`                     | ์„ธ์…˜ ๊ณต์œ                           | <a href={typesUrl}><code>Session</code></a>                                   |
| `DELETE` | `/session/:id/share`                     | ์„ธ์…˜ ๊ณต์œ                           | <a href={typesUrl}><code>Session</code></a>                                   |
| `GET`    | `/session/:id/diff`                      | `/session/:id/diff`                | `messageID?`, ๋ฐ˜ํ™˜ <a href={typesUrl}><code>FileDiff[]</code></a>             |
| `POST`   | `/session/:id/summarize`                 | ์„ธ์…˜์„ ์š”์•ฝ                        | ๋ณธ์ฒด: `{ providerID, modelID }`, `boolean` ๋ฐ˜ํ™˜                               |
| `POST`   | `/session/:id/revert`                    | ๋ฉ”์‹œ์ง€ ์žฌ์ƒ                        | ๋ชธ: `{ messageID, partID? }`, ๋ฐ˜ํ™˜ `boolean`                                  |
| `POST`   | `/session/:id/unrevert`                  | ๋ฉ”์‹œ์ง€ ๋˜๋Œ๋ฆฌ๊ธฐ ์ทจ์†Œ               | ๋ฐ˜ํ’ˆ `boolean`                                                                |
| `POST`   | `/session/:id/permissions/:permissionID` | ํ—ˆ๊ฐ€ ์š”์ฒญ ๋Œ€์‘                     | ๋ณธ์ฒด: `{ response, remember? }`, `boolean`                                    |

---

## ๋ฉ”์‹œ์ง€

| ๋ฐฉ๋ฒ•   | ๊ฒฝ๋กœ                              | ์„ค๋ช…                                   | ์ฃผ                                                                                                                                                               |
| ------ | --------------------------------- | -------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `GET`  | `/session/:id/message`            | ์„ธ์…˜์˜ ๋ชฉ๋ก ๋ฉ”์‹œ์ง€                     | ์ฟผ๋ฆฌ: `limit?`, `{ info: `<a href={typesUrl}>Message</a>`, parts: `<a href={typesUrl}>Part[]</a>`}[]`                                                            |
| `POST` | `/session/:id/message`            | ์‘๋‹ต์„ ์œ„ํ•ด ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‚ด๊ณ  ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค | ๋ชธ: `{ messageID?, model?, agent?, noReply?, system?, tools?, parts }`, ๋ฐ˜ํ™˜ `{ info: `<a href={typesUrl}>Message</a>`, parts: `<a href={typesUrl}>Part[]</a>`}` |
| `GET`  | `/session/:id/message/:messageID` | ๋ฉ”์‹œ์ง€ ๋ณด๋‚ด๊ธฐ                          | `{ info: `<a href={typesUrl}>Message</a>`, parts: `<a href={typesUrl}>Part[]</a>`}`                                                                              |
| `POST` | `/session/:id/prompt_async`       | ๋น„๋™๊ธฐ์ ์œผ๋กœ ๋ฉ”์‹œ์ง€ ๋ณด๋‚ด๊ธฐ             | ๋ชธ: `/session/:id/message`์™€ ๋™์ผ, `204 No Content`๋ฅผ ๋ฐ˜ํ™˜                                                                                                       |
| `POST` | `/session/:id/command`            | ์Šฌ๋ž˜์‹œ ๋ช…๋ น์–ด ์‹คํ–‰                     | ๋ณธ์ฒด: `{ messageID?, agent?, model?, command, arguments }`, ๋ฐ˜ํ™˜ `{ info: `<a href={typesUrl}>Message</a>`, parts: `<a href={typesUrl}>Part[]</a>`}`             |
| `POST` | `/session/:id/shell`              | shell ๋ช…๋ น ์‹คํ–‰                        | ์ฒด: `{ agent, model?, command }`, ๋ฐ˜ํ™˜ `{ info: `<a href={typesUrl}>Message</a>`, parts: `<a href={typesUrl}>Part[]</a>`}`                                       |

---

## ๋ช…๋ น

| ๋ฐฉ๋ฒ•  | ๊ฒฝ๋กœ       | ์„ค๋ช…      | ์‘๋‹ต                                          |
| ----- | ---------- | --------- | --------------------------------------------- |
| `GET` | `/command` | ๋ชจ๋“  ๋ช…๋ น | <a href={typesUrl}><code>Command[]</code></a> |

---

## ํŒŒ์ผ

| ๋ฐฉ๋ฒ•  | ๊ฒฝ๋กœ                     | ์„ค๋ช…                         | ์‘๋‹ต                                                                                    |
| ----- | ------------------------ | ---------------------------- | --------------------------------------------------------------------------------------- |
| `GET` | `/find?pattern=<pat>`    | ํŒŒ์ผ์—์„œ ํ…์ŠคํŠธ ๊ฒ€์ƒ‰         | `path`, `lines`, `line_number`, `absolute_offset`, `submatches`๊ฐ€ ํฌํ•จ๋œ ์ผ์น˜ ๊ฐ์ฒด ๋ฐฐ์—ด |
| `GET` | `/find/file?query=<q>`   | ์ด๋ฆ„์œผ๋กœ ํŒŒ์ผ/๋””๋ ‰ํ„ฐ๋ฆฌ ์ฐพ๊ธฐ  | `string[]` (๊ฒฝ๋กœ)                                                                       |
| `GET` | `/find/symbol?query=<q>` | ์›Œํฌ์ŠคํŽ˜์ด์Šค ์‹ฌ๋ณผ ์ฐพ๊ธฐ       | <a href={typesUrl}><code>Symbol[]</code></a>                                            |
| `GET` | `/file?path=<path>`      | ํŒŒ์ผ ๋ฐ ๋””๋ ‰ํ„ฐ๋ฆฌ ๋ชฉ๋ก        | <a href={typesUrl}><code>FileNode[]</code></a>                                          |
| `GET` | `/file/content?path=<p>` | ํŒŒ์ผ ์ฝ๊ธฐ                    | <a href={typesUrl}><code>FileContent</code></a>                                         |
| `GET` | `/file/status`           | ์ถ”์  ์ค‘์ธ ํŒŒ์ผ ์ƒํƒœ ๊ฐ€์ ธ์˜ค๊ธฐ | <a href={typesUrl}><code>File[]</code></a>                                              |

#### `/find/file` ์ฟผ๋ฆฌ ๋งค๊ฐœ ๋ณ€์ˆ˜

- `query` (required) - ๊ฒ€์ƒ‰ ๋ฌธ์ž์—ด (fuzzy ์ผ์น˜)
- `type` (์„ ํƒ ์‚ฌํ•ญ) - `"file"` ๋˜๋Š” `"directory"`์— ์ œํ•œ ๊ฒฐ๊ณผ
- `directory` (์„ ํƒ ์‚ฌํ•ญ) - ๊ฒ€์ƒ‰์— ๋Œ€ํ•œ ํ”„๋กœ์ ํŠธ ๋ฃจํŠธ๋ฅผ ๋ฌด์‹œ
- (์„ ํƒ) `limit` - ์ตœ๋Œ€ ๊ฒฐ๊ณผ (1-200)
- `dirs` (์˜ต์…˜) - ๋ ˆ๊ฑฐ์‹œ ํ”Œ๋ž˜๊ทธ (`"false"`๋Š” ํŒŒ์ผ๋งŒ ๋ฐ˜ํ™˜)

---

## ๋„๊ตฌ (์‹คํ—˜์ )

| ๋ฐฉ๋ฒ•  | ๊ฒฝ๋กœ                                        | ์„ค๋ช…                    | ์‘๋‹ต                                          |
| ----- | ------------------------------------------- | ----------------------- | --------------------------------------------- |
| `GET` | `/experimental/tool/ids`                    | ๋ชจ๋“  ๋„๊ตฌ ID            | <a href={typesUrl}><code>๋„๊ตฌ</code></a>      |
| `GET` | `/experimental/tool?provider=<p>&model=<m>` | ๋ชจ๋ธ์šฉ JSON ์Šคํ‚ค๋งˆ ๋ชฉ๋ก | <a href={typesUrl}><code>๋„๊ตฌ ๋ชฉ๋ก</code></a> |

---

### LSP, ํฌ๋งคํ„ฐ & MCP

| ๋ฐฉ๋ฒ•   | ๊ฒฝ๋กœ         | ์„ค๋ช…                   | ์‘๋‹ต                                                     |
| ------ | ------------ | ---------------------- | -------------------------------------------------------- |
| `GET`  | `/lsp`       | LSP ์„œ๋ฒ„ ์ƒํƒœ          | <a href={typesUrl}><code>LSPStatus[]</code></a>          |
| `GET`  | `/formatter` | ํ˜•์‹์˜ ์ƒํƒœ๋ฅผ ํ™•์ธ     | <a href={typesUrl}><code>FormatterStatus[]</code></a>    |
| `GET`  | `/mcp`       | MCP ์„œ๋ฒ„ ์ƒํƒœ๋ฅผ ์–ป๋Š”๋‹ค | `{ [name: string]: `<a href={typesUrl}>MCPStatus</a>` }` |
| `POST` | `/mcp`       | MCP ์„œ๋ฒ„๊ฐ€ ๋™์         | ๋ณธ์ฒด: `{ name, config }`, MCP ์ƒํƒœ ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜           |

---

## ์—์ด์ „ํŠธ

| ๋ฐฉ๋ฒ•  | ๊ฒฝ๋กœ     | ์„ค๋ช…                      | ์‘๋‹ต                                            |
| ----- | -------- | ------------------------- | ----------------------------------------------- |
| `GET` | `/agent` | ์ด์šฉ ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ์—์ด์ „ํŠธ | <a href={typesUrl}><code> ์—์ด์ „ํŠธ[]</code></a> |

---

### ๋กœ๊น…

| ๋ฐฉ๋ฒ•   | ๊ฒฝ๋กœ   | ์„ค๋ช…                                                  | ์‘๋‹ต      |
| ------ | ------ | ----------------------------------------------------- | --------- |
| `POST` | `/log` | ๋กœ๊ทธ ์ž…๋ ฅ ๋ฐ”๋””: `{ service, level, message, extra? }` | `boolean` |

---

### TUI

| ๋ฐฉ๋ฒ•   | ๊ฒฝ๋กœ                    | ์„ค๋ช…                                      | ์‘๋‹ต           |
| ------ | ----------------------- | ----------------------------------------- | -------------- |
| `POST` | `/tui/append-prompt`    | ํ”„๋กฌํ”„ํŠธ์— ํ…์ŠคํŠธ๋ฅผ ๋ถ€์—ฌ                  | `boolean`      |
| `POST` | `/tui/open-help`        | ๋„์›€๋ง ๋Œ€ํ™” ์—ด๊ธฐ                          | `boolean`      |
| `POST` | `/tui/open-sessions`    | ์„ธ์…˜ ์„ ํƒ ์•ˆ๋‚ด                            | `boolean`      |
| `POST` | `/tui/open-themes`      | ํ…Œ๋งˆ ์„ ํƒ ์•ˆ๋‚ด                            | `boolean`      |
| `POST` | `/tui/open-models`      | ๋ชจ๋ธ ์„ ํƒ ์•ˆ๋‚ด                            | `boolean`      |
| `POST` | `/tui/submit-prompt`    | ํ˜„์žฌ ํ”„๋กฌํ”„ํŠธ ์ œ์ถœ                        | `boolean`      |
| `POST` | `/tui/clear-prompt`     | ์‹œํ”„ํŠธ ํด๋ฆฌ์–ด                             | `boolean`      |
| `POST` | `/tui/execute-command`  | ๋ช…๋ น์–ด ์‹คํ–‰(`{ command }`)                | `boolean`      |
| `POST` | `/tui/show-toast`       | ์‡ผ ํ† ์ŠคํŠธ(`{ title?, message, variant }`) | `boolean`      |
| `GET`  | `/tui/control/next`     | ๋‹ค์Œ ์ปจํŠธ๋กค ์š”์ฒญ ์‹œ ๊ธฐ๋‹ค๋ฆฌ๊ณ               | ์ œ์–ด ์š”์ฒญ ๊ฐœ์ฒด |
| `POST` | `/tui/control/response` | ํ†ต์ œ ์š”์ฒญ(`{ body }`) ๋Œ€์‘                | `boolean`      |

---

### ์ธ์ฆ

| ๋ฐฉ๋ฒ•  | ๊ฒฝ๋กœ        | ์„ค๋ช…                                                | ์‘๋‹ต      |
| ----- | ----------- | --------------------------------------------------- | --------- |
| `PUT` | `/auth/:id` | ์ธ์ฆ ์ž๊ฒฉ ์ฆ๋ช… ๋ชธ์€ ๊ณต๊ธ‰์ž ์Šคํ‚ค๋งˆ๋ฅผ ์ผ์น˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค | `boolean` |

---

## ์ด๋ฒคํŠธ

| ๋ฐฉ๋ฒ•  | ๊ฒฝ๋กœ     | ์„ค๋ช…                                                                            | ์‘๋‹ต                     |
| ----- | -------- | ------------------------------------------------------------------------------- | ------------------------ |
| `GET` | `/event` | ์„œ๋ฒ„ ์ „์†ก ์ด๋ฒคํŠธ ์ŠคํŠธ๋ฆผ. ์ฒซ ๋ฒˆ์งธ ์ด๋ฒคํŠธ๋Š” `server.connected`, ๊ทธ ํ›„ ๋ฒ„์Šค ์ด๋ฒคํŠธ | Server-sent event stream |

---

### ๋ฌธ์„œ

| ๋ฐฉ๋ฒ•  | ๊ฒฝ๋กœ   | ์„ค๋ช…             | ์‘๋‹ต                     |
| ----- | ------ | ---------------- | ------------------------ |
| `GET` | `/doc` | OpenAPI 3.1 ์‚ฌ์–‘ | HTML ํŽ˜์ด์ง€ OpenAPI ์‚ฌ์–‘ |