oh-my-openagent 匿名遥测与隐私机制全解析:采集边界、PostHog 上报管线与 Opt-out 配置指南
【免费下载链接】oh-my-openagentOmO: Just type "mass ulw" keyword with your prompt. Now you are the master of graph engineering.项目地址: https://gitcode.com/gh_mirrors/oh/oh-my-openagent
本文以 oh-my-openagent / oh-my-opencode 官方隐私政策(docs/legal/privacy-policy.md)为骨架,结合仓库内packages/telemetry-core与packages/omo-config-core的真实源码实现,系统讲解该项目的匿名遥测体系:采集了哪些事件、哪些数据被刻意排除、遥测如何经过 PostHog 上报,以及如何通过环境变量和配置文件彻底关闭遥测。读完本文,你将能完整掌握该项目的隐私边界与全部退出(opt-out)开关,并理解其底层调用链与去重机制。
1. 适用范围与角色定义
隐私政策首先明确了术语边界,避免歧义:
- Application(应用):指已发布的
oh-my-opencodeCLI 包及其安装的 OpenCode 插件运行时; - Service(服务):指 Application 与项目分发渠道(npm、GitHub 仓库等)的合称;
- We / our:指 oh-my-opencode 的维护者;
- You:指服务的使用者。
使用该服务即表示你接受本隐私政策及其配套的服务条款(docs/legal/terms-of-service.md)。政策最后更新于 2026 年 8 月 21 日。
2. 采集的信息:两类数据与明确的"不采集清单"
政策将采集内容严格划分为两类,并在源码层面得到印证。
2.1 自动采集的匿名事件
当匿名遥测启用时,Application 可能采集以下事件:
| 事件 | 触发时机 | 用途 |
|---|---|---|
omo_daily_active | 插件加载(reason: "plugin_loaded")或runCLI 被调用(reason: "run_started"),每台机器每个 UTC 日最多一次 | 估算日活 / 周活 / 月活安装量 |
omo_codex_daily_active | omo-codex适配器安装完成(reason: "install_completed"),或其 Codex 插件运行时在SessionStart钩子上触发(reason: "session_start"),与omo_daily_active相同的退出姿态 | 估算 omo-codex 活跃安装 |
| OmO Native 事件族(omo-senpi 适配器) | 会话开始、提示词分类桶、单轮 token 与成本汇总、技能与功能使用、并行度汇总、逐委托聚合指标、类别配置快照等 | 匿名产品分析,完整 schema 见 docs/reference/senpi-telemetry.md |
| 逐委托(per-delegation)聚合指标 | 子代理任务结束:终端状态、掩码后的类别与模型标识、时长、token 与成本汇总、后续消息数 | 理解委托执行概况 |
上述载荷只包含布尔值、计数器、分桶值和白名单枚举,例如prompt_submitted事件的prompt_length_bucket(lt_100/100_500/500_2000/gte_2000)与memory_bucket(lt_8_gb/8_15_gb/ …)——这些枚举值在 senpi-telemetry.md 中以机器生成的方式完整公布,且仓库中存在 schema 漂移测试,确保文档与生成器永远一致。
2.2 随事件携带的匿名元数据
- 包版本、插件名、运行时、OS 系列、locale、时区(IANA 时区名,随会话开始事件发送);
- 一个伪匿名安装标识:由本地主机名的单向哈希派生而来(具体实现见第 4.3 节);
- 一个近似国家:由 PostHog 服务端根据连接 IP 推导。Application 从不把 IP 地址写入任何事件载荷,自身也不存储 IP;VPN、代理、移动网络、共享机器或流量从其他地区出口时,该近似国家可能不准确。
2.3 明确不采集的数据
政策明文规定:遥测路径不会创建或更新 PostHog 用户画像(person profile),也不会采集:
- 提示词内容(prompt contents)
- 源文件与仓库内容
- 访问令牌与 API 密钥
- 原始主机名
- 运行时错误诊断信息
- 任务名称、提示词、响应、错误消息、文件路径(逐委托指标层面)
3. 配置与本地状态
Application 会在本机存储本地配置与遥测去重状态,用于支持安装、配置与匿名日活追踪。这部分状态由packages/telemetry-core的activity-state.ts管理:状态文件名为posthog-activity.json(见 activity-state.ts),记录lastActiveDayUTC字段,位于基于 XDG 约定解析的缓存目录中。该文件仅在本机保留,删除即重置日活去重状态。
4. 遥测如何工作:源码级剖析
政策指出遥测通过PostHog进行匿名产品分析,默认启用(与 cmux 相同的 opt-out 姿态),其目的仅为估算活跃安装量。下面从源码还原完整管线。
4.1 核心模块结构
遥测逻辑集中在 packages/telemetry-core/src 下,职责划分清晰:
| 文件 | 职责 |
|---|---|
| record-daily-active.ts | 日活事件上报入口,串联客户端创建、去重判断、上报与关闭 |
| activity-state.ts | 本地日活去重状态读写(posthog-activity.json) |
| env.ts | 环境变量解析与 opt-out 判定(shouldDisableTelemetry) |
| constants.ts | 默认 PostHog Host、默认 API Key 与"未配置占位 Key" |
| posthog-client.ts | 创建 PostHog 客户端、注入共享属性、发送事件 |
| machine-id.ts | 从主机名生成伪匿名安装标识 |
4.2 调用链:recordDailyActive
recordDailyActive(record-daily-active.ts)是日活上报的核心入口,调用链如下:
- 先调用
isTelemetryClientEnabled检查开关与 API Key 是否有效,无效则直接返回(连客户端都不创建); - 创建 PostHog 客户端;若创建失败(如初始化异常)返回空操作客户端;
- 读取本地
posthog-activity.json计算当日是否已上报; - 若当日已上报则关闭客户端直接返回;
- 否则
trackActive上报事件(携带day_utc、distinctId、reason),随后flush并shutdown。
4.3 伪匿名标识:主机名单向哈希
getTelemetryDistinctId 的实现是sha256(machineIdPrefix + hostname)的十六进制摘要——原始主机名不会离开机器,外部仅能看到不可逆的哈希值,这正对应政策中"由本地主机名单向哈希派生的伪匿名安装标识"的描述。
4.4 PostHog 客户端配置细节
createTransport 展示了客户端的安全配置倾向:
enableExceptionAutocapture: false、enableLocalEvaluation: false、disableRemoteConfig: true——关闭异常自动采集与远程配置拉取,杜绝意外数据外泄;flushAt: 1、flushInterval: 0——事件即时刷出,不批量滞留本地;$process_person_profile: false(posthog-client.ts)——明确不创建用户画像,与政策承诺一致;- 默认 Host 为
https://us.i.posthog.com(见 constants.ts),API Key 可通过POSTHOG_HOST/POSTHOG_API_KEY环境变量覆盖;内置一个值为phc_REPLACE_ME_OMO_NATIVE的"未配置占位 Key",该值被刻意设计为必须 fail closed(未配置即禁用)。
共享属性(getSharedProperties)包括平台、包名与版本、运行时、OS 版本/架构、CPU 数量与型号、内存分桶(GB)、locale、时区(Intl.DateTimeFormat().resolvedOptions().timeZone)、shell、是否 CI、终端程序等——注意 CPU 型号与内存仅以计数 / 取整 GB 形式出现,并包在 try/catch 中以应对读取失败。
4.5 每日去重机制
getDailyActiveCaptureState 用toISOString().slice(0, 10)得到当日 UTC 日期字符串,与本地状态中的lastActiveDayUTC比较:相同则不再上报,不同则先原子写入新日期再上报。这正是"每台机器每个 UTC 日最多一次"承诺的实现基础。
5. 完整的 Opt-out 退出矩阵
政策给出两类退出方式,均可在任何时间生效。
5.1 环境变量(推荐,全局生效)
在运行 CLI 或插件宿主之前设置任一全局开关即可彻底关闭遥测:
export OMO_SEND_ANONYMOUS_TELEMETRY=0 # 或 export OMO_DISABLE_POSTHOG=15.2 omo-codex 专属开关
export OMO_CODEX_DISABLE_POSTHOG=1 export OMO_CODEX_SEND_ANONYMOUS_TELEMETRY=0OMO_CODEX_DISABLE_POSTHOG与OMO_CODEX_SEND_ANONYMOUS_TELEMETRY仅抑制omo-codex的遥测;而全局开关OMO_DISABLE_POSTHOG/OMO_SEND_ANONYMOUS_TELEMETRY同时抑制 oh-my-openagent/oh-my-opencode 与 omo-codex 两边的遥测。关闭后 PostHog 事件不再发送。
5.3 开关的源码语义
env.ts 中的shouldDisableTelemetry精确实现了上述语义:
*_DISABLE_POSTHOG的"真值"为1/true/yes(先 trim 再小写归一化);*_SEND_ANONYMOUS_TELEMETRY的"退出值"为0/false/no(以及归一化后的yes,保持收敛一致);- 前缀集合取
OMO(全局前缀)与产品专属前缀(如OMO_CODEX)的并集,因此全局开关天然覆盖 codex; - 额外的
DO_NOT_TRACK=1也是一个全局退出开关,对 omo-opencode、omo-codex、omo-senpi 一律生效。
这一矩阵被 env.test.ts 以OPT_OUT_CASES表驱动用例逐条锁定:包括OMO_CODEX_SEND_ANONYMOUS_TELEMETRY: " TRUE "(带空格大写)与"maybe"(无效值,不退出)等边界情况,防止后续回归。
5.4 配置文件方式
对于 OpenCode 插件,还可以在 oh-my-openagent 配置中设置"telemetry": false关闭遥测。对应地,packages/omo-config-core/src/schema/telemetry.ts 中的telemetry.enabled为布尔值且默认true,并明确telemetry.enabled属于 senpi harness 支持项(TELEMETRY_HARNESS_SUPPORT)。
6. 第三方服务
服务可能使用以下第三方提供方,各自适用其独立的条款与隐私实践:
- PostHog:匿名产品分析;
- npm 与 GitHub:包分发、发布与仓库托管;
- OpenCode 及你自行配置的模型提供方:用于你自己的代理使用,其数据流向由你的配置决定,与本遥测路径无关。
7. 信息用途、保留与你的选择
收集的信息仅用于三类目的:
- 估算日活 / 周活 / 月活安装量;
- 了解跨操作系统与包版本的总体采纳情况;
- 维护与演进服务。
政策明确声明:不会通过该遥测路径出售个人信息。匿名分析数据的保留仅以满足采纳分析所需的合理时间为限;本机遥测状态(如posthog-activity.json)则一直保留到你自行删除。
作为用户,你随时可以:
- 通过环境变量或
"telemetry": false配置关闭匿名遥测; - 删除本机的本地配置或缓存状态文件;
- 随时停止使用该服务。
8. 安全、政策变更与联系
项目对自身控制的系统采取合理的行政与技术安全措施,同时政策如实声明:任何传输或存储方式都无法做到绝对安全。政策可能不定期更新,重大变更会通过修订文档顶部日期体现。有关本政策的疑问,可通过项目仓库的 issue 跟踪器或仓库中公布的联系渠道提出。
9. 延伸阅读
- 隐私政策原文:docs/legal/privacy-policy.md;配套服务条款:docs/legal/terms-of-service.md
- OmO Native 完整事件 schema:docs/reference/senpi-telemetry.md
- 遥测核心实现:packages/telemetry-core/src(入口 index.ts)
- 配置 schema:packages/omo-config-core/src/schema/telemetry.ts
- 退出矩阵测试证据:packages/telemetry-core/src/env.test.ts
【免费下载链接】oh-my-openagentOmO: Just type "mass ulw" keyword with your prompt. Now you are the master of graph engineering.项目地址: https://gitcode.com/gh_mirrors/oh/oh-my-openagent
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考