TECHNICAL ARTICLE

做了个 PingTask,把想做的事 Ping 一下

PingTask 是一个带着游戏 Ping 手感的 macOS 玩具产品。指向屏幕上的信息,选择分析、拆任务或开始处理,把来源、上下文和自己的意图串起来,交给 Codex 等 Agent 继续推进。

最近做了一个 macOS 小工具,叫 PingTask。可以先把它当成一个玩具产品。

我想在电脑上也能像打游戏一样,看到一件事,指过去,Ping 一下。

群里有人发来一个问题,我想让 Agent 分析;一段讨论终于说清了,我想把它拆成任务;需求已经明确,我想直接开始处理。这些念头都发生在看信息的当下,但要交给 Agent,往往还得复制原文、补上下文、切换窗口,再解释一遍自己想干什么。

PingTask 想把这段交接缩短。指着信息,选一个意图,把眼前的内容和想做的事一起交出去。

纸艺概念插画:鼠标指向一条消息,通过意图轮盘将消息与处理要求一起交给 Agent

概念插画。选中的消息和处理意图一起进入 Agent 的工作过程。

把游戏里的 Ping 搬到桌面上

游戏里的 Ping 很省话。一个位置,加上一个标记,就能表达“看这里”“我在路上”或者“这里有危险”。对方能理解,是因为位置、场景和动作一起传了过去。

在电脑上处理事情,也经常有这种情况。我已经看着一条消息,鼠标也停在那里,心里想的是“帮我看一下这个问题”。但聊天框并不知道“这个”指什么,我还要重新组织一份输入。

所以我给 PingTask 做了一个全局轮盘。按住 Option 或 Ctrl,移动鼠标选一个方向,松手触发;也可以配置成鼠标右键拖动,或者自己的组合键。回到中心、按 Esc 都能取消。

默认放了四个动作:分析一下、拆成任务、开始处理、继续推进。松手时,对应的图标会在原地弹出,带着一圈扩散和淡出。视觉参考了 lolPing,保留了问号、旗子这些很有游戏感的标记。

我挺喜欢这种手感。一个临时冒出来的念头,有了一个随手能做的动作。

PingTask 的四方向轮盘、选中状态、八方向配置和空轮盘预览

轮盘与下文的配置界面图来自项目的原生界面离屏渲染,使用演示配置和虚构内容。

常用意图可以提前放好

我想串起来的,是散落在日常工作里的各种“我想让它做点什么”。

同一条消息,可以先分析,也可以整理成待办,还可以交给 Agent 实施。信息相同,意图不同,后面的工作就不同。轮盘上的每个方向,相当于提前存好了一种处理方式。

纸艺概念插画:消息、文档和截图进入四方向意图轮盘,常用处理方式保存为可复用卡片

比如“分析一下”的默认提示词,会要求区分已知事实、推断和待确认问题,给出下一步。“拆成任务”会整理目标、依赖和验收条件。“开始处理”则要求根据明确需求推进实现,并报告改动和验证结果。

这些都能自己改。意图有自己的名称、图片、提示词和执行器,可以新增、排序,也可以只留在库里。轮盘最多同时显示八个,放自己经常用的几个就好。

PingTask 意图配置页,可编辑图标、提示词、执行器以及自动上下文和提交选项

如果每天都要做相似的事,就可以把自己的习惯放进去。例如配置一个“整理待回复事项”,要求从确认的讨论材料中提取问题、已知结论和还缺的信息。下次遇到同类讨论,就不用重新输入这一整段要求。

Ping 一下带过去的,是“这份信息,按我的这套方式处理”。 临时变化的要求,仍然可以在草稿里补。

也可以给一个意图只配置特效。松手弹个问号,什么任务都不创建,连截图和 OCR 都不运行。做成玩具,也该留一点纯粹好玩的部分。

从一条消息走到 Agent

拿项目里的一个虚构例子来说,群里有人发了一句:“导出按钮点了没反应,Safari 上可以稳定复现,帮忙看一下。”

我指着这句话,选择“分析一下”。PingTask 会捕获目标窗口,保留原始指针位置,再用 OCR 提取线索。如果来源是微信,并且本机已经配置了 wxview,就继续查找对应会话和真实消息,把附近的上下文拿出来核对。

这一步很有必要。单看一句“导出失败”,不知道它是在什么条件下失败,也可能漏掉前面已经说过的复现步骤。截图能帮助找到位置,真实消息和附近讨论则能补上处理问题需要的材料。

默认流程里,我会先看到来源和草稿,核对后再提交。找不到唯一消息时保留候选,也可以主动选择只使用截图。交给 Codex 的截图会带上原始 Ping 坐标,让它知道我指的是哪里。

接下来,把确认的来源、上下文、意图提示词和补充说明一起交给已经配置好的执行器。Codex 使用设置中的工作目录和权限处理任务,PingTask 保存任务记录,并展示首次执行的状态与返回内容。需要深入讨论时,可以打开关联的 Codex CLI 会话接着聊。

这样就接上了一条路径:眼前的信息,选中的意图,确认的材料,Agent 的执行,再到可以回看的结果。中间需要补什么,产品尽量帮忙带上。

纸艺流程插画:选中消息、收集附近上下文、人工核对草稿,再交给 Agent 并保留结果

默认交接过程示意。来源与附近上下文先组成材料,经人核对后,再交给 Agent 处理。

“只要 Ping 一下”要有条件地成立

我希望常用动作最终能短到只剩一次 Ping。当前已经能针对单个意图开启自动上下文和自动提交,这两个开关默认关闭。

在微信来源上,用户预先开启后,也要找到唯一可靠的会话和消息,核对指针文字与真实原文,并拿到未截断的上下文,才会自动交接。来源有歧义,就停在草稿里等人确认。

我愿意把常用要求提前配置好,让下一次少做几步。但屏幕上几个相似的字,还不足以说明 Agent 找对了处理对象。

重复 Ping 也需要有交代。同一来源、同一意图和执行器再次触发,会打开已有记录,保留已经编辑过的内容。已经在执行的提交,不该因为多点了一次又跑一遍。

“继续推进”是这条链上还需要补齐的一段。轮盘里已经有这个可配置意图,但自动识别新消息属于哪个旧任务、把不同消息归到一起,还没有做完。目前真实 Codex 任务的后续推进,要打开原来的 CLI 会话继续;PingTask 也还没有同步外部续聊的全部状态。

我想要的后续体验,是一件事有了新材料以后,仍然能沿着原来的记录往前走。这部分需要明确的任务关联,才能让下一次 Ping 接得稳。

先把这个小入口做顺手

PingTask 目前是用 SwiftUI 和 AppKit 写的原生 macOS 应用。全局轮盘、窗口捕获、OCR、微信来源检索、本地记录,以及 tmux 加 Codex CLI 的初次执行交接,都已经有了实现。WorkBuddy 也加入了实验适配。

渠道接入还不齐。飞书已有人工确认来源的流程,真实读取仍待验收;钉钉目前识别窗口,消息查询尚未启用。多屏手势、系统权限和真实微信定位效果,也还需要继续做实机验证。这里介绍的是当前代码与产品设计,配图没有证明这些流程已经全部跑通。

PingTask 负责把信息和意图送到已有的 Agent 手里,具体推理与执行继续由 Codex、WorkBuddy 承担。空闲时不持续录屏,也不轮询聊天;主动提交后,确认的材料会交给对应执行器及其配置的服务处理。

我暂时想把它保留成一个小入口,先看看自己每天愿意把哪几个动作留在轮盘上,哪些场景还要反复补话。把这些地方用顺手了,再继续补任务之间的关联。

代码放在 PingTask 项目仓库。交互和图片素材的来源记录在项目的 第三方说明里。