| 2026-04-03T18:36:11.744Z | message | assistant | - | - | [[reply_to_current]] 已整理好,也放上 Google Drive 了。 ### 雲端文件 - **Google Docs** - https://docs.google.com/document/d/10LsNWYZnpdUMGF9zwafMZbbXCcAzls9jwpoPkpoB3mg/edit?usp=drivesdk ### 文件內容涵蓋 - control-center 架構總覽 - `.env` 關鍵設定 - 本機手動啟動流程 - reverse SSH tunnel 設定 - Ubuntu Nginx 反代設定範例 - launchd 常駐化做法 - 驗證流程 - log 位置 - 常見故障排查 - 交接用重點資訊 ### 本地也留了一份 - `openclaw-control-center/docs/CONTROL_CENTER_AND_REVERSE_TUNNEL_SETUP.zh-TW.md` ### repo commit - `d17fafb` — `Add setup guide for control center and reverse tunnel` 如果你要,我下一步可以再幫你: 1. **移到指定的 Google Drive 資料夾** 2. **再產一份 PDF** 3. **補成英文版** |
| 2026-04-03T18:36:03.353Z | tool_event | toolResult | tool | - | [main d17fafb] Add setup guide for control center and reverse tunnel 1 file changed, 448 insertions(+) create mode 100644 docs/CONTROL_CENTER_AND_REVERSE_TUNNEL_SETUP.zh-TW.md d17fafb |
| 2026-04-03T18:36:03.349Z | tool_event | toolResult | tool | - | 10LsNWYZnpdUMGF9zwafMZbbXCcAzls9jwpoPkpoB3mg https://docs.google.com/document/d/10LsNWYZnpdUMGF9zwafMZbbXCcAzls9jwpoPkpoB3mg/edit?usp=drivesdk |
| 2026-04-03T18:36:02.949Z | message | assistant | - | - | 文件其實已經建好了;剛剛只是我後面的自動抓 ID 腳本少補一層 `file.id`。我把連結補抓出來,順手把本地教學稿 commit。 |
| 2026-04-03T18:35:50.004Z | tool_event | toolResult | tool | - | { "file": { "id": "10LsNWYZnpdUMGF9zwafMZbbXCcAzls9jwpoPkpoB3mg", "mimeType": "application/vnd.google-apps.document", "name": "OpenClaw Control Center 與 Reverse Tunnel 設定教學", "webViewLink": "https://docs.google.com/document/d/10LsNWYZnpdUMGF9zwafMZbbXCcAzls9jwpoPkpoB3mg/edit?usp=drivesdk" } } Traceback (most recent call last): File "<stdin>", line 34, in <module> File "<stdin>", line 32, in get_id RuntimeError: doc id not found (Command exited with code 1) |
| 2026-04-03T18:35:46.537Z | message | assistant | - | - | 剛剛是 shell quoting 卡住,我重跑一次文件建立。 |
| 2026-04-03T18:35:21.771Z | tool_event | toolResult | tool | - | id: -c: line 6: unexpected EOF while looking for matching `)' (Command exited with code 2) |
| 2026-04-03T18:35:18.383Z | message | assistant | - | - | 我已經把內容整理好了,現在直接匯進 Google Docs。 |
| 2026-04-03T18:35:04.719Z | tool_event | toolResult | tool | - | Successfully wrote 8091 bytes to /Users/sharenq/.openclaw/workspace-coding-mocha/openclaw-control-center/docs/CONTROL_CENTER_AND_REVERSE_TUNNEL_SETUP.zh-TW.md |
| 2026-04-03T18:35:04.710Z | message | assistant | - | - | 我先把內容整理成 Markdown,存一份在 repo 裡,再匯進 Google Docs 給你一個雲端連結。 |
| 2026-04-03T18:33:38.353Z | tool_event | toolResult | tool | - | Usage: gog docs (doc) write <docId> [<content>] [flags] Build: v0.11.0 (91c4c15) Write content to a Google Doc Arguments: <docId> Doc ID [<content>] Content to write (or use --file / stdin) Flags: -h, --help Show context-sensitive help. --color="auto" Color output: auto|always|never -a, --account=STRING Account email for API commands (gmail/calendar/chat/classroom/drive/docs/slides/contacts/tasks/people/sheets/forms/appscript) --client="" OAuth client name (selects stored credentials + token bucket) --enable-commands="" Comma-separated list of enabled top-level commands (restricts CLI) -j, --json Output JSON to stdout (best for scripting) -p, --plain Output stable, parseable text to stdou... |
| 2026-04-03T18:33:38.352Z | tool_event | toolResult | tool | - | Usage: gog docs (doc) update <docId> [flags] Build: v0.11.0 (91c4c15) Update content in a Google Doc Arguments: <docId> Doc ID Flags: -h, --help Show context-sensitive help. --color="auto" Color output: auto|always|never -a, --account=STRING Account email for API commands (gmail/calendar/chat/classroom/drive/docs/slides/contacts/tasks/people/sheets/forms/appscript) --client="" OAuth client name (selects stored credentials + token bucket) --enable-commands="" Comma-separated list of enabled top-level commands (restricts CLI) -j, --json Output JSON to stdout (best for scripting) -p, --plain Output stable, parseable text to stdout (TSV; no colors) --results-only In JSON mode, emit only the p... |
| 2026-04-03T18:33:38.351Z | tool_event | toolResult | tool | - | Usage: gog docs (doc) create (add,new) <title> [flags] Build: v0.11.0 (91c4c15) Create a Google Doc Arguments: <title> Doc title Flags: -h, --help Show context-sensitive help. --color="auto" Color output: auto|always|never -a, --account=STRING Account email for API commands (gmail/calendar/chat/classroom/drive/docs/slides/contacts/tasks/people/sheets/forms/appscript) --client="" OAuth client name (selects stored credentials + token bucket) --enable-commands="" Comma-separated list of enabled top-level commands (restricts CLI) -j, --json Output JSON to stdout (best for scripting) -p, --plain Output stable, parseable text to stdout (TSV; no colors) --results-only In JSON mode, emit only the... |
| 2026-04-03T18:33:38.293Z | message | assistant | - | - | **Creating tutorial content** Alright, I need to create some tutorial content since the user asked for it in a cloud drive. I could either create it as a local markdown file or directly as a Google Doc. Google Docs might be better since the user mentioned "雲端硬碟," which likely means Google Drive. I guess I should include the exact commands and steps. Maybe I'll create a local version for tracking and then upload it to Drive. Should I also create a folder on Drive or just save it in the root? **Writing a tutorial document** I'm thinking of creating a Google Doc with a title like "OpenClaw Control Center 與 Reverse Tunnel 設定教學." The document should detail the setup flow and reverse tunnel con... |
| 2026-04-03T18:33:22.664Z | tool_event | toolResult | tool | - | Usage: gog docs (doc) <command> [flags] Build: v0.11.0 (91c4c15) Google Docs (export via Drive) Flags: -h, --help Show context-sensitive help. --color="auto" Color output: auto|always|never -a, --account=STRING Account email for API commands (gmail/calendar/chat/classroom/drive/docs/slides/contacts/tasks/people/sheets/forms/appscript) --client="" OAuth client name (selects stored credentials + token bucket) --enable-commands="" Comma-separated list of enabled top-level commands (restricts CLI) -j, --json Output JSON to stdout (best for scripting) -p, --plain Output stable, parseable text to stdout (TSV; no colors) --results-only In JSON mode, emit only the primary result (drops envelope f... |
| 2026-04-03T18:33:22.663Z | tool_event | toolResult | tool | - | Usage: gog drive (drv) <command> [flags] Build: v0.11.0 (91c4c15) Google Drive Flags: -h, --help Show context-sensitive help. --color="auto" Color output: auto|always|never -a, --account=STRING Account email for API commands (gmail/calendar/chat/classroom/drive/docs/slides/contacts/tasks/people/sheets/forms/appscript) --client="" OAuth client name (selects stored credentials + token bucket) --enable-commands="" Comma-separated list of enabled top-level commands (restricts CLI) -j, --json Output JSON to stdout (best for scripting) -p, --plain Output stable, parseable text to stdout (TSV; no colors) --results-only In JSON mode, emit only the primary result (drops envelope fields like nextPa... |
| 2026-04-03T18:33:22.662Z | tool_event | toolResult | tool | - | /opt/homebrew/bin/gog sharenq2@gmail.com default drive 2026-03-29T15:48:13Z oauth |
| 2026-04-03T18:33:22.122Z | message | assistant | - | - | 我整理成一份可交接的文件,然後直接放到你的 Google Drive。先確認 `gog` 這台機器能不能直接建檔。 |
| 2026-04-03T18:33:13.710Z | tool_event | toolResult | tool | - | { "status": "error", "tool": "read", "error": "ENOENT: no such file or directory, access '/Users/sharenq/.openclaw/workspace-coding-mocha/memory/2026-04-03.md'" } |
| 2026-04-03T18:33:13.709Z | tool_event | toolResult | tool | - | { "status": "error", "tool": "read", "error": "ENOENT: no such file or directory, access '/Users/sharenq/.openclaw/workspace-coding-mocha/memory/2026-04-04.md'" } |
| 2026-04-03T18:33:13.708Z | tool_event | toolResult | tool | - | --- name: gog description: Google Workspace CLI for Gmail, Calendar, Drive, Contacts, Sheets, and Docs. homepage: https://gogcli.sh metadata: { "openclaw": { "emoji": "🎮", "requires": { "bins": ["gog"] }, "install": [ { "id": "brew", "kind": "brew", "formula": "steipete/tap/gogcli", "bins": ["gog"], "label": "Install gog (brew)", }, ], }, } --- # gog Use `gog` for Gmail/Calendar/Drive/Contacts/Sheets/Docs. Requires OAuth setup. Setup (once) - `gog auth credentials /path/to/client_secret.json` - `gog auth add you@gmail.com --services gmail,calendar,drive,contacts,docs,sheets` - `gog auth list` Common commands - Gmail search: `gog gmail search 'newer_than:7d' --max 10` - Gmail messages sea... |
| 2026-04-03T18:33:02.260Z | message | user | - | - | Conversation info (untrusted metadata): ```json { "message_id": "2892", "sender_id": "8426871379", "conversation_label": "Coding 摩卡 id:-5168688005", "sender": "Chris Chuang", "timestamp": "Sat 2026-04-04 02:33 GMT+8", "group_subject": "Coding 摩卡", "is_group_chat": true } ``` Sender (untrusted metadata): ```json { "label": "Chris Chuang (8426871379)", "id": "8426871379", "name": "Chris Chuang" } ``` 幫我把設定 control-center流程以及 reverse tunnel 設定部份整理成教學文件,放到雲端硬碟上 |
| 2026-04-03T17:52:03.454Z | message | assistant | - | - | [[reply_to_current]] 已做成常駐。 ### 現在的常駐組件 #### 1) Control Center UI - launchd label: `ai.openclaw.control-center-ui` - 實際啟動 script: - `/Users/sharenq/.openclaw/workspace-coding-mocha/openclaw-control-center/scripts/run-resident-ui.sh` #### 2) Reverse tunnel - launchd label: `ai.openclaw.control-center-tunnel` - 實際啟動 script: - `/Users/sharenq/.openclaw/workspace-coding-mocha/openclaw-control-center/scripts/run-resident-reverse-tunnel.sh` ### 我做了什麼 - 新增 repo 內兩個常駐 script - 建立兩個 macOS LaunchAgent: - `~/Library/LaunchAgents/ai.openclaw.control-center-ui.plist` - `~/Library/LaunchAgents/ai.openclaw.control-center-tunnel.plist` - 卸掉手動背景程序,改由 launchd 接手 - 驗證: - 本機 `127.0.0.1:4310` 正常 - Ubuntu `127... |
| 2026-04-03T17:51:44.824Z | tool_event | toolResult | tool | - | M package-lock.json ?? scripts/run-resident-reverse-tunnel.sh ?? scripts/run-resident-ui.sh [main 6cd3027] Add resident UI and reverse tunnel scripts 2 files changed, 23 insertions(+) create mode 100755 scripts/run-resident-reverse-tunnel.sh create mode 100755 scripts/run-resident-ui.sh 6cd3027 |
| 2026-04-03T17:51:44.757Z | message | assistant | - | - | 最後把 repo 內新增的常駐 script 提交掉,避免之後不知道現在是怎麼起的。 |
| 2026-04-03T17:51:39.090Z | tool_event | toolResult | tool | - | == ubuntu local == HTTP/1.1 200 OK x-request-id: 4798772f-de7b-45fb-a3ae-aacd0c2abc1e content-type: text/html; charset=utf-8 cache-control: no-store, no-cache, must-revalidate, max-age=0 pragma: no-cache expires: 0 Date: Fri, 03 Apr 2026 17:51:38 GMT Connection: keep-alive Keep-Alive: timeout=5 Transfer-Encoding: chunked <title>OpenClaw Control Center</title> |
| 2026-04-03T17:51:38.781Z | tool_event | toolResult | tool | - | == public == HTTP/2 200 server: nginx/1.24.0 (Ubuntu) date: Fri, 03 Apr 2026 17:51:38 GMT content-type: text/html; charset=utf-8 x-request-id: 5fcaa767-0a59-4c58-8070-eff15ac5171e cache-control: no-store, no-cache, must-revalidate, max-age=0 pragma: no-cache expires: 0 <title>OpenClaw Control Center</title> |
| 2026-04-03T17:51:37.599Z | tool_event | toolResult | tool | - | == ui print == gui/501/ai.openclaw.control-center-ui = { active count = 1 path = /Users/sharenq/Library/LaunchAgents/ai.openclaw.control-center-ui.plist type = LaunchAgent state = running program = /Users/sharenq/.openclaw/workspace-coding-mocha/openclaw-control-center/scripts/run-resident-ui.sh arguments = { /Users/sharenq/.openclaw/workspace-coding-mocha/openclaw-control-center/scripts/run-resident-ui.sh } working directory = /Users/sharenq/.openclaw/workspace-coding-mocha/openclaw-control-center stdout path = /Users/sharenq/.openclaw/workspace-coding-mocha/openclaw-control-center/runtime/launchd-ui.out.log stderr path = /Users/sharenq/.openclaw/workspace-coding-mocha/openclaw-control-c... |
| 2026-04-03T17:51:37.555Z | message | assistant | - | - | 我再確認 launchd 真的接手成功,順便測外網。 |
| 2026-04-03T17:51:25.698Z | tool_event | toolResult | tool | - | == launchctl labels == 92371 0 ai.openclaw.control-center-tunnel 92369 -15 ai.openclaw.control-center-ui == local 4310 == COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME node 92387 sharenq 18u IPv4 0xdf421fbc2bde9fd5 0t0 TCP 127.0.0.1:4310 (LISTEN) == tunnel proc == 92371 1 /usr/bin/ssh -NT -o ExitOnForwardFailure=yes -o ConnectTimeout=10 -o ServerAliveInterval=30 -o ServerAliveCountMax=3 -R 127.0.0.1:14310:127.0.0.1:4310 oracle == ui log tail == > openclaw-control-center@1.0.0 dev > node --import tsx src/index.ts [mission-control] startup { gateway: 'ws://127.0.0.1:18789', readonlyMode: true, approvalActionsEnabled: false, approvalActionsDryRun: true, importMutationEnabled: false, imp... |
| 2026-04-03T17:50:48.467Z | tool_event | toolResult | tool | - | Successfully wrote 222 bytes to /Users/sharenq/.openclaw/workspace-coding-mocha/openclaw-control-center/scripts/run-resident-reverse-tunnel.sh |
| 2026-04-03T17:50:48.466Z | tool_event | toolResult | tool | - | Successfully wrote 228 bytes to /Users/sharenq/.openclaw/workspace-coding-mocha/openclaw-control-center/scripts/run-resident-ui.sh |
| 2026-04-03T17:50:48.452Z | message | assistant | - | - | 我會把常駐邏輯放成 repo 內的兩個 script,再由 macOS LaunchAgent 載入。這樣之後重啟也比較好維護。 |
| 2026-04-03T17:50:14.415Z | tool_event | toolResult | tool | - | <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>Label</key> <string>ai.openclaw.gateway</string> <key>Comment</key> <string>OpenClaw Gateway (v2026.3.23-2)</string> <key>RunAtLoad</key> <true/> <key>KeepAlive</key> <true/> <key>ThrottleInterval</key> <integer>1</integer> <key>Umask</key> <integer>63</integer> <key>ProgramArguments</key> <array> <string>/opt/homebrew/opt/node/bin/node</string> <string>/opt/homebrew/lib/node_modules/openclaw/dist/index.js</string> <string>gateway</string> <string>--port</string> <string>18789</string> </array> <key>StandardOutPath<... |
| 2026-04-03T17:50:14.412Z | message | assistant | - | - | **Creating scripts and plists** I’m considering how to create the necessary scripts and property lists. It seems like a good idea to read the existing ai.openclaw.gateway.plist to use as a pattern. This could help guide my structure and formatting for whatever I need to develop. I want to ensure I follow the right conventions to make everything work seamlessly, so I’ll definitely need to take a closer look at it! |
| 2026-04-03T17:50:07.485Z | tool_event | toolResult | tool | - | == current listeners == COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME node 76116 sharenq 18u IPv4 0xf6d4d4e78c4c81b9 0t0 TCP 127.0.0.1:4310 (LISTEN) == current tunnel == 76497 1 ssh -fNT -o ExitOnForwardFailure=yes -o ServerAliveInterval=30 -o ServerAliveCountMax=3 -R 127.0.0.1:14310:127.0.0.1:4310 oracle |
| 2026-04-03T17:50:07.484Z | tool_event | toolResult | tool | - | ./control-center.log:3:> cross-env UI_MODE=true node --import tsx src/index.ts ./docs/PROGRESS.md:2590: - `UI_MODE=true UI_PORT=4410 npm run dev` smoke booted successfully (`ui listening`). ./docs/PROGRESS.md:2620: - `UI_MODE=true UI_PORT=4412 npm run dev` smoke passed with live Usage & Cost section rendering. ./docs/PROGRESS.md:2650: - `UI_MODE=true UI_PORT=4422 npm run dev` smoke passed with live render checks for: ./docs/PROGRESS.md:2683: - `UI_MODE=true UI_PORT=4430 npm run dev` smoke passed (`ui listening`) ./docs/PROGRESS.md:2756: - `UI_MODE=true UI_PORT=4460 npm run dev` smoke -> pass (`ui listening`) ./docs/PROGRESS.md:2785: - `npm run dev` smoke passed on `UI_MODE=true UI_PORT=44... |
| 2026-04-03T17:50:07.295Z | tool_event | toolResult | tool | - | node: /opt/homebrew/bin/node npm: /opt/homebrew/bin/npm ssh: /usr/bin/ssh autossh: zsh: /bin/zsh == existing launchagents == ai.openclaw.gateway.plist ai.openclaw.gateway.plist.bak-memory-key com.google.GoogleUpdater.wake.plist com.google.keystone.agent.plist com.google.keystone.xpcservice.plist |
| 2026-04-03T17:50:07.261Z | message | assistant | - | - | 我會用 **launchd 常駐兩個東西**: 1. control-center UI 2. 到 Oracle 的 reverse tunnel 先檢查本機路徑與現有設定,再補上可重啟的常駐檔。 |
| 2026-04-03T17:49:38.628Z | message | user | - | - | System: [2026-04-04 01:12:01 GMT+8] Exec failed (quick-sh, signal SIGKILL) Conversation info (untrusted metadata): ```json { "message_id": "2886", "sender_id": "8426871379", "conversation_label": "Coding 摩卡 id:-5168688005", "sender": "Chris Chuang", "timestamp": "Sat 2026-04-04 01:49 GMT+8", "group_subject": "Coding 摩卡", "is_group_chat": true } ``` Sender (untrusted metadata): ```json { "label": "Chris Chuang (8426871379)", "id": "8426871379", "name": "Chris Chuang" } ``` 做成常駐 |
| 2026-04-03T17:13:20.202Z | message | assistant | - | - | [[reply_to_current]] 已修好。 ### 我怎麼處理的 1. **停掉錯的 tunnel** - 把之前指到 `127.0.0.1:18789` 的 reverse SSH 收掉了 2. **拉起真的 control-center** - repo:`/Users/sharenq/.openclaw/workspace-coding-mocha/openclaw-control-center` - 用這個方式啟動: ```bash env UI_MODE=true MONITOR_CONTINUOUS=true UI_PORT=4310 npm run dev ``` - 目前本機 `127.0.0.1:4310` 已經在回應 3. **把 tunnel 改接回真的 4310** - 目前是: ```bash ssh -fNT \ -o ExitOnForwardFailure=yes \ -o ServerAliveInterval=30 \ -o ServerAliveCountMax=3 \ -R 127.0.0.1:14310:127.0.0.1:4310 \ oracle ``` --- ### 我驗證到的結果 - Mac mini 本機:`http://127.0.0.1:4310/` → **200 OK** - Ubuntu 本機:`http://127.0.0.1:14310/` → **200 OK** - 公網:`https://cc.sharenq.publicvm.com/` → **200 OK** - 頁面 title:**... |
| 2026-04-03T17:13:00.057Z | tool_event | toolResult | tool | - | == public https headers == HTTP/2 200 server: nginx/1.24.0 (Ubuntu) date: Fri, 03 Apr 2026 17:12:59 GMT content-type: text/html; charset=utf-8 x-request-id: b0c95700-cc80-4fa2-b97a-10864a65a266 cache-control: no-store, no-cache, must-revalidate, max-age=0 pragma: no-cache expires: 0 == public https title == <title>OpenClaw Control Center</title> |
| 2026-04-03T17:13:00.057Z | tool_event | toolResult | tool | - | == ubuntu 14310 headers == HTTP/1.1 200 OK x-request-id: 6f94f1f6-9ab9-4252-876d-ed5d430bbe9b content-type: text/html; charset=utf-8 cache-control: no-store, no-cache, must-revalidate, max-age=0 pragma: no-cache expires: 0 Date: Fri, 03 Apr 2026 17:12:59 GMT Connection: keep-alive Keep-Alive: timeout=5 Transfer-Encoding: chunked == ubuntu 14310 title == <title>OpenClaw Control Center</title> |
| 2026-04-03T17:12:59.002Z | message | assistant | - | - | **Verifying Ubuntu details** I need to verify some details about Ubuntu 14.3.10, and I should also check the public URL to confirm that the control center is separate from the built-in dashboard. It seems important to use a specific header, x-request-id, along with the title to ensure everything matches up correctly. I want to make sure I'm thorough in this verification process! |
| 2026-04-03T17:12:49.142Z | tool_event | toolResult | tool | - | APP_PID=76101 == local 4310 headers == HTTP/1.1 200 OK x-request-id: d04b508f-62fe-4c6d-a413-e3bf40604319 content-type: text/html; charset=utf-8 cache-control: no-store, no-cache, must-revalidate, max-age=0 pragma: no-cache expires: 0 Date: Fri, 03 Apr 2026 17:12:49 GMT Connection: keep-alive Keep-Alive: timeout=5 Transfer-Encoding: chunked == local 4310 title == <title>OpenClaw Control Center</title> == reverse ssh == 76497 1 ssh -fNT -o ExitOnForwardFailure=yes -o ServerAliveInterval=30 -o ServerAliveCountMax=3 -R 127.0.0.1:14310:127.0.0.1:4310 oracle |
| 2026-04-03T17:12:42.985Z | message | assistant | - | - | 我現在直接把真正的 control-center 起來,再把 14310 反向接回 4310,最後幫你驗證公網。 |
| 2026-04-03T17:12:19.709Z | tool_event | toolResult | tool | - | node_modules_present v25.6.1 11.9.0 |
| 2026-04-03T17:12:19.532Z | tool_event | toolResult | tool | - | import { existsSync } from "node:fs"; import { join } from "node:path"; const DOTENV_PATH = join(process.cwd(), ".env"); if (existsSync(DOTENV_PATH)) { process.loadEnvFile?.(DOTENV_PATH); } export const GATEWAY_URL = readStringEnv(process.env.GATEWAY_URL, "ws://127.0.0.1:18789"); export const OPENCLAW_CONTROL_UI_URL = readOptionalStringEnv(process.env.OPENCLAW_CONTROL_UI_URL); export const TASK_ROOM_BRIDGE_ENABLED = process.env.TASK_ROOM_BRIDGE_ENABLED === "true"; export const TASK_ROOM_BRIDGE_DISCORD_WEBHOOK_URL = readOptionalStringEnv( process.env.TASK_ROOM_BRIDGE_DISCORD_WEBHOOK_URL, ); export const TASK_ROOM_BRIDGE_TELEGRAM_BOT_TOKEN = readOptionalStringEnv( process.env.TASK_ROOM_BRID... |