discord-agent-bridge 0.3.0 → 0.4.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/README.ko.md +142 -18
- package/README.md +143 -18
- package/dist/cli.js +11 -4
- package/dist/cli.js.map +1 -1
- package/dist/core/configSchema.js +3 -1
- package/dist/core/configSchema.js.map +1 -1
- package/dist/discord/wiring.js +7 -1
- package/dist/discord/wiring.js.map +1 -1
- package/dist/service/index.js +140 -0
- package/dist/service/index.js.map +1 -0
- package/dist/service/launchd.js +106 -0
- package/dist/service/launchd.js.map +1 -0
- package/dist/service/runScript.js +37 -0
- package/dist/service/runScript.js.map +1 -0
- package/dist/service/schtasks.js +78 -0
- package/dist/service/schtasks.js.map +1 -0
- package/dist/service/systemd.js +87 -0
- package/dist/service/systemd.js.map +1 -0
- package/dist/service/types.js +10 -0
- package/dist/service/types.js.map +1 -0
- package/package.json +2 -2
package/README.ko.md
CHANGED
|
@@ -55,41 +55,133 @@ Discord 채널에서 대화하듯 메시지를 보내면, 내 컴퓨터에서 Cl
|
|
|
55
55
|
|
|
56
56
|
## 2단계 — 설치 & 실행
|
|
57
57
|
|
|
58
|
-
###
|
|
58
|
+
### 설치 & 자동 실행 (권장)
|
|
59
59
|
|
|
60
|
-
|
|
60
|
+
가장 간단한 방법입니다. 아래 세 줄이면 설치부터 재부팅 자동 실행까지 끝납니다. `service install` 이 현재 OS에 맞는 자동 실행을 알아서 등록합니다 — **macOS는 launchd, Linux는 systemd, Windows는 작업 스케줄러**.
|
|
61
61
|
|
|
62
62
|
```bash
|
|
63
|
-
|
|
64
|
-
#
|
|
65
|
-
|
|
63
|
+
npm install -g discord-agent-bridge # 설치
|
|
64
|
+
discord-agent-bridge --setup # 최초 1회 (토큰 등 입력)
|
|
65
|
+
discord-agent-bridge service install # 자동 실행 등록 + 즉시 시작
|
|
66
|
+
```
|
|
66
67
|
|
|
67
|
-
|
|
68
|
-
npx discord-agent-bridge
|
|
68
|
+
관리 명령:
|
|
69
69
|
|
|
70
|
-
|
|
71
|
-
|
|
70
|
+
```bash
|
|
71
|
+
discord-agent-bridge service status # 등록/실행 상태
|
|
72
|
+
discord-agent-bridge service restart # 재시작
|
|
73
|
+
discord-agent-bridge service uninstall # 등록 해제
|
|
72
74
|
```
|
|
73
75
|
|
|
74
|
-
|
|
76
|
+
업그레이드는 최신 설치 후 재시작:
|
|
75
77
|
|
|
76
|
-
|
|
78
|
+
```bash
|
|
79
|
+
npm install -g discord-agent-bridge@latest
|
|
80
|
+
discord-agent-bridge service restart
|
|
81
|
+
```
|
|
77
82
|
|
|
78
|
-
|
|
83
|
+
> ⚠️ **Windows 참고**: 작업 스케줄러 로그온 트리거로 등록되어 **로그인 시 자동 시작**됩니다(관리자 권한 불필요). 단, 크래시 시 자동 재시작은 보장되지 않습니다(macOS·Linux는 보장). `service install` 이 안 되면 아래 **수동 설정 — Windows (작업 스케줄러)** 를 참고하세요.
|
|
84
|
+
|
|
85
|
+
---
|
|
86
|
+
|
|
87
|
+
아래부터는 `service install` 이 동작하지 않거나 직접 설정하고 싶을 때의 **수동 방법**입니다.
|
|
88
|
+
|
|
89
|
+
### 수동 설정 — macOS (launchd)
|
|
90
|
+
|
|
91
|
+
macOS 기본 서비스 관리자인 **launchd** 로 봇을 직접 실행합니다 — 로그인하면 자동 시작되고, 꺼지면 자동으로 되살아납니다.
|
|
79
92
|
|
|
80
93
|
```bash
|
|
81
|
-
#
|
|
82
|
-
|
|
94
|
+
# 1) 전역 설치 (아직이면 셋업도 한 번)
|
|
95
|
+
npm install -g discord-agent-bridge
|
|
96
|
+
discord-agent-bridge --setup # 이미 설정했으면 생략
|
|
97
|
+
|
|
98
|
+
# 2) 실행 래퍼 생성 — nvm의 default node를 자동으로 찾으므로 node 버전이 바뀌어도 그대로 동작
|
|
99
|
+
mkdir -p ~/.discord-agent-bridge
|
|
100
|
+
cat > ~/.discord-agent-bridge/run.sh <<'EOF'
|
|
101
|
+
#!/bin/bash
|
|
102
|
+
export NVM_DIR="$HOME/.nvm"
|
|
103
|
+
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"
|
|
104
|
+
nvm use default >/dev/null 2>&1 || nvm use node >/dev/null 2>&1
|
|
105
|
+
exec discord-agent-bridge
|
|
106
|
+
EOF
|
|
107
|
+
chmod +x ~/.discord-agent-bridge/run.sh
|
|
108
|
+
# nvm을 안 쓴다면 run.sh 는 `#!/bin/bash` 와 `exec discord-agent-bridge` 두 줄이면 됩니다(PATH에 node가 있어야 함).
|
|
109
|
+
|
|
110
|
+
# 3) LaunchAgent 등록 파일 생성 ($HOME 는 파일을 만드는 시점에 절대경로로 치환됩니다)
|
|
111
|
+
cat > ~/Library/LaunchAgents/com.discord-agent-bridge.plist <<EOF
|
|
112
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
|
113
|
+
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
|
114
|
+
<plist version="1.0">
|
|
115
|
+
<dict>
|
|
116
|
+
<key>Label</key><string>com.discord-agent-bridge</string>
|
|
117
|
+
<key>ProgramArguments</key>
|
|
118
|
+
<array>
|
|
119
|
+
<string>/bin/bash</string>
|
|
120
|
+
<string>$HOME/.discord-agent-bridge/run.sh</string>
|
|
121
|
+
</array>
|
|
122
|
+
<key>EnvironmentVariables</key>
|
|
123
|
+
<dict><key>HOME</key><string>$HOME</string></dict>
|
|
124
|
+
<key>RunAtLoad</key><true/>
|
|
125
|
+
<key>KeepAlive</key><true/>
|
|
126
|
+
<key>StandardOutPath</key><string>$HOME/.discord-agent-bridge/agent.out.log</string>
|
|
127
|
+
<key>StandardErrorPath</key><string>$HOME/.discord-agent-bridge/agent.err.log</string>
|
|
128
|
+
</dict>
|
|
129
|
+
</plist>
|
|
130
|
+
EOF
|
|
131
|
+
|
|
132
|
+
# 4) 시작
|
|
133
|
+
launchctl load -w ~/Library/LaunchAgents/com.discord-agent-bridge.plist
|
|
134
|
+
|
|
135
|
+
# 5) 확인 — 'gateway ready' 가 뜨면 성공 (Ctrl+C 로 로그 보기만 빠져나옴, 봇은 계속 돎)
|
|
136
|
+
tail -f ~/.discord-agent-bridge/agent.out.log
|
|
137
|
+
```
|
|
83
138
|
|
|
84
|
-
|
|
139
|
+
관리 명령:
|
|
140
|
+
|
|
141
|
+
```bash
|
|
142
|
+
launchctl list | grep discord-agent-bridge # 상태 (1열 PID, 2열 마지막 종료코드)
|
|
143
|
+
launchctl unload ~/Library/LaunchAgents/com.discord-agent-bridge.plist # 중지
|
|
144
|
+
launchctl load -w ~/Library/LaunchAgents/com.discord-agent-bridge.plist # 시작
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
업그레이드:
|
|
148
|
+
|
|
149
|
+
```bash
|
|
85
150
|
npm install -g discord-agent-bridge@latest
|
|
151
|
+
launchctl unload ~/Library/LaunchAgents/com.discord-agent-bridge.plist
|
|
152
|
+
launchctl load -w ~/Library/LaunchAgents/com.discord-agent-bridge.plist
|
|
86
153
|
```
|
|
87
154
|
|
|
88
|
-
|
|
155
|
+
> ⚠️ nvm으로 **node 버전을 바꾸면** 그 버전에서 `npm install -g discord-agent-bridge` 를 한 번 실행하세요(nvm 전역 패키지는 버전별로 분리됩니다). 래퍼가 default node를 따라가므로 plist 자체는 고칠 필요가 없습니다.
|
|
156
|
+
|
|
157
|
+
### 수동 설정 — Windows (작업 스케줄러)
|
|
158
|
+
|
|
159
|
+
`discord-agent-bridge service install` 이 안 될 때 직접 등록하는 방법입니다.
|
|
160
|
+
|
|
161
|
+
**명령어 (관리자 권한 불필요)** — 먼저 PowerShell에서 봇 실제 경로를 확인하세요:
|
|
89
162
|
|
|
90
|
-
|
|
163
|
+
```powershell
|
|
164
|
+
where.exe discord-agent-bridge # 예: C:\Users\<나>\AppData\Roaming\npm\discord-agent-bridge.cmd
|
|
91
165
|
|
|
92
|
-
|
|
166
|
+
# 위에서 확인한 경로로 로그온 시 자동 실행 등록
|
|
167
|
+
schtasks /create /tn discord-agent-bridge /sc onlogon /tr "C:\Users\<나>\AppData\Roaming\npm\discord-agent-bridge.cmd" /f
|
|
168
|
+
schtasks /query /tn discord-agent-bridge # 상태 확인
|
|
169
|
+
schtasks /run /tn discord-agent-bridge # 지금 바로 시작
|
|
170
|
+
schtasks /delete /tn discord-agent-bridge /f # 해제
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
**GUI 로 하려면**: 시작 메뉴 → **작업 스케줄러** → **기본 작업 만들기** → 이름 `discord-agent-bridge`, 트리거 **로그온할 때**, 동작 **프로그램 시작** → 위 `where.exe` 로 확인한 `.cmd` 경로 입력 → 마침.
|
|
174
|
+
|
|
175
|
+
> onlogon 작업은 **로그인 시** 실행이며 **크래시 시 자동 재시작은 보장하지 않습니다.** 크래시 자동 복구·로그인 전 실행까지 원하면 진짜 Windows 서비스가 필요합니다 — [nssm](https://nssm.cc/) 으로 등록하세요(관리자 권한 필요):
|
|
176
|
+
>
|
|
177
|
+
> ```powershell
|
|
178
|
+
> nssm install discord-agent-bridge "C:\Program Files\nodejs\node.exe" "C:\Users\<나>\AppData\Roaming\npm\node_modules\discord-agent-bridge\dist\cli.js"
|
|
179
|
+
> nssm start discord-agent-bridge
|
|
180
|
+
> ```
|
|
181
|
+
|
|
182
|
+
### 수동 설정 — PM2 (Linux · Windows 대안)
|
|
183
|
+
|
|
184
|
+
Linux·Windows에서는 [PM2](https://pm2.keymetrics.io/) 를 써도 됩니다(로그·재시작·상태 확인이 편리). **macOS에서는 PM2 대신 위 `service install`/launchd 를 쓰세요** — PM2의 fork 래퍼가 macOS에서 봇의 게이트웨이 연결을 막는 경우가 있습니다.
|
|
93
185
|
|
|
94
186
|
```bash
|
|
95
187
|
# 1) 전역 설치 (PM2가 안정적으로 실행할 커맨드가 있어야 함)
|
|
@@ -131,6 +223,38 @@ pm2 restart discord-agent-bridge
|
|
|
131
223
|
|
|
132
224
|
> ⚠️ nvm/asdf를 쓴다면, PM2가 부팅 시점에도 셸에서 쓰는 것과 **같은 `node`** 를 찾을 수 있어야 합니다. `which node`로 확인한 경로가 부팅 환경에서도 유효해야 합니다 — 아니면 재부팅 후 PM2가 봇을 못 띄웁니다.
|
|
133
225
|
|
|
226
|
+
### npx로 실행 (빠르게 시험해보기)
|
|
227
|
+
|
|
228
|
+
설치 없이 바로 한 번 띄워보고 싶을 때 쓰세요. `npx` 가 최신 버전을 받아 실행하며, 최초 실행이면 셋업 마법사가 먼저 뜬 뒤 이어서 봇이 시작됩니다. (터미널을 닫으면 봇도 종료됩니다 — 계속 켜두려면 위 PM2 방식을 쓰세요.)
|
|
229
|
+
|
|
230
|
+
```bash
|
|
231
|
+
# 최초 실행 — 셋업 마법사가 자동으로 뜬 뒤 이어서 봇이 시작됩니다.
|
|
232
|
+
# (토큰/Client ID 입력, 인텐트 확인, 초대 링크 생성 — 기본값은 안 물어봄)
|
|
233
|
+
npx discord-agent-bridge
|
|
234
|
+
|
|
235
|
+
# 이후 실행 — 이미 설정돼 있으면 바로 봇이 시작됩니다.
|
|
236
|
+
npx discord-agent-bridge
|
|
237
|
+
|
|
238
|
+
# 다시 설정만 하고 싶을 때 (봇은 시작하지 않음)
|
|
239
|
+
npx discord-agent-bridge --setup
|
|
240
|
+
```
|
|
241
|
+
|
|
242
|
+
전역 설치도 가능합니다: `npm install -g discord-agent-bridge` 후 `discord-agent-bridge` / `discord-agent-bridge --setup`.
|
|
243
|
+
|
|
244
|
+
### 업그레이드
|
|
245
|
+
|
|
246
|
+
새 버전이 나오면:
|
|
247
|
+
|
|
248
|
+
```bash
|
|
249
|
+
# npx 사용자 — @latest 를 붙이면 항상 최신을 받습니다(npx는 캐시를 쓸 수 있어요).
|
|
250
|
+
npx discord-agent-bridge@latest
|
|
251
|
+
|
|
252
|
+
# 전역 설치 사용자
|
|
253
|
+
npm install -g discord-agent-bridge@latest
|
|
254
|
+
```
|
|
255
|
+
|
|
256
|
+
설치된 버전 확인: `discord-agent-bridge --version`.
|
|
257
|
+
|
|
134
258
|
**셋업 마법사(`--setup`)** 가 물어보는 것 — **토큰(비밀)만 터미널에서 입력**합니다. 그 외 값은 하나도 안 물어봅니다:
|
|
135
259
|
1. Discord 봇 **토큰** (비밀 → 터미널에서만 붙여넣기)
|
|
136
260
|
2. **Client ID**
|
package/README.md
CHANGED
|
@@ -55,41 +55,134 @@ You need to create your own bot. Takes about 5 minutes.
|
|
|
55
55
|
|
|
56
56
|
## Step 2 — Install & run
|
|
57
57
|
|
|
58
|
-
###
|
|
58
|
+
### Install & auto-start (recommended)
|
|
59
59
|
|
|
60
|
-
|
|
60
|
+
The simplest path. These three lines take you from install to auto-start on reboot. `service install` registers the right auto-start for your OS — **launchd on macOS, systemd on Linux, Task Scheduler on Windows**.
|
|
61
61
|
|
|
62
62
|
```bash
|
|
63
|
-
|
|
64
|
-
#
|
|
65
|
-
|
|
63
|
+
npm install -g discord-agent-bridge # install
|
|
64
|
+
discord-agent-bridge --setup # first time only (enter token, etc.)
|
|
65
|
+
discord-agent-bridge service install # register auto-start + start now
|
|
66
|
+
```
|
|
66
67
|
|
|
67
|
-
|
|
68
|
-
npx discord-agent-bridge
|
|
68
|
+
Management:
|
|
69
69
|
|
|
70
|
-
|
|
71
|
-
|
|
70
|
+
```bash
|
|
71
|
+
discord-agent-bridge service status # registered / running?
|
|
72
|
+
discord-agent-bridge service restart # restart
|
|
73
|
+
discord-agent-bridge service uninstall # remove
|
|
72
74
|
```
|
|
73
75
|
|
|
74
|
-
|
|
76
|
+
To upgrade, install the latest and restart:
|
|
75
77
|
|
|
76
|
-
|
|
78
|
+
```bash
|
|
79
|
+
npm install -g discord-agent-bridge@latest
|
|
80
|
+
discord-agent-bridge service restart
|
|
81
|
+
```
|
|
77
82
|
|
|
78
|
-
|
|
83
|
+
> ⚠️ **Windows note**: it registers a Task Scheduler logon trigger, so the bot **starts at login** (no admin needed). It does not guarantee auto-restart on crash (macOS/Linux do). If `service install` doesn't work, see **Manual setup — Windows (Task Scheduler)** below.
|
|
84
|
+
|
|
85
|
+
---
|
|
86
|
+
|
|
87
|
+
The rest of this section is the **manual methods**, for when `service install` doesn't work or you want to set it up yourself.
|
|
88
|
+
|
|
89
|
+
### Manual setup — macOS (launchd)
|
|
90
|
+
|
|
91
|
+
Run the bot directly under **launchd**, the built-in macOS service manager — it starts at login and restarts automatically if it stops.
|
|
79
92
|
|
|
80
93
|
```bash
|
|
81
|
-
#
|
|
82
|
-
|
|
94
|
+
# 1) Install globally (and run setup once if you haven't)
|
|
95
|
+
npm install -g discord-agent-bridge
|
|
96
|
+
discord-agent-bridge --setup # skip if already configured
|
|
97
|
+
|
|
98
|
+
# 2) Create a launcher wrapper — it finds nvm's default node dynamically,
|
|
99
|
+
# so it keeps working even after you switch node versions.
|
|
100
|
+
mkdir -p ~/.discord-agent-bridge
|
|
101
|
+
cat > ~/.discord-agent-bridge/run.sh <<'EOF'
|
|
102
|
+
#!/bin/bash
|
|
103
|
+
export NVM_DIR="$HOME/.nvm"
|
|
104
|
+
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"
|
|
105
|
+
nvm use default >/dev/null 2>&1 || nvm use node >/dev/null 2>&1
|
|
106
|
+
exec discord-agent-bridge
|
|
107
|
+
EOF
|
|
108
|
+
chmod +x ~/.discord-agent-bridge/run.sh
|
|
109
|
+
# Not using nvm? run.sh can just be `#!/bin/bash` + `exec discord-agent-bridge` (node must be on PATH).
|
|
110
|
+
|
|
111
|
+
# 3) Create the LaunchAgent ($HOME is expanded to an absolute path as the file is written)
|
|
112
|
+
cat > ~/Library/LaunchAgents/com.discord-agent-bridge.plist <<EOF
|
|
113
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
|
114
|
+
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
|
115
|
+
<plist version="1.0">
|
|
116
|
+
<dict>
|
|
117
|
+
<key>Label</key><string>com.discord-agent-bridge</string>
|
|
118
|
+
<key>ProgramArguments</key>
|
|
119
|
+
<array>
|
|
120
|
+
<string>/bin/bash</string>
|
|
121
|
+
<string>$HOME/.discord-agent-bridge/run.sh</string>
|
|
122
|
+
</array>
|
|
123
|
+
<key>EnvironmentVariables</key>
|
|
124
|
+
<dict><key>HOME</key><string>$HOME</string></dict>
|
|
125
|
+
<key>RunAtLoad</key><true/>
|
|
126
|
+
<key>KeepAlive</key><true/>
|
|
127
|
+
<key>StandardOutPath</key><string>$HOME/.discord-agent-bridge/agent.out.log</string>
|
|
128
|
+
<key>StandardErrorPath</key><string>$HOME/.discord-agent-bridge/agent.err.log</string>
|
|
129
|
+
</dict>
|
|
130
|
+
</plist>
|
|
131
|
+
EOF
|
|
132
|
+
|
|
133
|
+
# 4) Start it
|
|
134
|
+
launchctl load -w ~/Library/LaunchAgents/com.discord-agent-bridge.plist
|
|
135
|
+
|
|
136
|
+
# 5) Verify — seeing 'gateway ready' means success (Ctrl+C only exits the log view; the bot keeps running)
|
|
137
|
+
tail -f ~/.discord-agent-bridge/agent.out.log
|
|
138
|
+
```
|
|
83
139
|
|
|
84
|
-
|
|
140
|
+
Management:
|
|
141
|
+
|
|
142
|
+
```bash
|
|
143
|
+
launchctl list | grep discord-agent-bridge # status (col 1 = PID, col 2 = last exit code)
|
|
144
|
+
launchctl unload ~/Library/LaunchAgents/com.discord-agent-bridge.plist # stop
|
|
145
|
+
launchctl load -w ~/Library/LaunchAgents/com.discord-agent-bridge.plist # start
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
Upgrading:
|
|
149
|
+
|
|
150
|
+
```bash
|
|
85
151
|
npm install -g discord-agent-bridge@latest
|
|
152
|
+
launchctl unload ~/Library/LaunchAgents/com.discord-agent-bridge.plist
|
|
153
|
+
launchctl load -w ~/Library/LaunchAgents/com.discord-agent-bridge.plist
|
|
86
154
|
```
|
|
87
155
|
|
|
88
|
-
|
|
156
|
+
> ⚠️ If you switch node versions with nvm, run `npm install -g discord-agent-bridge` once under the new version (nvm keeps global packages per version). The wrapper follows nvm's default node, so the plist itself never needs editing.
|
|
157
|
+
|
|
158
|
+
### Manual setup — Windows (Task Scheduler)
|
|
159
|
+
|
|
160
|
+
Register it yourself when `discord-agent-bridge service install` doesn't work.
|
|
161
|
+
|
|
162
|
+
**Commands (no admin needed)** — first find the bot's real path in PowerShell:
|
|
89
163
|
|
|
90
|
-
|
|
164
|
+
```powershell
|
|
165
|
+
where.exe discord-agent-bridge # e.g. C:\Users\<you>\AppData\Roaming\npm\discord-agent-bridge.cmd
|
|
91
166
|
|
|
92
|
-
|
|
167
|
+
# Register a logon-triggered task using the path from above
|
|
168
|
+
schtasks /create /tn discord-agent-bridge /sc onlogon /tr "C:\Users\<you>\AppData\Roaming\npm\discord-agent-bridge.cmd" /f
|
|
169
|
+
schtasks /query /tn discord-agent-bridge # status
|
|
170
|
+
schtasks /run /tn discord-agent-bridge # start now
|
|
171
|
+
schtasks /delete /tn discord-agent-bridge /f # remove
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
**GUI**: Start menu → **Task Scheduler** → **Create Basic Task** → name `discord-agent-bridge`, trigger **When I log on**, action **Start a program** → the `.cmd` path from `where.exe` → Finish.
|
|
175
|
+
|
|
176
|
+
> A logon task runs **at login** and does **not** guarantee restart on crash. For crash recovery / running before login you need a real Windows service — register one with [nssm](https://nssm.cc/) (admin required):
|
|
177
|
+
>
|
|
178
|
+
> ```powershell
|
|
179
|
+
> nssm install discord-agent-bridge "C:\Program Files\nodejs\node.exe" "C:\Users\<you>\AppData\Roaming\npm\node_modules\discord-agent-bridge\dist\cli.js"
|
|
180
|
+
> nssm start discord-agent-bridge
|
|
181
|
+
> ```
|
|
182
|
+
|
|
183
|
+
### Manual setup — PM2 (Linux / Windows alternative)
|
|
184
|
+
|
|
185
|
+
On Linux/Windows you can also use [PM2](https://pm2.keymetrics.io/) (handy logs, restart, status). **On macOS, use `service install`/launchd instead** — PM2's fork wrapper can prevent the bot from opening its gateway connection on macOS.
|
|
93
186
|
|
|
94
187
|
```bash
|
|
95
188
|
# 1) Install the bot globally (so PM2 has a stable command to run)
|
|
@@ -131,6 +224,38 @@ pm2 restart discord-agent-bridge
|
|
|
131
224
|
|
|
132
225
|
> ⚠️ If you use nvm/asdf, PM2 needs to find the same `node` at boot time as it does in your shell. Verify with `which node` and make sure that path is available to the boot environment — otherwise PM2 may fail to start the bot on reboot.
|
|
133
226
|
|
|
227
|
+
### Run with npx (quick try)
|
|
228
|
+
|
|
229
|
+
Use this to spin it up once without installing. `npx` fetches the latest version and runs it; on first run, the setup wizard appears first and the bot starts right after. (Closing the terminal stops the bot — use PM2 above to keep it running.)
|
|
230
|
+
|
|
231
|
+
```bash
|
|
232
|
+
# First run — the setup wizard runs automatically, then the bot starts.
|
|
233
|
+
# (asks for your token/Client ID, checks intents, generates an invite link — no other defaults are asked)
|
|
234
|
+
npx discord-agent-bridge
|
|
235
|
+
|
|
236
|
+
# Later runs — if already configured, the bot starts directly.
|
|
237
|
+
npx discord-agent-bridge
|
|
238
|
+
|
|
239
|
+
# To reconfigure only (without starting the bot)
|
|
240
|
+
npx discord-agent-bridge --setup
|
|
241
|
+
```
|
|
242
|
+
|
|
243
|
+
Global install also works: `npm install -g discord-agent-bridge`, then `discord-agent-bridge` / `discord-agent-bridge --setup`.
|
|
244
|
+
|
|
245
|
+
### Upgrading
|
|
246
|
+
|
|
247
|
+
When a new version is released:
|
|
248
|
+
|
|
249
|
+
```bash
|
|
250
|
+
# npx users — appending @latest always fetches the newest version (npx can otherwise cache).
|
|
251
|
+
npx discord-agent-bridge@latest
|
|
252
|
+
|
|
253
|
+
# Global-install users
|
|
254
|
+
npm install -g discord-agent-bridge@latest
|
|
255
|
+
```
|
|
256
|
+
|
|
257
|
+
Check your installed version with: `discord-agent-bridge --version`.
|
|
258
|
+
|
|
134
259
|
**What the setup wizard (`--setup`) asks for** — the **token (secret) is the only thing you type into the terminal**. Nothing else is asked here:
|
|
135
260
|
1. Your Discord bot **token** (secret — paste it only in the terminal)
|
|
136
261
|
2. Your **Client ID**
|
package/dist/cli.js
CHANGED
|
@@ -4,12 +4,14 @@ import * as path from 'node:path';
|
|
|
4
4
|
import { fileURLToPath } from 'node:url';
|
|
5
5
|
import { startBot } from './app.js';
|
|
6
6
|
import { runSetup } from './setup/wizard.js';
|
|
7
|
+
import { runServiceCommand } from './service/index.js';
|
|
7
8
|
import { ConfigStore } from './core/config.js';
|
|
8
9
|
// Thin entrypoint (§4): `--version` prints the package version, `--setup` runs the
|
|
9
|
-
// first-run wizard only (explicit re-configure),
|
|
10
|
-
//
|
|
11
|
-
//
|
|
12
|
-
//
|
|
10
|
+
// first-run wizard only (explicit re-configure), `service <sub>` manages OS auto-start
|
|
11
|
+
// registration (never boots the bot), and the default/no-flag path is a one-command
|
|
12
|
+
// first-run — it runs the wizard automatically when nothing is configured yet, then
|
|
13
|
+
// boots the bot. All real work lives in app.ts / setup/wizard.ts / service/; this file
|
|
14
|
+
// only parses argv, decides, and dispatches.
|
|
13
15
|
// Read the package version from package.json (two levels up from dist/cli.js, and
|
|
14
16
|
// from src/cli.ts in dev). Kept as a function so a test can call it directly.
|
|
15
17
|
export function readVersion() {
|
|
@@ -41,6 +43,11 @@ export async function run(argv) {
|
|
|
41
43
|
await runSetup();
|
|
42
44
|
return;
|
|
43
45
|
}
|
|
46
|
+
// OS auto-start management. Handles its own subcommands and MUST NOT boot the bot.
|
|
47
|
+
if (argv[0] === 'service') {
|
|
48
|
+
await runServiceCommand(argv.slice(1));
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
44
51
|
// No flags: one-command first-run. When nothing is configured yet, run the wizard
|
|
45
52
|
// and then start the bot in the same process; when already configured, start
|
|
46
53
|
// directly. If setup was cancelled (or still wrote nothing usable), startBot's
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AACpC,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/C,mFAAmF;AACnF,
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AACpC,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/C,mFAAmF;AACnF,uFAAuF;AACvF,oFAAoF;AACpF,oFAAoF;AACpF,uFAAuF;AACvF,6CAA6C;AAE7C,kFAAkF;AAClF,8EAA8E;AAC9E,MAAM,UAAU,WAAW;IACzB,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IAC1D,+DAA+D;IAC/D,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,cAAc,CAAC,CAAC;IACtD,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAyB,CAAC;IAClF,OAAO,GAAG,CAAC,OAAO,IAAI,OAAO,CAAC;AAChC,CAAC;AAED,oFAAoF;AACpF,8EAA8E;AAC9E,gFAAgF;AAChF,kFAAkF;AAClF,6EAA6E;AAC7E,mFAAmF;AACnF,wDAAwD;AACxD,SAAS,UAAU,CAAC,KAAkB;IACpC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE;QAAE,OAAO,IAAI,CAAC;IACjC,OAAO,KAAK,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,CAAC;AACxD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,GAAG,CAAC,IAAc;IACtC,IAAI,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;QAC/B,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC;QAC3B,OAAO;IACT,CAAC;IACD,2EAA2E;IAC3E,IAAI,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;QAC7B,MAAM,QAAQ,EAAE,CAAC;QACjB,OAAO;IACT,CAAC;IACD,mFAAmF;IACnF,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,SAAS,EAAE,CAAC;QAC1B,MAAM,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QACvC,OAAO;IACT,CAAC;IACD,kFAAkF;IAClF,6EAA6E;IAC7E,+EAA+E;IAC/E,8EAA8E;IAC9E,IAAI,UAAU,CAAC,IAAI,WAAW,EAAE,CAAC,EAAE,CAAC;QAClC,MAAM,QAAQ,EAAE,CAAC;QACjB,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;IAClC,CAAC;IACD,MAAM,QAAQ,EAAE,CAAC;AACnB,CAAC;AAED,8EAA8E;AAC9E,mFAAmF;AACnF,+EAA+E;AAC/E,sFAAsF;AACtF,MAAM,MAAM,GAAG,CAAC,GAAG,EAAE;IACnB,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC9B,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC5C,IAAI,CAAC;QACH,OAAO,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,KAAK,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACnE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC,CAAC,EAAE,CAAC;AAEL,IAAI,MAAM,EAAE,CAAC;IACX,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;QACvC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACnB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -167,7 +167,9 @@ export const CONFIG_DEFAULTS = {
|
|
|
167
167
|
},
|
|
168
168
|
limits: {
|
|
169
169
|
maxSessionsPerUser: 0,
|
|
170
|
-
|
|
170
|
+
// 0 → no timer, the Allow/Always/Deny prompt waits indefinitely for a click
|
|
171
|
+
// (see wiring.ts withTimeout). Prevents auto-deny on slow responders.
|
|
172
|
+
permissionTimeoutSec: 0,
|
|
171
173
|
codexTimeoutMs: 1_800_000,
|
|
172
174
|
},
|
|
173
175
|
policy: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"configSchema.js","sourceRoot":"","sources":["../../src/core/configSchema.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"configSchema.js","sourceRoot":"","sources":["../../src/core/configSchema.ts"],"names":[],"mappings":"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"}
|
package/dist/discord/wiring.js
CHANGED
|
@@ -32,7 +32,9 @@ export class SessionWiring {
|
|
|
32
32
|
this.auditLog = deps.auditLog;
|
|
33
33
|
this.configStore = deps.configStore;
|
|
34
34
|
this.resolveChannel = deps.resolveChannel ?? (() => Promise.resolve(null));
|
|
35
|
-
|
|
35
|
+
// 0 sentinel means "no timer" (infinite wait); withTimeout skips the setTimeout
|
|
36
|
+
// path so a slow-to-respond operator is not auto-denied.
|
|
37
|
+
this.permissionTimeoutMs = deps.permissionTimeoutSec > 0 ? deps.permissionTimeoutSec * 1000 : 0;
|
|
36
38
|
this.onAlwaysAllow = deps.onAlwaysAllow;
|
|
37
39
|
}
|
|
38
40
|
// Build the live resolveChannel over a real gateway client (used by app boot).
|
|
@@ -247,7 +249,11 @@ export class SessionWiring {
|
|
|
247
249
|
}
|
|
248
250
|
// Race the decision against the permission timeout. On timeout, resolve the
|
|
249
251
|
// pending prompt as deny (via a synthetic deny custom_id) and return deny.
|
|
252
|
+
// permissionTimeoutMs === 0 means "no timer": pass the decision through untouched
|
|
253
|
+
// so the prompt waits indefinitely for a button click.
|
|
250
254
|
withTimeout(decision, reqId, wiring) {
|
|
255
|
+
if (this.permissionTimeoutMs === 0)
|
|
256
|
+
return decision;
|
|
251
257
|
return new Promise((resolve) => {
|
|
252
258
|
const timer = setTimeout(() => {
|
|
253
259
|
void wiring.permission.resolve(`perm:${reqId}:deny`).catch(() => { });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wiring.js","sourceRoot":"","sources":["../../src/discord/wiring.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAIhE,OAAO,EAAE,kBAAkB,EAAE,wBAAwB,EAAoB,MAAM,sBAAsB,CAAC;AACtG,OAAO,EAAE,wBAAwB,EAAE,aAAa,EAAE,MAAM,kCAAkC,CAAC;AAC3F,OAAO,EAAkB,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAGpE,OAAO,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"wiring.js","sourceRoot":"","sources":["../../src/discord/wiring.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
import { execFile } from 'node:child_process';
|
|
2
|
+
import * as fs from 'node:fs';
|
|
3
|
+
import * as os from 'node:os';
|
|
4
|
+
import * as path from 'node:path';
|
|
5
|
+
import { fileURLToPath } from 'node:url';
|
|
6
|
+
import { createLaunchdInstaller } from './launchd.js';
|
|
7
|
+
import { createSystemdInstaller } from './systemd.js';
|
|
8
|
+
import { createSchtasksInstaller } from './schtasks.js';
|
|
9
|
+
// The `service` subcommand: register discord-agent-bridge to auto-start on this OS
|
|
10
|
+
// (§4). This module ONLY manages the OS service — it never boots the bot itself.
|
|
11
|
+
// cli.ts dispatches here before any startBot() path.
|
|
12
|
+
// ---- Real implementations (defaults) ----------------------------------------
|
|
13
|
+
// execFile (no shell): resolves with the captured output + exit code even on a
|
|
14
|
+
// non-zero exit (that code is data the installers inspect). Rejects only when the
|
|
15
|
+
// binary cannot be spawned (ENOENT/EACCES) — a genuine "tool missing" failure.
|
|
16
|
+
const realRun = (command, args) => new Promise((resolve, reject) => {
|
|
17
|
+
execFile(command, args, { encoding: 'utf8', maxBuffer: 4 * 1024 * 1024 }, (err, stdout, stderr) => {
|
|
18
|
+
const e = err;
|
|
19
|
+
if (e && typeof e.code === 'string') {
|
|
20
|
+
reject(e);
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
resolve({
|
|
24
|
+
code: e && typeof e.code === 'number' ? e.code : 0,
|
|
25
|
+
stdout: String(stdout ?? ''),
|
|
26
|
+
stderr: String(stderr ?? ''),
|
|
27
|
+
});
|
|
28
|
+
});
|
|
29
|
+
});
|
|
30
|
+
const realFs = {
|
|
31
|
+
writeFile(filePath, content, mode) {
|
|
32
|
+
fs.writeFileSync(filePath, content, mode !== undefined ? { encoding: 'utf8', mode } : { encoding: 'utf8' });
|
|
33
|
+
},
|
|
34
|
+
chmod(filePath, mode) {
|
|
35
|
+
fs.chmodSync(filePath, mode);
|
|
36
|
+
},
|
|
37
|
+
mkdirp(dir) {
|
|
38
|
+
if (!fs.existsSync(dir))
|
|
39
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
40
|
+
},
|
|
41
|
+
exists(filePath) {
|
|
42
|
+
return fs.existsSync(filePath);
|
|
43
|
+
},
|
|
44
|
+
remove(filePath) {
|
|
45
|
+
if (fs.existsSync(filePath))
|
|
46
|
+
fs.rmSync(filePath, { force: true });
|
|
47
|
+
},
|
|
48
|
+
};
|
|
49
|
+
// dist/cli.js, resolved relative to this module (dist/service/index.js → ../cli.js).
|
|
50
|
+
// The Windows scheduled task runs `node <this>`; the file exists in a real install.
|
|
51
|
+
function defaultCliEntry() {
|
|
52
|
+
const here = path.dirname(fileURLToPath(import.meta.url));
|
|
53
|
+
return path.join(here, '..', 'cli.js');
|
|
54
|
+
}
|
|
55
|
+
function resolveDeps(deps) {
|
|
56
|
+
const home = (deps.homedir ?? os.homedir)();
|
|
57
|
+
return {
|
|
58
|
+
run: deps.run ?? realRun,
|
|
59
|
+
fs: deps.fs ?? realFs,
|
|
60
|
+
home,
|
|
61
|
+
username: (deps.username ?? (() => os.userInfo().username))(),
|
|
62
|
+
platform: deps.platform ?? process.platform,
|
|
63
|
+
log: deps.log ?? ((m) => console.log(m)),
|
|
64
|
+
fail: deps.fail ?? (() => {
|
|
65
|
+
process.exitCode = 1;
|
|
66
|
+
}),
|
|
67
|
+
nodePath: (deps.nodePath ?? (() => process.execPath))(),
|
|
68
|
+
cliEntry: (deps.cliEntry ?? defaultCliEntry)(),
|
|
69
|
+
nodeDir: (deps.nodeDir ?? (() => path.dirname(process.execPath)))(),
|
|
70
|
+
baseDir: path.join(home, '.discord-agent-bridge'),
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
function selectInstaller(d) {
|
|
74
|
+
switch (d.platform) {
|
|
75
|
+
case 'darwin':
|
|
76
|
+
return createLaunchdInstaller(d);
|
|
77
|
+
case 'linux':
|
|
78
|
+
return createSystemdInstaller(d);
|
|
79
|
+
case 'win32':
|
|
80
|
+
return createSchtasksInstaller(d);
|
|
81
|
+
default:
|
|
82
|
+
return null;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
function printUsage(d, unknown) {
|
|
86
|
+
if (unknown)
|
|
87
|
+
d.log(`알 수 없는 명령입니다: service ${unknown}`);
|
|
88
|
+
d.log('사용법: discord-agent-bridge service <install|uninstall|status|restart>');
|
|
89
|
+
d.log(' install 재부팅/로그인 시 자동 실행을 등록하고 즉시 시작합니다.');
|
|
90
|
+
d.log(' uninstall 서비스를 중지하고 자동 실행 등록을 해제합니다.');
|
|
91
|
+
d.log(' status 등록/실행 상태를 출력합니다.');
|
|
92
|
+
d.log(' restart 서비스를 재시작합니다.');
|
|
93
|
+
}
|
|
94
|
+
function errorMessage(err) {
|
|
95
|
+
return err instanceof Error ? err.message : String(err);
|
|
96
|
+
}
|
|
97
|
+
// Run one installer operation, translating both an unspawnable command (thrown) and a
|
|
98
|
+
// clean "it ran but failed" (returned false) into the friendly non-zero exit.
|
|
99
|
+
async function guard(d, op) {
|
|
100
|
+
try {
|
|
101
|
+
if (!(await op()))
|
|
102
|
+
d.fail();
|
|
103
|
+
}
|
|
104
|
+
catch (err) {
|
|
105
|
+
d.log(`명령을 실행하지 못했습니다: ${errorMessage(err)}`);
|
|
106
|
+
d.log('수동 방법은 README 를 참고하세요.');
|
|
107
|
+
d.fail();
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
// Parse `service <sub>` and dispatch to the platform installer. Never boots the bot.
|
|
111
|
+
export async function runServiceCommand(argv, deps = {}) {
|
|
112
|
+
const d = resolveDeps(deps);
|
|
113
|
+
const installer = selectInstaller(d);
|
|
114
|
+
if (!installer) {
|
|
115
|
+
d.log(`이 플랫폼(${d.platform})은 서비스 자동 등록을 지원하지 않습니다.`);
|
|
116
|
+
d.log('수동 방법은 README 를 참고하세요.');
|
|
117
|
+
d.fail();
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
120
|
+
const sub = argv[0];
|
|
121
|
+
switch (sub) {
|
|
122
|
+
case 'install':
|
|
123
|
+
await guard(d, () => installer.install());
|
|
124
|
+
return;
|
|
125
|
+
case 'uninstall':
|
|
126
|
+
await guard(d, () => installer.uninstall());
|
|
127
|
+
return;
|
|
128
|
+
case 'status':
|
|
129
|
+
await guard(d, () => installer.status());
|
|
130
|
+
return;
|
|
131
|
+
case 'restart':
|
|
132
|
+
await guard(d, () => installer.restart());
|
|
133
|
+
return;
|
|
134
|
+
default:
|
|
135
|
+
printUsage(d, sub);
|
|
136
|
+
d.fail();
|
|
137
|
+
return;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/service/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import * as path from 'node:path';
|
|
2
|
+
import { SERVICE_LABEL } from './types.js';
|
|
3
|
+
import { ensureRunScript } from './runScript.js';
|
|
4
|
+
// macOS auto-start via a per-user LaunchAgent (launchd). RunAtLoad + KeepAlive means
|
|
5
|
+
// it starts on login and is relaunched if it exits — the closest launchd equivalent
|
|
6
|
+
// of "start at boot and keep alive".
|
|
7
|
+
function plistPath(d) {
|
|
8
|
+
return path.join(d.home, 'Library', 'LaunchAgents', `${SERVICE_LABEL}.plist`);
|
|
9
|
+
}
|
|
10
|
+
function outLogPath(d) {
|
|
11
|
+
return path.join(d.baseDir, 'agent.out.log');
|
|
12
|
+
}
|
|
13
|
+
function errLogPath(d) {
|
|
14
|
+
return path.join(d.baseDir, 'agent.err.log');
|
|
15
|
+
}
|
|
16
|
+
// Escape the five XML predefined entities for text placed inside <string> nodes.
|
|
17
|
+
function xml(value) {
|
|
18
|
+
return value
|
|
19
|
+
.replace(/&/g, '&')
|
|
20
|
+
.replace(/</g, '<')
|
|
21
|
+
.replace(/>/g, '>')
|
|
22
|
+
.replace(/"/g, '"')
|
|
23
|
+
.replace(/'/g, ''');
|
|
24
|
+
}
|
|
25
|
+
function buildPlist(d, scriptPath) {
|
|
26
|
+
return ([
|
|
27
|
+
'<?xml version="1.0" encoding="UTF-8"?>',
|
|
28
|
+
'<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">',
|
|
29
|
+
'<plist version="1.0">',
|
|
30
|
+
'<dict>',
|
|
31
|
+
' <key>Label</key>',
|
|
32
|
+
` <string>${SERVICE_LABEL}</string>`,
|
|
33
|
+
' <key>ProgramArguments</key>',
|
|
34
|
+
' <array>',
|
|
35
|
+
' <string>/bin/bash</string>',
|
|
36
|
+
` <string>${xml(scriptPath)}</string>`,
|
|
37
|
+
' </array>',
|
|
38
|
+
' <key>EnvironmentVariables</key>',
|
|
39
|
+
' <dict>',
|
|
40
|
+
' <key>HOME</key>',
|
|
41
|
+
` <string>${xml(d.home)}</string>`,
|
|
42
|
+
' </dict>',
|
|
43
|
+
' <key>RunAtLoad</key>',
|
|
44
|
+
' <true/>',
|
|
45
|
+
' <key>KeepAlive</key>',
|
|
46
|
+
' <true/>',
|
|
47
|
+
' <key>StandardOutPath</key>',
|
|
48
|
+
` <string>${xml(outLogPath(d))}</string>`,
|
|
49
|
+
' <key>StandardErrorPath</key>',
|
|
50
|
+
` <string>${xml(errLogPath(d))}</string>`,
|
|
51
|
+
'</dict>',
|
|
52
|
+
'</plist>',
|
|
53
|
+
'',
|
|
54
|
+
].join('\n'));
|
|
55
|
+
}
|
|
56
|
+
export function createLaunchdInstaller(d) {
|
|
57
|
+
const plist = plistPath(d);
|
|
58
|
+
async function load() {
|
|
59
|
+
// Unload first (ignore the outcome — it fails harmlessly when not yet loaded),
|
|
60
|
+
// then load with -w so it survives reboots.
|
|
61
|
+
await d.run('launchctl', ['unload', plist]).catch(() => undefined);
|
|
62
|
+
const res = await d.run('launchctl', ['load', '-w', plist]);
|
|
63
|
+
return res.code === 0;
|
|
64
|
+
}
|
|
65
|
+
return {
|
|
66
|
+
async install() {
|
|
67
|
+
const scriptPath = ensureRunScript(d);
|
|
68
|
+
d.fs.mkdirp(path.dirname(plist));
|
|
69
|
+
d.fs.writeFile(plist, buildPlist(d, scriptPath), 0o644);
|
|
70
|
+
if (!(await load())) {
|
|
71
|
+
d.log('서비스 등록에 실패했습니다 (launchctl load).');
|
|
72
|
+
d.log('수동 방법은 README 를 참고하세요.');
|
|
73
|
+
return false;
|
|
74
|
+
}
|
|
75
|
+
d.log('서비스를 등록하고 시작했습니다. 재부팅/로그인 시 자동 실행됩니다.');
|
|
76
|
+
d.log(` plist: ${plist}`);
|
|
77
|
+
d.log(` 로그: ${outLogPath(d)}`);
|
|
78
|
+
d.log(` ${errLogPath(d)}`);
|
|
79
|
+
return true;
|
|
80
|
+
},
|
|
81
|
+
async uninstall() {
|
|
82
|
+
await d.run('launchctl', ['unload', '-w', plist]).catch(() => undefined);
|
|
83
|
+
if (d.fs.exists(plist))
|
|
84
|
+
d.fs.remove(plist);
|
|
85
|
+
d.log('서비스를 중지하고 자동 실행 등록을 해제했습니다.');
|
|
86
|
+
return true;
|
|
87
|
+
},
|
|
88
|
+
async status() {
|
|
89
|
+
const res = await d.run('launchctl', ['list']);
|
|
90
|
+
const running = res.stdout.split('\n').some((line) => line.includes(SERVICE_LABEL));
|
|
91
|
+
d.log(`자동 실행 등록: ${d.fs.exists(plist) ? '있음' : '없음'} (${plist})`);
|
|
92
|
+
d.log(`실행 중: ${running ? '예' : '아니오'}`);
|
|
93
|
+
return true;
|
|
94
|
+
},
|
|
95
|
+
async restart() {
|
|
96
|
+
if (!(await load())) {
|
|
97
|
+
d.log('서비스 재시작에 실패했습니다 (launchctl load).');
|
|
98
|
+
d.log('수동 방법은 README 를 참고하세요.');
|
|
99
|
+
return false;
|
|
100
|
+
}
|
|
101
|
+
d.log('서비스를 재시작했습니다.');
|
|
102
|
+
return true;
|
|
103
|
+
},
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
//# sourceMappingURL=launchd.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"launchd.js","sourceRoot":"","sources":["../../src/service/launchd.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import * as path from 'node:path';
|
|
2
|
+
// The version-independent launcher shared by the launchd (macOS) and systemd (Linux)
|
|
3
|
+
// installers. The service manager runs THIS script, not the bot directly, so a node
|
|
4
|
+
// version bump (via nvm) never leaves the plist/unit pointing at a dead binary path.
|
|
5
|
+
export const RUN_SCRIPT_NAME = 'run.sh';
|
|
6
|
+
export function runScriptPath(d) {
|
|
7
|
+
return path.join(d.baseDir, RUN_SCRIPT_NAME);
|
|
8
|
+
}
|
|
9
|
+
// Prefer nvm's default node (so a node upgrade never breaks the service); when nvm is
|
|
10
|
+
// absent, fall back to the install-time node directory on PATH. Either branch then
|
|
11
|
+
// exec's the globally-installed `discord-agent-bridge` bin (which lives alongside the
|
|
12
|
+
// active node's bin in both cases).
|
|
13
|
+
export function buildRunScript(d) {
|
|
14
|
+
return ([
|
|
15
|
+
'#!/bin/bash',
|
|
16
|
+
'# Generated by `discord-agent-bridge service install`. Removed on uninstall.',
|
|
17
|
+
'# Loads a version-independent node, then starts the bot.',
|
|
18
|
+
'export NVM_DIR="$HOME/.nvm"',
|
|
19
|
+
'if [ -s "$NVM_DIR/nvm.sh" ]; then',
|
|
20
|
+
' . "$NVM_DIR/nvm.sh"',
|
|
21
|
+
' nvm use default >/dev/null 2>&1 || nvm use node >/dev/null 2>&1 || true',
|
|
22
|
+
'else',
|
|
23
|
+
` export PATH="${d.nodeDir}:$PATH"`,
|
|
24
|
+
'fi',
|
|
25
|
+
'exec discord-agent-bridge',
|
|
26
|
+
'',
|
|
27
|
+
].join('\n'));
|
|
28
|
+
}
|
|
29
|
+
// Write run.sh (0755) into the base dir, creating the dir first. Returns its path.
|
|
30
|
+
export function ensureRunScript(d) {
|
|
31
|
+
d.fs.mkdirp(d.baseDir);
|
|
32
|
+
const target = runScriptPath(d);
|
|
33
|
+
d.fs.writeFile(target, buildRunScript(d), 0o755);
|
|
34
|
+
d.fs.chmod(target, 0o755);
|
|
35
|
+
return target;
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=runScript.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runScript.js","sourceRoot":"","sources":["../../src/service/runScript.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAGlC,qFAAqF;AACrF,oFAAoF;AACpF,qFAAqF;AAErF,MAAM,CAAC,MAAM,eAAe,GAAG,QAAQ,CAAC;AAExC,MAAM,UAAU,aAAa,CAAC,CAAsB;IAClD,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC;AAC/C,CAAC;AAED,sFAAsF;AACtF,mFAAmF;AACnF,sFAAsF;AACtF,oCAAoC;AACpC,MAAM,UAAU,cAAc,CAAC,CAAsB;IACnD,OAAO,CACL;QACE,aAAa;QACb,8EAA8E;QAC9E,0DAA0D;QAC1D,6BAA6B;QAC7B,mCAAmC;QACnC,uBAAuB;QACvB,2EAA2E;QAC3E,MAAM;QACN,kBAAkB,CAAC,CAAC,OAAO,SAAS;QACpC,IAAI;QACJ,2BAA2B;QAC3B,EAAE;KACH,CAAC,IAAI,CAAC,IAAI,CAAC,CACb,CAAC;AACJ,CAAC;AAED,mFAAmF;AACnF,MAAM,UAAU,eAAe,CAAC,CAAsB;IACpD,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;IACvB,MAAM,MAAM,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;IAChC,CAAC,CAAC,EAAE,CAAC,SAAS,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IACjD,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IAC1B,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { SERVICE_NAME } from './types.js';
|
|
2
|
+
// Windows auto-start via the Task Scheduler (schtasks) with an onlogon trigger. This
|
|
3
|
+
// needs NO admin rights, which is the trade-off: onlogon runs the bot when the user
|
|
4
|
+
// logs in but does NOT auto-restart it if it crashes (unlike launchd KeepAlive /
|
|
5
|
+
// systemd Restart=always). That limitation is surfaced in the install output.
|
|
6
|
+
// The command the scheduled task runs: the absolute node binary + this package's CLI
|
|
7
|
+
// entry, each quoted so paths with spaces survive. Passed to schtasks as one /tr arg.
|
|
8
|
+
function taskCommand(d) {
|
|
9
|
+
return `"${d.nodePath}" "${d.cliEntry}"`;
|
|
10
|
+
}
|
|
11
|
+
export function createSchtasksInstaller(d) {
|
|
12
|
+
return {
|
|
13
|
+
async install() {
|
|
14
|
+
const res = await d.run('schtasks', [
|
|
15
|
+
'/create',
|
|
16
|
+
'/tn',
|
|
17
|
+
SERVICE_NAME,
|
|
18
|
+
'/sc',
|
|
19
|
+
'onlogon',
|
|
20
|
+
'/tr',
|
|
21
|
+
taskCommand(d),
|
|
22
|
+
'/f',
|
|
23
|
+
]);
|
|
24
|
+
if (res.code !== 0) {
|
|
25
|
+
d.log('서비스 등록에 실패했습니다 (schtasks /create).');
|
|
26
|
+
if (res.stderr.trim())
|
|
27
|
+
d.log(` ${res.stderr.trim()}`);
|
|
28
|
+
d.log('수동 방법은 README 를 참고하세요.');
|
|
29
|
+
return false;
|
|
30
|
+
}
|
|
31
|
+
d.log('로그인 시 자동 실행되도록 작업 스케줄러에 등록했습니다.');
|
|
32
|
+
d.log(` 작업 이름: ${SERVICE_NAME}`);
|
|
33
|
+
d.log(` 실행: ${taskCommand(d)}`);
|
|
34
|
+
d.log(' 참고: onlogon 작업은 크래시 시 자동 재시작을 보장하지 않습니다.');
|
|
35
|
+
return true;
|
|
36
|
+
},
|
|
37
|
+
async uninstall() {
|
|
38
|
+
const res = await d.run('schtasks', ['/delete', '/tn', SERVICE_NAME, '/f']);
|
|
39
|
+
if (res.code !== 0) {
|
|
40
|
+
d.log('자동 실행 등록 해제에 실패했습니다 (schtasks /delete).');
|
|
41
|
+
if (res.stderr.trim())
|
|
42
|
+
d.log(` ${res.stderr.trim()}`);
|
|
43
|
+
d.log('수동 방법은 README 를 참고하세요.');
|
|
44
|
+
return false;
|
|
45
|
+
}
|
|
46
|
+
d.log('자동 실행 등록을 해제했습니다.');
|
|
47
|
+
return true;
|
|
48
|
+
},
|
|
49
|
+
async status() {
|
|
50
|
+
const res = await d.run('schtasks', ['/query', '/tn', SERVICE_NAME]);
|
|
51
|
+
if (res.code === 0) {
|
|
52
|
+
d.log(`자동 실행 등록: 있음 (작업 ${SERVICE_NAME})`);
|
|
53
|
+
if (res.stdout.trim())
|
|
54
|
+
d.log(res.stdout.trim());
|
|
55
|
+
}
|
|
56
|
+
else {
|
|
57
|
+
d.log(`자동 실행 등록: 없음 (작업 ${SERVICE_NAME})`);
|
|
58
|
+
}
|
|
59
|
+
return true;
|
|
60
|
+
},
|
|
61
|
+
async restart() {
|
|
62
|
+
// onlogon tasks have no "restart"; end the running instance (best-effort) then
|
|
63
|
+
// run it again.
|
|
64
|
+
await d.run('schtasks', ['/end', '/tn', SERVICE_NAME]).catch(() => undefined);
|
|
65
|
+
const res = await d.run('schtasks', ['/run', '/tn', SERVICE_NAME]);
|
|
66
|
+
if (res.code !== 0) {
|
|
67
|
+
d.log('서비스 재시작에 실패했습니다 (schtasks /run).');
|
|
68
|
+
if (res.stderr.trim())
|
|
69
|
+
d.log(` ${res.stderr.trim()}`);
|
|
70
|
+
d.log('수동 방법은 README 를 참고하세요.');
|
|
71
|
+
return false;
|
|
72
|
+
}
|
|
73
|
+
d.log('서비스를 재시작했습니다.');
|
|
74
|
+
return true;
|
|
75
|
+
},
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=schtasks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schtasks.js","sourceRoot":"","sources":["../../src/service/schtasks.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import * as path from 'node:path';
|
|
2
|
+
import { SERVICE_NAME } from './types.js';
|
|
3
|
+
import { ensureRunScript } from './runScript.js';
|
|
4
|
+
// Linux auto-start via a systemd --user unit. Restart=always keeps it alive; a
|
|
5
|
+
// best-effort `loginctl enable-linger` lets it run without an active login session
|
|
6
|
+
// (so it survives reboot before the user logs in). ExecStart runs the shared run.sh
|
|
7
|
+
// wrapper for node-version independence.
|
|
8
|
+
function unitPath(d) {
|
|
9
|
+
return path.join(d.home, '.config', 'systemd', 'user', `${SERVICE_NAME}.service`);
|
|
10
|
+
}
|
|
11
|
+
function buildUnit(scriptPath) {
|
|
12
|
+
return ([
|
|
13
|
+
'[Unit]',
|
|
14
|
+
'Description=discord-agent-bridge (Discord <-> agent bridge)',
|
|
15
|
+
'After=network-online.target',
|
|
16
|
+
'Wants=network-online.target',
|
|
17
|
+
'',
|
|
18
|
+
'[Service]',
|
|
19
|
+
'Type=simple',
|
|
20
|
+
`ExecStart=/bin/bash ${scriptPath}`,
|
|
21
|
+
'Restart=always',
|
|
22
|
+
'RestartSec=5',
|
|
23
|
+
'',
|
|
24
|
+
'[Install]',
|
|
25
|
+
'WantedBy=default.target',
|
|
26
|
+
'',
|
|
27
|
+
].join('\n'));
|
|
28
|
+
}
|
|
29
|
+
export function createSystemdInstaller(d) {
|
|
30
|
+
const unit = unitPath(d);
|
|
31
|
+
return {
|
|
32
|
+
async install() {
|
|
33
|
+
const scriptPath = ensureRunScript(d);
|
|
34
|
+
d.fs.mkdirp(path.dirname(unit));
|
|
35
|
+
d.fs.writeFile(unit, buildUnit(scriptPath), 0o644);
|
|
36
|
+
await d.run('systemctl', ['--user', 'daemon-reload']);
|
|
37
|
+
const enabled = await d.run('systemctl', ['--user', 'enable', '--now', SERVICE_NAME]);
|
|
38
|
+
if (enabled.code !== 0) {
|
|
39
|
+
d.log('서비스 등록에 실패했습니다 (systemctl enable --now).');
|
|
40
|
+
if (enabled.stderr.trim())
|
|
41
|
+
d.log(` ${enabled.stderr.trim()}`);
|
|
42
|
+
d.log('수동 방법은 README 를 참고하세요.');
|
|
43
|
+
return false;
|
|
44
|
+
}
|
|
45
|
+
d.log('서비스를 등록하고 시작했습니다.');
|
|
46
|
+
d.log(` unit: ${unit}`);
|
|
47
|
+
// Linger lets the service start at boot before the user logs in. Non-fatal: on
|
|
48
|
+
// failure the service still runs while the user is logged in.
|
|
49
|
+
const linger = await d.run('loginctl', ['enable-linger', d.username]).catch(() => null);
|
|
50
|
+
if (!linger || linger.code !== 0) {
|
|
51
|
+
d.log(' 참고: loginctl enable-linger 실패 — 로그인 전 자동 시작이 안 될 수 있습니다.');
|
|
52
|
+
d.log(' 필요하면 `sudo loginctl enable-linger <사용자>` 를 직접 실행하세요.');
|
|
53
|
+
}
|
|
54
|
+
return true;
|
|
55
|
+
},
|
|
56
|
+
async uninstall() {
|
|
57
|
+
await d.run('systemctl', ['--user', 'disable', '--now', SERVICE_NAME]).catch(() => undefined);
|
|
58
|
+
if (d.fs.exists(unit))
|
|
59
|
+
d.fs.remove(unit);
|
|
60
|
+
await d.run('systemctl', ['--user', 'daemon-reload']).catch(() => undefined);
|
|
61
|
+
d.log('서비스를 중지하고 자동 실행 등록을 해제했습니다.');
|
|
62
|
+
return true;
|
|
63
|
+
},
|
|
64
|
+
async status() {
|
|
65
|
+
const res = await d.run('systemctl', ['--user', 'status', SERVICE_NAME]);
|
|
66
|
+
d.log(`자동 실행 등록: ${d.fs.exists(unit) ? '있음' : '없음'} (${unit})`);
|
|
67
|
+
if (res.stdout.trim())
|
|
68
|
+
d.log(res.stdout.trim());
|
|
69
|
+
// `systemctl status` exits non-zero for inactive/failed/missing units — that is
|
|
70
|
+
// informational here, not a command failure, so status still counts as success.
|
|
71
|
+
return true;
|
|
72
|
+
},
|
|
73
|
+
async restart() {
|
|
74
|
+
const res = await d.run('systemctl', ['--user', 'restart', SERVICE_NAME]);
|
|
75
|
+
if (res.code !== 0) {
|
|
76
|
+
d.log('서비스 재시작에 실패했습니다 (systemctl restart).');
|
|
77
|
+
if (res.stderr.trim())
|
|
78
|
+
d.log(` ${res.stderr.trim()}`);
|
|
79
|
+
d.log('수동 방법은 README 를 참고하세요.');
|
|
80
|
+
return false;
|
|
81
|
+
}
|
|
82
|
+
d.log('서비스를 재시작했습니다.');
|
|
83
|
+
return true;
|
|
84
|
+
},
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=systemd.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"systemd.js","sourceRoot":"","sources":["../../src/service/systemd.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
// Shared types + constants for the `service` subcommand (auto-start registration).
|
|
2
|
+
// Every OS touchpoint — running launchctl/systemctl/schtasks, writing files, reading
|
|
3
|
+
// the home dir / node paths — is injectable so the installers are unit-testable with
|
|
4
|
+
// no real service manager and no real filesystem writes (mirrors the DI style of
|
|
5
|
+
// setup/wizard.ts and modes/codex/runner.ts).
|
|
6
|
+
// launchd Label / plist basename (reverse-DNS is the launchd convention).
|
|
7
|
+
export const SERVICE_LABEL = 'com.discord-agent-bridge';
|
|
8
|
+
// systemd unit name and Windows Scheduled-Task name.
|
|
9
|
+
export const SERVICE_NAME = 'discord-agent-bridge';
|
|
10
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/service/types.ts"],"names":[],"mappings":"AAAA,mFAAmF;AACnF,qFAAqF;AACrF,qFAAqF;AACrF,iFAAiF;AACjF,8CAA8C;AAE9C,0EAA0E;AAC1E,MAAM,CAAC,MAAM,aAAa,GAAG,0BAA0B,CAAC;AACxD,qDAAqD;AACrD,MAAM,CAAC,MAAM,YAAY,GAAG,sBAAsB,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "discord-agent-bridge",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.4.1",
|
|
4
4
|
"description": "Self-hosted Discord bot that runs AI coding agents — Claude Code, Codex, and more — per channel. Role-based access, multi-server, extensible.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
7
|
-
"discord-agent-bridge": "
|
|
7
|
+
"discord-agent-bridge": "dist/cli.js"
|
|
8
8
|
},
|
|
9
9
|
"files": [
|
|
10
10
|
"dist",
|