zigmini 0.8.0-beta.5 → 0.8.0-beta.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.ko.md +78 -19
- package/README.md +79 -19
- package/assets/agent/gateway-request-rules.md +1 -0
- package/assets/agent/gateway-rules.md +6 -0
- package/assets/android/zigmini.apk +0 -0
- package/assets/android/zigmini.apk.json +3 -3
- package/assets/build.json +1 -1
- package/docs/manual.ko.md +25 -2
- package/docs/manual.md +25 -2
- package/host/omo-bridge/task-control.ts +4 -0
- package/host/omo-check/patches/omo-5.1.35-compaction-idle.patch +77 -0
- package/host/omo-check/patches/omo-5.1.35-compaction-intent.patch +212 -0
- package/host/omo-check/patches/omo-5.1.35-compaction-model.patch +299 -0
- package/host/omo-check/patches/omo-5.1.35-compaction-preservation.patch +1063 -0
- package/host/omo-check/patches/omo-5.1.35-compaction-refusal.patch +83 -0
- package/host/omo-check/patches/omo-5.1.35-gateway-port.manifest.json +171 -8
- package/host/omo-check/patches/omo-5.1.35-phantom-attach.patch +31 -0
- package/host/omo-check/patches/omo-5.1.35-request-rules.patch +109 -0
- package/host/omo-check/patches/omo-5.1.35-turn-stats.patch +76 -0
- package/package.json +4 -1
- package/scripts/secret-rules.ts +101 -0
- package/scripts/secret-scan.allow.json +155 -0
- package/scripts/secret-scan.rules.json +30 -0
- package/src/agent-request-rules.ts +82 -0
- package/src/cli/access.ts +31 -34
- package/src/cli/launchd.ts +30 -4
- package/src/cli/main.ts +13 -39
- package/src/cli/messages.ts +160 -0
- package/src/cli/pair.ts +32 -25
- package/src/cli/rotate-main.ts +411 -0
- package/src/cli/setup.ts +164 -75
- package/src/decisions.ts +20 -1
- package/src/hub.ts +140 -30
- package/src/main.ts +45 -4
- package/src/omo/client.ts +28 -0
- package/src/protocol.ts +33 -1
- package/src/reply-notifications.ts +144 -0
- package/src/runtime/paths.ts +2 -0
- package/src/security-check.ts +241 -0
- package/src/store.ts +71 -1
- package/src/turn-stats.ts +49 -0
- package/src/work-watch.ts +36 -10
- package/src/work.ts +29 -4
- package/web/app.js +197 -10
- package/web/decisions.js +3 -0
- package/web/gc.d.ts +2 -0
- package/web/gc.js +11 -0
- package/web/index.html +26 -10
- package/web/notifications.d.ts +25 -0
- package/web/notifications.js +118 -0
- package/web/style.css +16 -0
- package/web/tooltip.d.ts +0 -6
- package/web/tooltip.js +8 -11
- package/web/turn-stats.d.ts +26 -0
- package/web/turn-stats.js +58 -0
- package/web/update.d.ts +1 -1
- package/web/update.js +10 -3
package/README.ko.md
CHANGED
|
@@ -8,7 +8,8 @@ zigmini는 맥에서 도는 개인 AI 에이전트 게이트웨이입니다. 맥
|
|
|
8
8
|
|
|
9
9
|
- Apple Silicon(M칩) 맥과 macOS. Intel 맥, Linux, Windows는 지원하지 않습니다.
|
|
10
10
|
- [Bun](https://bun.sh) 1.4.0 이상. 설치에는 Bun만 필요합니다. Node.js와 npm은 필요하지 않습니다.
|
|
11
|
-
-
|
|
11
|
+
- Bun으로 전역 설치한 에이전트 엔진 명령 `omo`(패키지 `omo-ai`). 필수입니다. 없으면 모델 계정에 로그인할 수 없고 게이트웨이가 동작하지 않습니다. 설치 15~18번에서 설치합니다.
|
|
12
|
+
- 에이전트가 쓸 모델 계정(예: Claude, ChatGPT 구독). `zigmini setup` 전에 `omo`로 로그인합니다.
|
|
12
13
|
- (선택) Android 폰. 앱은 게이트웨이가 직접 제공합니다.
|
|
13
14
|
- (선택) 폰을 밖에서 쓰려면 Tailscale 또는 HTTPS 리버스 프록시가 있는 자기 도메인.
|
|
14
15
|
|
|
@@ -64,12 +65,12 @@ zigmini는 에이전트를 권한 프리셋 `full-access`로 실행합니다.
|
|
|
64
65
|
```sh
|
|
65
66
|
bun add -g zigmini
|
|
66
67
|
```
|
|
67
|
-
- `zigmini setup`(
|
|
68
|
+
- `zigmini setup`(19번)을 마칠 때까지 다른 명령은 오류 출력에 `` 아직 설치를 마치지 않았습니다. 먼저 `zigmini setup`을 실행하세요. ``를 보여 줍니다. `--version`, `--help`, `setup`, `consent`, `migrate`, `migrate-run`은 이 줄을 보여 주지 않습니다. `zigmini --help`도 먼저 setup을 실행하라고 안내합니다.
|
|
68
69
|
9. `zigmini` 명령을 찾는지 확인합니다.
|
|
69
70
|
```sh
|
|
70
71
|
zigmini --version
|
|
71
72
|
```
|
|
72
|
-
- 결과가 숫자로 시작하는 버전 한 줄(예: `0.8.0-beta.
|
|
73
|
+
- 결과가 숫자로 시작하는 버전 한 줄(예: `0.8.0-beta.7`)이면 15번으로 갑니다.
|
|
73
74
|
- 결과가 `zsh: command not found: zigmini`이면 Bun 전역 명령 폴더가 PATH에 없습니다. 10번으로 갑니다.
|
|
74
75
|
10. 지금 터미널 창에서 Bun 전역 명령 폴더를 PATH에 넣습니다. 이 명령은 지금 터미널 창에만 적용되고 파일을 바꾸지 않습니다.
|
|
75
76
|
```sh
|
|
@@ -94,23 +95,45 @@ zigmini는 에이전트를 권한 프리셋 `full-access`로 실행합니다.
|
|
|
94
95
|
14. 9번 명령을 다시 실행합니다.
|
|
95
96
|
- 결과가 숫자로 시작하는 버전 한 줄이면 15번으로 갑니다.
|
|
96
97
|
- 결과가 여전히 `zsh: command not found: zigmini`이면 설치를 멈춥니다. `ls "$(bun pm bin -g)"`를 실행합니다. 결과에 `zigmini`가 없으면 8번의 `bun add -g zigmini` 출력에서 `error:`로 시작하는 줄을 확인합니다.
|
|
97
|
-
15.
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
98
|
+
15. 에이전트 엔진 `omo-ai`를 전역 설치합니다. 필수 단계입니다. `omo-ai` 설치와 모델 계정 로그인이 없으면 게이트웨이가 동작하지 않습니다. 15~18번을 건너뛰면 `zigmini setup`이 전역 `omo`를 직접 설치하고 로그인 단계에서 기다리지만, 로그인은 직접 해야 합니다. 그래도 여기의 단계를 먼저 합니다. 버전은 게이트웨이가 고정한 stock 버전에 맞춥니다(`src/engine/compat.json`의 `omo`, 이 문서를 쓸 때 5.1.35).
|
|
99
|
+
```sh
|
|
100
|
+
bun add -g omo-ai@5.1.35
|
|
101
|
+
```
|
|
102
|
+
16. 셸이 `omo` 명령을 찾는지 확인합니다. 결과는 버전 한 줄이어야 합니다.
|
|
103
|
+
```sh
|
|
104
|
+
omo --version
|
|
105
|
+
```
|
|
106
|
+
17. `omo`를 실행합니다.
|
|
107
|
+
```sh
|
|
108
|
+
omo
|
|
109
|
+
```
|
|
110
|
+
18. `omo`에서 `/login`을 입력해 모델 계정에 로그인합니다. 그다음 `omo`를 끝냅니다. 로그인 정보는 에이전트 폴더 `~/.omo/agent`에 저장되고, 게이트웨이도 같은 폴더를 씁니다.
|
|
111
|
+
19. 설치를 마칩니다.
|
|
112
|
+
```sh
|
|
113
|
+
zigmini setup
|
|
114
|
+
```
|
|
101
115
|
|
|
102
116
|
`zigmini setup`은 아래 순서로 진행합니다. 다시 실행해도 됩니다. 이미 끝난 단계는 그대로 둡니다.
|
|
103
117
|
|
|
104
|
-
1.
|
|
105
|
-
2.
|
|
106
|
-
3.
|
|
107
|
-
4. 에이전트
|
|
108
|
-
5.
|
|
109
|
-
6.
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
118
|
+
1. 언어를 묻습니다: `Language / 언어 [1] English [2] 한국어`. 그 뒤의 안내는 모두 고른 언어로 나옵니다. 고른 언어는 `~/.zigmini/language`에 저장되고 `zigmini setup --access`, `zigmini pair`, `zigmini start`·`restart`의 준비 대기도 이 언어를 씁니다. `--lang en|ko`로 묻지 않고 정할 수 있습니다. 묻지 않는 설치(`--non-interactive`)는 저장된 언어, 없으면 시스템 언어(`LANG`이 `ko…`이면 한국어), 그것도 없으면 영어를 씁니다.
|
|
119
|
+
2. 권한 안내를 보여 주고 동의를 받습니다.
|
|
120
|
+
3. 홈 폴더 `~/.zigmini`를 만듭니다. 이 설치의 규칙 파일(`~/.zigmini/rules.md`)이 없으면 빈 파일을 만듭니다. 아래 "에이전트 규칙"을 보세요.
|
|
121
|
+
4. 에이전트 엔진(omo-ai)의 고정 버전을 내려받아 해시를 확인하고 패치합니다. 버전은 패키지가 정합니다(`src/engine/compat.json`, 이 문서를 쓸 때 엔진 5.1.35). 엔진 라이선스 요약을 보여 주고 동의(`y`)를 받습니다.
|
|
122
|
+
5. 전역 `omo` 명령을 `bun add -g omo-ai@<버전>`으로 설치합니다. 버전은 고정 엔진과 같은 stock 버전입니다. 전역 `omo`가 이미 그 버전이면 설치를 건너뜁니다. 다른 버전이면 `<버전>으로 덮어쓸까요? (y/N)`를 묻습니다. 묻지 않는 설치는 있는 버전을 유지합니다. 설치에 실패하면 고정 엔진의 긴 명령을 로그인 명령으로 보여 줍니다.
|
|
123
|
+
6. 에이전트 폴더와 모델 계정 로그인 상태를 확인합니다. 기본 에이전트 폴더는 `~/.omo/agent`이고, 같은 폴더를 쓰는 다른 OMO와 로그인 정보를 같이 씁니다. 로그인하지 않았으면 아래 상자를 보이고 기다립니다.
|
|
124
|
+
```text
|
|
125
|
+
========================================
|
|
126
|
+
모델 계정에 로그인하세요: 터미널에서 `omo`를 실행한 뒤 `/login`을 입력합니다.
|
|
127
|
+
========================================
|
|
128
|
+
로그인한 뒤 Enter로 다시 확인하세요. 건너뛰려면 s를 입력하세요:
|
|
129
|
+
```
|
|
130
|
+
다른 터미널에서 로그인한 뒤 Enter를 누릅니다. 모델 계정이 확인될 때까지 다시 확인합니다. 시간 상한은 없습니다. `s`를 입력하면 `경고: 로그인하기 전까지 게이트웨이가 채팅에 답하지 않습니다.`를 보이고 넘어갑니다. `--agent-dir`을 쓰면 상자의 명령은 `env OMO_CODING_AGENT_DIR=<경로> omo`입니다. 묻지 않는 설치는 상자만 보이고 넘어갑니다.
|
|
131
|
+
7. Notion 토큰을 묻습니다(선택). 비우면 일정 기능이 꺼집니다.
|
|
132
|
+
8. 외부 접속 방식을 묻습니다. 아래 "외부 접속"을 보세요.
|
|
133
|
+
9. 서비스 설정(`~/.zigmini/config.env`, 권한 프리셋 `full-access`)을 쓰고 음성은 꺼 둡니다.
|
|
134
|
+
10. 게이트웨이와 브리지를 launchd에 등록하고 시작합니다. 게이트웨이가 준비될 때까지 기다립니다(최대 600초). health 응답 없이 기다리는 동안 launchd 상태(pid, 마지막 종료 코드)와 게이트웨이 로그 마지막 줄을 보입니다. 엔진 연결이 계속 끊겨 있으면 브리지 로그 마지막 줄과 `zigmini setup --engine-only --accept-license` 명령을 보입니다.
|
|
135
|
+
11. 자기 도메인을 골랐으면 그 도메인이 앱 포트에 닿는지 확인합니다.
|
|
136
|
+
12. 터미널에는 QR을 그리지 않습니다. 터미널 글꼴 때문에 카메라가 QR을 읽지 못하는 경우가 많기 때문입니다. 대신 웹 화면에서 QR을 찍으라고 안내합니다(아래 "폰 등록"). 외부 접속을 고르지 않았으면 먼저 `zigmini setup --access <tailscale|lan|domain>`을 실행하라고 안내합니다.
|
|
114
137
|
|
|
115
138
|
설치가 끝나면 맥의 브라우저에서 http://127.0.0.1:8700 을 엽니다.
|
|
116
139
|
|
|
@@ -121,6 +144,7 @@ zigmini setup --non-interactive --accept-license --access lan
|
|
|
121
144
|
|
|
122
145
|
| 옵션 | 뜻 |
|
|
123
146
|
|---|---|
|
|
147
|
+
| `--lang <en\|ko>` | 마법사와 CLI 안내의 언어 |
|
|
124
148
|
| `--non-interactive` | 묻지 않습니다 |
|
|
125
149
|
| `--accept-license` | 엔진 라이선스에 동의합니다 |
|
|
126
150
|
| `--agent-dir <경로>` | 공유 `~/.omo/agent` 대신 쓸 전용 에이전트 폴더 |
|
|
@@ -142,12 +166,14 @@ zigmini setup --non-interactive --accept-license --access lan
|
|
|
142
166
|
|
|
143
167
|
## 폰 등록
|
|
144
168
|
|
|
169
|
+
맥에서 http://127.0.0.1:8700 을 열고 "설정"을 엽니다. 앱 내려받기 QR은 "앱 내려받기"에, 폰 등록 QR은 "기기 등록"에 있습니다. 외부 접속 방식을 먼저 골라야 합니다("외부 접속" 참고).
|
|
170
|
+
|
|
145
171
|
1. 폰에서 앱 내려받기 QR을 찍어 APK를 받고 설치합니다. 설치할 때 Android가 "출처를 알 수 없는 앱" 허용을 물으면 허용합니다.
|
|
146
172
|
2. 앱 첫 화면에서 "QR로 등록"을 눌러 폰 등록 QR을 찍습니다.
|
|
147
173
|
|
|
148
174
|
앱 첫 화면에는 카메라 없이 등록하는 "게이트웨이 주소"와 "등록 토큰 붙여 넣기" 칸도 있습니다. 토큰 칸에는 등록 QR이 담은 `zigmini://enroll?...` 글 전체를 붙여 넣을 수 있습니다. 이때는 그 글의 주소를 씁니다. 토큰은 한 번만, 유효 시간 안에서만 쓸 수 있습니다.
|
|
149
175
|
|
|
150
|
-
|
|
176
|
+
웹 화면 설정이 기본 방법입니다. 아래 명령은 같은 QR을 터미널에 그립니다. 터미널 글꼴에 따라 QR이 깨질 수 있습니다. 게이트웨이가 실행 중이어야 합니다. 외부 접속을 고르지 않았으면 먼저 `zigmini setup --access <tailscale|lan|domain>`을 실행하라고 안내합니다.
|
|
151
177
|
```sh
|
|
152
178
|
zigmini pair --apk # 앱 내려받기 QR (유효 10분)
|
|
153
179
|
zigmini pair # 폰 등록 QR (유효 10분, 한 번 사용)
|
|
@@ -155,6 +181,8 @@ zigmini pair # 폰 등록 QR (유효 10분, 한 번 사용)
|
|
|
155
181
|
|
|
156
182
|
앱 하나로 게이트웨이 여러 개를 등록할 수 있습니다. 게이트웨이마다 주소와 인증 값을 따로 저장하고, 모든 게이트웨이의 알림을 받습니다. 알림을 누르면 그 게이트웨이로 바뀝니다. 등록한 기기는 웹 화면 설정의 "등록된 기기"에서 확인합니다.
|
|
157
183
|
|
|
184
|
+
웹 설정이나 앱 작업 상태 화면(헤더의 지그를 눌러 엶)에서 앱 알림 수준을 고릅니다. 기본값은 "확인함 알림만"입니다. "모든 답장 알림"은 확인함 알림과 함께 작업 세션을 포함한 에이전트의 완성 답장마다 알립니다. 두 화면은 같은 게이트웨이 저장값을 바꿉니다. 다른 게이트웨이의 값은 바뀌지 않습니다. 일정과 명시적으로 요청한 알림은 이 설정과 별개입니다. 알림은 진동만 사용합니다. 새 게이트웨이와 새 앱이 필요합니다.
|
|
185
|
+
|
|
158
186
|
## 앱 서명 지문
|
|
159
187
|
|
|
160
188
|
zigmini 패키지에 들어 있는 Android 앱(APK)은 아래 인증서 하나로만 서명되어 있습니다. 받은 APK가 진짜인지 확인하려면 APK 파일에서 서명 인증서의 SHA-256 지문을 읽어 아래 값과 비교합니다. 예: Android SDK의 `apksigner verify --print-certs zigmini.apk` 출력의 `certificate SHA-256 digest`(콜론 없이 소문자로 나옵니다) 또는 JDK의 `keytool -printcert -jarfile zigmini.apk` 출력의 `SHA256`. 인증서가 둘 이상이거나 값이 다르면 설치하지 마세요.
|
|
@@ -167,10 +195,28 @@ F0:AB:B3:B2:DC:70:1A:45:19:85:69:7D:58:68:F5:FB:4F:AC:33:4F:D8:6A:68:DD:04:5C:53
|
|
|
167
195
|
|
|
168
196
|
사용자 매뉴얼([한국어](docs/manual.ko.md), [English](docs/manual.md))은 웹 설정 창 위쪽의 "매뉴얼" 버튼과, 앱 헤더의 상태 태그를 짧게 눌러 여는 연결 화면의 "매뉴얼" 버튼으로 봅니다.
|
|
169
197
|
|
|
198
|
+
## 완료 답변 통계
|
|
199
|
+
|
|
200
|
+
웹 채팅과 새 Android 앱은 완료 답변 아래에 엔진이 측정한 TPS(초당 토큰 수),
|
|
201
|
+
모델 처리 시간, 캐시 적중률을 표시합니다. 통계는 도구 호출 전후의 모델 응답을
|
|
202
|
+
합친 한 응답 턴의 값입니다. 모델 처리 시간에는 도구 실행 시간이 들어가지
|
|
203
|
+
않으며, 전체 대기 시간이 아닙니다. 없는 측정값은 생략합니다. 측정한 생성
|
|
204
|
+
시간의 합계가 500ms보다 짧으면 TPS를 생략합니다. 통계는 답변 본문·복사·알림과
|
|
205
|
+
분리합니다. 함께 제공하는 엔진 패치가 필요합니다. 이전 엔진과 게이트웨이가
|
|
206
|
+
게시한 작업 보고에는 추정값을 붙이지 않습니다.
|
|
207
|
+
|
|
170
208
|
## 음성
|
|
171
209
|
|
|
172
210
|
새 설치에서 음성은 꺼져 있습니다. 음성 인식과 음성 합성을 쓰려면 맥의 웹 화면 위쪽의 "음성 설치" 버튼을 누릅니다. 버튼에 내려받을 크기가 보입니다. 게이트웨이가 uv, Python 환경, 음성 모델(약 8GB)을 `~/.zigmini/voice`에 내려받습니다. 진행률은 채팅에 나옵니다. 실패하면 같은 버튼으로 실패한 단계부터 다시 시작합니다. 설치가 끝나면 "음성 꺼짐"을 눌러 켭니다. 음성 설치와 켜기·끄기는 맥의 웹 화면에서 합니다. 앱은 음성 상태만 보여 줍니다. 웹 화면 위쪽에서 "호출어", "박수 감지"(박수 두 번), "음성 답변"도 켭니다.
|
|
173
211
|
|
|
212
|
+
## 보안검사
|
|
213
|
+
|
|
214
|
+
게이트웨이는 메시지를 엔진에 넘기기 전에, 공개되면 맥·서버·계정 공격의 단서가 되는 값이 있는지 검사합니다. 대상은 비밀키, 토큰·API 키, 비밀번호·쿠키·인증 값, 홈 폴더 경로, 내부 IP·호스트 이름, 이메일 주소, 전화번호, 기기 식별값입니다. 엔진으로 가는 모든 사용자 글을 검사합니다. 웹 채팅, 앱, 음성 입력, 참조한 메시지, 확인함 답의 자유 입력이 모두 포함됩니다. 검사는 게이트웨이 메모리 안에서만 돌고 네트워크와 디스크를 쓰지 않습니다. 일반 메시지는 1ms보다 훨씬 짧게 걸립니다.
|
|
215
|
+
|
|
216
|
+
값이 나오면 게이트웨이가 메시지를 보류하고 보내지 않습니다. 엔진이 아니라 게이트웨이가 웹과 앱에 "보안검사 결과" 카드를 직접 보여 줍니다. 카드에는 걸린 값마다 종류, 실제 값, 메시지 안의 줄과 칸이 보이고 "이 값들을 노출해도 되겠습니까?"라고 묻습니다. "보내기"를 누르면 원래 메시지를 그대로 엔진에 보냅니다. "보내지 않기"를 누르면 메시지를 버리고, 웹은 글을 입력창에 되돌려 고칠 수 있게 합니다. 걸린 값은 엔진, 엔진 세션 파일, 대화 기록, 로그에 들어가지 않습니다. 보류한 메시지는 게이트웨이 메모리에만 있습니다. 게이트웨이가 다시 시작하면 보내지 않고 버리며, 웹 카드에 그렇게 표시됩니다.
|
|
217
|
+
|
|
218
|
+
보안검사는 기본으로 켜져 있습니다. 웹 설정의 "보안검사 켜짐/꺼짐" 버튼으로 끄고 켭니다. 설정은 `~/.zigmini/data/security-check`에 저장되어 재시작 뒤에도 유지됩니다. 끄면 검사 없이 바로 엔진에 보냅니다. 검사가 찾는 종류의 목록은 [docs/security-check.md](docs/security-check.md)에 있습니다.
|
|
219
|
+
|
|
174
220
|
## 업데이트
|
|
175
221
|
|
|
176
222
|
새 버전이 나오면 웹 화면 위쪽에 새 버전 줄이 나오고, 앱에도 버전 알림이 나옵니다. 업데이트는 웹 화면 설정의 "업데이트" 버튼("지금 확인"은 새 버전을 확인합니다), 앱 버전 알림의 "업데이트" 버튼, 또는 아래 명령으로 합니다.
|
|
@@ -199,15 +245,17 @@ zigmini update <버전> # 지정한 버전으로 업데이트
|
|
|
199
245
|
|
|
200
246
|
| 명령 | 하는 일 |
|
|
201
247
|
|---|---|
|
|
202
|
-
| `zigmini setup` |
|
|
248
|
+
| `zigmini setup` | 설치합니다. `--engine-only`는 엔진만 설치하고, `--access <방식>`은 외부 접속만 바꿉니다 |
|
|
203
249
|
| `zigmini start` | 게이트웨이와 브리지를 launchd에 등록하고 시작합니다 |
|
|
204
250
|
| `zigmini stop` | 게이트웨이와 브리지를 멈춥니다 |
|
|
251
|
+
| `zigmini stop --uninstall` | 멈추고 이 패키지의 launchd plist를 모두 지웁니다 |
|
|
205
252
|
| `zigmini restart [gateway\|bridge]` | 다시 시작합니다 |
|
|
206
253
|
| `zigmini status` | launchd 상태, health, 권한 동의 상태를 보여 줍니다 |
|
|
207
254
|
| `zigmini doctor [--json] [--fix]` | 전체 상태를 점검합니다 |
|
|
208
255
|
| `zigmini pair [--apk]` | 폰 등록 QR 또는 앱 내려받기 QR을 그립니다 |
|
|
209
256
|
| `zigmini consent` | 권한 안내를 보이고 동의를 기록합니다 |
|
|
210
257
|
| `zigmini update [버전] [--force]` | 업데이트합니다 |
|
|
258
|
+
| `zigmini rotate-main [--restart] [--wait <초>] [--foreground]` | main 대화를 새 엔진 세션으로 교체합니다. 웹의 "새 세션"과 같은 요청입니다. 분리 실행하고 결과는 `~/.zigmini/logs/rotate-main.log`에 남깁니다. `--restart`는 게이트웨이를 먼저 멈추고 다시 켭니다 |
|
|
211
259
|
| `zigmini migrate` | 옛 Docker 설치(`~/.zigmini-gateway`)를 새 구조로 복사합니다. 옛 폴더는 바꾸지 않습니다 |
|
|
212
260
|
| `zigmini migrate-run` | 유휴를 기다리고, 옛 실행을 멈추고, 백업하고, migrate와 setup을 실행한 뒤 확인합니다. 실패하면 옛 실행으로 되돌립니다 |
|
|
213
261
|
| `zigmini --version` | 설치된 버전을 출력합니다 |
|
|
@@ -241,6 +289,17 @@ zigmini update <버전> # 지정한 버전으로 업데이트
|
|
|
241
289
|
4. 그래도 안 되면 로그 폴더 `~/.zigmini/logs`를 확인합니다.
|
|
242
290
|
|
|
243
291
|
- 게이트웨이가 시작하지 않고 권한 동의가 없다고 나오면 `zigmini consent`를 실행합니다.
|
|
292
|
+
|
|
293
|
+
### 알려진 설치 문제
|
|
294
|
+
|
|
295
|
+
아래 우회 방법을 씁니다.
|
|
296
|
+
|
|
297
|
+
- **마법사가 "게이트웨이 준비를 기다리는 중"에서 "health 응답 없음"만 보입니다.** 게이트웨이가 웹 포트에서 응답하지 않습니다. 원인은 아직 찾지 못했습니다. 마법사는 기다리는 동안 launchd 상태와 로그 마지막 줄을 보이고, 600초 뒤 멈춥니다. `zigmini status`와 `zigmini doctor`를 실행하고 `~/.zigmini/logs/gateway.log`, `~/.zigmini/logs/bridge.log`를 봅니다. 엔진이 없거나 깨졌으면 `zigmini setup --engine-only --accept-license`로 엔진만 다시 설치하고 `zigmini doctor --fix`를 실행합니다.
|
|
298
|
+
- **폰이 접속하지 못하거나 QR을 쓸 수 없습니다.** 외부 접속을 고르지 않아서 앱 포트가 꺼져 있습니다. 방식을 고른 뒤 웹 화면 설정에서 QR을 찍습니다.
|
|
299
|
+
```sh
|
|
300
|
+
zigmini setup --access lan # 또는 tailscale, domain --domain https://<도메인>
|
|
301
|
+
```
|
|
302
|
+
- **설치 뒤 에이전트가 답하지 않습니다.** 모델 계정에 로그인하지 않았습니다(예: 로그인 단계에서 `s`를 입력함). 설치 15~18번(`bun add -g omo-ai@5.1.35`, `omo`, `/login`)을 합니다. 그 뒤 `zigmini setup`을 다시 실행합니다. "모델 계정: 로그인됨"이 나오고, 이미 끝난 단계는 유지됩니다. `--agent-dir`을 쓰면 `OMO_CODING_AGENT_DIR=<경로> omo`로 실행해야 그 폴더에 로그인됩니다.
|
|
244
303
|
- 오래된 DB 백업, 쓰지 않는 엔진 버전, 업데이트에서 남은 파일은 웹 화면 설정의 "정리"에서 확인하고, 고른 항목만 지웁니다.
|
|
245
304
|
|
|
246
305
|
## 제거
|
package/README.md
CHANGED
|
@@ -8,7 +8,8 @@ zigmini: a personal AI agent gateway that runs on a Mac. You talk with the agent
|
|
|
8
8
|
|
|
9
9
|
- A Mac with Apple Silicon (M chip) and macOS. Intel Macs, Linux and Windows are not supported.
|
|
10
10
|
- [Bun](https://bun.sh) 1.4.0 or later. Bun is the only thing the installation needs. Node.js and npm are not necessary.
|
|
11
|
-
-
|
|
11
|
+
- The agent engine command `omo` (package `omo-ai`), installed globally with Bun. It is required: without it you cannot log in to the model account, and the gateway does not work. Install steps 15 to 18 install it.
|
|
12
|
+
- A model account for the agent (for example a Claude or ChatGPT subscription). You log in with `omo` before `zigmini setup`.
|
|
12
13
|
- (Optional) An Android phone. The gateway serves the app itself.
|
|
13
14
|
- (Optional) To use the phone away from home: Tailscale, or your own domain with an HTTPS reverse proxy.
|
|
14
15
|
|
|
@@ -64,12 +65,12 @@ The gateway runs the agent with the permission preset `full-access`. The agent d
|
|
|
64
65
|
```sh
|
|
65
66
|
bun add -g zigmini
|
|
66
67
|
```
|
|
67
|
-
- Until `zigmini setup` (step
|
|
68
|
+
- Until `zigmini setup` (step 19) has finished, the other commands print `` 아직 설치를 마치지 않았습니다. 먼저 `zigmini setup`을 실행하세요. `` (the installation is not finished yet; run `zigmini setup` first) on the error output. `--version`, `--help`, `setup`, `consent`, `migrate` and `migrate-run` do not print it. `zigmini --help` also says to run setup first.
|
|
68
69
|
9. Check that the shell finds the `zigmini` command.
|
|
69
70
|
```sh
|
|
70
71
|
zigmini --version
|
|
71
72
|
```
|
|
72
|
-
- If the result is one version line that starts with a number (for example `0.8.0-beta.
|
|
73
|
+
- If the result is one version line that starts with a number (for example `0.8.0-beta.7`), go to step 15.
|
|
73
74
|
- If the result is `zsh: command not found: zigmini`, the Bun global command folder is not in PATH. Go to step 10.
|
|
74
75
|
10. Put the Bun global command folder in PATH in the current terminal window. This command applies only to the current terminal window and changes no file.
|
|
75
76
|
```sh
|
|
@@ -94,23 +95,45 @@ The gateway runs the agent with the permission preset `full-access`. The agent d
|
|
|
94
95
|
14. Run the command of step 9 again.
|
|
95
96
|
- If the result is one version line that starts with a number, go to step 15.
|
|
96
97
|
- If the result is still `zsh: command not found: zigmini`, stop the installation. Run `ls "$(bun pm bin -g)"`. If the result does not contain `zigmini`, look for lines that start with `error:` in the output of `bun add -g zigmini` in step 8.
|
|
97
|
-
15.
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
98
|
+
15. Install the agent engine `omo-ai` globally. This step is required: without the `omo-ai` installation and the model account login, the gateway does not work. If you skip steps 15 to 18, `zigmini setup` installs the global `omo` itself and stops at the login step, but you must still log in. Do the steps here anyway. Use the stock version that the gateway pins (`omo` in `src/engine/compat.json`; 5.1.35 at the time of writing).
|
|
99
|
+
```sh
|
|
100
|
+
bun add -g omo-ai@5.1.35
|
|
101
|
+
```
|
|
102
|
+
16. Check that the shell finds the `omo` command. The result must be one version line.
|
|
103
|
+
```sh
|
|
104
|
+
omo --version
|
|
105
|
+
```
|
|
106
|
+
17. Start `omo`.
|
|
107
|
+
```sh
|
|
108
|
+
omo
|
|
109
|
+
```
|
|
110
|
+
18. In `omo`, type `/login` and log in to the model account. Then quit `omo`. The login is stored in the agent folder `~/.omo/agent`, and the gateway uses the same folder.
|
|
111
|
+
19. Finish the installation.
|
|
112
|
+
```sh
|
|
113
|
+
zigmini setup
|
|
114
|
+
```
|
|
101
115
|
|
|
102
116
|
`zigmini setup` does these steps in this order. You can run it again. It keeps the steps that are already done.
|
|
103
117
|
|
|
104
|
-
1. It
|
|
105
|
-
2. It
|
|
106
|
-
3. It
|
|
107
|
-
4. It
|
|
108
|
-
5. It asks
|
|
109
|
-
6. It
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
118
|
+
1. It asks for the language: `Language / 언어 [1] English [2] 한국어`. All later messages use this language. The choice is saved in `~/.zigmini/language` and used by `zigmini setup --access`, `zigmini pair` and the ready wait of `zigmini start` and `restart`. `--lang en|ko` picks it without the question. Without a question (`--non-interactive`) the saved language is used, else the system language (`LANG`, `ko…` means Korean), else English.
|
|
119
|
+
2. It shows the permission notice and asks for your consent.
|
|
120
|
+
3. It creates the home folder `~/.zigmini`. If the rules file of this installation (`~/.zigmini/rules.md`) does not exist, it creates an empty one. See "Agent rules" below.
|
|
121
|
+
4. It downloads the pinned version of the agent engine (omo-ai), checks its hash and patches it. The package decides the version (`src/engine/compat.json`; engine 5.1.35 at the time of writing). It shows a summary of the engine license and asks for your consent (`y`).
|
|
122
|
+
5. It installs the global `omo` command with `bun add -g omo-ai@<version>`, the same stock version as the pinned engine. If the global `omo` already has this version, it skips the installation. If it has another version, it asks `Replace it with <version>? (y/N)`; without a question it keeps the installed one. If the installation fails, it shows the long command of the pinned engine for the login instead.
|
|
123
|
+
6. It checks the agent folder and the login state of the model account. The default agent folder is `~/.omo/agent`. Other OMO installations that use the same folder share the login data. If you are not logged in, it shows this box and waits:
|
|
124
|
+
```text
|
|
125
|
+
========================================
|
|
126
|
+
Run `omo` in a terminal and type `/login`.
|
|
127
|
+
========================================
|
|
128
|
+
After logging in, press Enter to check again; type s to skip:
|
|
129
|
+
```
|
|
130
|
+
Log in in another terminal, then press Enter. It checks again until a model account is found. There is no time limit. If you type `s`, it shows `Warning: Until you log in, the gateway will not answer chats.` and goes on. With `--agent-dir`, the command in the box is `env OMO_CODING_AGENT_DIR=<경로> omo` (`<경로>`: path). Without a question it only prints the box and goes on.
|
|
131
|
+
7. It asks for a Notion token (optional). If you leave it empty, the schedule feature is off.
|
|
132
|
+
8. It asks for the external access method. See "External access" below.
|
|
133
|
+
9. It writes the service settings (`~/.zigmini/config.env`, permission preset `full-access`) and leaves voice off.
|
|
134
|
+
10. It registers the gateway and the bridge with launchd and starts them. It waits until the gateway is ready (up to 600 seconds). While it waits without a health response, it shows the launchd state (pid, last exit code) and the last line of the gateway log. If the engine stays disconnected, it shows the last line of the bridge log and the command `zigmini setup --engine-only --accept-license`.
|
|
135
|
+
11. If you picked your own domain, it checks that the domain reaches the app port.
|
|
136
|
+
12. It does not draw QR codes in the terminal, because terminal fonts often break them for the camera. It tells you to open the web screen and scan the QR codes there (see "Phone registration" below). If you picked no external access method, it first tells you to run `zigmini setup --access <tailscale|lan|domain>`.
|
|
114
137
|
|
|
115
138
|
When the installation is done, open http://127.0.0.1:8700 in a browser on the Mac.
|
|
116
139
|
|
|
@@ -121,6 +144,7 @@ zigmini setup --non-interactive --accept-license --access lan
|
|
|
121
144
|
|
|
122
145
|
| Option | Meaning |
|
|
123
146
|
|---|---|
|
|
147
|
+
| `--lang <en\|ko>` | The language of the wizard and the CLI messages |
|
|
124
148
|
| `--non-interactive` | Asks nothing |
|
|
125
149
|
| `--accept-license` | Agrees to the engine license |
|
|
126
150
|
| `--agent-dir <경로>` | A dedicated agent folder to use instead of the shared `~/.omo/agent` (`<경로>`: path) |
|
|
@@ -142,12 +166,14 @@ To change it later, run `zigmini setup --access <방식>` again (`<방식>`: met
|
|
|
142
166
|
|
|
143
167
|
## Phone registration
|
|
144
168
|
|
|
169
|
+
Open http://127.0.0.1:8700 on the Mac and open "설정" (Settings). The app download QR code is in "앱 내려받기" (Download app), and the phone registration QR code is in "기기 등록" (Register device). An external access method must be picked first (see "External access").
|
|
170
|
+
|
|
145
171
|
1. On the phone, scan the app download QR code, download the APK and install it. If Android asks to allow "unknown apps" during the installation, allow it.
|
|
146
172
|
2. On the first screen of the app, push "QR로 등록" (Register with QR) and scan the phone registration QR code.
|
|
147
173
|
|
|
148
174
|
The first screen of the app also has the fields "게이트웨이 주소" (gateway address) and "등록 토큰 붙여 넣기" (paste the enrollment token) for a registration without the camera. You can paste into the token field the whole `zigmini://enroll?...` text that the registration QR code contains; then the address in that text is used. The token works only once and only within its time limit.
|
|
149
175
|
|
|
150
|
-
The
|
|
176
|
+
The web screen settings are the recommended way. The commands below draw the same QR codes in the terminal; some terminal fonts break them. The gateway must be running. If no external access method is picked, they tell you to run `zigmini setup --access <tailscale|lan|domain>` first.
|
|
151
177
|
```sh
|
|
152
178
|
zigmini pair --apk # app download QR code (valid for 10 minutes)
|
|
153
179
|
zigmini pair # phone registration QR code (valid for 10 minutes, single use)
|
|
@@ -155,6 +181,8 @@ zigmini pair # phone registration QR code (valid for 10 minutes, single
|
|
|
155
181
|
|
|
156
182
|
One app can register more than one gateway. The app stores the address and the credentials of each gateway separately and receives the notifications of all gateways. When you tap a notification, the app switches to that gateway. You can see the registered devices in "등록된 기기" (Registered devices) in the web screen settings.
|
|
157
183
|
|
|
184
|
+
Choose the app notification level in web settings or the app's work status screen (tap Zig in the header). "확인함 알림만" (Inbox notifications only) is the default. "모든 답장 알림" (All reply notifications) also alerts for each completed agent reply, including replies from work sessions. Both screens change the same saved gateway setting. Other gateways keep their own values. Schedule reminders and explicit notifications are independent of this setting. Notifications remain vibration-only. This feature needs the updated gateway and app.
|
|
185
|
+
|
|
158
186
|
## App signing fingerprint
|
|
159
187
|
|
|
160
188
|
The Android app (APK) in the `zigmini` package is signed with only the certificate below. To check that an APK you received is genuine, read the SHA-256 fingerprint of the signing certificate from the APK file and compare it with the value below. For example: `certificate SHA-256 digest` in the output of `apksigner verify --print-certs zigmini.apk` from the Android SDK (it is printed in lower case without colons), or `SHA256` in the output of `keytool -printcert -jarfile zigmini.apk` from the JDK. If there is more than one certificate or the value is different, do not install the APK.
|
|
@@ -167,10 +195,29 @@ F0:AB:B3:B2:DC:70:1A:45:19:85:69:7D:58:68:F5:FB:4F:AC:33:4F:D8:6A:68:DD:04:5C:53
|
|
|
167
195
|
|
|
168
196
|
The user manual ([English](docs/manual.md), [한국어](docs/manual.ko.md)) opens from the "매뉴얼" (Manual) button at the top of the web settings dialog, and in the app from the "매뉴얼" button on the connection screen that a short press on the header status tag opens.
|
|
169
197
|
|
|
198
|
+
## Completed-answer statistics
|
|
199
|
+
|
|
200
|
+
The web chat and updated Android app show available engine measurements below a
|
|
201
|
+
completed answer: TPS (tokens per second), model processing time and cache hit
|
|
202
|
+
percentage. These describe the response turn, including model calls around
|
|
203
|
+
tools. Model processing time excludes tool execution and is not total waiting
|
|
204
|
+
time. Missing measurements are omitted; TPS is omitted when the combined
|
|
205
|
+
measured generation time is shorter than 500 ms. Statistics are separate from answer
|
|
206
|
+
text, copies and notifications. They require the accompanying engine patch;
|
|
207
|
+
older engines and gateway-published work reports do not get estimated values.
|
|
208
|
+
|
|
170
209
|
## Voice
|
|
171
210
|
|
|
172
211
|
In a new installation, voice is off. To use speech recognition and speech synthesis, push the "음성 설치" (Install voice) button at the top of the web screen on the Mac. The button shows the download size. The gateway downloads uv, a Python environment and the voice models (about 8 GB) to `~/.zigmini/voice`. The chat shows the progress. If it fails, the same button starts again from the failed step. When the installation is done, push "음성 꺼짐" (Voice off) to turn voice on. You install voice and turn it on and off only in the web screen on the Mac. The app shows only the voice state. At the top of the web screen you can also turn on the wake word ("호출어"), double-clap detection ("박수 감지") and spoken answers ("음성 답변").
|
|
173
212
|
|
|
213
|
+
## Security check
|
|
214
|
+
|
|
215
|
+
Before the gateway hands a message to the engine, it checks the message for values that would help someone reach or attack your Mac, servers or accounts: private keys, tokens and API keys, passwords, cookies and authorization values, home folder paths, internal IP addresses and host names, email addresses, phone numbers and device ids. The check covers every way user text reaches the engine: the web chat, the app, voice input, referenced messages and free-text answers in the inbox. It runs in gateway memory, with no network or disk access, in well under a millisecond for an ordinary message.
|
|
216
|
+
|
|
217
|
+
When it finds something, the gateway holds the message and does not send it. The gateway itself (not the engine) shows a "보안검사 결과" (security check result) card on the web and in the app. The card lists each value with its kind and its line and column in the message, and asks whether these values may be exposed. "보내기" (send) sends the original message to the engine unchanged. "보내지 않기" (don't send) drops it, and the web puts the text back into the input box so you can fix it. The values never reach the engine, its session files, the conversation history or the logs. Held messages live only in gateway memory: a gateway restart drops them without sending them, and the web card then says so.
|
|
218
|
+
|
|
219
|
+
The check is on by default. Turn it off or on with "보안검사 켜짐/꺼짐" (Security check on/off) in the web settings. The setting is stored in `~/.zigmini/data/security-check` and survives a restart. With the check off, messages go to the engine without a check. The list of kinds that the check finds is in [docs/security-check.md](docs/security-check.md).
|
|
220
|
+
|
|
174
221
|
## Update
|
|
175
222
|
|
|
176
223
|
When a new version is available, a new-version line appears at the top of the web screen, and a version notice appears in the app. To update, use the "업데이트" (Update) button in the web screen settings ("지금 확인" (Check now) checks for a new version), the "업데이트" (Update) button of the version notice in the app, or the commands below.
|
|
@@ -199,15 +246,17 @@ An update to a version that does not support the zero-downtime switch (including
|
|
|
199
246
|
|
|
200
247
|
| Command | What it does |
|
|
201
248
|
|---|---|
|
|
202
|
-
| `zigmini setup` | Installs |
|
|
249
|
+
| `zigmini setup` | Installs. `--engine-only` installs only the engine, `--access <방식>` changes only the external access (`<방식>`: method) |
|
|
203
250
|
| `zigmini start` | Registers the gateway and the bridge with launchd and starts them |
|
|
204
251
|
| `zigmini stop` | Stops the gateway and the bridge |
|
|
252
|
+
| `zigmini stop --uninstall` | Stops them and removes all launchd plists of this package |
|
|
205
253
|
| `zigmini restart [gateway\|bridge]` | Restarts |
|
|
206
254
|
| `zigmini status` | Shows the launchd state, the health and the permission consent state |
|
|
207
255
|
| `zigmini doctor [--json] [--fix]` | Checks the whole state |
|
|
208
256
|
| `zigmini pair [--apk]` | Draws the phone registration QR code or the app download QR code |
|
|
209
257
|
| `zigmini consent` | Shows the permission notice and records the consent |
|
|
210
258
|
| `zigmini update [버전] [--force]` | Updates (`버전`: version) |
|
|
259
|
+
| `zigmini rotate-main [--restart] [--wait <초>] [--foreground]` | Moves the main conversation to a fresh engine session, like "새 세션" (New session) in the web. Runs detached and logs to `~/.zigmini/logs/rotate-main.log`. `--restart` stops and starts the gateway first (`<초>`: seconds) |
|
|
211
260
|
| `zigmini migrate` | Copies an old Docker installation (`~/.zigmini-gateway`) to the new layout. The old folder is not changed |
|
|
212
261
|
| `zigmini migrate-run` | Waits until idle, stops the old runtime, backs up, runs migrate and setup, then checks. If this fails, it goes back to the old runtime |
|
|
213
262
|
| `zigmini --version` | Prints the installed version |
|
|
@@ -241,6 +290,17 @@ Sessions that open after a change use the new content. To apply it at once, run
|
|
|
241
290
|
4. If this does not help, look at the log folder `~/.zigmini/logs`.
|
|
242
291
|
|
|
243
292
|
- If the gateway does not start and reports that there is no permission consent, run `zigmini consent`.
|
|
293
|
+
|
|
294
|
+
### Known installation problems
|
|
295
|
+
|
|
296
|
+
Use these workarounds.
|
|
297
|
+
|
|
298
|
+
- **The wizard shows only "no health response" in "Waiting for the gateway".** The gateway does not answer on the web port. The cause is not found yet. The wizard now shows the launchd state and the last log lines while it waits, and stops after 600 seconds. Run `zigmini status` and `zigmini doctor`, and read `~/.zigmini/logs/gateway.log` and `~/.zigmini/logs/bridge.log`. If the engine is missing or broken, install only the engine again with `zigmini setup --engine-only --accept-license`, then run `zigmini doctor --fix`.
|
|
299
|
+
- **The phone cannot connect, or the QR codes are not available.** You did not pick an external access method, so the app port is off. Pick a method, then scan the QR codes in the web screen settings:
|
|
300
|
+
```sh
|
|
301
|
+
zigmini setup --access lan # or tailscale, or domain --domain https://<도메인>
|
|
302
|
+
```
|
|
303
|
+
- **After the installation the agent does not answer.** The model account is not logged in (for example you typed `s` at the login step). Do install steps 15 to 18 (`bun add -g omo-ai@5.1.35`, `omo`, `/login`). Then run `zigmini setup` again. It shows "Model accounts: logged in" and keeps the steps that are already done. If you use `--agent-dir`, start `omo` with `OMO_CODING_AGENT_DIR=<경로> omo` so that it logs in to that folder.
|
|
244
304
|
- Old DB backups, unused engine versions and files left by updates appear in "정리" (Clean up) in the web screen settings. Only the items you select are deleted.
|
|
245
305
|
|
|
246
306
|
## Uninstall
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
사용자에게 보여 주는 답변은 ASD-STE100의 명확한 기술문서 작성 원칙을 따른다. 짧은 능동문을 쓰고, 한 문장에는 한 가지 내용만 담는다. 주체·대상·행동을 명확히 밝히고, 같은 대상에는 같은 용어를 쓴다.
|
|
@@ -19,3 +19,9 @@ zigmini 패키지 공통 에이전트 규칙입니다. 게이트웨이 브리지
|
|
|
19
19
|
14. 사용자는 게이트웨이 프로필의 닉네임으로 부릅니다.
|
|
20
20
|
15. main은 오래 기다리거나 오래 실행하는 작업(배포, 전체 테스트, 뮤테이션 테스트, 다른 작업 기다리기)을 맡기면, 그 작업의 세션 기록이 30분 넘게 바뀌지 않을 때 main을 깨우는 감시를 직접 겁니다. 작업이 끝나면 감시를 끕니다. 작업의 "기다리는 중"·"진행 중" 보고만 믿지 않습니다. 사용자에게 그렇게 말하기 전에 그 작업의 마지막 기록 시각과 실행 중인 프로세스를 확인합니다. 작업이 멈췄으면 바로 그 작업에 조치를 보내고 사용자에게 알립니다. 작업은 긴 명령을 세션과 분리해 실행하고, 결과 파일을 직접 확인하며, 시간 상한을 겁니다.
|
|
21
21
|
16. 작업 하나에 나눌 수 있는 항목이 여럿이거나(예: 버그 여러 개, 구현·검증·문서 단계) 앞 단계를 기다려야 하는 단계가 있으면, 작업 세션은 mass-ulw 스킬을 씁니다. 작업 세션은 처음에 단계와 하위 작업을 정합니다. 서로 기다릴 필요가 없는 하위 작업은 최대한 병렬로 돌립니다. main은 이런 작업을 맡길 때 작업 지시문에 mass-ulw를 쓰라고 적습니다. 파일 하나 고침, 문서 한 줄 같은 작은 작업에는 mass-ulw를 쓰지 않습니다. 같은 파일을 고치는 하위 작업은 같은 단계에서 함께 돌리지 않습니다. 이런 하위 작업은 각자 worktree를 쓰거나 순서대로 돌립니다. 하위 작업을 병렬로 돌려도 무거운 명령(전체 테스트, 뮤테이션 테스트, 빌드 등)은 그 프로젝트나 설치 규칙이 정한 동시 실행 상한을 지킵니다. 규칙 8의 정리와 규칙 15의 감시는 하위 작업에도 적용합니다. 사용자가 질문만 하면 진행 중인 작업을 mass-ulw로 바꾸지 않습니다(규칙 4).
|
|
22
|
+
17. 모든 사용자용 글(main 답변, 작업 보고, 프리코멘트, 확인함 질문)에 ASD-STE100의 명확한 기술 글쓰기 원칙을 적용합니다.
|
|
23
|
+
- 사용자가 요청하거나 설정한 언어로 씁니다. 특정 언어를 강제하거나 영어 통제 어휘를 다른 언어에 그대로 적용하지 않습니다.
|
|
24
|
+
- 짧은 능동문을 씁니다. 한 문장에는 하나의 핵심 사실이나 행동을 담습니다. 수행 주체, 작업 대상, 행동을 명확히 씁니다.
|
|
25
|
+
- 같은 대상에는 같은 명칭을 씁니다. 필요한 전문 용어와 약어는 처음에 뜻을 설명합니다. 불필요한 표현은 줄이되 대상, 조건, 결과를 이해하는 데 필요한 정보는 남깁니다.
|
|
26
|
+
- 절차는 실행 순서대로 씁니다. 각 단계에는 행동 하나를 적습니다. 필요한 선행 조건은 해당 행동 앞에 적습니다.
|
|
27
|
+
- 결과와 계획을 구분합니다. 상태 보고는 완료된 일, 미완료된 일과 차단 원인, 다음 행동을 구분해 씁니다. 확인된 사실과 추정을 나누고 근거 없는 확신을 쓰지 않습니다. "승인", "검증", "반영", "배포"만 단독으로 쓰지 말고 누가 무엇을 허가하거나 확인하거나 바꾸었는지 명시합니다.
|
|
Binary file
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
-
"versionCode":
|
|
3
|
-
"versionName": "0.8.0-beta.
|
|
4
|
-
"sha256": "
|
|
2
|
+
"versionCode": 26,
|
|
3
|
+
"versionName": "0.8.0-beta.7",
|
|
4
|
+
"sha256": "f942411ee27d4f6e909e7f7039df209b92c450653a204afbf341ff96bfa71e73"
|
|
5
5
|
}
|
package/assets/build.json
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"commit":"
|
|
1
|
+
{"commit":"e452e86a218e619d9e639cd6a4b3d92c22c33e0c"}
|
package/docs/manual.ko.md
CHANGED
|
@@ -57,6 +57,16 @@ Shift+Enter는 줄을 바꿉니다. 한글 조합 중에 누른 Enter는 메시
|
|
|
57
57
|
|
|
58
58
|
에이전트가 일하는 동안 "중단" 버튼이 보입니다. 이 버튼을 누르면 진행 중인 작업을 멈춥니다.
|
|
59
59
|
|
|
60
|
+
#### 대화 요약
|
|
61
|
+
|
|
62
|
+
압축은 같은 세션을 계속 쓰기 위해 오래된 대화 내용을 요약하는 작업입니다. 요약이 작업을 막으면 채팅에 요청별 시작 안내 한 개와 완료·취소·실패 안내 한 개가 나타납니다. 백그라운드 준비만으로는 채팅 안내를 추가하지 않습니다. 세션이 유휴 상태일 때 준비된 요약을 적용하는 경우에도 기다리라고 안내하지 않으므로 채팅 안내를 추가하지 않습니다. 직접 실행한 요약은 시작 안내와 종료 안내를 그대로 표시합니다. 재접속하면 저장된 안내를 다시 표시합니다. 요약을 새로 요청하지는 않습니다.
|
|
63
|
+
|
|
64
|
+
새 필수 설정은 없습니다. `compaction.model`이 없거나 `"auto"`이면 엔진은 현재 세션의 제공자 안에서 입력을 수용할 수 있는 요약 모델을 고릅니다. 기존 `provider/model` 직접 설정은 유지합니다. 다른 제공자의 모델을 직접 지정하면 요약 대상 대화를 그 제공자로 전송합니다. 직접 지정한 모델이 잘못되었거나 사용할 수 없어도 엔진이 몰래 다른 모델로 바꾸지 않습니다. 기존 전역·신뢰한 프로젝트·실행 중 설정의 우선순위는 유지합니다.
|
|
65
|
+
|
|
66
|
+
요약에 실패하면 엔진은 이전 작업 문맥을 유지하고 멈춥니다. 비상 축약본을 대신 적용하지 않습니다. 안내에 따라 모델 설정을 확인하거나 요약 제공자에 다시 로그인해 주세요. 사용 한도가 복구되기를 기다리거나 계정·조직 권한을 확인해야 할 수도 있습니다. 다른 실패도 원인을 해결한 뒤 계속할 지시를 보내거나 명시적으로 다시 시도해 주세요. 게이트웨이는 이전 입력을 다시 보내거나 새 세션을 시작하지 않습니다. 취소는 실패와 구분해서 표시합니다. 정상 요약도 모든 세부 정보의 보존을 보증하지 않습니다. 계속할 때 중요한 조건을 확인해 주세요.
|
|
67
|
+
|
|
68
|
+
게이트웨이는 메인과 작업 세션을 엔진의 기존 앱 모드로 엽니다. 그래서 응답은 터미널이 아니라 채팅 화면에 맞춰집니다. 바꿀 설정은 없습니다. 앱 모드는 모든 모델 응답이 유효한 JSON 같은 요청 형식을 지킨다고 보장하지 않으며, 위의 요약 실패 복구도 바꾸지 않습니다.
|
|
69
|
+
|
|
60
70
|
새 대화를 만들려면 사이드바의 + 버튼을 누릅니다. 대화 이름을 묻는 창이 뜹니다.
|
|
61
71
|
|
|
62
72
|
#### 슬래시 명령 메뉴
|
|
@@ -163,6 +173,13 @@ README의 '명령' 절에 따르면 채팅에서 `/usage`를 보내면 게이트
|
|
|
163
173
|
|
|
164
174
|
이름 입력란에서 Enter는 저장하고 Esc는 취소합니다. 입력란을 벗어나도 저장합니다. 이름은 게이트웨이에 저장됩니다. 저장에 실패하면 이 브라우저에만 바뀐 이름이 보입니다.
|
|
165
175
|
|
|
176
|
+
#### 보안검사
|
|
177
|
+
|
|
178
|
+
- "보안검사 켜짐/꺼짐"은 보내는 메시지의 검사를 켜고 끕니다. 기본은 켜짐이고 게이트웨이가 설정을 기억합니다.
|
|
179
|
+
- 메시지에 비밀키, 토큰, 비밀번호, 쿠키, 홈 폴더 경로, 내부 주소 같은 값이 있으면 보내지 않습니다. 채팅에 "보안검사 결과" 카드가 뜨고 값마다 종류, 실제 값, 줄과 칸을 보여 줍니다.
|
|
180
|
+
- "보내기"를 누르면 원래 메시지를 에이전트에 보냅니다. "보내지 않기"를 누르면 버리고 글을 입력창에 되돌립니다.
|
|
181
|
+
- 확인함에서 입력한 답도 같은 검사를 거치고, 카드는 채팅에 뜹니다.
|
|
182
|
+
|
|
166
183
|
#### 업데이트
|
|
167
184
|
|
|
168
185
|
- "지금 버전"과 "새 버전"이 보입니다.
|
|
@@ -208,7 +225,7 @@ Android 앱(APK)을 받는 QR이 보입니다. 폰 카메라로 QR을 찍어 APK
|
|
|
208
225
|
|
|
209
226
|
#### 정리
|
|
210
227
|
|
|
211
|
-
게이트웨이가 지워도 되는 후보를 보여 줍니다. 후보는 DB 백업, 엔진 버전 폴더, 업데이트 남은 파일, 임시 폴더, 이전 RPC 데몬입니다. 지울 항목을 고르고 "선택한 항목 정리"를 누릅니다.
|
|
228
|
+
게이트웨이가 지워도 되는 후보를 보여 줍니다. 후보는 DB 백업, 엔진 버전 폴더, 업데이트 남은 파일, 임시 폴더, 이전 RPC 데몬입니다. 지울 항목을 고르고 "선택한 항목 정리"를 누릅니다. 후보 수 옆의 "전체 선택"을 누르면 모든 후보를 한 번에 고르거나 모두 풉니다.
|
|
212
229
|
|
|
213
230
|
#### 음성 설정
|
|
214
231
|
|
|
@@ -312,7 +329,12 @@ Ctrl 단축키는 Cmd, Alt, Shift와 함께 누르면 동작하지 않습니다.
|
|
|
312
329
|
### 4.6 알림
|
|
313
330
|
|
|
314
331
|
- 등록한 게이트웨이마다 알림 연결이 하나씩 있습니다.
|
|
315
|
-
-
|
|
332
|
+
- 웹 설정을 열거나 앱 헤더의 지그를 눌러 작업 상태 화면을 연 뒤 앱 알림 수준을 고릅니다.
|
|
333
|
+
- "확인함 알림만"이 기본값입니다. 기존 확인 요청 알림을 유지합니다.
|
|
334
|
+
- "모든 답장 알림"은 확인 요청 알림과 main·작업 에이전트의 개별 완성 답장을 알립니다. 사용자 메시지와 스트리밍 조각은 알리지 않습니다.
|
|
335
|
+
- 두 화면은 같은 게이트웨이 저장값을 바꿉니다. 앱은 현재 게이트웨이만 바꿉니다. 설정을 바꿔도 과거 답장을 다시 알리지 않습니다.
|
|
336
|
+
- 일정과 명시적 알림은 이 선택과 별개입니다. 확인 요청 알림의 기존 웹 화면 표시 여부 규칙도 유지합니다.
|
|
337
|
+
- 답장 알림을 누르면 보낸 게이트웨이의 채팅을 엽니다. 같은 답장을 재전송해도 다시 알리지 않습니다.
|
|
316
338
|
- 알림은 소리 없이 진동만 합니다.
|
|
317
339
|
- 알림을 누르면 그 알림을 보낸 게이트웨이로 바꿉니다.
|
|
318
340
|
- 연결 유지 알림에는 게이트웨이마다 연결 상태가 보입니다. "인증 거부, 다시 등록하세요"가 보이면 폰을 다시 등록합니다.
|
|
@@ -378,5 +400,6 @@ Ctrl 단축키는 Cmd, Alt, Shift와 함께 누르면 동작하지 않습니다.
|
|
|
378
400
|
- `zigmini pair [--apk]`: 폰 등록 QR이나 앱 내려받기 QR을 보여 줍니다.
|
|
379
401
|
- `zigmini consent`: 권한 안내를 보이고 동의를 기록합니다.
|
|
380
402
|
- `zigmini update [버전]`: 업데이트합니다.
|
|
403
|
+
- `zigmini rotate-main [--restart]`: main 대화를 새 세션으로 교체합니다. "새 세션"과 같습니다. 먼저 운영자 허가를 받습니다. 자세한 내용은 운영 문서를 보세요.
|
|
381
404
|
|
|
382
405
|
전체 목록은 README의 '명령' 절을 보세요.
|
package/docs/manual.md
CHANGED
|
@@ -57,6 +57,16 @@ Shift+Enter starts a new line. Enter pressed during Korean IME composition doesn
|
|
|
57
57
|
|
|
58
58
|
While the agent works, the 중단 (stop) button shows. Click it to stop the running work.
|
|
59
59
|
|
|
60
|
+
#### Conversation summaries
|
|
61
|
+
|
|
62
|
+
Compaction summarizes older conversation content so the same session can continue. When a summary blocks your work, chat shows one start notice and one completion, cancellation or failure notice for that request. Background preparation alone does not add chat notices. Applying a prepared summary while the session is idle doesn't ask you to wait either, so it adds no chat notice. A manual summary keeps its start and terminal notices. Reconnecting replays the stored notices, not a new summary request.
|
|
63
|
+
|
|
64
|
+
No new setting is required. With `compaction.model` absent or set to `"auto"`, the engine selects an eligible summary model from the current session's provider. The selected model must fit the input. Existing explicit `provider/model` settings stay in effect. An explicit model from another provider sends the conversation being summarized to that provider. The engine does not silently replace an invalid or unavailable explicit model. Existing global, trusted-project and runtime setting precedence stays in effect.
|
|
65
|
+
|
|
66
|
+
If a summary fails, the engine keeps the previous working context and stops instead of applying an emergency shortened substitute. The notice tells you what to do: check the model setting, log in to the summary provider again, wait for the usage limit to recover, or check account and organization permissions. Other failures require you to resolve the cause and explicitly continue or retry. The gateway does not resend the previous input or start a new session. A cancellation is separate from a failure. A successful summary is not a guarantee that every detail survives; check critical requirements when you continue.
|
|
67
|
+
|
|
68
|
+
The gateway opens main and work sessions in the engine's existing app mode, so replies are shaped for the chat screen rather than a terminal. You don't need to change any setting. App mode doesn't guarantee that every model answer follows a requested format such as valid JSON, and it doesn't change the summary recovery above.
|
|
69
|
+
|
|
60
70
|
To start a new conversation, click + in the sidebar. A prompt asks for its name.
|
|
61
71
|
|
|
62
72
|
#### Slash command menu
|
|
@@ -163,6 +173,13 @@ The profile sits at the bottom of the sidebar.
|
|
|
163
173
|
|
|
164
174
|
In a name field, Enter saves and Esc cancels. Leaving the field also saves. Names are stored on the gateway. If that fails, only this browser shows the new name.
|
|
165
175
|
|
|
176
|
+
#### Security check (보안검사)
|
|
177
|
+
|
|
178
|
+
- "보안검사 켜짐/꺼짐" (security check on/off) turns the check of your messages on or off. It is on by default and the gateway keeps the choice.
|
|
179
|
+
- When a message holds a private key, token, password, cookie, home folder path, internal address or similar value, it is not sent. A "보안검사 결과" card in the chat lists each value, its kind and its line and column.
|
|
180
|
+
- "보내기" (send) sends the original message to the agent. "보내지 않기" (don't send) drops it and puts the text back in the input box.
|
|
181
|
+
- An answer typed in the inbox is checked the same way; its card shows in the chat.
|
|
182
|
+
|
|
166
183
|
#### Update (업데이트)
|
|
167
184
|
|
|
168
185
|
- The current and new versions are shown.
|
|
@@ -208,7 +225,7 @@ A QR for the Android app (APK) shows. Scan it with the phone camera, get the APK
|
|
|
208
225
|
|
|
209
226
|
#### Cleanup (정리)
|
|
210
227
|
|
|
211
|
-
The gateway lists things that are safe to delete: DB backups, engine version folders, leftover update files, temp folders and old RPC daemons. Tick the ones to remove and click 선택한 항목 정리 (clean selected).
|
|
228
|
+
The gateway lists things that are safe to delete: DB backups, engine version folders, leftover update files, temp folders and old RPC daemons. Tick the ones to remove and click 선택한 항목 정리 (clean selected). The 전체 선택 (select all) box beside the count ticks every candidate at once, or clears them all.
|
|
212
229
|
|
|
213
230
|
#### Voice settings
|
|
214
231
|
|
|
@@ -312,7 +329,12 @@ Tap the Zig face to open it. Slot states include running, waiting for input, wai
|
|
|
312
329
|
### 4.6 Notifications
|
|
313
330
|
|
|
314
331
|
- Each registered gateway has its own notification connection.
|
|
315
|
-
-
|
|
332
|
+
- Open web settings or tap Zig in the app header to open work status, then choose the app notification level.
|
|
333
|
+
- "확인함 알림만" (Inbox notifications only) is the default. It keeps the existing confirmation notifications.
|
|
334
|
+
- "모든 답장 알림" (All reply notifications) includes confirmation notifications and each completed main/work agent reply. User messages and streaming fragments do not alert.
|
|
335
|
+
- Both screens edit the same saved gateway value. The app edits only its active gateway. Changing the value does not replay old replies.
|
|
336
|
+
- Schedule reminders and explicit notifications are independent of this choice. The existing visible-web rule for confirmation notifications still applies.
|
|
337
|
+
- Reply notification taps open chat on the sending gateway. Replayed delivery of the same reply does not alert again.
|
|
316
338
|
- Notifications vibrate with no sound.
|
|
317
339
|
- Tapping a notification switches to the gateway that sent it.
|
|
318
340
|
- The keep connected notification lists each gateway's state. If it says "인증 거부, 다시 등록하세요" (auth refused), register the phone again.
|
|
@@ -378,5 +400,6 @@ Main commands for the Mac terminal:
|
|
|
378
400
|
- `zigmini pair [--apk]`: shows the phone registration QR or the app download QR.
|
|
379
401
|
- `zigmini consent`: shows the permission notice and records consent.
|
|
380
402
|
- `zigmini update [version]`: updates.
|
|
403
|
+
- `zigmini rotate-main [--restart]`: moves the main conversation to a new session, like "새 세션" (new session). Ask the operator first. See the operator guide.
|
|
381
404
|
|
|
382
405
|
For the full list, see the README's Commands section.
|
|
@@ -2,6 +2,7 @@ import { readFileSync } from "node:fs";
|
|
|
2
2
|
import { isDeepStrictEqual } from "node:util";
|
|
3
3
|
import { runtimePaths } from "../../src/runtime/paths.ts";
|
|
4
4
|
import { agentRules } from "../../src/agent-rules.ts";
|
|
5
|
+
import { applyRequestRules, loadRequestRules, type ProviderRequestEvent } from "../../src/agent-request-rules.ts";
|
|
5
6
|
|
|
6
7
|
// The pinned runtime supplies this SDK surface, just as it does for model-control.ts.
|
|
7
8
|
type Entry = { id: string; type: string; customType?: string; data?: unknown; message?: { role: string; content: unknown; toolName?: string; details?: unknown; toolCallId?: string } };
|
|
@@ -18,6 +19,7 @@ interface ExtensionApi {
|
|
|
18
19
|
readonly events: { on(name: string, handler: (data: unknown) => void): () => void };
|
|
19
20
|
on(event: "session_start", handler: (event: unknown, ctx: Context) => void): void;
|
|
20
21
|
on(event: "before_agent_start", handler: (event: { systemPrompt: string }) => unknown, options: { previewSafe: boolean }): void;
|
|
22
|
+
on(event: "before_provider_request", handler: (event: ProviderRequestEvent) => unknown): void;
|
|
21
23
|
registerTool(tool: Tool): void;
|
|
22
24
|
appendEntry(customType: string, data: unknown): void;
|
|
23
25
|
}
|
|
@@ -147,6 +149,8 @@ export default function taskControl(pi: ExtensionApi): void {
|
|
|
147
149
|
const rules = agentRules();
|
|
148
150
|
console.warn(rules.log);
|
|
149
151
|
const rulesText = rules.text === "" ? "" : `\n\n${rules.text}`;
|
|
152
|
+
const requestRules = loadRequestRules();
|
|
153
|
+
pi.on("before_provider_request", (event) => applyRequestRules(event, requestRules));
|
|
150
154
|
|
|
151
155
|
for (const kind of ["asked", "replied"] as const) {
|
|
152
156
|
pi.events.on(`permission_${kind}`, (data) => {
|