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 CHANGED
@@ -55,41 +55,133 @@ Discord 채널에서 대화하듯 메시지를 보내면, 내 컴퓨터에서 Cl
55
55
 
56
56
  ## 2단계 — 설치 & 실행
57
57
 
58
- ### npx로 실행 (권장)
58
+ ### 설치 & 자동 실행 (권장)
59
59
 
60
- 설치 없이 바로 실행합니다. `npx` 최신 버전을 받아 실행하며, 최초 실행이면 셋업 마법사가 먼저 이어서 봇이 시작됩니다.
60
+ 가장 간단한 방법입니다. 아래 세 줄이면 설치부터 재부팅 자동 실행까지 끝납니다. `service install` 현재 OS에 맞는 자동 실행을 알아서 등록합니다 **macOS는 launchd, Linux는 systemd, Windows는 작업 스케줄러**.
61
61
 
62
62
  ```bash
63
- # 최초 실행 셋업 마법사가 자동으로 뜬 뒤 이어서 봇이 시작됩니다.
64
- # (토큰/Client ID 입력, 인텐트 확인, 초대 링크 생성 — 기본값은 안 물어봄)
65
- npx discord-agent-bridge
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
- npx discord-agent-bridge --setup
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
- 전역 설치도 가능합니다: `npm install -g discord-agent-bridge` `discord-agent-bridge` / `discord-agent-bridge --setup`.
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
- # npx 사용자 @latest 를 붙이면 항상 최신을 받습니다(npx는 캐시를 수 있어요).
82
- npx discord-agent-bridge@latest
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
- 설치된 버전 확인: `discord-agent-bridge --version`.
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
- ### PC 재시작 후에도 자동으로 실행 (PM2)
163
+ ```powershell
164
+ where.exe discord-agent-bridge # 예: C:\Users\<나>\AppData\Roaming\npm\discord-agent-bridge.cmd
91
165
 
92
- 로그아웃/재부팅 후에도 봇을 계속 살려두는 가장 간단한 방법은 [PM2](https://pm2.keymetrics.io/) 입니다. macOS·Linux·Windows에서 동일하게 동작하고, 로그·재시작·상태 확인을 한 번에 해결해 줍니다.
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
- ### Run with npx (recommended)
58
+ ### Install & auto-start (recommended)
59
59
 
60
- Runs instantly, no install needed. `npx` fetches the latest version and runs it; on first run, the setup wizard appears first and the bot starts right after.
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
- # First run the setup wizard runs automatically, then the bot starts.
64
- # (asks for your token/Client ID, checks intents, generates an invite link — no other defaults are asked)
65
- npx discord-agent-bridge
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
- # Later runs — if already configured, the bot starts directly.
68
- npx discord-agent-bridge
68
+ Management:
69
69
 
70
- # To reconfigure only (without starting the bot)
71
- npx discord-agent-bridge --setup
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
- Global install also works: `npm install -g discord-agent-bridge`, then `discord-agent-bridge` / `discord-agent-bridge --setup`.
76
+ To upgrade, install the latest and restart:
75
77
 
76
- ### Upgrading
78
+ ```bash
79
+ npm install -g discord-agent-bridge@latest
80
+ discord-agent-bridge service restart
81
+ ```
77
82
 
78
- When a new version is released:
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
- # npx users appending @latest always fetches the newest version (npx can otherwise cache).
82
- npx discord-agent-bridge@latest
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
- # Global-install users
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
- Check your installed version with: `discord-agent-bridge --version`.
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
- ### Keep it running across reboots (PM2)
164
+ ```powershell
165
+ where.exe discord-agent-bridge # e.g. C:\Users\<you>\AppData\Roaming\npm\discord-agent-bridge.cmd
91
166
 
92
- The simplest way to keep the bot running after logout/reboot is [PM2](https://pm2.keymetrics.io/). It works the same on macOS, Linux, and Windows, and gives you logs, restart, and status in one place.
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), and the default/no-flag path is a
10
- // one-command first-run it runs the wizard automatically when nothing is
11
- // configured yet, then boots the bot. All real work lives in app.ts /
12
- // setup/wizard.ts; this file only parses argv, decides, and dispatches.
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":"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"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -167,7 +167,9 @@ export const CONFIG_DEFAULTS = {
167
167
  },
168
168
  limits: {
169
169
  maxSessionsPerUser: 0,
170
- permissionTimeoutSec: 60,
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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"}
@@ -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
- this.permissionTimeoutMs = Math.max(1, deps.permissionTimeoutSec) * 1000;
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":"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"}
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;AAiEtE,SAAS,UAAU,CAAC,OAAe,EAAE,SAAiB;IACpD,OAAO,GAAG,OAAO,IAAI,SAAS,EAAE,CAAC;AACnC,CAAC;AAED,MAAM,OAAO,aAAa;IACP,QAAQ,CAAW;IACnB,YAAY,CAAe;IAC3B,eAAe,CAAkB;IACjC,YAAY,CAAe;IAC3B,MAAM,CAAS;IAChC,0EAA0E;IAC1E,+EAA+E;IAC/E,4EAA4E;IACpE,cAAc,CAAwD;IAC7D,mBAAmB,CAAS;IAC5B,QAAQ,CAAY;IACpB,WAAW,CAAe;IAC1B,aAAa,CAAuD;IAEpE,QAAQ,GAAG,IAAI,GAAG,EAAyB,CAAC;IAC7D,mFAAmF;IAC3E,SAAS,GAAuB,IAAI,CAAC;IAE7C,YAAY,IAAuB;QACjC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;QAC9B,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC;QACtC,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,eAAe,CAAC;QAC5C,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC;QACtC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;QAC1B,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;QAC9B,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;QACpC,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,cAAc,IAAI,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;QAC3E,gFAAgF;QAChF,yDAAyD;QACzD,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC,oBAAoB,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QAChG,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC;IAC1C,CAAC;IAED,+EAA+E;IAC/E,MAAM,CAAC,iBAAiB,CAAC,MAAc;QACrC,OAAO,CAAC,SAAiB,EAAkC,EAAE,CAC3D,qBAAqB,CAAC,MAAM,EAAE,SAAS,CAAmC,CAAC;IAC/E,CAAC;IAED,8EAA8E;IAC9E,yEAAyE;IACzE,iBAAiB,CAAC,cAAqE;QACrF,IAAI,CAAC,cAAc,GAAG,cAAc,CAAC;IACvC,CAAC;IAED,kFAAkF;IAClF,kFAAkF;IAClF,iFAAiF;IACjF,oDAAoD;IACpD,iBAAiB,GAAG,KAAK,EACvB,OAAgE,EAChE,GAAsB,EACO,EAAE;QAC/B,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC;QACjF,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,oCAAoC,EAAE,CAAC;QAC7E,CAAC;QACD,+EAA+E;QAC/E,2EAA2E;QAC3E,MAAM,EAAE,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;QACnF,MAAM,EAAE,GAAwD;YAC9D,IAAI,EAAE,oBAAoB;YAC1B,EAAE;YACF,QAAQ,EAAE,GAAG,CAAC,QAAQ;YACtB,KAAK,EAAE,GAAG,CAAC,KAAK;SACjB,CAAC;QACF,gFAAgF;QAChF,6EAA6E;QAC7E,MAAM,QAAQ,GAAG,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;QAChE,OAAO,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,EAAE,EAAE,MAAM,CAAC,CAAC;IAChD,CAAC,CAAC;IAEF,mFAAmF;IACnF,gFAAgF;IAChF,kFAAkF;IAClF,mFAAmF;IACnF,0CAA0C;IAC1C,KAAK,CAAC,iBAAiB,CACrB,OAAe,EACf,SAAiB,EACjB,QAAgB,EAChB,OAAgB;QAEhB,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC;QACjE,IAAI,CAAC,MAAM;YAAE,OAAO,IAAI,CAAC;QACzB,yEAAyE;QACzE,+EAA+E;QAC/E,gFAAgF;QAChF,yDAAyD;QACzD,MAAM,MAAM,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAC;QACvC,MAAM,UAAU,GACd,MAAM,EAAE,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,YAAY,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QACpF,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QACpE,IAAI,UAAU,IAAI,QAAQ,EAAE,QAAQ,KAAK,OAAO,EAAE,CAAC;YACjD,4EAA4E;YAC5E,0EAA0E;YAC1E,4EAA4E;YAC5E,2EAA2E;YAC3E,+CAA+C;YAC/C,IAAI,CAAC,gBAAgB,CAAC,OAAO,IAAI,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;YACrE,IAAI,CAAC;gBACH,IAAI,CAAC,aAAa,EAAE,CAAC,UAAU,EAAE,EAAE,OAAO,EAAE,OAAO,IAAI,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,CAAC;YACnF,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,yEAAyE;gBACzE,gEAAgE;gBAChE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,qCAAqC,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAClG,CAAC;QACH,CAAC;QACD,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,gFAAgF;IAChF,+EAA+E;IAC/E,qCAAqC;IAC7B,gBAAgB,CAAC,OAAe,EAAE,OAAe,EAAE,SAAiB,EAAE,IAAY;QACxF,IAAI,CAAC,IAAI,CAAC,QAAQ;YAAE,OAAO;QAC3B,IAAI,CAAC;YACH,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;gBACnB,OAAO;gBACP,QAAQ,EAAE,SAAS;gBACnB,OAAO;gBACP,SAAS;gBACT,MAAM,EAAE,cAAc;gBACtB,IAAI;gBACJ,MAAM,EAAE,SAAS;aAClB,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,8BAA8B,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC/E,CAAC;IACH,CAAC;IAED,iFAAiF;IACjF,+EAA+E;IAC/E,0CAA0C;IAC1C,KAAK,CAAC,MAAM,CAAC,OAAe,EAAE,SAAiB,EAAE,IAAY;QAC3D,MAAM,GAAG,GAAG,UAAU,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;QAC3C,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;QAEhC,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;QACrD,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,2CAA2C,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,CAAC;YACtF,OAAO;QACT,CAAC;QACD,MAAM,OAAO,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;QAC7D,MAAM,OAAO,GAAG,OAAO,EAAE,OAAO,IAAI,EAAE,CAAC;QACvC,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,YAAY,CAAC;QAE9D,MAAM,UAAU,GAAG,IAAI,wBAAwB,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC;QAC7D,MAAM,WAAW,GAAG,wBAAwB,CAAC;YAC3C,OAAO;YACP,OAAO;YACP,QAAQ,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC;SAC5C,CAAC,CAAC;QACH,6EAA6E;QAC7E,2EAA2E;QAC3E,gFAAgF;QAChF,MAAM,GAAG,GAAG,EAAE,GAAG,WAAW,EAAE,UAAU,EAAE,CAAC,EAAuD,EAAE,EAAE,GAAG,KAAK,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC1J,MAAM,UAAU,GAAG,IAAI,kBAAkB,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;QAC7D,MAAM,WAAW,GAAG,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;QAE5E,+EAA+E;QAC/E,8EAA8E;QAC9E,gFAAgF;QAChF,6EAA6E;QAC7E,kFAAkF;QAClF,MAAM,mBAAmB,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;QAE1E,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE;YACrB,WAAW;YACX,SAAS,EAAE,GAAG;YACd,UAAU;YACV,OAAO;YACP,IAAI;YACJ,GAAG,CAAC,mBAAmB,CAAC,CAAC,CAAC,EAAE,mBAAmB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACxD,CAAC,CAAC;QACH,wEAAwE;QACxE,IAAI,YAAY,CAAC,UAAU;YAAE,KAAK,IAAI,CAAC,YAAY,EAAE,CAAC;IACxD,CAAC;IAED,qFAAqF;IACrF,0FAA0F;IAC1F,sFAAsF;IACtF,sFAAsF;IAC9E,KAAK,CAAC,cAAc,CAAC,OAAe,EAAE,SAAiB;QAC7D,IAAI,CAAC,IAAI,CAAC,WAAW;YAAE,OAAO,IAAI,CAAC;QACnC,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC;YAC1D,MAAM,aAAa,GAAG,oBAAoB,CAAC,MAAM,CAAC,CAAC;YACnD,IAAI,CAAC,aAAa,CAAC,OAAO,IAAI,CAAC,aAAa,CAAC,SAAS;gBAAE,OAAO,IAAI,CAAC;YACpE,iEAAiE;YACjE,IAAI,aAAa,CAAC,SAAS,KAAK,SAAS;gBAAE,OAAO,IAAI,CAAC;YACvD,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;YACzE,IAAI,CAAC,aAAa;gBAAE,OAAO,IAAI,CAAC;YAChC,MAAM,QAAQ,GAAG,IAAI,eAAe,CAAC;gBACnC,aAAa;gBACb,gBAAgB,EAAE,SAAS;gBAC3B,MAAM,EAAE,aAAa,CAAC,MAAM;aAC7B,CAAC,CAAC;YACH,OAAO,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;QAC/D,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,yBAAyB,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACtF,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,kFAAkF;IAClF,iFAAiF;IACjF,kFAAkF;IAClF,8DAA8D;IAC9D,MAAM,CAAC,OAAe,EAAE,SAAiB;QACvC,MAAM,GAAG,GAAG,UAAU,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;QAC3C,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACtC,IAAI,CAAC,MAAM;YAAE,OAAO;QACpB,MAAM,CAAC,WAAW,EAAE,CAAC;QACrB,mFAAmF;QACnF,iDAAiD;QACjD,MAAM,CAAC,mBAAmB,EAAE,EAAE,CAAC;QAC/B,IAAI,CAAC;YACH,MAAM,CAAC,SAAS,CAAC,OAAO,EAAE,EAAE,CAAC;QAC/B,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,mCAAmC,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAClG,CAAC;QACD,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAC5B,CAAC;IAED,mFAAmF;IACnF,kDAAkD;IAClD,WAAW,CAAC,OAAe,EAAE,SAAiB;QAC5C,OAAO,KAAK,EAAE,OAAe,EAAE,QAAiB,EAAmB,EAAE;YACnE,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC;YACjE,IAAI,CAAC,MAAM;gBAAE,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;YACxE,MAAM,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;YACnG,OAAO,QAAQ,QAAQ,IAAI,OAAO,kBAAkB,CAAC;QACvD,CAAC,CAAC;IACJ,CAAC;IAED,qFAAqF;IAC7E,KAAK,CAAC,YAAY;QACxB,IAAI,CAAC;YACH,IAAI,CAAC,SAAS,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,CAAC;QACtD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,sBAAsB,EAAE,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACjE,CAAC;IACH,CAAC;IAED,+EAA+E;IAC/E,sEAAsE;IAC9D,gBAAgB,CAAC,IAAY;QACnC,IAAI,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,YAAY,CAAC,UAAU,EAAE,CAAC;YACxF,OAAO,qBAAqB,EAAE,CAAC;QACjC,CAAC;QACD,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;IAED,4EAA4E;IAC5E,2EAA2E;IAC3E,kFAAkF;IAClF,uDAAuD;IAC/C,WAAW,CACjB,QAAqC,EACrC,KAAa,EACb,MAAqB;QAErB,IAAI,IAAI,CAAC,mBAAmB,KAAK,CAAC;YAAE,OAAO,QAAQ,CAAC;QACpD,OAAO,IAAI,OAAO,CAAqB,CAAC,OAAO,EAAE,EAAE;YACjD,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;gBAC5B,KAAK,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;gBACrE,OAAO,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,uCAAuC,EAAE,CAAC,CAAC;YAClF,CAAC,EAAE,IAAI,CAAC,mBAAmB,CAAC,CAAC;YAC7B,KAAK,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE;gBACvB,YAAY,CAAC,KAAK,CAAC,CAAC;gBACpB,OAAO,CAAC,CAAC,CAAC,CAAC;YACb,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;CACF"}
@@ -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, '&amp;')
20
+ .replace(/</g, '&lt;')
21
+ .replace(/>/g, '&gt;')
22
+ .replace(/"/g, '&quot;')
23
+ .replace(/'/g, '&apos;');
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.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": "./dist/cli.js"
7
+ "discord-agent-bridge": "dist/cli.js"
8
8
  },
9
9
  "files": [
10
10
  "dist",