deel-local-cli 1.15.0 → 1.16.0
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.ko.md +70 -13
- package/README.md +71 -13
- package/bin/deel.js +45 -1
- package/package.json +1 -1
- package/src/acp/jsonrpc.js +23 -0
- package/src/acp/serve.js +62 -5
- package/src/agent/asks.js +58 -2
- package/src/agent/budget.js +33 -0
- package/src/agent/effort.js +69 -0
- package/src/agent/loop.js +10 -2
- package/src/agent/modes.js +179 -17
- package/src/agent/route.js +119 -8
- package/src/backend/adapter.js +56 -5
- package/src/cmdnames.js +1 -0
- package/src/commands.js +31 -13
- package/src/completion.js +1 -0
- package/src/i18n/en.js +13 -0
- package/src/i18n/ja.js +13 -0
- package/src/i18n/ko.js +13 -0
- package/src/i18n/zh.js +13 -0
- package/src/tools/doc2md.js +266 -0
- package/src/tools/docs.js +14 -4
- package/src/tools/fig.js +393 -0
- package/src/tools/index.js +49 -8
- package/src/tools/kiwi.js +293 -0
package/README.ko.md
CHANGED
|
@@ -14,13 +14,13 @@
|
|
|
14
14
|
<br>
|
|
15
15
|
|
|
16
16
|
[](https://www.npmjs.com/package/deel-local-cli)
|
|
17
|
-
[](https://www.npmjs.com/package/deel-local-cli)
|
|
18
18
|
[](https://nodejs.org)
|
|
19
19
|
[](LICENSE)
|
|
20
20
|
|
|
21
21
|
[](https://github.com/jysvai/deel-local-cli/actions/workflows/test.yml)
|
|
22
22
|
[](https://github.com/jysvai/deel-local-cli/actions/workflows/codeql.yml)
|
|
23
|
-
[](docs/ko/develop.md)
|
|
24
24
|
|
|
25
25
|
[](https://www.npmjs.com/package/deel-local-cli?activeTab=dependencies)
|
|
26
26
|
[](package.json)
|
|
@@ -94,7 +94,7 @@
|
|
|
94
94
|
| [속도와 씀씀이](docs/ko/tuning.md) | 단계별 추론 강도 · 프리픽스 캐시 · 컨텍스트 길이 |
|
|
95
95
|
| [안전망과 사내 반입](docs/ko/safety.md) | 되돌리기 · 작업 범위 · 감사기록 · 심사 서류 |
|
|
96
96
|
| [설정](docs/ko/config.md) · [개발](docs/ko/develop.md) | 환경변수 · 실행 옵션 · 검사 돌리기 · 폴더 구조 |
|
|
97
|
-
| [릴리스 노트](docs/ko/releases.md) | [1.15.x](docs/ko/releases/1.15.md) · [1.14.x](docs/ko/releases/1.14.md) · [1.13.x](docs/ko/releases/1.13.md) · [1.12.x](docs/ko/releases/1.12.md) · [1.10.x](docs/ko/releases/1.10.md) · [1.9.x](docs/ko/releases/1.9.md) · [그 앞](docs/ko/releases.md) |
|
|
97
|
+
| [릴리스 노트](docs/ko/releases.md) | [1.16.x](docs/ko/releases/1.16.md) · [1.15.x](docs/ko/releases/1.15.md) · [1.14.x](docs/ko/releases/1.14.md) · [1.13.x](docs/ko/releases/1.13.md) · [1.12.x](docs/ko/releases/1.12.md) · [1.10.x](docs/ko/releases/1.10.md) · [1.9.x](docs/ko/releases/1.9.md) · [그 앞](docs/ko/releases.md) |
|
|
98
98
|
|
|
99
99
|
---
|
|
100
100
|
|
|
@@ -267,7 +267,7 @@ deel --offline
|
|
|
267
267
|
무엇이 어디로 갈 수 있는지는 켤 때 화면 맨 위에 늘 적혀 있습니다.
|
|
268
268
|
|
|
269
269
|
```
|
|
270
|
-
deel 1.
|
|
270
|
+
deel 1.16.0 ⌂ 이 안
|
|
271
271
|
보냄 이 컴퓨터 안 127.0.0.1:11434 ← 여기 말고는 어디로도 안 갑니다
|
|
272
272
|
```
|
|
273
273
|
|
|
@@ -482,7 +482,7 @@ LM Studio 는 `/api/v0/models`, llama.cpp 는 `/props`. 못 알아보면 `(추
|
|
|
482
482
|
| `/mode <모드>` | 승인 정책 — 얼마나 물어보나 (`auto` · `confirm` · `strict`) |
|
|
483
483
|
| `/work [모드]` | 작업 모드 — 무슨 일을 하는 중인가 |
|
|
484
484
|
| `/auto` | 다시 맡기기 — 말을 보고 알맞은 모드로 저절로 옮겨 갑니다 |
|
|
485
|
-
| `/code` `/plan` `/architect` `/debug` `/ask` `/orchestrator` | 작업 모드 바로 바꾸기 (그때부터 고정) |
|
|
485
|
+
| `/code` `/plan` `/architect` `/debug` `/inspect` `/ask` `/orchestrator` | 작업 모드 바로 바꾸기 (그때부터 고정) |
|
|
486
486
|
| `/level [수준]` | 화면에 무엇을 내놓을지 (`쉬움` · `개발자`) |
|
|
487
487
|
| `/motion [기본\|기사\|동물\|사무실\|끔]` | 일하는 동안 뭐가 도나 — 그 자리에서 바뀌고 설정에 남습니다 |
|
|
488
488
|
| `/undo [턴수]` | 파일 변경 되돌리기 |
|
|
@@ -525,6 +525,11 @@ LM Studio 는 `/api/v0/models`, llama.cpp 는 `/props`. 못 알아보면 `(추
|
|
|
525
525
|
|
|
526
526
|
## 작업 모드
|
|
527
527
|
|
|
528
|
+
<picture>
|
|
529
|
+
<source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/jysvai/deel-local-cli/main/docs/assets/shot-work-ko-dark.svg">
|
|
530
|
+
<img alt="deel 작업 모드 목록 — 모드마다 파일을 바꿀 수 있는지, 생각 강도, 최대 걸음 수" src="https://raw.githubusercontent.com/jysvai/deel-local-cli/main/docs/assets/shot-work-ko-light.svg" width="900">
|
|
531
|
+
</picture>
|
|
532
|
+
|
|
528
533
|
무슨 일을 하는 중인지에 따라 **줄 수 있는 도구와 추론 설정이 같이 바뀝니다.**
|
|
529
534
|
`Shift+Tab` 으로 차례로 돌리거나, 이름을 그대로 치면 됩니다.
|
|
530
535
|
|
|
@@ -534,9 +539,13 @@ LM Studio 는 `/api/v0/models`, llama.cpp 는 `/props`. 못 알아보면 `(추
|
|
|
534
539
|
| `/code` ◆ 코드 | 고치고 만든다 | 예 | 보통 (`save`) |
|
|
535
540
|
| `/plan` ☰ 계획 | 먼저 계획만 세운다 | **아니오** | 깊게 (`deep`·high) |
|
|
536
541
|
| `/architect` ◈ 설계 | 구조를 짠다 | **아니오** | 깊게 (`deep`·high) |
|
|
537
|
-
| `/debug` ◉ 디버그 | 원인을 찾는다 | 예 | 깊게 ·
|
|
538
|
-
| `/
|
|
539
|
-
| `/
|
|
542
|
+
| `/debug` ◉ 디버그 | 원인을 찾는다 | 예 | 깊게 · 걸음 많이 |
|
|
543
|
+
| `/inspect` ◍ 점검 | 결함을 찾는다 — 근거를 대고, 안 고친다 | **아니오** | 깊게 (`deep`·high) · 걸음 많이 |
|
|
544
|
+
| `/ask` ◇ 묻기 | 설명만 한다 | **아니오** | 얕게 (`low`) — 다만 시킨 것이 여럿이면 안 낮춥니다 |
|
|
545
|
+
| `/orchestrator` ❋ 총괄 | 큰 일을 쪼개서 | 예 | 걸음 아주 많이 |
|
|
546
|
+
|
|
547
|
+
걸음 수는 **모델 창 크기를 따라갑니다** — 128k 짜리에서 디버그는 250걸음, 묻기는 12걸음입니다.
|
|
548
|
+
작은 모델에 400걸음을 주면 창이 넘쳐 앞엣말을 잊은 채로 도는 것뿐입니다.
|
|
540
549
|
|
|
541
550
|
읽기만 하는 모드에서는 `Write`·`Edit`·`Bash` 를 **모델에게 아예 보내지 않습니다.**
|
|
542
551
|
"고치지 마세요" 라고 부탁하지 않습니다 — 모델은 부탁을 잊습니다. 없는 도구는 못 씁니다.
|
|
@@ -544,7 +553,7 @@ LM Studio 는 `/api/v0/models`, llama.cpp 는 `/props`. 못 알아보면 `(추
|
|
|
544
553
|
`/mode` 와 헷갈리지 마세요. 둘은 다른 축입니다.
|
|
545
554
|
|
|
546
555
|
- `/mode` — **얼마나 물어보나** (auto · confirm · strict)
|
|
547
|
-
- `/work` — **무슨 일을 하는 중인가** (위
|
|
556
|
+
- `/work` — **무슨 일을 하는 중인가** (위 여덟 가지)
|
|
548
557
|
|
|
549
558
|
`/think` 나 `/mode` 를 직접 고른 적이 있으면 그 선택이 우선합니다.
|
|
550
559
|
모드가 사람이 고른 값을 덮어쓰지 않습니다.
|
|
@@ -629,12 +638,41 @@ PDF 는 **못 읽은 쪽을 못 읽었다고 말합니다.** 스캔본·암호·
|
|
|
629
638
|
빈 글로 넘기지 않고 그 자리에 까닭을 적습니다 — 빈 글은 「그런 내용이 없다」로
|
|
630
639
|
읽히기 때문입니다.
|
|
631
640
|
|
|
641
|
+
문서를 **마크다운 한 장으로** 뽑아 두려면 `deel doc2md` 입니다. 표가
|
|
642
|
+
`| 이름 | 값 |` 꼴로 살아 있는 채로 나오기 때문에, 평평한 글보다 모델이 훨씬
|
|
643
|
+
덜 헷갈립니다.
|
|
644
|
+
|
|
645
|
+
<picture>
|
|
646
|
+
<source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/jysvai/deel-local-cli/main/docs/assets/shot-doc2md-dark.svg">
|
|
647
|
+
<img alt="deel doc2md 로 docx 를 마크다운으로 — 표가 마크다운 표로 그대로 남는다" src="https://raw.githubusercontent.com/jysvai/deel-local-cli/main/docs/assets/shot-doc2md-light.svg" width="820">
|
|
648
|
+
</picture>
|
|
649
|
+
|
|
650
|
+
```bash
|
|
651
|
+
deel doc2md 보고서.pptx # 표준출력으로
|
|
652
|
+
deel doc2md 스펙.pdf --out 스펙.md # 파일로
|
|
653
|
+
```
|
|
654
|
+
|
|
655
|
+
**Figma 시안(`.fig`)도 읽습니다.** 「이 시안대로 만들어 줘」 하고 건네받은
|
|
656
|
+
파일이 「이진 파일이라 못 읽습니다」 로 끝나던 자리입니다. 안에는 그림만이
|
|
657
|
+
아니라 **틀 이름 · 글 · 크기 · 겹친 차례**가 다 글자로 들어 있습니다.
|
|
658
|
+
|
|
659
|
+
```
|
|
660
|
+
- FRAME · 로그인 화면 375×812
|
|
661
|
+
- TEXT · 제목 "다시 오신 것을 환영합니다"
|
|
662
|
+
- FRAME · 입력칸 335×48
|
|
663
|
+
- TEXT · 라벨 "이메일"
|
|
664
|
+
```
|
|
665
|
+
|
|
666
|
+
색·그림자·글꼴은 안 냅니다 — 그리고 **안 낸다고 먼저 말합니다.** 요즘 `.fig`
|
|
667
|
+
는 zstd 로 눌려 있어 Node 22.15 이상이 필요하고, 낮은 판에서는 「깨진 파일」 이
|
|
668
|
+
아니라 **여기서 못 푼다**고 말합니다.
|
|
669
|
+
|
|
632
670
|
옛 형식(`.ppt`·`.doc`·`.xls`·`.rtf`)은 **이 PC 에 깔린 LibreOffice 를 빌려서**
|
|
633
671
|
읽습니다 — `rg` 를 빌려 쓰는 것과 같은 원칙으로, 아무것도 설치하지 않습니다.
|
|
634
672
|
없으면 **없다고 못 박고 끝냅니다**(무엇이 없어서 못 하는지, 무엇을 하면 되는지,
|
|
635
673
|
그리고 「다시 열지 말라」까지). 끄려면 `DEEL_CONVERT=off`.
|
|
636
674
|
|
|
637
|
-
> **자세히** — 인코딩 · 엑셀 · hwpx/docx/pptx · PDF · 변환기 빌려 쓰기
|
|
675
|
+
> **자세히** — 인코딩 · 엑셀 · hwpx/docx/pptx · PDF · `doc2md` · 변환기 빌려 쓰기
|
|
638
676
|
>
|
|
639
677
|
> **[한글 문서와 엑셀 읽기 →](docs/ko/documents.md#한글-문서와-엑셀)**
|
|
640
678
|
|
|
@@ -898,6 +936,23 @@ deel acp
|
|
|
898
936
|
에디터가 이걸 자식 프로세스로 띄우고, 표준입출력으로 줄 단위 JSON-RPC 2.0 을
|
|
899
937
|
주고받습니다. 사람이 직접 칠 명령은 아닙니다.
|
|
900
938
|
|
|
939
|
+
**Zed 라면 이렇게 적습니다.** 에이전트 패널의 `Settings → External Agents →
|
|
940
|
+
Add Custom Agent` 를 눌러도 되고, `settings.json` 에 바로 적어도 됩니다.
|
|
941
|
+
|
|
942
|
+
```json
|
|
943
|
+
{
|
|
944
|
+
"agent_servers": {
|
|
945
|
+
"deel": { "type": "custom", "command": "npx", "args": ["-y", "deel-local-cli", "acp"], "env": {} }
|
|
946
|
+
}
|
|
947
|
+
}
|
|
948
|
+
```
|
|
949
|
+
|
|
950
|
+
그리고 에이전트 패널에서 **deel** 을 고릅니다. 아직 `deel setup` 을 안 했다면
|
|
951
|
+
deel 이 「연결이 없다」 고 에디터에게 **규격대로**(ACP 의 `AuthRequired`) 말하고,
|
|
952
|
+
같이 보내 둔 ``Run `deel setup` in a terminal`` 이 뜹니다 — 빨간 글씨만 보고
|
|
953
|
+
버그인지 설정 문제인지 헤매지 않게 하려는 것입니다. 터미널에서 한 번 마치면
|
|
954
|
+
그 다음부터는 바로 대화가 열립니다.
|
|
955
|
+
|
|
901
956
|
**붙으면 이렇게 됩니다.**
|
|
902
957
|
|
|
903
958
|
| 에디터 쪽 | deel 쪽 |
|
|
@@ -906,7 +961,7 @@ deel acp
|
|
|
906
961
|
| 도구 목록 (아이콘·상태) | `Read` 는 읽기, `Edit` 는 고치기, `Bash` 는 실행 — **갈래를 붙여** 보냅니다 |
|
|
907
962
|
| 파일 링크 | 고친 파일의 **절대 경로**. 눌러서 그 자리로 갑니다 |
|
|
908
963
|
| 승인 창 | deel 의 안전망이 그대로 에디터 창으로 뜹니다 (`이번만` · `앞으로 묻지 않기` · `안 함`) |
|
|
909
|
-
| 모드 고르개 | deel 의 작업 모드
|
|
964
|
+
| 모드 고르개 | deel 의 작업 모드 8개 (`종합` · `코드` · `계획` · `설계` · `디버그` · `점검` · `묻기` · `총괄`) |
|
|
910
965
|
| 멈춤 단추 | 도중에 닿습니다 — 답을 기다리는 중에도 |
|
|
911
966
|
| 지난 대화 | 껐다 켜도 그대로 열립니다. 터미널과 **같은 자리**에 남아서, 에디터에서 하던 것을 `deel --resume` 으로 이어받는 것도 됩니다 |
|
|
912
967
|
|
|
@@ -1087,7 +1142,7 @@ deel sbom --only sbom # SBOM 한 장만
|
|
|
1087
1142
|
## 개발
|
|
1088
1143
|
|
|
1089
1144
|
```bash
|
|
1090
|
-
npm test 전체 검증 (7,
|
|
1145
|
+
npm test 전체 검증 (7,346항목 — 몇몇은 터미널에 따라 갈립니다)
|
|
1091
1146
|
npm run coverage 검사가 소스의 어디를 밟았는지
|
|
1092
1147
|
npm run verify 반입·통신 검증만
|
|
1093
1148
|
npm run bench 편집 성공률 측정
|
|
@@ -1144,7 +1199,7 @@ zip 은 진짜 `unzip` 으로, tar 는 진짜 `tar` 가 만든 것을 읽혀 교
|
|
|
1144
1199
|
| `exitcode` · `doorparity` | 7 · 7 | 화면에 적은 종료코드 표가 진짜인가 · 문 **네 개**가 같은 것을 주는가 |
|
|
1145
1200
|
| `no-bundle` | 21 | 배포 묶음에 남의 것이 안 섞였는가 · 검사 파일 위생 |
|
|
1146
1201
|
| `edit-bench` | 20건 | 편집 성공률 |
|
|
1147
|
-
| `mutate` | 어긋
|
|
1202
|
+
| `mutate` | 어긋 12개 | **검사가 정말 지키는가** — 지켜야 할 줄을 일부러 어긋내고 빨개지는지 본다 |
|
|
1148
1203
|
|
|
1149
1204
|
> **자세히** — 어디를 밟았는지 · 폴더 구조
|
|
1150
1205
|
>
|
|
@@ -1156,6 +1211,8 @@ zip 은 진짜 `unzip` 으로, tar 는 진짜 `tar` 가 만든 것을 읽혀 교
|
|
|
1156
1211
|
|
|
1157
1212
|
| 판 | 무엇이 바뀌었나 |
|
|
1158
1213
|
|---|---|
|
|
1214
|
+
| **[1.16.0](docs/ko/releases/1.16.md#1160)** | 깊이 봐 달라는 말을 얕게 받던 자리 · 게이트웨이 캐시 · `doc2md` · Figma `.fig` |
|
|
1215
|
+
| **[1.15.1](docs/ko/releases/1.15.md#1151)** | 에디터에 우리가 어떻게 인증받는지 말합니다 — ACP 레지스트리 등재 조건 |
|
|
1159
1216
|
| **[1.15.0](docs/ko/releases/1.15.md#1150)** | 같은 것을 두 번 하지 않습니다 — 프리픽스 캐시를 깨던 조용히 비싼 아홉 자리 |
|
|
1160
1217
|
| **[1.14.0](docs/ko/releases/1.14.md#1140)** | 적어 둔 것이 참인지 기계가 대신 봅니다 — 초록불과 「깨면 잡힌다」 는 다릅니다 |
|
|
1161
1218
|
| [1.13.1](docs/ko/releases/1.13.md#1131) | 올라간 물건이 소스와 달랐습니다 — 148개 중 47개가 CRLF 로 나갔습니다 |
|
package/README.md
CHANGED
|
@@ -14,13 +14,13 @@ Vendor APIs connect too — **only when you say so**
|
|
|
14
14
|
<br>
|
|
15
15
|
|
|
16
16
|
[](https://www.npmjs.com/package/deel-local-cli)
|
|
17
|
-
[](https://www.npmjs.com/package/deel-local-cli)
|
|
18
18
|
[](https://nodejs.org)
|
|
19
19
|
[](LICENSE)
|
|
20
20
|
|
|
21
21
|
[](https://github.com/jysvai/deel-local-cli/actions/workflows/test.yml)
|
|
22
22
|
[](https://github.com/jysvai/deel-local-cli/actions/workflows/codeql.yml)
|
|
23
|
-
[](docs/en/develop.md)
|
|
24
24
|
|
|
25
25
|
[](https://www.npmjs.com/package/deel-local-cli?activeTab=dependencies)
|
|
26
26
|
[](package.json)
|
|
@@ -119,7 +119,7 @@ This page is the **summary**. Each section links to the detail behind it.
|
|
|
119
119
|
| [Speed and spend](docs/en/tuning.md) | Per-stage effort · the prefix cache · context length |
|
|
120
120
|
| [Safety and corporate review](docs/en/safety.md) | Undo · working scope · audit log · the review package |
|
|
121
121
|
| [Configuration](docs/en/config.md) · [Development](docs/en/develop.md) | Env vars · run flags · running the tests · folder layout |
|
|
122
|
-
| [Release notes](docs/en/releases.md) | [1.15.x](docs/en/releases/1.15.md) · [1.14.x](docs/en/releases/1.14.md) · [1.13.x](docs/en/releases/1.13.md) · [1.12.x](docs/en/releases/1.12.md) · [1.10.x](docs/en/releases/1.10.md) · [1.9.x](docs/en/releases/1.9.md) · [older](docs/en/releases.md) |
|
|
122
|
+
| [Release notes](docs/en/releases.md) | [1.16.x](docs/en/releases/1.16.md) · [1.15.x](docs/en/releases/1.15.md) · [1.14.x](docs/en/releases/1.14.md) · [1.13.x](docs/en/releases/1.13.md) · [1.12.x](docs/en/releases/1.12.md) · [1.10.x](docs/en/releases/1.10.md) · [1.9.x](docs/en/releases/1.9.md) · [older](docs/en/releases.md) |
|
|
123
123
|
|
|
124
124
|
---
|
|
125
125
|
|
|
@@ -338,7 +338,7 @@ deel --offline
|
|
|
338
338
|
The destination is printed at the top of every session:
|
|
339
339
|
|
|
340
340
|
```
|
|
341
|
-
deel 1.
|
|
341
|
+
deel 1.16.0 ⌂ inside
|
|
342
342
|
Sends to this machine 127.0.0.1:11434 ← nowhere else
|
|
343
343
|
```
|
|
344
344
|
|
|
@@ -545,7 +545,7 @@ Names follow Claude Code / Codex conventions.
|
|
|
545
545
|
| `/mode <mode>` | Approval policy — how much it asks (`auto` · `confirm` · `strict`) |
|
|
546
546
|
| `/work [mode]` | Work mode — what kind of work you are doing |
|
|
547
547
|
| `/auto` | Hand the wheel back — it picks the mode from what you type |
|
|
548
|
-
| `/code` `/plan` `/architect` `/debug` `/ask` `/orchestrator` | Switch work mode directly (pins it) |
|
|
548
|
+
| `/code` `/plan` `/architect` `/debug` `/inspect` `/ask` `/orchestrator` | Switch work mode directly (pins it) |
|
|
549
549
|
| `/level [level]` | How much to show (`simple` · `developer`) |
|
|
550
550
|
| `/motion [plain\|knight\|animal\|office\|off]` | What animates while it works — takes effect at once, and is saved |
|
|
551
551
|
| `/undo [turns]` | Revert file changes |
|
|
@@ -591,6 +591,11 @@ Korean IME composition, paste, `Ctrl+A/E` and backspace all keep working.
|
|
|
591
591
|
|
|
592
592
|
## Work modes
|
|
593
593
|
|
|
594
|
+
<picture>
|
|
595
|
+
<source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/jysvai/deel-local-cli/main/docs/assets/shot-work-en-dark.svg">
|
|
596
|
+
<img alt="deel work modes: whether each can edit files, its reasoning depth, and its step ceiling" src="https://raw.githubusercontent.com/jysvai/deel-local-cli/main/docs/assets/shot-work-en-light.svg" width="900">
|
|
597
|
+
</picture>
|
|
598
|
+
|
|
594
599
|
What you are working on changes **which tools the model is given and how hard it thinks.**
|
|
595
600
|
Cycle with `Shift+Tab`, or type the name.
|
|
596
601
|
|
|
@@ -600,9 +605,13 @@ Cycle with `Shift+Tab`, or type the name.
|
|
|
600
605
|
| `/code` ◆ Code | Writing and fixing | Yes | Normal (`save`) |
|
|
601
606
|
| `/plan` ☰ Plan | Planning first | **No** | Deep (`deep`·high) |
|
|
602
607
|
| `/architect` ◈ Architect | Shaping structure | **No** | Deep (`deep`·high) |
|
|
603
|
-
| `/debug` ◉ Debug | Finding causes | Yes | Deep,
|
|
604
|
-
| `/
|
|
605
|
-
| `/
|
|
608
|
+
| `/debug` ◉ Debug | Finding causes | Yes | Deep, many steps |
|
|
609
|
+
| `/inspect` ◍ Inspect | Auditing for defects — with evidence, changing nothing | **No** | Deep (`deep`/high), many steps |
|
|
610
|
+
| `/ask` ◇ Ask | Explaining only | **No** | Shallow (`low`) — not lowered when the ask has several parts |
|
|
611
|
+
| `/orchestrator` ❋ Orchestrator | Breaking up large work | Yes | Very many steps |
|
|
612
|
+
|
|
613
|
+
The step ceiling **follows the model's window** — on a 128k model debug gets 250 steps and ask gets 12.
|
|
614
|
+
Hand a small model 400 steps and it just runs on past the point where its window folded.
|
|
606
615
|
|
|
607
616
|
In read-only modes, `Write`, `Edit` and `Bash` are **never sent to the model at all.**
|
|
608
617
|
It is not asked politely not to edit — models forget requests. A tool that isn't there can't be used.
|
|
@@ -610,7 +619,7 @@ It is not asked politely not to edit — models forget requests. A tool that isn
|
|
|
610
619
|
Don't confuse this with `/mode`. They are separate axes:
|
|
611
620
|
|
|
612
621
|
- `/mode` — **how much it asks you** (auto · confirm · strict)
|
|
613
|
-
- `/work` — **what kind of work you are doing** (the
|
|
622
|
+
- `/work` — **what kind of work you are doing** (the eight above)
|
|
614
623
|
|
|
615
624
|
If you have explicitly set `/think` or `/mode`, your choice wins. A work mode never
|
|
616
625
|
overrides something a person chose.
|
|
@@ -689,12 +698,42 @@ their cost; here is why.
|
|
|
689
698
|
**A file saved as CP949 is written back as CP949.** The encoding is never changed.
|
|
690
699
|
Excel (`.xlsx`) is read as CSV — read-only.
|
|
691
700
|
|
|
701
|
+
To keep a document as **one Markdown file**, use `deel doc2md`. Tables survive as
|
|
702
|
+
real `| name | value |` tables, so a model has far less to guess at than it does
|
|
703
|
+
with flattened text.
|
|
704
|
+
|
|
705
|
+
<picture>
|
|
706
|
+
<source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/jysvai/deel-local-cli/main/docs/assets/shot-doc2md-dark.svg">
|
|
707
|
+
<img alt="deel doc2md turning a docx into Markdown — the table stays a table" src="https://raw.githubusercontent.com/jysvai/deel-local-cli/main/docs/assets/shot-doc2md-light.svg" width="820">
|
|
708
|
+
</picture>
|
|
709
|
+
|
|
710
|
+
```bash
|
|
711
|
+
deel doc2md report.pptx # to stdout
|
|
712
|
+
deel doc2md spec.pdf --out spec.md # to a file
|
|
713
|
+
```
|
|
714
|
+
|
|
715
|
+
**Figma designs (`.fig`) are read too.** Handing over a design with "build this"
|
|
716
|
+
used to end at "binary file, cannot be read". What is inside is not only
|
|
717
|
+
pictures — **frame names, text, sizes and stacking order** are all there as
|
|
718
|
+
characters.
|
|
719
|
+
|
|
720
|
+
```
|
|
721
|
+
- FRAME · Login screen 375×812
|
|
722
|
+
- TEXT · Title "Welcome back"
|
|
723
|
+
- FRAME · Field 335×48
|
|
724
|
+
- TEXT · Label "Email"
|
|
725
|
+
```
|
|
726
|
+
|
|
727
|
+
No colours, shadows or fonts — and it **says so up front**. Recent `.fig` files
|
|
728
|
+
are zstd-compressed, which needs Node 22.15 or newer; on an older one it says
|
|
729
|
+
**this Node cannot unpack it**, not "corrupt file".
|
|
730
|
+
|
|
692
731
|
Old formats (`.ppt`, `.doc`, `.xls`, `.rtf`) are read by **borrowing the LibreOffice already
|
|
693
732
|
on this machine** — the same terms on which deel borrows `rg`, and nothing is ever installed.
|
|
694
733
|
With no converter it **says so definitively and stops**: what is missing, what you can do about
|
|
695
734
|
it, and not to open the file again. Turn it off with `DEEL_CONVERT=off`.
|
|
696
735
|
|
|
697
|
-
> **More** — Encoding · Excel · borrowing a converter
|
|
736
|
+
> **More** — Encoding · Excel · `doc2md` · borrowing a converter
|
|
698
737
|
>
|
|
699
738
|
> **[Korean documents and Excel read →](docs/en/documents.md#korean-text-and-excel)**
|
|
700
739
|
|
|
@@ -977,6 +1016,23 @@ deel acp
|
|
|
977
1016
|
The editor spawns that as a child process and exchanges newline-delimited JSON-RPC 2.0 over
|
|
978
1017
|
stdio. It is not a command you type yourself.
|
|
979
1018
|
|
|
1019
|
+
**In Zed, concretely.** Either use `Settings → External Agents → Add Custom Agent` in the
|
|
1020
|
+
agent panel, or put this straight into `settings.json`:
|
|
1021
|
+
|
|
1022
|
+
```json
|
|
1023
|
+
{
|
|
1024
|
+
"agent_servers": {
|
|
1025
|
+
"deel": { "type": "custom", "command": "npx", "args": ["-y", "deel-local-cli", "acp"], "env": {} }
|
|
1026
|
+
}
|
|
1027
|
+
}
|
|
1028
|
+
```
|
|
1029
|
+
|
|
1030
|
+
Then pick **deel** in the agent panel. If you have not run `deel setup` yet, deel tells the
|
|
1031
|
+
editor so **the way the spec says to** (ACP's `AuthRequired`), along with the method it sent
|
|
1032
|
+
at connect time — ``Run `deel setup` in a terminal``. That is there so a first run is not a
|
|
1033
|
+
red error message you cannot tell from a bug. Finish it once in a terminal and the editor
|
|
1034
|
+
opens straight into a conversation from then on.
|
|
1035
|
+
|
|
980
1036
|
**What you get once it is attached:**
|
|
981
1037
|
|
|
982
1038
|
| In the editor | From deel |
|
|
@@ -985,7 +1041,7 @@ stdio. It is not a command you type yourself.
|
|
|
985
1041
|
| Tool list with icons and status | `Read` is a read, `Edit` is an edit, `Bash` is an execution — **the kind is sent**, not just a name |
|
|
986
1042
|
| Clickable file links | The **absolute path** of every file touched |
|
|
987
1043
|
| Approval dialog | deel's safety rails, rendered as the editor's own prompt (`allow once` · `always allow` · `reject`) |
|
|
988
|
-
| Mode picker | deel's
|
|
1044
|
+
| Mode picker | deel's eight work modes (auto · code · plan · architect · debug · inspect · ask · orchestrator) |
|
|
989
1045
|
| Stop button | Reaches the turn mid-flight, even while waiting on the model |
|
|
990
1046
|
| Past conversations | Still there after a restart. They live in the **same place** as the terminal's, so a session started in the editor can be picked up with `deel --resume` |
|
|
991
1047
|
|
|
@@ -1158,7 +1214,7 @@ Stored in `~/.deel/config.json`. A `.deel/config.json` in the project folder tak
|
|
|
1158
1214
|
## Development
|
|
1159
1215
|
|
|
1160
1216
|
```bash
|
|
1161
|
-
npm test Full suite (7,
|
|
1217
|
+
npm test Full suite (7,346 checks; a few are TTY-dependent)
|
|
1162
1218
|
npm run coverage Which lines the tests actually execute
|
|
1163
1219
|
npm run verify Import + network checks only
|
|
1164
1220
|
npm run bench Edit success rate
|
|
@@ -1201,7 +1257,7 @@ so one run tells you everything.
|
|
|
1201
1257
|
| `exitcode` · `doorparity` | 7 · 7 | The printed exit-code table is real · all **four** doors hand out the same thing |
|
|
1202
1258
|
| `no-bundle` | 21 | Nothing foreign in the published package; test-file hygiene |
|
|
1203
1259
|
| `edit-bench` | 20 cases | Edit success rate |
|
|
1204
|
-
| `mutate` |
|
|
1260
|
+
| `mutate` | 12 mutants | **Whether the tests actually guard** — break the line on purpose, check it turns red |
|
|
1205
1261
|
|
|
1206
1262
|
> **More** — Coverage · Layout
|
|
1207
1263
|
>
|
|
@@ -1213,6 +1269,8 @@ so one run tells you everything.
|
|
|
1213
1269
|
|
|
1214
1270
|
| Version | What changed |
|
|
1215
1271
|
|---|---|
|
|
1272
|
+
| **[1.16.0](docs/en/releases/1.16.md#1160)** | A deep request no longer lands in a shallow mode · gateway cache · `doc2md` · Figma `.fig` |
|
|
1273
|
+
| **[1.15.1](docs/en/releases/1.15.md#1151)** | Telling the editor how we get authenticated — ACP Registry listing requirement |
|
|
1216
1274
|
| **[1.15.0](docs/en/releases/1.15.md#1150)** | Stop doing the same thing twice — nine quietly expensive places that broke the prefix cache |
|
|
1217
1275
|
| **[1.14.0](docs/en/releases/1.14.md#1140)** | A machine now checks that what we wrote down is true — green does not mean guarded |
|
|
1218
1276
|
| [1.13.1](docs/en/releases/1.13.md#1131) | What shipped was not what the source said — 47 of 148 files went out with CRLF line endings |
|
package/bin/deel.js
CHANGED
|
@@ -15,6 +15,7 @@ import { runSessions } from '../src/agent/sessionui.js';
|
|
|
15
15
|
import { acp } from '../src/acp/serve.js';
|
|
16
16
|
import { runCompletion } from '../src/completion.js';
|
|
17
17
|
import { runReset } from '../src/reset.js';
|
|
18
|
+
import { 마크다운, 읽는갈래 } from '../src/tools/doc2md.js';
|
|
18
19
|
import { 언어잡기, 언어 } from '../src/i18n/index.js';
|
|
19
20
|
import { load as 설정읽기 } from '../src/config.js';
|
|
20
21
|
|
|
@@ -112,6 +113,47 @@ function runAudit() {
|
|
|
112
113
|
* 운영팀은 감사기록 사양을 보고 수집 규칙을 짠다. zip 을 통째로 만들지 않고
|
|
113
114
|
* 그 두 장만 필요할 때가 실제로 더 잦다 — 심사 양식에 첨부하는 자리다.
|
|
114
115
|
*/
|
|
116
|
+
/*
|
|
117
|
+
* `deel doc2md <파일> [--out 이름.md]` — 문서를 마크다운으로.
|
|
118
|
+
*
|
|
119
|
+
* 읽는 일은 이미 있는 세 읽개가 그대로 한다(docs.js · xlsx.js · pdf.js).
|
|
120
|
+
* 여기서 새로 들이는 것은 없다 — 의존성 0개는 그대로다.
|
|
121
|
+
*
|
|
122
|
+
* `--out` 이 없으면 표준출력으로 낸다. 파이프에 바로 물리는 자리라
|
|
123
|
+
* 여기서는 say() 를 안 쓴다 (completion 과 같은 규칙이다).
|
|
124
|
+
*/
|
|
125
|
+
function runDoc2md(args, flags) {
|
|
126
|
+
const 파일 = args[0];
|
|
127
|
+
if (!파일) {
|
|
128
|
+
say(` ${mark.warn} 바꿀 파일을 주세요: ${c.white('deel doc2md 보고서.pptx')}`);
|
|
129
|
+
say(` ${c.gray('직접 읽는 것:')} ${읽는갈래.join(c.gray(' · '))}`);
|
|
130
|
+
return 1;
|
|
131
|
+
}
|
|
132
|
+
const r = 마크다운(파일);
|
|
133
|
+
if (!r.ok) {
|
|
134
|
+
say('');
|
|
135
|
+
for (const 줄 of String(r.error).split('\n')) say(` ${mark.warn} ${줄}`);
|
|
136
|
+
say('');
|
|
137
|
+
return 1;
|
|
138
|
+
}
|
|
139
|
+
// 못 읽은 쪽·자른 자리는 **반드시** 말한다. 조용히 자르면 받은 사람은
|
|
140
|
+
// 그게 문서 전부인 줄 알고 그 위에 판단을 쌓는다.
|
|
141
|
+
if (flags.out) {
|
|
142
|
+
const 자리 = String(flags.out);
|
|
143
|
+
writeFileSync(자리, r.md, 'utf8');
|
|
144
|
+
say('');
|
|
145
|
+
say(` ${mark.ok} ${c.bold(자리)} ${c.gray(r.summary)}`);
|
|
146
|
+
for (const 줄 of r.말 ?? []) say(` ${c.gray(`· ${줄}`)}`);
|
|
147
|
+
say('');
|
|
148
|
+
return 0;
|
|
149
|
+
}
|
|
150
|
+
// 글은 표준출력, 말은 표준오류로 나눈다. 그래야 `> 보고서.md` 로 받아도
|
|
151
|
+
// 「몇 자에서 잘랐습니다」 가 파일 안에 섞여 들어가지 않는다.
|
|
152
|
+
process.stdout.write(`${r.md}\n`);
|
|
153
|
+
for (const 줄 of r.말 ?? []) process.stderr.write(`${줄}\n`);
|
|
154
|
+
return 0;
|
|
155
|
+
}
|
|
156
|
+
|
|
115
157
|
function runSbom(flags) {
|
|
116
158
|
const a = audit();
|
|
117
159
|
const at = new Date();
|
|
@@ -223,7 +265,7 @@ function help() {
|
|
|
223
265
|
say('');
|
|
224
266
|
say(` ${c.gray('--root <폴더>')} 작업 범위. 기본은 지금 폴더`);
|
|
225
267
|
say(` ${c.gray('--mode <모드>')} auto(기본) / confirm / strict`);
|
|
226
|
-
say(` ${c.gray('--work <모드>')} auto(기본·종합) / code / plan / architect / debug / ask / orchestrator`);
|
|
268
|
+
say(` ${c.gray('--work <모드>')} auto(기본·종합) / code / plan / architect / debug / inspect / ask / orchestrator`);
|
|
227
269
|
say(` ${c.gray('--level <수준>')} 쉬움(기본) / 개발자`);
|
|
228
270
|
say(` ${c.gray('--ctx <길이>')} 컨텍스트 길이 직접 지정 (655360 · 640k · 128k). 없으면 서버에 맞춤`);
|
|
229
271
|
say(` ${c.gray('--max-tokens <길이>')} 한 번에 받을 답 길이 상한 (32k). 큰 파일이 잘리면 올린다 — /out 과 같은 값`);
|
|
@@ -374,6 +416,8 @@ async function main() {
|
|
|
374
416
|
return runPack(flags);
|
|
375
417
|
case 'audit':
|
|
376
418
|
return runAudit();
|
|
419
|
+
case 'doc2md':
|
|
420
|
+
return runDoc2md(args, flags);
|
|
377
421
|
case 'sbom':
|
|
378
422
|
return runSbom(flags);
|
|
379
423
|
case 'scan':
|
package/package.json
CHANGED
package/src/acp/jsonrpc.js
CHANGED
|
@@ -33,6 +33,16 @@ export const 오류번호 = {
|
|
|
33
33
|
모르는방법: -32601,
|
|
34
34
|
잘못된인자: -32602,
|
|
35
35
|
안쪽오류: -32603,
|
|
36
|
+
/*
|
|
37
|
+
* 인증이 있어야 한다.
|
|
38
|
+
*
|
|
39
|
+
* 다른 번호와 달리 이건 JSON-RPC 가 아니라 **ACP 가 정한 번호**다
|
|
40
|
+
* (규격의 ErrorCode::AuthRequired). 에디터는 이 번호를 봐야 initialize
|
|
41
|
+
* 때 받아 둔 authMethods 를 꺼내 「인증」 단추를 그린다. 잘못된인자로
|
|
42
|
+
* 답하면 그냥 빨간 글씨가 뜨고, 사람은 이게 설정 문제인지 버그인지
|
|
43
|
+
* 모른다 — 할 수 있는 안내를 안 한 셈이다.
|
|
44
|
+
*/
|
|
45
|
+
인증필요: -32000,
|
|
36
46
|
};
|
|
37
47
|
|
|
38
48
|
/**
|
|
@@ -228,3 +238,16 @@ export function 잘못된인자오류(무엇) {
|
|
|
228
238
|
e.code = 오류번호.잘못된인자;
|
|
229
239
|
return e;
|
|
230
240
|
}
|
|
241
|
+
|
|
242
|
+
/**
|
|
243
|
+
* 아직 인증(연결 설정)이 안 됐다고 답하게 하는 오류.
|
|
244
|
+
*
|
|
245
|
+
* 글은 그대로 사람에게 보인다. 그러니 **무엇을 하면 되는지**까지 적는다 —
|
|
246
|
+
* 번호만 맞고 글이 「인증이 필요합니다」 면 어디서 무엇을 해야 하는지 여전히
|
|
247
|
+
* 모른다.
|
|
248
|
+
*/
|
|
249
|
+
export function 인증필요오류(무엇) {
|
|
250
|
+
const e = new Error(무엇);
|
|
251
|
+
e.code = 오류번호.인증필요;
|
|
252
|
+
return e;
|
|
253
|
+
}
|
package/src/acp/serve.js
CHANGED
|
@@ -54,7 +54,7 @@ import { 못박기 } from '../agent/pins.js';
|
|
|
54
54
|
import { route } from '../agent/route.js';
|
|
55
55
|
import { ORDER as 모드순서, get as getWork, normalize as 모드정리 } from '../agent/modes.js';
|
|
56
56
|
import { 모두끝내기 as 일감모두끝내기 } from '../tools/jobs.js';
|
|
57
|
-
import { 연결, 줄나누기, 모르는방법오류,
|
|
57
|
+
import { 연결, 줄나누기, 모르는방법오류, 잘못된인자오류, 인증필요오류 } from './jsonrpc.js';
|
|
58
58
|
import { 도구시작, 도구끝남, 도구이름표, 도구갈래, 도구자리, 멈춘까닭, 프롬프트글, 되살린것 } from './map.js';
|
|
59
59
|
|
|
60
60
|
/** 우리가 말하는 규격 판. 정수 하나이고, 깨지는 변경에서만 올라간다. */
|
|
@@ -87,6 +87,35 @@ export async function acp(opts = {}) {
|
|
|
87
87
|
const 내보내기 = 표준출력잠그기();
|
|
88
88
|
const 로그 = (s) => { try { process.stderr.write(`[acp] ${s}\n`); } catch { /* 여기서 또 터지면 할 게 없다 */ } };
|
|
89
89
|
|
|
90
|
+
/*
|
|
91
|
+
* ── 우리가 어떻게 인증받는지 ────────────────────────────────────────────
|
|
92
|
+
*
|
|
93
|
+
* ACP 의 `initialize` 응답에는 authMethods 자리가 있다. 여기를 비워 두면
|
|
94
|
+
* 에디터는 「이 에이전트는 인증이 필요 없다」 로 읽는다. 그런데 deel 은
|
|
95
|
+
* 연결 정보가 없으면 아무 일도 못 한다.
|
|
96
|
+
*
|
|
97
|
+
* 그래서 처음 붙인 사람은 이렇게 됐다 — 에디터에서 deel 을 고르고, 대화를
|
|
98
|
+
* 열고, 「저장된 연결이 없습니다」 를 받는다. 화면만 봐서는 이게 인증
|
|
99
|
+
* 문제인지 버그인지 모른다.
|
|
100
|
+
*
|
|
101
|
+
* 규격에는 그 자리가 있다. **Terminal Auth** — 「터미널에서 이 인자로 나를
|
|
102
|
+
* 다시 띄우면 설정이 끝난다」 고 말하는 방법이다. 그리고 deel 은 그 명령이
|
|
103
|
+
* 이미 있다: `deel setup`. 없는 것을 만드는 게 아니라 **있는 것을 말하는**
|
|
104
|
+
* 일이었다.
|
|
105
|
+
*
|
|
106
|
+
* args 가 진짜 도는 명령인지는 검사가 지킨다(test/acp.test.js 의 5-11).
|
|
107
|
+
* 여기가 틀리면 에디터가 사람에게 없는 명령을 치라고 시킨다.
|
|
108
|
+
*/
|
|
109
|
+
const 인증방법들 = [
|
|
110
|
+
{
|
|
111
|
+
id: 'terminal-setup',
|
|
112
|
+
name: 'Run `deel setup` in a terminal',
|
|
113
|
+
description: '로컬 런타임(Ollama · LM Studio · llama.cpp)을 고르거나 게이트웨이 주소와 열쇠를 넣습니다.',
|
|
114
|
+
type: 'terminal',
|
|
115
|
+
args: ['setup'],
|
|
116
|
+
},
|
|
117
|
+
];
|
|
118
|
+
|
|
90
119
|
/** 세션 하나. 에디터의 탭 하나에 해당한다. */
|
|
91
120
|
const 방들 = new Map();
|
|
92
121
|
|
|
@@ -127,7 +156,16 @@ export async function acp(opts = {}) {
|
|
|
127
156
|
const cfg = load();
|
|
128
157
|
const prof = activeProfile(cfg);
|
|
129
158
|
if (!prof) {
|
|
130
|
-
|
|
159
|
+
/*
|
|
160
|
+
* 잘못된인자가 아니라 **인증필요**다.
|
|
161
|
+
*
|
|
162
|
+
* 사람이 인자를 잘못 준 것이 아니라 아직 설정을 안 한 것이다. 그 둘은
|
|
163
|
+
* 에디터에서 하는 일이 다르다 — 인증필요(-32000)를 받으면 위 initialize
|
|
164
|
+
* 에서 받아 둔 authMethods 를 꺼내 「터미널에서 설정하기」 를 띄우고,
|
|
165
|
+
* 잘못된인자면 그냥 빨간 글씨만 뜬다. 고칠 방법이 있는데 안 알려 주는
|
|
166
|
+
* 것이 제일 나쁘다.
|
|
167
|
+
*/
|
|
168
|
+
throw 인증필요오류('저장된 연결이 없습니다. 터미널에서 `deel setup` 을 먼저 실행하세요.');
|
|
131
169
|
}
|
|
132
170
|
|
|
133
171
|
/*
|
|
@@ -729,13 +767,32 @@ export async function acp(opts = {}) {
|
|
|
729
767
|
mcpCapabilities: { http: false, sse: false },
|
|
730
768
|
},
|
|
731
769
|
agentInfo: { name: 'deel', title: 'deel (로컬 모델 코딩 에이전트)', version: 판번호() },
|
|
732
|
-
authMethods:
|
|
770
|
+
authMethods: 인증방법들,
|
|
733
771
|
};
|
|
734
772
|
}
|
|
735
773
|
|
|
736
|
-
|
|
737
|
-
|
|
774
|
+
/*
|
|
775
|
+
* 에디터가 「인증」 을 눌렀다.
|
|
776
|
+
*
|
|
777
|
+
* 우리 인증은 터미널에서 도는 것이라(위 인증방법들 머리말), 여기서
|
|
778
|
+
* 우리가 할 일은 없다 — 에디터가 우리를 `deel setup` 으로 다시 띄우고,
|
|
779
|
+
* 사람이 거기서 마치고, 그 다음에 이 프로세스가 다시 연결된다.
|
|
780
|
+
*
|
|
781
|
+
* 그래도 **끝났는지는 확인해 준다.** 사람이 설정을 안 마치고 창을
|
|
782
|
+
* 닫았는데 여기서 성공이라고 답하면, 에디터는 인증이 끝난 줄 알고 대화를
|
|
783
|
+
* 열고, 그 다음 한마디에서야 같은 오류가 난다. 한 번 더 돌아가는 셈이다.
|
|
784
|
+
*/
|
|
785
|
+
case 'authenticate': {
|
|
786
|
+
const 골라온것 = String(인자?.methodId ?? '');
|
|
787
|
+
if (골라온것 && !인증방법들.some((m) => m.id === 골라온것)) {
|
|
788
|
+
throw 잘못된인자오류(`모르는 인증 방법입니다: ${골라온것}`);
|
|
789
|
+
}
|
|
790
|
+
if (!activeProfile(load())) {
|
|
791
|
+
throw 인증필요오류('아직 설정이 안 끝났습니다. 터미널에서 `deel setup` 을 마치고 다시 시도하세요.');
|
|
792
|
+
}
|
|
793
|
+
로그('설정이 확인됐습니다.');
|
|
738
794
|
return {};
|
|
795
|
+
}
|
|
739
796
|
|
|
740
797
|
case 'session/new': {
|
|
741
798
|
const 방 = await 방만들기(인자);
|