@pactor-app/chat 1.16.0 → 1.17.0

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/README.md CHANGED
@@ -71,9 +71,9 @@ driver.complete();
71
71
  - **`registerCapabilityAction(actions, { capabilities, permission?, confirm? })`**:注册 `capability` 动作,执行链 registry → permission → confirm(`risk: 'high'` 且注入 confirm 时;取消返回 `{ ok: true, skipped: true }`,未注入 confirm 受控拒绝)→ execute。DSL 侧:`{ action: 'capability', params: { name, params } }`。
72
72
  - **`createChatRuntime({ safeRegistry, capabilities?, permission?, permissionStore?, confirm?, user? })`**:组装 Chat DSL 渲染运行时(Safe Registry + 内置动作 + capability 动作 + 权限适配器);`buildChatScope({ conversation, message, params })` 组装 chat 作用域(`user` 经 RuntimeContext 注入)。
73
73
  - **`<ChatView store transport? onSend? safeRegistry? capabilities? permission? confirm? conversationId? user? params? greeting? subtitle? suggestions?>`**:消息列表 + Composer。发送时 `onSend` 回调先行,注入 `transport` 时同时驱动一轮 turn。空会话渲染 `<EmptyState>`:问候语(`--pactor-chat-font-display` 衬线展示字体)+ 副标题 + `suggestions` 起始建议(字符串或 `{ label, prompt? }`,点击即发送,空数组不渲染建议区)。Composer 扩展 props(`attachments` / `onAttachmentsChange` / `onAttachFiles` / `onAttachmentClick` / `toolbarStart` / `toolbarEnd` / `onMentionTrigger` / `onPlusMenu`)原样透传给内建 Composer,语义见下方 `<Composer>`。
74
- - **`<MessageBubble>` / `<PartRenderer>`**:按 role 区分气泡;parts 按类型渲染(text / markdown / dsl / error 附重试入口 / status / artifact 产出物卡片);thinking 折叠卡与 tool-call / tool-result 配对轨迹移交 `<ActivityTrace>`。
74
+ - **`<MessageBubble>` / `<PartRenderer>`**:按 role 区分气泡;parts 按类型渲染(text / markdown / dsl / error 附重试入口 / status / artifact 产出物卡片——整卡可点击:着色图标盒 + 标题 + 元信息行「尺寸 · 类型」+ 右上箭头,图标经 `resolveArtifactIcon` 按扩展名优先、kind 兜底解析并带 tone 着色档位,与面板下拉 / 目录树一致;卡片即 `ChatArtifactCard` 内部组件,DSL 片段与 fallback 共用,包入口导出可直接复用;同一消息内连续 artifact part 归并为卡片组,多于 4 个收起为前 4 张 + 「展开 / 收起」与「查看所有产物(n) ›」(打开面板定位产物目录视图,回调 `onOpenArtifactList`));thinking 折叠卡与 tool-call / tool-result 配对轨迹移交 `<ActivityTrace>`;assistant 终态消息底部展示时间戳(当天 HH:mm、非当天带日期,`formatMessageTime`;流式中与无 createdAt 的历史消息不展示,user / system 不展示)。
75
75
  - **`<ActivityTrace>`**:流式状态头(动画图标 + 呼吸文案 + 秒级计时,结束定格)+ 配对工具轨迹条目(单行:名称 + 参数摘要 + 状态图标,展开显示参数与结果/错误)+ thinking 折叠卡(与工具列表为独立块);状态头统一折叠/展开全部内容——流式展开 → 答案阶段自动折叠(单向闩锁:折叠一次后 mode 回跳不重新自动展开,防闪烁)→ 用户 pin 后不再自动变更(按消息记忆)。
76
- - **`<ArtifactPanel artifact? artifacts? inspector? artifactViewers? onClose? onSelectArtifact?>`**:产出物预览面板——标题栏(可选目录列表钮 + 标题 + kind 角标 + 下载钮 + 关闭钮)+ 内容区。内建渲染 markdown / code / text / dsl(Safe Registry 活预览)+ 图片类文件(png / jpg / svg / webp 等,经 `fileType` 或 title 扩展名识别,svg 支持原始标记);`artifactViewers` 按键(扩展名 / kind)对特定格式自定义预览,优先内建;多产物时 header 下沿 tab 条切换,左端目录钮展示产物目录列表(按产物 id 的 `/` 分段建树);下载钮把当前产物存为本地文件(dsl 存 JSON,图片 URL fetch 失败降级新标签);桌面固定宽右栏(默认宽 = `--pactor-chat-content-width`,拖拽下限 `--pactor-chat-inspector-min-width` 320px),背景 `--pactor-chat-inspector-bg` 略深于聊天区,窄屏覆盖抽屉。
76
+ - **`<ArtifactPanel artifact? artifacts? inspector? artifactViewers? onClose? onSelectArtifact?>`**:产出物预览面板——标题栏(可选目录列表钮 + 标题 + kind 角标 + 下载钮 + 关闭钮)+ 内容区。内建渲染 markdown / code / text / dsl(Safe Registry 活预览)+ 图片类文件(png / jpg / svg / webp 等,经 `fileType` 或 title 扩展名识别,svg 支持原始标记);`artifactViewers` 按键(扩展名 / kind)对特定格式自定义预览,优先内建;多产物时 header 文件名处为切换下拉,左端目录钮展示产物目录列表(目录视图下返回钮隐藏、标题显示"产物目录");下载钮把当前产物存为本地文件(dsl 存 JSON,图片 URL fetch 失败降级新标签);桌面固定宽右栏(默认宽 = `--pactor-chat-content-width`,宽度夹取 `--pactor-chat-inspector-min-width` 480px ~ host 宽 2/3),背景 `--pactor-chat-inspector-bg` 略深于聊天区,窄屏覆盖抽屉。
77
77
  - **`ArtifactStore` / `collectArtifacts` / `mergeArtifacts`**(零 React):产出物列表容器——`open` 按 id upsert 并激活、`list()`(引用稳定)/ `activate(id)` / `update(patch)`(补丁激活项)/ `close()`(只关面板,列表保留)/ `subscribe`;`collectArtifacts(messages)` 从消息流归集 ready 产出物(tabs / 目录列表默认数据源),`mergeArtifacts(stream, opened)` 合并归集与打开记录(store 补丁版本优先)。
78
78
  - **`downloadArtifact` / `resolveArtifactFilename` / `buildArtifactBlob`**(产物下载):文件名按 title(无扩展名补 fileType / kind 缺省);文本类存 UTF-8 Blob,dsl 存格式化 JSON,svg 原始标记存 image/svg+xml,图片 http(s) URL fetch 取回(失败降级新标签打开)。
79
79
  - **`<MessageActions>`**:消息操作条(hover 显现),数据驱动渲染——`actions` 缺省为 `['copy', 'regenerate', 'retry', 'edit']`:复制(`collectMessageText` 汇总文本写入剪贴板)、末条 completed assistant 重新生成、user 消息气泡内联编辑重发(确认 → 截断 + 重跑,取消不改 store)、error 消息重试。传入数组时严格按数组渲染(数组即真相),内建动作可按字段覆盖 label / icon / roles / visibleWhen,自定义动作经 `callService(service, { actionId, message })` 派发;图标名走 `MESSAGE_ACTION_ICONS` 白名单(未知名渲染占位图标)。详见下文「消息操作条:messageActions」。
@@ -136,9 +136,9 @@ body:
136
136
  ```
137
137
 
138
138
  - **菜单**:`menu: ChatMenuItem[]`(`key / label / icon? / badge? / disabled? / group?`)驱动内建侧栏;`icon` 为字符串名,映射内置 lucide 子集(plus / chat / history / settings / star / search / user / folder),未知名渲染占位圆点不抛错;`group` 渲染分组标题行;`activeMenuKey` 为受控 prop,典型用法是 `${state.x}` 绑定 + `events.onMenuSelect` 调 `setState` 闭环;disabled 项不触发 `onMenuSelect`。
139
- - **Header 三层**:`title` 标量 → `headerExtra?: DslNode | ReactNode`(标题右侧槽)→ `header?: DslNode | ReactNode`(整体替换内建 header);`showHeader: false` 关闭。DslNode 槽仅在页面运行时(DslRenderer)上下文内经 `useRenderer().renderChildren` 渲染;纯 React 场景传 ReactNode,误传 DslNode 时告警并跳过(不抛错)。
139
+ - **Header 三层**:`title` 标量 → `headerExtra?: DslNode | ReactNode`(标题右侧槽)→ `header?: DslNode | ReactNode`(整体替换内建 header);`showHeader: false` 关闭。header 渲染为全宽容器(产物面板 host / with-header 包裹层)的直接子级,不随对话列限宽——产物面板调宽时保持通栏。DslNode 槽仅在页面运行时(DslRenderer)上下文内经 `useRenderer().renderChildren` 渲染;纯 React 场景传 ReactNode,误传 DslNode 时告警并跳过(不抛错)。
140
140
  - **侧栏槽**:`sidebar?: DslNode | ReactNode` 提供时整体替代内建菜单侧栏(仍以 AppShell 承载)。
141
- - **产出物面板**:`artifact` / `panelOpen` 受控 props(典型 `${state.x}` 绑定),事件 `onArtifact`(part 就绪)/ `onOpenArtifact`(卡片打开)/ `onPanelClose` / `onSelectArtifact`(tab / 目录列表切换,典型接法 `setState artifact=${event.artifact}`);多产物清单由组合层自动从消息流归集,无需 DSL 接线;自定义预览经 `ChatServicesProvider` 注入 `artifactViewers`(函数不进 DSL)。详见上文 `<ArtifactPanel>` 与 `examples/chat/src/chat.page.yaml`。
141
+ - **产出物面板**:`artifact` / `panelOpen` 受控 props(典型 `${state.x}` 绑定),事件 `onArtifact`(part 就绪)/ `onOpenArtifact`(卡片打开)/ `onOpenArtifactList`(卡片区"查看所有产物",典型接法 `setState panelOpen=true`,面板自动定位产物目录视图)/ `onPanelClose` / `onSelectArtifact`(下拉 / 目录列表切换,典型接法 `setState artifact=${event.artifact}`);多产物清单由组合层自动从消息流归集,无需 DSL 接线;自定义预览经 `ChatServicesProvider` 注入 `artifactViewers`(函数不进 DSL)。详见上文 `<ArtifactPanel>` 与 `examples/chat/src/chat.page.yaml`。
142
142
  - **React 直连**:`<ChatServicesProvider>` + `<Chat>` 同样可直接作为 React 组件使用(events 即普通函数 props:`onSend?(text)` / `onMenuSelect?(key, item)`)。`createChatWorkspace` 工厂保留为兼容路径,内部已改为 provider + 同一组合逻辑(`ChatComposition`),行为不变。
143
143
 
144
144
  ### 消息操作条:messageActions