@dream-craft/canvas-agent 0.6.5 → 0.6.7
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/agent-instructions.md +6 -2
- package/dist/canvas/schemas.js +10 -4
- package/package.json +1 -1
package/agent-instructions.md
CHANGED
|
@@ -12,10 +12,14 @@
|
|
|
12
12
|
- 只有用户明确要求使用“Codex 内置生图”“ImageGen 技能”或意思明确相同的能力时,才使用 Codex 自带的 `imagegen`;不要因为用户只说“生成图片”就自行改用内置生图。内置生图完成后,其结果会由 Canvas Agent 自动展示到对话并插入当前画布,无需再创建空节点或重复生成。
|
|
13
13
|
- 只有用户明确说要在生图/视频工作台生成时,才使用 `workbench_image_*`、`workbench_video_*`。生成任务提交后应说明已经在画布或工作台开始生成,不要在实际没有结果时声称“已生成”。
|
|
14
14
|
- 需要生成内容时直接调用对应生成工具,不要绑定特定业务场景,不要模拟鼠标点击,不要要求用户手动复制 JSON。
|
|
15
|
-
- 需要获取、保存或核对生成结果图片时,使用画布节点元数据里的资源地址(`canvas_get_state` 读取)或工具返回的文件路径;不要用浏览器自动化(js/browser 工具)从页面 DOM 抓取或下载图片,也不要在网页 DOM 里查找画布内容。
|
|
15
|
+
- 需要获取、保存或核对生成结果图片时,使用画布节点元数据里的资源地址(`canvas_get_state` 读取)或工具返回的文件路径;不要用浏览器自动化(js/browser 工具)从页面 DOM 抓取或下载图片,也不要在网页 DOM 里查找画布内容。
|
|
16
|
+
- `canvas_get_state` 不可用(激活失败)时,**禁止对任何自己没有 firsthand 信息的节点做删除、覆盖内容等不可逆操作**——不知道节点里是什么就删,可能毁掉优化结果、生成产物或用户手动创建的内容(实测:仅凭"应该是残留节点"的猜测删掉了用户报告异常的节点)。此时只允许:如实向用户报告状态读取缺口、请用户贴出节点内容或确认节点用途、或做已完全知情的操作。要动一个节点,先核实它是什么;核实不了就问。
|
|
17
|
+
- 画布工具返回 `unsupported call: <工具名>` 时,含义是**该工具名未出现在本会话 tool_search 的输出工具子集里**,不是画布未连接、也不是工具不存在——同会话其他画布工具能调用成功即是佐证。tool_search 的机制:返回按语义匹配的 namespace(如 mcp__infinite_canvas)+ **附带本次激活的工具子集**(受 limit 限制,默认很小),只有出现在输出里的工具才能调用;namespace 描述里提到某工具名不代表它已被激活。对策:tool_search 时**显式传大 limit(如 20)**、query 用工具名字面或独特功能词;拿到输出后**核对目标工具名是否真的列在其中**,没列出就换 query 再搜(如 `canvas_get_state`、"read canvas state nodes metadata");换两次查询仍失败才向用户报告缺口。禁止把 `unsupported call` 当成「画布未连接」向用户陈述或写进问卷 contextText。开始操作画布前,若 `canvas_get_state` 尚未验证可用(首次调用即报 unsupported call),先激活再继续,不要跳过画布状态读取直接凭记忆操作。
|
|
16
18
|
|
|
17
19
|
## Windows shell 与工具缺失行为
|
|
18
20
|
|
|
19
|
-
- 沙箱环境是 Windows PowerShell 5.1。shell 只用于三类用途:读取文件(`Get-Content`)、等待(`Start-Sleep`)、文件搜索(`Get-ChildItem` / `Select-String`)。不要使用 bash/Unix 语法(`ls -la`、`head`、`grep`、`/dev/null` 等);`python3`、`pwsh` 在本机不存在,python 在沙箱 shell 的 PATH 里调不到——不要用脚本语言生成 JSON 参数,直接把 JSON 写进工具参数。
|
|
21
|
+
- 沙箱环境是 Windows PowerShell 5.1。shell 只用于三类用途:读取文件(`Get-Content`)、等待(`Start-Sleep`)、文件搜索(`Get-ChildItem` / `Select-String`)。不要使用 bash/Unix 语法(`ls -la`、`head`、`grep`、`/dev/null` 等);`python3`、`pwsh` 在本机不存在,python 在沙箱 shell 的 PATH 里调不到——不要用脚本语言生成 JSON 参数,直接把 JSON 写进工具参数。
|
|
22
|
+
- 用 `Get-Content` 读任何 .md/.json/.toml 等文本文件时**必须带 `-Encoding UTF8`**(如 `Get-Content <path> -Encoding UTF8`):不带该参数中文会读成 GBK 乱码,乱码会吞掉技能/配置文件里的关键指令(实测:SKILL.md 乱码后丢失了工具优先级条款,导致整个交互形态降级)。读到乱码输出时不要基于它继续推理,换 `-Encoding UTF8` 重读一次。
|
|
23
|
+
- 读技能全文**不要走 `read_mcp_resource`(skills server)**——实测该服务持续报 "not ready"(两轮会话均失败),不要在它上面重试或等待;技能清单里每个技能都带磁盘 `path`,直接 `Get-Content <path> -Encoding UTF8` 读 SKILL.md 即可。
|
|
20
24
|
- 当工具清单中没有 `canvas_*` 前缀工具(infinite-canvas MCP 未注册或未连接)时,立即向用户报告「画布工具不可用,请检查 Canvas Agent 连接」并停止执行任务;不要把工具名当命令执行,不要在文件系统里搜索画布状态或 MCP 配置。
|
|
21
25
|
- 同一 shell 命令因环境类错误(命令不存在、语法错误、权限拒绝)连续失败 2 次后,停止更换写法,向用户说明具体缺口;不要继续用其他脚本语言或管道方式重试。画布工具返回的业务错误(如「当前没有已连接画布」)按前文切换画布的规则处理,不属于此类。
|
package/dist/canvas/schemas.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
2
|
// 部分模型调用 MCP 工具时会把数组/对象参数整体序列化成 JSON 字符串传入(实测 Codex 传 canvas_apply_ops 的 ops),
|
|
3
|
-
// 这里做宽容解析:收到字符串先尝试 JSON.parse
|
|
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
|
-
|
|
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
|
}
|
|
@@ -160,8 +166,8 @@ export const toolInputSchemas = {
|
|
|
160
166
|
export const toolDescriptions = {
|
|
161
167
|
site_navigate: "跳转网站页面。path 可为 / (首页)、/canvas (我的画布)、/canvas/:id (指定画布)、/image (生图工作台)、/video (视频创作台)、/prompts (提示词库)、/assets (我的素材)、/config (配置)。操作画布前若不在画布页,先用本工具打开画布。",
|
|
162
168
|
canvas_list_projects: "列出用户全部画布(仅标题、创建/更新时间、节点数、连线数,不含完整数据),支持 keyword 搜索和 page/pageSize 分页。返回的 id 可配合 site_navigate 跳转到 /canvas/:id 打开对应画布。",
|
|
163
|
-
canvas_get_state: "
|
|
164
|
-
canvas_get_selection: "
|
|
169
|
+
canvas_get_state: "canvas_get_state(读取画布状态快照,get canvas state snapshot):返回当前画布的全部节点 nodes、连线 connections、选区 selection 与视口,含每个节点的 metadata。默认节点 metadata.content 超过 240 字符会被截断;full: true 返回未截断内容,做提示词/种子与生成参数(如画幅比例)的一致性分析时必须带 full: true,避免漏看长文本里的画幅假设。",
|
|
170
|
+
canvas_get_selection: "canvas_get_selection(读取画布选区,get canvas selection):返回当前网页画布选中的节点列表。",
|
|
165
171
|
canvas_export_snapshot: "导出当前画布快照,用于理解布局。",
|
|
166
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 是对齐/等距工具,按定义会让节点在一条线上重叠或贴合,这是预期行为,不要据此判定整理失败。",
|
|
167
173
|
canvas_create_node: "创建任意类型节点:text、image、config、video、audio,或已启用画布插件的节点类型(如 \"prompt-enhancer:optimize\",需先在画布「节点插件」管理器启用对应插件)。适合创建占位图、媒体占位、配置节点或自定义 metadata 节点。",
|