dsh-composer-plus 1.12.0 → 1.13.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.de.md +36 -13
- package/README.es.md +36 -13
- package/README.fr.md +36 -13
- package/README.hi.md +36 -13
- package/README.id.md +36 -13
- package/README.ja.md +36 -13
- package/README.ko.md +36 -13
- package/README.md +36 -13
- package/README.pt-BR.md +36 -13
- package/README.ru.md +36 -13
- package/README.tr.md +36 -13
- package/README.vi.md +36 -13
- package/README.zh.md +36 -13
- package/assets/features/changesPanel.webp +0 -0
- package/assets/features/copyMessageLink.webp +0 -0
- package/assets/features/markProjectRead.webp +0 -0
- package/assets/features/queueEdit.webp +0 -0
- package/client.js +917 -133
- package/index.js +439 -83
- package/package.json +7 -3
- package/tether/gateway/admin.html +47 -3
- package/tether/gateway/server.mjs +98 -28
package/README.ko.md
CHANGED
|
@@ -29,7 +29,7 @@ dsh plugin --profile web add dsh-composer-plus
|
|
|
29
29
|
|
|
30
30
|
그런 다음 dsh를 다시 시작하세요. (CLI는 데스크톱 프로필에 설치할 수 없습니다. 데스크톱 프로필은 앱이 관리합니다.)
|
|
31
31
|
|
|
32
|
-
> dsh의 pnpm은 게시된 지 24시간이 지나지 않은 버전을 건너뜁니다. 릴리스 직후에는 버전을 붙여서 설치하세요: `dsh-composer-plus@1.
|
|
32
|
+
> dsh의 pnpm은 게시된 지 24시간이 지나지 않은 버전을 건너뜁니다. 릴리스 직후에는 버전을 붙여서 설치하세요: `dsh-composer-plus@1.13.0`.
|
|
33
33
|
|
|
34
34
|
## 기능
|
|
35
35
|
|
|
@@ -37,10 +37,10 @@ dsh plugin --profile web add dsh-composer-plus
|
|
|
37
37
|
|
|
38
38
|
| 기능 | 사용 방법 | 스크린샷 |
|
|
39
39
|
|---|---|---|
|
|
40
|
-
| **변경 사항 패널** | <a id="feature-changespanel"></a>오른쪽 사이드바 → `+` → **변경 사항**. **커밋 안 됨**, **스테이징 안 됨**, **스테이징됨**, **브랜치** 중 하나를 고르면 변경된 파일이 `+/-` 개수와 함께 표시됩니다. 파일을 클릭하면 diff를 볼 수 있습니다. **마지막 턴**은 최근 턴에 대한 dsh 자체 검토 화면을 엽니다. | <a href="assets/features/changesPanel.webp"><img src="assets/features/changesPanel.webp" width="160" alt="스크린샷: 변경 사항 패널"></a> |
|
|
40
|
+
| **변경 사항 패널** | <a id="feature-changespanel"></a>오른쪽 사이드바 → `+` → **변경 사항**. **커밋 안 됨**, **스테이징 안 됨**, **스테이징됨**, **브랜치** 중 하나를 고르면 변경된 파일이 `+/-` 개수와 함께 표시됩니다. 파일을 클릭하면 diff를 볼 수 있습니다. **마지막 턴**은 최근 턴에 대한 dsh 자체 검토 화면을 엽니다. 브랜치 이름을 클릭하면(또는 **트리** 선택) 브랜치 트리를 볼 수 있습니다. 위쪽의 브랜치를 클릭하면 그 브랜치로 이동하고, 커밋을 클릭하면 그 파일과 diff를 볼 수 있습니다. **이 채팅**은 열린 채팅의 파일 도구(write, edit)가 모든 턴에서 쓴 파일만 보여 주고, 첫 메시지 이후의 전체 diff도 보여 줍니다. **␣** 버튼은 공백 변경을 숨깁니다(`git diff -w`). 들여쓰기나 줄 끝만 바뀐 줄은 표시되지 않습니다. | <a href="assets/features/changesPanel.webp"><img src="assets/features/changesPanel.webp" width="160" alt="스크린샷: 변경 사항 패널"></a> |
|
|
41
41
|
| **기능 아이디어** | <a id="feature-featureideas"></a>오른쪽 사이드바 → `+` → **기능 아이디어** → **기능 제안**. 채팅 자체의 모델이 채팅 프로젝트의 짧은 요약(최상위 파일, README와 매니페스트의 앞부분, 최근 커밋 15개)을 읽고 기능을 최대 8개 제안합니다. 제안은 dsh UI 언어로 된 카드 묶음으로 표시됩니다. 카드를 오른쪽으로 스와이프하면(또는 **✓** 클릭, `→` 누르기. 어느 방법이든 카드가 그쪽으로 날아갑니다) 같은 프로젝트에서 새 채팅이 시작됩니다. 새 채팅은 그 아이디어를 요청으로 삼아 계획 모드로 시작하므로, 계획을 승인하기 전에는 아무것도 바뀌지 않습니다. 계획을 건너뛰려면 **▶ 바로 구현**을 클릭하세요(또는 `↑` 누르기. 카드가 위로 날아갑니다). 새 채팅이 그 아이디어를 일반 요청으로 삼아 바로 시작하고, 모델이 변경을 적용한 뒤 검사를 실행합니다(승인은 평소대로 적용됩니다). 건너뛰려면 왼쪽으로 스와이프하세요(또는 **✕**, `←`). **실행 취소**(또는 `Z`)는 건너뛴 카드를 되돌립니다. 좋은 아이디어를 나중을 위해 저장하려면 **↓**를 클릭하세요(또는 `↓` 누르기). 아이디어는 프로젝트의 **나중에** 목록에 들어갑니다. 같은 프로젝트 폴더의 모든 채팅에서 이 목록이 보입니다(재시작 후에도). **나중에(N)** 버튼은 목록을 엽니다. **계획하기**는 그 아이디어로 같은 계획 모드 채팅을 시작하고, **바로 구현**은 계획 없는 채팅을 시작합니다. 둘 다 아이디어를 목록에서 뺍니다. **모두 함께 계획 (N)** 버튼은 목록의 모든 아이디어로 계획 모드 채팅 하나를 시작하므로, 공통 부분은 한 번만 계획됩니다. **목록에서 제거**는 아이디어를 삭제합니다. **체크리스트로 복사**는 목록 전체를 Markdown 체크리스트(`- [ ] Title — Summary`, 아이디어마다 한 줄)로 클립보드에 복사합니다. 이슈 트래커나 TODO 파일에 쓸 수 있으며, 네트워크 요청은 하지 않습니다. **아이디어 더 받기**는 카드를 추가합니다. 한 분야에 대한 아이디어만 받으려면 **기능 제안** 옆 입력란에 짧은 **집중 주제**를 입력하거나(최대 80자, `Enter`로도 제안합니다), 그 아래의 고정 주제 **성능**, **접근성**, **테스트**, **보안**, **사용성**, **문서** 중 하나를 클릭하세요(다시 클릭하면 지워집니다). 그러면 모델은 그 주제에 관한 기능만 제안합니다. 입력란이 비어 있으면 어떤 기능이든 제안합니다. 한 프로젝트에서 같은 아이디어는 두 번 제안되지 않습니다. 제안된 모든 아이디어(건너뛴 것, 저장한 것, 시작한 것)는 프로젝트의 **기록**에 들어갑니다. 모델에는 그 아이디어를 다시 제안하지 말라는 지시가 전달되고, 제목이 반복된 아이디어는 버려집니다. **기록**은 아이디어를 **시작됨** 또는 **제안됨**으로 표시해 보여 줍니다. **잊기**(또는 **모두 잊기**)를 누르면 그 아이디어가 다시 나올 수 있지만, 아직 **나중에** 목록에 있는 아이디어는 그 목록에서 제거할 때까지 제안에 나오지 않습니다. 모델은 클릭할 때만 실행됩니다. | <a href="assets/features/featureIdeas.webp"><img src="assets/features/featureIdeas.webp" width="160" alt="스크린샷: 기능 아이디어"></a> |
|
|
42
42
|
| **내용 검색** | <a id="feature-contentsearch"></a>dsh 자체 사이드바 검색(**작업 공간** 옆의 돋보기. 데스크톱 앱에서는 `Cmd+K`, 브라우저에서는 `Cmd+Alt+K`)이 제목뿐 아니라 내 메시지와 답변 속 단어로도 채팅을 찾고, 일치하는 텍스트를 채팅 아래에 보여 줍니다. 이 검색은 dsh에 이미 있지만 꺼진 상태로 제공됩니다. 이 기능은 컴퓨터에 검색 색인 파일을 두고 그 검색을 켭니다. 색인은 dsh 시작 후 첫 검색 때 만들어지며(채팅 250개에 약 15초, 제한 사항 참고) 다음 시작 때도 그대로 쓰입니다. 기본적으로 켜져 있습니다. 변경 사항은 dsh를 다시 시작한 뒤 적용됩니다. | <a href="assets/features/contentSearch.webp"><img src="assets/features/contentSearch.webp" width="160" alt="스크린샷: 내용 검색"></a> |
|
|
43
|
-
| **턴 되돌리기** | <a id="feature-turnrollback"></a>내 메시지 위에 포인터를 올리고 **↶** 버튼(복사 옆)을 클릭하세요. **채팅만**은 그 메시지와 이후의 모든 내용(답변, 도구 호출)을 채팅과 모델 컨텍스트에서 빼고, 메시지를 입력란에 다시 넣습니다. 메시지를 고친 뒤 다시 보내세요. **채팅과 파일**은 먼저 그 메시지 이후 바뀐 프로젝트 파일 목록을 보여 주고, 그 파일도 이전 상태로 되돌립니다. dsh 편집 도구가 바꾼 내용뿐 아니라 명령(`bash`)이 바꾼 내용도 되돌립니다. 실행 중인 턴은 먼저 멈춥니다. 채팅 로그는 다시 쓰지 않습니다. 숨겨진 표시 하나가 철회된 부분을 가립니다. dsh 자체의 `/compact`가 오래된 메시지를 가리는 방식과 같습니다. [dsh-rewind-plugin](https://www.npmjs.com/package/dsh-rewind-plugin)이 설치되어 있으면 이 일은 그 플러그인이 맡고, Composer Plus는 두 번째 버튼을 보여 주지 않습니다. | <a href="assets/features/turnRollback.webp"><img src="assets/features/turnRollback.webp" width="160" alt="스크린샷: 턴 되돌리기"></a> |
|
|
43
|
+
| **턴 되돌리기** | <a id="feature-turnrollback"></a>내 메시지 위에 포인터를 올리고 **↶** 버튼(복사 옆)을 클릭하세요. **채팅만**은 그 메시지와 이후의 모든 내용(답변, 도구 호출)을 채팅과 모델 컨텍스트에서 빼고, 메시지를 입력란에 다시 넣습니다. 메시지를 고친 뒤 다시 보내세요. **채팅과 파일**은 먼저 그 메시지 이후 바뀐 프로젝트 파일 목록을 보여 주고, 그 파일도 이전 상태로 되돌립니다. dsh 편집 도구가 바꾼 내용뿐 아니라 명령(`bash`)이 바꾼 내용도 되돌립니다. 실행 중인 턴은 먼저 멈춥니다. 채팅 로그는 다시 쓰지 않습니다. 숨겨진 표시 하나가 철회된 부분을 가립니다. dsh 자체의 `/compact`가 오래된 메시지를 가리는 방식과 같습니다. [dsh-rewind-plugin](https://www.npmjs.com/package/dsh-rewind-plugin)이 설치되어 있으면 이 일은 그 플러그인이 맡고, Composer Plus는 두 번째 버튼을 보여 주지 않습니다. 되돌린 뒤에는 입력란 위에 **다시 실행** 표시줄이 나타납니다. 이 표시줄은 되돌리기 직전 시점부터 새 채팅을 시작하고(같은 메시지와 컨텍스트), **채팅과 파일**을 고르면 파일도 다시 가져옵니다. 되돌린 뒤에 내가 바꾼 파일은 목록에 표시되고 그대로 유지됩니다. 단, 덮어쓰기 확인란을 선택하면 그 파일도 덮어씁니다. | <a href="assets/features/turnRollback.webp"><img src="assets/features/turnRollback.webp" width="160" alt="스크린샷: 턴 되돌리기"></a> |
|
|
44
44
|
| **채팅 삭제** | <a id="feature-deletechat"></a>사이드바 → 채팅의 **…** 메뉴(또는 마우스 오른쪽 클릭) → **삭제…** → **삭제**. dsh 자체는 보관만 할 수 있습니다. 채팅은 멈추고(dsh 자체 보관처럼 턴, 작업, 하위 에이전트, 예약도 멈춤), 저장된 기록은 하위 에이전트 채팅과 함께 macOS 휴지통으로 이동합니다(다른 시스템에서는 `$DSH_HOME/trash`). 되살리려면 폴더를 원래 위치에 다시 넣고 dsh를 다시 시작하세요. 채팅은 사이드바의 **보관된 항목만** 보기에 나타납니다. | <a href="assets/features/deleteChat.webp"><img src="assets/features/deleteChat.webp" width="160" alt="스크린샷: 채팅 삭제"></a> |
|
|
45
45
|
| **입력창에 프로젝트 이름** | <a id="feature-projectname"></a>입력란 아래 줄(턴, 토큰, 캐시 적중, 컨텍스트)이 채팅의 프로젝트 이름으로 시작합니다. 그래서 채팅이 어느 프로젝트에서 작업하는지 항상 알 수 있습니다. 이 이름은 dsh 자체의 프로젝트 제목이며, 프로젝트에 제목이 없으면 폴더 이름입니다. 포인터를 올리면 전체 폴더 경로가 보입니다. 클릭하면 사이드바에서 그 채팅을 찾아 줍니다(목록 보기와 프로젝트 보기 모두 해당). 사이드바와 프로젝트가 열리고(접힌 프로젝트와 그 **세션 N개 더 보기**도 열립니다), 목록이 채팅까지 스크롤되며, 채팅이 5초 동안 깜박입니다. | <a href="assets/features/projectName.webp"><img src="assets/features/projectName.webp" width="160" alt="스크린샷: 입력창에 프로젝트 이름"></a> |
|
|
46
46
|
| **입력 기록** | <a id="feature-inputhistory"></a>빈 입력란에서 `↑` / `↓`를 누르면 터미널처럼 보낸 메시지를 차례로 불러옵니다. | <a href="assets/features/inputHistory.webp"><img src="assets/features/inputHistory.webp" width="160" alt="스크린샷: 입력 기록"></a> |
|
|
@@ -49,22 +49,25 @@ dsh plugin --profile web add dsh-composer-plus
|
|
|
49
49
|
| **원클릭 계속** | <a id="feature-continuebutton"></a>턴이 중지되거나, 실패하거나, 중간에 끊긴 뒤에는 빈 입력란에 **▶**가 표시됩니다. 한 번 클릭하면 입력란에 아무것도 쓰지 않고, 보이는 채팅 메시지도 추가하지 않은 채 기존 대화를 이어 갑니다(모델은 “멈춘 곳에서 계속하라”는 짧은 숨은 메모를 받습니다. Claude 같은 일부 제공자는 어시스턴트 답변으로 끝나는 요청을 거부하기 때문입니다). 대기열의 메시지는 그대로 남습니다. ▶는 중지된 작업만 이어 가고, 그다음에 대기열이 실행됩니다. 완료된 턴 뒤에는 일반 보내기 버튼이 그대로 있습니다. | <a href="assets/features/continueButton.webp"><img src="assets/features/continueButton.webp" width="160" alt="스크린샷: 원클릭 계속"></a> |
|
|
50
50
|
| **재시작 후 이어서 실행** | <a id="feature-resumeafterrestart"></a>기본적으로 꺼져 있습니다. **설정 → Composer Plus**에서 켜세요. 채팅이 작업하는 중에 dsh를 종료하면(또는 dsh가 닫히면), dsh를 다시 열 때 그 채팅이 자동으로 이어집니다. 이때 원클릭 계속과 같은 숨은 메모를 씁니다. 목표 라운드(`/goal`)가 실행 중이었다면 목표는 다음 라운드로 계속됩니다(dsh는 시작할 때마다 목표를 일시 중지하고, 사용자가 재개할 때까지 기다립니다). 직접 중지한 채팅, 완료된 채팅, 실패한 채팅은 이어지지 않습니다. dsh 자체에는 이 설정이 없습니다. dsh는 이런 턴을 중단됨으로 표시할 뿐입니다. | <a href="assets/features/resumeAfterRestart.webp"><img src="assets/features/resumeAfterRestart.webp" width="160" alt="스크린샷: 재시작 후 이어서 실행"></a> |
|
|
51
51
|
| **대기열 끌어서 놓기** | <a id="feature-queuereorder"></a>대기 중인 메시지에 핸들(⠿)이 생깁니다. 끌어서 순서를 바꾸거나, 핸들에 포커스를 두고 `↑` / `↓`를 누르세요. `Esc`는 이동을 취소합니다. | <a href="assets/features/queueReorder.webp"><img src="assets/features/queueReorder.webp" width="160" alt="스크린샷: 대기열 끌어서 놓기"></a> |
|
|
52
|
+
| **대기 중인 메시지 제자리 편집** | <a id="feature-queueedit"></a>대기 중인 메시지를 더블클릭하세요. 메시지가 dsh 자체 편집 상자로 바뀝니다. 텍스트를 고친 뒤 `Enter`를 눌러 저장하거나 `Esc`를 눌러 취소하세요. 메시지는 대기열에서 자기 자리를 유지합니다. 이미지나 파일이 있는 메시지는 이 방법으로 편집할 수 없습니다(dsh 대기열은 텍스트만 편집합니다). | <a href="assets/features/queueEdit.webp"><img src="assets/features/queueEdit.webp" width="160" alt="스크린샷: 대기 중인 메시지 제자리 편집"></a> |
|
|
52
53
|
| **세션 링크 복사** | <a id="feature-copydeeplink"></a>사이드바에서 채팅을 마우스 오른쪽 버튼으로 클릭 → **세션 링크 복사**. `dsh-session:…` 링크를 다른 채팅에 붙여 넣으면 그 채팅이 읽기 전용 컨텍스트로 첨부됩니다. dsh 0.2.1에는 자체 **세션 ID 복사**가 있지만, 이 메뉴는 ID만 복사합니다. 이 항목은 그 바로 다음에 표시됩니다. | <a href="assets/features/copyDeeplink.webp"><img src="assets/features/copyDeeplink.webp" width="160" alt="스크린샷: 세션 링크 복사"></a> |
|
|
54
|
+
| **메시지 링크 복사** | <a id="feature-copymessagelink"></a>메시지 위에 포인터를 올리고 **🔗**를 클릭하세요(메시지의 작업 줄에 있고, 답변에서는 시간 옆에 있습니다). 링크는 세션 링크 뒤에 메시지 번호를 붙인 것입니다: `dsh-session:…#42`. 이 링크를 메시지에 붙여 넣고 보내세요. dsh 0.2.1 이상에서는 링크가 칩으로 표시됩니다. 칩을 클릭하면 그 채팅이 열리고, 메시지로 스크롤한 뒤 2초 동안 강조 표시합니다. 세션 링크처럼 그 채팅을 읽기 전용 컨텍스트로도 첨부합니다. | <a href="assets/features/copyMessageLink.webp"><img src="assets/features/copyMessageLink.webp" width="160" alt="스크린샷: 메시지 링크 복사"></a> |
|
|
53
55
|
| **채팅을 Markdown으로 내보내기** | <a id="feature-exportmarkdown"></a>사이드바에서 채팅을 마우스 오른쪽 버튼으로 클릭(또는 채팅의 **…** 메뉴 열기) → **Markdown으로 내보내기…**. 대화 상자에 채팅의 메시지 수가 표시됩니다. **클립보드에 복사**는 채팅을 Markdown으로 복사하고, **.md 파일 저장**은 브라우저 다운로드로 `<chat title>.md` 파일을 저장합니다(dsh 데스크톱: 시스템 설정에 따라 다운로드 폴더에 저장되거나 저장 대화 상자가 열립니다). 파일에는 채팅 제목, 프로젝트 이름, 날짜가 들어가고, 그 뒤에 메시지마다 `## 나` 또는 `## 어시스턴트` 섹션이 하나씩 이어집니다. 코드 블록은 그대로 유지됩니다. 메시지가 닫지 않은 코드 블록은 닫힙니다. | <a href="assets/features/exportMarkdown.webp"><img src="assets/features/exportMarkdown.webp" width="160" alt="스크린샷: 채팅을 Markdown으로 내보내기"></a> |
|
|
54
56
|
| **프로젝트 경로 복사** | <a id="feature-copyprojectpath"></a>사이드바에서 프로젝트를 마우스 오른쪽 버튼으로 클릭 → **경로 복사**를 선택하면 폴더의 전체 경로가 복사됩니다. | <a href="assets/features/copyProjectPath.webp"><img src="assets/features/copyProjectPath.webp" width="160" alt="스크린샷: 프로젝트 경로 복사"></a> |
|
|
55
57
|
| **새 채팅의 프로젝트 검색** | <a id="feature-projectpicker"></a>새 채팅 → 입력란 위의 프로젝트 버튼. 프로젝트가 A–Z 순서로 표시되고, 맨 위에 **프로젝트 검색** 상자가 있습니다. 이름의 일부를 입력하고(대소문자와 악센트 구분 없음) `Enter`를 누르면 첫 번째로 일치하는 프로젝트가 선택됩니다. 일치하는 것이 없으면 **일치하는 프로젝트 없음**이 표시됩니다. 사이드바에 저장된 dsh의 프로젝트 순서는 바뀌지 않습니다. | <a href="assets/features/projectPicker.webp"><img src="assets/features/projectPicker.webp" width="160" alt="스크린샷: 새 채팅의 프로젝트 검색"></a> |
|
|
56
58
|
| **다음 메시지 예측** | <a id="feature-nextprediction"></a>기본적으로 켜져 있습니다. **설정 → Composer Plus**에서 끌 수 있습니다. 에이전트가 턴을 마치면(중지되거나 실패한 턴 제외) 빈 입력란에 다음 메시지의 예측이 회색으로 표시되고, **Tab으로 수락** 힌트가 함께 나옵니다. `Tab`을 누르면 텍스트가 입력란에 들어가지만 보내지는 않습니다. `Esc`를 누르면 그 턴 동안 예측이 숨겨집니다. 입력을 시작해도 숨겨지고, 새 턴이 오면 새 예측으로 바뀝니다. 스위치 아래의 **모델** 메뉴에는 dsh 자체의 모델 목록이 나옵니다(dsh 모델 메뉴와 같은 목록). 기본으로 **dsh 기본값**이 선택되어 있으며, dsh의 기본 모델을 따릅니다. 턴이 끝날 때마다 짧은 모델 호출이 한 번 일어납니다. Tether에서는 예측이 빈 입력란 위에 표시됩니다. 탭하면 입력란에 들어갑니다. | <a href="assets/features/nextPrediction.webp"><img src="assets/features/nextPrediction.webp" width="160" alt="스크린샷: 다음 메시지 예측"></a> |
|
|
57
59
|
| **입력 중 자동 완성** | <a id="feature-typingcompletion"></a>기본적으로 꺼져 있습니다. **설정 → Composer Plus**에서 켤 수 있습니다. 입력하는 동안 커서 바로 뒤의 회색 텍스트가 메시지가 이어질 수 있는 내용을 보여 줍니다. `Tab`을 누르면 메시지에 추가되지만 보내지는 않습니다. `Esc`를 누르면 숨겨집니다. 사용자가 직접 이어서 쓸 말만 제안합니다. 사용자에게 하는 답변이나 지어낸 오류 문구, 이름은 제안하지 않습니다. 메시지가 끝난 것처럼 보이거나 모델이 확신하지 못하면 아무것도 표시되지 않습니다. 회색 텍스트의 다음 글자를 그대로 입력하면 텍스트가 유지되고, 새 모델 호출은 없습니다. 스위치 아래에 이 기능 전용 **모델** 메뉴가 있습니다. 첫 항목인 **다음 메시지 예측과 같음**은 **다음 메시지 예측**의 모델을 사용합니다(기본값). 기능마다 다른 모델을 쓰려면 다른 모델을 고르세요. 예를 들어 자동 완성에는 더 빠른 모델을 고를 수 있습니다. 입력을 멈출 때마다 모델을 한 번 호출하므로 예측보다 토큰을 훨씬 많이 사용합니다. 빠르고 비용이 낮은 모델을 고르세요. 슬래시 명령, 파일 칩이 있는 메시지, 커서가 끝에 있지 않을 때는 실행되지 않습니다. Tether에서는 입력하는 동안 나머지 텍스트가 입력란 위에 표시됩니다. 탭하면 추가됩니다. | <a href="assets/features/typingCompletion.webp"><img src="assets/features/typingCompletion.webp" width="160" alt="스크린샷: 입력 중 자동 완성"></a> |
|
|
58
60
|
| **프롬프트 개선** | <a id="feature-promptimprove"></a>대략적인 요청을 입력한 뒤 모델 메뉴 옆의 요술봉(**프롬프트 개선**)을 클릭하세요. 모델 호출 한 번으로 요청을 더 명확한 프롬프트로 다시 씁니다. 목표를 먼저 쓰고, 여러 부분이 있으면 짧은 번호 단계로 나누고, 실행할 검사를 적습니다. 이 채팅(되돌린 메시지 제외), 프로젝트의 README, AGENTS.md, 매니페스트, 변경된 파일, 이름이 입력한 단어와 일치하는 파일을 읽고, 사용 언어를 유지합니다. 파일 이름을 지어내지 않습니다. 새 텍스트가 초안을 대신하지만 보내지는 않습니다. 읽고 고친 뒤 `Enter`를 누르세요. `Cmd/Ctrl+Z`를 누르면 한 번에 원래 텍스트로 돌아오며, 버튼(**개선 실행 취소**)도 같습니다. 작업 중에 입력하면 새로 입력한 텍스트가 유지됩니다. `Esc`를 누르거나 한 번 더 클릭하면 취소됩니다. 설정에 전용 **모델** 메뉴가 있습니다(기본값: **채팅의 모델과 같음**). 슬래시 명령이나 파일 칩이 있는 메시지에는 쓸 수 없습니다. Tether에서는 요술봉이 입력란 옆에 있습니다. | <a href="assets/features/promptImprove.webp"><img src="assets/features/promptImprove.webp" width="160" alt="스크린샷: 프롬프트 개선"></a> |
|
|
59
|
-
| **이 채팅에서 허용** | <a id="feature-allowforchat"></a>자동 검토가 확인을 요청하면 승인 카드에 **이 채팅에서 허용**이 추가됩니다. 이후 같은 채팅의 같은 도구는 인수와 관계없이
|
|
61
|
+
| **이 채팅에서 허용** | <a id="feature-allowforchat"></a>자동 검토가 확인을 요청하면 승인 카드에 **이 채팅에서 허용**이 추가됩니다. 이후 같은 채팅의 같은 도구는 인수와 관계없이 시간 제한이 끝날 때까지 허용됩니다(기본값 1시간. **설정 → Composer Plus → 이 채팅에서 허용**에서 고릅니다). 그 후에는 에이전트가 다시 묻습니다. 헤더 칩에서 허용 목록과 종료 시각을 보고 취소할 수 있습니다. 허용은 재시작 후에도 유지됩니다. | <a href="assets/features/allowForChat.webp"><img src="assets/features/allowForChat.webp" width="160" alt="스크린샷: 이 채팅에서 허용"></a> |
|
|
60
62
|
| **프로젝트 상태** | <a id="feature-projectstatus"></a>사이드바의 프로젝트 행에 그 채팅과 같은 실행 중 / 대기 중 / 완료 표시가 나타납니다. 그래서 접힌 프로젝트도 안의 채팅이 작업 중인지, 사용자의 조치가 필요한지 알려 줍니다. 사용자의 조치를 기다리는 채팅이 먼저 표시되고, 그다음 아직 열지 않은 완료된 채팅(초록색 점, 다른 채팅이 아직 실행 중일 때도 표시), 마지막으로 실행 중 표시가 나타납니다. 포인터를 올리면 자세한 내용이 보입니다. | <a href="assets/features/projectStatus.webp"><img src="assets/features/projectStatus.webp" width="160" alt="스크린샷: 프로젝트 상태"></a> |
|
|
63
|
+
| **모두 읽음으로 표시** | <a id="feature-markprojectread"></a>사이드바에서 프로젝트의 **…** 버튼 → **모두 읽음으로 표시**를 클릭하세요. 그 프로젝트의 모든 채팅에서 초록색 읽지 않음 점이 한 번에 사라집니다. 다른 프로젝트의 점은 그대로 남습니다. 프로젝트에 읽지 않은 채팅이 없으면 이 항목은 회색으로 표시됩니다(**읽지 않은 채팅 없음**). | <a href="assets/features/markProjectRead.webp"><img src="assets/features/markProjectRead.webp" width="160" alt="스크린샷: 모두 읽음으로 표시"></a> |
|
|
61
64
|
| **활성 프로젝트 우선** | <a id="feature-activeprojectsfirst"></a>채팅이 실행을 시작하거나 사용자의 조치가 필요해지면, 그 프로젝트가 dsh 자체 행 애니메이션으로 사이드바 맨 위로 이동합니다(직접 끌어 올릴 때와 같은 움직임). 완료된 프로젝트는 제자리에 남으며, 평소처럼 원하는 곳으로 끌어 옮길 수 있습니다. 이동은 dsh의 프로젝트 순서에 저장되므로, 이 기능을 꺼도 현재 순서가 유지됩니다. | <a href="assets/features/projectStatus.webp"><img src="assets/features/projectStatus.webp" width="160" alt="스크린샷: 활성 프로젝트 우선"></a> |
|
|
62
65
|
| **최근 프로젝트 필터** | <a id="feature-recentprojects"></a>사이드바 → 보기 옵션(슬라이더 아이콘) → **최근 2시간 내 활성**. 이 옵션을 선택하면 사이드바에는 최근 2시간 안에 활성 채팅이 있었던 프로젝트만 표시됩니다. 활성 채팅은 그 시간 안에 업데이트된 채팅, 실행 중이거나 대기 중인 채팅, 열려 있는 채팅, 아직 열지 않은 완료된 채팅(dsh의 초록색 “완료” 점)입니다. 마지막 경우는 2시간이 지나도 해당됩니다. 이런 채팅이 없는 프로젝트는 숨겨지며, 새 프로젝트와 빈 프로젝트도 숨겨집니다. 모든 프로젝트를 다시 보려면 옵션을 다시 선택하세요. 선택은 이 기기에 저장됩니다. | <a href="assets/features/recentProjects.webp"><img src="assets/features/recentProjects.webp" width="160" alt="스크린샷: 최근 프로젝트 필터"></a> |
|
|
63
66
|
| **모든 프로젝트 접기** | <a id="feature-collapseprojects"></a>사이드바에 열린 프로젝트가 있으면 보기 옵션(슬라이더 아이콘) 옆에 버튼이 나타납니다. 클릭하면 열린 프로젝트를 한 번에 모두 닫습니다. 예를 들어 프로젝트 5개 중 열린 3개를 한 번에 닫습니다. 열린 프로젝트가 없으면 버튼이 다시 숨겨집니다. | <a href="assets/features/collapseProjects.webp"><img src="assets/features/collapseProjects.webp" width="160" alt="스크린샷: 모든 프로젝트 접기"></a> |
|
|
64
67
|
| **상태별 정렬** | <a id="feature-statusorder"></a>사이드바 → 보기 옵션 → **정렬 기준** → **상태별**(**하나의 목록**과 함께 사용). 완료된 채팅이 먼저 옵니다(dsh의 “완료” 점. 오류로 끝난 턴에도 이 점이 붙습니다). 그다음 실행 중이거나 대기 중인 채팅, 활성 자동화(예약)가 있는 채팅, 나머지 채팅이 dsh 순서대로 옵니다. 완료된 채팅을 열면 아래로 이동합니다. 보기만 바뀝니다. 원래대로 돌아가려면 **수동** 또는 **마지막 업데이트**를 선택하세요. | <a href="assets/features/statusOrder.webp"><img src="assets/features/statusOrder.webp" width="160" alt="스크린샷: 상태별 정렬"></a> |
|
|
65
68
|
| **백그라운드 알림** | <a id="feature-notifications"></a>dsh가 백그라운드에 있을 때 턴이 끝나면(답변의 첫 줄과 함께) 알림을 받습니다. 채팅이 정말로 사용자를 기다릴 때도 알림을 받습니다. 기다리는 이유는 승인(도구 이름), 답변(질문), 계획 검토입니다. 요청이 1.5초 뒤에도 열려 있어야 알림이 갑니다. 그래서 자동으로 처리된 승인(자동 검토 허용, 다른 플러그인)은 알림을 보내지 않습니다. 요청에 답하면 알림도 바로 사라집니다. Dock/작업 표시줄 배지는 기다리는 채팅 수를 보여 줍니다. 알림을 클릭하면 그 채팅이 열립니다. | <a href="assets/features/notifications.webp"><img src="assets/features/notifications.webp" width="160" alt="스크린샷: 백그라운드 알림"></a> |
|
|
66
69
|
| **애플리케이션 언어** | <a id="feature-language"></a>설정 → Composer Plus → **애플리케이션 언어**에서 dsh 인터페이스 전체를 Türkçe, Español, Português (Brasil), Français, Deutsch, Русский, 日本語, 한국어, Bahasa Indonesia, Tiếng Việt, हिन्दी 중 하나로 바꿉니다(아래 참고). | <a href="assets/features/language.webp"><img src="assets/features/language.webp" width="160" alt="스크린샷: 애플리케이션 언어"></a> |
|
|
67
|
-
| **모바일 연결(iPhone)** | <a id="feature-mobileconnect"></a>[Tether](tether/) 앱으로 iPhone에서 dsh를 사용하세요. 같은 Wi-Fi나 [Tailscale](https://tailscale.com)을 통해 연결합니다. **설정 → Composer Plus**에서 켜세요(이 Mac에서 네트워크 포트를 열기 때문에 기본적으로 꺼져 있습니다). 그다음 사이드바 왼쪽 아래의 **모바일 연결**을 클릭하세요. iPhone 카메라(**Open in Tether**를 탭)나 Tether의 **Scan code**로 QR 코드를 스캔하고, **Connect**를 탭한 뒤 **Approve**를 클릭하세요. 먼저 Tether를 설치하세요. Tether가 없으면 카메라가 이 코드를 열 수 없습니다. 휴대폰에서 채팅을 보고, 메시지를 보내고, 승인과 질문에 답하고, 모델과 에이전트를 바꿀 수 있습니다. Mac은 원하는 만큼 페어링할 수 있으며, 앱 왼쪽 위의 Mac 이름으로 Mac을 전환합니다. | <a href="assets/features/mobileConnect.webp"><img src="assets/features/mobileConnect.webp" width="160" alt="스크린샷: 모바일 연결(iPhone)"></a> |
|
|
70
|
+
| **모바일 연결(iPhone)** | <a id="feature-mobileconnect"></a>[Tether](tether/) 앱으로 iPhone에서 dsh를 사용하세요. 같은 Wi-Fi나 [Tailscale](https://tailscale.com)을 통해 연결합니다. **설정 → Composer Plus**에서 켜세요(이 Mac에서 네트워크 포트를 열기 때문에 기본적으로 꺼져 있습니다). 그다음 사이드바 왼쪽 아래의 **모바일 연결**을 클릭하세요. iPhone 카메라(**Open in Tether**를 탭)나 Tether의 **Scan code**로 QR 코드를 스캔하고, **Connect**를 탭한 뒤 **Approve**를 클릭하세요. 먼저 Tether를 설치하세요. Tether가 없으면 카메라가 이 코드를 열 수 없습니다. 휴대폰에서 채팅을 보고, 메시지를 보내고, 승인과 질문에 답하고, 모델과 에이전트를 바꿀 수 있습니다. Mac은 원하는 만큼 페어링할 수 있으며, 앱 왼쪽 위의 Mac 이름으로 Mac을 전환합니다. **모바일 연결** 패널에는 페어링된 iPhone이 마지막 연결 시각과 함께 표시되며, **Remove**를 누르면 그 iPhone의 연결이 즉시 끊깁니다. “Tailscale only”는 로컬 네트워크의 연결을 거부하고(공유 Wi-Fi용), 액세스 로그는 누가 연결을 시도했는지 보여 줍니다. Tether에서는 “Settings → Privacy”에서 Face ID로 앱을 잠급니다. | <a href="assets/features/mobileConnect.webp"><img src="assets/features/mobileConnect.webp" width="160" alt="스크린샷: 모바일 연결(iPhone)"></a> |
|
|
68
71
|
| **자동 업데이트** | <a id="feature-autoupdate"></a>dsh가 시작되면 플러그인이 [최신 GitHub 릴리스](https://github.com/furkancak1r/dsh-composer-plus/releases/latest)를 확인합니다. 더 새로운 버전이고 npm에도 올라와 있으면, dsh 자체 플러그인 관리자(설정 → 플러그인과 같은 경로)로 정확히 그 버전을 설치하고 알려 줍니다. 새 버전을 로드하려면 dsh를 다시 시작하세요. **설정 → Composer Plus → Composer Plus 업데이트**에서 버전을 볼 수 있고, **업데이트 확인** / **지금 업데이트** 버튼도 있습니다. 새 버전으로 dsh를 처음 시작하면 **Composer Plus N의 새로운 기능** 창이 그 버전의 릴리스 노트를 한 번 보여 줍니다(같은 업데이트 확인에서 받은 내용이며 추가 네트워크 호출은 없습니다). **닫기** 또는 `Esc`로 닫습니다. | <a href="assets/features/autoUpdate.webp"><img src="assets/features/autoUpdate.webp" width="160" alt="스크린샷: 자동 업데이트"></a> |
|
|
69
72
|
|
|
70
73
|
<!-- END GENERATED FEATURES -->
|
|
@@ -119,15 +122,15 @@ dsh `0.2.0-rc.2`(데스크톱과 웹)와 `0.2.1-rc.2`(웹)에서 테스트했습
|
|
|
119
122
|
- **계속:** 인증된 로컬 엔드포인트는 마지막으로 중단된 턴만 재개합니다. 오래되었거나 중복된 요청은 거부하고, 기존 승인 훅은 그대로 유지합니다. 새 사용자 메시지는 보내지 않습니다.
|
|
120
123
|
- **재시작 후 이어서 실행:** 켜기 전까지 꺼져 있습니다. Host 쪽은 채팅 ID와 시작 시각만 `$DSH_HOME/storages/dsh-composer-plus/resume.json`(소유자 전용 권한)에 보관합니다. 아무것도 컴퓨터 밖으로 나가지 않습니다. 마지막 턴을 사용자가 아니라 dsh가 멈췄다고 dsh 자체 로그에 기록된 경우에만 채팅을 이어 갑니다. 이어지는 턴에도 승인과 자동 검토가 평소대로 적용됩니다.
|
|
121
124
|
|
|
122
|
-
- **변경 사항 패널:** git은 dsh의 인증된 `/api` 채널을 거쳐, 내 컴퓨터의 채팅 폴더 안에서 읽기 전용으로 실행됩니다. 커밋, 스테이징, fetch는 절대 하지 않으며, git 자체가 나열한 경로만 보여 줍니다.
|
|
125
|
+
- **변경 사항 패널:** git은 dsh의 인증된 `/api` 채널을 거쳐, 내 컴퓨터의 채팅 폴더 안에서 읽기 전용으로 실행됩니다. 커밋, 스테이징, fetch는 절대 하지 않으며, git 자체가 나열한 경로만 보여 줍니다. 트리는 로컬 및 원격 브랜치의 최신 커밋 300개를 보여 주며, 브랜치를 전환(checkout)하지 않습니다. commit-graph 파일이 없는 매우 큰 저장소에서는 트리가 열리는 데 몇 초가 걸릴 수 있습니다. **이 채팅**은 채팅 자체의 로그에서 파일 도구가 쓴 파일을 찾고, 곧바로 삭제되는 임시 폴더에서 그 파일을 채팅의 턴 되돌리기 스냅샷과 비교합니다. 내 저장소나 스냅샷 저장소에는 아무것도 쓰지 않습니다.
|
|
123
126
|
- **기능 아이디어:** **기능 제안**을 클릭하기 전에는 아무것도 실행되지 않습니다. 클릭하면 Host 쪽이 채팅 자체의 폴더만 읽습니다(브라우저는 경로를 보내지 않습니다). 읽는 내용은 최상위 항목 이름, README·AGENTS.md·매니페스트(`package.json`, `pyproject.toml`, `Cargo.toml`, `go.mod`, …)의 처음 6 kB, `git log --oneline -15`이며, 합계 최대 16 kB입니다. `.env*`, 키 파일, `node_modules` 같은 폴더는 건너뜁니다. 폴더 안에 있는 일반 파일만 읽으며, 폴더 밖을 가리키는 심볼릭 링크, FIFO, 장치는 건너뜁니다. 이 요약은 dsh 자체 제공자 설정을 거쳐 채팅이 쓰는 모델에 요청 한 번으로 전달됩니다. 어떤 채팅에도 추가되지 않습니다. 프로젝트에는 아무것도 쓰지 않습니다. 오른쪽으로 스와이프한 아이디어는 계획 모드로 새 채팅을 시작하므로, 승인과 계획 검토가 평소대로 적용됩니다. **바로 구현**은 계획 모드 없이 채팅을 시작합니다. 모델이 바로 파일을 바꿀 수 있으며, 채팅의 평소 승인과 자동 검토가 적용됩니다. 나중을 위해 저장한 아이디어(제목, 요약, 이유, 작업량)는 프로젝트 폴더 경로와 함께 dsh 홈 아래 `storages/dsh-composer-plus/later.json`(소유자 전용 파일)에 보관됩니다. 프로젝트에는 아무것도 들어가지 않습니다. 제안된 아이디어의 기록(제목, 요약, 이유, 작업량, 날짜, 시작 여부)도 같은 방식으로 `storages/dsh-composer-plus/idea-history.json`에 보관되며, 프로젝트당 최대 200개입니다(가장 오래된 것부터 지워집니다). 그 제목들은 그 프로젝트에서 다음에 **기능 제안**을 누를 때 모델에 전달됩니다.
|
|
124
127
|
- **내용 검색:** 채팅을 검색하는 새 코드는 없습니다. 플러그인은 dsh 자체 메시지 색인(SQLite FTS5, `dsh-session-query-sqlite`)을 켜고, 그 색인에 `$DSH_HOME/cache/composer-plus/session-search.db` 파일(소유자 전용 파일과 폴더)을 지정할 뿐입니다. 이 파일에는 사용자와 어시스턴트 메시지의 텍스트가 들어 있으므로, `$DSH_HOME/sessions`의 채팅 로그만큼 민감합니다. 아무것도 컴퓨터 밖으로 나가지 않습니다. 이 파일은 dsh가 다시 만들 수 있는 사본이므로, dsh가 닫혀 있을 때 삭제해도 됩니다. 스위치 값은 `$DSH_HOME/storages/dsh-composer-plus/content-search.json`에 있습니다.
|
|
125
|
-
- **턴 되돌리기:** 내 메시지마다, 보내기 전에 Host가 채팅 폴더의 git 스냅샷을 자체 저장소 `$DSH_HOME/cache/composer-plus/rollback/<chat>.git`(소유자 전용 폴더)에 만듭니다. 이 저장소에는 그 폴더에서 git이 보는 파일(무시된 파일 제외)의 사본이 있으므로, 프로젝트만큼 민감합니다. 내 저장소의 객체를 읽기만 하고(git에 이미 있는 것은 복사하지 않음), 내 저장소의 인덱스, `HEAD`, 브랜치, 태그, stash, 설정에는 절대 쓰지 않습니다. git이 그곳에서 바꾸는 것은 재사용한 객체 파일의 타임스탬프를 새로 고치는 것뿐입니다(그래서 `git gc`의 정리가 늦어집니다). 파일까지 되돌릴 때는 채팅 폴더 안의 일반 파일에만 씁니다. 심볼릭 링크, 파이프, 폴더 밖의 모든 것은 건너뜁니다. 아무것도 컴퓨터 밖으로 나가지 않습니다. dsh가 닫혀 있을 때 이 저장소를 삭제해도 됩니다(그러면 새 메시지를 보낼 때까지 채팅만 되돌릴 수 있습니다). **채팅 삭제**는 채팅의 저장소도 함께 삭제합니다. 스위치 값은 `$DSH_HOME/storages/dsh-composer-plus/rollback.json`에 있습니다.
|
|
128
|
+
- **턴 되돌리기:** 내 메시지마다, 보내기 전에 Host가 채팅 폴더의 git 스냅샷을 자체 저장소 `$DSH_HOME/cache/composer-plus/rollback/<chat>.git`(소유자 전용 폴더)에 만듭니다. 이 저장소에는 그 폴더에서 git이 보는 파일(무시된 파일 제외)의 사본이 있으므로, 프로젝트만큼 민감합니다. 내 저장소의 객체를 읽기만 하고(git에 이미 있는 것은 복사하지 않음), 내 저장소의 인덱스, `HEAD`, 브랜치, 태그, stash, 설정에는 절대 쓰지 않습니다. git이 그곳에서 바꾸는 것은 재사용한 객체 파일의 타임스탬프를 새로 고치는 것뿐입니다(그래서 `git gc`의 정리가 늦어집니다). 파일까지 되돌릴 때는 채팅 폴더 안의 일반 파일에만 씁니다. 심볼릭 링크, 파이프, 폴더 밖의 모든 것은 건너뜁니다. 아무것도 컴퓨터 밖으로 나가지 않습니다. dsh가 닫혀 있을 때 이 저장소를 삭제해도 됩니다(그러면 새 메시지를 보낼 때까지 채팅만 되돌릴 수 있습니다). **채팅 삭제**는 채팅의 저장소도 함께 삭제합니다. 스위치 값은 `$DSH_HOME/storages/dsh-composer-plus/rollback.json`에 있습니다. 파일까지 되돌릴 때는 **다시 실행**을 위해 되돌리기 직전의 파일도 보관합니다(같은 저장소의 `refs/r/…`). 다시 실행한 되돌리기 목록은 `$DSH_HOME/storages/dsh-composer-plus/redone.json`(소유자 전용)에 있습니다.
|
|
126
129
|
- **채팅을 Markdown으로 내보내기:** 호스트 쪽은 채팅 자체의 로그(dsh가 보여 주는 것과 같은 메시지)만 읽어 페이지에 넘깁니다. 프로젝트 파일은 읽지 않고, 네트워크로 아무것도 보내지 않습니다. Markdown은 클립보드나 사용자가 저장하는 파일로만 갑니다.
|
|
127
130
|
- **채팅 삭제:** 채팅 자체의 로그 폴더(`$DSH_HOME/sessions/<project>/<chat>`)를 휴지통으로 옮깁니다. 프로젝트 폴더는 건드리지 않습니다.
|
|
128
|
-
- **이 채팅에서 허용:** 허용 항목은 `$DSH_HOME/storages/dsh-composer-plus/grants.json`(소유자 전용 권한)에 저장됩니다. 허용 하나는 한 채팅의 정확히 한 도구에만
|
|
131
|
+
- **이 채팅에서 허용:** 허용 항목은 허용한 시각과 함께 `$DSH_HOME/storages/dsh-composer-plus/chat-grants.json`(소유자 전용 권한)에 저장됩니다. 허용 하나는 한 채팅의 정확히 한 도구에만 적용되며, 시간 제한이 끝날 때까지 유효합니다(기본값 1시간). 그 도구가 쓰기를 할 수 있다면, 허용은 모든 쓰기에도 적용됩니다. 헤더 칩에서 취소하세요.
|
|
129
132
|
- 자동 검토는 여전히 모든 호출에서 실행됩니다. 검토가 실패한 호출은 절대 자동으로 허용되지 않습니다.
|
|
130
|
-
- **모바일 연결:** 켜기 전까지 꺼져 있습니다. 켜져 있는 동안 Host 쪽이 Tether 게이트웨이를 실행합니다. 게이트웨이는 두 부분입니다. 포트 19390의 HTTPS는 Wi-Fi 서브넷과 tailnet(100.64.0.0/10)의 연결만 받고, `127.0.0.1:19391`의 페어링 페이지는 이 Mac에서만 열립니다. 휴대폰을 연결하려면 QR 코드의 일회용 코드(5분 유효)와 Mac에서의 **Approve**가 필요합니다. 휴대폰은 게이트웨이 인증서를 고정(pinning)합니다. Mac은 각 휴대폰 토큰의 해시만 보관합니다(30일, 사용하는 동안 갱신). **Remove**를 누르면 그 휴대폰의 연결이 즉시 끊깁니다. 휴대폰은 허용 목록에 있는 dsh 메서드(채팅, 프롬프트, 첨부 파일, 슬래시 명령, 승인, 질문, 모델, 에이전트, 목표)만 호출할 수 있습니다. 설정, 자격 증명, 파일 브라우저, 터미널은 호출할 수 없습니다. 데이터: `$DSH_HOME/storages/dsh-composer-plus/mobile
|
|
133
|
+
- **모바일 연결:** 켜기 전까지 꺼져 있습니다. 켜져 있는 동안 Host 쪽이 Tether 게이트웨이를 실행합니다. 게이트웨이는 두 부분입니다. 포트 19390의 HTTPS는 Wi-Fi 서브넷과 tailnet(100.64.0.0/10)의 연결만 받고, `127.0.0.1:19391`의 페어링 페이지는 이 Mac에서만 열립니다. 휴대폰을 연결하려면 QR 코드의 일회용 코드(5분 유효)와 Mac에서의 **Approve**가 필요합니다. 휴대폰은 게이트웨이 인증서를 고정(pinning)합니다. Mac은 각 휴대폰 토큰의 해시만 보관합니다(30일, 사용하는 동안 갱신). **Remove**를 누르면 그 휴대폰의 연결이 즉시 끊깁니다. 휴대폰은 허용 목록에 있는 dsh 메서드(채팅, 프롬프트, 첨부 파일, 슬래시 명령, 승인, 질문, 모델, 에이전트, 목표)만 호출할 수 있습니다. 설정, 자격 증명, 파일 브라우저, 터미널은 호출할 수 없습니다. "Tailscale only"는 로컬 네트워크에서 오는 모든 연결을 거부하며, 이미 열린 연결도 끊습니다. 액세스 로그는 가장 최근의 연결 시도 200개(시각, IP 주소, 기기 이름, 허용 또는 거부, 그 이유)를 `access.json`에 보관합니다. 토큰이나 페어링 코드는 절대 보관하지 않습니다. 데이터: `$DSH_HOME/storages/dsh-composer-plus/mobile/`(소유자 전용 파일). 자세한 내용: [tether/README.md](tether/README.md).
|
|
131
134
|
- **업데이트:** Host 쪽은 `api.github.com`에 최신 릴리스를 묻고, `registry.npmjs.org`에 그 정확한 버전을 묻습니다. 사용자나 채팅에 관한 정보는 보내지 않습니다. 설치는 dsh의 플러그인 관리자(`pnpm add dsh-composer-plus@<version>`. 이미 설치된 플러그인에 대해 dsh 0.2.1이 이를 거부하면 `pnpm add https://registry.npmjs.org/dsh-composer-plus/-/dsh-composer-plus-<version>.tgz`를 쓰며, 그 후 프로필에는 그 URL이 플러그인의 소스로 표시됩니다)를 쓰므로, dsh 자체의 레지스트리, 스크립트, 버전 호환성 검사가 적용됩니다. 사전 릴리스 태그와 더 오래된 버전은 절대 설치하지 않습니다.
|
|
132
135
|
- **다음 메시지 예측:** 기본적으로 켜져 있습니다. 이 모델 호출을 막으려면 **설정 → Composer Plus**에서 끄세요. 턴이 끝날 때마다 Host 쪽은 그 채팅에서 사용자가 직접 보낸 메시지와 에이전트의 텍스트 답변(도구 출력, 숨은 컨텍스트, 추론 제외)을 최대 약 6,000자(가장 최근 부분)까지 고른 모델(다른 모델을 고르지 않으면 dsh의 기본 모델)에 보냅니다. dsh 자체 제공자 설정을 거쳐 요청 한 번으로 전달됩니다. 채팅에는 아무것도 저장되지 않으며, 예측은 채팅 기록에 추가되지 않습니다. 스위치와 고른 모델은 `$DSH_HOME/storages/dsh-composer-plus/predict.json`(소유자 전용 파일)에 보관됩니다.
|
|
133
136
|
- **입력 중 자동 완성:** 켜기 전까지 꺼져 있습니다. 켜져 있는 동안 입력을 멈출 때마다 Host 쪽은 지금까지 입력한 텍스트와, 그 채팅에서 사용자가 직접 보낸 메시지와 에이전트의 텍스트 답변(도구 출력, 숨은 컨텍스트, 추론 제외)을 채팅 기준 최대 약 3,000자까지 **입력 중 자동 완성**에서 고른 모델(기본값: **다음 메시지 예측**의 모델)에 보냅니다. 입력을 다시 멈추면 이전 요청은 중지됩니다. 채팅에는 아무것도 저장되지 않습니다. 스위치는 `$DSH_HOME/storages/dsh-composer-plus/complete.json`(소유자 전용 파일)에 보관됩니다.
|
|
@@ -144,8 +147,9 @@ dsh `0.2.0-rc.2`(데스크톱과 웹)와 `0.2.1-rc.2`(웹)에서 테스트했습
|
|
|
144
147
|
- **내 메시지에 ↶ 버튼이 없음:** 턴 되돌리기가 꺼져 있거나, 하위 에이전트 채팅이거나, dsh-rewind-plugin이 설치되어 있습니다(그 플러그인의 ↶ 버튼을 쓰세요). 업데이트한 뒤에는 dsh를 다시 시작하세요.
|
|
145
148
|
- **채팅과 파일이 회색으로 비활성화됨:** 프로젝트가 git 저장소가 아니거나, 그 메시지 이전 스냅샷이 없거나(메시지가 플러그인보다 오래되었거나, 최신 스냅샷 50개가 그 스냅샷을 대체함), 바뀐 파일이 없습니다.
|
|
146
149
|
- **삭제할 때 다른 dsh가 이 채팅을 열고 있다고 표시됨:** 같은 dsh 홈을 쓰는 두 번째 dsh가 채팅 잠금을 잡고 있습니다. 그 창이나 dsh를 닫은 뒤 다시 삭제하세요. 그동안 채팅은 보관된 상태로 남습니다.
|
|
150
|
+
- **"Tailscale only"를 켠 뒤 iPhone이 연결되지 않음:** Mac과 iPhone 모두에서 Tailscale이 켜져 있어야 합니다. Mac에서 꺼져 있으면 모바일 연결 패널에 경고가 표시됩니다. 액세스 로그에서 거부된 각 시도와 그 이유를 볼 수 있습니다.
|
|
147
151
|
- **재시작 후 채팅이 이어지지 않음:** dsh를 종료할 때 재시작 후 이어서 실행이 꺼져 있었거나, 그 턴을 직접 중지했거나, 턴이 이미 끝났거나(완료 또는 실패), 채팅이 보관되었거나, 실행 중인 채팅이 20개보다 많았습니다(가장 최근 채팅 20개만 이어짐).
|
|
148
|
-
- **릴리스 직후 설치 실패:** 버전을 붙여서 설치하세요(`dsh-composer-plus@1.
|
|
152
|
+
- **릴리스 직후 설치 실패:** 버전을 붙여서 설치하세요(`dsh-composer-plus@1.13.0`). 위의 설치 안내를 참고하세요.
|
|
149
153
|
|
|
150
154
|
## 제한 사항
|
|
151
155
|
|
|
@@ -161,9 +165,14 @@ dsh `0.2.0-rc.2`(데스크톱과 웹)와 `0.2.1-rc.2`(웹)에서 테스트했습
|
|
|
161
165
|
- **채팅 삭제**에는 dsh의 보관 기능(dsh 0.2.0 이상)이 필요합니다. 15초 안에 멈추지 않거나 다른 dsh가 잡고 있는 채팅(또는 그 하위 에이전트 채팅 중 하나)은 보관된 상태로 남고, 아무것도 이동하지 않습니다. macOS가 아닌 시스템에서는 휴지통 폴더가 채팅 기록과 같은 디스크에 있어야 합니다. 열려 있는 채팅을 삭제하면, 그 채팅은 dsh를 다시 시작할 때까지 dsh 메모리에 보관되고 숨겨진 상태로 남습니다. 휴지통은 직접 비우세요. dsh는 휴지통을 비우지 않습니다.
|
|
162
166
|
- dsh의 대기열에는 `move` 동작이 없습니다. 그래서 플러그인의 Host 쪽이 dsh의 대기열 안에서 대기 중인 메시지 자체를 옮깁니다(한 번의 변경, 같은 메시지). 이미지나 파일이 있는 메시지도 이동할 수 있습니다. 내 메시지만 이동할 수 있습니다. 대기열에 있는 목표 라운드나 질문에 대한 답변은 제자리에 남습니다. 끄는 중에 메시지 전송이 시작되면 아무것도 이동하지 않고, 알림으로 이를 알려 줍니다.
|
|
163
167
|
- 새 버전이 dsh 설정을 하나도 바꾸지 않으면 dsh 0.2.1은 업데이트를 바로 로드합니다. 그 밖의 경우와 dsh 0.2.0에서는 업데이트를 로드하려면 dsh를 다시 시작하세요. 플러그인은 dsh를 대신 재시작하지 않습니다. dsh 플러그인 관리자가 없는 웹/CLI 프로필은 새 버전을 알리기만 합니다.
|
|
168
|
+
- **이 채팅에서 허용**은 허용한 순간부터 시간 제한을 셉니다. 새 시간 제한은 유효한 허용에 즉시 적용되므로, 더 짧은 시간 제한은 허용을 즉시 끝낼 수 있습니다. 버전 1.12 이하의 허용에는 시간 정보가 없습니다. 업데이트 후 에이전트가 그 도구들에 대해 한 번 더 묻습니다.
|
|
164
169
|
- **입력란 포커스 유지**는 `/` 명령이나 스킬을 보낸 뒤에만 포커스를 돌려줍니다. dsh가 명령을 처리하는 몇 밀리초 동안 입력란이 읽기 전용이므로, 그동안 누른 키는 사라집니다. dsh의 `/` 메뉴가 아직 열려 있으면 `Enter`는 강조된 행을 선택하고 메시지를 보내지 않습니다.
|
|
165
|
-
- **모바일 연결**은 macOS에서만 작동합니다(`en0`, `openssl`, `swift`, `dns-sd` 사용). 고정 포트 19390과 19391을 쓰므로, Mac마다 한 번에 dsh 하나에서만 실행할 수 있습니다(각 Mac은 휴대폰의 Mac 목록에서 항목 하나입니다). 휴대폰은 Tether가 열려 있거나 막 백그라운드로 간 동안에만 알림을 받습니다(푸시 서비스 없음). iOS 앱은 아직 App Store에 없습니다. Xcode로 `tether/ios`에서 빌드하세요. Tether의 초록 점은 Mac을 따릅니다. dsh에서 연 채팅은 휴대폰에서도 점이 사라집니다. Tether에서 연 채팅은 휴대폰에서만 점이 사라집니다. Mac에 있는 dsh 자체의 점은 Mac에서 그 채팅을 열 때까지 남습니다.
|
|
166
|
-
- 세션 링크는 채팅 안에서 작동하지만, 클릭해도 채팅이 열리지는 않습니다.
|
|
170
|
+
- **모바일 연결**은 macOS에서만 작동합니다(`en0`, `openssl`, `swift`, `dns-sd` 사용). 고정 포트 19390과 19391을 쓰므로, Mac마다 한 번에 dsh 하나에서만 실행할 수 있습니다(각 Mac은 휴대폰의 Mac 목록에서 항목 하나입니다). 휴대폰은 Tether가 열려 있거나 막 백그라운드로 간 동안에만 알림을 받습니다(푸시 서비스 없음). iOS 앱은 아직 App Store에 없습니다. Xcode로 `tether/ios`에서 빌드하세요. "Tailscale only"를 켜도 Mac에 Wi-Fi 또는 이더넷 주소가 있어야 합니다(게이트웨이는 그런 주소가 있을 때만 시작됩니다). 액세스 로그는 Mac마다 따로 있으며, 가장 최근의 시도 200개만 보관합니다. 1분 안에 반복된 시도는 새 행을 만들지 않고 같은 행의 횟수를 하나 늘립니다. Tether의 앱 잠금은 iPhone 잠금 화면의 알림 미리보기를 숨기지 않습니다. iOS 설정에서 끄세요. Tether의 초록 점은 Mac을 따릅니다. dsh에서 연 채팅은 휴대폰에서도 점이 사라집니다. Tether에서 연 채팅은 휴대폰에서만 점이 사라집니다. Mac에 있는 dsh 자체의 점은 Mac에서 그 채팅을 열 때까지 남습니다.
|
|
171
|
+
- 세션 링크는 채팅 안에서 작동하지만, 클릭해도 채팅이 열리지는 않습니다. **메시지 링크 복사**로 만든 링크는 dsh 0.2.1 이상에서만, 그리고 채팅 안의 메시지에서만 그 메시지를 엽니다(dsh 0.2.0에는 사용자 텍스트 규칙이 없으므로, 링크는 복사되지만 일반 텍스트로 보입니다). 되돌리기로 빠진 메시지나, 압축으로 dsh가 불러오는 기록에서 빠진 메시지는 보여 줄 수 없습니다. 이때 링크가 그렇다고 알려 줍니다. 🔗 버튼은 dsh의 메시지 행에 붙습니다. dsh 업데이트로 그 마크업이 바뀌면 버튼이 표시되지 않습니다.
|
|
172
|
+
- **모두 읽음으로 표시**는 공개 API가 아닌 dsh의 일부(dsh 세션 상태의 `completionUnread` 목록)를 통해 dsh 자체의 읽지 않음 점을 바꿉니다. dsh 업데이트로 이 이름이 바뀌면 항목이 표시되지 않습니다. 이 항목은 dsh의 프로젝트 "…" 메뉴에 들어가는데, 이 메뉴에는 플러그인용 슬롯이 없습니다. dsh가 이 메뉴를 바꾸면 이 항목도 표시되지 않습니다.
|
|
173
|
+
- **대기 중인 메시지 제자리 편집**은 dsh 자체의 대기열 편집기를 열므로 그 제한도 따릅니다. 이미지나 파일이 있는 메시지는 편집할 수 없고, 그사이 전송이 시작된 메시지는 바뀌지 않습니다(dsh가 자체 오류를 표시합니다).
|
|
174
|
+
- **다시 실행**은 되돌린 채팅을 절대 바꾸지 않습니다. 되돌리기 직전 시점부터 새 채팅을 시작하므로(dsh 자체 포크, 같은 모델 컨텍스트), 새 채팅은 새 ID와 제목을 가집니다. 채팅의 가장 최근 되돌리기만, 한 번만, 그리고 그 뒤에 아무것도 없을 때만 다시 실행할 수 있습니다(새 메시지를 보내면 이 선택지가 사라집니다). 되돌린 뒤 내가 바꾼 파일은 덮어쓰기 상자를 체크하지 않는 한 유지됩니다. 다시 실행에는 되돌리기가 보관한 스냅샷이 필요합니다(같은 50개 범위). 이 버전 이전에 한 되돌리기나 **채팅만**으로 한 되돌리기는 메시지만 다시 가져옵니다.
|
|
175
|
+
- **이 채팅**은 dsh의 파일 도구(`write`, `edit`, `str_replace_editor`)가 쓴 파일만 셉니다. 명령(`bash`)이 바꾼 파일은 이 보기에 없고, **커밋 안 됨**에 표시됩니다. 채팅의 턴 되돌리기 스냅샷이 없으면(턴 되돌리기 꺼짐, dsh-rewind-plugin 설치됨, 또는 플러그인보다 오래된 채팅) 보기는 마지막 커밋과 비교하고 그렇다고 알려 줍니다. 턴 되돌리기는 채팅마다 최신 스냅샷 50개를 보관합니다. 더 긴 채팅에서는 보기가 보관된 가장 오래된 스냅샷과 비교하고, 어느 메시지부터인지 알려 주며, 그 이전의 변경은 세지 않습니다. **공백 변경 숨기기**는 `git diff -w`입니다. 줄 안의 공백만 바뀐 줄도 숨겨집니다.
|
|
167
176
|
- 재시작 전에 보낸 알림을 클릭하면 dsh를 앞으로 가져오기만 합니다.
|
|
168
177
|
- 활성 프로젝트는 dsh에 저장되는 프로젝트 순서로 이동하므로, 새 순서는 재시작 후에도 유지됩니다. 어느 프로젝트에도 속하지 않은 채팅("그룹 없음")은 이동할 수 없습니다. dsh는 이 채팅을 항상 맨 마지막에 나열합니다.
|
|
169
178
|
- dsh의 사이드바 보기 옵션 메뉴에는 확장 지점이 없습니다. 그래서 최근 프로젝트 옵션은 dsh 자체 메뉴에 추가됩니다. dsh 업데이트로 이 메뉴가 바뀌면 옵션이 표시되지 않고 모든 프로젝트가 계속 보입니다. 필터는 프로젝트 행에 적용되므로 **하나의 목록**은 걸러지지 않습니다. **작업 공간**과 함께 쓰세요. **작업 공간 트리**에서는 숨겨진 상위 폴더가 그 안의 활성 프로젝트도 숨깁니다. **상태별**에도 같은 종류의 제한이 있습니다. dsh에는 정렬 슬롯이 없으므로, 항목과 행 순서가 dsh의 메뉴와 목록 마크업에 붙습니다.
|
|
@@ -200,7 +209,21 @@ dsh `0.2.0-rc.2`(데스크톱과 웹)와 `0.2.1-rc.2`(웹)에서 테스트했습
|
|
|
200
209
|
|
|
201
210
|
**dsh에서 대기 중인 메시지의 순서를 바꾸려면 어떻게 하나요?** 대기 중인 메시지의 ⠿ 핸들을 끌거나, 핸들에 포커스를 두고 `↑` / `↓`를 누르세요.
|
|
202
211
|
|
|
203
|
-
|
|
212
|
+
**대기 중인 메시지의 오타를 고치려면 어떻게 하나요?** 대기열에서 메시지를 두 번 클릭하고, 텍스트를 고친 뒤 `Enter`를 누르세요(`Esc`는 취소). 메시지는 대기열에서 제자리를 유지합니다.
|
|
213
|
+
|
|
214
|
+
**프로젝트의 읽지 않음 점을 한 번에 모두 지우려면 어떻게 하나요?** 사이드바 → 프로젝트의 **…** 버튼 → **모두 읽음으로 표시**.
|
|
215
|
+
|
|
216
|
+
**긴 채팅의 메시지 하나에 링크할 수 있나요?** 네. 메시지 위에 포인터를 올리고 **🔗**를 클릭하세요. 그 링크를 채팅에서 보내세요. dsh 0.2.1 이상에서는 링크를 클릭하면 그 메시지 위치에서 채팅이 열립니다.
|
|
217
|
+
|
|
218
|
+
**실수로 턴을 되돌렸습니다. 다시 살릴 수 있나요?** 네. 되돌린 직후 입력란 위의 **다시 실행**을 쓰세요. 되돌리기 직전 시점부터 같은 메시지로 새 채팅을 시작하고, **채팅과 파일**로 되돌렸다면 파일도 다시 돌려놓습니다.
|
|
219
|
+
|
|
220
|
+
**한 채팅이 바꾼 파일만 보려면 어떻게 하나요?** 오른쪽 사이드바 → **변경 사항** → **이 채팅**. 공백만 바뀐 변경을 숨기려면 **␣**를 클릭하세요.
|
|
221
|
+
|
|
222
|
+
**한 채팅에서 자동 검토가 같은 도구를 계속 묻지 않게 하려면 어떻게 하나요?** 승인 카드에서 **이 채팅에서 허용**을 클릭하세요. 이 허용은 그 채팅의 그 도구에만 적용되며, 기본값은 1시간입니다. 헤더 칩에서 취소할 수 있습니다. 시간은 **설정 → Composer Plus → 이 채팅에서 허용**에서 바꿉니다.
|
|
223
|
+
|
|
224
|
+
**iPhone을 잃어버렸습니다. 그 iPhone이 Mac에 접속하지 못하게 하려면 어떻게 하나요?** 사이드바 왼쪽 아래의 **모바일 연결**을 클릭하고, 그 iPhone 옆의 **Remove**를 클릭하세요. 그 iPhone의 키는 즉시 작동을 멈춥니다. 다시 연결하려면 Mac에서 승인하는 새 페어링이 필요합니다.
|
|
225
|
+
|
|
226
|
+
**Face ID로 Tether를 잠글 수 있나요?** 네. Tether에서 "Settings → Privacy → Lock with Face ID"를 켜세요. 그러면 Tether를 열 때와 Tether로 돌아올 때 Face ID(또는 암호)를 요구합니다.
|
|
204
227
|
|
|
205
228
|
**dsh 사이드바에 오늘 사용한 프로젝트만 표시하려면 어떻게 하나요?** 사이드바 → 보기 옵션(슬라이더 아이콘) → **최근 2시간 내 활성**. 모든 프로젝트를 다시 보려면 이 옵션을 다시 선택하세요.
|
|
206
229
|
|
package/README.md
CHANGED
|
@@ -27,7 +27,7 @@ dsh plugin --profile web add dsh-composer-plus
|
|
|
27
27
|
|
|
28
28
|
Then restart dsh. (The CLI can't install into the desktop profile; the app manages it.)
|
|
29
29
|
|
|
30
|
-
> dsh's pnpm skips versions younger than 24 hours. Right after a release, add the version: `dsh-composer-plus@1.
|
|
30
|
+
> dsh's pnpm skips versions younger than 24 hours. Right after a release, add the version: `dsh-composer-plus@1.13.0`.
|
|
31
31
|
|
|
32
32
|
## Features
|
|
33
33
|
|
|
@@ -35,10 +35,10 @@ Then restart dsh. (The CLI can't install into the desktop profile; the app manag
|
|
|
35
35
|
|
|
36
36
|
| Feature | How to use it | Screenshot |
|
|
37
37
|
|---|---|---|
|
|
38
|
-
| **Changes panel** | <a id="feature-changespanel"></a>Right sidebar → `+` → **Changes**. Pick **Uncommitted**, **Unstaged**, **Staged** or **Branch** to see changed files with `+/-` counts; click a file for its diff. **Last Turn** opens dsh's own review of the latest turn. | <a href="assets/features/changesPanel.webp"><img src="assets/features/changesPanel.webp" width="160" alt="Screenshot: Changes panel"></a> |
|
|
38
|
+
| **Changes panel** | <a id="feature-changespanel"></a>Right sidebar → `+` → **Changes**. Pick **Uncommitted**, **Unstaged**, **Staged** or **Branch** to see changed files with `+/-` counts; click a file for its diff. **Last Turn** opens dsh's own review of the latest turn. Click the branch name (or pick **Tree**) to see the branch tree: click a branch above it to go to that branch, click a commit to see its files and their diffs. **This chat** lists only the files that the open chat's file tools (write, edit) wrote, in all its turns, and their total diff since its first message. The **␣** button hides whitespace changes (`git diff -w`): lines that changed only in indentation or line endings do not show. | <a href="assets/features/changesPanel.webp"><img src="assets/features/changesPanel.webp" width="160" alt="Screenshot: Changes panel"></a> |
|
|
39
39
|
| **Feature ideas** | <a id="feature-featureideas"></a>Right sidebar → `+` → **Feature ideas** → **Suggest features**. The chat's own model reads a short summary of the chat's project (top-level files, the README and manifest heads, the last 15 commits) and suggests up to 8 features, shown as a stack of cards in dsh's UI language. Swipe a card right (or click **✓**, or press `→`; the card flies off to its side in each case) to start a new chat in the same project: it starts in plan mode with the idea as the request, so nothing changes before you approve the plan. To skip the plan, click **▶ Build now** (or press `↑`; the card flies up): the new chat starts at once with the idea as an ordinary request, and the model makes the change and runs its checks (approvals apply as usual). Swipe left (or **✕**, or `←`) to skip; **Undo** (or `Z`) brings a skipped card back. Click **↓** (or press `↓`) to save a good idea for later: it goes to the project's **Later** list, which every chat in the same project folder shows (also after a restart). **Later (N)** opens the list; **Plan** starts the same plan-mode chat for the idea and **Build now** the chat without a plan, both take it off the list; **Plan all (N)** starts one plan-mode chat for every idea in the list, so shared parts are planned once; **Remove from the list** deletes it. **Copy as checklist** copies the whole list to the clipboard as a Markdown checklist (`- [ ] Title — Summary`, one line per idea) for an issue tracker or a TODO file; it makes no network call. **More ideas** adds cards. To get ideas about one area only, type a short **focus topic** in the field next to **Suggest features** (at most 80 characters; `Enter` also suggests), or click one of the fixed topics under it: **Performance**, **Accessibility**, **Tests**, **Security**, **Usability** or **Documentation** (click it again to clear it). The model then suggests only features about that topic; an empty field means any feature. Ideas are not suggested twice in a project: every suggested idea (skipped, saved or started) goes to the project's **History**, the model is told not to suggest those again, and a repeated title is dropped. **History** lists them with **Started** or **Suggested**; **Forget** (or **Forget all**) lets one come again; an idea that is still in the Later list stays out of the suggestions until you remove it there. The model runs only when you click. | <a href="assets/features/featureIdeas.webp"><img src="assets/features/featureIdeas.webp" width="160" alt="Screenshot: Feature ideas"></a> |
|
|
40
40
|
| **Content search** | <a id="feature-contentsearch"></a>dsh's own sidebar search (the magnifier next to **Workspaces**; `Cmd+K` in the desktop app, `Cmd+Alt+K` in a browser) also finds chats by the words in your messages and in the replies, not only by title, and shows the matching text under the chat. dsh already has this search, but ships it switched off; this feature switches it on with a search index file on your computer. The index is made at the first search after a start (about 15 s for 250 chats, see Limits) and is kept for the next starts. On by default; a change applies after you restart dsh. | <a href="assets/features/contentSearch.webp"><img src="assets/features/contentSearch.webp" width="160" alt="Screenshot: Content search"></a> |
|
|
41
|
-
| **Turn rollback** | <a id="feature-turnrollback"></a>Hover one of your messages and click **↶** (next to Copy). **Chat only** takes that message and everything after it (replies, tool calls) out of the chat and out of the model's context, and puts the message back in the composer: change it and send it again. **Chat and files** first lists the project files that changed since that message, then also puts them back as they were, including changes made by commands (`bash`), not only by dsh's edit tools. A running turn stops first. The chat log is never rewritten: one hidden marker hides the withdrawn part, the same way dsh's own `/compact` hides old messages. When [dsh-rewind-plugin](https://www.npmjs.com/package/dsh-rewind-plugin) is installed, it does this job and Composer Plus shows no second button. | <a href="assets/features/turnRollback.webp"><img src="assets/features/turnRollback.webp" width="160" alt="Screenshot: Turn rollback"></a> |
|
|
41
|
+
| **Turn rollback** | <a id="feature-turnrollback"></a>Hover one of your messages and click **↶** (next to Copy). **Chat only** takes that message and everything after it (replies, tool calls) out of the chat and out of the model's context, and puts the message back in the composer: change it and send it again. **Chat and files** first lists the project files that changed since that message, then also puts them back as they were, including changes made by commands (`bash`), not only by dsh's edit tools. A running turn stops first. The chat log is never rewritten: one hidden marker hides the withdrawn part, the same way dsh's own `/compact` hides old messages. When [dsh-rewind-plugin](https://www.npmjs.com/package/dsh-rewind-plugin) is installed, it does this job and Composer Plus shows no second button. After a rollback, a **Redo** bar shows above the composer: it starts a new chat from just before the rollback (the same messages and context) and, with **Chat and files**, puts the files back; a file that you changed after the rollback is listed and kept, unless you tick the box that overwrites it. | <a href="assets/features/turnRollback.webp"><img src="assets/features/turnRollback.webp" width="160" alt="Screenshot: Turn rollback"></a> |
|
|
42
42
|
| **Delete chat** | <a id="feature-deletechat"></a>Sidebar → a chat's **…** menu (or right-click) → **Delete…** → **Delete**. dsh itself can only archive. The chat stops (its turn, jobs, subagents and schedules, like dsh's own archive) and its saved history, with its subagent chats, moves to the macOS Trash (on other systems: `$DSH_HOME/trash`). To get it back, put the folder back and restart dsh: it shows in the sidebar's **Archived only** view. | <a href="assets/features/deleteChat.webp"><img src="assets/features/deleteChat.webp" width="160" alt="Screenshot: Delete chat"></a> |
|
|
43
43
|
| **Project name in the composer** | <a id="feature-projectname"></a>The row under the composer (turns, tokens, cache hit, context) starts with the chat's project name, so you always see which project a chat works in. It is dsh's own project title, or the folder name when the project has no title. Hover it to see the full folder path. Click it to find the chat in the sidebar, in the list or project view: the sidebar and the project open (also a collapsed project and its **Show N more sessions**), the list scrolls to the chat and the chat blinks for 5 seconds. | <a href="assets/features/projectName.webp"><img src="assets/features/projectName.webp" width="160" alt="Screenshot: Project name in the composer"></a> |
|
|
44
44
|
| **Input history** | <a id="feature-inputhistory"></a>In an empty composer, press `↑` / `↓` to walk through messages you sent, like a terminal. | <a href="assets/features/inputHistory.webp"><img src="assets/features/inputHistory.webp" width="160" alt="Screenshot: Input history"></a> |
|
|
@@ -47,22 +47,25 @@ Then restart dsh. (The CLI can't install into the desktop profile; the app manag
|
|
|
47
47
|
| **One-click Continue** | <a id="feature-continuebutton"></a>After a stopped, failed or cut-off turn, an empty composer shows **▶**. One click resumes from the existing conversation without writing in the input or adding a visible chat message (the model receives a short hidden “continue from where it stopped” note, because some providers, such as Claude, reject a request that ends on an assistant reply). Messages that wait in the queue stay there: ▶ continues only the stopped task, then the queue runs. A completed turn keeps the regular Send button. | <a href="assets/features/continueButton.webp"><img src="assets/features/continueButton.webp" width="160" alt="Screenshot: One-click Continue"></a> |
|
|
48
48
|
| **Resume after restart** | <a id="feature-resumeafterrestart"></a>Off by default: switch it on in **Settings → Composer Plus**. If you quit dsh (or it closes) while a chat is working, that chat continues by itself when you open dsh again, with the same hidden note as One-click Continue. If a goal round (`/goal`) was running, the goal goes on with its next round (dsh pauses goals at every start until you resume them). Chats that you stopped, that finished or that failed do not continue. dsh itself has no setting for this: it only marks such a turn as interrupted. | <a href="assets/features/resumeAfterRestart.webp"><img src="assets/features/resumeAfterRestart.webp" width="160" alt="Screenshot: Resume after restart"></a> |
|
|
49
49
|
| **Queue drag-and-drop** | <a id="feature-queuereorder"></a>Queued messages get a grip (⠿). Drag to reorder, or focus the grip and press `↑` / `↓`. `Esc` cancels. | <a href="assets/features/queueReorder.webp"><img src="assets/features/queueReorder.webp" width="160" alt="Screenshot: Queue drag-and-drop"></a> |
|
|
50
|
+
| **Edit queued message in place** | <a id="feature-queueedit"></a>Double-click a queued message. It turns into dsh's own edit box: change the text, press `Enter` to save or `Esc` to cancel. The message keeps its place in the queue. Messages with images or files cannot be edited this way (dsh's queue edits text only). | <a href="assets/features/queueEdit.webp"><img src="assets/features/queueEdit.webp" width="160" alt="Screenshot: Edit queued message in place"></a> |
|
|
50
51
|
| **Copy session link** | <a id="feature-copydeeplink"></a>Right-click a chat in the sidebar → **Copy session link**. Paste the `dsh-session:…` link into another chat to attach that chat as read-only context. dsh 0.2.1 has its own **Copy Session ID**, which copies only the plain id; this item comes right after it. | <a href="assets/features/copyDeeplink.webp"><img src="assets/features/copyDeeplink.webp" width="160" alt="Screenshot: Copy session link"></a> |
|
|
52
|
+
| **Copy message link** | <a id="feature-copymessagelink"></a>Hover a message and click **🔗** (in its action row; for an answer, next to the time). The link is the session link plus the message number: `dsh-session:…#42`. Paste it in a message and send it: on dsh 0.2.1 and later the link shows as a chip, and a click opens that chat, scrolls to the message and highlights it for 2 seconds. Like a session link, it also attaches that chat as read-only context. | <a href="assets/features/copyMessageLink.webp"><img src="assets/features/copyMessageLink.webp" width="160" alt="Screenshot: Copy message link"></a> |
|
|
51
53
|
| **Export chat as Markdown** | <a id="feature-exportmarkdown"></a>Right-click a chat in the sidebar (or open its **…** menu) → **Export as Markdown…**. A dialog shows how many messages the chat has; **Copy to clipboard** copies the chat as Markdown, **Save .md file** saves it as `<chat title>.md` through the browser's download (dsh desktop: your Downloads folder or a save dialog, as your system is set). The file has the chat title, the project name and the date, then one `## You` or `## Assistant` section per message. Code blocks stay as they are; a code block that a message leaves open is closed. | <a href="assets/features/exportMarkdown.webp"><img src="assets/features/exportMarkdown.webp" width="160" alt="Screenshot: Export chat as Markdown"></a> |
|
|
52
54
|
| **Copy project path** | <a id="feature-copyprojectpath"></a>Right-click a project in the sidebar → **Copy path** copies the full path of its folder. | <a href="assets/features/copyProjectPath.webp"><img src="assets/features/copyProjectPath.webp" width="160" alt="Screenshot: Copy project path"></a> |
|
|
53
55
|
| **Project search in a new chat** | <a id="feature-projectpicker"></a>New chat → the project button above the composer. The projects show in A–Z order, with a **Search projects** box on top. Type part of a name (case and accents do not matter) and press `Enter` to pick the first match. **No matching project** shows when nothing matches. dsh's saved project order in the sidebar does not change. | <a href="assets/features/projectPicker.webp"><img src="assets/features/projectPicker.webp" width="160" alt="Screenshot: Project search in a new chat"></a> |
|
|
54
56
|
| **Next message prediction** | <a id="feature-nextprediction"></a>On by default; switch it off in **Settings → Composer Plus**. When the agent finishes a turn (not a stopped or failed one), the empty composer shows a guess of your next message in grey, with a **Tab to accept** hint. `Tab` puts the text in the composer, but does not send it. `Esc` hides it for that turn. Typing also hides it, and a new turn replaces it. The **Model** menu under the switch lists dsh's own models (the same list as dsh's model menu). **dsh default** is selected by default and follows dsh's default model. Each finished turn costs one short model call. In Tether, the guess shows above the empty composer: tap it to put it in the field. | <a href="assets/features/nextPrediction.webp"><img src="assets/features/nextPrediction.webp" width="160" alt="Screenshot: Next message prediction"></a> |
|
|
55
57
|
| **Complete while typing** | <a id="feature-typingcompletion"></a>Off by default; switch it on in **Settings → Composer Plus**. While you type, grey text right after the cursor shows how your message may go on. `Tab` adds it to the message, but does not send it. `Esc` hides it. It suggests only your own next words: never an answer to you, and no made-up error texts or names. When the message looks complete or the model is not sure, nothing shows. Typing the next letters of the grey text keeps it, with no new model call. It has its own **Model** menu under its switch. Its first entry, **Same as Next message prediction**, uses the model of **Next message prediction** (the default); pick another model to use a different one for each feature, for example a faster model for completions. It makes one model call at each pause while you type, so it uses many more tokens than the prediction: pick a fast, low-cost model. It does not run for a slash command, a message with a file chip, or when the cursor is not at the end. In Tether, the rest shows above the field while you type: tap it to add it. | <a href="assets/features/typingCompletion.webp"><img src="assets/features/typingCompletion.webp" width="160" alt="Screenshot: Complete while typing"></a> |
|
|
56
58
|
| **Improve prompt** | <a id="feature-promptimprove"></a>Type a rough request, then click the magic wand (**Improve prompt**) next to the model menu. One model call rewrites it as a clearer prompt: the goal first, short numbered steps when there are several parts, and the check to run. It reads this chat (rolled-back messages left out), the project's README, AGENTS.md and manifest, the changed files and the files whose names match your words, and keeps your language. It never makes up file names. The new text replaces your draft but is not sent: read it, edit it, then press `Enter`. `Cmd/Ctrl+Z` brings your text back in one step, and so does the button (**Undo improvement**). If you type while it works, your new text stays. `Esc` or a second click cancels. It has its own **Model** menu in Settings (default: **Same as the chat's model**). Not for slash commands or a message with a file chip. In Tether, the wand is next to the field. | <a href="assets/features/promptImprove.webp"><img src="assets/features/promptImprove.webp" width="160" alt="Screenshot: Improve prompt"></a> |
|
|
57
|
-
| **Allow for this chat** | <a id="feature-allowforchat"></a>When Auto Review asks you, the approval card gets **Allow for this chat**: the same tool in the same chat is allowed from then on, with any arguments. A header chip lists the grants and revokes them. Grants survive a restart. | <a href="assets/features/allowForChat.webp"><img src="assets/features/allowForChat.webp" width="160" alt="Screenshot: Allow for this chat"></a> |
|
|
59
|
+
| **Allow for this chat** | <a id="feature-allowforchat"></a>When Auto Review asks you, the approval card gets **Allow for this chat**: the same tool in the same chat is allowed from then on, with any arguments, until the time limit ends (1 hour by default; choose it under **Settings → Composer Plus → Allow for this chat**). Then the agent asks again. A header chip lists the grants with their end time and revokes them. Grants survive a restart. | <a href="assets/features/allowForChat.webp"><img src="assets/features/allowForChat.webp" width="160" alt="Screenshot: Allow for this chat"></a> |
|
|
58
60
|
| **Project status** | <a id="feature-projectstatus"></a>A project row in the sidebar shows the same spinner / waiting / done marker as its chats, so a collapsed project still tells you a chat inside is working or needs you. A chat waiting for you shows first, then a finished chat you have not opened yet (the green dot, also while another chat still runs), then the spinner. Hover it for details. | <a href="assets/features/projectStatus.webp"><img src="assets/features/projectStatus.webp" width="160" alt="Screenshot: Project status"></a> |
|
|
61
|
+
| **Mark all as read** | <a id="feature-markprojectread"></a>In the sidebar, click a project's **…** button → **Mark all as read**. Every chat in that project loses its green unread dot at once; other projects keep theirs. The item is greyed out (**No unread chats**) when the project has none. | <a href="assets/features/markProjectRead.webp"><img src="assets/features/markProjectRead.webp" width="160" alt="Screenshot: Mark all as read"></a> |
|
|
59
62
|
| **Active projects first** | <a id="feature-activeprojectsfirst"></a>When a chat starts running or needs you, its project moves to the top of the sidebar with dsh's own row animation (the same move as dragging it there). Finished projects stay where they are; drag them anywhere as usual. Moves are saved to dsh's project order, so turning this off keeps the current order. | <a href="assets/features/projectStatus.webp"><img src="assets/features/projectStatus.webp" width="160" alt="Screenshot: Active projects first"></a> |
|
|
60
63
|
| **Recent projects filter** | <a id="feature-recentprojects"></a>Sidebar → view options (sliders icon) → **Active in the last 2 hours**. While it is selected, the sidebar shows only projects with a chat that was active in the last 2 hours: a chat updated in that time, a running or waiting chat, the open chat, or a finished chat that you did not open yet (dsh's green “done” dot), also after the 2 hours. Projects without such a chat are hidden, also new and empty ones. Select it again to show all projects. The choice is kept on this device. | <a href="assets/features/recentProjects.webp"><img src="assets/features/recentProjects.webp" width="160" alt="Screenshot: Recent projects filter"></a> |
|
|
61
64
|
| **Collapse all projects** | <a id="feature-collapseprojects"></a>While a project is open in the sidebar, a button appears next to the view options (sliders icon). Click it to close every open project at once, for example 3 open projects out of 5. The button hides again when no project is open. | <a href="assets/features/collapseProjects.webp"><img src="assets/features/collapseProjects.webp" width="160" alt="Screenshot: Collapse all projects"></a> |
|
|
62
65
|
| **Order by status** | <a id="feature-statusorder"></a>Sidebar → view options → **Order by** → **By status** (with **In one list**). Finished chats come first (dsh's “done” dot, which a turn that ended with an error also gets), then running or waiting chats, then chats with an active automation (Schedule), then the rest in dsh's order. Opening a finished chat moves it down. Only the view changes: select **Manual** or **Last updated** to go back. | <a href="assets/features/statusOrder.webp"><img src="assets/features/statusOrder.webp" width="160" alt="Screenshot: Order by status"></a> |
|
|
63
66
|
| **Background notifications** | <a id="feature-notifications"></a>While dsh is in the background you get a notification when a turn finishes (first line of the reply), or when a chat really waits for you: an approval (tool name), an answer (the question) or a plan review. A request must still be open 1.5 s later, so approvals answered automatically (Auto Review grants, other plugins) stay silent, and a notification is withdrawn as soon as its request is answered. The Dock/taskbar badge counts waiting chats. Clicking opens that chat. | <a href="assets/features/notifications.webp"><img src="assets/features/notifications.webp" width="160" alt="Screenshot: Background notifications"></a> |
|
|
64
67
|
| **Application language** | <a id="feature-language"></a>Settings → Composer Plus → **Application language** switches the whole dsh interface to Türkçe, Español, Português (Brasil), Français, Deutsch, Русский, 日本語, 한국어, Bahasa Indonesia, Tiếng Việt or हिन्दी (see below). | <a href="assets/features/language.webp"><img src="assets/features/language.webp" width="160" alt="Screenshot: Application language"></a> |
|
|
65
|
-
| **Mobile connect (iPhone)** | <a id="feature-mobileconnect"></a>Use dsh from your iPhone with the [Tether](tether/) app, on the same Wi-Fi or over [Tailscale](https://tailscale.com). Switch it on in **Settings → Composer Plus** (it is off by default, because it opens a network port on this Mac). Then click **Mobile connect** at the bottom left of the sidebar: scan the QR code with the iPhone Camera (tap **Open in Tether**) or with **Scan code** in Tether, tap **Connect** and click **Approve**. Tether must be installed first: without it the Camera cannot open the code. The phone shows your chats, sends messages, answers approvals and questions, and switches models and agents. Pair as many Macs as you like: the Mac name at the top left of the app switches between them. | <a href="assets/features/mobileConnect.webp"><img src="assets/features/mobileConnect.webp" width="160" alt="Screenshot: Mobile connect (iPhone)"></a> |
|
|
68
|
+
| **Mobile connect (iPhone)** | <a id="feature-mobileconnect"></a>Use dsh from your iPhone with the [Tether](tether/) app, on the same Wi-Fi or over [Tailscale](https://tailscale.com). Switch it on in **Settings → Composer Plus** (it is off by default, because it opens a network port on this Mac). Then click **Mobile connect** at the bottom left of the sidebar: scan the QR code with the iPhone Camera (tap **Open in Tether**) or with **Scan code** in Tether, tap **Connect** and click **Approve**. Tether must be installed first: without it the Camera cannot open the code. The phone shows your chats, sends messages, answers approvals and questions, and switches models and agents. Pair as many Macs as you like: the Mac name at the top left of the app switches between them. The **Mobile connect** panel lists the paired iPhones with their last connection: **Remove** cuts one off at once. **Tailscale only** refuses the local network (for a shared Wi-Fi), and the access log shows who tried to connect. In Tether, **Settings → Privacy** locks the app with Face ID. | <a href="assets/features/mobileConnect.webp"><img src="assets/features/mobileConnect.webp" width="160" alt="Screenshot: Mobile connect (iPhone)"></a> |
|
|
66
69
|
| **Automatic updates** | <a id="feature-autoupdate"></a>When dsh starts, the plugin checks the [latest GitHub release](https://github.com/furkancak1r/dsh-composer-plus/releases/latest). If it is newer and already on npm, it installs that exact version through dsh's own plugin manager (the same path as Settings → Plugins) and notifies you. Restart dsh to load it. **Settings → Composer Plus → Composer Plus updates** shows the version and has **Check for updates** / **Update now**. The first time dsh starts with the new version, a **What’s new in Composer Plus N** window shows the release notes of that version once (taken from the same update check, no extra network call); **Close** or `Esc` closes it. | <a href="assets/features/autoUpdate.webp"><img src="assets/features/autoUpdate.webp" width="160" alt="Screenshot: Automatic updates"></a> |
|
|
67
70
|
|
|
68
71
|
<!-- END GENERATED FEATURES -->
|
|
@@ -117,15 +120,15 @@ Tested on dsh `0.2.0-rc.2` (desktop and web) and `0.2.1-rc.2` (web). CI runs the
|
|
|
117
120
|
- **Continue:** the authenticated local endpoint resumes only the last interrupted turn, rejects stale or duplicate requests, and preserves the existing approval hooks. It does not send a new user message.
|
|
118
121
|
- **Resume after restart:** off until you switch it on. The Host half keeps only chat ids and start times in `$DSH_HOME/storages/dsh-composer-plus/resume.json` (owner-only permissions), and nothing leaves your machine. It continues a chat only when dsh's own log says that dsh (not you) stopped its last turn. Approvals and Auto Review apply to the continued turn as usual.
|
|
119
122
|
|
|
120
|
-
- **Changes panel:** git runs read-only on your machine, in the chat's own folder, through dsh's authenticated `/api` channel. It never commits, stages or fetches, and only shows paths git itself listed.
|
|
123
|
+
- **Changes panel:** git runs read-only on your machine, in the chat's own folder, through dsh's authenticated `/api` channel. It never commits, stages or fetches, and only shows paths git itself listed. The tree shows the newest 300 commits of the local and remote branches; it never checks out a branch. In a very large repository without a commit-graph file, the tree can take some seconds to open. **This chat** reads the chat's own log for the files that its file tools wrote and compares them with the chat's Turn rollback snapshot in a temporary folder that is deleted at once; it writes nothing to your repository or to the snapshot store.
|
|
121
124
|
- **Feature ideas:** nothing runs until you click **Suggest features**. Then the Host half reads only the chat's own folder (the browser never sends a path): the names of the top-level entries, the first 6 kB of the README, AGENTS.md and the manifest (`package.json`, `pyproject.toml`, `Cargo.toml`, `go.mod`, …) and `git log --oneline -15`, at most 16 kB in total. It skips `.env*`, key files and folders such as `node_modules`, and it reads only regular files that stay inside the folder: a symlink that points out of the folder, a FIFO or a device is skipped. This summary goes to the model that the chat uses, through dsh's own provider settings, as one request; it is not added to any chat. Nothing in the project is written. A swiped-right idea starts a new chat in plan mode, so approvals and plan review apply as usual. **Build now** starts the chat without plan mode: the model can change files at once, with the chat's usual approvals and Auto Review. Ideas saved for later (title, summary, why, effort) are kept with the project's folder path in `storages/dsh-composer-plus/later.json` under the dsh home (owner-only file); nothing goes into the project. The history of suggested ideas (title, summary, why, effort, date, started) is kept the same way in `storages/dsh-composer-plus/idea-history.json`, at most 200 per project (the oldest leave first); its titles go to the model with the next **Suggest features** of that project.
|
|
122
125
|
- **Content search:** no new code searches your chats: the plugin only switches on dsh's own message index (SQLite FTS5, `dsh-session-query-sqlite`) and gives it a file, `$DSH_HOME/cache/composer-plus/session-search.db` (owner-only file and folder). The file holds the text of your user and assistant messages, so it is as private as the chat logs in `$DSH_HOME/sessions`. Nothing leaves your machine. It is a copy that dsh can make again: you can delete it while dsh is closed. The switch is in `$DSH_HOME/storages/dsh-composer-plus/content-search.json`.
|
|
123
|
-
- **Turn rollback:** before each of your messages, the Host takes a git snapshot of the chat's folder in its own store, `$DSH_HOME/cache/composer-plus/rollback/<chat>.git` (owner-only folder). It holds copies of the files in that folder that git sees (not ignored files), so it is as private as the project. It reads your repository's objects (no copy of what git already has) and never writes your repository's index, `HEAD`, branches, tags, stash or config; the only change git makes there is a newer time stamp on object files it reuses (this delays their cleanup by `git gc`). A rollback with files writes only regular files inside the chat's folder; it skips symlinks, pipes and anything outside the folder. Nothing leaves your machine. You can delete the store while dsh is closed (rollback then works for the chat only, until new messages). **Delete chat** deletes a chat's store too. The switch is in `$DSH_HOME/storages/dsh-composer-plus/rollback.json`.
|
|
126
|
+
- **Turn rollback:** before each of your messages, the Host takes a git snapshot of the chat's folder in its own store, `$DSH_HOME/cache/composer-plus/rollback/<chat>.git` (owner-only folder). It holds copies of the files in that folder that git sees (not ignored files), so it is as private as the project. It reads your repository's objects (no copy of what git already has) and never writes your repository's index, `HEAD`, branches, tags, stash or config; the only change git makes there is a newer time stamp on object files it reuses (this delays their cleanup by `git gc`). A rollback with files writes only regular files inside the chat's folder; it skips symlinks, pipes and anything outside the folder. Nothing leaves your machine. You can delete the store while dsh is closed (rollback then works for the chat only, until new messages). **Delete chat** deletes a chat's store too. The switch is in `$DSH_HOME/storages/dsh-composer-plus/rollback.json`. A rollback with files also keeps the files as they were just before it (`refs/r/…` in the same store), for **Redo**; the rollbacks that were redone are listed in `$DSH_HOME/storages/dsh-composer-plus/redone.json` (owner-only).
|
|
124
127
|
- **Export chat as Markdown:** the Host half reads only the chat's own log (the same messages that dsh shows) and gives them to the page; it reads no project file and sends nothing over the network. The Markdown goes only to your clipboard or to the file that you save.
|
|
125
128
|
- **Delete chat:** moves the chat's own log folders (`$DSH_HOME/sessions/<project>/<chat>`) to the Trash. It does not touch the project folder.
|
|
126
|
-
- **Allow for this chat:** grants are stored in `$DSH_HOME/storages/dsh-composer-plus/grants.json` (owner-only permissions). A grant covers one exact tool in one chat. If that tool can write, the grant covers any write too. Revoke it from the header chip.
|
|
129
|
+
- **Allow for this chat:** grants are stored with the time they were given in `$DSH_HOME/storages/dsh-composer-plus/chat-grants.json` (owner-only permissions). A grant covers one exact tool in one chat, until the time limit ends (1 hour by default). If that tool can write, the grant covers any write too. Revoke it from the header chip.
|
|
127
130
|
- Auto Review still runs on every call; review failures are never auto-allowed.
|
|
128
|
-
- **Mobile connect:** off until you switch it on. While it is on, the Host half runs the Tether gateway: HTTPS on port 19390 that accepts only your Wi-Fi subnet and your tailnet (100.64.0.0/10), and a pairing page on `127.0.0.1:19391` (this Mac only). A phone needs a one-time code from the QR code (5 minutes) and your **Approve** on the Mac. The phone pins the gateway's certificate. The Mac keeps only a hash of each phone's token (30 days, renewed while used); **Remove** closes that phone's connections at once. Phones can call only an allowlist of dsh methods (chats, prompts, attachments, slash commands, approvals, questions, models, agents, goals), not settings, credentials, the file browser or the terminal. Data: `$DSH_HOME/storages/dsh-composer-plus/mobile
|
|
131
|
+
- **Mobile connect:** off until you switch it on. While it is on, the Host half runs the Tether gateway: HTTPS on port 19390 that accepts only your Wi-Fi subnet and your tailnet (100.64.0.0/10), and a pairing page on `127.0.0.1:19391` (this Mac only). A phone needs a one-time code from the QR code (5 minutes) and your **Approve** on the Mac. The phone pins the gateway's certificate. The Mac keeps only a hash of each phone's token (30 days, renewed while used); **Remove** closes that phone's connections at once. Phones can call only an allowlist of dsh methods (chats, prompts, attachments, slash commands, approvals, questions, models, agents, goals), not settings, credentials, the file browser or the terminal. **Tailscale only** refuses every connection from the local network, also open ones. The access log keeps the newest 200 connection attempts (time, IP address, device name, allowed or refused, and why) in `access.json`; it never holds a token or a pairing code. Data: `$DSH_HOME/storages/dsh-composer-plus/mobile/` (owner-only files). Details: [tether/README.md](tether/README.md).
|
|
129
132
|
- **Updates:** the Host half asks `api.github.com` for the latest release and `registry.npmjs.org` for that exact version; nothing about you or your chats is sent. Installation uses dsh's plugin manager (`pnpm add dsh-composer-plus@<version>`; when dsh 0.2.1 refuses that for an installed plugin, `pnpm add https://registry.npmjs.org/dsh-composer-plus/-/dsh-composer-plus-<version>.tgz`, and the profile then lists that URL as the plugin's source), so dsh's own registry, script and version-compatibility checks apply. Pre-release tags and older versions are never installed.
|
|
130
133
|
- **Next message prediction:** on by default; switch it off in **Settings → Composer Plus** to stop these model calls. After each finished turn, the Host half sends the chat's own user messages and the agent's text replies (no tool output, no hidden context, no reasoning), at most about 6,000 characters (the newest part), to the chosen model (dsh's default unless you pick another). It goes through dsh's own provider settings, as one request. Nothing is saved in the chat: the guess is not added to the chat history. The switch and the model choice are in `$DSH_HOME/storages/dsh-composer-plus/predict.json` (owner-only file).
|
|
131
134
|
- **Complete while typing:** off until you switch it on. While it is on, at each pause while you type, the Host half sends the text that you typed so far and the chat's own user messages and agent text replies (no tool output, no hidden context, no reasoning), at most about 3,000 characters of chat, to the model chosen under **Complete while typing** (by default the model of **Next message prediction**). A newer pause stops the older request. Nothing is saved in the chat. The switch is in `$DSH_HOME/storages/dsh-composer-plus/complete.json` (owner-only file).
|
|
@@ -142,8 +145,9 @@ Tested on dsh `0.2.0-rc.2` (desktop and web) and `0.2.1-rc.2` (web). CI runs the
|
|
|
142
145
|
- **No ↶ button on my messages:** Turn rollback is off, the chat is a subagent chat, or dsh-rewind-plugin is installed (use its ↶ button). After an update, restart dsh.
|
|
143
146
|
- **Chat and files is greyed out:** the project is not a git repository, there is no snapshot from before that message (the message is older than the plugin, or one of the 50 newest snapshots replaced it), or no file changed.
|
|
144
147
|
- **Delete says another dsh has this chat open:** a second dsh on the same dsh home holds the chat's lock. Close that window or dsh, then delete again. The chat stays archived meanwhile.
|
|
148
|
+
- **My iPhone cannot connect after I switched on Tailscale only:** Tailscale must be on in both the Mac and the iPhone. The Mobile connect panel warns when it is off on the Mac. The access log shows each refused attempt with its reason.
|
|
145
149
|
- **A chat did not continue after a restart:** Resume after restart was off when dsh quit, you stopped that turn yourself, the turn had ended (done or failed), the chat was archived, or more than 20 chats were running (the newest 20 continue).
|
|
146
|
-
- **Install fails right after a release:** add the version (`dsh-composer-plus@1.
|
|
150
|
+
- **Install fails right after a release:** add the version (`dsh-composer-plus@1.13.0`), see the install note above.
|
|
147
151
|
|
|
148
152
|
## Limits
|
|
149
153
|
|
|
@@ -159,9 +163,14 @@ Tested on dsh `0.2.0-rc.2` (desktop and web) and `0.2.1-rc.2` (web). CI runs the
|
|
|
159
163
|
- **Delete chat** needs dsh's archive (dsh 0.2.0 and later). A chat (or one of its subagent chats) that does not stop within 15 s, or that another dsh holds, stays archived and nothing moves. On other systems than macOS the trash folder must be on the same disk as the chat history. An open chat that you delete stays in dsh's memory, archived and hidden, until dsh restarts. Empty the Trash yourself; dsh does not.
|
|
160
164
|
- dsh's queue has no `move` action, so the plugin's Host moves the queued message itself in dsh's queue (one change, the same message). Messages with images or files move too. Only your own messages move: a goal round or a question reply in the queue stays where it is. If a message starts to send while you drag, nothing moves and a notice says so.
|
|
161
165
|
- dsh 0.2.1 loads an update at once when the new version changes no dsh settings; otherwise, and on dsh 0.2.0, restart dsh to load it. The plugin never restarts dsh for you. Web/CLI profiles without dsh's plugin manager only report a new version.
|
|
166
|
+
- **Allow for this chat** counts the time limit from the moment of the grant. A new time limit applies at once to the grants that run, so a shorter one can end them at once. Grants from version 1.12 and earlier have no time: after the update, the agent asks once again for those tools.
|
|
162
167
|
- **Keep composer focus** gives the focus back only after a `/` command or skill. While dsh resolves the command, the composer stays read-only for a few milliseconds, so keys pressed in that time are lost. If dsh's `/` menu is still open, `Enter` picks the highlighted row and does not send.
|
|
163
|
-
- **Mobile connect** works on macOS only (it uses `en0`, `openssl`, `swift` and `dns-sd`). It uses fixed ports 19390 and 19391, so only one dsh on each Mac can run it at a time (each Mac is one entry in the phone's Mac list). The phone gets notifications only while Tether is open or just went to the background (no push service). The iOS app is not on the App Store yet: build it from `tether/ios` with Xcode. Tether's green dots follow the Mac: a chat that you open in dsh loses its dot on the phone too. A chat that you open in Tether loses its dot on the phones only; dsh's own dot on the Mac stays until you open the chat there.
|
|
164
|
-
- A session link works inside chats; clicking it does not open the chat.
|
|
168
|
+
- **Mobile connect** works on macOS only (it uses `en0`, `openssl`, `swift` and `dns-sd`). It uses fixed ports 19390 and 19391, so only one dsh on each Mac can run it at a time (each Mac is one entry in the phone's Mac list). The phone gets notifications only while Tether is open or just went to the background (no push service). The iOS app is not on the App Store yet: build it from `tether/ios` with Xcode. **Tailscale only** still needs a Wi-Fi or Ethernet address on the Mac (the gateway starts only with one). The access log is per Mac and keeps only the newest 200 attempts; a repeated attempt within a minute counts up one row. Tether's app lock does not hide notification previews on the iPhone Lock Screen: turn them off in iOS Settings. Tether's green dots follow the Mac: a chat that you open in dsh loses its dot on the phone too. A chat that you open in Tether loses its dot on the phones only; dsh's own dot on the Mac stays until you open the chat there.
|
|
169
|
+
- A session link works inside chats; clicking it does not open the chat. A **Copy message link** link opens its message only on dsh 0.2.1 and later, and only from a message in a chat (dsh 0.2.0 has no user-text rules, so there the link is copied but shows as plain text). A message that a rollback took out, or that compaction removed from the history that dsh loads, cannot be shown: the link then says so. The 🔗 buttons attach to dsh's message rows; if a dsh update changes that markup, they do not show.
|
|
170
|
+
- **Mark all as read** changes dsh's own unread dots through a part of dsh that is not a public API (the `completionUnread` list of dsh's session status). If a dsh update renames it, the item does not show. The item goes into dsh's project "…" menu, which has no slot for plugins; if dsh changes that menu, the item does not show either.
|
|
171
|
+
- **Edit queued message in place** opens dsh's own queue editor, so it has its limits: a message with images or files cannot be edited, and a message that started to send meanwhile is not changed (dsh shows its own error).
|
|
172
|
+
- **Redo** never changes the rolled-back chat: it starts a new chat from just before the rollback (dsh's own fork, the same model context), so the new chat has a new id and title. Only the newest rollback of a chat can be redone, once, and only while nothing came after it (a new message ends the offer). A file that you changed after the rollback is kept unless you tick the box that overwrites it. Redo needs the snapshot that the rollback kept (the same 50-entry window); a rollback made before this version, or with **Chat only**, brings back the messages only.
|
|
173
|
+
- **This chat** counts only files that dsh's file tools (`write`, `edit`, `str_replace_editor`) wrote. Files that a command (`bash`) changed are not in this view; they show under **Uncommitted**. Without a Turn rollback snapshot of the chat (Turn rollback off, dsh-rewind-plugin installed, or a chat older than the plugin), the view compares with the last commit and says so. Turn rollback keeps the 50 newest snapshots of a chat: in a longer chat, the view compares with the oldest kept one, says from which message, and does not count earlier changes. **Hide whitespace changes** is `git diff -w`: a line that changed only in spaces inside it is hidden too.
|
|
165
174
|
- A notification sent before a restart only brings dsh to the front when clicked.
|
|
166
175
|
- Active projects are moved with dsh's saved project order, so the new order is kept after a restart. Chats outside any project ("Ungrouped") can't be moved; dsh always lists them last.
|
|
167
176
|
- dsh has no extension point in the sidebar's view options menu, so the recent projects option is added to dsh's own menu. If a dsh update changes that menu, the option is not shown and all projects stay visible. The filter works on project rows, so **In one list** is not filtered. Use it with **WorkSpace**: in **Workspace Tree**, a hidden parent folder also hides the active projects inside it. **By status** has the same kind of limit: dsh has no order slot, so the item and the row order attach to dsh's menu and list markup.
|
|
@@ -198,7 +207,21 @@ Tested on dsh `0.2.0-rc.2` (desktop and web) and `0.2.1-rc.2` (web). CI runs the
|
|
|
198
207
|
|
|
199
208
|
**How do I reorder queued messages in dsh?** Drag the ⠿ grip on a queued message, or focus it and press `↑` / `↓`.
|
|
200
209
|
|
|
201
|
-
**How do I
|
|
210
|
+
**How do I fix a typo in a queued message?** Double-click the message in the queue, change the text and press `Enter` (`Esc` cancels). It keeps its place in the queue.
|
|
211
|
+
|
|
212
|
+
**How do I clear all unread dots of a project at once?** Sidebar → the project's **…** button → **Mark all as read**.
|
|
213
|
+
|
|
214
|
+
**Can I link to one message in a long chat?** Yes: hover the message and click **🔗**. Send the link in a chat: on dsh 0.2.1 and later a click on it opens the chat at that message.
|
|
215
|
+
|
|
216
|
+
**I rolled back a turn by mistake. Can I get it back?** Yes, with **Redo** above the composer, right after the rollback: it starts a new chat from just before the rollback with the same messages, and **Chat and files** also puts the files back.
|
|
217
|
+
|
|
218
|
+
**How do I see only the files that one chat changed?** Right sidebar → **Changes** → **This chat**. Click **␣** to hide changes that are only whitespace.
|
|
219
|
+
|
|
220
|
+
**How do I stop Auto Review asking about the same tool in one chat?** Click **Allow for this chat** on the approval card. It covers that exact tool in that chat only, for 1 hour by default; revoke it from the header chip. Change the time in **Settings → Composer Plus → Allow for this chat**.
|
|
221
|
+
|
|
222
|
+
**I lost my iPhone. How do I stop it from reaching my Mac?** Click **Mobile connect** at the bottom left of the sidebar and click **Remove** next to that iPhone. Its key stops working at once; it can come back only with a new pairing that you approve on the Mac.
|
|
223
|
+
|
|
224
|
+
**Can I lock Tether with Face ID?** Yes: in Tether, **Settings → Privacy → Lock with Face ID**. Tether then asks for Face ID (or the passcode) when it opens and when you come back to it.
|
|
202
225
|
|
|
203
226
|
**How do I show only the projects I used today in the dsh sidebar?** Sidebar → view options (sliders icon) → **Active in the last 2 hours**. Select it again to show all projects.
|
|
204
227
|
|