batter-pixso-mcp 0.2.0 → 0.3.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/dist/index.js CHANGED
@@ -25,32 +25,27 @@ var init_config = __esm({
25
25
  /** 产物图片保留时长,默认 7 天 */
26
26
  assetTtlMs: Number(process.env.ASSET_TTL_DAYS ?? 7) * 24 * 60 * 60 * 1e3
27
27
  };
28
- VERSION = "0.1.0";
28
+ VERSION = "0.3.0";
29
29
  }
30
30
  });
31
31
 
32
32
  // src/assets.ts
33
- import { randomBytes } from "node:crypto";
33
+ import { createHash } from "node:crypto";
34
34
  import { mkdir, readdir, stat, unlink, writeFile } from "node:fs/promises";
35
35
  import { tmpdir } from "node:os";
36
36
  import { join } from "node:path";
37
+ function assetDir() {
38
+ return ASSETS_DIR;
39
+ }
37
40
  async function saveAsset(bytes, format) {
38
41
  await mkdir(ASSETS_DIR, { recursive: true });
39
42
  const ext = EXT_BY_FORMAT[format.toUpperCase()] ?? ".bin";
40
- const name = `${Date.now()}-${randomBytes(4).toString("hex")}${ext}`;
43
+ const name = `${createHash("sha1").update(bytes).digest("hex").slice(0, 16)}${ext}`;
41
44
  const path = join(ASSETS_DIR, name);
42
45
  await writeFile(path, bytes);
43
46
  log(`asset saved: ${path} (${bytes.length} bytes)`);
44
47
  return { name, path };
45
48
  }
46
- function assetMime(name) {
47
- const ext = name.slice(name.lastIndexOf(".")).toLowerCase();
48
- return MIME_BY_EXT[ext] ?? "application/octet-stream";
49
- }
50
- function assetPath(name) {
51
- if (!/^[\w.-]+$/.test(name)) throw new Error("invalid asset name");
52
- return join(ASSETS_DIR, name);
53
- }
54
49
  async function cleanOldAssets(ttlMs) {
55
50
  let removed = 0;
56
51
  const cutoff = Date.now() - ttlMs;
@@ -74,7 +69,7 @@ async function cleanOldAssets(ttlMs) {
74
69
  if (removed > 0) log(`assets cleanup: removed ${removed} expired file(s)`);
75
70
  return removed;
76
71
  }
77
- var ASSETS_DIR, EXT_BY_FORMAT, MIME_BY_EXT;
72
+ var ASSETS_DIR, EXT_BY_FORMAT;
78
73
  var init_assets = __esm({
79
74
  "src/assets.ts"() {
80
75
  "use strict";
@@ -85,13 +80,9 @@ var init_assets = __esm({
85
80
  SVG: ".svg",
86
81
  JPG: ".jpg",
87
82
  JPEG: ".jpg",
88
- WEBP: ".webp"
89
- };
90
- MIME_BY_EXT = {
91
- ".png": "image/png",
92
- ".svg": "image/svg+xml",
93
- ".jpg": "image/jpeg",
94
- ".webp": "image/webp"
83
+ WEBP: ".webp",
84
+ PDF: ".pdf"
85
+ // export_image 尊重设计师导出标记,标记可能指定 PDF
95
86
  };
96
87
  }
97
88
  });
@@ -891,15 +882,17 @@ AI \u5BA2\u6237\u7AEF \u2500\u2500MCP(stdio/HTTP)\u2500\u2500\u25B6 batter-pixso
891
882
  | \u5DE5\u5177 | \u7528\u9014 |
892
883
  | --- | --- |
893
884
  | \`get_selected\` | \u8BFB\u753B\u5E03\u5F53\u524D\u9009\u4E2D\u56FE\u5C42\uFF08guid\u3001\u540D\u79F0\u3001\u7C7B\u578B\u3001\u5C3A\u5BF8\uFF09 |
894
- | \`get_node_dsl\` | \u751F\u6210\u8282\u70B9\u7684\u5F00\u53D1\u5411\u7CBE\u7B80 DSL\uFF08\u7ED3\u6784 + \u6837\u5F0F + \u8D44\u6E90 URL\uFF09\uFF0C\u8BBE\u8BA1\u8F6C\u4EE3\u7801\u7684\u6838\u5FC3\u5165\u53E3 |
895
- | \`get_screenshot\` | \u5BFC\u51FA\u8282\u70B9\u622A\u56FE\uFF0C\u8FD4\u56DE\u56FE\u7247 URL\uFF0C\u7528\u4E8E\u89C6\u89C9\u53C2\u7167/\u6821\u9A8C |
885
+ | \`get_node_dsl\` | \u751F\u6210\u8282\u70B9\u7684\u5F00\u53D1\u5411\u7CBE\u7B80 DSL\uFF08\u7ED3\u6784 + \u6837\u5F0F + \u8D44\u6E90\u6587\u4EF6\u540D\uFF09\uFF0C\u8BBE\u8BA1\u8F6C\u4EE3\u7801\u7684\u6838\u5FC3\u5165\u53E3 |
886
+ | \`get_screenshot\` | \u5BFC\u51FA\u8282\u70B9\u622A\u56FE\uFF0C\u8FD4\u56DE\u56FE\u7247\u6587\u4EF6\u540D\uFF08\u672C\u673A\u8DEF\u5F84\u76F4\u8BFB\uFF09\uFF0C\u7528\u4E8E\u89C6\u89C9\u53C2\u7167/\u6821\u9A8C |
887
+ | \`export_image\` | \u6309 guid \u5BFC\u51FA\u56FE\u7247\u7D20\u6750\uFF08\u5207\u56FE\uFF09\uFF1A\u8282\u70B9\u5E26\u5BFC\u51FA\u6807\u8BB0\u65F6\u6309\u8BBE\u8BA1\u5E08\u8BBE\u7F6E\u9010\u4EFD\u5BFC\u51FA\uFF0C\u65E0\u6807\u8BB0\u6309\u53C2\u6570\u515C\u5E95 |
896
888
  | \`list_sessions\` | \u5217\u51FA\u5168\u90E8\u63D2\u4EF6\u4F1A\u8BDD\uFF08\u591A\u6587\u4EF6\u573A\u666F\u8DEF\u7531\u7528\uFF09 |
897
889
 
898
890
  ## \u94FE\u63A5\u5373\u8F93\u5165\uFF08\u9AD8\u9891\u573A\u666F\uFF09
899
891
 
900
892
  \u7528\u6237\u63D0\u4F9B Pixso \u94FE\u63A5\u65F6\uFF08\u5B98\u65B9 \`pixso.cn\` \u6216\u79C1\u6709\u5316\u90E8\u7F72\u5982 \`pixso.ky-tech.com.cn\`\uFF0C\u4EFB\u610F\u57DF\u540D\uFF09\uFF0C
901
- \u94FE\u63A5\u672C\u8EAB\u5C31\u662F\u4EFB\u52A1\u8F93\u5165\uFF1A\u63D0\u53D6 \`item-id\` \u67E5\u8BE2\u53C2\u6570 \u2192 URL \u89E3\u7801 \u2192 \u5F97\u5230\u8282\u70B9 guid\uFF0C
893
+ \u94FE\u63A5\u672C\u8EAB\u5C31\u662F\u4EFB\u52A1\u8F93\u5165\uFF1A**\u5FC5\u987B**\u63D0\u53D6 \`item-id\` \u67E5\u8BE2\u53C2\u6570 \u2192 URL \u89E3\u7801 \u2192 \u5F97\u5230\u8282\u70B9 guid\uFF0C
902
894
  \u76F4\u63A5\u8C03 \`get_node_dsl(guid)\` / \`get_screenshot(guid)\`\uFF0C\u65E0\u9700\u5148\u95EE\u7528\u6237\u9009\u4E2D\u4EC0\u4E48\u3002
895
+ \u4E25\u7981\u628A\u6574\u4E2A URL \u5F53 guid \u4F20\u3002
903
896
 
904
897
  ## \u591A\u6587\u4EF6\u573A\u666F
905
898
 
@@ -911,68 +904,100 @@ AI \u5BA2\u6237\u7AEF \u2500\u2500MCP(stdio/HTTP)\u2500\u2500\u25B6 batter-pixso
911
904
  `;
912
905
  DESIGN_TO_CODE = `# \u8BBE\u8BA1\u8F6C\u4EE3\u7801\u5DE5\u4F5C\u6D41
913
906
 
907
+ ## \u3010\u786C\u6027\u89C4\u5219 \xB7 \u8FDD\u53CD\u5373\u8FD4\u5DE5\u3011
908
+
909
+ 1. **\u8D44\u6E90\u662F\u672C\u673A\u6587\u4EF6\uFF0C\u6309\u9700\u53D6\u7528**\uFF1ADSL \u4E0E\u622A\u56FE\u7ED3\u679C\u4E2D\u7684 \`img\` \u5B57\u6BB5\u662F\u4EA7\u7269**\u6587\u4EF6\u540D**
910
+ \uFF08\u5982 \`"ab12cd34.svg"\`\uFF09\uFF0C\u5B8C\u6574\u8DEF\u5F84 = \u4EA7\u7269\u76EE\u5F55 + \u6587\u4EF6\u540D\uFF08\u76EE\u5F55\u89C1\u5DE5\u5177 description
911
+ \u4E2D\u7684\u5B9E\u9645\u8DEF\u5F84\uFF0C\u901A\u5E38\u4E3A \`%TEMP%\\batter-pixso-assets\`\uFF09\u3002\u4EA7\u7269\u4E0E\u670D\u52A1\u540C\u673A\uFF0C\u76F4\u63A5\u8BFB\u6587\u4EF6\u7CFB\u7EDF\uFF1A
912
+ - **\u622A\u56FE\u7B49\u89C6\u89C9\u53C2\u7167**\uFF1A\u7528 Read \u5DE5\u5177\u76F4\u63A5\u8BFB\u8BE5\u8DEF\u5F84\u67E5\u770B\uFF0C\u65E0\u9700\u590D\u5236\u3002
913
+ - **\u8981\u5199\u8FDB\u4EA4\u4ED8\u4EE3\u7801\u7684\u56FE\u6807/\u56FE\u7247**\uFF1A**\u5FC5\u987B**\u5148\u590D\u5236\u5230\u9879\u76EE\u8D44\u6E90\u76EE\u5F55
914
+ \uFF08PowerShell \`Copy-Item\` / \u7C7B Unix \`cp\`\uFF09\uFF0C\u518D\u4EE5\u672C\u5730\u76F8\u5BF9\u8DEF\u5F84\u5F15\u7528
915
+ \uFF08\`<img src>\`\u3001CSS \`background-image\` \u7B49\uFF09\u3002\u4EA7\u7269\u6587\u4EF6\u540D\u662F\u5185\u5BB9 hash\uFF0C\u6CA1\u6709\u8BED\u4E49\u2014\u2014
916
+ **\u590D\u5236\u65F6\u6309\u8282\u70B9\u7528\u9014\u81EA\u884C\u547D\u540D\u8BED\u4E49\u5316\u6587\u4EF6\u540D**\uFF08\u5982 \`icon-arrow.svg\`\u3001\`hero-banner.png\`\uFF1B
917
+ \`export_image\` \u8FD4\u56DE\u7684 \`suffix\` \u5982 \`@2x\` \u5EFA\u8BAE\u4FDD\u7559\uFF09\uFF0C\u4E25\u7981\u628A hash \u6587\u4EF6\u540D\u5E26\u8FDB\u4EA4\u4ED8\u4EE3\u7801\u3002
918
+ \u4E25\u7981\u76F4\u63A5\u5F15\u7528\u4EA7\u7269\u76EE\u5F55\u7684\u7EDD\u5BF9\u8DEF\u5F84\uFF08\u4EA7\u7269\u9ED8\u8BA4 7 \u5929\u540E\u81EA\u52A8\u6E05\u626B\uFF0C\u5F15\u7528\u4F1A\u5931\u6548\uFF09\uFF1B
919
+ \u4E25\u7981\u79FB\u52A8\u6216\u5220\u9664\u4EA7\u7269\u76EE\u5F55\u4E0B\u7684\u6587\u4EF6\uFF08\u591A\u4F1A\u8BDD\u5171\u4EAB\uFF0C\u6E05\u626B\u7531\u670D\u52A1\u7EDF\u4E00\u8D1F\u8D23\uFF09\u3002
920
+ 2. **Pixso \u94FE\u63A5\u5FC5\u987B\u63D0\u53D6 \`item-id\` \u5F53 guid**\uFF1A\u4EFB\u610F\u57DF\u540D\u90FD\u6709\u6548\u2014\u2014\u5B98\u65B9 \`pixso.cn\` \u6216\u79C1\u6709\u5316\u90E8\u7F72\u5982
921
+ \`https://pixso.ky-tech.com.cn/app/design/<\u6587\u4EF6>?item-id=1%3A2\`\uFF08\u4E5F\u53EF\u80FD\u662F \`/app/editor/\` \u8DEF\u5F84\uFF09\u3002
922
+ \u4ECE \`item-id\` \u67E5\u8BE2\u53C2\u6570\u63D0\u53D6 guid \u5E76 URL \u89E3\u7801\uFF08\`1%3A2\` \u2192 \`"1:2"\`\uFF09\u540E\u4F5C\u4E3A \`guid\` \u4F20\u5165\u3002
923
+ \u4E25\u7981\u628A\u6574\u4E2A URL \u5F53 guid \u4F20\uFF1B\u65E0\u8BBA\u57DF\u540D\u662F\u5426\u8BA4\u8BC6\uFF0C\u90FD\u6309\u6B64\u89C4\u5219\u5904\u7406\u3002
924
+
914
925
  ## \u63A8\u8350\u6B65\u9AA4
915
926
 
916
927
  1. **\u786E\u8BA4\u76EE\u6807\u8282\u70B9**
917
- - \u7528\u6237\u8BF4"\u8FD9\u4E2A/\u9009\u4E2D\u7684"\uFF1A\u8C03 \`get_selected\` \u62FF guid\u3002
918
- - \u7528\u6237\u7ED9\u4E86 Pixso \u94FE\u63A5\uFF08\u4EFB\u610F\u57DF\u540D\u90FD\u6709\u6548\u2014\u2014\u5B98\u65B9 \`pixso.cn\` \u6216\u79C1\u6709\u5316\u90E8\u7F72\u5982
919
- \`https://pixso.ky-tech.com.cn/app/design/<\u6587\u4EF6>?item-id=1%3A2\`\uFF0C\u4E5F\u53EF\u80FD\u662F \`/app/editor/\` \u8DEF\u5F84\uFF09\uFF1A
920
- \u4ECE \`item-id\` \u67E5\u8BE2\u53C2\u6570\u63D0\u53D6 guid \u5E76 URL \u89E3\u7801\uFF08\`1%3A2\` \u2192 \`"1:2"\`\uFF09\uFF0C\u4F5C\u4E3A \`guid\` \u4F20\u5165\u3002
921
- \u4E25\u7981\u76F4\u63A5\u4F20\u5B8C\u6574 URL\uFF1B\u4E0D\u8981\u56E0\u57DF\u540D\u4E0D\u8BA4\u8BC6\u800C\u5FFD\u7565\u94FE\u63A5\u3002
928
+ - \u7528\u6237\u7ED9\u4E86 Pixso \u94FE\u63A5\uFF1A\u6309\u4E0A\u65B9\u786C\u6027\u89C4\u5219\u7B2C 2 \u6761\u63D0\u53D6 guid\uFF0C\u76F4\u63A5\u7EE7\u7EED\u3002
929
+ - \u7528\u6237\u660E\u786E\u8BF4\u4E86"\u8FD9\u4E2A/\u6211\u9009\u4E2D\u7684"\uFF1A\u8C03 \`get_selected\` \u62FF guid\uFF0C\u76F4\u63A5\u7EE7\u7EED\u3002
930
+ - \u5176\u4F59\u4F9D\u8D56\u5F53\u524D\u9009\u533A\u7684\u573A\u666F\uFF1A**\u4E25\u7981\u9690\u5F0F\u4F7F\u7528\u9009\u533A guid**\u2014\u2014\u8C03 \`get_selected\` \u540E
931
+ \u5FC5\u987B\u5148\u628A\u9009\u4E2D\u56FE\u5C42\u540D\u79F0\u62A5\u7ED9\u7528\u6237\u786E\u8BA4\uFF08"\u5F53\u524D\u9009\u4E2D\u7684\u662F\u300CXX\u300D\uFF0C\u786E\u8BA4\u5904\u7406\u5B83\u5417\uFF1F"\uFF09\uFF0C\u786E\u8BA4\u540E\u518D\u7EE7\u7EED\u3002
932
+ \`get_node_dsl\` / \`get_screenshot\` \u7684 guid \u7F3A\u7701\u56DE\u9000\u540C\u6837\u9002\u7528\u672C\u89C4\u5219\u3002
922
933
  2. **\u53D6\u7ED3\u6784**\uFF1A\`get_node_dsl(guid)\` \u62FF\u7CBE\u7B80 DSL\u3002
923
- 3. **\u53D6\u89C6\u89C9\u53C2\u7167**\uFF1A\`get_screenshot(guid)\` \u62FF\u622A\u56FE URL\uFF0C\u4E0E DSL \u5BF9\u7167\u7406\u89E3\u89C6\u89C9\u5C42\u7EA7\u3002
934
+ 3. **\u53D6\u89C6\u89C9\u53C2\u7167**\uFF1A\`get_screenshot(guid)\` \u62FF\u622A\u56FE\u6587\u4EF6\u540D\uFF0C\u6309\u786C\u6027\u89C4\u5219\u7B2C 1 \u6761\u62FC\u8DEF\u5F84\u540E\u7528 Read \u76F4\u8BFB\uFF0C\u4E0E DSL \u5BF9\u7167\u7406\u89E3\u89C6\u89C9\u5C42\u7EA7\u3002
924
935
  4. **\u751F\u6210\u4EE3\u7801**\uFF1A\u6309\u4E0B\u6587 DSL \u8BED\u4E49\u6620\u5C04\u5230\u76EE\u6807\u6846\u67B6\u3002
925
- 5. **\u6821\u9A8C**\uFF1A\u751F\u6210\u540E\u5982\u6709\u504F\u5DEE\uFF0C\u518D\u53D6\u4E00\u6B21\u622A\u56FE\u5BF9\u6BD4\u3002
936
+ 5. **\u6821\u9A8C**\uFF1A\u751F\u6210\u540E\u518D\u53D6\u4E00\u6B21\u622A\u56FE\u5BF9\u6BD4\uFF0C\u6709\u504F\u5DEE\u5C31\u4FEE\u6B63\u540E\u518D\u6BD4\u4E00\u8F6E\u3002
926
937
 
927
- ## DSL \u5B57\u6BB5\u8BED\u4E49
938
+ ## DSL \u5B57\u6BB5\u8BED\u4E49\uFF08\u7D27\u51D1\u683C\u5F0F\uFF09
939
+
940
+ DSL \u662F\u5355\u884C\u7D27\u51D1 JSON\uFF1A\u77ED key\u3001\u4F4D\u7F6E\u6570\u7EC4\u3001\u9ED8\u8BA4\u503C\u7701\u7565\u3002\u56FE\u4F8B\uFF1A
928
941
 
929
942
  \`\`\`jsonc
930
943
  {
931
- "id": "297:133032", // \u8282\u70B9 guid
932
- "name": "\u65B0\u5BA2", // \u56FE\u5C42\u540D
933
- "type": "FRAME", // Pixso \u8282\u70B9\u7C7B\u578B\uFF1BICON/IMAGE \u4E3A\u584C\u7F29\u53F6\u5B50
934
- "rect": { "x": 0, "y": 0, "width": 375, "height": 200 }, // \u7EDD\u5BF9\u5B9A\u4F4D
935
- "layout": { // auto-layout \u2192 flex \u76F4\u8BD1\uFF08\u4EC5\u5BB9\u5668\u6709\uFF09
936
- "direction": "row", // row | column
937
- "gap": 12,
938
- "padding": [16, 16, 16, 16], // \u4E0A\u53F3\u4E0B\u5DE6
939
- "align": { "primary": "flex-start", "counter": "center" },
940
- "sizing": { "horizontal": "hug", "vertical": "fixed" } // hug|fixed|fill
944
+ "id": "297:133032", // \u8282\u70B9 guid\uFF0C\u53EF\u56DE\u4F20\u4E3A guid \u53C2\u6570\u5BF9\u8BE5\u8282\u70B9\u4E0B\u94BB\u8C03\u7528
945
+ "name": "\u65B0\u5BA2", // \u56FE\u5C42\u540D\uFF1B\u81EA\u52A8\u547D\u540D\uFF08"Frame 3123" \u7C7B\uFF09\u5DF2\u7701\u7565
946
+ "type": "FRAME", // \u8282\u70B9\u7C7B\u578B\uFF1BICON/IMAGE \u4E3A\u584C\u7F29\u53F6\u5B50
947
+ "rect": [0, 0, 375, 200], // [x,y,w,h] \u7EDD\u5BF9\u5B9A\u4F4D\uFF1A\u6839\u8282\u70B9\u3001\u7EDD\u5BF9\u5B9A\u4F4D\u5BB9\u5668\u7684\u5B50\u8282\u70B9
948
+ "size": [120, 40], // [w,h]\uFF1Aauto-layout \u5B50\u8282\u70B9\uFF08x/y \u7531\u7236\u7EA7 layout \u63A8\u5BFC\uFF0C\u7701\u7565\uFF09
949
+ "layout": { // auto-layout \u2192 flex \u76F4\u8BD1\uFF08\u4EC5\u5BB9\u5668\u6709\uFF09
950
+ "dir": "row", // row | column
951
+ "gap": 12, // \u4E3A 0 \u65F6\u7701\u7565
952
+ "pad": [16, 16, 16, 16], // [\u4E0A,\u53F3,\u4E0B,\u5DE6]\uFF0C\u5168 0 \u65F6\u7701\u7565
953
+ "align": ["start", "center"], // [\u4E3B\u8F74,\u4EA4\u53C9\u8F74]\uFF1Astart|center|end|space-between|baseline
954
+ "sizing": ["hug", "fixed"] // [\u4E3B\u8F74,\u4EA4\u53C9\u8F74]\uFF1Ahug|fixed|fill
941
955
  },
942
- "text": { // \u4EC5\u6587\u672C\u8282\u70B9
943
- "content": "...", "fontSize": 14, "fontFamily": "PingFang SC",
944
- "fontWeight": "Medium", "lineHeight": "22px", "align": "left",
945
- "decoration": "underline", "letterSpacing": "0.5px", "link": "https://...", // \u6309\u9700
946
- "segments": [ // \u4EC5\u6DF7\u6392\u6587\u672C\uFF1Abase \u4E3A\u6700\u957F\u6BB5\u6837\u5F0F\uFF0C\u6BCF\u6BB5\u53EA\u5E26\u5DEE\u5F02\u5B57\u6BB5
947
- { "start": 0, "end": 4, "text": "\u7406\u8D54\u4E2D\u5FC3", "fontWeight": "Bold", "color": "#f5222d" }
956
+ "text": { // \u4EC5\u6587\u672C\u8282\u70B9\uFF1B\u9ED8\u8BA4\u503C\u7701\u7565\uFF1Aalign=left\u3001lh=normal\u3001weight=Regular
957
+ "content": "...", "size": 14, "font": "PingFang SC",
958
+ "weight": "Medium", "lh": "22px", "align": "center",
959
+ "deco": "underline", "ls": "0.5px", "link": "https://...", // \u6309\u9700
960
+ "segs": [ // \u4EC5\u6DF7\u6392\u6587\u672C\uFF1Abase \u4E3A\u6700\u957F\u6BB5\u6837\u5F0F\uFF0C\u6BCF\u6BB5\u53EA\u5E26\u5DEE\u5F02\u5B57\u6BB5\uFF1B
961
+ { "text": "\u7406\u8D54\u4E2D\u5FC3", "weight": "Bold", "color": "p1" } // \u6570\u7EC4\u987A\u5E8F\u5373\u5B57\u7B26\u504F\u79FB\uFF08start/end \u7701\u7565\uFF09
948
962
  ]
949
963
  },
950
- "fills": ["#1a73e8", "linear-gradient(90deg, #fff 0%, #000 100%)"], // CSS \u989C\u8272
951
- "stroke": "#e5e5e5",
952
- "radius": 8, // \u6216 [\u4E0A\u5DE6, \u4E0A\u53F3, \u4E0B\u53F3, \u4E0B\u5DE6]
964
+ "fills": ["p0", "linear-gradient(90deg, #fff 0%, #000 100%)"], // CSS \u989C\u8272/\u6E10\u53D8
965
+ "stroke": "1px solid #e5e5e5", // \u989C\u8272\u90E8\u5206\u4E5F\u53EF\u80FD\u662F "p0" \u8C03\u8272\u677F\u5F15\u7528
966
+ "radius": 8, // \u6216 [\u4E0A\u5DE6, \u4E0A\u53F3, \u4E0B\u53F3, \u4E0B\u5DE6]
953
967
  "shadow": "0px 2px 8px rgba(0,0,0,0.1), inset 0px 1px 0px #fff", // CSS box-shadow\uFF0C\u591A\u9634\u5F71\u9017\u53F7\u62FC\u63A5
954
- "blur": "4px", // \u56FE\u5C42\u6A21\u7CCA \u2192 CSS filter: blur()
955
- "backdropBlur": "8px", // \u80CC\u666F\u6A21\u7CCA \u2192 CSS backdrop-filter
968
+ "blur": "4px", // \u56FE\u5C42\u6A21\u7CCA \u2192 CSS filter: blur()
969
+ "bgBlur": "8px", // \u80CC\u666F\u6A21\u7CCA \u2192 CSS backdrop-filter
956
970
  "constraints": { "h": "right", "v": "bottom" }, // \u7EDD\u5BF9\u5B9A\u4F4D\u5BB9\u5668\u5185\u7684\u7EA6\u675F\uFF08h: left|center|right|stretch|scale\uFF09\uFF0C\u9ED8\u8BA4 left/top \u4E0D\u8F93\u51FA
957
- "opacity": 0.9,
958
- "image": "http://127.0.0.1:3210/assets/xxx.svg", // \u53F6\u5B50\u8D44\u6E90 URL\uFF08\u89C1\u4E0B\uFF09
959
- "children": [] // \u9012\u5F52\u7ED3\u6784
971
+ "opacity": 0.9, // \u4E3A 1 \u65F6\u7701\u7565
972
+ "img": "ab12cd34.svg", // \u53F6\u5B50\u8D44\u6E90\u6587\u4EF6\u540D\uFF08\u53D6\u7528\u89C4\u5219\u89C1\u786C\u6027\u89C4\u5219\u7B2C 1 \u6761\uFF09
973
+ "palette": ["#1a73e8", "#f5222d"], // \u8C03\u8272\u677F\uFF08\u4EC5\u6839\u8282\u70B9\uFF09\uFF0C"p0"/"p1" \u4E3A\u4E0B\u6807\u5F15\u7528
974
+ "depth": 6, // \u6574\u68F5\u6811\u5B9E\u9645\u6700\u5927\u6DF1\u5EA6\uFF08\u4EC5\u6839\u8282\u70B9\uFF0C\u603B\u662F\u8F93\u51FA\uFF0C\u4E0E\u622A\u65AD\u65E0\u5173\uFF09
975
+ "more": 3, // \u4EC5\u56E0 maxDepth \u622A\u65AD\u65F6\u51FA\u73B0\uFF1A\u8BE5\u8282\u70B9\u4E0B\u8FD8\u6709 3 \u7EA7\u672A\u5C55\u5F00\uFF0C\u62FF id \u56DE\u4F20 guid \u7EE7\u7EED\u4E0B\u94BB
976
+ "kids": [] // \u5B50\u8282\u70B9\u9012\u5F52
960
977
  }
961
978
  \`\`\`
962
979
 
980
+ **\u6DF1\u5EA6\u63A7\u5236**\uFF1A\`get_node_dsl\` \u7684 \`maxDepth\` \u53C2\u6570\u9650\u5236\u4E0B\u63A2\u5C42\u7EA7\uFF08\u6839\u4E3A\u7B2C 0 \u5C42\uFF0C\u7F3A\u7701\u4E0D\u9650\uFF09\u3002
981
+ \u5927\u6811\u5206\u6BB5\u7B56\u7565\uFF1A\u5148 \`maxDepth: 0\` \u62FF\u6839\u8282\u70B9\uFF08\u542B \`depth\` \u603B\u6DF1\u5EA6\uFF09\u9884\u5224\u89C4\u6A21\uFF0C\u518D\u6309\u9700\u5BF9\u5E26 \`more\` \u6807\u8BB0\u7684\u5B50\u6811\u7528\u5176 \`id\` \u5355\u72EC\u4E0B\u94BB\u3002
982
+
983
+ **\u8C03\u8272\u677F\u89C4\u5219**\uFF1A\u540C\u4E00\u989C\u8272\uFF08\u5355\u8272\uFF0C\u542B rgba\uFF09\u51FA\u73B0 \u22652 \u6B21\u65F6\u63D0\u53D6\u5230\u6839\u8282\u70B9 \`palette\` \u6570\u7EC4\uFF0C
984
+ \`fills\`\u3001\`text.color\`\u3001\`segs[].color\`\u3001\`stroke\` \u4E2D\u4EE5 \`"p0"\`\u3001\`"p1"\` \u5F15\u7528\uFF08\u4E0B\u6807\u5373 palette \u4E0B\u6807\uFF09\u3002
985
+ \`shadow\`\u3001\`gradient\` \u7B49\u590D\u5408 CSS \u5B57\u7B26\u4E32\u5185\u90E8\u7684\u989C\u8272\u4FDD\u6301\u5B57\u9762\u503C\uFF0C\u4E0D\u67E5\u8868\u3002
986
+
963
987
  ## \u53F6\u5B50\u8282\u70B9\u4E0E\u56FE\u7247\u8D44\u6E90
964
988
 
965
- - \`type: "ICON"\`\uFF1A\u7EAF\u77E2\u91CF\u5C0F\u8282\u70B9\uFF08icon\uFF09\uFF0C\`image\` \u4E3A **SVG** URL\u3002
966
- - \`type: "IMAGE"\`\uFF1A\u56FE\u7247\u586B\u5145\u8282\u70B9\uFF0C\`image\` \u4E3A **PNG** URL\u3002
967
- - URL \u7531\u672C\u5730\u670D\u52A1\u6258\u7BA1\uFF08immutable \u7F13\u5B58\uFF0C\u670D\u52A1\u505C\u6B62\u5373\u5931\u6548\uFF09\uFF0C**\u4E25\u7981\u76F4\u63A5\u5199\u8FDB\u4EA4\u4ED8\u4EE3\u7801**
968
- \uFF08\`<img src>\`\u3001CSS \`background-image\` \u7B49\uFF09\u3002\u5FC5\u987B\u5148\u7528
969
- \`curl -L -o <\u672C\u5730\u8DEF\u5F84> <URL>\`\uFF08Windows \u4E5F\u53EF\u7528 \`Invoke-WebRequest\`\uFF09\u4E0B\u8F7D\u5230\u9879\u76EE\u8D44\u6E90\u76EE\u5F55\uFF0C
970
- \u518D\u4EE5\u672C\u5730\u76F8\u5BF9\u8DEF\u5F84\u5F15\u7528\u3002\u76F4\u63A5\u5F15\u7528 URL \u4EC5\u9650\u4E34\u65F6\u9884\u89C8\u573A\u666F\u3002
989
+ - \`type: "ICON"\`\uFF1A\u7EAF\u77E2\u91CF\u5C0F\u8282\u70B9\uFF08icon\uFF09\uFF0C\`img\` \u4E3A **SVG** \u6587\u4EF6\u540D\u3002
990
+ - \`type: "IMAGE"\`\uFF1A\u56FE\u7247\u586B\u5145\u8282\u70B9\uFF0C\`img\` \u4E3A **PNG** \u6587\u4EF6\u540D\u3002
991
+ - \u6587\u4EF6\u540D\u62FC\u8DEF\u5F84\u4E0E\u53D6\u7528\u8981\u6C42\u89C1\u5F00\u5934\u786C\u6027\u89C4\u5219\u7B2C 1 \u6761\u3002
971
992
  - \u5BB9\u5668\u81EA\u8EAB\u6709\u5BFC\u51FA\u8BBE\u7F6E\u6807\u8BB0\u65F6\u4E5F\u4F1A\u584C\u7F29\u4E3A\u53F6\u5B50\uFF08\u5C0A\u91CD\u8BBE\u8BA1\u5E08\u7684\u5BFC\u51FA\u610F\u56FE\uFF09\u3002
993
+ - **\u5DF2\u5E26 \`img\` \u7684\u8282\u70B9\u5728\u53D6 DSL \u65F6\u5DF2\u5B8C\u6210\u5BFC\u51FA**\uFF1A\u76F4\u63A5\u4F7F\u7528\u5176\u6587\u4EF6\u540D\uFF0C\u4E25\u7981\u5BF9\u5B83\u4EEC\u518D\u8C03 \`export_image\`\uFF08\u91CD\u590D\u5BFC\u51FA\u540C\u4E00\u4EFD\u5185\u5BB9\uFF09\u3002
994
+ \`export_image\` \u4EC5\u7528\u4E8E DSL \u4E2D\u672A\u584C\u7F29\u7684\u8282\u70B9\uFF08\u4E3B\u52A8\u5207\u56FE\uFF09\u3002
972
995
 
973
996
  ## \u6CE8\u610F
974
997
 
975
998
  - DSL \u662F**\u6709\u635F\u7CBE\u7B80**\uFF1A\u7701\u7565\u4E86\u5E03\u5C14\u8FD0\u7B97\u8DEF\u5F84\u3001\u8499\u7248\u7B49\u7EAF\u8BBE\u8BA1\u7EC6\u8282\uFF0C\u89C6\u89C9\u590D\u6742\u8282\u70B9\u4EE5\u622A\u56FE\u4E3A\u51C6\u3002
999
+ - \u5BFC\u51FA\u7C7B\u5DE5\u5177\uFF08\`get_node_dsl\`/\`get_screenshot\`/\`export_image\`\uFF09\u5E26 15 \u5206\u949F\u7ED3\u679C\u7F13\u5B58\uFF08\u63D2\u4EF6\u4FA7 TTL\uFF09\uFF1B
1000
+ \u8BBE\u8BA1\u7A3F\u521A\u6539\u8FC7\u4F46\u7ED3\u679C\u5BF9\u4E0D\u4E0A\u65F6\uFF0C\u52A0 \`cache: "refresh"\` \u5F3A\u5236\u5237\u65B0\u3002
976
1001
  - \u591A\u6587\u4EF6\u573A\u666F\u6240\u6709\u5DE5\u5177\u90FD\u652F\u6301 \`target\` \u53C2\u6570\uFF08sessionId/fileKey\uFF09\uFF0C\u89C1 \`batter://guides/intro\`\u3002
977
1002
  `;
978
1003
  GUIDES = [
@@ -985,7 +1010,7 @@ AI \u5BA2\u6237\u7AEF \u2500\u2500MCP(stdio/HTTP)\u2500\u2500\u25B6 batter-pixso
985
1010
  {
986
1011
  name: "design-to-code",
987
1012
  uri: "batter://guides/design-to-code",
988
- description: "\u8BBE\u8BA1\u8F6C\u4EE3\u7801\u5DE5\u4F5C\u6D41\uFF1A\u9009\u533A\u786E\u8BA4\u3001URL \u63D0\u53D6 guid\u3001DSL \u5B57\u6BB5\u8BED\u4E49\u3001\u56FE\u7247\u8D44\u6E90\u5904\u7406\u3001\u89C6\u89C9\u6821\u9A8C\u3002",
1013
+ description: "\u8BBE\u8BA1\u8F6C\u4EE3\u7801\uFF08\u6837\u5F0F\u8FD8\u539F/\u8BBE\u8BA1\u8FD8\u539F\uFF09\u5DE5\u4F5C\u6D41\uFF1A\u786C\u6027\u89C4\u5219\uFF08\u8D44\u6E90\u6309\u672C\u673A\u8DEF\u5F84\u53D6\u7528\u3001\u94FE\u63A5\u63D0\u53D6 item-id\uFF09\u3001DSL \u5B57\u6BB5\u8BED\u4E49\u3001\u89C6\u89C9\u6821\u9A8C\u3002",
989
1014
  text: DESIGN_TO_CODE
990
1015
  }
991
1016
  ];
@@ -993,13 +1018,14 @@ AI \u5BA2\u6237\u7AEF \u2500\u2500MCP(stdio/HTTP)\u2500\u2500\u25B6 batter-pixso
993
1018
  });
994
1019
 
995
1020
  // src/prompts.ts
996
- var DESIGN_TO_CODE2, PROMPTS;
1021
+ var ASSET_HARD_RULE, DESIGN_TO_CODE2, PROMPTS;
997
1022
  var init_prompts = __esm({
998
1023
  "src/prompts.ts"() {
999
1024
  "use strict";
1025
+ ASSET_HARD_RULE = `**\u4E25\u7981\u628A\u4EA7\u7269\u76EE\u5F55\u8DEF\u5F84\u5199\u8FDB\u4EA4\u4ED8\u4EE3\u7801**\uFF1ADSL \u8FD4\u56DE\u7684 \`img\` \u662F\u4EA7\u7269\u6587\u4EF6\u540D\uFF08\u5B8C\u6574\u8DEF\u5F84 = \u4EA7\u7269\u76EE\u5F55 + \u6587\u4EF6\u540D\uFF0C\u76EE\u5F55\u89C1\u5DE5\u5177 description\uFF09\u3002\u622A\u56FE\u7B49\u89C6\u89C9\u53C2\u7167\u7528 Read \u5DE5\u5177\u76F4\u8BFB\u5B8C\u6574\u8DEF\u5F84\u5373\u53EF\uFF1B\u8981\u5199\u8FDB\u4EA4\u4ED8\u4EE3\u7801\u7684\u56FE\u6807/\u56FE\u7247\u5FC5\u987B\u5148\u590D\u5236\u5230\u9879\u76EE\u8D44\u6E90\u76EE\u5F55\uFF08PowerShell \`Copy-Item\` / \u7C7B Unix \`cp\`\uFF09\uFF0C\u590D\u5236\u65F6\u6309\u8282\u70B9\u7528\u9014\u81EA\u884C\u547D\u540D\u8BED\u4E49\u5316\u6587\u4EF6\u540D\uFF08\u5982 \`icon-arrow.svg\`\uFF0C\u4E0D\u7528 hash \u540D\uFF09\uFF0C\u518D\u7528\u672C\u5730\u76F8\u5BF9\u8DEF\u5F84\u5F15\u7528\uFF08\`<img src>\`\u3001\`background-image\` \u7B49\uFF09\u3002\u4EA7\u7269\u9ED8\u8BA4 7 \u5929\u540E\u81EA\u52A8\u6E05\u626B\uFF1B\u4E25\u7981\u79FB\u52A8\u6216\u5220\u9664\u4EA7\u7269\u76EE\u5F55\u4E0B\u7684\u6587\u4EF6\u3002`;
1000
1026
  DESIGN_TO_CODE2 = {
1001
1027
  name: "design-to-code",
1002
- description: "\u4ECE Pixso \u94FE\u63A5\u6216\u5F53\u524D\u9009\u533A\u751F\u6210\u524D\u7AEF\u4EE3\u7801\uFF1A\u53D6 DSL + \u622A\u56FE \u2192 \u751F\u6210 \u2192 \u622A\u56FE\u6821\u9A8C\u3002",
1028
+ description: "\u8BBE\u8BA1\u7A3F\u8F6C\u524D\u7AEF\u4EE3\u7801\uFF08\u6837\u5F0F\u8FD8\u539F/\u8BBE\u8BA1\u8FD8\u539F/UI \u8FD8\u539F\uFF09\uFF1A\u4ECE Pixso \u94FE\u63A5\u6216\u5F53\u524D\u9009\u533A\u53D6 DSL + \u622A\u56FE \u2192 \u751F\u6210 \u2192 \u622A\u56FE\u6821\u9A8C\u3002",
1003
1029
  arguments: [
1004
1030
  {
1005
1031
  name: "url",
@@ -1008,21 +1034,28 @@ var init_prompts = __esm({
1008
1034
  }
1009
1035
  ],
1010
1036
  render: (args) => {
1011
- const targetLine = args.url?.trim() ? `\u76EE\u6807\u8282\u70B9\u6765\u81EA\u94FE\u63A5\uFF1A${args.url.trim()}\u3002\u5148\u4ECE\u67E5\u8BE2\u53C2\u6570 item-id \u63D0\u53D6\u8282\u70B9 guid \u5E76 URL \u89E3\u7801\uFF081%3A2 \u2192 "1:2"\uFF09\uFF0C\u4E25\u7981\u628A\u6574\u4E2A URL \u5F53 guid \u4F20\uFF0C\u4E5F\u4E0D\u8981\u56E0\u57DF\u540D\u4E0D\u8BA4\u8BC6\u800C\u5FFD\u7565\u94FE\u63A5\u3002` : `\u76EE\u6807\u8282\u70B9\u4E3A\u5F53\u524D\u9009\u533A\uFF1A\u8C03 get_selected \u62FF\u5230\u9009\u4E2D\u56FE\u5C42\u7684 guid\u3002`;
1037
+ const targetLine = args.url?.trim() ? `\u76EE\u6807\u8282\u70B9\u6765\u81EA\u94FE\u63A5\uFF1A${args.url.trim()}\u3002\u5FC5\u987B\u4ECE\u67E5\u8BE2\u53C2\u6570 \`item-id\` \u63D0\u53D6\u8282\u70B9 guid \u5E76 URL \u89E3\u7801\uFF08\`1%3A2\` \u2192 \`"1:2"\`\uFF09\u540E\u4F5C\u4E3A guid \u4F20\u5165\uFF1B\u4E25\u7981\u628A\u6574\u4E2A URL \u5F53 guid \u4F20\u3002\u65E0\u8BBA\u57DF\u540D\u662F\u5426\u8BA4\u8BC6\uFF0C\u90FD\u6309\u6B64\u89C4\u5219\u5904\u7406\u3002` : `\u76EE\u6807\u8282\u70B9\u4E3A\u5F53\u524D\u9009\u533A\uFF1A\u8C03 \`get_selected\` \u62FF\u9009\u4E2D\u56FE\u5C42\u3002\u7981\u6B62\u9690\u5F0F\u4F7F\u7528\u5176 guid\u2014\u2014\u9664\u975E\u7528\u6237\u660E\u786E\u8BF4\u4E86"\u6211\u9009\u4E2D\u7684/\u5F53\u524D\u9009\u4E2D\u7684"\uFF0C\u5148\u628A\u9009\u4E2D\u56FE\u5C42\u540D\u79F0\u62A5\u7ED9\u7528\u6237\u786E\u8BA4\uFF08"\u5F53\u524D\u9009\u4E2D\u7684\u662F\u300CXX\u300D\uFF0C\u786E\u8BA4\u5904\u7406\u5B83\u5417\uFF1F"\uFF09\uFF0C\u786E\u8BA4\u540E\u518D\u7EE7\u7EED\u3002`;
1012
1038
  return [
1013
1039
  {
1014
1040
  role: "user",
1015
1041
  content: {
1016
1042
  type: "text",
1017
1043
  text: [
1018
- `\u628A Pixso \u8BBE\u8BA1\u7A3F\u8FD8\u539F\u4E3A\u524D\u7AEF\u4EE3\u7801\uFF0C\u4E25\u683C\u6309\u4EE5\u4E0B\u6D41\u7A0B\uFF1A`,
1044
+ `\u628A Pixso \u8BBE\u8BA1\u7A3F\u8FD8\u539F\u4E3A\u524D\u7AEF\u4EE3\u7801\u3002\u52A8\u624B\u524D\u5148\u8BB0\u4F4F\u4E0B\u9762\u7684\u786C\u6027\u89C4\u5219\uFF08\u8FDD\u53CD\u5373\u8FD4\u5DE5\uFF09\uFF1A`,
1045
+ ``,
1046
+ `## \u3010\u786C\u6027\u89C4\u5219\u3011`,
1047
+ ``,
1048
+ `1. ${ASSET_HARD_RULE}`,
1049
+ `2. **\u5199\u4EE3\u7801\u524D\u5FC5\u987B\u5148\u8BFB**\u8D44\u6E90 \`batter://guides/design-to-code\`\uFF0C\u4E86\u89E3 DSL \u5B57\u6BB5\u8BED\u4E49\u3001\u8D44\u6E90\u5904\u7406\u7EC6\u8282\u4E0E\u591A\u6587\u4EF6\u8DEF\u7531\uFF08\`target\` \u53C2\u6570\uFF09\uFF1B\u603B\u89C8\u89C1 \`batter://guides/intro\`\u3002`,
1019
1050
  ``,
1020
- `1. ${targetLine}`,
1021
- `2. \u8C03 get_node_dsl(guid) \u53D6\u7ED3\u6784\u4E0E\u6837\u5F0F DSL\uFF1B\u8C03 get_screenshot(guid) \u53D6\u89C6\u89C9\u53C2\u7167\u622A\u56FE\u3002`,
1022
- `3. \u52A8\u624B\u5199\u4EE3\u7801\u524D\uFF0C\u5148\u8BFB\u8D44\u6E90 batter://guides/design-to-code \u4E86\u89E3 DSL \u5B57\u6BB5\u8BED\u4E49\u3001\u56FE\u7247\u8D44\u6E90\uFF08SVG/PNG URL\uFF09\u5904\u7406\u4E0E\u591A\u6587\u4EF6\u8DEF\u7531\uFF08target \u53C2\u6570\uFF09\uFF1B\u603B\u89C8\u89C1 batter://guides/intro\u3002`,
1023
- `4. \u56FE\u7247\u8D44\u6E90\u5904\u7406\uFF08\u5FC5\u987B\u9075\u5B88\uFF09\uFF1ADSL \u4E2D icon/\u56FE\u7247\u8282\u70B9\u7684 http://127.0.0.1 \u8D44\u6E90 URL \u7531\u672C\u5730\u670D\u52A1\u6258\u7BA1\uFF0C\u4E25\u7981\u76F4\u63A5\u5199\u8FDB\u4EA4\u4ED8\u4EE3\u7801\uFF08<img src>\u3001background-image \u7B49\uFF09\u2014\u2014\u670D\u52A1\u4E00\u505C\u94FE\u63A5\u5373\u5931\u6548\u3002\u5FC5\u987B\u5148\u7528 curl -L -o <\u672C\u5730\u8DEF\u5F84> <URL>\uFF08Windows \u4E5F\u53EF\u7528 Invoke-WebRequest\uFF09\u4E0B\u8F7D\u5230\u9879\u76EE\u8D44\u6E90\u76EE\u5F55\uFF0C\u518D\u4EE5\u672C\u5730\u76F8\u5BF9\u8DEF\u5F84\u5F15\u7528\u3002`,
1024
- `5. \u751F\u6210\u4EE3\u7801\uFF1Aauto-layout \u76F4\u8BD1 flex\uFF0C\u989C\u8272/\u5706\u89D2/\u9634\u5F71\u7528 DSL \u7684 CSS \u503C\uFF0C\u56FE\u7247\u4E00\u5F8B\u7528\u7B2C 4 \u6B65\u4E0B\u8F7D\u540E\u7684\u672C\u5730\u8DEF\u5F84\u3002`,
1025
- `6. \u81EA\u68C0\uFF1A\u518D\u6B21\u8C03 get_screenshot(guid)\uFF0C\u4E0E\u4EE3\u7801\u6E32\u67D3\u7ED3\u679C\u5BF9\u6BD4\uFF0C\u6709\u504F\u5DEE\u5C31\u4FEE\u6B63\u540E\u518D\u6BD4\u4E00\u8F6E\u3002`
1051
+ `## \u6267\u884C\u6D41\u7A0B`,
1052
+ ``,
1053
+ `1. \u786E\u8BA4\u76EE\u6807\u8282\u70B9\uFF1A${targetLine}`,
1054
+ `2. \u53D6\u6570\u636E\uFF1A\u8C03 \`get_node_dsl(guid)\` \u62FF\u7ED3\u6784\u4E0E\u6837\u5F0F DSL\uFF08\u7ED3\u6784\u5F88\u5927\u65F6\u5148\u7528 \`maxDepth: 0\` \u770B\u6839\u8282\u70B9 \`depth\` \u9884\u5224\u89C4\u6A21\uFF0C\u518D\u5206\u6BB5\u4E0B\u63A2\u2014\u2014\u622A\u65AD\u5904\u8282\u70B9\u5E26 \`more\` \u6807\u8BB0\uFF0C\u62FF\u5176 \`id\` \u56DE\u4F20 \`guid\` \u7EE7\u7EED\u4E0B\u94BB\uFF09\uFF1B\u8C03 \`get_screenshot(guid)\` \u62FF\u89C6\u89C9\u53C2\u7167\u622A\u56FE\uFF08\u8FD4\u56DE\u6587\u4EF6\u540D\uFF0CRead \u76F4\u8BFB\u672C\u5730\u8DEF\u5F84\uFF09\u3002DSL \u4E2D\u5DF2\u5E26 \`img\` \u7684\u8282\u70B9\uFF08ICON/IMAGE \u53F6\u5B50\uFF09\u5DF2\u5B8C\u6210\u5BFC\u51FA\uFF0C\u76F4\u63A5\u7528\u5176\u6587\u4EF6\u540D\uFF0C\u4E0D\u8981\u518D\u8C03 \`export_image\`\u3002`,
1055
+ `3. \u751F\u6210\u4EE3\u7801\uFF1Aauto-layout \u76F4\u8BD1 flex\uFF1B\u989C\u8272/\u5706\u89D2/\u9634\u5F71\u7528 DSL \u7684 CSS \u503C\uFF1B\u56FE\u7247\u4E00\u5F8B\u7528\u5DF2\u590D\u5236\u5230\u9879\u76EE\u7684\u672C\u5730\u8DEF\u5F84\u3002`,
1056
+ `4. \u81EA\u68C0\uFF1A\u518D\u6B21\u8C03 \`get_screenshot(guid)\`\uFF0C\u4E0E\u4EE3\u7801\u6E32\u67D3\u7ED3\u679C\u5BF9\u6BD4\uFF0C\u6709\u504F\u5DEE\u5C31\u4FEE\u6B63\u540E\u518D\u6BD4\u4E00\u8F6E\uFF08\u5BFC\u51FA\u7C7B\u5DE5\u5177\u5E26 15 \u5206\u949F\u7F13\u5B58\uFF1B\u7ED3\u679C\u7591\u4F3C\u8FC7\u671F\u65F6\u52A0 \`cache: "refresh"\` \u5F3A\u5236\u5237\u65B0\uFF09\u3002`,
1057
+ ``,
1058
+ `**\u6700\u540E\u91CD\u7533**\uFF1A\u4EA4\u4ED8\u4EE3\u7801\u4E2D\u4E0D\u5141\u8BB8\u51FA\u73B0\u4EA7\u7269\u76EE\u5F55\u7684\u7EDD\u5BF9\u8DEF\u5F84\uFF0C\u5168\u90E8\u56FE\u7247\u5FC5\u987B\u662F\u5DF2\u590D\u5236\u5230\u9879\u76EE\u7684\u672C\u5730\u76F8\u5BF9\u8DEF\u5F84\u3002`
1026
1059
  ].join("\n")
1027
1060
  }
1028
1061
  }
@@ -1042,11 +1075,11 @@ var init_builtin = __esm({
1042
1075
  BUILTIN_TOOLS = [
1043
1076
  {
1044
1077
  name: "list_sessions",
1045
- description: "\u5217\u51FA\u5F53\u524D\u8FDE\u63A5\u5230\u672C\u670D\u52A1\u7684\u6240\u6709 Pixso \u63D2\u4EF6\u4F1A\u8BDD\uFF08sessionId\u3001\u6587\u4EF6\u3001\u9875\u9762\u3001\u5728\u7EBF\u72B6\u6001\uFF09\u3002\u6BCF\u4E2A\u8FD0\u884C\u63D2\u4EF6\u7684\u8BBE\u8BA1\u6587\u4EF6\u5BF9\u5E94\u4E00\u4E2A\u4F1A\u8BDD\u3002\u591A\u4E2A\u6587\u4EF6\u540C\u65F6\u6253\u5F00\u65F6\uFF1A\u5148\u7528\u672C\u5DE5\u5177\u786E\u8BA4\u76EE\u6807\u6587\u4EF6\uFF0C\u518D\u628A\u8FD4\u56DE\u7684 sessionId \u6216 fileKey \u4F5C\u4E3A get_selected / get_node_dsl / get_screenshot \u7684 target \u53C2\u6570\u4F20\u5165\uFF1B\u53EA\u6709\u4E00\u4E2A\u4F1A\u8BDD\u65F6\u65E0\u9700\u5173\u6CE8\u672C\u5DE5\u5177\u3002\u591A\u6587\u4EF6\u8DEF\u7531\u8BE6\u89C1\u8D44\u6E90 batter://guides/intro\u3002",
1078
+ description: "\u3010\u7528\u9014\u3011\u5217\u51FA\u5F53\u524D\u8FDE\u63A5\u5230\u672C\u670D\u52A1\u7684\u6240\u6709 Pixso \u63D2\u4EF6\u4F1A\u8BDD\uFF08sessionId\u3001\u6587\u4EF6\u3001\u9875\u9762\u3001\u5728\u7EBF\u72B6\u6001\uFF09\u3002\u6BCF\u4E2A\u8FD0\u884C\u63D2\u4EF6\u7684\u8BBE\u8BA1\u6587\u4EF6\u5BF9\u5E94\u4E00\u4E2A\u4F1A\u8BDD\u3002\u3010\u547D\u4E2D\u4FE1\u53F7\u3011\u591A\u4E2A Pixso \u6587\u4EF6\u540C\u65F6\u8FD0\u884C\u63D2\u4EF6\u65F6\uFF0C\u5148\u7528\u672C\u5DE5\u5177\u786E\u8BA4\u76EE\u6807\u6587\u4EF6\uFF1B\u53EA\u6709\u4E00\u4E2A\u4F1A\u8BDD\u65F6\u65E0\u9700\u5173\u6CE8\u672C\u5DE5\u5177\u3002\u3010\u8FD4\u56DE\u3011\u4F1A\u8BDD\u5217\u8868 JSON\u3002\u628A sessionId \u6216 fileKey \u4F5C\u4E3A get_selected / get_node_dsl / get_screenshot / export_image \u7684 target \u53C2\u6570\u4F20\u5165\u5373\u8DEF\u7531\u5230\u5BF9\u5E94\u6587\u4EF6\uFF1B\u4E0D\u4F20 target \u65F6\u8DEF\u7531\u5230\u6700\u8FD1\u6D3B\u8DC3\u7684\u6587\u4EF6\u3002\u591A\u6587\u4EF6\u8DEF\u7531\u8BE6\u89C1\u8D44\u6E90 batter://guides/intro\u3002",
1046
1079
  inputSchema: { type: "object", properties: {} },
1047
1080
  handler: async () => {
1048
1081
  const list = sessions.list();
1049
- const text = list.length ? JSON.stringify(list, null, 2) : "\u5F53\u524D\u6CA1\u6709\u63D2\u4EF6\u8FDE\u63A5\uFF1A\u8BF7\u5728 Pixso \u5BA2\u6237\u7AEF\u4E2D\u8FD0\u884C Batter Pixso Bridge \u63D2\u4EF6\u3002";
1082
+ const text = list.length ? JSON.stringify(list) : "\u5F53\u524D\u6CA1\u6709\u63D2\u4EF6\u8FDE\u63A5\uFF1A\u8BF7\u5728 Pixso \u5BA2\u6237\u7AEF\u4E2D\u8FD0\u884C Batter Pixso Bridge \u63D2\u4EF6\u3002";
1050
1083
  return { content: [{ type: "text", text }] };
1051
1084
  }
1052
1085
  }
@@ -1189,7 +1222,7 @@ var init_commands = __esm({
1189
1222
 
1190
1223
  // src/tools/plugin.ts
1191
1224
  function jsonResult(data) {
1192
- return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
1225
+ return { content: [{ type: "text", text: JSON.stringify(data) }] };
1193
1226
  }
1194
1227
  function errorResult(err) {
1195
1228
  return {
@@ -1207,48 +1240,83 @@ async function run(type, args, signal) {
1207
1240
  return errorResult(err);
1208
1241
  }
1209
1242
  }
1210
- var URL_RULE, TARGET_PROP, PLUGIN_TOOLS;
1243
+ var URL_RULE, URL_RULE_PTR, SELECT_RULE_PTR, ASSET_RULE, DSL_LEGEND, TARGET_PROP, CACHE_PROP, GUID_PROP, PLUGIN_TOOLS;
1211
1244
  var init_plugin = __esm({
1212
1245
  "src/tools/plugin.ts"() {
1213
1246
  "use strict";
1247
+ init_assets();
1214
1248
  init_commands();
1215
- URL_RULE = '\u3010\u94FE\u63A5\u5904\u7406\u89C4\u5219\uFF0C\u5FC5\u987B\u9075\u5B88\u3011\u7528\u6237\u63D0\u4F9B\u7684 Pixso \u94FE\u63A5\u53EF\u80FD\u662F\u4EFB\u610F\u57DF\u540D\uFF1A\u5B98\u65B9 pixso.cn \u6216\u79C1\u6709\u5316\u90E8\u7F72\uFF08\u5982 pixso.ky-tech.com.cn\uFF09\uFF0C\u683C\u5F0F\u5F62\u5982 https://<\u57DF\u540D>/app/design/<\u6587\u4EF6>?item-id=1%3A2\uFF08\u4E5F\u53EF\u80FD\u662F /app/editor/ \u8DEF\u5F84\uFF09\u3002\u770B\u5230\u8FD9\u7C7B\u94FE\u63A5\u65F6\uFF1A\u5148\u4ECE\u67E5\u8BE2\u53C2\u6570 item-id \u63D0\u53D6\u8282\u70B9 guid \u5E76 URL \u89E3\u7801\uFF081%3A2 \u2192 "1:2"\uFF09\uFF0C\u628A\u89E3\u7801\u540E\u7684\u503C\u4F5C\u4E3A guid \u53C2\u6570\u4F20\u5165\uFF1B\u4E25\u7981\u628A\u6574\u4E2A URL \u5F53 guid \u4F20\uFF0C\u4E5F\u4E0D\u8981\u56E0\u4E3A\u57DF\u540D\u4E0D\u8BA4\u8BC6\u5C31\u5FFD\u7565\u94FE\u63A5\u3002';
1249
+ URL_RULE = '\u2460 \u94FE\u63A5\u8F93\u5165\uFF1A\u5FC5\u987B\u4ECE item-id \u67E5\u8BE2\u53C2\u6570\u63D0\u53D6\u8282\u70B9 guid \u5E76 URL \u89E3\u7801\uFF081%3A2 \u2192 "1:2"\uFF09\uFF0C\u628A\u89E3\u7801\u503C\u4F5C\u4E3A guid \u4F20\u5165\uFF1B\u4E25\u7981\u628A\u6574\u4E2A URL \u5F53 guid \u4F20\u3002\u4EFB\u610F\u57DF\u540D\u90FD\u6709\u6548\uFF1A\u5B98\u65B9 pixso.cn \u6216\u79C1\u6709\u5316\u90E8\u7F72\uFF08\u5982 pixso.ky-tech.com.cn\uFF09\uFF0C\u683C\u5F0F\u5F62\u5982 https://<\u57DF\u540D>/app/design/<\u6587\u4EF6>?item-id=1%3A2\uFF08\u4E5F\u53EF\u80FD\u662F /app/editor/ \u8DEF\u5F84\uFF09\u3002';
1250
+ URL_RULE_PTR = "\u2460 \u94FE\u63A5\u8F93\u5165\uFF1A\u5FC5\u987B\u4ECE item-id \u63D0\u53D6 guid \u5E76 URL \u89E3\u7801\u540E\u4F20\u5165\uFF0C\u4E25\u7981\u4F20\u6574\u4E2A URL\uFF08\u89C4\u5219\u5168\u6587\u89C1 get_node_dsl\uFF09\u3002";
1251
+ SELECT_RULE_PTR = '\u2461 \u9009\u4E2D\u56DE\u9000\uFF1A\u672A\u4F20 guid \u65F6\u56DE\u9000\u5F53\u524D\u9009\u4E2D\u56FE\u5C42\uFF0C\u4F46\u4E25\u7981\u9690\u5F0F\u4F7F\u7528\u2014\u2014\u9664\u975E\u7528\u6237\u660E\u786E\u8BF4\u4E86"\u6211\u9009\u4E2D\u7684/\u5F53\u524D\u9009\u4E2D\u7684"\uFF0C\u5FC5\u987B\u5148\u8C03 get_selected \u628A\u9009\u4E2D\u56FE\u5C42\u540D\u79F0\u62A5\u7ED9\u7528\u6237\u786E\u8BA4\uFF08\u89C4\u5219\u5168\u6587\u89C1 get_selected\uFF09\u3002';
1252
+ ASSET_RULE = `\u2462 \u8D44\u6E90\uFF1Aimg \u662F\u4EA7\u7269\u6587\u4EF6\u540D\uFF08\u5185\u5BB9 hash \u547D\u540D\uFF0C\u5982 "6a4d1730d46bae01.svg"\uFF09\uFF0C\u5B8C\u6574\u672C\u5730\u8DEF\u5F84 = ${assetDir()}\\<\u6587\u4EF6\u540D>\uFF08\u672C\u673A\u6587\u4EF6\uFF0C\u76F4\u63A5\u8BFB\u6587\u4EF6\u7CFB\u7EDF\uFF09\u3002\u622A\u56FE\u7B49\u89C6\u89C9\u53C2\u7167\u7528 Read \u5DE5\u5177\u76F4\u8BFB\u8BE5\u8DEF\u5F84\uFF0C\u65E0\u9700\u590D\u5236\uFF1B\u8981\u5199\u8FDB\u4EA4\u4ED8\u4EE3\u7801\u7684\u56FE\u6807/\u56FE\u7247\u5FC5\u987B\u5148\u590D\u5236\u5230\u9879\u76EE\u8D44\u6E90\u76EE\u5F55\uFF08PowerShell: Copy-Item "<\u5B8C\u6574\u8DEF\u5F84>" "<\u9879\u76EE\u76EE\u5F55>"\uFF1B\u7C7B Unix: cp "<\u5B8C\u6574\u8DEF\u5F84>" "<\u9879\u76EE\u76EE\u5F55>"\uFF09\uFF0C\u518D\u4EE5\u672C\u5730\u76F8\u5BF9\u8DEF\u5F84\u5F15\u7528\u3002\u590D\u5236\u65F6\u5FC5\u987B\u6309\u8282\u70B9\u7528\u9014\u81EA\u884C\u547D\u540D\u8BED\u4E49\u5316\u76EE\u6807\u6587\u4EF6\u540D\uFF08\u5982 icon-arrow.svg\u3001hero-banner.png\uFF1Bexport_image \u8FD4\u56DE\u7684 suffix \u5EFA\u8BAE\u4FDD\u7559\uFF09\uFF0C\u4E25\u7981\u628A hash \u6587\u4EF6\u540D\u5E26\u8FDB\u4EA4\u4ED8\u4EE3\u7801\u3002\u4E25\u7981\u76F4\u63A5\u5F15\u7528\u4EA7\u7269\u76EE\u5F55\u7684\u7EDD\u5BF9\u8DEF\u5F84\uFF08\u4EA7\u7269\u9ED8\u8BA4 7 \u5929\u540E\u81EA\u52A8\u6E05\u626B\uFF0C\u5F15\u7528\u4F1A\u5931\u6548\uFF09\uFF0C\u4E25\u7981\u79FB\u52A8\u6216\u5220\u9664\u4EA7\u7269\u76EE\u5F55\u4E0B\u7684\u6587\u4EF6\uFF08\u591A\u4F1A\u8BDD\u5171\u4EAB\uFF0C\u6E05\u626B\u7531\u670D\u52A1\u7EDF\u4E00\u8D1F\u8D23\uFF09\u3002`;
1253
+ DSL_LEGEND = '\u5B57\u6BB5\u56FE\u4F8B\uFF1Aid=\u8282\u70B9 guid\uFF08\u53EF\u56DE\u4F20\u4E3A guid \u53C2\u6570\u5BF9\u5B50\u8282\u70B9\u4E0B\u94BB\u8C03\u7528\uFF09\uFF1Bname=\u56FE\u5C42\u540D\uFF08\u81EA\u52A8\u547D\u540D\u5982 "Frame 3123" \u5DF2\u7701\u7565\uFF09\uFF1Btype=\u8282\u70B9\u7C7B\u578B\uFF0CICON/IMAGE \u4E3A\u584C\u7F29\u53F6\u5B50\uFF1Brect=[x,y,w,h] \u7EDD\u5BF9\u5B9A\u4F4D\uFF08\u6839\u8282\u70B9\u4E0E\u7EDD\u5BF9\u5B9A\u4F4D\u5BB9\u5668\u7684\u5B50\u8282\u70B9\uFF09\uFF1Bsize=[w,h]\uFF08auto-layout \u5B50\u8282\u70B9\uFF0Cx/y \u7531\u7236\u7EA7 layout \u63A8\u5BFC\u6545\u7701\u7565\uFF09\uFF1Blayout={dir:row|column, gap, pad:[\u4E0A,\u53F3,\u4E0B,\u5DE6], align:[\u4E3B\u8F74,\u4EA4\u53C9\u8F74](start|center|end|space-between|baseline), sizing:[\u4E3B\u8F74,\u4EA4\u53C9\u8F74](hug|fixed|fill)}\uFF1Bconstraints={h,v} \u7EDD\u5BF9\u5B9A\u4F4D\u5B50\u8282\u70B9\u7EA6\u675F\uFF08\u9ED8\u8BA4 left/top \u7701\u7565\uFF09\uFF1Btext={content, size=\u5B57\u53F7, font=\u5B57\u65CF, weight=\u5B57\u91CD, lh=\u884C\u9AD8, align=\u6C34\u5E73\u5BF9\u9F50, color, deco=underline|line-through, ls=\u5B57\u8DDD px, link, segs=\u6DF7\u6392\u5206\u6BB5}\uFF08segs \u6BCF\u6BB5\u53EA\u5E26\u4E0E base \u4E0D\u540C\u7684\u5B57\u6BB5\uFF0C\u6570\u7EC4\u987A\u5E8F\u5373\u5B57\u7B26\u504F\u79FB\uFF09\uFF1Bimg=\u8D44\u6E90\u6587\u4EF6\u540D\uFF1Bkids=\u5B50\u8282\u70B9\u6570\u7EC4\uFF1Bpalette=\u8C03\u8272\u677F\uFF08\u4EC5\u6839\u8282\u70B9\uFF09\u3002depth=\u6574\u68F5\u6811\u5B9E\u9645\u6700\u5927\u6DF1\u5EA6\uFF08\u4EC5\u6839\u8282\u70B9\uFF0C\u603B\u662F\u8F93\u51FA\uFF0C\u4E0E\u622A\u65AD\u65E0\u5173\uFF09\uFF1Bmore=\u8BE5\u8282\u70B9\u4E0B\u672A\u5C55\u5F00\u7684\u5269\u4F59\u5C42\u7EA7\u6570\uFF08\u4EC5\u56E0 maxDepth \u622A\u65AD\u65F6\u51FA\u73B0\uFF0C\u62FF id \u56DE\u4F20 guid \u53EF\u7EE7\u7EED\u4E0B\u94BB\uFF09\u3002\u7701\u7565\u89C4\u5219\uFF1A\u9ED8\u8BA4\u503C\u4E0D\u8F93\u51FA\uFF08text.align=left\u3001lh=normal\u3001weight=Regular\u3001gap=0\u3001pad \u5168 0\uFF09\u3002\u8C03\u8272\u677F\uFF1A\u51FA\u73B0\u22652 \u6B21\u7684\u5355\u8272\u63D0\u53D6\u5230\u6839\u8282\u70B9 palette \u6570\u7EC4\uFF0Cfills/text.color/stroke \u4E2D\u7684 "p0""p1" \u4E3A palette \u4E0B\u6807\u5F15\u7528\uFF1Bshadow/gradient \u7B49\u590D\u5408 CSS \u4E32\u5185\u7684\u989C\u8272\u4FDD\u6301\u5B57\u9762\u503C\uFF0C\u4E0D\u67E5\u8868\u3002';
1216
1254
  TARGET_PROP = {
1217
1255
  type: "string",
1218
1256
  description: "\u76EE\u6807\u63D2\u4EF6\u4F1A\u8BDD\uFF08sessionId \u6216 fileKey\uFF09\u3002\u4EC5\u5F53\u591A\u4E2A Pixso \u6587\u4EF6\u540C\u65F6\u8FD0\u884C\u63D2\u4EF6\u65F6\u9700\u8981\u6307\u5B9A\uFF1B\u7F3A\u7701\u8DEF\u7531\u5230\u6700\u8FD1\u6D3B\u8DC3\u7684\u6587\u4EF6\u3002\u53EF\u7528 list_sessions \u67E5\u770B\u5F53\u524D\u4F1A\u8BDD\u3002"
1219
1257
  };
1258
+ CACHE_PROP = {
1259
+ type: "string",
1260
+ enum: ["first", "refresh"],
1261
+ description: "\u7F13\u5B58\u7B56\u7565\uFF1Afirst=\u7F13\u5B58\u4F18\u5148\uFF08\u9ED8\u8BA4\uFF0C15 \u5206\u949F\u5185\u76F8\u540C\u8C03\u7528\u76F4\u63A5\u8FD4\u56DE\u7F13\u5B58\uFF09\uFF1Brefresh=\u4E0D\u8BFB\u7F13\u5B58\u3001\u5F3A\u5236\u91CD\u65B0\u6784\u5EFA/\u5BFC\u51FA\uFF0C\u7ED3\u679C\u4ECD\u5199\u5165\u7F13\u5B58\u3002\u8BBE\u8BA1\u7A3F\u521A\u4FEE\u6539\u8FC7\u4E14\u7ED3\u679C\u5BF9\u4E0D\u4E0A\u65F6\u7528 refresh\u3002"
1262
+ };
1263
+ GUID_PROP = {
1264
+ type: "string",
1265
+ description: '\u8282\u70B9 GUID\uFF08\u5982 "297:133032"\uFF09\u3002\u94FE\u63A5\u8F93\u5165\uFF1A\u4ECE item-id \u67E5\u8BE2\u53C2\u6570\u63D0\u53D6\u5E76 URL \u89E3\u7801\u540E\u4F20\u5165\uFF1B\u7F3A\u7701\u56DE\u9000\u5F53\u524D\u9009\u4E2D\u56FE\u5C42\uFF0C\u4F46\u7981\u6B62\u9690\u5F0F\u4F7F\u7528\u8BE5\u56DE\u9000\uFF08\u9009\u4E2D\u786E\u8BA4\u89C4\u5219\u89C1\u5DE5\u5177 description\uFF09\u3002'
1266
+ };
1220
1267
  PLUGIN_TOOLS = [
1221
1268
  {
1222
1269
  name: "get_selected",
1223
- description: '\u83B7\u53D6 Pixso \u753B\u5E03\u5F53\u524D\u9009\u4E2D\u7684\u56FE\u5C42\u5217\u8868\uFF08guid\u3001\u540D\u79F0\u3001\u7C7B\u578B\u3001\u5C3A\u5BF8\uFF09\uFF0C\u5B9E\u65F6\u8BFB\u53D6\u3002\u5F53\u7528\u6237\u8BF4"\u8FD9\u4E2A/\u5F53\u524D\u9009\u4E2D\u7684"\u65F6\uFF0C\u5148\u8C03\u7528\u672C\u5DE5\u5177\u786E\u8BA4\u9009\u4E2D\u5BF9\u8C61\uFF0C\u518D\u628A\u8FD4\u56DE\u7684 guid \u4F20\u7ED9 get_node_dsl \u6216 get_screenshot\u3002\u4E0D\u8981\u7528\u5B83\u6765\u9A8C\u8BC1\u591A\u6587\u4EF6\u8DEF\u7531\u2014\u2014\u591A\u6587\u4EF6\u573A\u666F\u7528 list_sessions\u3002\u6CE8\u610F\uFF1A\u5982\u679C\u7528\u6237\u5DF2\u7ECF\u63D0\u4F9B\u4E86 Pixso \u94FE\u63A5\uFF08\u4EFB\u610F\u57DF\u540D\uFF0C\u542B\u79C1\u6709\u5316\u90E8\u7F72\uFF09\uFF0C\u4E0D\u8981\u8C03\u7528\u672C\u5DE5\u5177\u2014\u2014\u76F4\u63A5\u4ECE\u94FE\u63A5\u7684 item-id \u63D0\u53D6 guid \u4F20\u7ED9 get_node_dsl / get_screenshot \u5373\u53EF\u3002',
1270
+ description: '\u3010\u7528\u9014\u3011\u83B7\u53D6 Pixso \u753B\u5E03\u5F53\u524D\u9009\u4E2D\u7684\u56FE\u5C42\u5217\u8868\uFF08guid\u3001\u540D\u79F0\u3001\u7C7B\u578B\u3001\u5C3A\u5BF8\uFF09\uFF0C\u5B9E\u65F6\u8BFB\u53D6\u3002\u3010\u547D\u4E2D\u4FE1\u53F7\u3011\u7528\u6237\u8BF4"\u8FD9\u4E2A/\u5F53\u524D\u9009\u4E2D\u7684"\u56FE\u5C42\u3001\u7EC4\u4EF6\u6216\u5143\u7D20\u3002\u7528\u6237\u5DF2\u63D0\u4F9B Pixso \u94FE\u63A5\u65F6\u4E0D\u8981\u8C03\u672C\u5DE5\u5177\u2014\u2014\u76F4\u63A5\u4ECE\u94FE\u63A5\u63D0\u53D6 guid\uFF08\u89C4\u5219\u89C1 get_node_dsl\uFF09\u3002\u591A\u6587\u4EF6\u8DEF\u7531\u7528 list_sessions\uFF0C\u4E0D\u7528\u672C\u5DE5\u5177\u3002\u3010\u8FD4\u56DE\u3011\u9009\u4E2D\u56FE\u5C42\u5217\u8868 JSON\u3002\u3010\u786C\u6027\u89C4\u5219\u3011\u4E25\u7981\u9690\u5F0F\u4F7F\u7528\u672C\u5DE5\u5177\u8FD4\u56DE\u7684 guid\uFF1A\u4EC5\u5F53\u7528\u6237\u660E\u786E\u8BF4\u4E86"\u6211\u9009\u4E2D\u7684/\u5F53\u524D\u9009\u4E2D\u7684"\uFF0C\u62FF\u5230 guid \u624D\u53EF\u76F4\u63A5\u7EE7\u7EED\uFF1B\u5176\u4F59\u573A\u666F\u5FC5\u987B\u5148\u628A\u9009\u4E2D\u56FE\u5C42\u540D\u79F0\u62A5\u7ED9\u7528\u6237\u786E\u8BA4\uFF08"\u5F53\u524D\u9009\u4E2D\u7684\u662F\u300CXX\u300D\uFF0C\u786E\u8BA4\u5904\u7406\u5B83\u5417\uFF1F"\uFF09\uFF0C\u786E\u8BA4\u540E\u624D\u80FD\u628A guid \u4F20\u7ED9\u5176\u4ED6\u5DE5\u5177\u2014\u2014\u907F\u514D\u9009\u533A\u7406\u89E3\u9519\u800C\u767D\u505A\u3002',
1224
1271
  inputSchema: { type: "object", properties: { target: TARGET_PROP } },
1225
1272
  handler: (args, ctx) => run("get_selected", args, ctx?.signal)
1226
1273
  },
1227
1274
  {
1228
1275
  name: "get_node_dsl",
1229
- description: "\u751F\u6210\u8282\u70B9\u7684\u5F00\u53D1\u5411\u7CBE\u7B80 DSL\uFF0C\u662F\u8BBE\u8BA1\u8F6C\u4EE3\u7801\u7684\u6838\u5FC3\u5165\u53E3\uFF0C\u4F18\u5148\u7528\u672C\u5DE5\u5177\u7406\u89E3\u8BBE\u8BA1\u7ED3\u6784\u3002\u7528\u6237\u8981\u6C42\u8FD8\u539F/\u5B9E\u73B0\u67D0\u4E2A\u8BBE\u8BA1\u7A3F\u8282\u70B9\u65F6\u9ED8\u8BA4\u4ECE\u672C\u5DE5\u5177\u5F00\u59CB\u3002\u8FD4\u56DE\u5C42\u7EA7\u5316 JSON\uFF1Arect\uFF08\u7EDD\u5BF9\u5B9A\u4F4D\uFF09\u3001layout\uFF08auto-layout\u2192flex \u76F4\u8BD1\uFF1Adirection/gap/padding/align/sizing\uFF09\u3001 text\uFF08\u5B57\u53F7/\u5B57\u65CF/\u5B57\u91CD/\u884C\u9AD8/\u989C\u8272\uFF1B\u6DF7\u6392\u6587\u672C\u5E26 segments \u5206\u6BB5\u6837\u5F0F\uFF09\u3001fills/stroke/radius/shadow/blur\uFF08CSS \u5316\uFF09\u3001 constraints\uFF08\u7EDD\u5BF9\u5B9A\u4F4D\u5BB9\u5668\u5185\u5B50\u8282\u70B9\u7EA6\u675F\u610F\u56FE\uFF09\u3001children \u9012\u5F52\u3002\u53F6\u5B50\u584C\u7F29\u89C4\u5219\uFF1Aicon/\u7EAF\u77E2\u91CF\u5C0F\u8282\u70B9\uFF08\u226464px \u65E0\u6587\u672C\uFF09\u5BFC\u51FA\u4E3A SVG URL\u3001\u56FE\u7247\u586B\u5145\u8282\u70B9\u5BFC\u51FA\u4E3A PNG URL\u3001\u8BBE\u8BA1\u5E08\u6807\u8BB0\u5BFC\u51FA\u7684\u8282\u70B9\u6309\u5176\u8BBE\u7F6E\u5BFC\u51FA\uFF1B\u8FD9\u4E9B URL \u7531\u672C\u5730\u670D\u52A1\u6258\u7BA1\uFF08immutable \u7F13\u5B58\uFF09\uFF0C\u4E25\u7981\u76F4\u63A5\u5199\u8FDB\u4EA4\u4ED8\u4EE3\u7801\u2014\u2014\u5FC5\u987B\u5148\u7528 curl \u7B49\u4E0B\u8F7D\u5230\u9879\u76EE\u8D44\u6E90\u76EE\u5F55\uFF0C\u518D\u4EE5\u672C\u5730\u76F8\u5BF9\u8DEF\u5F84\u5F15\u7528\u3002DSL \u662F\u6709\u635F\u7CBE\u7B80\uFF08\u7701\u7565\u8499\u7248\u3001\u5E03\u5C14\u8FD0\u7B97\u8DEF\u5F84\u7B49\uFF09\uFF0C\u89C6\u89C9\u590D\u6742\u8282\u70B9\u914D\u5408 get_screenshot \u5BF9\u7167\u3002\u672A\u63D0\u4F9B guid \u65F6\u4F7F\u7528\u5F53\u524D\u9009\u4E2D\u56FE\u5C42\u3002" + URL_RULE + "\u5B57\u6BB5\u8BED\u4E49\u8BE6\u89C1\u8D44\u6E90 batter://guides/design-to-code\u3002",
1276
+ description: '\u3010\u7528\u9014\u3011\u751F\u6210\u8282\u70B9\u7684\u5F00\u53D1\u5411\u7D27\u51D1 DSL\uFF08\u7ED3\u6784+\u6837\u5F0F+\u8D44\u6E90\u6587\u4EF6\u540D\uFF09\uFF0C\u8BBE\u8BA1\u8F6C\u4EE3\u7801\u7684\u6838\u5FC3\u5165\u53E3\uFF0C\u4F18\u5148\u7528\u672C\u5DE5\u5177\u7406\u89E3\u8BBE\u8BA1\u7ED3\u6784\u3002\u3010\u547D\u4E2D\u4FE1\u53F7\u3011\u7528\u6237\u8981\u6C42"\u6837\u5F0F\u8FD8\u539F/\u8BBE\u8BA1\u8FD8\u539F/UI \u8FD8\u539F/\u8BBE\u8BA1\u8F6C\u4EE3\u7801/\u6839\u636E\u8BBE\u8BA1\u7A3F\u6216\u8BBE\u8BA1\u56FE\u5199\u9875\u9762\u3001\u7EC4\u4EF6"\uFF0C\u6216\u7ED9\u51FA Pixso \u94FE\u63A5\uFF08\u4EFB\u610F\u57DF\u540D\uFF09\u65F6\uFF0C\u9ED8\u8BA4\u4ECE\u672C\u5DE5\u5177\u5F00\u59CB\u3002\u7ED3\u6784\u590D\u6742\u60F3\u5148\u770B\u6574\u4F53\u6846\u67B6\u65F6\uFF1AmaxDepth \u4F20 0 \u53EA\u62FF\u6839\u8282\u70B9\uFF08depth \u5B57\u6BB5=\u6574\u6811\u5B9E\u9645\u6DF1\u5EA6\uFF09\u9884\u5224\u89C4\u6A21\uFF0C\u518D\u5BF9\u5E26 more \u6807\u8BB0\u7684\u5B50\u6811\u5206\u6BB5\u4E0B\u94BB\u3002\u3010\u8FD4\u56DE\u3011\u5355\u884C\u7D27\u51D1 JSON\u3002' + DSL_LEGEND + "\u53F6\u5B50\u584C\u7F29\u89C4\u5219\uFF1Aicon/\u7EAF\u77E2\u91CF\u5C0F\u8282\u70B9\uFF08\u226464px \u65E0\u6587\u672C\uFF09\u5BFC\u51FA SVG\u3001\u56FE\u7247\u586B\u5145\u8282\u70B9\u5BFC\u51FA PNG\u3001\u8BBE\u8BA1\u5E08\u6807\u8BB0\u6309\u5176\u8BBE\u7F6E\u5BFC\u51FA\u3002\u5DF2\u5E26 img \u7684\u8282\u70B9\u5373\u5B8C\u6210\u5BFC\u51FA\uFF0C\u76F4\u63A5\u4F7F\u7528\u5176\u6587\u4EF6\u540D\uFF0C\u65E0\u9700\u518D\u8C03 export_image\u3002DSL \u662F\u6709\u635F\u7CBE\u7B80\uFF08\u7701\u7565\u8499\u7248\u3001\u5E03\u5C14\u8FD0\u7B97\u8DEF\u5F84\u7B49\uFF09\uFF0C\u89C6\u89C9\u590D\u6742\u8282\u70B9\u914D\u5408 get_screenshot \u5BF9\u7167\u3002\u5B57\u6BB5\u8BED\u4E49\u8BE6\u89C1\u8D44\u6E90 batter://guides/design-to-code\u3002\u3010\u786C\u6027\u89C4\u5219\u3011" + URL_RULE + SELECT_RULE_PTR + ASSET_RULE,
1230
1277
  inputSchema: {
1231
1278
  type: "object",
1232
1279
  properties: {
1233
- guid: {
1234
- type: "string",
1235
- description: '\u8282\u70B9 GUID\uFF0C\u5982 "297:133032"\u3002\u7F3A\u7701\u4F7F\u7528\u5F53\u524D\u9009\u4E2D\u56FE\u5C42\u3002\u7528\u6237\u63D0\u4F9B Pixso \u94FE\u63A5\u65F6\uFF1A\u4ECE item-id \u67E5\u8BE2\u53C2\u6570\u63D0\u53D6\u5E76 URL \u89E3\u7801\uFF081%3A2 \u2192 "1:2"\uFF09\uFF0C\u4E0D\u8981\u4F20\u5B8C\u6574 URL\u3002'
1280
+ guid: GUID_PROP,
1281
+ maxDepth: {
1282
+ type: "number",
1283
+ description: "\u4E0B\u63A2\u5B50\u8282\u70B9\u7684\u6700\u5927\u6DF1\u5EA6\uFF08\u6839\u8282\u70B9\u4E3A\u7B2C 0 \u5C42\uFF09\uFF0C\u7F3A\u7701\u4E0D\u9650\u3002\u7B2C N \u5C42\u8282\u70B9\u82E5\u4ECD\u6709\u5B50\u8282\u70B9\u5219\u5E26 more \u5B57\u6BB5\uFF08\u5269\u4F59\u672A\u5C55\u5F00\u5C42\u7EA7\u6570\uFF09\uFF0C\u62FF\u5176 id \u56DE\u4F20 guid \u53EF\u7EE7\u7EED\u4E0B\u94BB\u3002\u4F20 0 \u53EA\u8FD4\u56DE\u6839\u8282\u70B9\uFF1A\u914D\u5408\u6839\u8282\u70B9 depth \u5B57\u6BB5\uFF08\u6574\u6811\u5B9E\u9645\u6DF1\u5EA6\uFF09\u5EC9\u4EF7\u9884\u5224\u89C4\u6A21\uFF0C\u518D\u51B3\u5B9A\u4E0B\u94BB\u7B56\u7565\u3002"
1236
1284
  },
1285
+ cache: CACHE_PROP,
1237
1286
  target: TARGET_PROP
1238
1287
  }
1239
1288
  },
1240
1289
  handler: (args, ctx) => run("get_node_dsl", args, ctx?.signal)
1241
1290
  },
1242
1291
  {
1243
- name: "get_screenshot",
1244
- description: '\u5BFC\u51FA\u5355\u4E2A\u8282\u70B9\u7684\u622A\u56FE\uFF0C\u8FD4\u56DE\u53EF\u8BBF\u95EE\u7684\u56FE\u7247 URL\uFF0C\u7528\u4E8E\u83B7\u53D6\u8BBE\u8BA1\u7684\u89C6\u89C9\u53C2\u7167\u3002\u6BCF\u6B21\u53EA\u5904\u7406\u4E00\u4E2A\u8282\u70B9\uFF1B\u591A\u8282\u70B9\u573A\u666F\u9010\u4E2A\u8C03\u7528\uFF0C\u4E0D\u8981\u6307\u671B\u6279\u91CF\u3002\u7528\u6237\u8BF4"\u770B\u770B\u8FD9\u4E2A\u8BBE\u8BA1\u957F\u4EC0\u4E48\u6837""\u7ED9\u6211\u622A\u56FE"\u65F6\u7528\u672C\u5DE5\u5177\u3002\u8BBE\u8BA1\u8FD8\u539F\u7C7B\u4EFB\u52A1\u5EFA\u8BAE\u4E0E get_node_dsl \u914D\u5408\uFF1ADSL \u5B9A\u7ED3\u6784\uFF0C\u622A\u56FE\u6821\u9A8C\u89C6\u89C9\u3002\u751F\u6210\u4EE3\u7801\u540E\u53EF\u518D\u6B21\u8C03\u7528\u672C\u5DE5\u5177\uFF0C\u4E0E\u6E32\u67D3\u7ED3\u679C\u5BF9\u6BD4\u68C0\u67E5\u8FD8\u539F\u5EA6\u3002\u672A\u63D0\u4F9B guid \u65F6\u4F7F\u7528\u5F53\u524D\u9009\u4E2D\u56FE\u5C42\u3002' + URL_RULE,
1292
+ name: "export_image",
1293
+ description: '\u3010\u7528\u9014\u3011\u6309 guid \u5BFC\u51FA\u56FE\u7247\u7D20\u6750\uFF08\u5207\u56FE\uFF09\uFF0C\u4EA7\u7269\u4F9B\u4EA4\u4ED8\u4EE3\u7801\u4F7F\u7528\u3002\u6BCF\u6B21\u53EA\u5904\u7406\u4E00\u4E2A\u8282\u70B9\uFF1B\u591A\u8282\u70B9\u573A\u666F\u9010\u4E2A\u8C03\u7528\u3002\u4EC5\u7528\u4E8E DSL \u4E2D\u672A\u584C\u7F29\u7684\u8282\u70B9\u2014\u2014get_node_dsl \u8FD4\u56DE\u91CC\u5DF2\u5E26 img \u5B57\u6BB5\u7684\u8282\u70B9\uFF08ICON/IMAGE \u53F6\u5B50\uFF09\u5728\u53D6 DSL \u65F6\u5DF2\u5B8C\u6210\u5BFC\u51FA\uFF0C\u76F4\u63A5\u4F7F\u7528\u5176 img \u6587\u4EF6\u540D\u5373\u53EF\uFF0C\u4E25\u7981\u5BF9\u8FD9\u7C7B\u8282\u70B9\u91CD\u590D\u8C03\u7528\u672C\u5DE5\u5177\u3002\u3010\u547D\u4E2D\u4FE1\u53F7\u3011\u7528\u6237\u8981"\u5207\u56FE/\u5BFC\u51FA\u56FE\u6807/\u5BFC\u51FA\u56FE\u7247\u7D20\u6750/\u628A\u67D0\u4E2A\u8282\u70B9\u5B58\u6210\u56FE\u7247"\uFF0C\u6216\u8BBE\u8BA1\u8FD8\u539F\u4E2D\u9700\u8981\u63D0\u53D6\u56FE\u7247\u8D44\u6E90\u3002\u8981\u89C6\u89C9\u53C2\u7167/\u8FD8\u539F\u5EA6\u6821\u9A8C\u7528 get_screenshot\u3002\u3010\u8FD4\u56DE\u3011{width, height, exports: [{img, format, scale?, suffix?}]}\uFF1A\u8282\u70B9\u5E26\u8BBE\u8BA1\u5E08\u5BFC\u51FA\u8BBE\u7F6E\uFF08exportSettings\uFF09\u65F6\u6309\u5176\u8BBE\u7F6E\u9010\u4EFD\u5BFC\u51FA\uFF08\u683C\u5F0F/\u500D\u7387/\u540E\u7F00\u5168\u90E8\u751F\u6548\uFF0Cformat/scale \u53C2\u6570\u65E0\u6548\uFF09\uFF1B\u65E0\u6807\u8BB0\u8282\u70B9\u6309\u53C2\u6570\u5BFC\u51FA\u5355\u4EFD\uFF08\u9ED8\u8BA4 PNG\u30012x\uFF09\u3002img \u4E3A\u4EA7\u7269\u6587\u4EF6\u540D\uFF1Bsuffix \u4E3A\u8BBE\u8BA1\u5E08\u8BBE\u7F6E\u7684\u6587\u4EF6\u540D\u540E\u7F00\uFF08\u5982 "@2x"\uFF09\uFF0C\u590D\u5236\u8FDB\u9879\u76EE\u65F6\u5EFA\u8BAE\u4FDD\u7559\u547D\u540D\u3002\u3010\u786C\u6027\u89C4\u5219\u3011' + URL_RULE_PTR + SELECT_RULE_PTR + ASSET_RULE,
1245
1294
  inputSchema: {
1246
1295
  type: "object",
1247
1296
  properties: {
1248
- guid: {
1297
+ guid: GUID_PROP,
1298
+ format: {
1249
1299
  type: "string",
1250
- description: '\u8282\u70B9 GUID\uFF0C\u5982 "297:133032"\u3002\u7F3A\u7701\u4F7F\u7528\u5F53\u524D\u9009\u4E2D\u56FE\u5C42\u3002\u7528\u6237\u63D0\u4F9B Pixso \u94FE\u63A5\u65F6\uFF1A\u4ECE item-id \u67E5\u8BE2\u53C2\u6570\u63D0\u53D6\u5E76 URL \u89E3\u7801\uFF081%3A2 \u2192 "1:2"\uFF09\uFF0C\u4E0D\u8981\u4F20\u5B8C\u6574 URL\u3002'
1300
+ enum: ["PNG", "SVG", "JPG"],
1301
+ description: "\u65E0\u5BFC\u51FA\u6807\u8BB0\u65F6\u7684\u515C\u5E95\u683C\u5F0F\uFF0C\u9ED8\u8BA4 PNG\u3002\u8282\u70B9\u5E26\u5BFC\u51FA\u6807\u8BB0\u65F6\u6B64\u53C2\u6570\u65E0\u6548\u3002"
1251
1302
  },
1303
+ scale: {
1304
+ type: "number",
1305
+ description: "\u65E0\u5BFC\u51FA\u6807\u8BB0\u65F6\u7684\u515C\u5E95\u500D\u7387\uFF0C\u9ED8\u8BA4 2\u3002\u8282\u70B9\u5E26\u5BFC\u51FA\u6807\u8BB0\u65F6\u6B64\u53C2\u6570\u65E0\u6548\u3002"
1306
+ },
1307
+ cache: CACHE_PROP,
1308
+ target: TARGET_PROP
1309
+ }
1310
+ },
1311
+ handler: (args, ctx) => run("export_image", args, ctx?.signal)
1312
+ },
1313
+ {
1314
+ name: "get_screenshot",
1315
+ description: '\u3010\u7528\u9014\u3011\u5BFC\u51FA\u5355\u4E2A\u8282\u70B9\u7684\u622A\u56FE\uFF0C\u7528\u4E8E\u83B7\u53D6\u8BBE\u8BA1\u7684\u89C6\u89C9\u53C2\u7167\u3002\u6BCF\u6B21\u53EA\u5904\u7406\u4E00\u4E2A\u8282\u70B9\uFF1B\u591A\u8282\u70B9\u573A\u666F\u9010\u4E2A\u8C03\u7528\u3002\u8981\u5207\u56FE/\u5BFC\u51FA\u4EA4\u4ED8\u7D20\u6750\u7528 export_image\u3002\u3010\u547D\u4E2D\u4FE1\u53F7\u3011\u7528\u6237\u8BF4"\u770B\u770B\u8FD9\u4E2A\u8BBE\u8BA1\u7A3F/\u8BBE\u8BA1\u56FE\u957F\u4EC0\u4E48\u6837""\u7ED9\u6211\u622A\u56FE"\uFF0C\u6216\u8FD8\u539F\u7C7B\u4EFB\u52A1\u9700\u8981\u89C6\u89C9\u53C2\u7167\u3001\u8FD8\u539F\u5EA6\u6821\u9A8C\u3001\u6837\u5F0F\u5BF9\u6BD4\u3002\u751F\u6210\u4EE3\u7801\u540E\u53EF\u518D\u6B21\u8C03\u7528\u672C\u5DE5\u5177\u5BF9\u6BD4\u8FD8\u539F\u5EA6\uFF1B\u5EFA\u8BAE\u4E0E get_node_dsl \u914D\u5408\uFF1ADSL \u5B9A\u7ED3\u6784\uFF0C\u622A\u56FE\u6821\u9A8C\u89C6\u89C9\u3002\u3010\u8FD4\u56DE\u3011{img: \u4EA7\u7269\u6587\u4EF6\u540D, width, height, format}\u3002\u3010\u786C\u6027\u89C4\u5219\u3011' + URL_RULE_PTR + SELECT_RULE_PTR + ASSET_RULE,
1316
+ inputSchema: {
1317
+ type: "object",
1318
+ properties: {
1319
+ guid: GUID_PROP,
1252
1320
  format: {
1253
1321
  type: "string",
1254
1322
  enum: ["PNG", "SVG", "JPG", "WEBP"],
@@ -1258,6 +1326,7 @@ var init_plugin = __esm({
1258
1326
  type: "number",
1259
1327
  description: "\u5BFC\u51FA\u500D\u7387\uFF0C\u9ED8\u8BA4 2\u3002"
1260
1328
  },
1329
+ cache: CACHE_PROP,
1261
1330
  target: TARGET_PROP
1262
1331
  }
1263
1332
  },
@@ -1310,7 +1379,7 @@ import {
1310
1379
  function createMcpServer() {
1311
1380
  const server = new McpServer(
1312
1381
  { name: "batter-pixso-mcp", version: VERSION },
1313
- { capabilities: { tools: {}, resources: {}, prompts: {} } }
1382
+ { capabilities: { tools: {}, resources: {}, prompts: {} }, instructions: INSTRUCTIONS }
1314
1383
  );
1315
1384
  for (const guide of GUIDES) {
1316
1385
  server.registerResource(
@@ -1371,6 +1440,7 @@ function createMcpServer() {
1371
1440
  });
1372
1441
  return server;
1373
1442
  }
1443
+ var INSTRUCTIONS;
1374
1444
  var init_mcp_local = __esm({
1375
1445
  "src/mcp-local.ts"() {
1376
1446
  "use strict";
@@ -1378,6 +1448,7 @@ var init_mcp_local = __esm({
1378
1448
  init_guides();
1379
1449
  init_prompts();
1380
1450
  init_registry();
1451
+ INSTRUCTIONS = `Pixso \u8BBE\u8BA1\u7A3F\u8F6C\u4EE3\u7801\u670D\u52A1\u3002\u6309\u7528\u6237\u8F93\u5165\u8DEF\u7531\uFF1A\u2460 \u7ED9\u51FA Pixso \u94FE\u63A5\uFF08\u4EFB\u610F\u57DF\u540D\uFF0C\u542B\u79C1\u6709\u5316\u90E8\u7F72\uFF09\u2192 \u4ECE item-id \u63D0\u53D6 guid\uFF08URL \u89E3\u7801\uFF09\uFF0C\u76F4\u63A5\u8C03 get_node_dsl / get_screenshot / export_image\uFF1B\u2461 \u8BF4"\u6211\u9009\u4E2D\u7684/\u5F53\u524D\u9009\u4E2D\u7684"\u2192 get_selected \u62FF guid \u7EE7\u7EED\uFF1B\u5176\u4ED6\u4F9D\u8D56\u9009\u533A\u7684\u573A\u666F\u5148 get_selected \u518D\u5411\u7528\u6237\u62A5\u540D\u79F0\u786E\u8BA4\uFF1B\u2462 "\u6837\u5F0F\u8FD8\u539F/\u8BBE\u8BA1\u8FD8\u539F/UI \u8FD8\u539F/\u8BBE\u8BA1\u8F6C\u4EE3\u7801/\u6839\u636E\u8BBE\u8BA1\u7A3F\u5199\u9875\u9762\u6216\u7EC4\u4EF6"\u2192 get_node_dsl \u53D6\u7ED3\u6784\u6837\u5F0F + get_screenshot \u53D6\u89C6\u89C9\u53C2\u7167\uFF1B\u2463 "\u5207\u56FE/\u5BFC\u51FA\u56FE\u6807\u6216\u56FE\u7247\u7D20\u6750"\u2192 export_image\uFF08\u5C0A\u91CD\u8BBE\u8BA1\u5E08\u5BFC\u51FA\u6807\u8BB0\uFF1BDSL \u91CC\u5DF2\u5E26 img \u7684\u8282\u70B9\u76F4\u63A5\u7528\u5176\u6587\u4EF6\u540D\uFF0C\u4E0D\u8981\u91CD\u590D\u5BFC\u51FA\uFF09\uFF1B\u2464 \u7ED3\u6784\u590D\u6742/\u5148\u770B\u6574\u4F53\u6846\u67B6 \u2192 get_node_dsl \u7528 maxDepth \u5206\u6BB5\u4E0B\u63A2\uFF08\u622A\u65AD\u5904 more \u6807\u8BB0\uFF0C\u6309 id \u4E0B\u94BB\uFF09\uFF1B\u2465 \u751F\u6210\u540E\u5BF9\u6BD4\u8FD8\u539F\u5EA6 \u2192 get_screenshot \u6821\u9A8C\u5FAA\u73AF\uFF1B\u2466 \u591A\u4E2A Pixso \u6587\u4EF6\u540C\u65F6\u6253\u5F00 \u2192 list_sessions + target \u53C2\u6570\u8DEF\u7531\u3002\u8D44\u6E90\u53D6\u7528\u4E0E\u5B57\u6BB5\u8BED\u4E49\u7B49\u786C\u6027\u89C4\u5219\u89C1\u8D44\u6E90 batter://guides/intro \u4E0E batter://guides/design-to-code\uFF1B\u8BBE\u8BA1\u7A3F\u521A\u6539\u8FC7\u4F46\u7ED3\u679C\u5BF9\u4E0D\u4E0A\u65F6\uFF0C\u7ED9\u5BFC\u51FA\u7C7B\u5DE5\u5177\u52A0 cache:"refresh" \u5F3A\u5236\u5237\u65B0\u3002`;
1381
1452
  }
1382
1453
  });
1383
1454
 
@@ -1444,7 +1515,6 @@ var init_mcp_http = __esm({
1444
1515
  });
1445
1516
 
1446
1517
  // src/routes/plugin-api.ts
1447
- import { readFile as readFile2 } from "node:fs/promises";
1448
1518
  async function handlePluginApi(req, res, url) {
1449
1519
  const path = url.pathname;
1450
1520
  const session = url.searchParams.get("session");
@@ -1542,29 +1612,12 @@ async function handlePluginApi(req, res, url) {
1542
1612
  try {
1543
1613
  const buf = await readBody(req);
1544
1614
  const saved = await saveAsset(buf, url.searchParams.get("format") ?? "PNG");
1545
- sendJson(res, 201, {
1546
- name: saved.name,
1547
- url: `http://127.0.0.1:${config.httpPort}/assets/${saved.name}`
1548
- });
1615
+ sendJson(res, 201, { name: saved.name });
1549
1616
  } catch {
1550
1617
  sendJson(res, 500, { error: "asset save failed" });
1551
1618
  }
1552
1619
  return true;
1553
1620
  }
1554
- const assetMatch = path.match(/^\/assets\/([\w.-]+)$/);
1555
- if (req.method === "GET" && assetMatch) {
1556
- try {
1557
- const buf = await readFile2(assetPath(assetMatch[1]));
1558
- res.writeHead(200, {
1559
- "Content-Type": assetMime(assetMatch[1]),
1560
- "Cache-Control": "public, max-age=31536000, immutable"
1561
- });
1562
- res.end(buf);
1563
- } catch {
1564
- sendJson(res, 404, { error: "not found" });
1565
- }
1566
- return true;
1567
- }
1568
1621
  return false;
1569
1622
  }
1570
1623
  var init_plugin_api = __esm({