# @blue/dsh-telegram-bot [English](README.md) · [简体中文](README.zh-CN.md) A minimal single-purpose [DeepSeek Harness](https://github.com/deepseek-ai/deepseek-harness) (dsh) plugin: connect a **Telegram bot** to your dsh agent via **long polling** — no public endpoint needed. Inspired by [dsh-im-hub](https://github.com/ThreeBody6666/dsh-im-hub), but reduced to Telegram only: one adapter, no web settings card, no HTTP webhook surface. - One agent per chat (`telegram:`), multi-turn context retained. - **Agent-preset mounting**: set `agent.preset` and the bot's sessions mount that preset, getting the same tools (bash, fs, ssh, ...) as a Web GUI session. - Whitelist access control (`allowedUserIds`). - Slack-style commands: `/help` `/reset` `/status` `/model`. - Long replies split at Telegram's 4096-char limit. - Idle chats disposed after `agent.idleTimeoutMs`. ## Install ```bash dsh plugin --profile web add @blue/dsh-telegram-bot ``` The row is **disabled by default**. Enable it from the profile's `cordis.patch.yml`: ```yaml - id: dsh-telegram-bot disabled: false config: telegram: token: '123456:ABC-DEF...' # from @BotFather allowedUserIds: [6354114195] # your numeric Telegram user id agent: preset: standard # mount the standard preset for full tools ``` Then restart the profile (`dsh web`). ## Configuration | Key | Default | Description | | :--- | :--- | :--- | | `enabled` | `true` | Master switch. | | `telegram.token` | `''` | Bot token from [@BotFather](https://t.me/BotFather). | | `telegram.allowedUserIds` | `[]` | Numeric user ids allowed to talk to the bot; empty = everyone. **Set it in production.** | | `telegram.timeoutSeconds` | `50` | getUpdates long-poll timeout. | | `telegram.pollIntervalMs` | `500` | Gap after a poll timeout/error. | | `agent.cwd` | `''` | Working directory for agent sessions (defaults to dsh's cwd). | | `agent.provider` / `agent.model` | `''` | Override model; empty = deployment default. | | `agent.preset` | `''` | Agent preset id to mount for bot sessions ('' = deployment default). | | `agent.maxMessageLength` | `4000` | Max chars per outbound message. | | `agent.idleTimeoutMs` | `1800000` | Idle time before a chat's agent is disposed (0 = never). | | `agent.instructionPrefix` | `''` | Prefix prepended to every user message. | ## Commands | Command | Effect | | :--- | :--- | | `/help` | Show command help. | | `/reset` | Clear this chat's context (fresh agent). | | `/status` | Show active chats / agents. | | `/model` | Show the current model selection. | ## Security - **Force a whitelist.** An empty `allowedUserIds` means anyone with the token can drive your agent — which can execute tools on the host. - The token lives in the profile's `cordis.patch.yml`; keep that file private (or reference an environment variable via `!!js process.env.TG_BOT_TOKEN`). ## License MIT