面向 Sentry 的只读工具:项目列表、组织或项目范围的议题搜索、单个议题详情,以及最新或指定 event 的裁剪后堆栈。局部变量、请求头与请求体、查询字符串、依赖清单以及疑似机密的 tag 会在 event 交给模型前移除;超大 event 会依次降级源码上下文、面包屑与栈帧,而不是直接失败。
安装
# npm 包(预构建)
dsh plugin --profile web add dsh-sentry
# GitHub 源码(首次需按提示配置 allowBuilds 构建授权后重试)
dsh plugin --profile web add github:maxmilian/dsh-sentry
装任何插件都等于在你的机器上跑第三方代码,权限和你本人一样大——能读你的文件、用你的凭据、访问网络,工具审批管不到它。GitHub 来源的插件还会在安装时执行构建脚本——pnpm 默认拦截,所以安装可能停在 ERR_PNPM_GIT_DEP_PREPARE_NOT_ALLOWED 或 ERR_PNPM_IGNORED_BUILDS;dsh 会打印出需要添加的确切键名,把它加进该 profile 的 pnpm-workspace.yaml 的 allowBuilds 下,重跑一次即可装上。放行构建本身就是一次信任判断:请只安装可信来源,并尽量锁定 commit(github:owner/repo#sha)。
README
dsh-sentry 是一个免费、开源、只读的 DeepSeek Harness 插件,对接 Sentry Web API。
每个工具都是 HTTP GET;本插件不会 resolve、指派、归档,也不会以任何方式改变 Sentry 的状态。
它的主要价值不是代理 API,而是把响应裁剪到 agent 的 context 撑得住一份真实 stacktrace。
原始的 events/latest/ 响应动辄 200KB–2MB。本插件把它缩成真正有助于调试的 frame、源码行与
metadata,并在 meta.trimmed 告诉你它舍弃了什么。
工具
| 工具 | 用途 |
|---|---|
sentry_list_projects |
列出所配置组织下最多 100 个项目。 |
sentry_search_issues |
使用 Sentry search syntax 搜索 issue,可限定单个项目或搜索整个组织。 |
sentry_get_issue |
以数字 id 或 short id 读取单个 issue,不含 event 内容。 |
sentry_get_latest_event |
读取 issue 的最新 event,附裁剪后的 stacktrace。 |
sentry_get_event |
按 event id 读取项目内的单个 event,套用相同裁剪。 |
所有工具均为只读。v0.1 不会修改 issue、不会创建 release、也不会发送 event。
需求
- 具备兼容
@deepseek-ai/dsh-toolsAPI 的 DeepSeek Harness - Node.js 22.19 以上(22.x 线)或 Node.js 24 以上
- 从 GitHub 源码安装或本地开发时需要 Bun 1.3.5 以上
- 一组对目标组织具备读取权限的 Sentry User Auth Token(
sntryu_)
Token scope
| Scope | 开启的 endpoint |
|---|---|
org:read |
/organizations/{org}/projects/、/organizations/{org}/issues/、/organizations/{org}/shortids/{short_id}/ |
project:read |
/projects/{org}/{project}/issues/ |
event:read |
/issues/{id}/、/issues/{id}/events/latest/、/projects/{org}/{project}/events/{event_id}/ |
请使用 User Auth Token(sntryu_),scope 需含 event:read、org:read、project:read。最简单
又安全的做法是用 sentry auth login --read-only 生成 token,它恰好只请求 project:read、
org:read、event:read、member:read、team:read。
Organization Auth Token(sntrys_)不适用:Sentry 把它的 scope 固定为 org:ci(Source Map
Upload、Release Creation、Code Mappings),无法添加任何读取 scope,因此本插件的每一条读取路径都会
返回 HTTP 403。该结论已于 2026-08-27 对 sentry.io 实测确认,见
docs/live-verification.md。
配置
| 字段 | 环境变量 | 默认值 | 说明 |
|---|---|---|---|
baseUrl |
SENTRY_URL |
https://sentry.io/ |
站点根 URL。欧盟区请用 https://de.sentry.io/。结尾的 /api/0 会自动剥除。 |
token |
SENTRY_AUTH_TOKEN |
必填 | User auth token(sntryu_)。Organization auth token 只有 org:ci,会被返回 403。永不返回、永不写入日志。 |
org |
SENTRY_ORG |
必填 | 组织 slug,整个插件实例固定使用。 |
locale |
— | en |
en、zh-TW、zh-CN 或 ja,决定工具与参数描述的语言。 |
includeFrameVars |
SENTRY_INCLUDE_FRAME_VARS |
false |
是否保留 stacktrace 的局部变量。环境变量只有字符串 true 才会开启,agent 无法覆盖。 |
requestTimeoutMs |
— | 30000 |
单次工具调用的总超时,包含 short id 需要的额外一次请求。范围 1–300000。 |
maxResponseBytes |
— | 5242880 |
单次 HTTP 响应内容的硬上限。范围 1–52428800。 |
插件配置一律覆盖环境变量。
export SENTRY_AUTH_TOKEN='your-token'
export SENTRY_ORG='your-org'
# 仅自建或欧盟区需要:
export SENTRY_URL='https://sentry.example.com'
自建与区域
- 自建:
baseUrl指向站点根 URL 即可,含子路径安装(例如https://example.com/sentry/)。 - Sentry SaaS 欧盟区:
baseUrl必须是https://de.sentry.io/。用https://sentry.io/访问欧盟区组织 会表现为 401 或 404,因此这两种错误消息都会附上区域提示。 - 较旧的自建版本只是字段更少。本插件把所有响应字段都视为可选,绝不因缺字段而失败。两个已知的
行为差异:
sort=recommended可能被拒绝(报告为UNSUPPORTED_BY_INSTANCE),以及stats_period仅限24h与14d。
裁剪了什么
每个 event 都会无条件移除:
- Request 的 headers、cookies、环境变量与 body。Request URL 只保留 origin 与 path —— query string 整段丢弃,因为 OAuth callback 与签名 URL 的密钥都藏在那里。
- Stacktrace 的局部变量,除非开启
includeFrameVars。 mechanism.data、contexts.state、packages、modules与_meta。user.email、user.ip_address与user.username,只保留user.id。- Key 看起来像机密或直接 PII 的 tag(
token、secret、password、passwd、api_key、auth、cookie、session、credential、private/access key、JWT、DSN、signature、email、IP address、 username),以及所有sentry:前缀的内部 tag。 - 会泄漏构建路径的 frame 字段,例如
absPath。
会缩减而非整个移除:
- Frames。 Frame 由外而内排列。数量超过
max_frames时,本插件优先保留 in-app frame、必定纳入 最内层两个 frame,有空位时再从尾部往前补足,且绝不超过上限;输出保持原始顺序。 - 源码片段。 只保留最内层 3 个 in-app frame,每个至多 11 行,每行至多 200 字符。
- Chained exception。 至多保留最内层的 2 个
exception.values;max_frames对每个 stacktrace 各自套用。 - Breadcrumbs。 最后 20 条,消息至多 200 字符。
- 字符串。 Exception value 上限 2000 字符;title、message、culprit 上限 500 字符。
若裁剪后仍超过 200KB 的工具结果上限,本插件会按固定顺序降级 —— 先源码片段、再 breadcrumbs、
再把 frame 压到最多 10 个(不会提高调用端原本更低的上限);若管理员开启的 frame vars 仍使结果过大,最后会移除 vars。最后套用的层级会记录在
meta.trimmed.degraded。像 omittedFrames 这类计数一律是「原始总数减去你实际收到的数量」,不是逐级累加。
语言
工具与参数描述依 locale 切换。工具名称永远是英文、永不改变,因为那是 agent 的调用标识符。
错误消息同样一律英文:它们是稳定的诊断字符串,测试与审查都以它为比对基准。
安全性与错误行为
- 使用
Authorization: Bearer ...,永不返回或记录 token。 - 遵守 DSH 工具的
AbortSignal与单次调用的 deadline;short id 会多发一次 HTTP 请求,但共用同一个 deadline。 - 把 HTTP 401、403、404、429 与 5xx 转成安全的结构化错误,绝不夹带 response body。
- 一个刻意的例外: issue 搜索收到 HTTP 400 时,本插件最多读取 64KB 的 body,只取结构化的
detail或error字符串;若其中含有 token 或看起来像机密就整条丢弃,并截断至 200 字符后以Sentry said: ...附加。没有这一段,agent 面对 search syntax 错误只能盲猜。当 body 是 HTML、 无法解析或被过滤掉时,消息会退回静态版本 —— 所以INVALID_QUERY的消息有两种形状。 - v0.1 不支持关闭 TLS 验证或跳过自签证书。
限制(v0.1)
- 完全不做任何写入:没有 resolve、unresolve、归档、指派、合并、删除、创建 release,也不发送 event。
- 每个插件实例只服务单个组织;工具不接受组织参数。
- 不支持 Seer AI、Performance、Discover、Metrics、Dashboards、Replay、Trace 或 Span 相关 endpoint。
- 不支持 release、deploy 或 issue tag 分布查询。
stats_period仅限24h与14d,不支持自定义start/end区间。- 不做自动翻页。
sentry_search_issues只返回一页加上meta.nextCursor;sentry_list_projects完全不收 cursor 参数,改以meta.truncated报告。 - 不做本地缓存、不下载 attachment 或 source map、不提供未裁剪的直通模式。
开发
本项目使用 Bun 作为包管理器与 script runner;发布后的插件 runtime 以上述 Node.js 版本为准:
bun install --frozen-lockfile
bun run lint
bun run typecheck
bun run test --coverage
bun run build
bun pm pack
测试使用 Vitest 搭配 mock fetch,不需要真实的 Sentry 实例。lines、statements、functions、branches
四项覆盖率门槛都设在 80% 以上。
本版本尚未记录对 Sentry SaaS 与自建实例的实机兼容性验证。发布 v0.1.0 tag 前必须完成的检查清单放在
docs/live-verification.md;请针对你自己的实例执行:
bun run build
SENTRY_TOKEN=... SENTRY_ORG=... node scripts/live-verify.mjs
该脚本纯只读,缺少凭证时以 exit 1 结束。
许可
MIT
链接
同类插件
yjh051108/dsh-routing-suite★ 7014
一个仓库三件套:DSH 插件包的运行时注入器(注入、热重载、卸载、开发侧挂区一键转正、路由自愈,外带设置页插件管理:列出、卸载、拖入文件夹内化)、任务感知的思维模式路由 agent 预设(router-standard / router-spec / router-react)、以及分级两级任务协议(commit_star / lock_stage / revise_do / edit_plan / mark_task / redteam_verdict 六个工具,任务状态落盘)。注入器实现直接在库内,安装的是它自己的行为而不是一份依赖清单。
strukto-ai/mirage#dsh★ 3682
把文件系统与 bash 提供者换成 mirage 虚拟工作区:文件工具与 shell 命令作用于挂载的资源(RAM、S3、Redis、Slack、Gmail、Notion、Postgres)而非宿主磁盘,支持按挂载点设置读/写/执行模式、按命令选择沙箱(进程内 monty、pyodide、quickjs;远程 docker、e2b、daytona),并可在虚拟终端中安装 CLI(git、gh、slack、linear、ntn、gws,或自行注册的程序树)作为命令头词。
hust-open-atom-club/oh-dsh★ 322
社区发行版:TUI、桌面端与 Web UI 统一体验,分层安装、一步到位。
weijiafu14/pi2dsh★ 212
Pi Host ABI 兼容引擎:装一次之后,npm 上的 Pi 扩展原包经 `dsh plugin add <pi-package>` 直接作为 DSH 原生插件挂载。已在官方 DSH 上端到端验证 pi-mcp-adapter(完整 MCP 管理面:OAuth、resources、prompts、MCP Apps、elicitation、sampling)、@tintinweb/pi-subagents、pi-code、pi-hermes-memory、pi-background-tasks;`pi2dsh inspect` 在安装前报告一个包的兼容情况。
Fishquito7/dsh-skill-mcp-panel★ 193
在 DSH Web 设置中管理技能与 MCP 服务器:技能卡片热启停、工作区作用域、分组、批量迁移与拖拽导入,以及 stdio/HTTP MCP 增删改查、连接测试、密钥脱敏,并附带统一 dsh-panel 命令行。
lire1131/dsh-undo-savepoint★ 179
DSH 撤销/回退系统:配置变更自动存档,一键撤销/恢复/回退到任意版本,支持 WebUI 与离线 CLI/GUI 工具(DSH 启动失败也能救)。
社区评论
评论公开保存在 GitHub Discussions。加载评论会连接 GitHub 和 Giscus;发表内容需要 GitHub 账号。