dsh-input-traffic 0.2.8 → 0.2.10-beta.1
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/CHANGELOG.ja.md +78 -0
- package/CHANGELOG.ko.md +78 -0
- package/CHANGELOG.md +92 -0
- package/INSTALL.ja.md +151 -0
- package/INSTALL.ko.md +151 -0
- package/INSTALL.md +152 -0
- package/INSTALL.zh.md +151 -0
- package/README.en.md +63 -7
- package/README.ja.md +187 -0
- package/README.ko.md +181 -0
- package/README.md +86 -10
- package/dsh.plugin.json +13 -0
- package/lib/client.js +1433 -1338
- package/lib/client.js.map +1 -1
- package/lib/types/client/freeze-button.d.ts +16 -9
- package/lib/types/client/freeze-button.d.ts.map +1 -1
- package/lib/types/client/freeze-button.js +86 -55
- package/lib/types/client/freeze-button.js.map +1 -1
- package/lib/types/client/freeze-store.d.ts +17 -10
- package/lib/types/client/freeze-store.d.ts.map +1 -1
- package/lib/types/client/freeze-store.js +54 -38
- package/lib/types/client/freeze-store.js.map +1 -1
- package/lib/types/client/index.d.ts +47 -24
- package/lib/types/client/index.d.ts.map +1 -1
- package/lib/types/client/index.js +117 -79
- package/lib/types/client/index.js.map +1 -1
- package/lib/types/client/locales.d.ts +63 -58
- package/lib/types/client/locales.d.ts.map +1 -1
- package/lib/types/client/locales.js +211 -105
- package/lib/types/client/locales.js.map +1 -1
- package/lib/types/client/session-guard-bridge.d.ts +18 -0
- package/lib/types/client/session-guard-bridge.d.ts.map +1 -0
- package/lib/types/client/session-guard-bridge.js +42 -0
- package/lib/types/client/session-guard-bridge.js.map +1 -0
- package/lib/types/client/steer-queue-dock.d.ts +9 -1
- package/lib/types/client/steer-queue-dock.d.ts.map +1 -1
- package/lib/types/client/steer-queue-dock.js +6 -5
- package/lib/types/client/steer-queue-dock.js.map +1 -1
- package/package.json +15 -7
package/README.ko.md
ADDED
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
<p align="center">
|
|
2
|
+
<strong>DeepSeek Harness Web GUI용 3단계 입력 트래픽 제어</strong>
|
|
3
|
+
</p>
|
|
4
|
+
<p align="center">
|
|
5
|
+
<a href="README.en.md">English</a> · <a href="README.md">中文</a> · <a href="README.ja.md">日本語</a> · <strong>한국어</strong>
|
|
6
|
+
</p>
|
|
7
|
+
<p align="center">
|
|
8
|
+
<a href="LICENSE"><img alt="MIT License" src="https://img.shields.io/badge/license-MIT-263146?style=flat-square"></a>
|
|
9
|
+
<img src="https://camo.githubusercontent.com/2c11fb2e0e14bb9985c5acbe61123a7441c5ee63aa27fa6e04e2a707ebfd6022/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6473682d2d706c7567696e2d72656164792d3437384342463f6c6f676f3d646565707365656b266c6f676f436f6c6f723d7768697465" alt="dsh-plugin" style="max-width: 100%;">
|
|
10
|
+
<img alt="Public beta" src="https://img.shields.io/badge/status-public%20beta-7da1de?style=flat-square">
|
|
11
|
+
</p>
|
|
12
|
+
|
|
13
|
+
# dsh-input-traffic
|
|
14
|
+
|
|
15
|
+
- [English README](./README.en.md)
|
|
16
|
+
- [中文 README](./README.md)
|
|
17
|
+
- [日本語 README](./README.ja.md)
|
|
18
|
+
- [한국어 README](./README.ko.md)
|
|
19
|
+
- [Installation guide](./INSTALL.md)
|
|
20
|
+
- [中文安装指南](./INSTALL.zh.md)
|
|
21
|
+
- [日本語インストールガイド](./INSTALL.ja.md)
|
|
22
|
+
- [한국어 설치 안내](./INSTALL.ko.md)
|
|
23
|
+
- [Changelog](./CHANGELOG.md)
|
|
24
|
+
- [日本語 changelog](./CHANGELOG.ja.md)
|
|
25
|
+
- [한국어 changelog](./CHANGELOG.ko.md)
|
|
26
|
+
|
|
27
|
+
> **호환성 참고:** `ja`와 `ko` 사전이 포함되어 있지만, 현재 공식 DSH 릴리스는 `LocaleRuntime`을 통해 `zh`와 `en`만 제공합니다. 순정 DSH에서 `ja` 또는 `ko`를 선택하면 `locale "<id>" is not registered` 오류가 발생합니다. 공식 DSH가 해당 locale ID를 추가할 때까지 사용할 수 없습니다. 고급 사용자는 DSH 포크를 유지하면서 `packages/client/locale/src/locale-settings.ts`의 `LOCALE_IDS`와 `packages/client/locale/src/client/index.ts`의 `LOCALES` 라벨을 업데이트하고 핵심 사전과 테스트를 추가한 뒤 다시 빌드하여 실행할 수 있습니다. 이 플러그인만으로는 DSH의 전역 locale 목록을 확장할 수 없습니다.
|
|
28
|
+
|
|
29
|
+
> 에이전트가 바쁠 때 "중단" 또는 "대기" 둘 중 하나가 아닙니다: 빨간색은 즉시 중단 후 전송, 노란색은 다음 턴에 삽입, 초록색은 끝까지 대기 — 3단계가 공존합니다. DeepSeek 피크 과금 시간대가临近하면 원클릭으로 세션을 동결하고 오피크에 재개합니다.
|
|
30
|
+
|
|
31
|
+
`dsh plugin` 명령으로 조립 + 번들 패치로 장착하는 cordis 클라이언트 플러그인. dsh 소스 변경이나 PR이 필요 없습니다.
|
|
32
|
+
|
|
33
|
+
> 💡 **"세션 동결"이 권장되는 이유**: DeepSeek는 2026-08-17부터 **피크/오피크 과금**을 시행합니다 — 피크 시간대(베이징 시간 9:00-12:00, 14:00-18:00) 단가는 오피크(나머지 시간대, 주간·야간·주말·공휴일 포함)의 **2배**입니다. 장시간 실행되는 세션이 비싼 시간대를跨越하면, 수동으로 동결하여 API 소비를 일시 정지하고 오피크에 재개하면 비용을 최대 **50%** 절감할 수 있습니다.
|
|
34
|
+
>
|
|
35
|
+
> **권장 구성**: **알림** 플러그인([dsh-notify](https://github.com/zhengjy01/dsh-notify), 동결/재개 시점 데스크톱 알림)과 **과금 통계** 플러그인([dsh-deepseek-usage](https://github.com/yyb16yyb-hub/dsh-deepseek-usage), [dsh-cost-tracker](https://github.com/yflmq001/dsh-cost-tracker), [dsh-billing-balance](https://github.com/YZz-S/dsh-billing-balance), 동결 전후 실제 지출 확인)을 함께 사용하여 "알림 → 동결 → 오피크 재개 → 정산" 절약 루ープ를 실현합니다.
|
|
36
|
+
|
|
37
|
+
## 기능概要
|
|
38
|
+
|
|
39
|
+
- **3단계 삽입 공존**: 에이전트가 바쁠 때 모든 입력은 먼저 대기 영역에 들어가고, 대화에 들어가는 시기를 선택할 수 있습니다 — "중단" 또는 "대기" 단일 선택이 아닙니다:
|
|
40
|
+
- 🔴 **빨간색(now)**: 현재 턴을 중단하고 즉시 전송 — 실행 중인 생성이 중지되고 메시지가 에이전트에 의해 즉시 처리되어 응답됩니다;
|
|
41
|
+
- 🟡 **노란색(next)**: 다음 자연스러운 턴에 삽입 — 현재 액션(도구 호출/실행 중인 생성)이 완료된 후 삽입;
|
|
42
|
+
- 🟢 **초록색(later)**: 논리 전체 실행 후 입력 — 대기열에서 이전 입력의 모든 액션이 완료된 후 처리(기본값).
|
|
43
|
+
- **노란색은 취소 가능**: 이미 삽입된(노란색) 메시지에 초록 버튼을 누르면 삽입을 취소하고 대기열로 되돌릴 수 있습니다.
|
|
44
|
+
- **대기열 내용 편집 가능**: 대기열에 있는 메시지를 직접 편집할 수 있습니다 — 멀티라인 에디터가 내용에 따라 자동 확장되어 긴 메시지도 완전히 표시됩니다(Enter 저장 / Shift+Enter 줄바꿈 / Esc 취소).
|
|
45
|
+
- **대기열 관리**: 대기영역의 메시지는 **위로/아래로 이동**하여 순서 변경, 삭제, "취소 후 전체 지우기"가 가능합니다.
|
|
46
|
+
- **편집 시 내용 손실 없음**: 저장 실패 시(에이전트가 이미 메시지를 가져간 경우), 편집 내용은 자동으로 컴포저로 돌아갑니다.
|
|
47
|
+
- **피크 시간 동결**: 입력창 우측 "세션 동결" 버튼 — DeepSeek 피크 과금 시간대(9:00-12:00, 14:00-18:00)에 가까워지면 API 소비를 일시 정지: 현재 턴이 자연스럽게 완료된 후 일시 정지, 미전송 대기열은 동결 저장; "세션 재개"로 오피크에 처리 계속.
|
|
48
|
+
- **세션 격리 동결**: 동결 대기열은 **sessionId로 격리** — 한 세션의 동결은 다른 세션에 영향을 주지 않습니다.
|
|
49
|
+
- **공식 동작 오버라이드**: 플러그인 활성 시 공식 설정 패널의 "바쁜 동안 Enter 키 동작" 설정 행이 숨겨집니다(Enter 동작은 초록 대기열로 고정).
|
|
50
|
+
- **주야 자동 적응**: 대기열 프레임과 동결 버튼은 모두 dsh 공식 시맨틱 토큰(`--dsw-alias-*`)을 사용하며 시스템 다크모드 / dsh 다크 테마를 자동 추적합니다.
|
|
51
|
+
|
|
52
|
+
## 3단계 의미론
|
|
53
|
+
|
|
54
|
+
| 단계 | 색상 | 의미론 | 하위 메커니즘(dsh 기존 RPC 조합) |
|
|
55
|
+
|---|---|---|---|
|
|
56
|
+
| **later** (기본값) | 초록 | 대기: 이전 입력의 모든 액션이 완료된 후 처리; 삽입된(노란색) 메시지에 초록 = **삽입 취소, 대기열로 복귀** | Enter 기본 queue → `agent.followup()` (next-turn); 취소 = `updateQueue(remove)` + `send(text)` |
|
|
57
|
+
| **next** | 노랑 | 다음 자연스러운 턴에 삽입: 현재 액션 완료 후 | `updateQueue(id, { kind: 'steer' })` → `agent.steer()` (next-step 경계) |
|
|
58
|
+
| **now** | 빨강 | 중단 후 전송: 현재 턴 중지, 메시지 즉시 처리 | `cancel()` → `updateQueue(remove)` (inbox 중복 삽입 거부 회피) → `send(text)` (재전송, 드라이버 즉시 깨우기) |
|
|
59
|
+
|
|
60
|
+
## 세션 동결 / 재개 (피크 시간대 일시정지) ⭐ 권장
|
|
61
|
+
|
|
62
|
+
> **절약 포지셔닝**: 본 플러그인의 DeepSeek 피크/오피크 과금(2026-08-17 시행)에 대한 **핵심 권장 기능**입니다 — 피크 시간대 단가 2배, 오피크는 반값. 수동 동결로 긴급하지 않은 생성을 "일시정지"하고 오피크에 재개하면 비싼 시간대를 직접 회피합니다.
|
|
63
|
+
>
|
|
64
|
+
> **권장 구성**: **알림** 플러그인([dsh-notify](https://github.com/zhengjy01/dsh-notify)) 피크 진입/이탈 시 알림; **과금 통계** 플러그인([dsh-deepseek-usage](https://github.com/yyb16yyb-hub/dsh-deepseek-usage), [dsh-cost-tracker](https://github.com/yflmq001/dsh-cost-tracker), [dsh-billing-balance](https://github.com/YZz-S/dsh-billing-balance)) 동결 전후 실제 지출 확인.
|
|
65
|
+
|
|
66
|
+
- **동결**: 현재 턴은 **중단되지 않고** 자연스럽게 완료된 후 일시정지; 대기열은 동결과 **분리** — 동결은 에이전트 소비(실행/삽입/추가)만 중지하고 대기 영역은 표시된 채 **완전히 조작 가능**;
|
|
67
|
+
- **재개**: (수정된) 대기열이 재전송되고 **각 항목은 예정된 단계로 실행** (빨강=중단 후 즉시 처리, 노랑=삽입, 초록=대기열); 에이전트는 FIFO 계속;
|
|
68
|
+
- **세션 격리**: 동결 상태와 분리된 대기열은 **sessionId로 격리** — 세션 A의 동결은 세션 B의 배너/버튼/대기열에 영향 없음;
|
|
69
|
+
- **엔진**: 동결 = `updateQueue/remove)`로 각 행 분리(단계별 복사본은 플러그인 store에 세션별 저장), 현재 턴이 pending 없이 자연 정지; 재개 = 먼저 `sessionGuard.resume(sessionId)`, 그 후 `send(text)`로 재전송하여 드라이버 깨우기(빨간 단계는 `cancel()` 후 전송);
|
|
70
|
+
- 주의: 이미지 등 비텍스트 내용이 포함된 대기열 메시지는 재전송 불가하며, 동결 시 대기열에서 해제됩니다(복원되지 않음).
|
|
71
|
+
|
|
72
|
+
## 대기열 관리
|
|
73
|
+
|
|
74
|
+
대기영역 각 행(미동결 시)은 다음 작업을 제공:
|
|
75
|
+
|
|
76
|
+
| 작업 | 설명 |
|
|
77
|
+
|---|---|
|
|
78
|
+
| 위로/아래로 이동 | FIFO 순서 재구성(이미지 메시지가 대기열에 있으면 비활성화) |
|
|
79
|
+
| **드래그로 재정렬** | 행을 드래그하여 대상 위치로 이동(네이티브 HTML5 DnD) |
|
|
80
|
+
| 컴포저로 되돌려 편집 | 메시지 내용을 컴포저 초안으로 복귀 |
|
|
81
|
+
| 편집/삭제 | 멀티라인 에디터로 직접 편집/취소 |
|
|
82
|
+
| 빨간/노란/초록 계획 | "3단계 의미론" 참조 |
|
|
83
|
+
| 취소 후 전체 지우기 | 2단계 확인 후 실행 중지 + 전체 대기열 삭제 |
|
|
84
|
+
|
|
85
|
+
## 주야 모드(자동 다크 적응)
|
|
86
|
+
|
|
87
|
+
대기열 프레임과 동결 버튼은 모두 dsh 공식 시맨틱 토큰(`--dsw-alias-*`)을 사용하며, 다크모드에서 **다크그레이 배경 + 흰색 반전 텍스트**로 자동 전환. 설정 불필요.
|
|
88
|
+
|
|
89
|
+
## 설치
|
|
90
|
+
|
|
91
|
+
```sh
|
|
92
|
+
# 방법 1: npm에서 설치(권장, 안정 버전)
|
|
93
|
+
dsh plugin --profile web add dsh-input-traffic -w
|
|
94
|
+
|
|
95
|
+
# 방법 2: GitHub에서 직접 설치(drscrewdriver 포크 전용)
|
|
96
|
+
dsh plugin --profile web add github:drscrewdriver/dsh-input-traffic#main
|
|
97
|
+
|
|
98
|
+
# 방법 3: 로컬 경로로 조립
|
|
99
|
+
# dsh plugin --profile web add /absolute/path/to/dsh-input-traffic -w
|
|
100
|
+
|
|
101
|
+
# 확인
|
|
102
|
+
dsh web --dump-config | grep -B1 -A2 'input-traffic'
|
|
103
|
+
|
|
104
|
+
# dsh web 재시작(필수!)
|
|
105
|
+
dsh web
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
> ⚠️ **GitHub 네트워크 도달성**: github: 직접 설치는 github.com 연결이 필요합니다. 네트워크 제한이 있는 경우 프록시 또는 미러 가속기를 설정하세요.
|
|
109
|
+
|
|
110
|
+
상세는 [INSTALL.ko.md](./INSTALL.ko.md)를 참조하세요.
|
|
111
|
+
|
|
112
|
+
## 개발(TDD + Lint)
|
|
113
|
+
|
|
114
|
+
```sh
|
|
115
|
+
npm run tdd # vitest watch: 변경 시 재실행, 빨강→초록 루프
|
|
116
|
+
npm run lint # ESLint flat config
|
|
117
|
+
npm run lint:fix # 자동 수정
|
|
118
|
+
npm run verify # 통합 게이트: lint + test + build + verify-assembly
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
## 사용법
|
|
122
|
+
|
|
123
|
+
1. 에이전트가 바쁠 때 직접 입력하여 전송 — 메시지는 **대기 영역에 진입**(기본 초록 대기열);
|
|
124
|
+
2. 메시지에 계획 버튼을 누릅니다:
|
|
125
|
+
- 🟡 노랑 = 삽입 — 현재 액션 완료 후 삽입;
|
|
126
|
+
- 🔴 빨강 = 중단 — 현재 액션을 즉시 중지, 메시지가 즉시 처리;
|
|
127
|
+
- 🟢 초록 = 대기 유지(기본값); 삽입된 메시지에 초록 = 취소하여 대기열로 복귀;
|
|
128
|
+
3. 순서 변경/재편집: 위로/아래로 이동, 컴포저로 되돌리기, 또는 멀티라인 인라인 에디터(Enter 저장, Shift+Enter 줄바꿈);
|
|
129
|
+
4. **절약 핵심(권장)**: 피크 시간대(9:00-12:00, 14:00-18:00)에 가까워지면 "세션 동결"을 눌러 일시정지; 오피크에 "세션 재개"로 계속.
|
|
130
|
+
|
|
131
|
+
## 자주 묻는 질문
|
|
132
|
+
|
|
133
|
+
### 중단 후 메시지에 응답이 없음 / 대화 정지
|
|
134
|
+
|
|
135
|
+
과거 문제(수정 완료). 원인: harness inbox는 이미 대기 중인 메시지의 중복 삽입을 거부합니다. 중단 후 원본 메시지를 직접 steer하면 `"message is already pending"`으로 거부되어 메시지가 대기열에 고정되고 에이전트가 정지합니다. 현재 구현은 `cancel → remove → resend`(새 메시지로 재전송)입니다. 여전히 발생하면 플러그인을 최신 빌드하고 dsh web을 재시작하세요.
|
|
136
|
+
|
|
137
|
+
### 편집 저장 실패 후 내용은 어디로?
|
|
138
|
+
|
|
139
|
+
손실되지 않습니다. 저장 실패 시(에이전트가 이미 메시지를 가져간 경우), 편집 내용은 자동으로 컴포저로 돌아가 "편집 실패, 내용이 컴포저로 돌아갔습니다" 알림이 표시됩니다. 컴포저에 이미 초안이 있으면 덮어쓰지 않습니다.
|
|
140
|
+
|
|
141
|
+
### 설정 패널에 "바쁜 동안 Enter 키 동작"이 없음
|
|
142
|
+
|
|
143
|
+
정상입니다 — 플러그인이 오버라이드한 후 해당 설정 행이 숨겨지고 Enter 동작은 초록 대기열로 고정됩니다.
|
|
144
|
+
|
|
145
|
+
### 동결 후 대기열 메시지가 사라짐
|
|
146
|
+
|
|
147
|
+
정상입니다 — 동결은 대기열을 플러그인 store에 저장합니다(세션별 격리, 대기 영역에서 동결 리스트로 이동). 재개 후 다시 표시됩니다. **페이지 새로고침 시 동결 대기열은 손실됩니다** — 동결 중 새로고침하지 마세요.
|
|
148
|
+
|
|
149
|
+
### 위로/아래로 버튼 사용 불가
|
|
150
|
+
|
|
151
|
+
대기열에 이미지 등 비텍스트 메시지가 포함되어 있으면 재정렬이 비활성화됩니다(이미지 메시지는 재전송 불가). 컴포저로 되돌려 편집도 마찬가지.
|
|
152
|
+
|
|
153
|
+
## 제거
|
|
154
|
+
|
|
155
|
+
```sh
|
|
156
|
+
dsh plugin --profile web remove dsh-input-traffic
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
재시작 후 공식 대기열 dock과 "바쁜 동안 Enter 키 동작" 설정 행이 복원됩니다.
|
|
160
|
+
|
|
161
|
+
## 호환성 및 개인정보
|
|
162
|
+
|
|
163
|
+
- DeepSeek Harness와 web 프로필이 필요합니다. Windows/macOS/Linux dsh web에서 검증 완료.
|
|
164
|
+
- 플러그인은 브라우저 측(클라이언트) 전용 — 모든 작업은 dsh 기존 RPC를 통해 수행되며 **공식 소스를 변경하지 않습니다**.
|
|
165
|
+
- 플러그인은 세션 내용 이외의 데이터를 읽거나 업로드하지 않습니다. 동결 대기열은 브라우저 메모리에만 저장됩니다.
|
|
166
|
+
|
|
167
|
+
## drscrewdriver DSH Plugin Family
|
|
168
|
+
|
|
169
|
+
본 프로젝트는 [drscrewdriver](https://github.com/drscrewdriver)가 유지보수하는 DSH 플러그인 시리즈의 하나입니다:
|
|
170
|
+
|
|
171
|
+
| 플러그인 | 한 줄 설명 |
|
|
172
|
+
|---|---|
|
|
173
|
+
| **[dsh-input-traffic](https://github.com/drscrewdriver/dsh-input-traffic)** | DSH Web GUI 바쁜 시간 입력 대기열: 3단계 트래픽 제어, 드래그 재정렬, 세션 동결 |
|
|
174
|
+
| **[dsh-session-guard](https://github.com/drscrewdriver/dsh-session-guard)** | 피크 자동 세션 게이트: 주말 모드 + 피크 자동 일시정지 + 세션급 잠금 + 백엔드 자동 재시도 |
|
|
175
|
+
| [dsh-thinking-levels](https://github.com/drscrewdriver/dsh-thinking-levels) | 라운드별 reasoning_effort 제어: Auto 스케줄링 또는 수동 고정 |
|
|
176
|
+
| [dsh-seatbelt-sandbox](https://github.com/drscrewdriver/dsh-seatbelt-sandbox) | macOS Seatbelt 샌드박스 어댑터 |
|
|
177
|
+
| [dsh-switch-search](https://github.com/drscrewdriver/dsh-switch-search) | 사이드바 대화 검색 강화 |
|
|
178
|
+
|
|
179
|
+
## 라이선스
|
|
180
|
+
|
|
181
|
+
MIT
|
package/README.md
CHANGED
|
@@ -2,15 +2,41 @@
|
|
|
2
2
|
<strong>给 DeepSeek Harness Web GUI 一个三档输入交通管制</strong>
|
|
3
3
|
</p>
|
|
4
4
|
<p align="center">
|
|
5
|
-
<strong>中文</strong> · <a href="README.
|
|
5
|
+
<a href="README.en.md">English</a> · <strong>中文</strong> · <a href="README.ja.md">日本語</a> · <a href="README.ko.md">한국어</a>
|
|
6
6
|
</p>
|
|
7
7
|
<p align="center">
|
|
8
8
|
<a href="LICENSE"><img alt="MIT License" src="https://img.shields.io/badge/license-MIT-263146?style=flat-square"></a>
|
|
9
|
+
<img src="https://camo.githubusercontent.com/2c11fb2e0e14bb9985c5acbe61123a7441c5ee63aa27fa6e04e2a707ebfd6022/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6473682d2d706c7567696e2d72656164792d3437384342463f6c6f676f3d646565707365656b266c6f676f436f6c6f723d7768697465" alt="dsh-plugin" data-canonical-src="https://img.shields.io/badge/dsh--plugin-ready-478CBF?logo=deepseek&logoColor=white" style="max-width: 100%;">
|
|
9
10
|
<img alt="Public beta" src="https://img.shields.io/badge/status-public%20beta-7da1de?style=flat-square">
|
|
11
|
+
<a href="https://dshfind.com/zh/plugins/drscrewdriver/dsh-input-traffic?ref=badge"><img alt="dsh-input-traffic" src="https://dshfind.com/api/badge/drscrewdriver/dsh-input-traffic?lang=zh"></a>
|
|
10
12
|
</p>
|
|
11
13
|
|
|
12
14
|
# dsh-input-traffic
|
|
13
15
|
|
|
16
|
+
- [English README](./README.en.md)
|
|
17
|
+
- [中文 README](./README.md)
|
|
18
|
+
- [日本語 README](./README.ja.md)
|
|
19
|
+
- [한국어 README](./README.ko.md)
|
|
20
|
+
- [Installation guide](./INSTALL.md)
|
|
21
|
+
- [中文安装指南](./INSTALL.zh.md)
|
|
22
|
+
- [日本語インストールガイド](./INSTALL.ja.md)
|
|
23
|
+
- [한국어 설치 안내](./INSTALL.ko.md)
|
|
24
|
+
- [Changelog](./CHANGELOG.md)
|
|
25
|
+
- [日本語 changelog](./CHANGELOG.ja.md)
|
|
26
|
+
- [한국어 changelog](./CHANGELOG.ko.md)
|
|
27
|
+
|
|
28
|
+
> **▼ DSH 版本适配**
|
|
29
|
+
> | DSH 版本 | 队列条 / 冻结按钮 | 繁忙时 Enter 钉住 | 关键差异 |
|
|
30
|
+
> | --- | --- | --- | --- |
|
|
31
|
+
> | 0.1.1-rc.2 | ✅ | ✅ | `conversation.input.right` 仍带 `InputZone` owner(插件已不依赖) |
|
|
32
|
+
> | 0.1.2-rc.1 | ✅ | ✅ | 该槽改为无 owner(`InputBar.tsx:466` 传 `{}`);冻结按钮改读会话标准件 `useSession` |
|
|
33
|
+
>
|
|
34
|
+
> - **单一产物,运行时自适应**:同一份 `lib/client.js` 在两个版本都可用。客户端 bundle 只 `require` `react` / `react/jsx-runtime` / `@deepseek-ai/dsh-client-ui-primitives`,三者在两版的共享模块表内,不涉及 `dsh-client-runtime` → `dsh-client-store` 的改名。
|
|
35
|
+
> - **只消费两版共享面**:队列条在 `conversation.input.dock`(两版都带 `InputZone` owner,`input.draft` 两版都有);冻结按钮在 `conversation.input.right`,该槽 0.1.2 起不再传 owner,因此组件只读 `useSession` / `sessionId`——两者在两版 `SessionStandardProps` 中都有。
|
|
36
|
+
> - **队列条位置**:注册 `order: 1000`,排在 `conversation.input.dock` 带内所有已知条目(todo 0 / goal 10 / 官方 queue 20 / dsh-perm-gate 提示 30)之后,紧贴输入卡片。DSH 没有 "last" 语义,这是约定而非结构性保证——第三方插件若注册更大的 `order` 仍可能插到它下面。
|
|
37
|
+
|
|
38
|
+
> **兼容性说明:** v0.2.9 已包含日语(`ja`)和韩语(`ko`)字典,但当前官方 DSH 只通过 `LocaleRuntime` 提供 `zh` 和 `en`。在原版 DSH 中选择 `ja` 或 `ko` 会失败,并提示 `locale "<id>" is not registered`。需要等待官方 DSH 增加对应 locale ID 后才能正常使用。高级用户可以维护 DSH fork,在 `packages/client/locale/src/locale-settings.ts` 更新 `LOCALE_IDS`,在 `packages/client/locale/src/client/index.ts` 更新 `LOCALES` 标签,并补齐核心字典和测试,然后重新构建并运行 fork 版本。仅修改本插件无法扩展 DSH 的全局 locale 列表。
|
|
39
|
+
|
|
14
40
|
> 智能体忙碌时不再只有"打断"或"排队"二选一:红色打断立即输入、黄色下一轮插入、绿色排队到最后,三档并存;邻近 DeepSeek 高峰收费时段可一键冻结会话,错峰再恢复继续。
|
|
15
41
|
|
|
16
42
|
无需修改 dsh 源码、无需提 PR:`dsh plugin` 命令组装 + bundle patch 装配的 cordis client 插件。
|
|
@@ -21,6 +47,18 @@
|
|
|
21
47
|
|
|
22
48
|
## 它能做什么
|
|
23
49
|
|
|
50
|
+
> 实际运行截屏(Windows,dsh web):
|
|
51
|
+
|
|
52
|
+
<figure>
|
|
53
|
+
<img width="1600" alt="深色模式下的会话页:上方排队等待区显示『1 条排队消息』(🟢 排队 test1)与『取消并清空』;中央为花边样式输入框,提示 Cmd/Ctrl+Enter 插话发送全部排队消息;输入行右侧为『冻结会话』按钮、DeepSeek-V4-Flash 模型选择与发送控件" src="assets/dark-mode.png" />
|
|
54
|
+
<figcaption>深色模式(自动跟随系统 / dsh 暗色主题):排队等待区 + 输入行右侧「冻结会话」按钮。</figcaption>
|
|
55
|
+
</figure>
|
|
56
|
+
|
|
57
|
+
<figure>
|
|
58
|
+
<img width="1400" alt="浅色模式且会话已冻结的会话页:排队等待区出现『已冻结:当前轮次完成后暂停,排队消息将在恢复后继续』横幅及『取消并清空』;队列含测试1(🟢 排队)、测试2/测试3(🟡 插话中);输入行按钮切换为『恢复会话』" src="assets/light-mode.png" />
|
|
59
|
+
<figcaption>浅色模式 + 已冻结状态:高峰时段冻结后队列被冻结保存,输入行按钮切换为「恢复会话」,错峰再行处理。</figcaption>
|
|
60
|
+
</figure>
|
|
61
|
+
|
|
24
62
|
- **三档插入并存**:智能体忙碌时,每一条输入都先进入等待区,再按需选择何时进入对话——不再只有一个"打断"或只有一个"排队":
|
|
25
63
|
- 🔴 **红色(now)**:打断当前轮次并立即输入——当前生成停止,消息作为新输入被 agent 立刻处理并回复;
|
|
26
64
|
- 🟡 **黄色(next)**:下一自然轮插入——不打断当前执行,当前正在进行的动作(工具调用 / 本轮生成)结束后插入;
|
|
@@ -30,6 +68,7 @@
|
|
|
30
68
|
- **队列管理**:等待区的消息可以**上移 / 下移调整顺序**、删除,以及队列级「取消并清空」。
|
|
31
69
|
- **编辑不丢内容**:编辑保存失败(消息已被 agent 认领)时,编辑内容自动退回主输入框,不会丢失;主输入框已有内容时不覆盖。
|
|
32
70
|
- **高峰期冻结**:输入框右侧「冻结会话」按钮——邻近 DeepSeek 高峰收费时段(9:00-12:00、14:00-18:00)时主动暂停 API 消耗:当前轮次自然完成后暂停,未发送队列冻结保存;「恢复会话」后在非高价时间继续处理。
|
|
71
|
+
- **会话隔离冻结**:冻结队列按 **sessionId 隔离**——冻结一个会话不影响其他会话(各自独立的 frozen 标志与 detached 队列),多会话并行时互不串台(见「会话冻结 / 恢复」)。
|
|
33
72
|
- **接管官方行为**:插件生效时,官方设置面板的「繁忙时 Enter 键行为」设置行不再显示(Enter 行为固定为绿色排队)。
|
|
34
73
|
- **日夜自动适配**:队列框与冻结按钮全部改用 dsh 官方语义 token(`--dsw-alias-*`),自动跟随系统深色模式 / dsh 暗色主题——深色下自动变为**深灰底 + 白色反色字**,无需任何设置(见「日夜模式」)。
|
|
35
74
|
|
|
@@ -70,9 +109,22 @@
|
|
|
70
109
|
|
|
71
110
|
- **冻结**:当前轮次**不打断**、自然完成后暂停;**队列与冻结解耦**——冻结只停止 agent 消费(执行/插入/追加),等待队列保持可见且**完全可操作**(排序、编辑、删除、设定红/黄/绿插入档位),与未冻结无明显区别;
|
|
72
111
|
- **恢复**:按修改后的队列重新入队,**按每条预定的档位执行**(红=打断并立即处理,黄=插话,绿=排队),agent 按 FIFO 继续处理;
|
|
73
|
-
-
|
|
112
|
+
- **会话隔离**:冻结状态与 detached 队列按 **sessionId 键控**(`src/client/freeze-store.ts` 的 `Map<string, FreezeState>`)——A 会话冻结不影响 B 会话的 banner/按钮/队列;编辑只重渲染对应会话的消费者;
|
|
113
|
+
- **引擎实现**:冻结 = 逐条 `updateQueue(remove)` 分离队列(含档位的副本存于插件 store,按 sessionId 隔离),当前轮次完成后 driver 因无 pending 自然停止;冻结期间对队列的修改(文本/顺序/档位)实时写回 store;恢复 = 先 `await sessionGuard.resume(sessionId)`(被打断回合的自然下一步先发生),再逐条 `send(text)` 重新提交并唤醒 driver(红色档位的条目先 `cancel()` 再发送);
|
|
74
114
|
- 注意:含非文本内容(图片)的排队消息无法重发,冻结时会随队列释放(不会恢复)。
|
|
75
115
|
|
|
116
|
+
### 借助 dsh-session-guard 实现会话级锁定
|
|
117
|
+
|
|
118
|
+
冻结按钮触发时经 **sessionGuard 桥**(`src/client/session-guard-bridge.ts` → `POST /session-guard/rpc { action: stopNextTurn|resume, sessionId }`)透传服务端做**会话级锁定**;同时在前端 raise composer block(`conversation.blocks.set`),输入框变 inert、回车不再漏进对话:
|
|
119
|
+
|
|
120
|
+
- **引用组件指向**:
|
|
121
|
+
- `src/client/freeze-button.tsx` — 冻结/恢复控制(slot `conversation.input.right`);
|
|
122
|
+
- `src/client/steer-queue-dock.tsx` — 三档规划等待区 + 冻结横幅/冻结列表(slot `conversation.input.dock` id `queue`);
|
|
123
|
+
- `src/client/freeze-store.ts` — 会话级冻结状态 store(`Map<sessionId, {frozen, pending}>`,供按钮 ↔ dock 共享);
|
|
124
|
+
- `src/client/session-guard-bridge.ts` — session-guard RPC 透传(fail-open,未装则静默);
|
|
125
|
+
- `src/client/index.ts` — slot 注册 + composer block 注入(`conversation.blocks.set`)。
|
|
126
|
+
- **作用域对比**:本插件冻结按钮 = **会话级**(按 sessionId 锁那一个会话);session-guard **自动高峰门 = 全局**(入峰暂停全部、退峰自动恢复全部)。两者互补——自动门管全局、按钮管单会话。
|
|
127
|
+
|
|
76
128
|
## 队列管理
|
|
77
129
|
|
|
78
130
|
等待区每条消息(未冻结时)提供:
|
|
@@ -107,13 +159,17 @@
|
|
|
107
159
|
## 安装
|
|
108
160
|
|
|
109
161
|
```sh
|
|
110
|
-
# 方式一:从 npm
|
|
162
|
+
# 方式一:从 npm 安装(推荐,稳定发布)
|
|
111
163
|
# (profile 是 pnpm workspace root,add 需带 -w 参数)
|
|
112
164
|
dsh plugin --profile web add dsh-input-traffic -w
|
|
113
165
|
|
|
114
|
-
# 方式二:
|
|
166
|
+
# 方式二:GitHub 直装(drscrewdriver fork 专属,先试用新功能)
|
|
167
|
+
# (本仓库未提交 lib/,装后需在 profile 内现场构建:
|
|
168
|
+
# cd ~/.dsh/profiles/web/node_modules/dsh-input-traffic && npm install --legacy-peer-deps && npm run build)
|
|
169
|
+
dsh plugin --profile web add github:drscrewdriver/dsh-input-traffic#main
|
|
170
|
+
|
|
171
|
+
# 方式三:本地路径组装
|
|
115
172
|
# dsh plugin --profile web add /absolute/path/to/dsh-input-traffic -w
|
|
116
|
-
# (git 安装后需在 profile 的 node_modules 内现场构建:npm install --legacy-peer-deps && npm run build)
|
|
117
173
|
|
|
118
174
|
# 确认组合树包含新行
|
|
119
175
|
dsh web --dump-config | grep -B1 -A2 'input-traffic'
|
|
@@ -122,13 +178,15 @@ dsh web --dump-config | grep -B1 -A2 'input-traffic'
|
|
|
122
178
|
dsh web
|
|
123
179
|
```
|
|
124
180
|
|
|
181
|
+
> ⚠️ **GitHub 网络可达性**:github: 直装需要能连通 github.com;网络受限时请先配置可用代理或镜像加速,否则 add 会在拉取阶段卡住。
|
|
182
|
+
|
|
125
183
|
本地构建与测试:
|
|
126
184
|
|
|
127
185
|
```sh
|
|
128
186
|
npm install --legacy-peer-deps # @deepseek-ai client 包链在 npm 上不完整,仅装工具链
|
|
129
187
|
npm run build # tsc(lib/types)+ tsdown(lib/index.js + lib/client.js)
|
|
130
188
|
node examples/verify-assembly.mjs # 12 项装配断言
|
|
131
|
-
npm test #
|
|
189
|
+
npm test # 50 项 vitest 组件测试
|
|
132
190
|
npm run lint # ESLint(src + tests,flat config)
|
|
133
191
|
npm run verify # 一体化门禁:lint + test + build + verify-assembly
|
|
134
192
|
```
|
|
@@ -146,7 +204,7 @@ npm run tdd # vitest watch:改动即重跑,红→绿闭环
|
|
|
146
204
|
1. 在 `tests/` 新增/修改用例(红:确认新行为尚未实现);
|
|
147
205
|
2. `npm run tdd` 观察失败;
|
|
148
206
|
3. 在 `src/` 最小实现(绿);
|
|
149
|
-
4. `npm run verify` 全绿后提交(lint +
|
|
207
|
+
4. `npm run verify` 全绿后提交(lint + 50 测试 + 构建 + 12 项装配断言)。
|
|
150
208
|
|
|
151
209
|
Lint 说明:
|
|
152
210
|
|
|
@@ -184,7 +242,11 @@ npm run lint:fix # 自动修复可修复项
|
|
|
184
242
|
|
|
185
243
|
### 冻结后排队消息消失了
|
|
186
244
|
|
|
187
|
-
|
|
245
|
+
正常——冻结会把队列保存到插件 store(按 sessionId 隔离,从等待区移入冻结列表),恢复后重新出现。**刷新页面会丢失冻结队列**,请避免冻结后刷新。
|
|
246
|
+
|
|
247
|
+
### 冻结一个会话会影响其他会话吗
|
|
248
|
+
|
|
249
|
+
不会。冻结队列按 **sessionId 隔离**(`freeze-store.ts` 的 `Map<sessionId, …>`)——冻结 A 会话不影响 B 会话的冻结按钮/横幅/队列;编辑 A 的冻结队列只重渲染 A 的消费者。
|
|
188
250
|
|
|
189
251
|
### 上移/下移按钮不可用
|
|
190
252
|
|
|
@@ -220,7 +282,8 @@ src/
|
|
|
220
282
|
├── index.ts # browser half apply:busyEnter 固定 queue + 三处 slot 注册
|
|
221
283
|
├── steer-queue-dock.tsx # 三档规划等待区(shadowing conversation.input.dock id queue)
|
|
222
284
|
├── freeze-button.tsx # 冻结/恢复按钮(conversation.input.right)
|
|
223
|
-
├── freeze-store.ts #
|
|
285
|
+
├── freeze-store.ts # 会话级冻结状态 store(Map<sessionId, {frozen, pending}>)
|
|
286
|
+
├── session-guard-bridge.ts # session-guard RPC 透传(会话级锁定,fail-open)
|
|
224
287
|
├── hide-enter-row.tsx # 设置行隐藏(shadowing settings.general.item id composer-enter)
|
|
225
288
|
├── locales.ts # steer 字典(zh/en)
|
|
226
289
|
└── *.module.css
|
|
@@ -242,7 +305,7 @@ src/
|
|
|
242
305
|
| 红色 now | 打断后消息立即被处理:agent 明确回复被打断消息并继续;无滞留中间态 |
|
|
243
306
|
| 黄色 next + 绿色撤回 | 插话后点绿收回排队,消息回到等待区 |
|
|
244
307
|
| 冻结 / 恢复 | 当前轮次自然完成不打断、队列冻结保存、横幅提示;恢复后 FIFO 全部处理完成 |
|
|
245
|
-
| 队列编辑(多行 / 失败退回) | 组件测试覆盖(
|
|
308
|
+
| 队列编辑(多行 / 失败退回) | 组件测试覆盖(50 项全绿);真实环境复核待做 |
|
|
246
309
|
|
|
247
310
|
## 参考
|
|
248
311
|
|
|
@@ -250,6 +313,19 @@ src/
|
|
|
250
313
|
- 语义参考:[dsh-traffic-light](https://github.com/yimeng-dev/dsh-traffic-light)(Session 运行状态红绿灯提示)
|
|
251
314
|
- harness 锚点:`packages/client/AGENTS.md`、`packages/client/tsdown.client.ts`、`packages/client/web/src/platform.ts`、`packages/bundle/web-app/cordis.patch.yml`、`packages/client/ui-conversation/src/client/queue/QueueDock.tsx`、`packages/host/apiproxy/src/api-proxy.ts`
|
|
252
315
|
|
|
316
|
+
## drscrewdriver DSH Plugin Family
|
|
317
|
+
|
|
318
|
+
本项目是 [drscrewdriver](https://github.com/drscrewdriver) 维护的 DSH 插件系列之一。如果这个对你有用,其他插件多半也有用:
|
|
319
|
+
|
|
320
|
+
| 插件 | 一句话描述 |
|
|
321
|
+
|---|---|
|
|
322
|
+
| **[dsh-input-traffic](https://github.com/drscrewdriver/dsh-input-traffic)** | DSH Web GUI 忙时输入队列:三档交通管制,拖拽重排,会话冻结 |
|
|
323
|
+
| **[dsh-session-guard](https://github.com/drscrewdriver/dsh-session-guard)** | 高峰自动会话门:周末模式 + 高峰自动暂停 + 会话级锁定 + 后端自动重试(配本插件按钮) |
|
|
324
|
+
| [dsh-thinking-levels](https://github.com/drscrewdriver/dsh-thinking-levels) | 逐轮 reasoning_effort 控制:Auto 智能调度或手动固定档位 |
|
|
325
|
+
| [dsh-seatbelt-sandbox](https://github.com/drscrewdriver/dsh-seatbelt-sandbox) | macOS Seatbelt 沙箱适配器:libsandbox 原生 loader,接替弃用的 sandbox-exec |
|
|
326
|
+
| [dsh-switch-search](https://github.com/drscrewdriver/dsh-switch-search) | 侧边栏会话搜索增强:标题/内容切换,按用户/回复/工具筛选 |
|
|
327
|
+
|
|
253
328
|
## License
|
|
254
329
|
|
|
255
330
|
MIT
|
|
331
|
+
|
package/dsh.plugin.json
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "dsh-external/dsh-input-traffic",
|
|
3
|
+
"version": "0.2.10-beta.1",
|
|
4
|
+
"main": "./lib/index.js",
|
|
5
|
+
"description": "Busy-time input queue: three-tier planning, drag-to-reorder, interject/interrupt, batch clear, session freeze.",
|
|
6
|
+
"contributes": {
|
|
7
|
+
"tools": [],
|
|
8
|
+
"skills": []
|
|
9
|
+
},
|
|
10
|
+
"client": {
|
|
11
|
+
"main": "./lib/client.js"
|
|
12
|
+
}
|
|
13
|
+
}
|