168、【Agent】【OpenCode】TuiThreadCmd(SSE)
【声明】本博客所有内容均为个人业余时间创作所述技术案例均来自公开开源项目如GithubApache基金会不涉及任何企业机密或未公开技术如有侵权请联系删除标题168、【Agent】【OpenCode】TuiThreadCmdSSE背景上篇 blog【Agent】【OpenCode】TuiThreadCmdEvenSource分析了 Headers 是一个特殊的浏览器/Node.js 内置对象它不能直接被 JSON 序列化所以必须先把它“拆”成普通的{ key: value }对象才能通过 RPC 发送因为 Headers 把数据存在了内部私有槽位里而不是挂在可枚举的属性上。JSON 序列化器只能看到对象的自有可枚举属性所以什么都读不到而.entries()是 Headers 提供的标准读取接口能正确访问到内部存储的数据再由Object.fromEntries()把迭代器里的每一对[key, value]重新组装成一个纯普通对象接着分析了基于 RPC 通道的“伪 EventSource”对象它和上一个createWorkerFetch是同一套设计思路对外暴露熟悉的 API对内走 RPC 通道。但这次适配的不是 HTTP 请求而是服务端推送事件下面继续分析OpenCode上篇 blog 提到了 SSE 的概念下面澄清下SSE Server-Sent Events服务器发送事件它是浏览器原生提供的一种 “服务端向客户端单向推送数据” 的标准协议。用最简单的类比理解通信方式类比方向普通 HTTP打电话问老师问题老师回答后挂断一问一答WebSocket和老师接通电话双方可以随时说话双向实时SSE老师打开广播频道只能听不能说话服务端 → 客户端 单向推送SSE 就是那个“广播频道”服务端持续往客户端推数据客户端只需要监听不需要反复发请求。浏览器里怎么用// 浏览器原生 API就这么简单constsourcenewEventSource(/api/events)// 此 EventSource 非 opencode EvenSource方法不一样source.onmessage(event){console.log(收到推送:,event.data)}source.onerror(err){console.log(连接出错浏览器会自动重连)}浏览器会自动建立一个 HTTP 长连接服务端返回的响应头是 Content-Type: text/event-stream然后数据就像水流一样持续推过来。SSE 的数据格式服务端推送的内容是纯文本格式非常简单data:{user:alice,action:login}data:{user:bob,action:upload}event:notificationdata:{title:新消息,body:你好}每条消息以data:开头空行表示一条消息结束可选的event:字段区分消息类型SSE vs WebSocketSSEWebSocket方向单向服务端→客户端双向协议普通 HTTP独立协议 (ws://)自动重连✅ 浏览器内置❌ 需自己实现数据格式纯文本文本或二进制复杂度极低较高适用场景通知推送、实时日志、AI 流式输出聊天室、游戏、协作编辑为什么 AI 对话都用 SSEChatGPT 等产品的“打字机效果”就是 SSE模型生成一个 token服务端就通过 SSE 推一个 token前端逐字渲染。不需要双向通信SSE 比 WebSocket 简单得多。回到代码functioncreateEventSource(client:RpcClient):EventSource{return{on:(handler)client.onEvent(event,handler),// ...}}这里做的事情就是把原本应该走 HTTP SSE 长连接的推送替换成了走 RPC 通道的事件订阅。原来浏览器new EventSource(url)→ HTTP 长连接 → 服务端推 SSE 文本流现在client.on(event, handler)→ RPC 通道WebSocket/IPC→ 服务端推结构化事件对象调用handler通知好处是不需要额外维护一个 SSE 端点所有通信都走同一个 RPC 通道代价是失去了浏览器原生的自动重连等能力需要自己在 RpcClient 里实现。另外这里的 “event” 就是一个硬编码的字符串字面量。这意味着所有 handler 都绑定在同一个通道上无论注册多少次on(handler)底层都是在执行client.on(event, handler)。所有的回调函数都被注册到了 RPC Client 内部名为 “event” 的这唯一一个事件监听器列表中。服务端推送时没有区分度当服务端通过 RPC 发送消息时它只能发类似这样的结构client.emit(event,payload)它无法直接指定“这条消息只给某个特定的 handler”。RPC Client 收到 “event” 消息后会广播式地触发所有注册在该通道上的 handler。那如何区分不同类型的事件既然通道只有一个事件的分类逻辑就下沉到了 payload 内部。通常 Event 类型会长这样interfaceEvent{type:workspaceChanged|fileUpdated|notificationdata:unknown}客户端消费方需要在自己的 handler 里做二次分发eventSource.on((event){if(event.typefileUpdated){handleFileUpdate(event.data)}elseif(event.typenotification){showNotification(event.data)}})为什么这么设计这是一种 “单通道 消息自描述” 的模式好处是RPC 接口极简服务端只需要暴露一个emit(event, ...)方法不用为每种事件定义单独的 RPC 消息名统一中间件可以在 “event” 这一个点上统一做日志、鉴权、序列化等处理与 SSE 语义对齐原生 SSE 本质上也是一个 HTTP 连接上的单一文本流所有事件都走同一个管道靠event: type字段区分类型。这个设计是对 SSE 模型的忠实映射⚠️潜在风险如果业务事件种类很多、频率很高所有 handler 都会被频繁触发然后各自过滤存在一定的性能开销。当事件量大到成为瓶颈时就需要拆分为多个命名通道如client.on(fileUpdated, ...)但在那之前单通道模式是更简单、更合理的选择OK本篇先到这里如有疑问欢迎评论区留言讨论祝各位功力大涨技术更上一层楼更多内容见下篇 blog【Agent】【OpenCode】TuiThreadCmdworkspaceworker路径

相关新闻

C语言-循环嵌套、goto与数组入门

C语言-循环嵌套、goto与数组入门

前言 今天学的是 C 语言 Day05:循环嵌套、goto 语句和数组入门。前面已经掌握了三种循环,今天主要看循环怎么嵌套、跳转语句怎么用,以及数组这个“容器”怎么创建。 本篇文章要解决三个问题: 循环嵌套的执行顺序和次数怎么算&am…

2026/8/8 6:51:49 阅读更多 →
Unity小游戏架构选型:MVC与MVVM的实战抉择与避坑指南

Unity小游戏架构选型:MVC与MVVM的实战抉择与避坑指南

1. 项目概述:架构选择,小游戏开发中的“生存智慧”在Unity里做小游戏,尤其是独立开发者或者小团队,最怕什么?不是技术实现不了,而是项目做着做着,代码就变成了一团乱麻,加个新功能像…

2026/8/8 6:51:49 阅读更多 →
MSVC命令行编译C++程序:从环境配置到构建自动化

MSVC命令行编译C++程序:从环境配置到构建自动化

1. 项目概述:为什么需要从命令行使用MSVC?很多刚开始接触C的朋友,第一个接触的开发环境往往是Visual Studio那个庞大的IDE。点一下绿色的三角按钮,程序就跑起来了,一切看起来都很美好。但时间久了,你可能会…

2026/8/8 6:51:49 阅读更多 →

最新新闻

OpenCensus-Python指标监控实战:从Measure到View的完整实现

OpenCensus-Python指标监控实战:从Measure到View的完整实现

OpenCensus-Python指标监控实战:从Measure到View的完整实现 【免费下载链接】opencensus-python A stats collection and distributed tracing framework 项目地址: https://gitcode.com/gh_mirrors/op/opencensus-python OpenCensus-Python是一个功能强大的…

2026/8/8 16:25:41 阅读更多 →
AutoDL GPU租用平台实战指南:从零配置深度学习环境到成本优化

AutoDL GPU租用平台实战指南:从零配置深度学习环境到成本优化

1. 从零开始:为什么我们需要AutoDL这样的GPU租用平台? 如果你正在学习深度学习、大模型微调,或者任何需要GPU算力的项目,那么“显卡”这个词对你来说,可能已经从“游戏装备”变成了“生产力瓶颈”。我刚开始接触深度学…

2026/8/8 16:25:41 阅读更多 →
如何用Buzz实现本地音频转录和翻译?离线AI工具完整指南

如何用Buzz实现本地音频转录和翻译?离线AI工具完整指南

如何用Buzz实现本地音频转录和翻译?离线AI工具完整指南 【免费下载链接】buzz Buzz transcribes and translates audio offline on your personal computer. Powered by OpenAIs Whisper. 项目地址: https://gitcode.com/GitHub_Trending/buz/buzz 想象一下这…

2026/8/8 16:25:41 阅读更多 →
MCU开发工作流构建与优化实践指南

MCU开发工作流构建与优化实践指南

1. 什么是开发工作流 开发工作流(Development Workflow)是指软件开发过程中一系列标准化、自动化的步骤和流程。它定义了从代码编写到最终部署的完整生命周期,帮助团队高效协作、减少人为错误。现代开发工作流通常包含代码版本控制、自动化构…

2026/8/8 16:25:41 阅读更多 →
C# Socket编程实战:从零构建局域网对战游戏

C# Socket编程实战:从零构建局域网对战游戏

1. 项目概述:从零到一构建局域网对战游戏 如果你是一名C#开发者,想深入理解网络编程的底层机制,或者想亲手打造一个能和三五好友在局域网里联机对战的游戏,那么这个项目就是为你量身定做的。我们不会停留在理论层面,而…

2026/8/8 16:25:41 阅读更多 →
从提示词到AI Agent:构建十个层次的AI技能实战框架

从提示词到AI Agent:构建十个层次的AI技能实战框架

1. 项目概述:从“玩票”到“创收”的AI技能进化论最近和不少同行、客户聊AI,发现一个挺有意思的现象:大家都能用ChatGPT写点邮件、改改文案,但真正能把AI用成“生产力核武器”,甚至直接驱动业务增长、形成闭环的&#…

2026/8/8 16:24:41 阅读更多 →

日新闻

AI多智能体时代来临,读懂MCP与A2A架构,抢占企业数字化新风口

AI多智能体时代来临,读懂MCP与A2A架构,抢占企业数字化新风口

当下AI应用飞速普及,无数企业下场搭建智能体系统,可落地阶段难题接踵而至:上下文无限堆积频繁爆栈、AI工具调用准确率低下、Token成本居高不下、企业数据权限混乱暗藏安全隐患……很多团队卡在架构搭建环节,空有前沿技术概念&…

2026/8/8 0:00:07 阅读更多 →
PHP二维码生成终极指南:用chillerlan/php-qrcode打造专业级二维码

PHP二维码生成终极指南:用chillerlan/php-qrcode打造专业级二维码

PHP二维码生成终极指南:用chillerlan/php-qrcode打造专业级二维码 【免费下载链接】php-qrcode A PHP QR Code generator and reader with a user-friendly API. 项目地址: https://gitcode.com/gh_mirrors/ph/php-qrcode 在当今数字时代,二维码已…

2026/8/8 0:00:08 阅读更多 →
UniApp微信小程序隐私保护组件开发:从原理到实战

UniApp微信小程序隐私保护组件开发:从原理到实战

1. 项目缘起:为什么我们需要一个隐私保护通用组件?最近在维护一个基于uniapp开发的微信小程序矩阵时,我遇到了一个非常棘手的问题。随着平台对用户隐私保护的要求越来越严格,几乎每一个新版本发布,或者在某些特定机型&…

2026/8/8 0:00:08 阅读更多 →

周新闻

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

1. 从水管网络到最大流:一个核心问题的诞生想象一下,你是一个城市供水系统的总工程师。你的城市有多个水源(水库),需要通过一个复杂的地下管道网络,将水输送到各个居民区。每条管道都有其最大通水能力&…

2026/8/6 22:02:27 阅读更多 →
基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…

2026/8/8 8:58:26 阅读更多 →
MATLAB xcorr函数详解:从互相关原理到四大实战应用

MATLAB xcorr函数详解:从互相关原理到四大实战应用

1. 从一次信号“找茬”说起:为什么我们需要互相关几年前,我在处理一组声学传感器数据时遇到了一个棘手的问题。我有两个麦克风记录了一段相同的音频信号,理论上它们接收到的声音波形应该非常相似,只是由于麦克风位置不同&#xff…

2026/8/7 23:24:08 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/7 17:02:37 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/7 23:54:54 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/7 17:02:36 阅读更多 →