@spzxg/cli-ui 0.6.2 → 0.6.5
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.
- package/CHANGELOG.md +26 -0
- package/README.md +137 -11
- package/dist/cli-ui-embed-BmLN2Jjg.js +43290 -0
- package/dist/{cli-ui-index-BY5i3wId.js → cli-ui-index-D4qfPHMd.js} +2 -2
- package/dist/{cli-ui-jszip.min-BZsUwI-s.js → cli-ui-jszip.min-DC9898pC.js} +1 -1
- package/dist/{cli-ui-jszip.min-m01fexHW.js → cli-ui-jszip.min-DpEl0G1z.js} +2 -2
- package/dist/{cli-ui-xlsx-CpWicJLT.js → cli-ui-xlsx-zs7oEtPj.js} +1 -1
- package/dist/cli-ui.css +32 -1
- package/dist/cli-ui.js +1 -1
- package/package.json +14 -8
- package/src/board/BrowserPane.tsx +160 -74
- package/src/board/ChangesPane.tsx +2 -2
- package/src/board/CliBoard.tsx +79 -50
- package/src/board/FileViewer.tsx +32 -22
- package/src/board/FilesPane.tsx +32 -15
- package/src/board/PanelControls.tsx +28 -0
- package/src/board/blocks.tsx +5 -5
- package/src/board/context.ts +65 -0
- package/src/board/fileOps.ts +26 -3
- package/src/board/fileWatch.ts +88 -0
- package/src/board/folderDownload.ts +30 -14
- package/src/board/panels.ts +33 -0
- package/src/board/textLoad.ts +2 -2
- package/src/board/workspace.ts +38 -9
- package/src/chat/CliChat.tsx +73 -30
- package/src/chat/Composer.tsx +41 -41
- package/src/chat/RunControls.tsx +99 -0
- package/src/chat/configuration.ts +15 -0
- package/src/chat/draft.ts +41 -0
- package/src/chat/export.ts +2 -2
- package/src/components.tsx +13 -0
- package/src/core/blocks.ts +2 -2
- package/src/core/callbacks.ts +8 -0
- package/src/core/client.ts +8 -6
- package/src/core/conversation.ts +3 -3
- package/src/core/id.ts +15 -0
- package/src/core/identity.ts +33 -0
- package/src/core/provider.tsx +24 -14
- package/src/core/store.ts +83 -26
- package/src/core/types.ts +34 -0
- package/src/elements.tsx +135 -29
- package/src/embed.ts +6 -8
- package/src/index.ts +24 -17
- package/src/layout/CliSplit.tsx +1 -1
- package/src/msglist/CliMsgList.tsx +10 -10
- package/src/operator/branchFlow.ts +35 -0
- package/src/operator/index.ts +9 -0
- package/src/operator/liveStream.ts +1 -0
- package/src/operator/node/AgentConnect.tsx +624 -0
- package/src/operator/node/AppearancePanel.tsx +35 -0
- package/src/operator/node/BranchHistory.tsx +67 -0
- package/src/operator/node/BranchNavigator.tsx +36 -0
- package/src/operator/node/BrowserPane.tsx +128 -0
- package/src/operator/node/BrowserPopup.tsx +22 -0
- package/src/operator/node/Chat.tsx +517 -0
- package/src/operator/node/CommandPalette.tsx +213 -0
- package/src/operator/node/Composer.tsx +287 -0
- package/src/operator/node/InsightsView.tsx +831 -0
- package/src/operator/node/Layout.tsx +190 -0
- package/src/operator/node/Markdown.tsx +61 -0
- package/src/operator/node/Modal.tsx +179 -0
- package/src/operator/node/NeedsYouMenu.tsx +54 -0
- package/src/operator/node/OnboardingWizard.tsx +250 -0
- package/src/operator/node/Orchestrator.tsx +634 -0
- package/src/operator/node/ProjectLanding.tsx +86 -0
- package/src/operator/node/ProjectsColumn.tsx +137 -0
- package/src/operator/node/ProviderAuth.tsx +561 -0
- package/src/operator/node/RunControls.tsx +2 -0
- package/src/operator/node/RunSwitch.tsx +113 -0
- package/src/operator/node/Services.tsx +245 -0
- package/src/operator/node/SessionRail.tsx +260 -0
- package/src/operator/node/SessionView.tsx +288 -0
- package/src/operator/node/SettingsView.tsx +690 -0
- package/src/operator/node/TaskBoard.tsx +352 -0
- package/src/operator/node/TaskChanges.tsx +530 -0
- package/src/operator/node/TaskHero.tsx +50 -0
- package/src/operator/node/TasksColumn.tsx +200 -0
- package/src/operator/node/Terminal.tsx +143 -0
- package/src/operator/node/Transcript.tsx +463 -0
- package/src/operator/node/ViewFile.tsx +79 -0
- package/src/operator/node/Welcome.tsx +101 -0
- package/src/operator/node/WorktreePrune.tsx +333 -0
- package/src/operator/node/agents.ts +58 -0
- package/src/operator/node/api.ts +40 -0
- package/src/operator/node/boardBackend.ts +80 -0
- package/src/operator/node/boardEvents.ts +22 -0
- package/src/operator/node/boardInteraction.ts +15 -0
- package/src/operator/node/boardState.ts +57 -0
- package/src/operator/node/boardWorkspace.ts +12 -0
- package/src/operator/node/branchFlow.ts +1 -0
- package/src/operator/node/composerDraft.ts +52 -0
- package/src/operator/node/fileLinks.ts +81 -0
- package/src/operator/node/format.ts +290 -0
- package/src/operator/node/github.tsx +234 -0
- package/src/operator/node/icons.tsx +88 -0
- package/src/operator/node/liveStream.ts +270 -0
- package/src/operator/node/modals.tsx +720 -0
- package/src/operator/node/navHistory.ts +70 -0
- package/src/operator/node/persist.ts +26 -0
- package/src/operator/node/protocol/agents/optIn.ts +9 -0
- package/src/operator/node/protocol/agents/types.ts +394 -0
- package/src/operator/node/protocol/approvalFailure.ts +77 -0
- package/src/operator/node/protocol/authFailure.ts +66 -0
- package/src/operator/node/protocol/customModels.ts +23 -0
- package/src/operator/node/protocol/events.ts +13 -0
- package/src/operator/node/protocol/features.ts +70 -0
- package/src/operator/node/protocol/internalUsage.ts +1 -0
- package/src/operator/node/protocol/promptLimits.ts +52 -0
- package/src/operator/node/protocol/storageRetention.ts +13 -0
- package/src/operator/node/protocol/types.ts +332 -0
- package/src/operator/node/protocol/usageLimit.ts +72 -0
- package/src/operator/node/shared.tsx +89 -0
- package/src/operator/node/transcriptModel.ts +129 -0
- package/src/operator/node/types.ts +296 -0
- package/src/operator/node/useGlobalEvents.ts +97 -0
- package/src/operator/node/useOrchestrator.ts +696 -0
- package/src/operator/node/usePrefs.ts +114 -0
- package/src/operator/node/useRecaps.ts +91 -0
- package/src/operator/node/useTaskStream.ts +279 -0
- package/src/operator.base.css +1798 -0
- package/src/operator.css +186 -16
- package/src/styles.css +20 -0
- package/src/ui/Markdown.tsx +7 -2
- package/src/ui/Popover.tsx +77 -0
- package/src/ui/TextBlock.tsx +3 -3
- package/src/ui/Transcript.tsx +10 -8
- package/src/ui/fileLinks.ts +6 -0
- package/src/ui/format.ts +1 -1
- package/src/ui/shared.tsx +1 -1
- package/src/ui/transcriptModel.ts +2 -2
- package/dist/cli-ui-embed-6IJ_jRVh.js +0 -41223
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
## 0.6.5 — 2026-11-05
|
|
4
|
+
|
|
5
|
+
- 文件预览按后端、任务和路径隔离,切换不沿用旧正文、选区或短期链接。
|
|
6
|
+
- 文件下载及图片、PDF、HTML、Word 的内存读取校验实际字节数,及时响应取消;ZIP 取消/失败后停止剩余读取,不保存迟到结果。
|
|
7
|
+
- ZIP 失败报告避让用户同名文件;`FolderResult.failedListName` 可选返回真实报告路径。
|
|
8
|
+
- 原生文件事件新增可选 `FileEntry.changeToken`,用于断线恢复时发现同大小、同 mtime 的改写;不是内容版本锁。
|
|
9
|
+
- 看板状态和自动背景原子更新后通知业务;回调内导航保持顺序,新增业务监听可恢复已停止的连接,清理期间重新订阅不进入失效记录。
|
|
10
|
+
- 来源任务文件的选中文字引用明确包含工作区身份,关闭自动背景也保留来源。
|
|
11
|
+
- 浏览器复制引用保留复制时页面来源;远端弹窗错误可重试,输入坐标使用实际显示帧,取消拖动或切换控制权清除旧按压。
|
|
12
|
+
- 首帧未就绪不发送鼠标输入;节点浏览器状态流显示认证、接口和临时断线错误,保留共享连接的降级恢复;自定义 browserEvents 可选提供 onError 通知。
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
## 0.6.4 — 2026-11-05
|
|
16
|
+
|
|
17
|
+
- 统一 `CliMsgList`、`CliChat`、`CliBoard` 与完整 Operator 工作区;React、Web Component、embed 使用同一源码,宿主保留协议适配和服务端能力。
|
|
18
|
+
- 文件/浏览器/改动模块可独立关闭和重新打开,改动默认关闭;聊天文件链接可唤起看板,来源任务身份随引用与文件页签保留。
|
|
19
|
+
- 聊天默认附带当前文件、打开页签、最近访问与看板显示状态的元信息背景;支持取消本次附带,手动引用与任务派生保持独立。
|
|
20
|
+
- 新增工作区 `watch/stat/context` 及文件/监听/浏览状态业务回调;原生节点提供文件事件,旧中枢明确降级为可见文件轮询。相同尺寸和 mtime 的原生改写仍触发预览重读。
|
|
21
|
+
- 修复多看板抢占当前文件、迟到恢复覆盖正在使用的看板及历史丢失;重新点击已选文件可重新激活上下文。
|
|
22
|
+
- 修复浏览器重连、接管交还和任务切换时旧输入/动作污染新画面;网页确认弹窗等待远端确认后关闭。
|
|
23
|
+
- 文件监听区分永久错误、认证/限流和暂时断线;保留 WebSocket → SSE 降级,资源恰好释放一次,限制客户端跟踪元数据并准确报告不完整覆盖。
|
|
24
|
+
- 自定义后端文件读取增加最终大小校验和及时取消;业务订阅的文件、看板元信息彼此隔离。
|
|
25
|
+
|
|
26
|
+
文件预览仍为只读,文件改写由 AI/服务端执行。文件事件是当前状态通知,非持久审计日志或不可变内容版本。旧中枢轮询与扫描上限见 README。此版本为本地构建包;npm 发布需 registry 登录。
|
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# @spzxg/cli-ui
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
相互联动的三个组件,支持中枢对话和完整 Operator 节点工作区。缺省参数使用中枢协议;`operator` 参数承接节点的完整任务与 Git 工作流。两种后端的能力不同,不显示后端不支持的执行控制。
|
|
4
4
|
|
|
5
5
|
| 组件 | 作用 |
|
|
6
6
|
| --- | --- |
|
|
@@ -91,12 +91,14 @@ location /api/center/ {
|
|
|
91
91
|
|
|
92
92
|
- Provider 里的组件不要再传 `jobId` / `taskId`(列表不传 `selectedId`):传了的组件只看自己那个,不跟着切。
|
|
93
93
|
- Web Component:同一个 `group`,不写 `job-id`;从外面打开某个对话给任意一个元素写 `selected-id="job_x"`,改它就一起切。
|
|
94
|
-
- 不用 Provider
|
|
94
|
+
- 不用 Provider 时,完整联动仍需传同一个稳定的 `store`;仅同步 `jobId` / `selectedId` 不会共享文件打开和引用事件。页面可在 `onSelect`、`job_change` 中同步受控选择:
|
|
95
95
|
|
|
96
96
|
```tsx
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
<
|
|
97
|
+
// React 组件内;账号变化时重建 store,并取消旧账号的业务订阅。
|
|
98
|
+
const store = useMemo(() => createCliStore({ baseUrl: "/api/center", namespace: accountId }), [accountId]);
|
|
99
|
+
<CliMsgList store={store} jobIds={ids} selectedId={key} onSelect={setKey} onNew={() => setKey(null)} />
|
|
100
|
+
<CliChat store={store} jobId={key} onEvent={(e) => e.type === "job_change" && setKey(e.key)} />
|
|
101
|
+
<CliBoard store={store} jobId={key} />
|
|
100
102
|
```
|
|
101
103
|
|
|
102
104
|
## 右侧看板
|
|
@@ -126,7 +128,7 @@ location /api/center/ {
|
|
|
126
128
|
</CliCenterProvider>
|
|
127
129
|
```
|
|
128
130
|
|
|
129
|
-
-
|
|
131
|
+
- 页签:默认文件(目录、预览、下载)和受支持的浏览器;改动(diff,只读)默认关闭,可手动添加。`tabs={["files","changes"]}` 只设置初始打开的模块和顺序;用户仍可从「管理看板模块」打开浏览器。`availableTabs` 才限制允许使用的模块。所有模块都能单独关闭、重新打开,`tabs={[]}` 表示初始全部关闭。
|
|
130
132
|
- 预览:Markdown、代码、文本、CSV、图片、PDF、HTML(沙箱 iframe)、Word(.docx,mammoth 转 HTML 放进无脚本沙箱)。其他类型下载。
|
|
131
133
|
- 自动同步:实时流有进展就刷新(节流 1.5 秒),运行中每 15 秒(`pollMs`)兜底再刷一次;改过的文件标「有更新」,打开着的文件改了自动重读。
|
|
132
134
|
- 没有看板时,对话自己弹窗预览(`<CliChat fileOpen="auto|board|modal|link">`)。宿主也可以 `store.openInBoard(jobId, { kind: "file", path })`。
|
|
@@ -136,7 +138,7 @@ location /api/center/ {
|
|
|
136
138
|
- 引用到对话:文件预览、浏览器的「引用到对话」把它带进下一条消息(`store.addRef`),对话输入框上方显示、可去掉;发出时合成「看板上下文」附件。自定义页签(`extraTabs`)的 `quote` 同理——终端之类的交互以后都走这条路进对话。
|
|
137
139
|
- 多个文件页签:点开的文件各占一个页签(最多 8 个,再开关掉最早的),可关闭(× 或鼠标中键),按对话记在 sessionStorage,刷新后还在。
|
|
138
140
|
- 选中引用:在预览里选中文字浮出「引用到对话」(Markdown / 代码 / 文本 / 表格 / HTML / Word 及其源文件;HTML、Word 在沙箱 iframe 里,预览用 srcdoc 插一段选区小脚本报给宿主,页面自己的脚本仍不执行);在浏览器网页里复制(⌘C / Ctrl+C)后提示里也有「引用到对话」。
|
|
139
|
-
-
|
|
141
|
+
- 被动浏览背景:每条消息自动附带当前文件、仍打开的页签和最近40个实际访问文件的元信息;手机回聊天/收起看板后仍保留,并标记收起状态。输入框可查看摘要、取消本次附带;成功发送后恢复默认。不会自动读取文件正文,也不替换手动引用。`CliChat passiveContext={false}`/`CliBoard autoQuoteOpenFile={false}` 关闭;节点 `board={{autoContext:false}}`。`workspace.context()` 读取完整浏览快照,`config.refs` 继续控制旧式引用的显示。
|
|
140
142
|
- 浏览器弱网:操作没送达时提示(不自动重发,免得点两次);接管时发了操作 8 秒画面没变化提示并给「重连画面」;按住鼠标切走窗口自动补发松开;地址栏自动补 `https://`。
|
|
141
143
|
- 数据都经中枢:`/api/jobs/:id/board`、`/files`、`/files/raw/<路径>`、`/diff`、`/browser`(+ `events` / `frames` / `input`)。
|
|
142
144
|
- 链路、交互、故障与重试的设计见 [BOARD-DESIGN.md](BOARD-DESIGN.md)。
|
|
@@ -236,11 +238,11 @@ Agent 回复里指向本地文件的链接(`report.md`、`src/a.ts:12`、`file
|
|
|
236
238
|
|
|
237
239
|
| 工程 | 放什么 | 和组件的关系 |
|
|
238
240
|
| --- | --- | --- |
|
|
239
|
-
| `operator-oss` | 执行节点(Operator)+ **组件源码** `packages/cli-ui` |
|
|
241
|
+
| `operator-oss` | 执行节点(Operator)+ **组件源码** `packages/cli-ui` | 改组件都在这里改;界面、交互和共享样式均在组件包维护;当前工程通过本地包依赖使用组件 |
|
|
240
242
|
| `clawbizx` | 业务协同工程,统一发布 `@spzxg/*` 包 | `packages/cli-ui` 是指向 `../../operator-oss/packages/cli-ui` 的链接,`scripts/publish-shared-packages.sh` 从这里发布到 npm |
|
|
241
243
|
| `cli-task-center` | 中枢(组件的数据都来自它) | 组件的使用文档在中枢 API 文档的「前端组件」页签(`backend/public/api.html`) |
|
|
242
244
|
|
|
243
|
-
两个仓库要并排放在同一个目录下(`~/operator-oss`、`~/clawbizx
|
|
245
|
+
两个仓库要并排放在同一个目录下(`~/operator-oss`、`~/clawbizx`),链接才有效。组件可独立安装;Operator 使用本地 `file:packages/cli-ui` 依赖,React 使用宿主的 peer dependency:
|
|
244
246
|
|
|
245
247
|
```bash
|
|
246
248
|
cd operator-oss/packages/cli-ui
|
|
@@ -248,7 +250,7 @@ npm install # 第一次
|
|
|
248
250
|
npm test # 测试
|
|
249
251
|
npm run lint # 类型检查
|
|
250
252
|
npm run demo # 假中枢 + 演示页 http://localhost:12790(?mode=chat / ?mode=wired / elements.html;看板用 e2e-local.sh 的 ?mode=board,单独集成看 blocks.html?job=…,先 build:embed)
|
|
251
|
-
npm run css:sync #
|
|
253
|
+
npm run css:sync # 从 src/operator.base.css 生成作用域样式
|
|
252
254
|
npm run build:embed # 第三方一体化产物 dist/cli-ui.js + cli-ui.css
|
|
253
255
|
bash demo/e2e-local.sh # 连真实 center 联调:本地 center + 假节点 + 一次性本地库,演示页代理过去
|
|
254
256
|
bash demo/e2e-local.sh stop
|
|
@@ -259,4 +261,128 @@ bash demo/e2e-real.sh stop
|
|
|
259
261
|
cd clawbizx && bash scripts/publish-shared-packages.sh
|
|
260
262
|
```
|
|
261
263
|
|
|
262
|
-
|
|
264
|
+
演示使用 `demo/mock-center.mjs` 的内存数据。Operator 的 Next 构建和 Docker 镜像现已包含组件包;不要恢复旧的 packages 全目录排除规则。
|
|
265
|
+
|
|
266
|
+
|
|
267
|
+
## 完整 Operator 工程与唯一维护位置
|
|
268
|
+
|
|
269
|
+
```tsx
|
|
270
|
+
"use client";
|
|
271
|
+
import { OperatorWorkspace } from "@spzxg/cli-ui/operator";
|
|
272
|
+
import "@spzxg/cli-ui/operator.css";
|
|
273
|
+
import "@spzxg/cli-ui/styles.css";
|
|
274
|
+
export default function App() { return <OperatorWorkspace />; }
|
|
275
|
+
```
|
|
276
|
+
|
|
277
|
+
`OperatorWorkspace` 使用 `CliMsgList`、`CliChat`、`CliBoard` 的 `operator` 参数组合,三者由同一个 `useOrchestrator` 控制项目、选中任务、运行状态、配置、分支和事件连接。宿主只保留路由、服务端和以上入口。节点的完整客户端实现位于 `src/operator/node`;根工程原有 `app/orchestrator/*`、Markdown、图标、终端和 Git 面板路径均为兼容导出,不再维护另一份界面。
|
|
278
|
+
|
|
279
|
+
直接使用 `operator` 参数时,宿主负责传入同一个项目/任务控制器及回调,并把三个组件放入 `.cli-ui` 容器,加载上述样式。完整工作区需要 Operator 的 `/api/*`、`/live` 和 PTY 服务;它不是脱离节点服务器的离线演示。
|
|
280
|
+
|
|
281
|
+
| 能力 | 中枢默认模式 | Operator 模式 |
|
|
282
|
+
| --- | --- | --- |
|
|
283
|
+
| 列表、对话、文件/浏览器看板联动 | 同一 `CliCenterProvider`/store | 同一工作区控制器和多路复用实时连接 |
|
|
284
|
+
| 附件、长文本、引用 | 文档转文字与看板/消息引用 | 图片/文本上传、消息引用、草稿与来源恢复 |
|
|
285
|
+
| 模型、推理、权限/规划 | 不伪造中枢没有提供的配置接口 | 能力列表驱动,等待真实 PATCH 成功再允许发送 |
|
|
286
|
+
| `@` 多来源分支 | 中枢协议目前未提供独立 Git 派生接口 | 同项目已完成任务,每个来源一个独立 worktree/分支,固定源提交 |
|
|
287
|
+
| 源对话结尾 → 分支选择 → 子对话 | 不虚构分支数据 | 支持横向切换和递归派生,来源历史只读 |
|
|
288
|
+
| Git 同步、合并、PR、冲突修复 | 只读改动看板 | 保留原完整工作流 |
|
|
289
|
+
| 看板/列表、依赖、自动启动、建议、回顾、设置、认证、用量、终端和服务 | 由宿主业务提供 | 保留在完整工作区中 |
|
|
290
|
+
|
|
291
|
+
`src/operator.base.css` 是共享样式源,`src/operator.css` 是 `css:sync` 的生成结果;根工程 `app/globals.css` 只导入包的样式。迁移与备份清单见仓库的 `docs/CLI_UI_MERGE.md`。
|
|
292
|
+
|
|
293
|
+
当前 npm 的 `0.6.2` 已发布,不能覆盖重发。本地此次版本为 `0.6.5`,需要通过组件测试、嵌入构建、真实工程构建和浏览器回归,再发布新的补丁版本;不要运行会连带发布其他共享包的批量脚本。
|
|
294
|
+
|
|
295
|
+
|
|
296
|
+
### 文件、对话与浏览器看板联动
|
|
297
|
+
|
|
298
|
+
```tsx
|
|
299
|
+
// 只设置初始可见状态;用户仍能手动打开文件、改动等模块。
|
|
300
|
+
<OperatorWorkspace board={{ tabs: ["browser"], defaultTab: "browser" }} />
|
|
301
|
+
// 中枢组件用相同规则;三个组件放在同一个 Provider 中。
|
|
302
|
+
<CliBoard tabs={["browser"]} defaultTab="browser" />
|
|
303
|
+
// 只有明确限制能力时才设置 availableTabs。
|
|
304
|
+
<CliBoard tabs={["browser"]} availableTabs={["browser", "files"]} />
|
|
305
|
+
```
|
|
306
|
+
|
|
307
|
+
Web Component 对应 `tabs="browser"`、`available-tabs="browser,files"`;`tabs=""` 表示初始全部关闭。默认配置与用户手动开关分开,模块偏好按任务/配置保存在会话存储中。
|
|
308
|
+
|
|
309
|
+
对话里的本地文件链接及文件形态的行内代码会打开右侧文件预览;看板收起或在手机上时自动展开/切换。Ctrl/⌘ 点击仍可独立打开。来源历史文件使用来源任务的文件接口,不切换当前任务或分支。文件、选区、网页和网页复制文字可引用回同一个草稿,保留原有输入;手机引用后返回对话。
|
|
310
|
+
|
|
311
|
+
浏览器关闭页签只隐藏模块和断开画面连接,不结束浏览器任务;重新打开后连接当前状态。「关闭浏览器」才调用实际关闭接口。新浏览器交接能唤起隐藏的模块;旧历史交接、已经消费的打开请求和其他任务的事件不会反复唤起。浏览器模块与独立窗口共用画面/输入实现,保留触摸、键盘/输入法、网页弹窗、剪贴板、重连、接管交还,并保留节点登录配置、弹出窗口和在节点屏幕显示操作。
|
|
312
|
+
|
|
313
|
+
### v0.6.3 历史验收(当前版本见 CHANGELOG)
|
|
314
|
+
|
|
315
|
+
组件 308 项测试、lint、嵌入构建,以及宿主生产构建已通过;宿主 873 项测试、24 项常规真实页面回归和 1 项真实 ego lite 看板完整流程通过。宿主默认跳过的 17 项底层浏览器/playbook 环境测试,本轮未重跑;此前单独执行的记录保留在验收包中。未使用付费模型账号测试,不把模拟驱动配置测试等同于所有真实 CLI 环境验证。
|
|
316
|
+
|
|
317
|
+
该版本已在本地准备,当前执行账户未登录 npm,尚未发布。旧 UI 已归档,47 个兼容入口由宿主 `npm run check:components` 检查;今后 UI 改动只在组件包中维护。
|
|
318
|
+
|
|
319
|
+
|
|
320
|
+
### 维护前提:组件为唯一标准
|
|
321
|
+
|
|
322
|
+
开发、修复和发布均以三个公开组件为单位。React/Web Component/embed 统一调用 `src/components.tsx`;文件预览和浏览器独立窗口同样在本包维护。旧界面只留备份和转发,不再改旧工程实现。
|
|
323
|
+
|
|
324
|
+
宿主普通 `dev`、`build`、`test` 会先执行来源审计:错误转发、新增包外 UI/样式、组件反向引用宿主/备份、分发入口绕过组件都会失败。审计自身有 7 项回退回归;本包的具体维护规则见仓库内 `packages/cli-ui/AGENTS.md`。
|
|
325
|
+
|
|
326
|
+
|
|
327
|
+
### 高可用接入与恢复
|
|
328
|
+
|
|
329
|
+
配置保存锁、上传中断恢复和结束确认均绑定任务/会话身份,切走再回来不会提前发送或误操作其他会话。看板正常断流自动重连,主动关闭停连;卸载最后实时消费者会释放连接,卸载文件模块取消 ZIP 下载。宿主事件回调异常记录在控制台,不能阻断组件终态更新或其他通知。
|
|
330
|
+
|
|
331
|
+
Web Component 组内唯一配置源的 URL、token、line、namespace 和新会话配置会完整继承,包括晚挂载或配置旋转;明确不同凭据各用独立 store。继承配置出现歧义时显示错误,调用方需要补齐连接属性,不能依赖“第一个组件”的身份。
|
|
332
|
+
|
|
333
|
+
标准连接按身份指纹隔离草稿、文件页签及当前 UI,不把原始 token 写入存储键。同配置刷新可恢复,换凭据后旧内容不会自动附到新身份。Cookie 鉴权宿主应提供按账号区分的 namespace,并在账号切换后重建 Provider/client。自定义 client 对象应保持稳定;不同对象保守隔离,不能只凭 URL 推断其隐藏的认证身份。历史没有身份标签的草稿保留在原分区,不自动搬入新增的认证分区。
|
|
334
|
+
|
|
335
|
+
完整问题与验证边界见仓库 `docs/CLI_UI_RELIABILITY.md`。本轮未进行生产长期浸泡、持续并发容量或付费模型账号验收;部署可用率需结合实际环境监测。
|
|
336
|
+
|
|
337
|
+
|
|
338
|
+
### 文件通知 → 云端读取 → 业务交付
|
|
339
|
+
|
|
340
|
+
```tsx
|
|
341
|
+
<CliCenterProvider store={store}
|
|
342
|
+
onFilesChange={event => handleChanges(store.workspace(event.jobId), event)}
|
|
343
|
+
onFilesWatch={status => showWatchStatus(status)}>
|
|
344
|
+
<CliMsgList /><CliChat /><CliBoard />
|
|
345
|
+
</CliCenterProvider>
|
|
346
|
+
```
|
|
347
|
+
|
|
348
|
+
也可只在 `CliBoard` 上监听 `onFilesChange`;或无 UI 地订阅:
|
|
349
|
+
|
|
350
|
+
```ts
|
|
351
|
+
const ws = store.workspace("job_x#task_y");
|
|
352
|
+
const stop = ws.watch(async event => {
|
|
353
|
+
for (const change of event.changes) {
|
|
354
|
+
if (change.kind === "deleted") { removeBusinessFile(change.path); continue; }
|
|
355
|
+
const info = await ws.stat(change.path);
|
|
356
|
+
const blob = await ws.readFile(change.path); // 也可 readText()
|
|
357
|
+
receiveBusinessFile(info, blob);
|
|
358
|
+
}
|
|
359
|
+
}, { onStatus: status => showWatchStatus(status) });
|
|
360
|
+
// 业务生命周期结束时 stop()。
|
|
361
|
+
const view = ws.context(); // current / opened / history / visible / sourceId
|
|
362
|
+
```
|
|
363
|
+
|
|
364
|
+
上述业务函数由集成方实现,组件不会自动上传到外部服务。通知是当前状态变化,读取可能遇到后续改写/删除,应处理错误与密集通知;不能将 revision 当成不可变内容版本锁。
|
|
365
|
+
|
|
366
|
+
节点使用 `createOperatorWorkspace(taskId)`(从 `@spzxg/cli-ui/operator` 导入),或 `<OperatorWorkspace board={{onFilesChange, onFilesWatch}} />`。接口包含 watch/stat/readText/readFile/context/open。`onBoardContextChange` 提供浏览状态;它与文件内容变化分开。
|
|
367
|
+
|
|
368
|
+
Web Component 发出 `cli-files-change`、`cli-files-watch`、`cli-board-context`,detail 与 React 事件一致;也可 `el.workspace(id).watch(...)`。通用 `cli-event` 会包含同类事件,不要重复处理两个入口。`watch-files="false"` 关闭自动订阅,`passive-context="false"` 关闭聊天自动背景。
|
|
369
|
+
|
|
370
|
+
事件含 `jobId`、`changes[{kind,path,file?,previous?}]`、`revision?`、`mode`、`coverage`、`complete`;创建/修改/删除分别为 created/modified/deleted,初始快照不冒充全部新建。多个组件与业务监听共享连接,最后取消时释放;关闭模块不会关闭会话持有的订阅。
|
|
371
|
+
|
|
372
|
+
节点支持实际工作区文件事件(含隐藏业务文件,排除Git/Operator内部状态与symlink),经 `/live` 复用。旧中枢尚无文件事件代理,明确降级为约15秒目录快照比对:`mode=poll, coverage=listed-files, complete=false`,不保证隐藏项/瞬时变化/同metadata改写;完整推送需后端实现可选 `BoardBackend.watchFiles`。原生清单默认上限100000项,不完整/异常会明确报告resync;精准路径事件不受初始清单截断遮蔽。完整协议与业务接入见仓库 `docs/CLI_UI_BOARD_FLOW.md`。
|
|
373
|
+
|
|
374
|
+
### v0.6.4 接入加固
|
|
375
|
+
|
|
376
|
+
多个看板按最近实际操作选择当前文件,历史/远程 metadata 同步不抢占活动看板。文件和浏览状态的业务事件使用独立副本;监听可区分永久错误、认证/限流和暂时断线,保留 WebSocket → SSE 恢复。客户端文件元信息跟踪上限为 100000;超限明确 `complete=false`,完整且未超限快照才恢复。
|
|
377
|
+
|
|
378
|
+
`workspace.readFile()` 对自定义后端也校验实际字节数并及时响应取消,后端仍应正确实现 AbortSignal 以释放内部资源。浏览器重连、接管交还和切换任务不等待或重放旧会话输入。当前看板为只读预览,文件编辑由 AI/服务端执行,再通过事件刷新和交付给业务方。
|
|
379
|
+
|
|
380
|
+
本地版本 `0.6.5`,更新记录见随包 `CHANGELOG.md`。发布验收记录见仓库 `docs/CLI_UI_RELEASE_0.6.5.md`;本地打包不等于 npm 已发布。
|
|
381
|
+
|
|
382
|
+
### v0.6.5 文件和业务交付加固
|
|
383
|
+
|
|
384
|
+
文件预览按 backend/任务/路径隔离;下载和预览读取检查实际字节数,取消 ZIP 不保存迟到结果。部分失败时 `zip()`/`downloadFolder()` 的可选 `failedListName` 返回实际报告名,避让同名用户文件。
|
|
385
|
+
|
|
386
|
+
原生文件通知的可选 `FileEntry.changeToken` 用于重连对账,可识别同大小并恢复 mtime 的改写;需同步部署支持该字段的节点服务端。它不是不可变内容版本或审计日志。
|
|
387
|
+
|
|
388
|
+
看板与自动背景一起更新后通知业务,回调内继续导航保持顺序;显式选区引用携带来源任务身份。浏览器复制引用固定复制时页面,取消拖动、控制权切换、弹窗错误和异步帧解码均保持正确状态。
|