SMMURDA/dsh-paean-telegram ↗★ 1

dsh-telegram

Native Telegram bridge for DeepSeek Harness (DSH), built for the Paean Harness distribution: chat with dsh agents and manage sessions, models, workspaces and goals from a phone. 适合需要通过手机Telegram远程聊天、管理会话和工作区的用户。

Package
dsh-telegram
Compatibility
Unverified
Harness peer range
>=0.1.1-rc.2 <0.3.0
Cordis peer range
^4.0.1
Version
0.4.0
License
MIT
Last updated
Oct 16, 2026

Other repositories with this package name

Install

$npx -p @deepseek-ai/dsh dsh plugin --profile web add github:SMMURDA/dsh-paean-telegram

4. create /.pi/telegram.json with your chat id (see Configuration)

Configuration

Configuration lives in /.pi/telegram.json (one file per workspace root). Every key is optional; missing keys fall back to the defaults below. The file is validated on load and can be changed live from the chat with /config get and /config set .

KeyTypeDefaultMeaning
security.allowedChatIdsnumber[][]Chat-id whitelist for inbound traffic. Empty means every inbound chat is rejected.
security.browseRootsstring[]absentOptional absolute-path whitelist confining host/workspace browsing (/ls, /mkdir, /open, workspace create). Absent = unconstrained.
security.selfAllowbooleanenabled (absent)Kill switch for the self-service bootstrap: the "Allow this chat" button on the unauthorized prompt. false makes that tap answer with the refusal text and never touch the roster.
watch.autoStartbooleanfalseStart long polling automatically when the plugin mounts.
inbound.defaultMode"auto-handle" | "queue-only" | "muted""auto-handle"How inbound chat text is treated before it reaches the agent.
inbound.rules{chatId?, pattern?, mode}[][]Ordered rules; the first match wins, otherwise inbound.defaultMode. pattern is a case-insensitive substring.
outbound.parseMode"HTML""HTML"Telegram parse mode for assistant output. Model Markdown is normalized to valid Telegram HTML first; cards are always HTML.
outbound.disableNotificationbooleanfalseSend silently.
outbound.maxRetriesnumber3Per-message retries on 429 / network errors.
outbound.sendRatePerSecondnumber20Global send budget (the Bot API safe bound is 30).
outbound.maxMessageLengthnumber4096Hard cap for one payload; longer text is split into parts.
outbound.liveFeedbooleantrueOne message edited in place while a turn streams (thinking + tool-call visibility). Can be toggled without a restart.
compact.thresholdnumber0.8Compact when the latest request uses more than this fraction of the context window.
compact.policy"auto" | "ask" | "never""ask"Compact automatically, ask first, or stay quiet.
compact.cooldownMsnumber300000Minimum interval between two triggers for one session.
workspace.activePathstringabsent (boot dir)Active project folder; new sessions are created under it. Set it from the chat with /project.
mode.namestring""Optional display label for the status card.
model.provider / model.modelstringprofile defaultTelegram-owned default model, so the bot can run a different model than the web keeps.
reasoning.effort"minimal" | "low" | "medium" | "high" | "max"mediumPer-chat reasoning effort; a directive is prepended to inbound messages.
media.transcribe.baseUrlstringprovider defaultOpenAI-compatible transcription endpoint for voice notes.
media.transcribe.apiKeystringabsentMissing key = transcription disabled, with guidance instead of a silent drop.
media.transcribe.modelstringpackage defaultTranscription model name.
interactive.userQuestions"both" | "telegram" | "web" | "auto""both"Which UI owns ask_user_question and approval cards. both mirrors them to Telegram and the web; whichever side answers first settles the other.
interactive.allowByToolstring[][]Tool names permanently auto-allowed after "Allow forever (by tool)". Revoke with /config set interactive.allowByTool [].
notify.onCompletebooleantrueSend a fresh receipt (with sound) when a goal turn finishes.
notify.onLongTaskbooleantrueEdit the progress card every 30 s so elapsed time keeps moving.

Minimal working file:

{
  "security": { "allowedChatIds": [123456789] },
  "watch": { "autoStart": true }
}