[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M7D9RN7GJCJR5QA2ZCE4MPTH":3,"skill-same:01M7D9RN7GJCJR5QA2ZCE4MPTH":53},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":18,"publishedAt":19,"linkOnly":20,"markdownContent":21,"markdownBody":22,"frontMatter":23,"refName":26,"commitSha":27,"skillDirectory":28,"forksCount":14,"repositoryHtmlUrl":29,"repositoryHomepageUrl":6,"ownerHtmlUrl":30,"ownerBlogUrl":31,"ownerDescription":6,"updatedAt":32,"install":33,"resources":46},"01M7D9RN7GJCJR5QA2ZCE4MPTH","telegram-bot",null,"Send messages, photos and files to Telegram through the user's own bot, using a bot token held by the DIME credential proxy. Covers finding the chats the bot can reach, posting to a private chat, group or channel, editing and deleting what it sent, and sending from a data feed. Use for ANY request to message, notify or alert the user on Telegram, \"send this to my Telegram\", \"post alerts to my channel\", or a 403 from the credential proxy on api.telegram.org.","tradeparadigm\u002Fdt-apps","tradeparadigm","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F72768132?v=4","01M7D9KY0PDJW6NWY8P936YNEX","Paradigm","01M7D9KY1BYPTKX9MGQHZKW4BP",0,"MIT","https:\u002F\u002Fgithub.com\u002Ftradeparadigm\u002Fdt-apps\u002Fblob\u002Fmain\u002Fapps\u002Ftelegram\u002Fskills\u002Ftelegram-bot\u002FSKILL.md",[],[],"2026-11-15 14:19:17",false,"---\nname: telegram-bot\ndescription: >\n  Send messages, photos and files to Telegram through the user's own bot, using\n  a bot token held by the DIME credential proxy. Covers finding the chats the\n  bot can reach, posting to a private chat, group or channel, editing and\n  deleting what it sent, and sending from a data feed. Use for ANY request to\n  message, notify or alert the user on Telegram, \"send this to my Telegram\",\n  \"post alerts to my channel\", or a 403 from the credential proxy on\n  api.telegram.org.\nmetadata:\n  author: tradeparadigm\n---\n\n# Telegram\n\nYour `AGENTS.md` already explains the placeholder mechanism in general. This\nfile covers only what is specific to Telegram.\n\n## What you hold\n\nOne bot token, as `CRED_TELEGRAM_API_BOT`. The name depends on what the user\npicked at enrolment, and the script takes any `CRED_TELEGRAM…` variable.\n\nThe token belongs in the URL path, `https:\u002F\u002Fapi.telegram.org\u002Fbot\u003Ctoken>\u002F\u003Cmethod>`.\nUse the script beside this file. It puts the placeholder there for you.\n\nOnly one bot works at a time. A second Telegram credential makes every\nrequest from both fail. If `env | grep '^CRED_TELEGRAM'` lists two, tell the\nuser to revoke one in Settings → Credentials.\n\n## Finding a chat\n\nA bot cannot start a conversation. The user has to reach it first:\n\n- **A private chat:** the user opens their bot in Telegram and sends it any message.\n- **A group:** the user adds the bot to the group and sends a message there.\n- **A channel:** the user adds the bot as an administrator with permission to post.\n\nThen:\n\n```sh\nnode scripts\u002Ftelegram.mjs me      # the bot's @username, to tell the user who to message\nnode scripts\u002Ftelegram.mjs chats   # every chat that has reached the bot recently\n```\n\n`chats` reads Telegram's pending updates, which it keeps for 24 hours. If the\nchat is not listed, ask the user to send the bot another message. A public\nchannel also works by its `@name` as the chat id.\n\nWrite the chat id down where you will find it again, such as the data feed's\nconfig. Ask the user which chat to use when there is more than one.\n\n## Sending\n\n```sh\nnode scripts\u002Ftelegram.mjs send --chat 123456789 --text \"BTC crossed 100k\"\necho \"multi-line text\" | node scripts\u002Ftelegram.mjs send --chat -1001234567890\nnode scripts\u002Ftelegram.mjs send --chat @mychannel --html --text \"\u003Cb>Fill\u003C\u002Fb> 2 BTC @ 99,950\"\nnode scripts\u002Ftelegram.mjs photo --chat 123456789 --file chart.png --caption \"BTC 1h\"\nnode scripts\u002Ftelegram.mjs document --chat 123456789 --file report.csv\n```\n\nGive the script's absolute path when you run it from another directory. Each\ncommand prints Telegram's answer as JSON: `send` prints the message ids, and\n`edit` and `delete` take one with `--message`.\n\n- Text is plain unless you pass `--html`. With `--html`, escape `\u003C`, `>` and `&`\n  in anything you did not write, or Telegram refuses the message.\n- `--silent` delivers without a notification sound.\n- Plain text over 4096 characters is split into several messages, at a line\n  break where there is one. `--html` text over 4096 characters is refused:\n  split it yourself, keeping each tag inside one message.\n\n## From a data feed\n\nThe folder holding this file is replaced when the app updates, so copy the\nscript into the data feed's own directory:\n\n```sh\ncp \u003Cthis folder>\u002Fscripts\u002Ftelegram.mjs ~\u002F.openclaw\u002Fworkspace\u002Fdatafeeds\u002F\u003Cname>\u002F\n```\n\nThen import it in `datafeed.mjs` and call `sendMessage`:\n\n```js\nimport { sendMessage } from '.\u002Ftelegram.mjs';\n\nawait sendMessage(chatId, text, { cred: config.telegramCred });\n```\n\nStore the placeholder's value in the data feed's config as `telegramCred`\nwhen you write it. A data feed may not have `CRED_` variables in its\nenvironment. The placeholder is not a secret, so a config file is a fine place\nfor it. Without `cred`, the script reads `CRED_TELEGRAM…` from the environment.\n\nTelegram allows about one message a second per chat and 20 a minute per group.\nBatch lines into one message rather than sending one per event. A 429 error\ncarries `retryAfter` in seconds. Wait that long before the next send.\n\n## When a call fails\n\n| What you see | Causes, cheapest to check first |\n|---|---|\n| 403 from the proxy, body says `placeholder_absent` | You called api.telegram.org without the script, or without the placeholder in the path. Or two Telegram credentials are enrolled. |\n| `401 Unauthorized` | The token was revoked in BotFather, or enrolled with a typo. Ask the user to enrol it again. |\n| `404 Not Found` | A method the credential does not cover. The script sends only the ones listed above. |\n| `400 Bad Request: chat not found` | The user has not messaged the bot, or the bot is not in that group or channel. |\n| `403 Forbidden: bot was blocked by the user` | The user blocked the bot. Only they can unblock it. |\n| `403 Forbidden: bot is not a member of the channel chat` | Add the bot to the channel as an administrator with permission to post. |\n| `400 Bad Request: can't parse entities` | `--html` text with an unescaped `\u003C`, `>` or `&`. |\n| `409 Conflict` from `chats` | Something else reads the bot's updates, such as a webhook. Ask the user for the chat id, or `@name` for a public channel. |\n| `several Telegram credentials` from the script | Two are enrolled. Ask the user to revoke one. |\n\n## Never edit the script\n\nA publish replaces it. If it does not work, change the smallest thing that\nmakes your command run, run it, and tell the user in one line what you\nchanged, so it can be fixed here.\n","# Telegram\n\nYour `AGENTS.md` already explains the placeholder mechanism in general. This\nfile covers only what is specific to Telegram.\n\n## What you hold\n\nOne bot token, as `CRED_TELEGRAM_API_BOT`. The name depends on what the user\npicked at enrolment, and the script takes any `CRED_TELEGRAM…` variable.\n\nThe token belongs in the URL path, `https:\u002F\u002Fapi.telegram.org\u002Fbot\u003Ctoken>\u002F\u003Cmethod>`.\nUse the script beside this file. It puts the placeholder there for you.\n\nOnly one bot works at a time. A second Telegram credential makes every\nrequest from both fail. If `env | grep '^CRED_TELEGRAM'` lists two, tell the\nuser to revoke one in Settings → Credentials.\n\n## Finding a chat\n\nA bot cannot start a conversation. The user has to reach it first:\n\n- **A private chat:** the user opens their bot in Telegram and sends it any message.\n- **A group:** the user adds the bot to the group and sends a message there.\n- **A channel:** the user adds the bot as an administrator with permission to post.\n\nThen:\n\n```sh\nnode scripts\u002Ftelegram.mjs me      # the bot's @username, to tell the user who to message\nnode scripts\u002Ftelegram.mjs chats   # every chat that has reached the bot recently\n```\n\n`chats` reads Telegram's pending updates, which it keeps for 24 hours. If the\nchat is not listed, ask the user to send the bot another message. A public\nchannel also works by its `@name` as the chat id.\n\nWrite the chat id down where you will find it again, such as the data feed's\nconfig. Ask the user which chat to use when there is more than one.\n\n## Sending\n\n```sh\nnode scripts\u002Ftelegram.mjs send --chat 123456789 --text \"BTC crossed 100k\"\necho \"multi-line text\" | node scripts\u002Ftelegram.mjs send --chat -1001234567890\nnode scripts\u002Ftelegram.mjs send --chat @mychannel --html --text \"\u003Cb>Fill\u003C\u002Fb> 2 BTC @ 99,950\"\nnode scripts\u002Ftelegram.mjs photo --chat 123456789 --file chart.png --caption \"BTC 1h\"\nnode scripts\u002Ftelegram.mjs document --chat 123456789 --file report.csv\n```\n\nGive the script's absolute path when you run it from another directory. Each\ncommand prints Telegram's answer as JSON: `send` prints the message ids, and\n`edit` and `delete` take one with `--message`.\n\n- Text is plain unless you pass `--html`. With `--html`, escape `\u003C`, `>` and `&`\n  in anything you did not write, or Telegram refuses the message.\n- `--silent` delivers without a notification sound.\n- Plain text over 4096 characters is split into several messages, at a line\n  break where there is one. `--html` text over 4096 characters is refused:\n  split it yourself, keeping each tag inside one message.\n\n## From a data feed\n\nThe folder holding this file is replaced when the app updates, so copy the\nscript into the data feed's own directory:\n\n```sh\ncp \u003Cthis folder>\u002Fscripts\u002Ftelegram.mjs ~\u002F.openclaw\u002Fworkspace\u002Fdatafeeds\u002F\u003Cname>\u002F\n```\n\nThen import it in `datafeed.mjs` and call `sendMessage`:\n\n```js\nimport { sendMessage } from '.\u002Ftelegram.mjs';\n\nawait sendMessage(chatId, text, { cred: config.telegramCred });\n```\n\nStore the placeholder's value in the data feed's config as `telegramCred`\nwhen you write it. A data feed may not have `CRED_` variables in its\nenvironment. The placeholder is not a secret, so a config file is a fine place\nfor it. Without `cred`, the script reads `CRED_TELEGRAM…` from the environment.\n\nTelegram allows about one message a second per chat and 20 a minute per group.\nBatch lines into one message rather than sending one per event. A 429 error\ncarries `retryAfter` in seconds. Wait that long before the next send.\n\n## When a call fails\n\n| What you see | Causes, cheapest to check first |\n|---|---|\n| 403 from the proxy, body says `placeholder_absent` | You called api.telegram.org without the script, or without the placeholder in the path. Or two Telegram credentials are enrolled. |\n| `401 Unauthorized` | The token was revoked in BotFather, or enrolled with a typo. Ask the user to enrol it again. |\n| `404 Not Found` | A method the credential does not cover. The script sends only the ones listed above. |\n| `400 Bad Request: chat not found` | The user has not messaged the bot, or the bot is not in that group or channel. |\n| `403 Forbidden: bot was blocked by the user` | The user blocked the bot. Only they can unblock it. |\n| `403 Forbidden: bot is not a member of the channel chat` | Add the bot to the channel as an administrator with permission to post. |\n| `400 Bad Request: can't parse entities` | `--html` text with an unescaped `\u003C`, `>` or `&`. |\n| `409 Conflict` from `chats` | Something else reads the bot's updates, such as a webhook. Ask the user for the chat id, or `@name` for a public channel. |\n| `several Telegram credentials` from the script | Two are enrolled. Ask the user to revoke one. |\n\n## Never edit the script\n\nA publish replaces it. If it does not work, change the smallest thing that\nmakes your command run, run it, and tell the user in one line what you\nchanged, so it can be fixed here.\n",{"name":5,"metadata":24,"description":25},{"author":9},"Send messages, photos and files to Telegram through the user's own bot, using a bot token held by the DIME credential proxy. Covers finding the chats the bot can reach, posting to a private chat, group or channel, editing and deleting what it sent, and sending from a data feed. Use for ANY request to message, notify or alert the user on Telegram, \"send this to my Telegram\", \"post alerts to my channel\", or a 403 from the credential proxy on api.telegram.org.\n","main","4befefc366f86a32c20711cf3798aaf13df1cd59","apps\u002Ftelegram\u002Fskills\u002Ftelegram-bot","https:\u002F\u002Fgithub.com\u002Ftradeparadigm\u002Fdt-apps","https:\u002F\u002Fgithub.com\u002Ftradeparadigm","https:\u002F\u002Fparadigm.co\u002F","2026-11-13 17:14:22",{"source":8,"skillName":5,"commands":34,"prompt":44,"zipAvailable":45},[35,38,41],{"tool":36,"command":37},"npx","npx skills add tradeparadigm\u002Fdt-apps --skill telegram-bot",{"tool":39,"command":40},"bunx","bunx skills add tradeparadigm\u002Fdt-apps --skill telegram-bot",{"tool":42,"command":43},"pnpm","pnpm dlx skills add tradeparadigm\u002Fdt-apps --skill telegram-bot","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Ftradeparadigm\u002Fdt-apps\u002Fblob\u002Fmain\u002Fapps\u002Ftelegram\u002Fskills\u002Ftelegram-bot\u002FSKILL.md",true,[47],{"path":48,"resourceType":49,"resourceTypeDesc":50,"sizeBytes":51,"sourceHtmlUrl":52},"scripts\u002Ftelegram.mjs","SCRIPT","脚本",6925,"https:\u002F\u002Fgithub.com\u002Ftradeparadigm\u002Fdt-apps\u002Fblob\u002Fmain\u002Fapps\u002Ftelegram\u002Fskills\u002Ftelegram-bot\u002Fscripts\u002Ftelegram.mjs",[54,61,68,75,82,89],{"skillNo":55,"name":56,"nameZh":6,"description":57,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":58,"categories":59,"keywords":60,"publishedAt":19},"01M7D9RW0ZFXNH3MCGZE2B9WHY","example-api","A skill body that exists so the fixture is a complete app. It teaches nothing and is never published.","https:\u002F\u002Fgithub.com\u002Ftradeparadigm\u002Fdt-apps\u002Fblob\u002Fmain\u002Fscripts\u002Ftestdata\u002Fapps\u002Fexample\u002Fskills\u002Fexample-api\u002FSKILL.md",[],[],{"skillNo":62,"name":63,"nameZh":6,"description":64,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":65,"categories":66,"keywords":67,"publishedAt":19},"01M7D9R7K7RPTJ4T7DZRHXD156","paradigm-rfq-trader","Trigger institutional block trades via Paradigm's DRFQv2 flow. The workflow is venue-agnostic — resolve instruments, build the RFQ \u002F order payload, benchmark, run a confirmation gate, submit, verify settlement. Per-venue specifics (fair-value sources, naming conventions, edge syntax, settlement checks) live in references\u002Fvenues.md. In scope today: PRDX (Paradex, primary focus) and DBT (Deribit). Adding more DRFQv2 venues is a references\u002Fvenues.md edit, not a skill-body change. Covers takers (build, benchmark, cross) and makers (poll, price, manage). Every state-changing action goes through an explicit confirmation gate. Needs both Paradigm credentials enrolled. Use when the user asks to \"send a Paradigm block RFQ\", \"block-trade X BTC\", \"send a BTC straddle on Paradex \u002F Deribit\", \"quote rfq_X\", \"hit the best bid\", \"cancel rfq_X\". Does NOT cover pricing a structure without trading (its legs' current marks are paradigm-data-discovery's), small central-order-book trades, post-trade analysis (paradigm-block-analyst), historical tape (paradigm-data-discovery).","https:\u002F\u002Fgithub.com\u002Ftradeparadigm\u002Fdt-apps\u002Fblob\u002Fmain\u002Fapps\u002Fparadigm\u002Fskills\u002Fparadigm-rfq-trader\u002FSKILL.md",[],[],{"skillNo":69,"name":70,"nameZh":6,"description":71,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":72,"categories":73,"keywords":74,"publishedAt":19},"01M7D9QV6WFQDW717AXTW7GJKE","paradigm-options-recap","Options market recap for a requested or default window, invoked via \u002Frecap. Parses \"\u002Frecap [asset] [options] [window]\" (e.g. \"\u002Frecap btc options 8h\") and builds the fixed four-section recap — Snapshot, Biggest Print, Block Flow, Vol Surface — from bounded raw exchange venue files and source tapes, never from Dime hot files, read with the pod's AWS access. Use when the user types \u002Frecap or asks for a market recap, an options flow summary, \"what happened in BTC options\" or \"last Xh of flow\". A single question is not a recap: the biggest print across venues is paradigm-data-discovery's (paradigm-api reads only Paradigm's own tape), and the vol surface, one IV or one venue's data is paradigm-data-discovery's, as are dataset inventory, schema and historical lookups. The output format is fixed — always the same four sections in the same order.","https:\u002F\u002Fgithub.com\u002Ftradeparadigm\u002Fdt-apps\u002Fblob\u002Fmain\u002Fapps\u002Fparadigm\u002Fskills\u002Fparadigm-options-recap\u002FSKILL.md",[],[],{"skillNo":76,"name":77,"nameZh":6,"description":78,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":79,"categories":80,"keywords":81,"publishedAt":19},"01M7D9QJYMTHRTDVJFW3AC0HDN","paradigm-data-discovery","Catalog and query launcher for raw market data available to Dime in s3:\u002F\u002Fdt-exchange-venue-data, s3:\u002F\u002Fdt-paradigm-data, and s3:\u002F\u002Fdt-paradex-data, read with the pod's AWS access. Use for data inventory, coverage, schema and historical analysis, for current venue market data (marks, IV, greeks, OI, funding, spot) on Deribit, OKX, Bybit and Bullish, and for recent block trades when the user has no Paradigm credentials enrolled (with them, paradigm-api reads the live tape). Explains the per-venue raw files and lets the model choose the bounded reads needed for the question. Does not cover account state, positions, vaults, or order placement.","https:\u002F\u002Fgithub.com\u002Ftradeparadigm\u002Fdt-apps\u002Fblob\u002Fmain\u002Fapps\u002Fparadigm\u002Fskills\u002Fparadigm-data-discovery\u002FSKILL.md",[],[],{"skillNo":83,"name":84,"nameZh":6,"description":85,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":86,"categories":87,"keywords":88,"publishedAt":19},"01M7D9Q3F60BDBMC8PEGH1VBZG","paradigm-block-analyst","Cross-venue analysis of Paradigm RFQ block trades using live market data from Deribit, OKX, and Bybit. Invoked as `\u002Fanalyze \u003Crfq_id> \u003Crfq description>`: resolves the rfq_id by searching the Paradigm trade tape via the paradigm-data-discovery skill (the daily execution partitions, keyed by RFQ_ID) for the cleared-block record, then fetches live marks, IVs, and greeks per venue, computes net greeks for multi-leg structures, benchmarks the fill vs mark, reports how much of the structure traded over 24h \u002F 7d \u002F 30d and where else it printed, reads whether the flow moved the vol surface, and outputs a concise analysis. Use when the user runs `\u002Fanalyze \u003Crfq_id> ...`, pastes a Paradigm block trade JSON, or asks to analyze, benchmark, or get market color on a Paradigm RFQ execution. Covers outright calls\u002Fputs (CL\u002FPL), strangles (SN), straddles (ST), butterflies (BF), condors (CO), calendars (CA), risk reversals (RR), covered calls, and custom multi-leg combos (CM). Also handles perp combos. Reads the Paradigm trade tape from S3 with the pod's AWS access.","https:\u002F\u002Fgithub.com\u002Ftradeparadigm\u002Fdt-apps\u002Fblob\u002Fmain\u002Fapps\u002Fparadigm\u002Fskills\u002Fparadigm-block-analyst\u002FSKILL.md",[],[],{"skillNo":90,"name":91,"nameZh":6,"description":92,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":93,"categories":94,"keywords":95,"publishedAt":19},"01M7D9PS3VV102T7AB08AJWSGY","paradigm-api","Paradigm's DRFQv2 RFQ API: recent block trades on the public block tape (`paradigm__paradigm_drfqv2_trades` with `mode: \"tape\"`), verifying the credentials, instruments, counterparties, listing and creating RFQs, quotes and crosses, cancels, your trades, leg pricing and the maker circuit-breaker. The tools are `paradigm__*` MCP tools, called by exact name, and need the user's Paradigm credentials enrolled. Use for ANY request to Paradigm's REST API, including \"recent block trades\", \"is my Paradigm key working\", \"list my Paradigm RFQs\" or \"cancel rfq_...\". The tape here is the latest prints only: volumes over time, comparisons across days and whether a structure traded before are paradigm-data-discovery's, and so is the block tape without credentials. The RFQ workflow and its confirmation gate are paradigm-rfq-trader.","https:\u002F\u002Fgithub.com\u002Ftradeparadigm\u002Fdt-apps\u002Fblob\u002Fmain\u002Fapps\u002Fparadigm\u002Fskills\u002Fparadigm-api\u002FSKILL.md",[],[]]