agentwake 1.0.0 → 1.0.2-beta.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/.cursor/hooks.json +2 -2
- package/.env.example +3 -2
- package/README.md +221 -81
- package/README.zh-CN.md +277 -0
- package/dist/adapters/claude-hook-adapter.d.ts.map +1 -1
- package/dist/adapters/claude-hook-adapter.js +67 -0
- package/dist/adapters/claude-hook-adapter.js.map +1 -1
- package/dist/adapters/cursor-hook-adapter.d.ts.map +1 -1
- package/dist/adapters/cursor-hook-adapter.js +133 -47
- package/dist/adapters/cursor-hook-adapter.js.map +1 -1
- package/dist/adapters/cursor-terminal-hook.d.ts +12 -0
- package/dist/adapters/cursor-terminal-hook.d.ts.map +1 -1
- package/dist/adapters/cursor-terminal-hook.js +158 -4
- package/dist/adapters/cursor-terminal-hook.js.map +1 -1
- package/dist/adapters/qoder-log-adapter.d.ts +9 -0
- package/dist/adapters/qoder-log-adapter.d.ts.map +1 -1
- package/dist/adapters/qoder-log-adapter.js +188 -19
- package/dist/adapters/qoder-log-adapter.js.map +1 -1
- package/dist/bootstrap.d.ts.map +1 -1
- package/dist/bootstrap.js +25 -5
- package/dist/bootstrap.js.map +1 -1
- package/dist/cli.js +49 -139
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts +12 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +45 -3
- package/dist/config.js.map +1 -1
- package/dist/installers/claude-code-installer.d.ts +15 -0
- package/dist/installers/claude-code-installer.d.ts.map +1 -0
- package/dist/installers/claude-code-installer.js +109 -0
- package/dist/installers/claude-code-installer.js.map +1 -0
- package/dist/installers/cursor-installer.d.ts +16 -0
- package/dist/installers/cursor-installer.d.ts.map +1 -0
- package/dist/installers/cursor-installer.js +113 -0
- package/dist/installers/cursor-installer.js.map +1 -0
- package/dist/notifiers/desktop-notifier.d.ts +10 -1
- package/dist/notifiers/desktop-notifier.d.ts.map +1 -1
- package/dist/notifiers/desktop-notifier.js +91 -8
- package/dist/notifiers/desktop-notifier.js.map +1 -1
- package/dist/notifiers/dingtalk-notifier.d.ts +15 -0
- package/dist/notifiers/dingtalk-notifier.d.ts.map +1 -0
- package/dist/notifiers/dingtalk-notifier.js +52 -0
- package/dist/notifiers/dingtalk-notifier.js.map +1 -0
- package/dist/notifiers/feishu-notifier.d.ts +14 -0
- package/dist/notifiers/feishu-notifier.d.ts.map +1 -0
- package/dist/notifiers/feishu-notifier.js +60 -0
- package/dist/notifiers/feishu-notifier.js.map +1 -0
- package/dist/notifiers/wecom-notifier.d.ts +13 -0
- package/dist/notifiers/wecom-notifier.d.ts.map +1 -0
- package/dist/notifiers/wecom-notifier.js +39 -0
- package/dist/notifiers/wecom-notifier.js.map +1 -0
- package/dist/paths.d.ts +9 -0
- package/dist/paths.d.ts.map +1 -0
- package/dist/paths.js +27 -0
- package/dist/paths.js.map +1 -0
- package/dist/run-gateway.d.ts +0 -1
- package/dist/run-gateway.d.ts.map +1 -1
- package/dist/run-gateway.js +11 -1
- package/dist/run-gateway.js.map +1 -1
- package/dist/setup.d.ts +2 -0
- package/dist/setup.d.ts.map +1 -0
- package/dist/setup.js +355 -0
- package/dist/setup.js.map +1 -0
- package/dist/utils/logger.d.ts.map +1 -1
- package/dist/utils/logger.js +20 -2
- package/dist/utils/logger.js.map +1 -1
- package/package.json +3 -2
- package/scripts/cursor-hook-forwarder.mjs +50 -4
- package/web/icons/icon-192.png +0 -0
- package/web/icons/icon-512.png +0 -0
- package/web/index.html +1 -1
- package/web/manifest.webmanifest +4 -4
package/.cursor/hooks.json
CHANGED
|
@@ -3,12 +3,12 @@
|
|
|
3
3
|
"hooks": {
|
|
4
4
|
"beforeShellExecution": [
|
|
5
5
|
{
|
|
6
|
-
"command": "sh -lc 'CAROOT=\"$(mkcert -CAROOT 2>/dev/null)\"; EXTRA_CA=\"${NODE_EXTRA_CA_CERTS:-$CAROOT/rootCA.pem}\"; AGENTWAKE_GATEWAY_URL=\"${AGENTWAKE_GATEWAY_URL:-https://127.0.0.1:3199/hooks/cursor}\" NODE_EXTRA_CA_CERTS=\"$EXTRA_CA\" AGENTWAKE_CURSOR_APPROVAL_MODE=\"${AGENTWAKE_CURSOR_APPROVAL_MODE:-cursor-ask}\" AGENTWAKE_CURSOR_ENFORCE_ASK=\"${AGENTWAKE_CURSOR_ENFORCE_ASK:-0}\" node \"./scripts/cursor-hook-forwarder.mjs\"'"
|
|
6
|
+
"command": "sh -lc 'CAROOT=\"$(mkcert -CAROOT 2>/dev/null)\"; EXTRA_CA=\"${NODE_EXTRA_CA_CERTS:-$CAROOT/rootCA.pem}\"; AGENTWAKE_GATEWAY_URL=\"${AGENTWAKE_GATEWAY_URL:-https://127.0.0.1:3199/hooks/cursor}\" NODE_EXTRA_CA_CERTS=\"$EXTRA_CA\" CURSOR_AGENT=\"${CURSOR_AGENT:-1}\" AGENTWAKE_CURSOR_APPROVAL_MODE=\"${AGENTWAKE_CURSOR_APPROVAL_MODE:-cursor-ask}\" AGENTWAKE_CURSOR_ENFORCE_ASK=\"${AGENTWAKE_CURSOR_ENFORCE_ASK:-0}\" node \"./scripts/cursor-hook-forwarder.mjs\"'"
|
|
7
7
|
}
|
|
8
8
|
],
|
|
9
9
|
"afterShellExecution": [
|
|
10
10
|
{
|
|
11
|
-
"command": "sh -lc 'CAROOT=\"$(mkcert -CAROOT 2>/dev/null)\"; EXTRA_CA=\"${NODE_EXTRA_CA_CERTS:-$CAROOT/rootCA.pem}\"; AGENTWAKE_GATEWAY_URL=\"${AGENTWAKE_GATEWAY_URL:-https://127.0.0.1:3199/hooks/cursor}\" NODE_EXTRA_CA_CERTS=\"$EXTRA_CA\" AGENTWAKE_CURSOR_APPROVAL_MODE=\"${AGENTWAKE_CURSOR_APPROVAL_MODE:-cursor-ask}\" AGENTWAKE_CURSOR_ENFORCE_ASK=\"${AGENTWAKE_CURSOR_ENFORCE_ASK:-0}\" node \"./scripts/cursor-hook-forwarder.mjs\"'"
|
|
11
|
+
"command": "sh -lc 'CAROOT=\"$(mkcert -CAROOT 2>/dev/null)\"; EXTRA_CA=\"${NODE_EXTRA_CA_CERTS:-$CAROOT/rootCA.pem}\"; AGENTWAKE_GATEWAY_URL=\"${AGENTWAKE_GATEWAY_URL:-https://127.0.0.1:3199/hooks/cursor}\" NODE_EXTRA_CA_CERTS=\"$EXTRA_CA\" CURSOR_AGENT=\"${CURSOR_AGENT:-1}\" AGENTWAKE_CURSOR_APPROVAL_MODE=\"${AGENTWAKE_CURSOR_APPROVAL_MODE:-cursor-ask}\" AGENTWAKE_CURSOR_ENFORCE_ASK=\"${AGENTWAKE_CURSOR_ENFORCE_ASK:-0}\" node \"./scripts/cursor-hook-forwarder.mjs\"'"
|
|
12
12
|
}
|
|
13
13
|
]
|
|
14
14
|
}
|
package/.env.example
CHANGED
|
@@ -1,18 +1,19 @@
|
|
|
1
1
|
AGENTWAKE_HOST=0.0.0.0
|
|
2
2
|
AGENTWAKE_PORT=3199
|
|
3
|
-
AGENTWAKE_HTTPS_ENABLED=
|
|
3
|
+
AGENTWAKE_HTTPS_ENABLED=0
|
|
4
4
|
AGENTWAKE_HTTPS_CERT_PATH=certs/dev-cert.pem
|
|
5
5
|
AGENTWAKE_HTTPS_KEY_PATH=certs/dev-key.pem
|
|
6
6
|
AGENTWAKE_CURSOR_HOOK_PATH=/hooks/cursor
|
|
7
7
|
AGENTWAKE_CLAUDE_HOOK_PATH=/hooks/claude
|
|
8
8
|
AGENTWAKE_QODER_LOG_PATH=/path/to/qoder.log
|
|
9
9
|
AGENTWAKE_WS_PATH=/ws
|
|
10
|
+
AGENTWAKE_DESKTOP_ENABLED=1
|
|
11
|
+
AGENTWAKE_PWA_ENABLED=0
|
|
10
12
|
AGENTWAKE_DEDUPE_WINDOW_MS=10000
|
|
11
13
|
AGENTWAKE_RATE_LIMIT_WINDOW_MS=10000
|
|
12
14
|
AGENTWAKE_RATE_LIMIT_MAX_EVENTS=40
|
|
13
15
|
AGENTWAKE_ALLOWED_HOOK_IPS=
|
|
14
16
|
AGENTWAKE_VAPID_SUBJECT=mailto:agentwake@example.com
|
|
15
|
-
AGENTWAKE_DESKTOP_MODE=notification
|
|
16
17
|
AGENTWAKE_CURSOR_APPROVAL_MODE=cursor-ask
|
|
17
18
|
AGENTWAKE_CURSOR_ENFORCE_ASK=0
|
|
18
19
|
# AGENTWAKE_VAPID_PUBLIC_KEY=
|
package/README.md
CHANGED
|
@@ -1,137 +1,277 @@
|
|
|
1
|
-
# AgentWake
|
|
1
|
+
# AgentWake
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
3
|
+
English | [简体中文](README.zh-CN.md)
|
|
4
|
+
|
|
5
|
+
A cross-editor AI programming notification gateway. Supports Cursor / Claude Code / Qoder. Real-time push notifications to desktop, mobile, and IM groups when AI tasks are completed, abnormally terminated, or waiting for authorization.
|
|
6
|
+
|
|
7
|
+
## Preview
|
|
8
|
+
|
|
9
|
+
<p align="center">
|
|
10
|
+
<img src="docs/screenshots/web.jpg" width="48%" alt="Web Interface" />
|
|
11
|
+
<img src="docs/screenshots/mobile_notify.jpg" width="48%" alt="Mobile Notification" />
|
|
12
|
+
</p>
|
|
13
|
+
|
|
14
|
+
<p align="center">
|
|
15
|
+
<img src="docs/screenshots/cursor.png" width="48%" alt="Cursor Notification" />
|
|
16
|
+
<img src="docs/screenshots/qoder.png" width="48%" alt="Qoder Notification" />
|
|
17
|
+
</p>
|
|
5
18
|
|
|
6
19
|
---
|
|
7
20
|
|
|
8
|
-
##
|
|
21
|
+
## Core Features
|
|
9
22
|
|
|
10
|
-
-
|
|
11
|
-
-
|
|
12
|
-
-
|
|
13
|
-
-
|
|
14
|
-
-
|
|
23
|
+
- **Multi-editor Support** — Cursor Hook, Claude Code Hook, Qoder log listening
|
|
24
|
+
- **Multi-channel Notifications** — Desktop system notifications, PWA web push, DingTalk, Feishu, WeCom
|
|
25
|
+
- **Claude Code Deep Integration** — Supports all Hook events like Stop / Notification / StopFailure / SessionEnd, customizable notification titles for each event
|
|
26
|
+
- **Mobile Real-time Push** — Built-in PWA Web App, HTTPS + WebSocket millisecond push, supports QR code connection
|
|
27
|
+
- **Smart Anti-disturbance** — Event deduplication + rate limiting to prevent message bombing
|
|
28
|
+
- **Interactive Configuration** — `agentwake setup` guides you through all configurations step by step
|
|
15
29
|
|
|
16
30
|
---
|
|
17
31
|
|
|
18
|
-
##
|
|
32
|
+
## Quick Start
|
|
33
|
+
|
|
34
|
+
### Prerequisites
|
|
35
|
+
|
|
36
|
+
- Node.js >= 18
|
|
37
|
+
- [mkcert](https://github.com/FiloSottile/mkcert) (Only required when enabling PWA push)
|
|
38
|
+
|
|
39
|
+
### Installation
|
|
40
|
+
|
|
41
|
+
```bash
|
|
42
|
+
npm i -g agentwake
|
|
43
|
+
```
|
|
19
44
|
|
|
20
|
-
###
|
|
45
|
+
### Method 1: Interactive Guide (Recommended)
|
|
21
46
|
|
|
22
|
-
|
|
23
|
-
|
|
47
|
+
```bash
|
|
48
|
+
agentwake setup # Interactive configuration wizard
|
|
49
|
+
```
|
|
24
50
|
|
|
25
|
-
|
|
51
|
+
`setup` will guide you through:
|
|
52
|
+
1. Select AI tools (Claude Code / Cursor / All)
|
|
53
|
+
2. Select event types to listen to
|
|
54
|
+
3. Customize notification titles for each event (optional)
|
|
55
|
+
4. Select notification channels (DingTalk / Feishu / WeCom / PWA / Desktop)
|
|
56
|
+
5. Enter Webhook URLs and secrets
|
|
57
|
+
6. Automatically install editor hooks:
|
|
58
|
+
- Claude Code Hooks to `~/.claude/settings.json`
|
|
59
|
+
- Cursor Hooks to `~/.cursor/hooks.json` (relay script at `~/.agentwake/hooks/cursor-hook.sh`)
|
|
60
|
+
7. If PWA is enabled, generate HTTPS certificates automatically; otherwise default to HTTP
|
|
61
|
+
8. Start the service
|
|
26
62
|
|
|
27
|
-
|
|
28
|
-
```bash
|
|
29
|
-
npm i -g agentwake
|
|
30
|
-
```
|
|
63
|
+
### Method 2: Manual Configuration
|
|
31
64
|
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
*注意:初始化过程中会自动使用 mkcert 生成本地 HTTPS 证书。*
|
|
65
|
+
```bash
|
|
66
|
+
agentwake setup # Generate ~/.agentwake/.env and complete configuration
|
|
67
|
+
# Edit ~/.agentwake/.env to fill in configurations
|
|
68
|
+
agentwake start
|
|
69
|
+
```
|
|
38
70
|
|
|
39
|
-
|
|
40
|
-
```bash
|
|
41
|
-
agentwake start
|
|
42
|
-
```
|
|
71
|
+
All data is stored in the `~/.agentwake/` directory, no need to create a working directory manually.
|
|
43
72
|
|
|
44
|
-
|
|
73
|
+
### Method 3: Start from Source
|
|
74
|
+
|
|
75
|
+
```bash
|
|
76
|
+
git clone https://github.com/tjdxwwj/agentwake.git
|
|
77
|
+
cd agentwake
|
|
78
|
+
npm install
|
|
79
|
+
|
|
80
|
+
# Interactive setup
|
|
81
|
+
npm run setup
|
|
82
|
+
|
|
83
|
+
# Start development server
|
|
84
|
+
npm run dev
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
After starting, the service runs at `http://localhost:3199` by default, or `https://localhost:3199` when PWA is enabled.
|
|
45
88
|
|
|
46
89
|
---
|
|
47
90
|
|
|
48
|
-
##
|
|
91
|
+
## Notification Channels
|
|
49
92
|
|
|
50
|
-
|
|
93
|
+
| Channel | Configuration | Description |
|
|
94
|
+
|------|---------|------|
|
|
95
|
+
| Desktop Notification | Built-in, no config needed | macOS / Windows / Linux |
|
|
96
|
+
| PWA Web Push | Built-in, open service URL in mobile browser | Requires HTTPS, supports Service Worker system notifications |
|
|
97
|
+
| DingTalk | `AGENTWAKE_DINGTALK_WEBHOOK` | Group bot Webhook, supports signature verification |
|
|
98
|
+
| Feishu | `AGENTWAKE_FEISHU_WEBHOOK` | Group bot Webhook, supports signature verification |
|
|
99
|
+
| WeCom | `AGENTWAKE_WECOM_WEBHOOK` | Group bot Webhook, security guaranteed by URL Key |
|
|
51
100
|
|
|
52
|
-
|
|
53
|
-
1. 确保在目标项目中执行过 `agentwake init`。
|
|
54
|
-
2. 保持 `agentwake start` 运行。
|
|
55
|
-
3. 当 Cursor 终端触发需要用户授权的命令时,你将立刻收到通知。
|
|
101
|
+
### DingTalk Configuration
|
|
56
102
|
|
|
57
|
-
|
|
103
|
+
In DingTalk Group -> Group Settings -> Smart Group Assistant -> Add Bot -> Custom Webhook, copy the Webhook URL.
|
|
58
104
|
|
|
59
|
-
|
|
105
|
+
```env
|
|
106
|
+
AGENTWAKE_DINGTALK_WEBHOOK=https://oapi.dingtalk.com/robot/send?access_token=xxx
|
|
107
|
+
AGENTWAKE_DINGTALK_SECRET=SECxxx # Optional, signature secret
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
### Feishu Configuration
|
|
111
|
+
|
|
112
|
+
In Feishu Group -> Settings -> Bots -> Add Custom Bot, copy the Webhook URL.
|
|
113
|
+
|
|
114
|
+
```env
|
|
115
|
+
AGENTWAKE_FEISHU_WEBHOOK=https://open.feishu.cn/open-apis/bot/v2/hook/xxx
|
|
116
|
+
AGENTWAKE_FEISHU_SECRET=xxx # Optional, signature verification secret
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
### WeCom Configuration
|
|
120
|
+
|
|
121
|
+
In WeCom Group -> Group Bots -> Add Group Bot, copy the Webhook URL.
|
|
122
|
+
|
|
123
|
+
```env
|
|
124
|
+
AGENTWAKE_WECOM_WEBHOOK=https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=xxx
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
---
|
|
128
|
+
|
|
129
|
+
## Editor Integration
|
|
130
|
+
|
|
131
|
+
### Claude Code
|
|
132
|
+
|
|
133
|
+
Running `agentwake setup` will automatically:
|
|
134
|
+
- Generate Hook relay script to `~/.agentwake/hooks/claude-hook-relay.sh`
|
|
135
|
+
- Write Hook configuration to `~/.claude/settings.json`
|
|
136
|
+
|
|
137
|
+
Supported Hook events:
|
|
138
|
+
|
|
139
|
+
| Event | Description | Enabled by Default |
|
|
140
|
+
|------|------|---------|
|
|
141
|
+
| Notification | Requires user attention | Yes |
|
|
142
|
+
| Stop | Task completed | Yes |
|
|
143
|
+
| StopFailure | Task terminated abnormally | Yes |
|
|
144
|
+
| SessionEnd | Session ended | Yes |
|
|
145
|
+
| SessionStart | Session started | No |
|
|
146
|
+
| PreToolUse | Before tool use | No |
|
|
147
|
+
| PostToolUse | After tool use | No |
|
|
148
|
+
|
|
149
|
+
### Cursor
|
|
150
|
+
|
|
151
|
+
Running `agentwake setup` will automatically:
|
|
152
|
+
- Generate Cursor relay script to `~/.agentwake/hooks/cursor-hook.sh`
|
|
153
|
+
- Write `beforeShellExecution` / `afterShellExecution` Hook commands to `~/.cursor/hooks.json`
|
|
154
|
+
|
|
155
|
+
Then keep `agentwake start` running to receive Cursor approval/lifecycle notifications.
|
|
156
|
+
|
|
157
|
+
### Qoder
|
|
158
|
+
|
|
159
|
+
Automatically discover log directory, or specify manually:
|
|
60
160
|
|
|
61
|
-
如果自动发现失败,你可以通过环境变量手动指定日志路径:
|
|
62
161
|
```bash
|
|
63
|
-
AGENTWAKE_QODER_LOG_PATH="/
|
|
162
|
+
AGENTWAKE_QODER_LOG_PATH="/path/to/agent.log" agentwake start
|
|
64
163
|
```
|
|
65
164
|
|
|
66
165
|
---
|
|
67
166
|
|
|
68
|
-
##
|
|
167
|
+
## Custom Notification Titles
|
|
168
|
+
|
|
169
|
+
Set interactively via `agentwake setup`, or configure directly in `.env`:
|
|
69
170
|
|
|
70
|
-
|
|
171
|
+
```env
|
|
172
|
+
AGENTWAKE_CLAUDE_TITLE_STOP=AI Done
|
|
173
|
+
AGENTWAKE_CLAUDE_TITLE_STOP_FAILURE=AI Failed
|
|
174
|
+
AGENTWAKE_CLAUDE_TITLE_NOTIFICATION=AI Needs Attention
|
|
175
|
+
AGENTWAKE_CLAUDE_TITLE_SESSION_END=Session Ended
|
|
176
|
+
```
|
|
71
177
|
|
|
72
|
-
|
|
73
|
-
在电脑终端运行 `mkcert -CAROOT`,找到目录下的 `rootCA.pem` 文件。
|
|
74
|
-
2. 安装到手机:
|
|
75
|
-
- **iOS**:将文件发送到手机,在“设置”中安装描述文件,并在“通用 -> 关于本机 -> 证书信任设置”中开启“完全信任”。
|
|
76
|
-
- **Android**:将文件发送到手机,在安全设置中“从存储设备安装” CA 证书(部分安卓系统可能需要将后缀改为 `.crt`)。
|
|
77
|
-
3. Node.js TLS 兼容(如果遇到本地转发报错):
|
|
78
|
-
```bash
|
|
79
|
-
export NODE_EXTRA_CA_CERTS="$(mkcert -CAROOT)/rootCA.pem"
|
|
80
|
-
```
|
|
178
|
+
Events without configured titles will use default titles.
|
|
81
179
|
|
|
82
180
|
---
|
|
83
181
|
|
|
84
|
-
##
|
|
182
|
+
## Mobile PWA Setup
|
|
85
183
|
|
|
86
|
-
|
|
184
|
+
Your phone needs to trust the local HTTPS certificate to receive Service Worker system notifications.
|
|
87
185
|
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
-
|
|
91
|
-
-
|
|
186
|
+
1. Get root certificate path: run `mkcert -CAROOT` to find `rootCA.pem`
|
|
187
|
+
2. Install on mobile:
|
|
188
|
+
- **iOS** — Send to phone, install profile, then enable full trust in Settings > General > About > Certificate Trust Settings
|
|
189
|
+
- **Android** — Install CA certificate in security settings (may need to rename extension to `.crt`)
|
|
190
|
+
3. Open `https://<LAN IP>:3199` in mobile browser, confirm HTTPS connection is secure and allow notification permissions
|
|
92
191
|
|
|
93
|
-
|
|
192
|
+
---
|
|
193
|
+
|
|
194
|
+
## All Environment Variables
|
|
195
|
+
|
|
196
|
+
| Variable | Default Value | Description |
|
|
197
|
+
|------|--------|------|
|
|
198
|
+
| `AGENTWAKE_HOST` | `0.0.0.0` | Listening address |
|
|
199
|
+
| `AGENTWAKE_PORT` | `3199` | Listening port |
|
|
200
|
+
| `AGENTWAKE_HTTPS_ENABLED` | `0` | Enable HTTPS (auto set to `1` when PWA is enabled) |
|
|
201
|
+
| `AGENTWAKE_HTTPS_CERT_PATH` | `certs/dev-cert.pem` | HTTPS certificate path |
|
|
202
|
+
| `AGENTWAKE_HTTPS_KEY_PATH` | `certs/dev-key.pem` | HTTPS private key path |
|
|
203
|
+
| `AGENTWAKE_DESKTOP_ENABLED` | `1` | Enable desktop system notifications (`0` to disable); on ARM, uses native command fallback instead of `node-notifier` |
|
|
204
|
+
| `AGENTWAKE_PWA_ENABLED` | `0` | Enable PWA/WebSocket push (`0` to disable) |
|
|
205
|
+
| `AGENTWAKE_DINGTALK_ENABLED` | `1` | Enable DingTalk notifications (`0` to disable) |
|
|
206
|
+
| `AGENTWAKE_DINGTALK_WEBHOOK` | — | DingTalk Webhook URL |
|
|
207
|
+
| `AGENTWAKE_DINGTALK_SECRET` | — | DingTalk signature secret |
|
|
208
|
+
| `AGENTWAKE_FEISHU_ENABLED` | `1` | Enable Feishu notifications (`0` to disable) |
|
|
209
|
+
| `AGENTWAKE_FEISHU_WEBHOOK` | — | Feishu Webhook URL |
|
|
210
|
+
| `AGENTWAKE_FEISHU_SECRET` | — | Feishu signature secret |
|
|
211
|
+
| `AGENTWAKE_WECOM_ENABLED` | `1` | Enable WeCom notifications (`0` to disable) |
|
|
212
|
+
| `AGENTWAKE_WECOM_WEBHOOK` | — | WeCom Webhook URL |
|
|
213
|
+
| `AGENTWAKE_CLAUDE_TITLE_*` | — | Claude event custom titles |
|
|
214
|
+
| `AGENTWAKE_DEDUPE_WINDOW_MS` | `10000` | Deduplication window (ms) |
|
|
215
|
+
| `AGENTWAKE_RATE_LIMIT_WINDOW_MS` | `10000` | Rate limit window (ms) |
|
|
216
|
+
| `AGENTWAKE_RATE_LIMIT_MAX_EVENTS` | `40` | Max events within window |
|
|
217
|
+
| `AGENTWAKE_WS_PATH` | `/ws` | WebSocket path |
|
|
218
|
+
| `AGENTWAKE_QODER_LOG_PATH` | — | Qoder log path (auto-discovered) |
|
|
219
|
+
| `AGENTWAKE_ALLOWED_HOOK_IPS` | — | Limit Hook source IPs (comma-separated) |
|
|
220
|
+
|
|
221
|
+
---
|
|
222
|
+
|
|
223
|
+
## Development
|
|
94
224
|
|
|
95
225
|
```bash
|
|
96
|
-
|
|
97
|
-
git clone https://github.com/your-username/agentwake.git
|
|
226
|
+
git clone https://github.com/tjdxwwj/agentwake.git
|
|
98
227
|
cd agentwake
|
|
99
228
|
npm install
|
|
100
|
-
|
|
101
|
-
# 2. 准备环境变量
|
|
102
229
|
cp .env.example .env
|
|
230
|
+
npm run setup # Interactive setup (optional PWA/HTTPS)
|
|
231
|
+
npm run dev # Start development server
|
|
232
|
+
npm test # Run tests
|
|
233
|
+
```
|
|
103
234
|
|
|
104
|
-
|
|
105
|
-
npm run init
|
|
235
|
+
### Directory Structure
|
|
106
236
|
|
|
107
|
-
# 4. 启动开发服务器
|
|
108
|
-
npm run dev
|
|
109
237
|
```
|
|
238
|
+
src/
|
|
239
|
+
adapters/ # Input adapters (Cursor / Claude / Qoder)
|
|
240
|
+
gateway/ # Core gateway (Adapter registration, event routing)
|
|
241
|
+
notifiers/ # Notification dispatchers (Desktop / WebSocket / DingTalk / Feishu / WeCom)
|
|
242
|
+
installers/ # Hook auto-installers
|
|
243
|
+
web/ # PWA frontend
|
|
244
|
+
```
|
|
245
|
+
|
|
246
|
+
### Tech Stack
|
|
110
247
|
|
|
111
|
-
|
|
112
|
-
- `src/adapters/`:各类编辑器(Cursor/Claude/Qoder)的输入信号适配器。
|
|
113
|
-
- `src/gateway/`:核心网关,负责 Adapter 注册与事件路由。
|
|
114
|
-
- `src/notifiers/`:通知分发器(桌面系统通知、移动端 WebSocket、PWA Push)。
|
|
115
|
-
- `web/`:移动端 Web App 源码。
|
|
248
|
+
Node.js + TypeScript + Express + WebSocket (ws) + Zod
|
|
116
249
|
|
|
117
250
|
---
|
|
118
251
|
|
|
119
|
-
##
|
|
252
|
+
## FAQ
|
|
120
253
|
|
|
121
|
-
**
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
254
|
+
**Cannot receive notifications on mobile?**
|
|
255
|
+
1. Ensure phone and computer are on the same LAN
|
|
256
|
+
2. Ensure browser shows secure HTTPS connection (not "Not Secure")
|
|
257
|
+
3. Ensure notification permissions are granted
|
|
258
|
+
4. Check if Web page WebSocket status is "Connected"
|
|
126
259
|
|
|
127
|
-
**
|
|
128
|
-
A: 可以,通过 CLI 参数或环境变量修改:
|
|
260
|
+
**How to change port?**
|
|
129
261
|
```bash
|
|
130
|
-
agentwake start --port 4000
|
|
131
|
-
# 或者使用环境变量
|
|
132
262
|
AGENTWAKE_PORT=4000 agentwake start
|
|
133
263
|
```
|
|
134
264
|
|
|
265
|
+
**Can personal WeChat receive notifications?**
|
|
266
|
+
WeChat does not support Webhook message push API. You can use WeCom group bots as an alternative.
|
|
267
|
+
|
|
268
|
+
---
|
|
269
|
+
|
|
270
|
+
## Contributors
|
|
271
|
+
|
|
272
|
+
- [@tjdxwwj](https://github.com/tjdxwwj)
|
|
273
|
+
- [@qiangguanglin](https://github.com/qiangguanglin)
|
|
274
|
+
|
|
135
275
|
---
|
|
136
276
|
|
|
137
|
-
|
|
277
|
+
MIT License
|
package/README.zh-CN.md
ADDED
|
@@ -0,0 +1,277 @@
|
|
|
1
|
+
# AgentWake
|
|
2
|
+
|
|
3
|
+
[English](README.md) | 简体中文
|
|
4
|
+
|
|
5
|
+
跨编辑器的 AI 编程通知网关。支持 Cursor / Claude Code / Qoder,当 AI 任务完成、异常终止或等待授权时,实时推送通知到桌面、手机和 IM 群。
|
|
6
|
+
|
|
7
|
+
## 效果预览
|
|
8
|
+
|
|
9
|
+
<p align="center">
|
|
10
|
+
<img src="docs/screenshots/web.jpg" width="48%" alt="Web 界面" />
|
|
11
|
+
<img src="docs/screenshots/mobile_notify.jpg" width="48%" alt="手机通知" />
|
|
12
|
+
</p>
|
|
13
|
+
|
|
14
|
+
<p align="center">
|
|
15
|
+
<img src="docs/screenshots/cursor.png" width="48%" alt="Cursor 通知" />
|
|
16
|
+
<img src="docs/screenshots/qoder.png" width="48%" alt="Qoder 通知" />
|
|
17
|
+
</p>
|
|
18
|
+
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
## 核心特性
|
|
22
|
+
|
|
23
|
+
- **多编辑器支持** — Cursor Hook、Claude Code Hook、Qoder 日志监听
|
|
24
|
+
- **多通知渠道** — 桌面系统通知、PWA 网页推送、钉钉、飞书、企业微信
|
|
25
|
+
- **Claude Code 深度集成** — 支持 Stop / Notification / StopFailure / SessionEnd 等全部 Hook 事件,可自定义每个事件的通知标题
|
|
26
|
+
- **移动端实时推送** — 内置 PWA Web App,HTTPS + WebSocket 毫秒级推送,支持扫码连接
|
|
27
|
+
- **智能防打扰** — 事件去重 + 速率限流,避免消息轰炸
|
|
28
|
+
- **交互式配置** — `agentwake setup` 一步步引导完成全部配置
|
|
29
|
+
|
|
30
|
+
---
|
|
31
|
+
|
|
32
|
+
## 快速开始
|
|
33
|
+
|
|
34
|
+
### 环境要求
|
|
35
|
+
|
|
36
|
+
- Node.js >= 18
|
|
37
|
+
- [mkcert](https://github.com/FiloSottile/mkcert)(仅在启用 PWA 推送时需要)
|
|
38
|
+
|
|
39
|
+
### 安装
|
|
40
|
+
|
|
41
|
+
```bash
|
|
42
|
+
npm i -g agentwake
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
### 方式一:交互式引导(推荐)
|
|
46
|
+
|
|
47
|
+
```bash
|
|
48
|
+
agentwake setup # 交互式配置向导
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
`setup` 会引导你完成:
|
|
52
|
+
1. 选择 AI 工具(Claude Code / Cursor / 全部)
|
|
53
|
+
2. 选择监听的事件类型
|
|
54
|
+
3. 自定义每个事件的通知标题(可选)
|
|
55
|
+
4. 选择通知渠道(钉钉 / 飞书 / 企业微信 / PWA / 桌面通知)
|
|
56
|
+
5. 输入 Webhook 地址和密钥
|
|
57
|
+
6. 自动安装编辑器 Hooks:
|
|
58
|
+
- Claude Code Hooks 到 `~/.claude/settings.json`
|
|
59
|
+
- Cursor Hooks 到 `~/.cursor/hooks.json`(转发脚本位于 `~/.agentwake/hooks/cursor-hook.sh`)
|
|
60
|
+
7. 若启用 PWA 则自动生成 HTTPS 证书;未启用则默认使用 HTTP
|
|
61
|
+
8. 启动服务
|
|
62
|
+
|
|
63
|
+
### 方式二:手动配置
|
|
64
|
+
|
|
65
|
+
```bash
|
|
66
|
+
agentwake setup # 生成 ~/.agentwake/.env 并完成配置
|
|
67
|
+
# 编辑 ~/.agentwake/.env 填入配置
|
|
68
|
+
agentwake start
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
所有数据存放在 `~/.agentwake/` 目录下,无需手动创建工作目录。
|
|
72
|
+
|
|
73
|
+
### 方式三:从源码启动
|
|
74
|
+
|
|
75
|
+
```bash
|
|
76
|
+
git clone https://github.com/tjdxwwj/agentwake.git
|
|
77
|
+
cd agentwake
|
|
78
|
+
npm install
|
|
79
|
+
|
|
80
|
+
# 交互式配置
|
|
81
|
+
npm run setup
|
|
82
|
+
|
|
83
|
+
# 启动开发服务器
|
|
84
|
+
npm run dev
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
启动后服务默认运行在 `http://localhost:3199`;启用 PWA 后为 `https://localhost:3199`。
|
|
88
|
+
|
|
89
|
+
---
|
|
90
|
+
|
|
91
|
+
## 通知渠道
|
|
92
|
+
|
|
93
|
+
| 渠道 | 配置方式 | 说明 |
|
|
94
|
+
|------|---------|------|
|
|
95
|
+
| 桌面系统通知 | 内置,无需配置 | macOS / Windows / Linux |
|
|
96
|
+
| PWA 网页推送 | 内置,手机浏览器打开服务地址 | 需 HTTPS,支持 Service Worker 系统通知 |
|
|
97
|
+
| 钉钉 | `AGENTWAKE_DINGTALK_WEBHOOK` | 群机器人 Webhook,支持签名校验 |
|
|
98
|
+
| 飞书 | `AGENTWAKE_FEISHU_WEBHOOK` | 群机器人 Webhook,支持签名校验 |
|
|
99
|
+
| 企业微信 | `AGENTWAKE_WECOM_WEBHOOK` | 群机器人 Webhook,安全性由 URL Key 保证 |
|
|
100
|
+
|
|
101
|
+
### 钉钉配置
|
|
102
|
+
|
|
103
|
+
在钉钉群 -> 群设置 -> 智能群助手 -> 添加机器人 -> 自定义 Webhook,复制 Webhook 地址。
|
|
104
|
+
|
|
105
|
+
```env
|
|
106
|
+
AGENTWAKE_DINGTALK_WEBHOOK=https://oapi.dingtalk.com/robot/send?access_token=xxx
|
|
107
|
+
AGENTWAKE_DINGTALK_SECRET=SECxxx # 可选,签名密钥
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
### 飞书配置
|
|
111
|
+
|
|
112
|
+
在飞书群 -> 设置 -> 群机器人 -> 添加自定义机器人,复制 Webhook 地址。
|
|
113
|
+
|
|
114
|
+
```env
|
|
115
|
+
AGENTWAKE_FEISHU_WEBHOOK=https://open.feishu.cn/open-apis/bot/v2/hook/xxx
|
|
116
|
+
AGENTWAKE_FEISHU_SECRET=xxx # 可选,签名校验密钥
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
### 企业微信配置
|
|
120
|
+
|
|
121
|
+
在企业微信群 -> 群机器人 -> 添加群机器人,复制 Webhook 地址。
|
|
122
|
+
|
|
123
|
+
```env
|
|
124
|
+
AGENTWAKE_WECOM_WEBHOOK=https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=xxx
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
---
|
|
128
|
+
|
|
129
|
+
## 编辑器接入
|
|
130
|
+
|
|
131
|
+
### Claude Code
|
|
132
|
+
|
|
133
|
+
运行 `agentwake setup` 会自动完成以下操作:
|
|
134
|
+
- 生成 Hook 转发脚本到 `~/.agentwake/hooks/claude-hook-relay.sh`
|
|
135
|
+
- 写入 Hook 配置到 `~/.claude/settings.json`
|
|
136
|
+
|
|
137
|
+
支持的 Hook 事件:
|
|
138
|
+
|
|
139
|
+
| 事件 | 说明 | 默认启用 |
|
|
140
|
+
|------|------|---------|
|
|
141
|
+
| Notification | 需要用户注意 | 是 |
|
|
142
|
+
| Stop | 任务完成 | 是 |
|
|
143
|
+
| StopFailure | 任务异常终止 | 是 |
|
|
144
|
+
| SessionEnd | 会话结束 | 是 |
|
|
145
|
+
| SessionStart | 会话开始 | 否 |
|
|
146
|
+
| PreToolUse | 工具调用前 | 否 |
|
|
147
|
+
| PostToolUse | 工具调用后 | 否 |
|
|
148
|
+
|
|
149
|
+
### Cursor
|
|
150
|
+
|
|
151
|
+
运行 `agentwake setup` 会自动完成:
|
|
152
|
+
- 生成 Cursor Hook 转发脚本到 `~/.agentwake/hooks/cursor-hook.sh`
|
|
153
|
+
- 写入 `beforeShellExecution` / `afterShellExecution` 到 `~/.cursor/hooks.json`
|
|
154
|
+
|
|
155
|
+
然后保持 `agentwake start` 运行,即可接收 Cursor 授权等待与生命周期通知。
|
|
156
|
+
|
|
157
|
+
### Qoder
|
|
158
|
+
|
|
159
|
+
自动发现日志目录,或手动指定:
|
|
160
|
+
|
|
161
|
+
```bash
|
|
162
|
+
AGENTWAKE_QODER_LOG_PATH=”/path/to/agent.log” agentwake start
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
---
|
|
166
|
+
|
|
167
|
+
## 自定义通知标题
|
|
168
|
+
|
|
169
|
+
通过 `agentwake setup` 交互式设置,或直接在 `.env` 中配置:
|
|
170
|
+
|
|
171
|
+
```env
|
|
172
|
+
AGENTWAKE_CLAUDE_TITLE_STOP=AI搞定了
|
|
173
|
+
AGENTWAKE_CLAUDE_TITLE_STOP_FAILURE=AI挂了
|
|
174
|
+
AGENTWAKE_CLAUDE_TITLE_NOTIFICATION=AI喊你看一眼
|
|
175
|
+
AGENTWAKE_CLAUDE_TITLE_SESSION_END=会话结束了
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
未配置的事件使用默认标题。
|
|
179
|
+
|
|
180
|
+
---
|
|
181
|
+
|
|
182
|
+
## 移动端 PWA 设置
|
|
183
|
+
|
|
184
|
+
手机需要信任本地 HTTPS 证书才能接收 Service Worker 系统通知。
|
|
185
|
+
|
|
186
|
+
1. 获取根证书路径:`mkcert -CAROOT`,找到 `rootCA.pem`
|
|
187
|
+
2. 安装到手机:
|
|
188
|
+
- **iOS** — 发送到手机安装描述文件,然后在 设置 > 通用 > 关于本机 > 证书信任设置 中启用完全信任
|
|
189
|
+
- **Android** — 在安全设置中安装 CA 证书(可能需要改后缀为 `.crt`)
|
|
190
|
+
3. 手机浏览器打开 `https://<局域网IP>:3199`,确认 HTTPS 连接安全后允许通知权限
|
|
191
|
+
|
|
192
|
+
---
|
|
193
|
+
|
|
194
|
+
## 全部环境变量
|
|
195
|
+
|
|
196
|
+
| 变量 | 默认值 | 说明 |
|
|
197
|
+
|------|--------|------|
|
|
198
|
+
| `AGENTWAKE_HOST` | `0.0.0.0` | 监听地址 |
|
|
199
|
+
| `AGENTWAKE_PORT` | `3199` | 监听端口 |
|
|
200
|
+
| `AGENTWAKE_HTTPS_ENABLED` | `0` | 是否启用 HTTPS(启用 PWA 时自动设为 `1`) |
|
|
201
|
+
| `AGENTWAKE_HTTPS_CERT_PATH` | `certs/dev-cert.pem` | HTTPS 证书路径 |
|
|
202
|
+
| `AGENTWAKE_HTTPS_KEY_PATH` | `certs/dev-key.pem` | HTTPS 私钥路径 |
|
|
203
|
+
| `AGENTWAKE_DESKTOP_ENABLED` | `1` | 是否启用桌面系统通知(`0` 关闭);ARM 平台会自动改用系统原生命令,不依赖 `node-notifier` |
|
|
204
|
+
| `AGENTWAKE_PWA_ENABLED` | `0` | 是否启用 PWA/WebSocket 推送(`0` 关闭) |
|
|
205
|
+
| `AGENTWAKE_DINGTALK_ENABLED` | `1` | 是否启用钉钉通知(`0` 关闭) |
|
|
206
|
+
| `AGENTWAKE_DINGTALK_WEBHOOK` | — | 钉钉 Webhook URL |
|
|
207
|
+
| `AGENTWAKE_DINGTALK_SECRET` | — | 钉钉签名密钥 |
|
|
208
|
+
| `AGENTWAKE_FEISHU_ENABLED` | `1` | 是否启用飞书通知(`0` 关闭) |
|
|
209
|
+
| `AGENTWAKE_FEISHU_WEBHOOK` | — | 飞书 Webhook URL |
|
|
210
|
+
| `AGENTWAKE_FEISHU_SECRET` | — | 飞书签名密钥 |
|
|
211
|
+
| `AGENTWAKE_WECOM_ENABLED` | `1` | 是否启用企业微信通知(`0` 关闭) |
|
|
212
|
+
| `AGENTWAKE_WECOM_WEBHOOK` | — | 企业微信 Webhook URL |
|
|
213
|
+
| `AGENTWAKE_CLAUDE_TITLE_*` | — | Claude 事件自定义标题 |
|
|
214
|
+
| `AGENTWAKE_DEDUPE_WINDOW_MS` | `10000` | 去重窗口(毫秒) |
|
|
215
|
+
| `AGENTWAKE_RATE_LIMIT_WINDOW_MS` | `10000` | 限流窗口(毫秒) |
|
|
216
|
+
| `AGENTWAKE_RATE_LIMIT_MAX_EVENTS` | `40` | 窗口内最大事件数 |
|
|
217
|
+
| `AGENTWAKE_WS_PATH` | `/ws` | WebSocket 路径 |
|
|
218
|
+
| `AGENTWAKE_QODER_LOG_PATH` | — | Qoder 日志路径(自动发现) |
|
|
219
|
+
| `AGENTWAKE_ALLOWED_HOOK_IPS` | — | 限制 Hook 来源 IP(逗号分隔) |
|
|
220
|
+
|
|
221
|
+
---
|
|
222
|
+
|
|
223
|
+
## 开发
|
|
224
|
+
|
|
225
|
+
```bash
|
|
226
|
+
git clone https://github.com/tjdxwwj/agentwake.git
|
|
227
|
+
cd agentwake
|
|
228
|
+
npm install
|
|
229
|
+
cp .env.example .env
|
|
230
|
+
npm run setup # 交互式配置(可选启用 PWA/HTTPS)
|
|
231
|
+
npm run dev # 启动开发服务器
|
|
232
|
+
npm test # 运行测试
|
|
233
|
+
```
|
|
234
|
+
|
|
235
|
+
### 目录结构
|
|
236
|
+
|
|
237
|
+
```
|
|
238
|
+
src/
|
|
239
|
+
adapters/ # 输入适配器(Cursor / Claude / Qoder)
|
|
240
|
+
gateway/ # 核心网关(Adapter 注册、事件路由)
|
|
241
|
+
notifiers/ # 通知分发(桌面 / WebSocket / 钉钉 / 飞书 / 企业微信)
|
|
242
|
+
installers/ # Hook 自动安装器
|
|
243
|
+
web/ # PWA 前端
|
|
244
|
+
```
|
|
245
|
+
|
|
246
|
+
### 技术栈
|
|
247
|
+
|
|
248
|
+
Node.js + TypeScript + Express + WebSocket (ws) + Zod
|
|
249
|
+
|
|
250
|
+
---
|
|
251
|
+
|
|
252
|
+
## FAQ
|
|
253
|
+
|
|
254
|
+
**手机收不到通知?**
|
|
255
|
+
1. 确认手机和电脑在同一局域网
|
|
256
|
+
2. 确认浏览器显示安全的 HTTPS 连接(非”不安全”)
|
|
257
|
+
3. 确认已授予通知权限
|
|
258
|
+
4. 检查 Web 页面 WebSocket 状态是否为”已连接”
|
|
259
|
+
|
|
260
|
+
**如何修改端口?**
|
|
261
|
+
```bash
|
|
262
|
+
AGENTWAKE_PORT=4000 agentwake start
|
|
263
|
+
```
|
|
264
|
+
|
|
265
|
+
**个人微信能收通知吗?**
|
|
266
|
+
微信不支持 Webhook 消息推送 API。可以使用企业微信群机器人作为替代。
|
|
267
|
+
|
|
268
|
+
---
|
|
269
|
+
|
|
270
|
+
## 贡献者
|
|
271
|
+
|
|
272
|
+
- [@tjdxwwj](https://github.com/tjdxwwj)
|
|
273
|
+
- [@qiangguanglin](https://github.com/qiangguanglin)
|
|
274
|
+
|
|
275
|
+
---
|
|
276
|
+
|
|
277
|
+
MIT License
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"claude-hook-adapter.d.ts","sourceRoot":"","sources":["../../src/adapters/claude-hook-adapter.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"claude-hook-adapter.d.ts","sourceRoot":"","sources":["../../src/adapters/claude-hook-adapter.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AA+CzD,wBAAgB,uBAAuB,IAAI,cAAc,CAsDxD"}
|