@dream-craft/canvas-agent 0.6.4 → 0.6.6

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.
@@ -4,14 +4,16 @@
4
4
 
5
5
  - 用户要求操作画布时,默认目标就是网页当前已经打开的画布。需要了解内容时先使用 `canvas_get_state`;读取成功后直接在该画布执行任务,不要调用 `canvas_list_projects`,也不要用 `site_navigate` 重复进入画布。
6
6
  - 只有用户明确要求查看、选择或切换其他画布,或者 `canvas_get_state` 明确提示当前没有已连接画布时,才使用 `canvas_list_projects` 和 `site_navigate`。`site_navigate` 可跳转 `/`、`/canvas`、`/canvas/:id`、`/image`、`/video`、`/prompts`、`/assets`、`/config`。
7
- - 修改当前画布时根据任务使用已配置的 infinite-canvas MCP 工具;复杂批量改动使用 `canvas_apply_ops`。
7
+ - 修改当前画布时根据任务使用已配置的 infinite-canvas MCP 工具;复杂批量改动使用 `canvas_apply_ops`。
8
+ - `canvas_apply_ops` 的 `add_node` 省略 `nodeType` 会静默建成 text 节点(不报错)。发现节点实际类型与预期不符(如插件节点或图片节点变成 text)时,先核对自己刚才的参数是否漏传 `nodeType`,漏传就删掉错节点带 `nodeType` 重建;确认传了 `nodeType` 仍回退为 text 才考虑插件未启用,不要直接归因为「插件不可用」。
8
9
  - 用户要求把上传附件放入画布或作为生成参考图时,必须先用 `canvas_create_attachment_nodes` 创建真实图片节点,再把节点 ID 传给生成流程,不要创建空图片占位节点。
9
10
  - 生图与视频工作台分别使用 `workbench_image_*`、`workbench_video_*` 工具;提示词和素材分别使用 `prompts_search`、`assets_*` 工具。
10
11
  - 用户要求生成图片、视频、音频或文本时,默认调用对应的 `canvas_generate_image`、`canvas_generate_video`、`canvas_generate_audio`、`canvas_generate_text`,通过当前画布的生成节点完成任务。**优先级(最高)例外**:开放式/高成本创作任务(如"生成一个某某主题的视频短片"、搭完整生成链、批量产出,特征是含多个未指定的自由决策点)必须先按 `task-briefing` 技能发对齐问卷并结束本轮,用户确认口径前禁止调用任何生成、建链或触发工具——本条与下一条的"直接调用生成工具"默认指令都让位于该技能。
11
12
  - 只有用户明确要求使用“Codex 内置生图”“ImageGen 技能”或意思明确相同的能力时,才使用 Codex 自带的 `imagegen`;不要因为用户只说“生成图片”就自行改用内置生图。内置生图完成后,其结果会由 Canvas Agent 自动展示到对话并插入当前画布,无需再创建空节点或重复生成。
12
13
  - 只有用户明确说要在生图/视频工作台生成时,才使用 `workbench_image_*`、`workbench_video_*`。生成任务提交后应说明已经在画布或工作台开始生成,不要在实际没有结果时声称“已生成”。
13
14
  - 需要生成内容时直接调用对应生成工具,不要绑定特定业务场景,不要模拟鼠标点击,不要要求用户手动复制 JSON。
14
- - 需要获取、保存或核对生成结果图片时,使用画布节点元数据里的资源地址(`canvas_get_state` 读取)或工具返回的文件路径;不要用浏览器自动化(js/browser 工具)从页面 DOM 抓取或下载图片,也不要在网页 DOM 里查找画布内容。
15
+ - 需要获取、保存或核对生成结果图片时,使用画布节点元数据里的资源地址(`canvas_get_state` 读取)或工具返回的文件路径;不要用浏览器自动化(js/browser 工具)从页面 DOM 抓取或下载图片,也不要在网页 DOM 里查找画布内容。
16
+ - 画布工具返回 `unsupported call: <工具名>` 时,含义是**该工具名未在本会话被 Codex 动态工具发现激活**,不是画布未连接、也不是工具不存在——同会话其他画布工具能调用成功即是佐证。对策:先用工具搜索(tool_search)搜该工具名或其功能描述(如 `canvas_get_state`、"read canvas nodes state")把工具激活,再调用;换一次搜索词仍激活失败才向用户报告缺口。禁止把 `unsupported call` 当成「画布未连接」向用户陈述或写进问卷 contextText。开始操作画布前,若 `canvas_get_state` 尚未验证可用(首次调用即报 unsupported call),先激活再继续,不要跳过画布状态读取直接凭记忆操作。
15
17
 
16
18
  ## Windows shell 与工具缺失行为
17
19
 
@@ -111,6 +111,8 @@ function configNodeOp(id, input, x, y) {
111
111
  audioVoice: input.audioVoice,
112
112
  audioFormat: input.audioFormat,
113
113
  audioSpeed: input.audioSpeed,
114
+ audioStyle: input.audioStyle,
115
+ audioPitch: input.audioPitch,
114
116
  audioInstructions: input.audioInstructions,
115
117
  }),
116
118
  };
@@ -1,6 +1,7 @@
1
1
  import { z } from "zod";
2
2
  // 部分模型调用 MCP 工具时会把数组/对象参数整体序列化成 JSON 字符串传入(实测 Codex 传 canvas_apply_ops 的 ops),
3
- // 这里做宽容解析:收到字符串先尝试 JSON.parse 还原,解析失败再走原值让 zod 给出可读错误。
3
+ // 这里做宽容解析:收到字符串先尝试 JSON.parse 还原;失败时剥掉对象/数组末尾的 trailing comma(LLM 输出常见毛病,
4
+ // 实测 canvas_present_survey groups 因此整次校验失败)重试一次,仍失败再走原值让 zod 给出可读错误。
4
5
  function tolerant(schema) {
5
6
  return z.preprocess((value) => {
6
7
  if (typeof value !== "string")
@@ -9,7 +10,12 @@ function tolerant(schema) {
9
10
  return JSON.parse(value);
10
11
  }
11
12
  catch {
12
- return value;
13
+ try {
14
+ return JSON.parse(value.replace(/,(\s*[\]}])/g, "$1"));
15
+ }
16
+ catch {
17
+ return value;
18
+ }
13
19
  }
14
20
  }, schema);
15
21
  }
@@ -99,6 +105,9 @@ const generationOptionsSchema = z.object({
99
105
  audioVoice: z.string().optional(),
100
106
  audioFormat: z.string().optional(),
101
107
  audioSpeed: z.string().optional(),
108
+ // 风格与音调只有声明了这两项的厂商参数面(edge-tts)会用到,其他模型由网页端按 profile 直接忽略。
109
+ audioStyle: z.string().optional(),
110
+ audioPitch: z.string().optional(),
102
111
  audioInstructions: z.string().optional(),
103
112
  });
104
113
  const generationFlowSchema = z.object({
@@ -160,7 +169,7 @@ export const toolDescriptions = {
160
169
  canvas_get_state: "读取当前网页画布的节点、连线、选区和视口。默认节点 metadata.content 超过 240 字符会被截断;full: true 返回未截断内容,做提示词/种子与生成参数(如画幅比例)的一致性分析时必须带 full: true,避免漏看长文本里的画幅假设。",
161
170
  canvas_get_selection: "读取当前网页画布选中的节点。",
162
171
  canvas_export_snapshot: "导出当前画布快照,用于理解布局。",
163
- canvas_apply_ops: "批量操作当前网页画布。ops 支持 add_node(nodeType 可为内置类型或已启用插件的 \"<pluginId>:<name>\" 类型)、update_node、delete_node、delete_connections、connect_nodes、set_viewport、select_nodes、arrange_nodes、run_generation。ops 最小示例:[{\"type\":\"add_node\",\"id\":\"main\",\"nodeType\":\"text\",\"title\":\"主提示词\",\"metadata\":{\"content\":\"提示词内容\"}}],连接节点用 {\"type\":\"connect_nodes\",\"fromNodeId\":\"main\",\"toNodeId\":\"target\"},connect_nodes 必须同时提供 fromNodeId 与 toNodeId。arrange_nodes 只带意图(ids 或 all 二选一 + mode/axis/side),坐标由网页端排版算法计算并在整理后聚焦结果,不要自己算坐标或预判结果。mode=auto/flow/by_media/row/column/grid/spread 为防重叠整理,结果不重叠;mode=align/distribute 是对齐/等距工具,按定义会让节点在一条线上重叠或贴合,这是预期行为,不要据此判定整理失败。",
172
+ canvas_apply_ops: "批量操作当前网页画布。ops 支持 add_node(nodeType 可为内置类型或已启用插件的 \"<pluginId>:<name>\" 类型;省略 nodeType 会静默建成 text 节点且不报错,创建任何非 text 节点时必须显式传 nodeType)、update_node、delete_node、delete_connections、connect_nodes、set_viewport、select_nodes、arrange_nodes、run_generation。ops 最小示例:[{\"type\":\"add_node\",\"id\":\"main\",\"nodeType\":\"text\",\"title\":\"主提示词\",\"metadata\":{\"content\":\"提示词内容\"}}],连接节点用 {\"type\":\"connect_nodes\",\"fromNodeId\":\"main\",\"toNodeId\":\"target\"},connect_nodes 必须同时提供 fromNodeId 与 toNodeId。arrange_nodes 只带意图(ids 或 all 二选一 + mode/axis/side),坐标由网页端排版算法计算并在整理后聚焦结果,不要自己算坐标或预判结果。mode=auto/flow/by_media/row/column/grid/spread 为防重叠整理,结果不重叠;mode=align/distribute 是对齐/等距工具,按定义会让节点在一条线上重叠或贴合,这是预期行为,不要据此判定整理失败。",
164
173
  canvas_create_node: "创建任意类型节点:text、image、config、video、audio,或已启用画布插件的节点类型(如 \"prompt-enhancer:optimize\",需先在画布「节点插件」管理器启用对应插件)。适合创建占位图、媒体占位、配置节点或自定义 metadata 节点。",
165
174
  canvas_create_attachment_nodes: "把当前对话中用户上传的图片附件创建成真实画布图片节点。attachmentIds 使用本轮附件清单中的 ID;返回的节点 ID 可传给 canvas_create_generation_flow.referenceNodeIds 作为生成参考图。",
166
175
  canvas_create_text_node: "在当前画布创建单个文本节点。",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dream-craft/canvas-agent",
3
- "version": "0.6.4",
3
+ "version": "0.6.6",
4
4
  "license": "MIT",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",