@3rtools/tyts-mcp 1.18.2 → 1.19.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -50,6 +50,9 @@ claude mcp add tyts -- npx -y @3rtools/tyts-mcp
50
50
  | `image` | шлях до файлу, http(s) URL або data URL |
51
51
  | `pins` | анотації; координати в пікселях **оригінальної** картинки |
52
52
  | `document` | замість `image`+`pins` — повний `TytsDocument` (наприклад, з попереднього рендера) |
53
+ | `crop` | `{x, y, width, height}` — кадрувати картинку; координати `pins` лишаються в оригіналі |
54
+ | `stamp` | `{image, corner?, size?, marginX?, marginY?}` — лого в кут, як інструмент «Штамп» |
55
+ | `strokeWidth` | товщина ліній для всіх пінів без власної (0.25–4, типово 1) |
53
56
  | `format` | `png` (типово), `jpeg`, `pdf` |
54
57
  | `width` або `scale` | цільова ширина в px або множник (1 = полотно × 2) |
55
58
  | `output` | шлях для файлу; типово `$TYTS_OUTPUT_DIR/tyts-<час>.<ext>` |
@@ -69,8 +72,32 @@ claude mcp add tyts -- npx -y @3rtools/tyts-mcp
69
72
  }
70
73
  ```
71
74
 
72
- Типи фігур: `point`, `rectangle`, `ellipse`, `polygon`, `polyline`, `arrow`, `text`, `compass`,
73
- `standalone`. Поля кожного — у ресурсі `tyts://docs/annotations` (агент може його прочитати сам).
75
+ Типи фігур — усі, що є в редакторі: `point`, `rectangle`, `ellipse`, `polygon`, `polyline`, `arrow`,
76
+ `text` (з `point` — «точка з текстом»), `compass`, `standalone`, `numbering`, `image` (картинка поверх
77
+ фото), `redact` (розмиття / пікселізація / заливка), `linked` (ще одна виноска до тієї ж фігури).
78
+
79
+ Картка-виноска будь-якого піна: `text`, **`photo`** (фото в картці — шлях, URL або data URL),
80
+ `textPosition` (текст над / під фото), `theme`, `bold` / `italic` / `underline` / `strike`, `fontSize`,
81
+ `textColor`, `cardBackground` (`none` — прозорий), `card` (явна позиція), `hideCallout`, `bends`
82
+ (злами лінії). Фігура: `color`, `strokeStyle`, `fillStyle`, `strokeWidth`.
83
+
84
+ Картки без `card` MCP розкладає так само, як редактор (колонки від правого краю), але картка з фото
85
+ вища — під пропорції фото. Поля кожного типу — у ресурсі `tyts://docs/annotations` (агент читає його сам).
86
+
87
+ ```json
88
+ {
89
+ "image": "./scene.jpg",
90
+ "pins": [
91
+ { "id": "tech", "type": "rectangle", "x": 130, "y": 360, "width": 220, "height": 130, "text": "Техніка", "photo": "./closeup.jpg" },
92
+ { "type": "linked", "to": "tech", "text": "Друга виноска до тієї ж рамки" },
93
+ { "type": "redact", "x": 40, "y": 40, "width": 120, "height": 60, "mode": "pixelate" }
94
+ ],
95
+ "crop": { "x": 0, "y": 100, "width": 1600, "height": 900 },
96
+ "stamp": { "image": "./logo.png", "corner": "se" }
97
+ }
98
+ ```
99
+
100
+ Не вміє лише часткове форматування тексту (жирне окреме слово): стиль задається на всю картку.
74
101
 
75
102
  ### `tyts_image_info`
76
103
 
@@ -1,21 +1,40 @@
1
- import type { SimplePin } from './schemas.js';
1
+ import type { CropInput, SimplePin, StampInput } from './schemas.js';
2
2
  /** Палітра редактора (src/constants.ts PIN_COLORS); дублюється, бо пакет не імпортує код застосунку. */
3
3
  export declare const PIN_COLORS: readonly ["#FBD710", "#F0462F", "#FF8D28", "#4FD553", "#00C0E8", "#0088FF", "#E246A1", "#FFFFFF", "#A0522D", "#888888", "#000000"];
4
4
  export interface Size {
5
5
  w: number;
6
6
  h: number;
7
7
  }
8
+ /** Завантажена картинка (фото в картці, картинка-обʼєкт, штамп): data URL і пропорції. */
9
+ export interface ImageAsset {
10
+ src: string;
11
+ aspect: number;
12
+ }
8
13
  export interface EditorPin {
9
14
  id: string;
10
15
  label: number;
11
16
  color: string;
12
17
  description: string;
13
18
  descPos: 'above' | 'below';
14
- image: null;
15
- imageAspect: null;
19
+ image: string | null;
20
+ imageAspect: number | null;
16
21
  anchor: Record<string, unknown>;
17
22
  strokeStyle?: 'solid' | 'dashed';
18
23
  fillStyle?: 'filled' | 'none';
24
+ strokeWidthScale?: number;
25
+ leaderPoints?: Array<{
26
+ x: number;
27
+ y: number;
28
+ }>;
29
+ theme?: 'dark' | 'light';
30
+ textBold?: boolean;
31
+ textItalic?: boolean;
32
+ textUnderline?: boolean;
33
+ textStrike?: boolean;
34
+ textFontSize?: number;
35
+ textColor?: string;
36
+ textBackgroundColor?: string | null;
37
+ calloutHidden?: boolean;
19
38
  }
20
39
  export interface CardPosition {
21
40
  x: number;
@@ -45,7 +64,25 @@ export declare function escapeHtml(text: string): string;
45
64
  export declare function textToDescription(text: string | undefined): string;
46
65
  /** Коефіцієнт «оригінальні пікселі → простір редактора» (редактор масштабує до 1500 px). */
47
66
  export declare function scaleFactor(imageSize: Size, sourceImageSize: Size | null): number;
48
- export declare function toAnchor(pin: SimplePin, k: number): Record<string, unknown>;
67
+ /** Усі джерела картинок, які треба завантажити перед `buildDocument`. */
68
+ export declare function imageSourcesOf(pins: readonly SimplePin[], stamp?: StampInput): string[];
69
+ export declare function toAnchor(pin: SimplePin, k: number, assets?: Record<string, ImageAsset>): Record<string, unknown>;
70
+ /** Зсув усієї геометрії піна — для `crop`: координати агента лишаються в оригіналі. */
71
+ export declare function translatePin(pin: SimplePin, dx: number, dy: number): SimplePin;
72
+ /** Кадр у межах картинки (цілі пікселі). */
73
+ export declare function clampCrop(crop: CropInput, source: Size): CropInput;
74
+ /**
75
+ * Номери — як `relabelPinsSequential` у редакторі: нумерація (`numbering`) — своя
76
+ * послідовність, супутник бере номер фігури, решта йде по порядку.
77
+ */
78
+ export declare function assignLabels(pins: readonly EditorPin[]): EditorPin[];
79
+ /** Прямокутник штампа — як `stampRect` у редакторі (src/utils/stamp.ts). */
80
+ export declare function stampRect(stamp: Pick<StampInput, 'corner' | 'size' | 'marginX' | 'marginY'>, aspect: number, imageSize: Size): {
81
+ x: number;
82
+ y: number;
83
+ width: number;
84
+ height: number;
85
+ };
49
86
  export interface BuildDocumentInput {
50
87
  backgroundImage: string;
51
88
  imageSize: Size;
@@ -53,16 +90,56 @@ export interface BuildDocumentInput {
53
90
  pins: SimplePin[];
54
91
  /** 'source' — координати в пікселях оригіналу (масштабуються), 'editor' — уже в просторі редактора. */
55
92
  coordinates?: 'source' | 'editor';
93
+ /** Завантажені картинки за їхнім джерелом (`photo`, `src` картинки, лого штампа). */
94
+ assets?: Record<string, ImageAsset>;
95
+ stamp?: StampInput;
96
+ /** Глобальна товщина ліній (settings.strokeWidthScale). */
97
+ strokeWidth?: number;
56
98
  meta?: EditorDocument['meta'];
57
99
  }
58
100
  export declare function buildDocument(input: BuildDocumentInput): EditorDocument;
59
- /** Документ без base64-картинки — для відповіді агенту. */
101
+ /**
102
+ * Позиції карток без явного `card`: колонки від правого краю, зверху вниз,
103
+ * як у редакторі. Але картка з фото вища — під пропорції фото (плюс місце під
104
+ * текст), а приховані виноски місця не займають. `cardSize` — стандартна
105
+ * картка редактора (береться з його власної розкладки).
106
+ */
107
+ export declare function layoutCards(doc: EditorDocument, cardSize: {
108
+ width: number;
109
+ height: number;
110
+ }, explicit: Record<string, CardPosition>): Record<string, CardPosition>;
111
+ /** Документ без base64-картинок — для відповіді агенту. */
60
112
  export declare function summarizeDocument(doc: EditorDocument | null): {
61
113
  backgroundImage: string;
114
+ pins: {
115
+ anchor: Record<string, unknown>;
116
+ image: string | null;
117
+ id: string;
118
+ label: number;
119
+ color: string;
120
+ description: string;
121
+ descPos: "above" | "below";
122
+ imageAspect: number | null;
123
+ strokeStyle?: "solid" | "dashed";
124
+ fillStyle?: "filled" | "none";
125
+ strokeWidthScale?: number;
126
+ leaderPoints?: Array<{
127
+ x: number;
128
+ y: number;
129
+ }>;
130
+ theme?: "dark" | "light";
131
+ textBold?: boolean;
132
+ textItalic?: boolean;
133
+ textUnderline?: boolean;
134
+ textStrike?: boolean;
135
+ textFontSize?: number;
136
+ textColor?: string;
137
+ textBackgroundColor?: string | null;
138
+ calloutHidden?: boolean;
139
+ }[];
62
140
  version: 1;
63
141
  imageSize: Size;
64
142
  sourceImageSize: Size | null;
65
- pins: EditorPin[];
66
143
  cardPositions: Record<string, CardPosition>;
67
144
  settings?: {
68
145
  fontId?: string;
package/dist/document.js CHANGED
@@ -2,6 +2,14 @@
2
2
  export const PIN_COLORS = [
3
3
  '#FBD710', '#F0462F', '#FF8D28', '#4FD553', '#00C0E8', '#0088FF', '#E246A1', '#FFFFFF', '#A0522D', '#888888', '#000000',
4
4
  ];
5
+ /** Типові значення редактора (src/constants.ts). */
6
+ const REDACT_DEFAULT_MODE = 'blur';
7
+ const REDACT_STRENGTH_DEFAULT = 0.5;
8
+ const IMAGE_OBJECT_MIN_SIDE = 16;
9
+ const POINT_TEXT_DEFAULT_TEXT_COLOR = '#ffffff';
10
+ const POINT_TEXT_DEFAULT_BG_COLOR = '#000000';
11
+ /** Фігури, до яких можна причепити `linked` (src/utils/linkedCallouts.ts HOSTABLE_ANCHORS). */
12
+ const HOSTABLE = new Set(['point', 'polygon', 'polyline', 'rectangle', 'ellipse', 'arrow', 'compass', 'numbering', 'image']);
5
13
  export function escapeHtml(text) {
6
14
  return text
7
15
  .replace(/&/g, '&amp;')
@@ -24,17 +32,41 @@ export function scaleFactor(imageSize, sourceImageSize) {
24
32
  }
25
33
  const s = (v, k) => Math.round(v * k * 1000) / 1000;
26
34
  const sp = (p, k) => ({ x: s(p.x, k), y: s(p.y, k) });
27
- export function toAnchor(pin, k) {
35
+ /** Усі джерела картинок, які треба завантажити перед `buildDocument`. */
36
+ export function imageSourcesOf(pins, stamp) {
37
+ const out = new Set();
38
+ for (const pin of pins) {
39
+ if (pin.photo)
40
+ out.add(pin.photo);
41
+ if (pin.type === 'image')
42
+ out.add(pin.src);
43
+ }
44
+ if (stamp)
45
+ out.add(stamp.image);
46
+ return [...out];
47
+ }
48
+ function assetFor(assets, source) {
49
+ const asset = assets[source];
50
+ if (!asset)
51
+ throw new Error(`Image was not loaded: ${source}`);
52
+ return asset;
53
+ }
54
+ export function toAnchor(pin, k, assets = {}) {
28
55
  switch (pin.type) {
29
56
  case 'point':
30
57
  case 'standalone':
31
58
  return { type: pin.type, x: s(pin.x, k), y: s(pin.y, k) };
32
59
  case 'rectangle':
60
+ return {
61
+ type: 'rectangle',
62
+ x: s(pin.x, k), y: s(pin.y, k), width: s(pin.width, k), height: s(pin.height, k),
63
+ ...(pin.rotation !== undefined ? { rotation: pin.rotation } : {}),
64
+ };
33
65
  case 'text':
34
66
  return {
35
- type: pin.type,
67
+ type: 'text',
36
68
  x: s(pin.x, k), y: s(pin.y, k), width: s(pin.width, k), height: s(pin.height, k),
37
- ...('rotation' in pin && pin.rotation !== undefined ? { rotation: pin.rotation } : {}),
69
+ ...(pin.point ? { point: sp(pin.point, k) } : {}),
38
70
  };
39
71
  case 'ellipse':
40
72
  return { type: 'ellipse', cx: s(pin.cx, k), cy: s(pin.cy, k), rx: s(pin.rx, k), ry: s(pin.ry, k), ...(pin.rotation !== undefined ? { rotation: pin.rotation } : {}) };
@@ -47,39 +79,213 @@ export function toAnchor(pin, k) {
47
79
  }
48
80
  case 'compass':
49
81
  return { type: 'compass', cx: s(pin.cx, k), cy: s(pin.cy, k), radius: s(pin.radius, k), ...(pin.rotation !== undefined ? { rotation: pin.rotation } : {}) };
82
+ case 'numbering':
83
+ return { type: 'numbering', start: sp(pin.start, k), end: sp(pin.end, k) };
84
+ case 'image': {
85
+ const asset = assetFor(assets, pin.src);
86
+ if (pin.width === undefined && pin.height === undefined) {
87
+ throw new Error(`Pin "${pin.id ?? 'image'}": give image width or height`);
88
+ }
89
+ // Одна сторона — друга з пропорцій; обидві — як задано (редактор так само дозволяє розтягнути).
90
+ const width = pin.width ?? pin.height * asset.aspect;
91
+ const height = pin.height ?? pin.width / asset.aspect;
92
+ return {
93
+ type: 'image',
94
+ x: s(pin.x, k), y: s(pin.y, k),
95
+ width: Math.max(IMAGE_OBJECT_MIN_SIDE, s(width, k)),
96
+ height: Math.max(IMAGE_OBJECT_MIN_SIDE, s(height, k)),
97
+ src: asset.src,
98
+ aspect: asset.aspect,
99
+ };
100
+ }
101
+ case 'redact':
102
+ return {
103
+ type: 'redact',
104
+ x: s(pin.x, k), y: s(pin.y, k), width: s(pin.width, k), height: s(pin.height, k),
105
+ mode: pin.mode ?? REDACT_DEFAULT_MODE,
106
+ strength: pin.strength ?? REDACT_STRENGTH_DEFAULT,
107
+ };
108
+ case 'linked':
109
+ return { type: 'linked', pinId: pin.to };
110
+ }
111
+ }
112
+ /** Зсув усієї геометрії піна — для `crop`: координати агента лишаються в оригіналі. */
113
+ export function translatePin(pin, dx, dy) {
114
+ const p = (q) => ({ x: q.x + dx, y: q.y + dy });
115
+ const bends = pin.bends ? { bends: pin.bends.map(p) } : {};
116
+ const card = pin.card ? { card: { ...pin.card, x: pin.card.x + dx, y: pin.card.y + dy } } : {};
117
+ const extra = { ...bends, ...card };
118
+ switch (pin.type) {
119
+ case 'point':
120
+ case 'standalone':
121
+ case 'rectangle':
122
+ case 'image':
123
+ case 'redact':
124
+ return { ...pin, ...extra, x: pin.x + dx, y: pin.y + dy };
125
+ case 'text':
126
+ return { ...pin, ...extra, x: pin.x + dx, y: pin.y + dy, ...(pin.point ? { point: p(pin.point) } : {}) };
127
+ case 'ellipse':
128
+ case 'compass':
129
+ return { ...pin, ...extra, cx: pin.cx + dx, cy: pin.cy + dy };
130
+ case 'polygon':
131
+ case 'polyline':
132
+ return { ...pin, ...extra, points: pin.points.map(p) };
133
+ case 'arrow':
134
+ return { ...pin, ...extra, start: p(pin.start), end: p(pin.end), ...(pin.control ? { control: p(pin.control) } : {}) };
135
+ case 'numbering':
136
+ return { ...pin, ...extra, start: p(pin.start), end: p(pin.end) };
137
+ case 'linked':
138
+ return { ...pin, ...extra };
139
+ }
140
+ }
141
+ /** Кадр у межах картинки (цілі пікселі). */
142
+ export function clampCrop(crop, source) {
143
+ const x = Math.max(0, Math.min(Math.floor(crop.x), source.w - 1));
144
+ const y = Math.max(0, Math.min(Math.floor(crop.y), source.h - 1));
145
+ return {
146
+ x, y,
147
+ width: Math.max(1, Math.min(Math.round(crop.width), source.w - x)),
148
+ height: Math.max(1, Math.min(Math.round(crop.height), source.h - y)),
149
+ };
150
+ }
151
+ /**
152
+ * Номери — як `relabelPinsSequential` у редакторі: нумерація (`numbering`) — своя
153
+ * послідовність, супутник бере номер фігури, решта йде по порядку.
154
+ */
155
+ export function assignLabels(pins) {
156
+ let numIdx = 0;
157
+ let otherIdx = 0;
158
+ const byId = new Map();
159
+ const first = pins.map((p) => {
160
+ if (p.anchor.type === 'linked')
161
+ return p;
162
+ const label = p.anchor.type === 'numbering' ? ++numIdx : ++otherIdx;
163
+ byId.set(p.id, label);
164
+ return { ...p, label };
165
+ });
166
+ return first.map((p) => (p.anchor.type === 'linked'
167
+ ? { ...p, label: byId.get(p.anchor.pinId) ?? 1 }
168
+ : p));
169
+ }
170
+ /** Прямокутник штампа — як `stampRect` у редакторі (src/utils/stamp.ts). */
171
+ export function stampRect(stamp, aspect, imageSize) {
172
+ const base = Math.min(imageSize.w, imageSize.h);
173
+ const maxSide = Math.max(IMAGE_OBJECT_MIN_SIDE, (base * stamp.size) / 100);
174
+ const marginX = (base * stamp.marginX) / 100;
175
+ const marginY = (base * stamp.marginY) / 100;
176
+ const a = Number.isFinite(aspect) && aspect > 0 ? aspect : 1;
177
+ const width = a >= 1 ? maxSide : maxSide * a;
178
+ const height = a >= 1 ? maxSide / a : maxSide;
179
+ const left = stamp.corner === 'nw' || stamp.corner === 'sw';
180
+ const top = stamp.corner === 'nw' || stamp.corner === 'ne';
181
+ return {
182
+ x: left ? marginX : Math.max(marginX, imageSize.w - marginX - width),
183
+ y: top ? marginY : Math.max(marginY, imageSize.h - marginY - height),
184
+ width,
185
+ height,
186
+ };
187
+ }
188
+ function editorPinFor(pin, index, k, assets) {
189
+ const id = pin.id ?? `pin-${index + 1}`;
190
+ const photo = pin.photo ? assetFor(assets, pin.photo) : null;
191
+ const out = {
192
+ id,
193
+ label: 1,
194
+ color: pin.color ?? PIN_COLORS[index % PIN_COLORS.length],
195
+ description: textToDescription(pin.text),
196
+ descPos: pin.textPosition ?? 'below',
197
+ image: photo ? photo.src : null,
198
+ imageAspect: photo ? photo.aspect : null,
199
+ anchor: toAnchor(pin, k, assets),
200
+ };
201
+ if (pin.strokeStyle)
202
+ out.strokeStyle = pin.strokeStyle;
203
+ if (pin.fillStyle)
204
+ out.fillStyle = pin.fillStyle;
205
+ if (pin.strokeWidth !== undefined)
206
+ out.strokeWidthScale = pin.strokeWidth;
207
+ if (pin.bends?.length)
208
+ out.leaderPoints = pin.bends.map((p) => sp(p, k));
209
+ if (pin.theme)
210
+ out.theme = pin.theme;
211
+ if (pin.bold !== undefined)
212
+ out.textBold = pin.bold;
213
+ if (pin.italic !== undefined)
214
+ out.textItalic = pin.italic;
215
+ if (pin.underline !== undefined)
216
+ out.textUnderline = pin.underline;
217
+ if (pin.strike !== undefined)
218
+ out.textStrike = pin.strike;
219
+ if (pin.fontSize !== undefined)
220
+ out.textFontSize = pin.fontSize;
221
+ // «Точка з текстом» у редакторі одразу біла на чорному — тримаємо той самий вигляд.
222
+ const isPointText = pin.type === 'text' && !!pin.point;
223
+ const textColor = pin.textColor ?? (isPointText ? POINT_TEXT_DEFAULT_TEXT_COLOR : undefined);
224
+ if (textColor)
225
+ out.textColor = textColor;
226
+ if (pin.cardBackground !== undefined) {
227
+ out.textBackgroundColor = pin.cardBackground.toLowerCase() === 'none' ? null : pin.cardBackground;
228
+ }
229
+ else if (isPointText) {
230
+ out.textBackgroundColor = POINT_TEXT_DEFAULT_BG_COLOR;
50
231
  }
232
+ // Картинка, компас, нумерація й замальовка в редакторі з'являються без виноски — так само тут.
233
+ const hiddenByDefault = pin.type === 'image' || pin.type === 'compass' || pin.type === 'redact' || pin.type === 'numbering';
234
+ const hidden = pin.hideCallout ?? (hiddenByDefault && !pin.text && !pin.photo);
235
+ if (hidden)
236
+ out.calloutHidden = true;
237
+ return out;
51
238
  }
52
239
  export function buildDocument(input) {
53
240
  const k = input.coordinates === 'editor' ? 1 : scaleFactor(input.imageSize, input.sourceImageSize);
241
+ const assets = input.assets ?? {};
54
242
  const cardPositions = {};
55
- const pins = input.pins.map((pin, index) => {
56
- const id = pin.id ?? `pin-${index + 1}`;
57
- const editorPin = {
58
- id,
59
- label: index + 1,
60
- color: pin.color ?? PIN_COLORS[index % PIN_COLORS.length],
61
- description: textToDescription(pin.text),
62
- descPos: 'below',
63
- image: null,
64
- imageAspect: null,
65
- anchor: toAnchor(pin, k),
66
- };
67
- if (pin.strokeStyle)
68
- editorPin.strokeStyle = pin.strokeStyle;
69
- if (pin.fillStyle)
70
- editorPin.fillStyle = pin.fillStyle;
243
+ let pins = input.pins.map((pin, index) => {
244
+ const editorPin = editorPinFor(pin, index, k, assets);
71
245
  if (pin.card) {
72
- cardPositions[id] = { x: s(pin.card.x, k), y: s(pin.card.y, k), width: s(pin.card.width, k), height: s(pin.card.height, k) };
246
+ cardPositions[editorPin.id] = { x: s(pin.card.x, k), y: s(pin.card.y, k), width: s(pin.card.width, k), height: s(pin.card.height, k) };
73
247
  }
74
248
  return editorPin;
75
249
  });
76
- const ids = new Set();
250
+ const byId = new Map();
77
251
  for (const pin of pins) {
78
- if (ids.has(pin.id))
252
+ if (byId.has(pin.id))
79
253
  throw new Error(`Duplicate pin id: ${pin.id}`);
80
- ids.add(pin.id);
254
+ byId.set(pin.id, pin);
81
255
  }
82
- return {
256
+ pins = pins.map((pin, index) => {
257
+ if (pin.anchor.type !== 'linked')
258
+ return pin;
259
+ const host = byId.get(pin.anchor.pinId);
260
+ if (!host)
261
+ throw new Error(`Pin "${pin.id}": linked "to" refers to unknown id "${String(pin.anchor.pinId)}"`);
262
+ if (!HOSTABLE.has(host.anchor.type)) {
263
+ throw new Error(`Pin "${pin.id}": cannot link to "${host.id}" of type ${String(host.anchor.type)} (only shapes: ${[...HOSTABLE].join(', ')})`);
264
+ }
265
+ // Як кнопка «+» у редакторі: супутник того ж кольору, що й фігура.
266
+ return input.pins[index].color ? pin : { ...pin, color: host.color };
267
+ });
268
+ // Штамп — останнім: картинки теж займають номер у редакторі, хай не зсуває номери виносок.
269
+ if (input.stamp) {
270
+ const logo = assetFor(assets, input.stamp.image);
271
+ const rect = stampRect(input.stamp, logo.aspect, input.imageSize);
272
+ let id = 'stamp';
273
+ for (let n = 2; byId.has(id); n += 1)
274
+ id = `stamp-${n}`;
275
+ pins.push({
276
+ id,
277
+ label: 1,
278
+ color: PIN_COLORS[0],
279
+ description: '',
280
+ descPos: 'below',
281
+ image: null,
282
+ imageAspect: null,
283
+ anchor: { type: 'image', ...rect, src: logo.src, aspect: logo.aspect, stamp: true },
284
+ calloutHidden: true,
285
+ });
286
+ }
287
+ pins = assignLabels(pins);
288
+ const doc = {
83
289
  version: 1,
84
290
  backgroundImage: input.backgroundImage,
85
291
  imageSize: input.imageSize,
@@ -88,14 +294,58 @@ export function buildDocument(input) {
88
294
  cardPositions,
89
295
  meta: input.meta,
90
296
  };
297
+ if (input.strokeWidth !== undefined)
298
+ doc.settings = { strokeWidthScale: input.strokeWidth };
299
+ return doc;
300
+ }
301
+ /** Розкладка карток — як `computeCardPositions` у редакторі (src/utils/perimeter.ts). */
302
+ const EDGE_PAD = 20;
303
+ const V_GAP = 12;
304
+ const H_GAP = 12;
305
+ /** Чи малює редактор картку цього піна (текстовий блок і приховані — без картки). */
306
+ function hasCard(pin) {
307
+ return pin.anchor.type !== 'text' && pin.anchor.type !== 'redact' && !pin.calloutHidden;
308
+ }
309
+ /**
310
+ * Позиції карток без явного `card`: колонки від правого краю, зверху вниз,
311
+ * як у редакторі. Але картка з фото вища — під пропорції фото (плюс місце під
312
+ * текст), а приховані виноски місця не займають. `cardSize` — стандартна
313
+ * картка редактора (береться з його власної розкладки).
314
+ */
315
+ export function layoutCards(doc, cardSize, explicit) {
316
+ const { w: W, h: H } = doc.imageSize;
317
+ const maxH = Math.max(cardSize.height, H - 2 * EDGE_PAD);
318
+ const out = { ...explicit };
319
+ let col = 0;
320
+ let y = EDGE_PAD;
321
+ for (const pin of doc.pins) {
322
+ if (!hasCard(pin) || explicit[pin.id])
323
+ continue;
324
+ const photoH = pin.image && pin.imageAspect ? cardSize.width / pin.imageAspect : 0;
325
+ const height = Math.min(maxH, photoH > 0 ? Math.round(photoH + (pin.description ? cardSize.height : 0)) : cardSize.height);
326
+ if (y > EDGE_PAD && y + height > H - EDGE_PAD) {
327
+ col += 1;
328
+ y = EDGE_PAD;
329
+ }
330
+ const x = Math.max(EDGE_PAD, Math.min(W - EDGE_PAD - cardSize.width - col * (cardSize.width + H_GAP), W - cardSize.width - EDGE_PAD));
331
+ out[pin.id] = { x, y: Math.max(EDGE_PAD, Math.min(y, H - height - EDGE_PAD)), width: cardSize.width, height };
332
+ y += height + V_GAP;
333
+ }
334
+ return out;
91
335
  }
92
- /** Документ без base64-картинки — для відповіді агенту. */
336
+ /** Документ без base64-картинок — для відповіді агенту. */
93
337
  export function summarizeDocument(doc) {
94
338
  if (!doc)
95
339
  return null;
340
+ const kb = (dataUrl) => `<data URL, ${Math.round(dataUrl.length * 0.75 / 1024)} KB>`;
96
341
  return {
97
342
  ...doc,
98
- backgroundImage: `<data URL, ${Math.round(doc.backgroundImage.length * 0.75 / 1024)} KB>`,
343
+ backgroundImage: kb(doc.backgroundImage),
344
+ pins: doc.pins.map((pin) => ({
345
+ ...pin,
346
+ ...(pin.image ? { image: kb(pin.image) } : {}),
347
+ ...(typeof pin.anchor.src === 'string' ? { anchor: { ...pin.anchor, src: kb(pin.anchor.src) } } : {}),
348
+ })),
99
349
  };
100
350
  }
101
351
  //# sourceMappingURL=document.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"document.js","sourceRoot":"","sources":["../src/document.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"document.js","sourceRoot":"","sources":["../src/document.ts"],"names":[],"mappings":"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"}