@coralai/sps-cli 0.65.74 → 0.65.76

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.
Files changed (107) hide show
  1. package/dist/commands/artCommand.d.ts.map +1 -1
  2. package/dist/commands/artCommand.js +13 -3
  3. package/dist/commands/artCommand.js.map +1 -1
  4. package/dist/console/index.d.ts.map +1 -1
  5. package/dist/console/index.js +8 -0
  6. package/dist/console/index.js.map +1 -1
  7. package/dist/console/lib/artPaths.d.ts +29 -0
  8. package/dist/console/lib/artPaths.d.ts.map +1 -0
  9. package/dist/console/lib/artPaths.js +170 -0
  10. package/dist/console/lib/artPaths.js.map +1 -0
  11. package/dist/console/lib/artRunRequest.d.ts +46 -0
  12. package/dist/console/lib/artRunRequest.d.ts.map +1 -0
  13. package/dist/console/lib/artRunRequest.js +107 -0
  14. package/dist/console/lib/artRunRequest.js.map +1 -0
  15. package/dist/console/routes/art.d.ts +3 -0
  16. package/dist/console/routes/art.d.ts.map +1 -0
  17. package/dist/console/routes/art.js +355 -0
  18. package/dist/console/routes/art.js.map +1 -0
  19. package/dist/console/routes/artPipeline.d.ts +15 -0
  20. package/dist/console/routes/artPipeline.d.ts.map +1 -0
  21. package/dist/console/routes/artPipeline.js +83 -0
  22. package/dist/console/routes/artPipeline.js.map +1 -0
  23. package/dist/core/art/artConcurrency.d.ts +63 -0
  24. package/dist/core/art/artConcurrency.d.ts.map +1 -0
  25. package/dist/core/art/artConcurrency.js +63 -0
  26. package/dist/core/art/artConcurrency.js.map +1 -0
  27. package/dist/core/art/artRunLauncher.d.ts +6 -0
  28. package/dist/core/art/artRunLauncher.d.ts.map +1 -0
  29. package/dist/core/art/artRunLauncher.js +91 -0
  30. package/dist/core/art/artRunLauncher.js.map +1 -0
  31. package/dist/core/art/artRunService.d.ts +102 -0
  32. package/dist/core/art/artRunService.d.ts.map +1 -0
  33. package/dist/core/art/artRunService.js +181 -0
  34. package/dist/core/art/artRunService.js.map +1 -0
  35. package/dist/core/art/assetLocator.d.ts +33 -0
  36. package/dist/core/art/assetLocator.d.ts.map +1 -0
  37. package/dist/core/art/assetLocator.js +61 -0
  38. package/dist/core/art/assetLocator.js.map +1 -0
  39. package/dist/providers/art/artDriver.d.ts +71 -0
  40. package/dist/providers/art/artDriver.d.ts.map +1 -0
  41. package/dist/providers/art/artDriver.js +119 -0
  42. package/dist/providers/art/artDriver.js.map +1 -0
  43. package/dist/providers/art/artEvents.d.ts +23 -0
  44. package/dist/providers/art/artEvents.d.ts.map +1 -0
  45. package/dist/providers/art/artEvents.js +40 -0
  46. package/dist/providers/art/artEvents.js.map +1 -0
  47. package/dist/providers/art/artGen.d.ts +253 -0
  48. package/dist/providers/art/artGen.d.ts.map +1 -0
  49. package/dist/providers/art/artGen.js +1263 -0
  50. package/dist/providers/art/artGen.js.map +1 -0
  51. package/dist/providers/art/artPrompt.d.ts +42 -0
  52. package/dist/providers/art/artPrompt.d.ts.map +1 -0
  53. package/dist/providers/art/artPrompt.js +41 -0
  54. package/dist/providers/art/artPrompt.js.map +1 -0
  55. package/dist/providers/art/artRunChild.d.ts +3 -0
  56. package/dist/providers/art/artRunChild.d.ts.map +1 -0
  57. package/dist/providers/art/artRunChild.js +127 -0
  58. package/dist/providers/art/artRunChild.js.map +1 -0
  59. package/dist/providers/art/atomicWrite.d.ts +16 -0
  60. package/dist/providers/art/atomicWrite.d.ts.map +1 -0
  61. package/dist/providers/art/atomicWrite.js +62 -0
  62. package/dist/providers/art/atomicWrite.js.map +1 -0
  63. package/dist/providers/art/cancelMarker.d.ts +9 -0
  64. package/dist/providers/art/cancelMarker.d.ts.map +1 -0
  65. package/dist/providers/art/cancelMarker.js +60 -0
  66. package/dist/providers/art/cancelMarker.js.map +1 -0
  67. package/dist/providers/art/composeAsset.d.ts +52 -0
  68. package/dist/providers/art/composeAsset.d.ts.map +1 -0
  69. package/dist/providers/art/composeAsset.js +73 -0
  70. package/dist/providers/art/composeAsset.js.map +1 -0
  71. package/dist/providers/art/imageSize.d.ts +31 -0
  72. package/dist/providers/art/imageSize.d.ts.map +1 -0
  73. package/dist/providers/art/imageSize.js +92 -0
  74. package/dist/providers/art/imageSize.js.map +1 -0
  75. package/dist/providers/art/jobContext.d.ts +25 -0
  76. package/dist/providers/art/jobContext.d.ts.map +1 -0
  77. package/dist/providers/art/jobContext.js +5 -0
  78. package/dist/providers/art/jobContext.js.map +1 -0
  79. package/dist/providers/art/rateLimitRetry.d.ts +25 -0
  80. package/dist/providers/art/rateLimitRetry.d.ts.map +1 -0
  81. package/dist/providers/art/rateLimitRetry.js +40 -0
  82. package/dist/providers/art/rateLimitRetry.js.map +1 -0
  83. package/dist/providers/art/uiKit.d.ts +61 -0
  84. package/dist/providers/art/uiKit.d.ts.map +1 -0
  85. package/dist/providers/art/uiKit.js +331 -0
  86. package/dist/providers/art/uiKit.js.map +1 -0
  87. package/dist/providers/art/visionJudge.d.ts +26 -0
  88. package/dist/providers/art/visionJudge.d.ts.map +1 -0
  89. package/dist/providers/art/visionJudge.js +127 -0
  90. package/dist/providers/art/visionJudge.js.map +1 -0
  91. package/dist/providers/art/withinDir.d.ts +2 -0
  92. package/dist/providers/art/withinDir.d.ts.map +1 -0
  93. package/dist/providers/art/withinDir.js +19 -0
  94. package/dist/providers/art/withinDir.js.map +1 -0
  95. package/dist/providers/media/gatewayMediaProviders.d.ts +58 -0
  96. package/dist/providers/media/gatewayMediaProviders.d.ts.map +1 -0
  97. package/dist/providers/media/gatewayMediaProviders.js +46 -0
  98. package/dist/providers/media/gatewayMediaProviders.js.map +1 -0
  99. package/dist/providers/media/generateAsset.d.ts +9 -0
  100. package/dist/providers/media/generateAsset.d.ts.map +1 -1
  101. package/dist/providers/media/generateAsset.js +7 -1
  102. package/dist/providers/media/generateAsset.js.map +1 -1
  103. package/dist/providers/media/mediaProviders.d.ts +31 -1
  104. package/dist/providers/media/mediaProviders.d.ts.map +1 -1
  105. package/dist/providers/media/mediaProviders.js +33 -1
  106. package/dist/providers/media/mediaProviders.js.map +1 -1
  107. package/package.json +1 -1
@@ -0,0 +1,331 @@
1
+ /**
2
+ * UI 线稿契约(v1)——"结构靠图、风格靠词"的图生图 UI 套件。
3
+ *
4
+ * 核心思想:块面原型由【确定性代码】渲染(坐标生成前已知)→ 图生图只换风格(布局话语权 100% 在参考图)
5
+ * → 图集按【契约矩形】直切(零缝隙探测)、帧名全平台固定(worker 免查 asset-meta)。
6
+ * 实证:2026-07-17 codex 图生图 8 控件位置/尺寸/轮廓全保持(factory/ui-lab/ui-compare.png)。
7
+ *
8
+ * ⚠️ 契约即 ABI:帧名/矩形一经发布不改语义,扩展走 v2 追加。ui.js 的 makeBar 皮肤模式依赖
9
+ * BAR_* 常量与本表一致(血槽边框厚度),改这里必须同步 ui.js。
10
+ */
11
+ import sharp from 'sharp';
12
+ // 画布 1536×1024,4 行:按钮 / 圆钮 / 面板+血条 / 语义图标。行高 256。
13
+ export const UI_KIT_CANVAS = { w: 1536, h: 1024 };
14
+ // 血条契约常量(ui.js makeBar 皮肤模式同步引用)。v1.1 起所有控件在矩形内统一内缩 INSET 绘制
15
+ // (给图生图的描边/贴纸边等风格装饰留余量,防溢出矩形被切):
16
+ // 外框:矩形 340×76,实绘 316×52(内缩12),边框 8 → 槽从矩形边缘内缩 20,槽 300×36;
17
+ // 填充:矩形 324×60,实绘 300×36(内缩12)= 恰与槽同尺寸。
18
+ export const UI_INSET = 12; // 所有控件的统一绘制内缩(px,画布坐标)
19
+ export const UI_BAR = { frameW: 340, frameH: 76, inset: UI_INSET, border: 8, fillRectW: 324, fillRectH: 60, fillW: 300, fillH: 36 };
20
+ const R1 = 0, R2 = 256, R3 = 512, R4 = 768;
21
+ export const UI_KIT_FRAMES = [
22
+ // ── 行1:按钮(大常态/大按下/中/小)──
23
+ { name: 'ui_btn_lg', label: '大按钮·常态', x: 42, y: R1 + 78, w: 300, h: 100 },
24
+ { name: 'ui_btn_lg_pr', label: '大按钮·按下', x: 426, y: R1 + 88, w: 300, h: 100 },
25
+ { name: 'ui_btn_md', label: '中按钮', x: 838, y: R1 + 84, w: 244, h: 88 },
26
+ { name: 'ui_btn_sm', label: '小按钮', x: 1246, y: R1 + 90, w: 196, h: 76 },
27
+ // ── 行2:圆形图标钮 ×6 ──
28
+ { name: 'ui_icon_pause', label: '暂停钮', x: 48, y: R2 + 48, w: 160, h: 160 },
29
+ { name: 'ui_icon_gear', label: '设置钮', x: 304, y: R2 + 48, w: 160, h: 160 },
30
+ { name: 'ui_icon_sound', label: '音量钮', x: 560, y: R2 + 48, w: 160, h: 160 },
31
+ { name: 'ui_icon_close', label: '关闭钮', x: 816, y: R2 + 48, w: 160, h: 160 },
32
+ { name: 'ui_icon_back', label: '返回钮', x: 1072, y: R2 + 48, w: 160, h: 160 },
33
+ { name: 'ui_icon_retry', label: '重试钮', x: 1328, y: R2 + 48, w: 160, h: 160 },
34
+ // ── 行3:面板 + 血条(外框血槽 / 填充条)──
35
+ { name: 'ui_panel', label: '弹窗面板(带标题栏)', x: 40, y: R3 + 20, w: 400, h: 216 },
36
+ { name: 'ui_banner', label: '横幅面板(HUD 底条)', x: 520, y: R3 + 78, w: 560, h: 100 },
37
+ { name: 'ui_bar_frame', label: '血槽外框', x: 1140, y: R3 + 34, w: UI_BAR.frameW, h: UI_BAR.frameH },
38
+ { name: 'ui_bar_fill', label: '血条填充', x: 1148, y: R3 + 150, w: UI_BAR.fillRectW, h: UI_BAR.fillRectH },
39
+ // ── 行4:语义图标(评分/资源展示)×6 ──
40
+ { name: 'ui_star', label: '星星·实心', x: 48, y: R4 + 48, w: 160, h: 160 },
41
+ { name: 'ui_star_empty', label: '星星·空心', x: 304, y: R4 + 48, w: 160, h: 160 },
42
+ { name: 'ui_heart', label: '爱心', x: 560, y: R4 + 48, w: 160, h: 160 },
43
+ { name: 'ui_coin', label: '金币', x: 816, y: R4 + 48, w: 160, h: 160 },
44
+ { name: 'ui_diamond', label: '钻石', x: 1072, y: R4 + 48, w: 160, h: 160 },
45
+ { name: 'ui_gem', label: '宝石', x: 1328, y: R4 + 48, w: 160, h: 160 },
46
+ ];
47
+ // ── 灰阶块面原型渲染(全矢量,零字体依赖;确定性=逐像素可复现)──
48
+ const G = { fill: '#b5b5b5', dark: '#3a3a3a', mid: '#8a8a8a', hi: '#d9d9d9', panel: '#c4c4c4' };
49
+ const SW = 8; // 统一描边宽
50
+ function btnSvg(f, pressed) {
51
+ const hi = pressed ? '' : `<rect x="${f.x + 10}" y="${f.y + 10}" width="${f.w - 20}" height="${f.h * 0.3}" rx="${f.h * 0.15}" fill="${G.hi}"/>`;
52
+ return `<rect x="${f.x}" y="${f.y}" width="${f.w}" height="${f.h}" rx="${f.h * 0.3}" fill="${pressed ? G.mid : G.fill}" stroke="${G.dark}" stroke-width="${SW}"/>${hi}`;
53
+ }
54
+ function circleBase(f) {
55
+ const cx = f.x + f.w / 2, cy = f.y + f.h / 2, r = f.w / 2 - SW / 2;
56
+ return { cx, cy, r, svg: `<circle cx="${cx}" cy="${cy}" r="${r}" fill="${G.fill}" stroke="${G.dark}" stroke-width="${SW}"/>` };
57
+ }
58
+ function iconSvg(f, kind) {
59
+ const { cx, cy, r, svg } = circleBase(f);
60
+ const s = r * 0.9;
61
+ const glyphs = {
62
+ pause: `<rect x="${cx - s * 0.42}" y="${cy - s * 0.5}" width="${s * 0.3}" height="${s}" rx="6" fill="${G.dark}"/><rect x="${cx + s * 0.12}" y="${cy - s * 0.5}" width="${s * 0.3}" height="${s}" rx="6" fill="${G.dark}"/>`,
63
+ gear: `<circle cx="${cx}" cy="${cy}" r="${s * 0.34}" fill="none" stroke="${G.dark}" stroke-width="${s * 0.22}"/>` +
64
+ [0, 45, 90, 135, 180, 225, 270, 315].map((a) => `<rect x="${cx - s * 0.09}" y="${cy - s * 0.62}" width="${s * 0.18}" height="${s * 0.24}" fill="${G.dark}" transform="rotate(${a} ${cx} ${cy})"/>`).join(''),
65
+ sound: `<polygon points="${cx - s * 0.5},${cy - s * 0.2} ${cx - s * 0.15},${cy - s * 0.2} ${cx + s * 0.15},${cy - s * 0.5} ${cx + s * 0.15},${cy + s * 0.5} ${cx - s * 0.15},${cy + s * 0.2} ${cx - s * 0.5},${cy + s * 0.2}" fill="${G.dark}"/><path d="M ${cx + s * 0.3} ${cy - s * 0.28} A ${s * 0.36} ${s * 0.36} 0 0 1 ${cx + s * 0.3} ${cy + s * 0.28}" fill="none" stroke="${G.dark}" stroke-width="${s * 0.12}" stroke-linecap="round"/>`,
66
+ close: `<rect x="${cx - s * 0.5}" y="${cy - s * 0.11}" width="${s}" height="${s * 0.22}" rx="8" fill="${G.dark}" transform="rotate(45 ${cx} ${cy})"/><rect x="${cx - s * 0.5}" y="${cy - s * 0.11}" width="${s}" height="${s * 0.22}" rx="8" fill="${G.dark}" transform="rotate(-45 ${cx} ${cy})"/>`,
67
+ back: `<polygon points="${cx - s * 0.5},${cy} ${cx + s * 0.1},${cy - s * 0.45} ${cx + s * 0.1},${cy - s * 0.18} ${cx + s * 0.5},${cy - s * 0.18} ${cx + s * 0.5},${cy + s * 0.18} ${cx + s * 0.1},${cy + s * 0.18} ${cx + s * 0.1},${cy + s * 0.45}" fill="${G.dark}"/>`,
68
+ retry: `<path d="M ${cx + s * 0.42} ${cy} A ${s * 0.42} ${s * 0.42} 0 1 1 ${cx} ${cy - s * 0.42}" fill="none" stroke="${G.dark}" stroke-width="${s * 0.2}" stroke-linecap="round"/><polygon points="${cx - s * 0.12},${cy - s * 0.62} ${cx + s * 0.3},${cy - s * 0.42} ${cx - s * 0.12},${cy - s * 0.2}" fill="${G.dark}"/>`,
69
+ star: starPts(cx, cy, s, true),
70
+ star_empty: starPts(cx, cy, s, false),
71
+ heart: `<path d="M ${cx} ${cy + s * 0.45} C ${cx - s * 1.1} ${cy - s * 0.35}, ${cx - s * 0.45} ${cy - s * 0.85}, ${cx} ${cy - s * 0.3} C ${cx + s * 0.45} ${cy - s * 0.85}, ${cx + s * 1.1} ${cy - s * 0.35}, ${cx} ${cy + s * 0.45} Z" fill="${G.fill}" stroke="${G.dark}" stroke-width="${SW}"/>`,
72
+ coin: `<circle cx="${cx}" cy="${cy}" r="${s * 0.55}" fill="${G.fill}" stroke="${G.dark}" stroke-width="${SW}"/><circle cx="${cx}" cy="${cy}" r="${s * 0.36}" fill="none" stroke="${G.dark}" stroke-width="${SW * 0.7}"/>`,
73
+ diamond: `<polygon points="${cx - s * 0.55},${cy - s * 0.15} ${cx - s * 0.28},${cy - s * 0.45} ${cx + s * 0.28},${cy - s * 0.45} ${cx + s * 0.55},${cy - s * 0.15} ${cx},${cy + s * 0.55}" fill="${G.fill}" stroke="${G.dark}" stroke-width="${SW}"/><polyline points="${cx - s * 0.55},${cy - s * 0.15} ${cx + s * 0.55},${cy - s * 0.15}" stroke="${G.dark}" stroke-width="${SW * 0.6}" fill="none"/><polyline points="${cx - s * 0.28},${cy - s * 0.45} ${cx},${cy + s * 0.55} ${cx + s * 0.28},${cy - s * 0.45}" stroke="${G.dark}" stroke-width="${SW * 0.6}" fill="none"/>`,
74
+ gem: `<polygon points="${cx},${cy - s * 0.55} ${cx + s * 0.48},${cy - s * 0.28} ${cx + s * 0.48},${cy + s * 0.28} ${cx},${cy + s * 0.55} ${cx - s * 0.48},${cy + s * 0.28} ${cx - s * 0.48},${cy - s * 0.28}" fill="${G.fill}" stroke="${G.dark}" stroke-width="${SW}"/><polygon points="${cx},${cy - s * 0.22} ${cx + s * 0.2},${cy} ${cx},${cy + s * 0.22} ${cx - s * 0.2},${cy}" fill="none" stroke="${G.dark}" stroke-width="${SW * 0.6}"/>`,
75
+ };
76
+ // 图标类:圆钮带底盘;语义图标(星/心/币/钻/宝)不带底盘,裸形状
77
+ const bare = ['star', 'star_empty', 'heart', 'coin', 'diamond', 'gem'].includes(kind);
78
+ return bare ? glyphs[kind] : svg + glyphs[kind];
79
+ }
80
+ function starPts(cx, cy, s, filled) {
81
+ const pts = [];
82
+ for (let i = 0; i < 10; i++) {
83
+ const rr = i % 2 === 0 ? s * 0.62 : s * 0.26;
84
+ const a = -Math.PI / 2 + (i * Math.PI) / 5;
85
+ pts.push(`${cx + rr * Math.cos(a)},${cy + rr * Math.sin(a)}`);
86
+ }
87
+ return `<polygon points="${pts.join(' ')}" fill="${filled ? G.fill : 'none'}" stroke="${G.dark}" stroke-width="${SW}"/>`;
88
+ }
89
+ /** 渲染灰阶块面原型(参考图 + 占位资产双用途)。确定性:同版本契约逐像素一致。
90
+ * v1.1:所有控件在契约矩形内统一内缩 UI_INSET 绘制——图生图的风格装饰(外描边/贴纸边/发光)
91
+ * 会贴着原轮廓外扩,零边距时必溢出矩形、切分即被硬切(合成大西瓜局白色贴纸边全切平的事故)。 */
92
+ export async function renderUiWireframe() {
93
+ const parts = [];
94
+ for (const f0 of UI_KIT_FRAMES) {
95
+ const f = { ...f0, x: f0.x + UI_INSET, y: f0.y + UI_INSET, w: f0.w - UI_INSET * 2, h: f0.h - UI_INSET * 2 };
96
+ if (f.name === 'ui_btn_lg')
97
+ parts.push(btnSvg(f, false));
98
+ else if (f.name === 'ui_btn_lg_pr')
99
+ parts.push(btnSvg(f, true));
100
+ else if (f.name === 'ui_btn_md' || f.name === 'ui_btn_sm')
101
+ parts.push(btnSvg(f, false));
102
+ else if (f.name === 'ui_panel')
103
+ parts.push(`<rect x="${f.x}" y="${f.y}" width="${f.w}" height="${f.h}" rx="20" fill="${G.panel}" stroke="${G.dark}" stroke-width="${SW}"/><path d="M ${f.x} ${f.y + 52} h ${f.w}" stroke="${G.dark}" stroke-width="${SW * 0.6}"/><rect x="${f.x}" y="${f.y}" width="${f.w}" height="52" rx="20" fill="${G.mid}"/>`);
104
+ else if (f.name === 'ui_banner')
105
+ parts.push(`<rect x="${f.x}" y="${f.y}" width="${f.w}" height="${f.h}" rx="${f.h / 2}" fill="${G.panel}" stroke="${G.dark}" stroke-width="${SW}"/>`);
106
+ else if (f.name === 'ui_bar_frame')
107
+ parts.push(`<rect x="${f.x}" y="${f.y}" width="${f.w}" height="${f.h}" rx="${f.h / 2}" fill="${G.mid}" stroke="${G.dark}" stroke-width="${SW}"/><rect x="${f.x + UI_BAR.border}" y="${f.y + UI_BAR.border}" width="${f.w - UI_BAR.border * 2}" height="${f.h - UI_BAR.border * 2}" rx="${(f.h - UI_BAR.border * 2) / 2}" fill="#4a4a4a"/>`);
108
+ else if (f.name === 'ui_bar_fill')
109
+ parts.push(`<rect x="${f.x}" y="${f.y}" width="${f.w}" height="${f.h}" rx="${f.h / 2}" fill="${G.fill}" stroke="${G.dark}" stroke-width="${SW * 0.6}"/>`);
110
+ else
111
+ parts.push(iconSvg(f, f.name.replace('ui_icon_', '').replace('ui_', '')));
112
+ }
113
+ const svg = `<svg xmlns="http://www.w3.org/2000/svg" width="${UI_KIT_CANVAS.w}" height="${UI_KIT_CANVAS.h}">${parts.join('\n')}</svg>`;
114
+ return sharp(Buffer.from(svg)).png().toBuffer();
115
+ }
116
+ /**
117
+ * v1.2 内容自适应切分:在契约矩形的【安全扩展窗口】内按 alpha 求实际内容外接框。
118
+ * 为什么:图生图会把宽扁控件(按钮/面板/横幅/血条)画大、外描边吃掉内缩余量(实测贴边 38~47%),
119
+ * prompt 约束不可靠;而溢出的内容并没有丢——就画在帧间空隙里。矩形按实际 bbox 校正 = 确定性零裁切。
120
+ * 帧名/语义仍是 ABI;矩形本来就是每局图集 json 携带的,按实际内容写不破坏任何消费方
121
+ * (worker setDisplaySize 按玩法比例;makeBar 皮肤模式用比例几何,见 ui.js)。
122
+ * 窗口外扩 EXPAND=20px:所有相邻帧/画布边的最小间距 ≥40px,20px 双向扩不会吃进邻帧。
123
+ */
124
+ /** 每帧的 bbox 搜索窗:向四邻扩到【与最近邻帧标称矩形的半距-2px】(封顶 60),不吃邻帧、不封死溢出。
125
+ * v1.2 曾用死 20px:AI 把大按钮画宽 >20px 溢出仍被窗口截断(用户实测右缘裁一点点)。 */
126
+ function searchWindows() {
127
+ const CAP = 60;
128
+ return UI_KIT_FRAMES.map((f) => {
129
+ let gl = f.x, gr = UI_KIT_CANVAS.w - (f.x + f.w), gt = f.y, gb = UI_KIT_CANVAS.h - (f.y + f.h);
130
+ for (const o of UI_KIT_FRAMES) {
131
+ if (o === f)
132
+ continue;
133
+ const overlapY = o.y < f.y + f.h && o.y + o.h > f.y;
134
+ const overlapX = o.x < f.x + f.w && o.x + o.w > f.x;
135
+ if (overlapY) {
136
+ if (o.x + o.w <= f.x)
137
+ gl = Math.min(gl, f.x - (o.x + o.w));
138
+ if (o.x >= f.x + f.w)
139
+ gr = Math.min(gr, o.x - (f.x + f.w));
140
+ }
141
+ if (overlapX) {
142
+ if (o.y + o.h <= f.y)
143
+ gt = Math.min(gt, f.y - (o.y + o.h));
144
+ if (o.y >= f.y + f.h)
145
+ gb = Math.min(gb, o.y - (f.y + f.h));
146
+ }
147
+ }
148
+ const e = (g) => Math.max(0, Math.min(CAP, Math.floor(g / 2) - 2));
149
+ return {
150
+ x0: Math.max(0, f.x - e(gl)),
151
+ y0: Math.max(0, f.y - e(gt)),
152
+ x1: Math.min(UI_KIT_CANVAS.w, f.x + f.w + e(gr)),
153
+ y1: Math.min(UI_KIT_CANVAS.h, f.y + f.h + e(gb)),
154
+ };
155
+ });
156
+ }
157
+ export async function contentFitFrames(png) {
158
+ const { data, info } = await sharp(png).ensureAlpha().raw().toBuffer({ resolveWithObject: true });
159
+ const W = info.width;
160
+ const alphaAt = (x, y) => data[(y * W + x) * 4 + 3];
161
+ const wins = searchWindows();
162
+ return UI_KIT_FRAMES.map((f, i) => {
163
+ const { x0, y0, x1, y1 } = wins[i];
164
+ let minX = x1, minY = y1, maxX = x0 - 1, maxY = y0 - 1;
165
+ for (let y = y0; y < y1; y++)
166
+ for (let x = x0; x < x1; x++)
167
+ if (alphaAt(x, y) > 24) {
168
+ if (x < minX)
169
+ minX = x;
170
+ if (x > maxX)
171
+ maxX = x;
172
+ if (y < minY)
173
+ minY = y;
174
+ if (y > maxY)
175
+ maxY = y;
176
+ }
177
+ // 全透明(该帧没画出来)→ 退回契约矩形,别写出 0 尺寸帧
178
+ if (maxX < minX || maxY < minY)
179
+ return { name: f.name, x: f.x, y: f.y, w: f.w, h: f.h };
180
+ return { name: f.name, x: minX, y: minY, w: maxX - minX + 1, h: maxY - minY + 1 };
181
+ });
182
+ }
183
+ /**
184
+ * 裁切重组(v1.3,用户定案):bbox 逐帧裁出 → 按契约 4 行紧凑重排成新图集。
185
+ * ① atlas 尺寸 = 实际内容尺寸(帧名/语义仍固定);② 挤掉画布里的大片空隙(1536×1024 → 紧凑)。
186
+ * 行分组按标称 y(行1 按钮/行2 圆钮/行3 面板血条/行4 图标),行内左起排、GAP 间隔。
187
+ */
188
+ export const UIKIT_STRUCTURE_BROKEN = 'uikit-structure-broken';
189
+ /** alpha 连通域(4-连通,2x 降采样提速;面积 <150px² 视为噪点丢弃)。返回全分辨率 bbox。 */
190
+ async function alphaComponents(png) {
191
+ const { data, info } = await sharp(png).ensureAlpha().raw().toBuffer({ resolveWithObject: true });
192
+ const W = info.width, H = info.height, D = 2;
193
+ const w2 = Math.ceil(W / D), h2 = Math.ceil(H / D);
194
+ const mask = new Uint8Array(w2 * h2);
195
+ for (let y = 0; y < H; y++)
196
+ for (let x = 0; x < W; x++)
197
+ if (data[(y * W + x) * 4 + 3] > 24)
198
+ mask[Math.floor(y / D) * w2 + Math.floor(x / D)] = 1;
199
+ const label = new Int32Array(w2 * h2).fill(-1);
200
+ const comps = [];
201
+ const qx = new Int32Array(w2 * h2), qy = new Int32Array(w2 * h2);
202
+ for (let y = 0; y < h2; y++)
203
+ for (let x = 0; x < w2; x++) {
204
+ if (!mask[y * w2 + x] || label[y * w2 + x] >= 0)
205
+ continue;
206
+ const id = comps.length;
207
+ let head = 0, tail = 0;
208
+ qx[tail] = x;
209
+ qy[tail] = y;
210
+ tail++;
211
+ label[y * w2 + x] = id;
212
+ let x0 = x, y0 = y, x1 = x, y1 = y, area = 0;
213
+ while (head < tail) {
214
+ const cx = qx[head], cy = qy[head];
215
+ head++;
216
+ area++;
217
+ if (cx < x0)
218
+ x0 = cx;
219
+ if (cx > x1)
220
+ x1 = cx;
221
+ if (cy < y0)
222
+ y0 = cy;
223
+ if (cy > y1)
224
+ y1 = cy;
225
+ for (const [dx, dy] of [[1, 0], [-1, 0], [0, 1], [0, -1]]) {
226
+ const nx = cx + dx, ny = cy + dy;
227
+ if (nx < 0 || ny < 0 || nx >= w2 || ny >= h2)
228
+ continue;
229
+ const ni = ny * w2 + nx;
230
+ if (mask[ni] && label[ni] < 0) {
231
+ label[ni] = id;
232
+ qx[tail] = nx;
233
+ qy[tail] = ny;
234
+ tail++;
235
+ }
236
+ }
237
+ }
238
+ comps.push({ x0: x0 * D, y0: y0 * D, x1: Math.min(W - 1, x1 * D + D - 1), y1: Math.min(H - 1, y1 * D + D - 1), area: area * D * D });
239
+ }
240
+ return comps.filter((c) => c.area >= 150);
241
+ }
242
+ /**
243
+ * v1.5 切割改【连通域 + 名义位置命名】(位置锚定窗口切分退役):
244
+ * - 连通域保证控件整块切出,永不夹断(风格画多大都完整);
245
+ * - 语义命名靠契约名义中心:含住该中心的组件 = 该帧主体(纯边缘切割给不了名字,位置才是语义源);
246
+ * - 结构失守确定性识破:一个组件含住 ≥2 个名义中心(自由排版的大控件横跨多位)或 >3 帧无主体 → 拒切上抛。
247
+ * - 帧内容框 = 主体 bbox ∪ 搜索窗内的小卫星组件(音量弧线/装饰星点这类离体笔画)。
248
+ */
249
+ export async function fitAndRepackUiKit(png) {
250
+ const comps = await alphaComponents(png);
251
+ const wins = searchWindows();
252
+ const mainOf = new Map(); // comp idx → 命中的帧 idx 列表
253
+ const frameMain = UI_KIT_FRAMES.map((f, fi) => {
254
+ const cx = f.x + f.w / 2, cy = f.y + f.h / 2;
255
+ let best = -1, bestArea = 0;
256
+ comps.forEach((c, ci) => {
257
+ if (cx >= c.x0 && cx <= c.x1 && cy >= c.y0 && cy <= c.y1 && c.area > bestArea) {
258
+ best = ci;
259
+ bestArea = c.area;
260
+ }
261
+ });
262
+ if (best < 0)
263
+ return null;
264
+ mainOf.set(best, [...(mainOf.get(best) ?? []), fi]);
265
+ return best;
266
+ });
267
+ const spanning = [...mainOf.entries()].filter(([, fs]) => fs.length >= 2);
268
+ const unmatched = frameMain.filter((m) => m === null).length;
269
+ if (spanning.length > 0 || unmatched > 3) {
270
+ const names = spanning.flatMap(([, fs]) => fs.map((i) => UI_KIT_FRAMES[i].name));
271
+ throw new Error(`${UIKIT_STRUCTURE_BROKEN}: 生成图未遵守线稿布局,拒切(跨位组件:${names.join('/') || '无'};无主体帧:${unmatched})`);
272
+ }
273
+ const mains = new Set(frameMain.filter((m) => m !== null));
274
+ const fit = UI_KIT_FRAMES.map((f, fi) => {
275
+ const mi = frameMain[fi];
276
+ if (mi === null)
277
+ return { name: f.name, x: f.x, y: f.y, w: f.w, h: f.h }; // 无主体(≤3 帧容忍)→ 名义矩形(空)
278
+ const m = comps[mi];
279
+ let x0 = m.x0, y0 = m.y0, x1 = m.x1, y1 = m.y1;
280
+ const win = wins[fi];
281
+ comps.forEach((c, ci) => {
282
+ if (ci === mi || mains.has(ci))
283
+ return;
284
+ const ccx = (c.x0 + c.x1) / 2, ccy = (c.y0 + c.y1) / 2;
285
+ if (ccx >= win.x0 && ccx <= win.x1 && ccy >= win.y0 && ccy <= win.y1 && c.x0 >= win.x0 && c.x1 <= win.x1 && c.y0 >= win.y0 && c.y1 <= win.y1) {
286
+ x0 = Math.min(x0, c.x0);
287
+ y0 = Math.min(y0, c.y0);
288
+ x1 = Math.max(x1, c.x1);
289
+ y1 = Math.max(y1, c.y1);
290
+ }
291
+ });
292
+ return { name: f.name, x: x0, y: y0, w: x1 - x0 + 1, h: y1 - y0 + 1 };
293
+ });
294
+ const GAP = 4;
295
+ // 行号 = 标称 y 所在 256px 行带
296
+ const rowOf = (name) => Math.floor((UI_KIT_FRAMES.find((f) => f.name === name)?.y ?? 0) / 256);
297
+ const rows = [[], [], [], []];
298
+ for (const f of fit)
299
+ rows[rowOf(f.name)].push({ name: f.name, w: f.w, h: f.h, src: { x: f.x, y: f.y } });
300
+ let outW = 0, outH = 0;
301
+ const placed = [];
302
+ for (const row of rows) {
303
+ if (!row.length)
304
+ continue;
305
+ const rowH = Math.max(...row.map((r) => r.h));
306
+ let x = 0;
307
+ for (const r of row) {
308
+ placed.push({ name: r.name, x, y: outH + Math.floor((rowH - r.h) / 2), w: r.w, h: r.h, src: r.src });
309
+ x += r.w + GAP;
310
+ }
311
+ outW = Math.max(outW, x - GAP);
312
+ outH += rowH + GAP;
313
+ }
314
+ outH -= GAP;
315
+ const parts = [];
316
+ for (const pcd of placed) {
317
+ parts.push({ input: await sharp(png).extract({ left: pcd.src.x, top: pcd.src.y, width: pcd.w, height: pcd.h }).png().toBuffer(), left: pcd.x, top: pcd.y });
318
+ }
319
+ const buf = await sharp({ create: { width: outW, height: outH, channels: 4, background: { r: 0, g: 0, b: 0, alpha: 0 } } })
320
+ .composite(parts).png().toBuffer();
321
+ return { buf, frames: placed.map(({ name, x, y, w, h }) => ({ name, x, y, w, h })) };
322
+ }
323
+ /** 图生图 prompt(结构靠参考图,这里只点名控件语义 + 注入风格;绝不描述布局)。 */
324
+ export function uiKitPrompt(style) {
325
+ const names = UI_KIT_FRAMES.map((f) => f.label).join('、');
326
+ return (`游戏 UI 控件套件图。🔴 以参考图为【结构原型】:严格保持每个控件的位置、尺寸、轮廓形状与圆角,不新增、不删减、不移动;` +
327
+ `控件依次为:${names}。把灰色块面重绘成【${style || '明快卡通,圆润厚重,高对比描边'}】风格;` +
328
+ `图标符号含义保持不变;血槽外框保留内凹槽结构、血条填充为均匀可平铺的实心条;` +
329
+ `不烤任何文字;各控件之间保持干净间隔,严禁网格线/边框/背景装饰;🔴 每个控件的外接尺寸严格等于参考图中的灰色块面,绝不放大加粗到超出;描边/贴纸边/发光等一切装饰必须完全落在原控件轮廓范围内(可向内、绝不向外扩),控件之间的空隙必须保持完全透明。`);
330
+ }
331
+ //# sourceMappingURL=uiKit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uiKit.js","sourceRoot":"","sources":["../../../src/providers/art/uiKit.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * 视觉判定一张精灵图的朝向(侧面)。
3
+ * 🔴 失败/不确定一律返回 `'unknown'`,**绝不抛错打断生成** —— 判定是增强,不是前置条件。
4
+ */
5
+ export declare function detectFacing(imageDataUrl: string): Promise<'left' | 'right' | 'unknown'>;
6
+ export type SheetFacing = 'left' | 'right' | 'up' | 'down' | 'none';
7
+ /**
8
+ * 视觉给图集每帧打语义标签 + 逐帧朝向(平台契约:角色美术统一面朝右;`facing==='left'` 的帧由调用方翻转)。
9
+ * 入参图须在每帧左上角标了序号(**显式对齐索引** —— 否则模型的"第几个"和我们的第几个对不上)。
10
+ * 失败/解析不出 → 空数组,绝不抛错打断生成。
11
+ */
12
+ export declare function inspectSheetLabels(imageDataUrl: string, count: number, desc?: string): Promise<{
13
+ labels: string[];
14
+ facing: SheetFacing[];
15
+ }>;
16
+ /**
17
+ * 成品验收评委(`verify` 为 true 时才跑)—— 看每张成品图,输出 issues。
18
+ *
19
+ * 🔴 这是美术链里**唯一真正需要 agent 的地方**:看图评判"切对没/抠对没/内容对没/方向对没"
20
+ * 是综合视觉判断,确定性代码做不到。**只判不做** —— 疑难交用户 / 下轮 reviser。
21
+ *
22
+ * ⚠️ 它是**尾部可选的一步,不是一条分支**:`verify` 的两个取值下,
23
+ * **图处理的每一行都必须相同**。如果你发现自己在写 `if (verify) …else…` 包住任何处理逻辑,就是走岔了。
24
+ */
25
+ export declare function runVisionJudge(instructions: string, brief: string, images?: string[]): Promise<string>;
26
+ //# sourceMappingURL=visionJudge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"visionJudge.d.ts","sourceRoot":"","sources":["../../../src/providers/art/visionJudge.ts"],"names":[],"mappings":"AA0DA;;;GAGG;AACH,wBAAsB,YAAY,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC,CAiB9F;AAED,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,GAAG,MAAM,GAAG,MAAM,CAAC;AASpE;;;;GAIG;AACH,wBAAsB,kBAAkB,CACtC,YAAY,EAAE,MAAM,EACpB,KAAK,EAAE,MAAM,EACb,IAAI,CAAC,EAAE,MAAM,GACZ,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,EAAE,CAAC;IAAC,MAAM,EAAE,WAAW,EAAE,CAAA;CAAE,CAAC,CAsBtD;AAED;;;;;;;;GAQG;AACH,wBAAsB,cAAc,CAAC,YAAY,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAQ5G"}
@@ -0,0 +1,127 @@
1
+ /**
2
+ * @module providers/art/visionJudge
3
+ * @description 美术链的三处**模型判断**(1.3)。由 coral-studio `src/agents/runtime.ts` 移交。
4
+ * @layer provider
5
+ * @boundedContext art
6
+ *
7
+ * 与 studio 版的唯一差别:`callSubAgent`(HTTP 出站)→ `runSubAgent`(**本地库调用**)。
8
+ * 提示词、解析方式、失败语义**一字未改** —— 那些常数是实测的化石。
9
+ *
10
+ * ══════════════════════════════════════════════════════════════════════════
11
+ * 🔴🔴 **三处一律不加 `outputSchema`。这是实测结论,不是风格偏好。**
12
+ *
13
+ * 实测(2026-08-01,gpt-5.4 / codex,单帧精灵 n=8):
14
+ * ```
15
+ * 自由文本 + JSON 提取 7/8 正确
16
+ * json_schema 结构化输出 1/8 正确
17
+ * schema + "先写 reason 再结论" 字段 2/8
18
+ * ```
19
+ * json_schema 模式下模型**明显少推理**。看图判定一律走自由文本 + 正则提 JSON。
20
+ *
21
+ * ⚠️ **为什么这条最容易被顺手做掉**:改成本地调用之后,`runSubAgent` 就在手边、
22
+ * 它**支持** `outputSchema`,加上去代码还更短更"干净" ——
23
+ * **所有让它变好看的理由都成立,只有正确率不成立。**
24
+ * 本文件配了一条测试专门断言"传给 runSubAgent 的 spec 里没有 outputSchema"。
25
+ * ══════════════════════════════════════════════════════════════════════════
26
+ */
27
+ import { runSubAgent, SubAgentError } from '../subagent/runSubAgent.js';
28
+ /** 快判定的超时(与 studio 侧同量级)。 */
29
+ const TIMEOUT_QUICK = 90_000;
30
+ async function judge(spec) {
31
+ // toolMode:'none' —— 纯推理,不给文件工具(看图判定不需要,给了反而多一份越权面)。
32
+ const r = await runSubAgent({ ...spec, toolMode: 'none' });
33
+ return r.output;
34
+ }
35
+ /** 从自由文本里抠出第一个 JSON 对象。模型爱加解释/代码块,这是移交时就有的做法。 */
36
+ function extractJson(output) {
37
+ const m = /\{[\s\S]*\}/.exec(output);
38
+ if (!m)
39
+ return null;
40
+ try {
41
+ return JSON.parse(m[0]);
42
+ }
43
+ catch {
44
+ return null;
45
+ }
46
+ }
47
+ const FACING_INSTRUCTIONS = '你在判断一张游戏精灵图主体的朝向。只看主体的脸/身体/机头指向画面哪一侧。' +
48
+ '只输出 JSON、不要解释、不要代码块:{"facing":"left"|"right"|"unknown"}。拿不准就 "unknown"。';
49
+ /**
50
+ * 视觉判定一张精灵图的朝向(侧面)。
51
+ * 🔴 失败/不确定一律返回 `'unknown'`,**绝不抛错打断生成** —— 判定是增强,不是前置条件。
52
+ */
53
+ export async function detectFacing(imageDataUrl) {
54
+ try {
55
+ const output = await judge({
56
+ name: 'facing-detector',
57
+ instructions: FACING_INSTRUCTIONS,
58
+ task: '判断这张图主体的朝向,只输出 JSON。',
59
+ images: [imageDataUrl],
60
+ timeoutMs: TIMEOUT_QUICK,
61
+ });
62
+ const j = extractJson(output);
63
+ const f = j?.facing;
64
+ return f === 'left' || f === 'right' ? f : 'unknown';
65
+ }
66
+ catch (e) {
67
+ // 分类可见:一眼看出是超时还是模型问题(契约 §4.4:sps 只做错误分类,不吞异常语义)
68
+ if (e instanceof SubAgentError)
69
+ console.warn(`[detectFacing] ${e.kind}: ${e.message}`);
70
+ return 'unknown';
71
+ }
72
+ }
73
+ const SHEET_LABEL_INSTRUCTIONS = '你在给一张游戏图集的每个元素打语义标签。图上每个元素左上角标了红色序号(0,1,2…)。' +
74
+ '针对每个序号,用 1–3 个词说它是什么(中/英皆可,如 "红桃K"/"8号球"/"红色宝石"/"走路帧2");' +
75
+ '并判断朝向 facing:仅当元素是有明确脸部/身体/机头朝向的【角色/生物/载具】时给 "left"/"right"/"up"/"down"(脸或机头朝画面哪个方向;飞机/火箭/飞船看机头尖端指向),' +
76
+ '无方向物件(宝石/按钮/图标/正面对称元素)一律 "none"——拿不准就 "none",宁缺勿错。' +
77
+ '只输出 JSON、不要解释、不要代码块:{"labels":["…",…],"facing":["none"|"left"|"right"|"up"|"down",…]},两个数组顺序严格按序号、长度=元素个数。';
78
+ /**
79
+ * 视觉给图集每帧打语义标签 + 逐帧朝向(平台契约:角色美术统一面朝右;`facing==='left'` 的帧由调用方翻转)。
80
+ * 入参图须在每帧左上角标了序号(**显式对齐索引** —— 否则模型的"第几个"和我们的第几个对不上)。
81
+ * 失败/解析不出 → 空数组,绝不抛错打断生成。
82
+ */
83
+ export async function inspectSheetLabels(imageDataUrl, count, desc) {
84
+ try {
85
+ const output = await judge({
86
+ name: 'sheet-labeler',
87
+ instructions: SHEET_LABEL_INSTRUCTIONS,
88
+ task: `这是一张图集,共 ${count} 个元素(序号 0..${count - 1})。${desc ? `整体描述:${desc}。` : ''}给每个序号打标签和朝向,只输出 JSON。`,
89
+ images: [imageDataUrl],
90
+ timeoutMs: TIMEOUT_QUICK,
91
+ });
92
+ const j = extractJson(output);
93
+ if (!j)
94
+ return { labels: [], facing: [] };
95
+ const labels = Array.isArray(j.labels) ? j.labels.slice(0, count).map((x) => String(x)) : [];
96
+ const facing = Array.isArray(j.facing)
97
+ ? j.facing
98
+ .slice(0, count)
99
+ .map((x) => (x === 'left' || x === 'right' || x === 'up' || x === 'down' ? x : 'none'))
100
+ : [];
101
+ return { labels, facing };
102
+ }
103
+ catch (e) {
104
+ if (e instanceof SubAgentError)
105
+ console.warn(`[inspectSheetLabels] ${e.kind}: ${e.message}`);
106
+ return { labels: [], facing: [] };
107
+ }
108
+ }
109
+ /**
110
+ * 成品验收评委(`verify` 为 true 时才跑)—— 看每张成品图,输出 issues。
111
+ *
112
+ * 🔴 这是美术链里**唯一真正需要 agent 的地方**:看图评判"切对没/抠对没/内容对没/方向对没"
113
+ * 是综合视觉判断,确定性代码做不到。**只判不做** —— 疑难交用户 / 下轮 reviser。
114
+ *
115
+ * ⚠️ 它是**尾部可选的一步,不是一条分支**:`verify` 的两个取值下,
116
+ * **图处理的每一行都必须相同**。如果你发现自己在写 `if (verify) …else…` 包住任何处理逻辑,就是走岔了。
117
+ */
118
+ export async function runVisionJudge(instructions, brief, images) {
119
+ return judge({
120
+ name: 'art-judge',
121
+ instructions,
122
+ task: brief,
123
+ ...(images?.length ? { images } : {}),
124
+ timeoutMs: TIMEOUT_QUICK,
125
+ });
126
+ }
127
+ //# sourceMappingURL=visionJudge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"visionJudge.js","sourceRoot":"","sources":["../../../src/providers/art/visionJudge.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function withinDir(root: string, target: string): boolean;
2
+ //# sourceMappingURL=withinDir.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"withinDir.d.ts","sourceRoot":"","sources":["../../../src/providers/art/withinDir.ts"],"names":[],"mappings":"AAcA,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAI/D"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * @module providers/art/withinDir
3
+ * @description "这个路径在不在那个目录里" —— 由 studio `pathGuard.ts` 移交(语义一字未改)。
4
+ * @layer provider
5
+ * @boundedContext art
6
+ *
7
+ * ⚠️ 它**不是**落点围栏。落点由 `core/art/assetLocator` **构造**保证(sps 自己拼路径);
8
+ * 这里守的是另一件事:**manifest 里由设计师填的引用路径**(`ref` / `provided`)
9
+ * 可能写成 `../../etc/passwd` —— 那是**内容**,不是我们拼的,必须查。
10
+ *
11
+ * 🔴 必须比到分隔符:裸 `startsWith(root)` 会放行 `<root>-old`(同 console/lib/artPaths 的判据)。
12
+ */
13
+ import { resolve, sep } from 'node:path';
14
+ export function withinDir(root, target) {
15
+ const r = resolve(root);
16
+ const t = resolve(target);
17
+ return t === r || t.startsWith(r.endsWith(sep) ? r : `${r}${sep}`);
18
+ }
19
+ //# sourceMappingURL=withinDir.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"withinDir.js","sourceRoot":"","sources":["../../../src/providers/art/withinDir.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AAEzC,MAAM,UAAU,SAAS,CAAC,IAAY,EAAE,MAAc;IACpD,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACxB,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAC1B,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG,EAAE,CAAC,CAAC;AACrE,CAAC"}