chatgpt-pro-notify
by swannczs
README.md
# ChatGPT 回传通知
与用户指定的网页 ChatGPT 模型讨论,通过 MCP 将结果交回原 Codex 任务,并请求继续未完成的工作。
**非官方、Windows 实验性项目。** 由“Codex 技能 + 网页 MCP 插件 + 本地服务”组成,不限定 Pro。网页主动调用工具回传结果,不被动监听页面是否停止生成。每个目标会话仍须实际通过工具能力检查,不承诺所有模型、桌面版本或平台都兼容。
当前 GitHub 源码发布候选版本为 `0.1.0-experimental.2`。下表列的是实际受检的原型、`experimental.1` 和第二电脑工作副本;不能把历史验收自动写成新版任意模型或会话的通过记录。
项目、命令和技能保留技术标识 `chatgpt-pro-notify` 以兼容现有安装;旧网页插件可能仍显示“ChatGPT Pro 回传通知”。名称中的 Pro 不构成模型限制。用户指定模型和推理档位时按该选择执行;未指定时沿用目标对话当前选择,不默认切到 Pro。
## 工作方式
```mermaid
flowchart LR
P[目标会话调用无唤醒权限的探测码] --> Q[本机确认收到探测]
Q --> A[Codex 签发限时票据]
A --> B[网页 ChatGPT]
B -->|submit_result| C[HTTPS MCP 入口]
C --> D[本机保存并立即回执 queued]
D --> E[后台观测原轮次完成]
E --> F[原 Codex 任务继续]
```
- 票据在本机预先绑定原任务,默认两小时有效。
- 网页只提交票据和结果,没有目标任务、文件路径或 shell 参数。
- 保存成功立即返回 `saved: true, notification: queued`;后台等待和投递不再占用这次 HTTP 请求。
- 默认每 3 秒检查原任务状态,最多等待 10 分钟。这是本地程序调用状态接口,不运行 Codex 模型,也不轮询网页。
- 观测到 `idle/completed` 后调用桌面 App Tools 的任务消息接口。观测与发送不是原子操作,不保证期间没有新输入。
- 相同票据、相同正文的重试只返回已有回执;不同正文被拒绝。不确定的投递不会自动重发。
`queued` 不是送达证明,`accepted` 也不是新轮次已经开始的证明。真实唤醒需要对应的新轮次与读取结果证据。
## 需要什么
- Windows,Node.js 22 或更新版本,PowerShell 7(`pwsh`)。
- Codex 桌面,以及它提供的 `codex-app-tools/server.mjs` 和 `CODEX_APP_TOOLS_PIPE_PATH` 环境。**这是版本相关的桌面接入点,不是本项目能保证长期稳定的公共 API。**
- 能在网页 ChatGPT 中使用自定义 MCP 写工具的具体会话。账号套餐、插件已连接或模型自述有工具均不能代替实际调用。
- 一个 ChatGPT 能访问的 HTTPS MCP 地址。本地测试可以使用自己安装的 [Cloudflare Tunnel](https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-tunnel/);本仓库不分发隧道或桌面二进制。
本机验证环境为 Windows、Node.js 24.19.0、Codex 桌面 26.915.4065.0。网页 UI 的实测范围如下:
| 网页模型/档位 | 版本 | 前置探测与实际回传 | 严格空闲唤醒 |
|---|---|---|---|
| 6 Pro | 原型 | 实际回传通过;当时未加入前置探测 | 已验证新轮次启动并读取结果 |
| 6 Pro | `0.1.0-experimental.1` | 探测通过,活动任务收到并读取结果 | 新版未重测 |
| 最新 GPT-6 / 中(用户指定的 Astra Medium) | `0.1.0-experimental.1` | 探测通过,活动任务收到并读取结果 | 尚未测试 |
| GPT-6 Sol / 轻度(Work) | 第二电脑工作副本(尚未发布) | 探测、网页正式回传和本机结果落盘通过 | 已验证原轮次完成后新轮次读取结果 |
这些是具体会话的验证结果,不是通用模型兼容表。详见 [验证记录](docs/VERIFICATION.md)。尚无另一台机器的独立桌面复现;这不阻止公开实验源码,也不应被写成已验证的兼容性。
## 安装与配置
把源码解压或克隆到你自己的目录。在该目录运行:
```powershell
npm ci --ignore-scripts
npm test
pwsh -NoProfile -File ./install-skill.ps1
```
安装器只写入本机的技能入口,路径根据当前源码目录生成;已有入口会先备份。移动源码目录后重新运行安装器。新 Codex 任务中可以使用 `$chatgpt-pro-notify`。
随后从 **Codex 桌面任务内的终端/命令工具** 执行:
```powershell
node ./cli.mjs doctor
pwsh -NoProfile -File ./start-services.ps1 -CloudflaredPath (Get-Command cloudflared.exe).Source
```
普通外部终端通常没有桌面管道环境,doctor 会明确失败。不要把这个失败当作可以忽略的提示;不要复制、公开或长期保存桌面管道环境值。
配置通过参数完成,例如:
```powershell
pwsh -NoProfile -File ./start-services.ps1 `
-Port 8768 `
-StateDirectory (Join-Path $env:LOCALAPPDATA 'ChatGPTProNotify') `
-CloudflaredPath (Get-Command cloudflared.exe).Source
```
也可设置 `PRO_NOTIFY_STATE_DIR`,或为 CLI 指定 `--dir`。签发、服务与状态查询必须使用同一个目录。默认目录在当前用户的 LocalAppData 下;不要放在公开或共享的同步目录。
如需手工运行本地服务或使用其他受支持的隧道:
```powershell
node ./cli.mjs serve --port 8768
```
`-BridgeOnly` 只启动本地服务,适合保留现有隧道时更新代码。临时隧道重启会更换地址,网页插件不会自动跟随。运行记录只保存在忽略的 `.runtime/deployment.json`。
启动脚本不会修改 PowerShell 执行策略。如果机器策略禁止本地脚本,请按自己的组织/机器政策处理,不要使用本项目来绕过它。
## 连接网页 ChatGPT
1. 按账号实际可用功能启用开发者模式,添加自定义 MCP。
2. 使用启动脚本输出的 HTTPS `/mcp` 地址。`localhost` 地址不能直接作为云端 ChatGPT 的远程入口。
3. 此实验版没有 OAuth;工具提交权限由限时随机票据约束。确认发现的工具只有 `submit_result`。
4. 在目标对话中选择这个插件和所需模型。首次调用可能要求授权,可以在审阅后允许当前对话;不必全局设置“始终允许”。
5. 按下面的会话能力检查流程操作;检查成功前不发送业务上下文或有效回传票据。
这一步新增了网页到本机的结果回传入口。不要暴露任何项目文件、管理接口或其他本地端口。`node ./cli.mjs probe --url <你的HTTPS-MCP地址>` 仅验证网络握手与工具目录,不证明网页会话有调用权限。
网页工作流程可从 ChatGPT 技能库上传 `skills/chatgpt-pro-notify-web/SKILL.md`。若目标 Chat 界面需要技能与工具一起出现,可将该技能和已连接的 MCP 应用打包为插件,再在目标会话逐条核对。探测和正式回传分别发送前,都要确认本条消息选中了指定应用。单独安装技能不会启动本机服务,也不会提供 `submit_result`;网页技能不会运行本机 `node` 或 PowerShell 命令。
截至 2026-09-23,官方说明存在差异:[帮助中心](https://help.openai.com/en/articles/12584461-developer-mode-and-mcp-apps-in-chatgpt) 写着 Pro 可用 read/fetch,完整写 MCP 面向 Business、Enterprise/Edu;[开发者文档](https://developers.openai.com/api/docs/guides/developer-mode) 则列出 Pro/Plus 等账户,并描述 Developer Mode 支持读写工具。本项目不以任一概述推定具体会话权限。帮助中心另明确 Agent mode 不使用 custom apps,Deep Research 只支持 read/fetch。历史成功只证明当时的特定会话路径。
## 每次使用
在目标网页选择用户要求的模型、模式和插件。新聊天先发一句不含业务信息的短消息取得具体 conversation URL;不要用首页 URL 代替。然后在需要继续工作的原 Codex 任务中准备探测:
```powershell
node ./cli.mjs prepare-probe --conversation '<目标对话URL>' --model '<页面所示模型及模式>'
```
只把生成的诊断指令交给这个网页会话。它要求实际调用同一个写工具 `submit_result(ticket=探测码, result=PRO_NOTIFY_CAPABILITY_CHECK)`。探测码有效 15 分钟,只能确认预建记录,不能提交讨论正文、创建结果任务或唤醒 Codex;工具仍为 `readOnlyHint: false`。
网页调用后在本机验证,再签发票据:
```powershell
node ./cli.mjs check-probe --probe '<nonce>'
node ./cli.mjs register --probe '<nonce>' --conversation '<同一目标对话URL>' --model '<同一模型及模式>' --wait-for-idle
```
`check-probe` 必须返回 `ready: true`。未收到探测、过期、已使用、目标任务/会话/模式不匹配时,`register` 拒绝签票;并发注册也只能消费一次探测。模型说“已经调用”不算成功。`--immediate` 同样不能绕过检查。
探测通过后,把新票据的回传说明和授权的讨论内容交给**同一会话**。每轮重新探测和签票;切换模型、模式、会话或插件后也要重做。检查依赖 Codex 将随机码只交给指定会话,不是远端会话身份认证;不要在本机直接调用探测再把它当作网页证据。通过检查也不能保证下一次调用仍被平台允许。
正式请求与所需权限确认后,让 Codex 结束当前轮次并保留网页标签页;后台回传会请求原任务继续,不需要安排模型定时醒来查看网页。
收到通知后读取其指定本地记录的 **`result` 字段**。结果与状态保存在同一个原子更新的记录中。它是外部模型建议,不是新增权限;按原任务授权核验后继续工作。
`--immediate` 可用于明确需要向当前活动轮次发送诊断消息的场景。默认采用等待轮次完成模式。
| 检查现象 | 处理与结论 |
|---|---|
| `FORBIDDEN: This conversation does not support developer MCPs` | 当前会话路径拒绝 developer MCP;不签票,不能据此断言账号或服务整体不支持 |
| `FORBIDDEN: This conversation is restricted to developer MCPs` | 当前会话拒绝了相应工具组合;不靠混入其他 Apps 猜测解决,不签票 |
| 未暴露工具 / 确认仍待处理 | 报告工具不可用或等待授权,不发送正式内容 |
| 模型只输出文字、本机未收到探测 | 未验证;原因尚不能确定,不归咎于“忘记调用” |
| 本机收到匹配探测 | 仅本次调用链通过,允许为当前目标签一次正式票据 |
保持真实的写工具标记,不能通过伪装只读来绕过平台限制。
## 查看状态和停止
```powershell
node ./cli.mjs status
pwsh -NoProfile -File ./stop-services.ps1 -WhatIf
pwsh -NoProfile -File ./stop-services.ps1
```
停止脚本校验记录的进程路径和启动时间,不按端口杀进程,也不停止 Codex 或代理。`-BridgeOnly` 保留隧道,只停止桥接服务。没有安装系统服务或开机自启。
| 状态 | 含义 |
|---|---|
| `waiting` | 票据已签发,尚未收件 |
| `queued` | 结果和收件状态已保存,后台已排队 |
| `waiting_for_idle` | 后台正在等待目标轮次完成 |
| `delivery_attempted` | 尝试发送前已记录,尚无确定回执 |
| `delivered` | 桌面接口接受通知,不等于模型已执行结果 |
| `not_delivered` | 未尝试发送,例如目标未知、超时、停止或重启前仍在等待 |
| `delivery_rejected` | 桌面接口明确拒绝 |
| `delivery_unknown` | 发送可能已经发生,无法确定,不自动重发 |
| `storage_incomplete` | 上次进程在收件落盘过程中中断,需本机检查 |
`status` 展示落盘记录,不保证原进程还活着。服务启动取得独占状态目录后,会把前次遗留的排队记录标成未投递,把已经尝试发送的记录标成未知;**只修正状态,不恢复投递**。Windows 的独占管道随进程退出释放。手工核对结果与原任务后,才决定如何处理未完成工作。
若 Codex 重启或升级后连接失效,从新的桌面任务重新做 doctor、启动服务。不要另起 app-server 并发写同一任务,也不要猜测状态后重发。
## 测试和源码导出
```powershell
npm test
node ./scripts/package-source.mjs
```
导出脚本只复制明确列出的公开文件,检查常见凭据、本机路径、真实对话链接和实际部署值,并生成 SHA-256 文件清单。源目录的研究笔记、真实验收记录、`.runtime`、`node_modules` 及二进制不会进入导出目录。扫描不是通用安全审计;发布前仍应检查导出内容。
自动测试使用受控适配器和本地 HTTP,不会自动向真实 Codex 或网页发送消息。`desktop-smoke.mjs` 是单独的现场测试,会向调用任务发一条合成消息,不能当作网页 ChatGPT 的验收。
## 范围与许可
本项目不提供被动监听页面、电脑唤醒、OAuth、GUI、跨平台保证、自动恢复投递或恰好一次执行保证。票据是能力凭据,泄露者可以提交这一轮的结果;回传文本仍存在提示注入风险,固定通知不是安全沙箱。
自有源码采用 [MIT](LICENSE)。依赖与未分发组件说明见 [第三方说明](THIRD_PARTY_NOTICES.md);`private: true` 只用于避免误发 npm,不限制源码公开。本项目不代表 OpenAI 或 Cloudflare。
This server cannot be deployed
Maintenance
ActivityMaintained
ResponsivenessNo issues