@xgspz/cli-ui 0.6.15 → 0.6.16

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (68) hide show
  1. package/CHANGELOG.md +24 -0
  2. package/README.md +21 -1
  3. package/dist/{cli-ui-embed-vIXVNs6k.js → cli-ui-embed-D9xgur2y.js} +18299 -18587
  4. package/dist/{cli-ui-index-R24x28OX.js → cli-ui-index-WBtxmw23.js} +2 -2
  5. package/dist/{cli-ui-jszip.min-DUghzByz.js → cli-ui-jszip.min-CU3ZzoXb.js} +1 -1
  6. package/dist/{cli-ui-jszip.min-DfH6rdQD.js → cli-ui-jszip.min-DdU0X3VJ.js} +2 -2
  7. package/dist/{cli-ui-xlsx-CP0lJhff.js → cli-ui-xlsx-Dx6T7qhC.js} +1 -1
  8. package/dist/cli-ui.css +1 -1
  9. package/dist/cli-ui.js +1 -1
  10. package/package.json +1 -1
  11. package/src/board/ChangesPane.tsx +10 -4
  12. package/src/board/CliBoard.tsx +48 -16
  13. package/src/board/FileViewer.tsx +34 -1
  14. package/src/board/diffRefresh.ts +63 -0
  15. package/src/board/linkage.ts +68 -0
  16. package/src/board/pathResolve.ts +108 -0
  17. package/src/chat/CliChat.tsx +76 -181
  18. package/src/chat/Composer.tsx +4 -3
  19. package/src/core/conversation.ts +9 -1
  20. package/src/core/store.ts +112 -38
  21. package/src/msglist/CliMsgList.tsx +3 -2
  22. package/src/operator/node/AgentConnect.tsx +19 -15
  23. package/src/operator/node/AppearancePanel.tsx +1 -1
  24. package/src/operator/node/BranchNavigator.tsx +1 -1
  25. package/src/operator/node/BrowserPane.tsx +1 -1
  26. package/src/operator/node/Chat.tsx +16 -261
  27. package/src/operator/node/CommandPalette.tsx +1 -1
  28. package/src/operator/node/Composer.tsx +1 -1
  29. package/src/operator/node/Layout.tsx +1 -1
  30. package/src/operator/node/Markdown.tsx +6 -36
  31. package/src/operator/node/Modal.tsx +1 -1
  32. package/src/operator/node/OnboardingWizard.tsx +9 -5
  33. package/src/operator/node/Orchestrator.tsx +1 -1
  34. package/src/operator/node/ProjectLanding.tsx +1 -1
  35. package/src/operator/node/ProjectsColumn.tsx +1 -1
  36. package/src/operator/node/ProviderAuth.tsx +12 -10
  37. package/src/operator/node/RunSwitch.tsx +1 -1
  38. package/src/operator/node/Services.tsx +1 -1
  39. package/src/operator/node/SessionRail.tsx +27 -8
  40. package/src/operator/node/SessionView.tsx +1 -1
  41. package/src/operator/node/SettingsView.tsx +1 -1
  42. package/src/operator/node/TaskBoard.tsx +1 -1
  43. package/src/operator/node/TaskChanges.tsx +34 -5
  44. package/src/operator/node/TaskHero.tsx +1 -1
  45. package/src/operator/node/TasksColumn.tsx +1 -1
  46. package/src/operator/node/Transcript.tsx +10 -237
  47. package/src/operator/node/Welcome.tsx +1 -1
  48. package/src/operator/node/WorktreePrune.tsx +1 -1
  49. package/src/operator/node/boardInteraction.ts +6 -3
  50. package/src/operator/node/boardState.ts +12 -13
  51. package/src/operator/node/fileLinks.ts +4 -38
  52. package/src/operator/node/format.ts +12 -104
  53. package/src/operator/node/github.tsx +10 -8
  54. package/src/operator/node/modals.tsx +15 -13
  55. package/src/operator/node/recheckOnReturn.ts +28 -0
  56. package/src/operator/node/shared.tsx +10 -50
  57. package/src/operator/node/useTaskStream.ts +2 -2
  58. package/src/styles.css +5 -0
  59. package/src/ui/Markdown.tsx +36 -21
  60. package/src/ui/Transcript.tsx +8 -5
  61. package/src/ui/fileLinks.ts +6 -3
  62. package/src/ui/format.ts +11 -5
  63. package/src/ui/shared.tsx +11 -7
  64. package/src/ui/transcriptModel.ts +40 -9
  65. package/src/ui/useTranscriptWindow.ts +253 -0
  66. package/src/operator/node/boundedPoll.ts +0 -47
  67. package/src/operator/node/icons.tsx +0 -88
  68. package/src/operator/node/transcriptModel.ts +0 -129
package/CHANGELOG.md CHANGED
@@ -1,5 +1,29 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.6.16 — 本地候选,2026-11-12
4
+
5
+ - 列表加载不再重复请求:`CliMsgList` 首次加载时,第 3 个起的每个对话任务都被拉两次详情(`GET /api/jobs/:id`),而且同时发出、不受列表「最多 2 个并发」的限制;宿主异步给 `jobIds`(先空、再一次给很多)时则全部同时发出。现在首次加载、刷新、补拉新加进来的对话共用同一个并发上限(2 个),同一个对话任务排着或正在拉时不再排第二次,给打开文件、发消息这类请求留出浏览器连接。
6
+ - 列表和对话同时打开选中的对话时,选中的那个也只拉一次(此前对话会等列表那次拉完再补拉一次)。拉完之后的刷新(回到前台、`store.refreshAll()`、手动刷新)照常重新拉。
7
+ - 新增 `store.loadMissingJobs()`(列表组件内部用,补拉列表里还没有数据的对话任务)。
8
+ - 智能体流式输出时只画新来的消息:此前对话每收到一块输出,输入框、智能体/执行设置、看板页签(外置看板连同文件列表)都跟着整个重画一次;现在 `Composer` 和 `CliBoard` 只在自己用到的东西变了时重画(排队消息出现、本轮结束、执行设置变化等照常更新),看板只订阅运行状态、轮次签名和收尾计数,不再订阅整个对话。转录本身的计算不变(600 条消息每块约 0.2ms)。
9
+ - 刷新任务详情时,实时用量已经是 0 的对话不再被替换成新对象:此前每次刷新(每轮状态变化都会触发)都让看着它的对话组件把整份消息重算一遍。
10
+ - 没人看的对话(对话、看板都不再看它)最多在内存里留 100 个(`IDLE_CONV_MAX`,与节点适配的 `KEEP_TRANSCRIPTS` 同一个值;节点适配由 30 个调到 100 个)的记录,每个离开时截到最新 300 条(往上翻过的更早消息丢掉,再往上翻时重新取),更早的整个释放,再打开时从实时流重新读;来回切换最近看过的对话仍然立刻显示。此前看过的每个对话的转录都一直留在内存里,长时间翻看很多大对话时内存只增不减。`store.getState().convs` 只保证有正在看的对话。
11
+ - 看板「改动」页签自动刷新(反馈:差异对比不会自动刷新):
12
+ - 节点模式(`TaskChanges`)此前只在运行状态从「运行中」变成「空闲」时重读;排队的消息接着跑时一直是运行中,改动就一直不刷新。现在节点每个回合结束(任务实时流的 `turn_end`)都重读,运行状态变成空闲、工作区文件有变化时也重读。
13
+ - 两种模式在运行中有工具执行完(可能改了文件)时也重读,不用等这一轮结束:节流到最多每 5 秒一次,最后一次变化之后一定再读一次;页面在后台时的变化回到前台补读一次。中枢看板与节点共用 `board/diffRefresh.ts`。
14
+ - 只看事件、没有定时轮询;读取仍只在改动页签打开时发生。`ConvState` 新增 `edits`(运行中工具执行完的次数)。
15
+ - 每一轮的请求更少:看板概况(`GET /api/jobs/:id/board`)此前每次轮次状态变化(排队、派发、执行、结束)都重查一次,一轮 4 次;现在只在派发到节点、任务结束、看的子任务或它在节点上的会话变了时重查,平常一轮 0 次。节点回合结束时已经查过文件、之后没有工具再执行完时,中枢随后把这一轮标成结束时不再查第二次。实测一轮(排队 → 执行 → 三次改文件 → 结束):任务详情 2 次(开始、结束,列表卡片要用)、看板概况 4 → 0 次、改动 1 → 2 次(轮中一次、轮末一次)。
16
+ - 组件里不再有定时轮询接口:节点模式的智能体登录、GitHub 登录、模型服务授权、「用 AI 刷新」项目上下文、引导页的连接检查,此前在等待期间每 1.5~3 秒查一次(最长 10~15 分钟);现在改为回到页面(显示、获得焦点、网络恢复)时查一次,等待处给「检查状态」「我已完成授权,检查状态」「检查结果」「已经登录过?重新检查」按钮。新增离线校验:组件源码里的 `setInterval` 只允许用在不发请求的本地计时 / 看门狗上。
17
+ - 中枢与节点适配共用实现(不再各留一份):
18
+ - 分段渲染加滚动(DOM 里最多 360 行、往上翻分页取、视图锚定、消息导航)合成 `ui/useTranscriptWindow.ts`,`CliChat` 与节点 `Chat` 共用;`CliChat` 由 960 行减到 846 行、节点 `Chat` 由 538 行减到 293 行,中枢这边也用上节点那边更稳的做法(取更早一页时按接上之前第一行的位置定位、导航到窗口外的消息先显示再跳)。`store.loadOlder(key, { beforeApply })` 新增可选参数。
19
+ - 转录模型(工具卡片解析、快照合并、会话分行、离开时截短与保留个数)只留 `ui/transcriptModel.ts`;节点的副本删除,节点由此也用上对格式不对的工具数据的容错。
20
+ - 工具卡片、提问卡片、浏览器输入卡片、会话分隔、Markdown 渲染规则、本地文件链接识别、图标、状态点 / 头像 / 智能体标签 / 骨架条 / 错误提示、时间与用量等格式化函数,节点适配改为用共享的那份,只保留各自不同的部分(节点的文件地址、按任务状态的状态点、附件地址)。
21
+ - 「在看板里打开」的接收方登记和多个看板时生效哪一个,中枢仓库和节点的 `boardInteraction` / `boardState` 共用 `board/linkage.ts`(各自一份实例,规则一份);节点的接收方出错时不再打断后面的接收方。
22
+ - 两个输入框(中枢 `Composer`、节点 `Composer`)功能不同(文本块 vs 节点原件上传、引用、分支),草稿存在本机的格式和键也不同,没有合并,已共用自动高度、排队消息、引用卡片、弹出菜单。
23
+ - 对话里的相对路径打不开(反馈:只给了一部分地址,智能拼接之后还是不对):智能体有时相对它进入的子目录写路径(例如资料在 `medical-review/<id>/prepare/` 下,回复里只写 `manual/modules/07_检验检查趋势/rules.md`),节点按任务工作目录根去找就是「文件不存在」;平台为大任务建的项目在节点上不做按文件名结尾的查找(会在几页同名文件里挑错)。现在看板、对话弹窗和节点看板读到「文件不存在」时,按这个对话里的线索补全——消息里提到过的目录、工具读写过的完整路径、看板打开过的文件——最多 8 个候选,逐个向服务端确认存在:只找到一个直接打开,并写明「对话里写的是 …,打开了 …」,再点同一个链接直接打开它;找到几个列出来让用户选;都没有照常报错。读失败不是因为文件不存在(断网、没权限)时不补。新增 `board/pathResolve.ts`,`FileViewer` 新增可选参数 `resolveMissing`、`onResolved`、`resolvedFrom`。
24
+ - 配套节点(`operator-oss`,需另行部署):四种智能体的会话上下文里加一条文件引用约定,回复里提到文件时写相对任务工作目录的完整路径或绝对路径,不写相对它后来进入的子目录的路径。
25
+ - 本地候选,尚未发布到 npm;`@xgspz/cli-ui@0.6.15` 仍为已发布版本。中枢不需要改动;节点的文件引用约定需部署节点后生效,组件这边的补全不依赖它。
26
+
3
27
  ## 0.6.15 — 已发布,2026-11-11
4
28
 
5
29
  - 「正在加载会话」不再一直转圈:一次性任务的子任务(例如已完成的子任务)记录迟迟没到时,最多等 20 秒(`TRANSCRIPT_WAIT_MS`)就改成说明并给「重新读取」;实时连接一直没收到数据(网关缓冲了实时推送)时说明是连接问题。中枢报告读不到记录(新的流事件 `transcript_unavailable`)时立即说明,读到记录后自动消失。
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # @xgspz/cli-ui
2
2
 
3
- `@xgspz/cli-ui@0.6.15` 已发布(2026-11-11),以下安装和导入示例可直接使用。旧命名空间 `@xgspz/cli-ui` 停在 0.6.13,已有业务依赖不会自动切换。0.6.15 起源码包名即 `@xgspz/cli-ui`,在本目录直接 `npm publish`(发布前自动跑 lint、测试与嵌入构建)。npm 发布、center 文档部署和节点升级分别执行。
3
+ `@xgspz/cli-ui@0.6.15` 已发布(2026-11-11),以下安装和导入示例可直接使用。`0.6.16` 为本地候选(列表请求不重复、改动页签自动刷新、相对路径按对话线索补全、流式输出时输入框和看板不重画、组件里没有定时轮询、中枢与节点共用实现),尚未发布。旧命名空间 `@xgspz/cli-ui` 停在 0.6.13,已有业务依赖不会自动切换。0.6.15 起源码包名即 `@xgspz/cli-ui`,在本目录直接 `npm publish`(发布前自动跑 lint、测试与嵌入构建)。npm 发布、center 文档部署和节点升级分别执行。
4
4
 
5
5
  相互联动的三个组件,支持中枢对话和完整 Operator 节点工作区。缺省参数使用中枢协议;`operator` 参数承接节点的完整任务与 Git 工作流。输入框默认显示附件、执行类型和智能体;后端缺少配置能力时明确说明并禁用设置,仍可按原有默认配置聊天。
6
6
 
@@ -289,6 +289,10 @@ cli-chat 的顶部栏(面包屑、标题、智能体、用量、模型、状
289
289
  - 发送失败时内容留在输入框;撤回、停止、回答、结束失败时在顶部提示;排队卡住时气泡下写明原因。
290
290
  - 实时流 45 秒没数据就重连,网络恢复、切回页面或窗口获得焦点时立即重连;404 停止重连并给出提示。
291
291
  - 断线先悄悄重连(0.6.14):网关回收长连接、网络抖动、休眠唤醒、中枢重启造成的断线,15 秒内重新连上就不提示,`stream` 保持原来的 `live` / `connecting`,漏掉的事件由重连后的快照补齐;一直没恢复才变为 `"reconnecting"`,聊天顶部显示「实时连接中断,正在重连…」。新连接送来快照或数据才算恢复,连上就断的不会把重试次数清零。中枢停机(`end: server_shutdown`)按断线处理,不显示为对话结束。
292
+ - 列表请求有并发上限(0.6.16 候选):首次加载、刷新和补拉新加进来的对话共用 2 个并发,每个对话任务只拉一次详情,不挤占打开文件、发消息的连接。
293
+ - 对话记录的内存有上限(0.6.16 候选):没人看的对话最多留 100 个的记录,每个截到最新 300 条,更早的释放,再打开时从实时流重新读取。
294
+ - 改动页签自动刷新(0.6.16 候选):每轮结束、节点每个回合结束、运行中有工具执行完(节流,最多每 5 秒一次)时重读,只看事件,不定时轮询。
295
+ - 组件里没有定时轮询接口(0.6.16 候选):节点模式的登录、授权、上下文刷新等待改为回到页面时查一次,并给「检查状态」按钮。
292
296
  - 会话记录加载有上限(0.6.15):记录 20 秒还没到就显示原因和「重新读取」,不一直转圈;`store.reconnect(key, { force: true })` 可强制重连并让中枢重新补发。
293
297
  - 没有无限轮询或无限重试(0.6.14):实时流断线约 2 分钟内重试 7 次(401 / 403 隔 30 秒最多 3 次),用完进入 `stream: "offline"`,顶部提示并给「重新连接」;网络恢复、回到页面、获得焦点、在该对话发消息或 `store.reconnect()` 时再连。浏览器画面连续失败 8 次、改动页签暂时性错误 3 次后同样停下。列表不再定时轮询(`pollMs` 仅兼容):打开着的对话由实时流更新,其余在回到前台、获得焦点、网络恢复时刷新,也可 `store.refreshAll()`。子代理侧栏只在父对话里有新动静或回到前台时补读。
294
298
 
@@ -296,6 +300,8 @@ cli-chat 的顶部栏(面包屑、标题、智能体、用量、模型、状
296
300
 
297
301
  Agent 回复里指向本地文件的链接(`report.md`、`src/a.ts:12`、`file:///…`),识别规则与 Operator 相同。缺省在当前工作区打开(右侧看板、顶部文件页签或手机抽屉),按住 ⌘/Ctrl 点按地址在新窗口打开;`fileUrl={(path, jobId) => 地址}` 可以自己给地址。
298
302
 
303
+ 相对路径打不开(0.6.16 候选):智能体有时相对它进入的子目录写路径(写 `manual/rules.md`,实际在 `data/run-1/prepare/manual/rules.md`)。看板和弹窗读到「文件不存在」时,按这个对话里的线索补全:消息里提到过的目录、工具读写过的完整路径、看板打开过的文件,逐个向服务端确认存在。只找到一个就直接打开,并写明「对话里写的是 …,打开了 …」,之后再点同一个链接直接打开它;找到几个就列出来让用户选;都没有照常显示读取失败。读失败不是因为文件不存在(断网、没权限)时不补。配套节点(`operator-oss`)同时在每个会话的上下文里要求智能体写相对任务工作目录的完整路径或绝对路径。
304
+
299
305
  ## 开发
300
306
 
301
307
  所有源码统一在 **`/Users/spzhong/cli-task-center`**,后续只在这里维护:
@@ -499,6 +505,20 @@ HTML完整原貌预览要重组完整文档;网络只取缺块,更新后在
499
505
 
500
506
  需要配套 Center 子代理代理接口及 Operator 子代理记录接口。Claude、Codex、Grok 的可展示范围取决于实际协议,Pi 需要子代理扩展;未提供的过程不会伪造成完整记录。本轮未提供直接向子代理发送消息或重启的操作。
501
507
 
508
+ ### 0.6.16(本地候选):列表请求、改动刷新、无轮询与共用实现
509
+
510
+ `CliMsgList` 首次加载、刷新和补拉新加进来的对话共用一个并发上限(2 个),每个对话任务只拉一次详情;列表和对话同时打开选中的对话时,选中的那个也只拉一次。
511
+
512
+ 看板「改动」页签:节点模式此前只在运行状态变成空闲时重读,排队的消息接着跑时一直不刷新;现在两种模式都在每轮(节点每个回合)结束时重读,运行中有工具执行完也重读(节流,最多每 5 秒一次,最后一次变化后一定再读一次),后台时的变化回到前台补读。看板概况不再随每一轮的状态变化重查。
513
+
514
+ 组件里没有定时轮询接口:节点模式的智能体登录、GitHub 登录、模型服务授权、项目上下文「用 AI 刷新」、引导页连接检查改为回到页面时查一次,等待处给「检查状态」类按钮。
515
+
516
+ 智能体流式输出时只画新来的消息,输入框、执行设置和看板(内嵌、外置)不再随每一块输出重画。没人看的对话最多在内存里留 100 个的记录(每个截到最新 300 条),更早的释放,再打开时重新读取;`store.getState().convs` 只保证有正在看的对话。
517
+
518
+ 看板和弹窗里打不开的相对路径按这个对话里的线索补全(唯一匹配直接打开,几个让用户选),见上文「本地文件链接」。
519
+
520
+ 中枢与节点适配共用分段渲染(`ui/useTranscriptWindow`)、转录模型、工具 / 提问 / 输入卡片、Markdown 与文件链接识别、看板联动(`board/linkage`)等实现,节点只保留自己的文件地址与任务状态等差异。两个输入框功能不同,未合并。尚未发布到 npm,安装仍用 `0.6.15`;中枢、节点都不需要改动。
521
+
502
522
  ### 0.6.15(已发布):会话记录加载与智能体间距
503
523
 
504
524
  「正在加载会话」最多等 20 秒:一次性任务的子任务记录迟迟没到时改成说明并给「重新读取」(`store.reconnect(key, { force: true })`,断开重连让中枢重新补发),实时连接一直没收到数据时提示可能是网关缓冲;配套中枢读不到记录时会发 `transcript_unavailable`,组件立即说明。输入框窄于 360px 时(包括 PC 端窄聊天栏)智能体选择紧挨发送按钮,不再被挤到中间。中枢的补发重试需另行部署。