rpgmaker-mz-mcp 1.0.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.
Files changed (219) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +425 -0
  3. package/dist/events/commandBuilders.d.ts +405 -0
  4. package/dist/events/commandBuilders.d.ts.map +1 -0
  5. package/dist/events/commandBuilders.js +554 -0
  6. package/dist/events/commandBuilders.js.map +1 -0
  7. package/dist/index.d.ts +3 -0
  8. package/dist/index.d.ts.map +1 -0
  9. package/dist/index.js +105 -0
  10. package/dist/index.js.map +1 -0
  11. package/dist/registry.d.ts +81 -0
  12. package/dist/registry.d.ts.map +1 -0
  13. package/dist/registry.js +49 -0
  14. package/dist/registry.js.map +1 -0
  15. package/dist/tiles/autotile.d.ts +65 -0
  16. package/dist/tiles/autotile.d.ts.map +1 -0
  17. package/dist/tiles/autotile.js +201 -0
  18. package/dist/tiles/autotile.js.map +1 -0
  19. package/dist/tiles/catalog/dungeon.d.ts +16 -0
  20. package/dist/tiles/catalog/dungeon.d.ts.map +1 -0
  21. package/dist/tiles/catalog/dungeon.js +765 -0
  22. package/dist/tiles/catalog/dungeon.js.map +1 -0
  23. package/dist/tiles/catalog/index.d.ts +78 -0
  24. package/dist/tiles/catalog/index.d.ts.map +1 -0
  25. package/dist/tiles/catalog/index.js +115 -0
  26. package/dist/tiles/catalog/index.js.map +1 -0
  27. package/dist/tiles/catalog/inside.d.ts +16 -0
  28. package/dist/tiles/catalog/inside.d.ts.map +1 -0
  29. package/dist/tiles/catalog/inside.js +765 -0
  30. package/dist/tiles/catalog/inside.js.map +1 -0
  31. package/dist/tiles/catalog/outside.d.ts +16 -0
  32. package/dist/tiles/catalog/outside.d.ts.map +1 -0
  33. package/dist/tiles/catalog/outside.js +799 -0
  34. package/dist/tiles/catalog/outside.js.map +1 -0
  35. package/dist/tiles/catalog/overworld.d.ts +16 -0
  36. package/dist/tiles/catalog/overworld.d.ts.map +1 -0
  37. package/dist/tiles/catalog/overworld.js +585 -0
  38. package/dist/tiles/catalog/overworld.js.map +1 -0
  39. package/dist/tiles/catalog/sf.d.ts +16 -0
  40. package/dist/tiles/catalog/sf.d.ts.map +1 -0
  41. package/dist/tiles/catalog/sf.js +1313 -0
  42. package/dist/tiles/catalog/sf.js.map +1 -0
  43. package/dist/tiles/paint.d.ts +20 -0
  44. package/dist/tiles/paint.d.ts.map +1 -0
  45. package/dist/tiles/paint.js +65 -0
  46. package/dist/tiles/paint.js.map +1 -0
  47. package/dist/tiles/png.d.ts +11 -0
  48. package/dist/tiles/png.d.ts.map +1 -0
  49. package/dist/tiles/png.js +180 -0
  50. package/dist/tiles/png.js.map +1 -0
  51. package/dist/tiles/tileCodec.d.ts +95 -0
  52. package/dist/tiles/tileCodec.d.ts.map +1 -0
  53. package/dist/tiles/tileCodec.js +186 -0
  54. package/dist/tiles/tileCodec.js.map +1 -0
  55. package/dist/tiles/tileFlags.d.ts +98 -0
  56. package/dist/tiles/tileFlags.d.ts.map +1 -0
  57. package/dist/tiles/tileFlags.js +129 -0
  58. package/dist/tiles/tileFlags.js.map +1 -0
  59. package/dist/tiles/tilegeom.d.ts +29 -0
  60. package/dist/tiles/tilegeom.d.ts.map +1 -0
  61. package/dist/tiles/tilegeom.js +111 -0
  62. package/dist/tiles/tilegeom.js.map +1 -0
  63. package/dist/tiles/transparency.d.ts +22 -0
  64. package/dist/tiles/transparency.d.ts.map +1 -0
  65. package/dist/tiles/transparency.js +59 -0
  66. package/dist/tiles/transparency.js.map +1 -0
  67. package/dist/tools/actorTools.d.ts +48 -0
  68. package/dist/tools/actorTools.d.ts.map +1 -0
  69. package/dist/tools/actorTools.js +154 -0
  70. package/dist/tools/actorTools.js.map +1 -0
  71. package/dist/tools/allTools.d.ts +8 -0
  72. package/dist/tools/allTools.d.ts.map +1 -0
  73. package/dist/tools/allTools.js +56 -0
  74. package/dist/tools/allTools.js.map +1 -0
  75. package/dist/tools/assetTools.d.ts +113 -0
  76. package/dist/tools/assetTools.d.ts.map +1 -0
  77. package/dist/tools/assetTools.js +97 -0
  78. package/dist/tools/assetTools.js.map +1 -0
  79. package/dist/tools/batchTools.d.ts +3 -0
  80. package/dist/tools/batchTools.d.ts.map +1 -0
  81. package/dist/tools/batchTools.js +138 -0
  82. package/dist/tools/batchTools.js.map +1 -0
  83. package/dist/tools/battleTools.d.ts +72 -0
  84. package/dist/tools/battleTools.d.ts.map +1 -0
  85. package/dist/tools/battleTools.js +322 -0
  86. package/dist/tools/battleTools.js.map +1 -0
  87. package/dist/tools/catalogTools.d.ts +3 -0
  88. package/dist/tools/catalogTools.d.ts.map +1 -0
  89. package/dist/tools/catalogTools.js +134 -0
  90. package/dist/tools/catalogTools.js.map +1 -0
  91. package/dist/tools/classTools.d.ts +85 -0
  92. package/dist/tools/classTools.d.ts.map +1 -0
  93. package/dist/tools/classTools.js +279 -0
  94. package/dist/tools/classTools.js.map +1 -0
  95. package/dist/tools/commonEventTools.d.ts +32 -0
  96. package/dist/tools/commonEventTools.d.ts.map +1 -0
  97. package/dist/tools/commonEventTools.js +150 -0
  98. package/dist/tools/commonEventTools.js.map +1 -0
  99. package/dist/tools/eventCommandTools.d.ts +37 -0
  100. package/dist/tools/eventCommandTools.d.ts.map +1 -0
  101. package/dist/tools/eventCommandTools.js +893 -0
  102. package/dist/tools/eventCommandTools.js.map +1 -0
  103. package/dist/tools/eventPageTools.d.ts +112 -0
  104. package/dist/tools/eventPageTools.d.ts.map +1 -0
  105. package/dist/tools/eventPageTools.js +597 -0
  106. package/dist/tools/eventPageTools.js.map +1 -0
  107. package/dist/tools/itemTools.d.ts +82 -0
  108. package/dist/tools/itemTools.d.ts.map +1 -0
  109. package/dist/tools/itemTools.js +380 -0
  110. package/dist/tools/itemTools.js.map +1 -0
  111. package/dist/tools/listTools.d.ts +58 -0
  112. package/dist/tools/listTools.d.ts.map +1 -0
  113. package/dist/tools/listTools.js +99 -0
  114. package/dist/tools/listTools.js.map +1 -0
  115. package/dist/tools/mapTools.d.ts +270 -0
  116. package/dist/tools/mapTools.d.ts.map +1 -0
  117. package/dist/tools/mapTools.js +1066 -0
  118. package/dist/tools/mapTools.js.map +1 -0
  119. package/dist/tools/moveTools.d.ts +43 -0
  120. package/dist/tools/moveTools.d.ts.map +1 -0
  121. package/dist/tools/moveTools.js +240 -0
  122. package/dist/tools/moveTools.js.map +1 -0
  123. package/dist/tools/objectTools.d.ts +12 -0
  124. package/dist/tools/objectTools.d.ts.map +1 -0
  125. package/dist/tools/objectTools.js +221 -0
  126. package/dist/tools/objectTools.js.map +1 -0
  127. package/dist/tools/paintTools.d.ts +3 -0
  128. package/dist/tools/paintTools.d.ts.map +1 -0
  129. package/dist/tools/paintTools.js +134 -0
  130. package/dist/tools/paintTools.js.map +1 -0
  131. package/dist/tools/pluginScanTools.d.ts +22 -0
  132. package/dist/tools/pluginScanTools.d.ts.map +1 -0
  133. package/dist/tools/pluginScanTools.js +119 -0
  134. package/dist/tools/pluginScanTools.js.map +1 -0
  135. package/dist/tools/pluginTools.d.ts +11 -0
  136. package/dist/tools/pluginTools.d.ts.map +1 -0
  137. package/dist/tools/pluginTools.js +63 -0
  138. package/dist/tools/pluginTools.js.map +1 -0
  139. package/dist/tools/projectTools.d.ts +11 -0
  140. package/dist/tools/projectTools.d.ts.map +1 -0
  141. package/dist/tools/projectTools.js +74 -0
  142. package/dist/tools/projectTools.js.map +1 -0
  143. package/dist/tools/skillTools.d.ts +83 -0
  144. package/dist/tools/skillTools.d.ts.map +1 -0
  145. package/dist/tools/skillTools.js +369 -0
  146. package/dist/tools/skillTools.js.map +1 -0
  147. package/dist/tools/stateTools.d.ts +28 -0
  148. package/dist/tools/stateTools.d.ts.map +1 -0
  149. package/dist/tools/stateTools.js +161 -0
  150. package/dist/tools/stateTools.js.map +1 -0
  151. package/dist/tools/systemTools.d.ts +86 -0
  152. package/dist/tools/systemTools.d.ts.map +1 -0
  153. package/dist/tools/systemTools.js +342 -0
  154. package/dist/tools/systemTools.js.map +1 -0
  155. package/dist/tools/tileTools.d.ts +9 -0
  156. package/dist/tools/tileTools.d.ts.map +1 -0
  157. package/dist/tools/tileTools.js +34 -0
  158. package/dist/tools/tileTools.js.map +1 -0
  159. package/dist/tools/tileTransparency.d.ts +40 -0
  160. package/dist/tools/tileTransparency.d.ts.map +1 -0
  161. package/dist/tools/tileTransparency.js +156 -0
  162. package/dist/tools/tileTransparency.js.map +1 -0
  163. package/dist/tools/tilesetTools.d.ts +23 -0
  164. package/dist/tools/tilesetTools.d.ts.map +1 -0
  165. package/dist/tools/tilesetTools.js +209 -0
  166. package/dist/tools/tilesetTools.js.map +1 -0
  167. package/dist/tools/validationTools.d.ts +50 -0
  168. package/dist/tools/validationTools.d.ts.map +1 -0
  169. package/dist/tools/validationTools.js +229 -0
  170. package/dist/tools/validationTools.js.map +1 -0
  171. package/dist/utils/commit.d.ts +62 -0
  172. package/dist/utils/commit.d.ts.map +1 -0
  173. package/dist/utils/commit.js +119 -0
  174. package/dist/utils/commit.js.map +1 -0
  175. package/dist/utils/fileHandler.d.ts +49 -0
  176. package/dist/utils/fileHandler.d.ts.map +1 -0
  177. package/dist/utils/fileHandler.js +137 -0
  178. package/dist/utils/fileHandler.js.map +1 -0
  179. package/dist/utils/records.d.ts +8 -0
  180. package/dist/utils/records.d.ts.map +1 -0
  181. package/dist/utils/records.js +10 -0
  182. package/dist/utils/records.js.map +1 -0
  183. package/dist/utils/types.d.ts +465 -0
  184. package/dist/utils/types.d.ts.map +1 -0
  185. package/dist/utils/types.js +5 -0
  186. package/dist/utils/types.js.map +1 -0
  187. package/dist/validation/assets.d.ts +53 -0
  188. package/dist/validation/assets.d.ts.map +1 -0
  189. package/dist/validation/assets.js +198 -0
  190. package/dist/validation/assets.js.map +1 -0
  191. package/dist/validation/createRefs.d.ts +37 -0
  192. package/dist/validation/createRefs.d.ts.map +1 -0
  193. package/dist/validation/createRefs.js +89 -0
  194. package/dist/validation/createRefs.js.map +1 -0
  195. package/dist/validation/eventCommands.d.ts +70 -0
  196. package/dist/validation/eventCommands.d.ts.map +1 -0
  197. package/dist/validation/eventCommands.js +273 -0
  198. package/dist/validation/eventCommands.js.map +1 -0
  199. package/dist/validation/gate.d.ts +56 -0
  200. package/dist/validation/gate.d.ts.map +1 -0
  201. package/dist/validation/gate.js +50 -0
  202. package/dist/validation/gate.js.map +1 -0
  203. package/dist/validation/moveCommands.d.ts +31 -0
  204. package/dist/validation/moveCommands.d.ts.map +1 -0
  205. package/dist/validation/moveCommands.js +123 -0
  206. package/dist/validation/moveCommands.js.map +1 -0
  207. package/dist/validation/pluginCommands.d.ts +83 -0
  208. package/dist/validation/pluginCommands.d.ts.map +1 -0
  209. package/dist/validation/pluginCommands.js +134 -0
  210. package/dist/validation/pluginCommands.js.map +1 -0
  211. package/dist/validation/pluginManifest.d.ts +67 -0
  212. package/dist/validation/pluginManifest.d.ts.map +1 -0
  213. package/dist/validation/pluginManifest.js +199 -0
  214. package/dist/validation/pluginManifest.js.map +1 -0
  215. package/dist/validation/references.d.ts +57 -0
  216. package/dist/validation/references.d.ts.map +1 -0
  217. package/dist/validation/references.js +314 -0
  218. package/dist/validation/references.js.map +1 -0
  219. package/package.json +67 -0
@@ -0,0 +1,156 @@
1
+ /**
2
+ * Tools-layer bridge for tile transparency: loads a tileset sheet PNG (cached by
3
+ * path + mtime, failing soft when the image is missing/unreadable) and answers
4
+ * "does this raw tile id need an opaque base beneath it?" — plus a base-aware
5
+ * paint warning that fires when a transparent tile lands with the map's void
6
+ * showing through.
7
+ *
8
+ * The pixel work is pure (`../tiles/transparency`, `../tiles/png`); this module
9
+ * only does the I/O, the raw-id → (sheet, role, local index) resolution, and the
10
+ * per-map layer scan.
11
+ */
12
+ import { readFile, stat } from 'node:fs/promises';
13
+ import { join } from 'node:path';
14
+ import { decodePng } from '../tiles/png.js';
15
+ import { tileTransparentFraction, needsBase } from '../tiles/transparency.js';
16
+ import { BASE_KIND } from '../tiles/tilegeom.js';
17
+ import { decodeTile } from '../tiles/tileCodec.js';
18
+ import { tileIndex } from './mapTools.js';
19
+ /** `tilesetNames` slot index for each sheet role. */
20
+ const SLOT_INDEX = {
21
+ A1: 0,
22
+ A2: 1,
23
+ A3: 2,
24
+ A4: 3,
25
+ A5: 4,
26
+ B: 5,
27
+ C: 6,
28
+ D: 7,
29
+ E: 8,
30
+ };
31
+ /** In-process cache of decoded sheets, keyed by file path. `img: null` = a load that failed. */
32
+ const sheetCache = new Map();
33
+ /**
34
+ * Decode a tileset sheet PNG from `img/tilesets/<name>.png`, cached by mtime.
35
+ * Returns `undefined` (never throws) when the sheet name is empty or the file is
36
+ * missing/undecodable — transparency is simply unknown for that sheet.
37
+ */
38
+ async function loadSheetImage(projectPath, sheetName) {
39
+ if (!sheetName)
40
+ return undefined;
41
+ const path = join(projectPath, 'img', 'tilesets', `${sheetName}.png`);
42
+ let mtimeMs;
43
+ try {
44
+ mtimeMs = (await stat(path)).mtimeMs;
45
+ }
46
+ catch {
47
+ return undefined;
48
+ }
49
+ const cached = sheetCache.get(path);
50
+ if (cached && cached.mtimeMs === mtimeMs)
51
+ return cached.img ?? undefined;
52
+ try {
53
+ const img = decodePng(await readFile(path));
54
+ sheetCache.set(path, { mtimeMs, img });
55
+ return img;
56
+ }
57
+ catch {
58
+ sheetCache.set(path, { mtimeMs, img: null });
59
+ return undefined;
60
+ }
61
+ }
62
+ /** Resolve a raw tile id to its sheet role + local index within that sheet, or null. */
63
+ function tileSlot(tileId) {
64
+ const d = decodeTile(tileId);
65
+ if (d.empty || !d.sheet)
66
+ return null;
67
+ if (d.autotile) {
68
+ const role = d.sheet;
69
+ return { role, localIndex: d.kind - BASE_KIND[role] };
70
+ }
71
+ return { role: d.sheet, localIndex: d.sheetIndex };
72
+ }
73
+ /**
74
+ * Whether a raw tile id is transparent enough to need an opaque base beneath it.
75
+ * `undefined` = unknown (empty tile, or the sheet PNG couldn't be read). A small
76
+ * `cache` map memoises results within one operation so a big fill doesn't
77
+ * reclassify the same id repeatedly.
78
+ */
79
+ export async function isTileTransparent(projectPath, tileset, tileId, cache) {
80
+ if (cache?.has(tileId))
81
+ return cache.get(tileId);
82
+ const result = await classify(projectPath, tileset, tileId);
83
+ cache?.set(tileId, result);
84
+ return result;
85
+ }
86
+ async function classify(projectPath, tileset, tileId) {
87
+ return (await tileTransparencyDetail(projectPath, tileset, tileId))?.transparent;
88
+ }
89
+ /**
90
+ * The transparency reading for one tile: whether it needs a base and the percent
91
+ * of its sample that is transparent (for `describe_tile`). `undefined` when the
92
+ * tile is empty or the sheet PNG can't be read.
93
+ */
94
+ export async function tileTransparencyDetail(projectPath, tileset, tileId) {
95
+ const slot = tileSlot(tileId);
96
+ if (!slot)
97
+ return undefined;
98
+ const img = await loadSheetImage(projectPath, tileset.tilesetNames[SLOT_INDEX[slot.role]]);
99
+ if (!img)
100
+ return undefined;
101
+ const fraction = tileTransparentFraction(img, slot.role, slot.localIndex);
102
+ return { transparent: needsBase(fraction), transparentPercent: Math.round(fraction * 100) };
103
+ }
104
+ /**
105
+ * Set each catalog entry's `transparent` flag by inspecting its tileset sheet
106
+ * (in place). Entries whose sheet PNG can't be read are left unset (unknown).
107
+ * Only worth calling on a bounded entry list (one sheet, or `find_tile` matches).
108
+ */
109
+ export async function annotateTransparency(projectPath, tileset, entries) {
110
+ const cache = new Map();
111
+ for (const entry of entries) {
112
+ const transparent = await isTileTransparent(projectPath, tileset, entry.tileId, cache);
113
+ if (transparent !== undefined)
114
+ entry.transparent = transparent;
115
+ }
116
+ }
117
+ /**
118
+ * Scan painted cells for the transparent-tile-without-a-base footgun: a
119
+ * transparent tile on layer L with no *opaque* tile on any lower layer in the
120
+ * same cell will show the map's void through its see-through areas. Returns a
121
+ * single aggregated warning (or `undefined`) so a large fill doesn't spam one
122
+ * line per cell. Fails soft — cells whose transparency can't be read are ignored.
123
+ */
124
+ export async function baseAwareTransparencyWarning(projectPath, map, tileset, cells) {
125
+ const cache = new Map();
126
+ const offenders = [];
127
+ for (const cell of cells) {
128
+ if (cell.tileId === 0)
129
+ continue;
130
+ const transparent = await isTileTransparent(projectPath, tileset, cell.tileId, cache);
131
+ if (transparent !== true)
132
+ continue; // opaque or unknown — no footgun
133
+ let hasBase = false;
134
+ for (let z = 0; z < cell.layer; z++) {
135
+ const below = map.data[tileIndex(map.width, map.height, cell.x, cell.y, z)];
136
+ if (below === 0)
137
+ continue;
138
+ if ((await isTileTransparent(projectPath, tileset, below, cache)) === false) {
139
+ hasBase = true; // an opaque tile beneath covers the void
140
+ break;
141
+ }
142
+ }
143
+ if (!hasBase)
144
+ offenders.push({ x: cell.x, y: cell.y, layer: cell.layer });
145
+ }
146
+ if (offenders.length === 0)
147
+ return undefined;
148
+ const first = offenders[0];
149
+ const where = offenders.length === 1
150
+ ? `(${first.x}, ${first.y})`
151
+ : `${offenders.length} cells (e.g. (${first.x}, ${first.y}))`;
152
+ return (`${where} paint a transparent tile on layer ${first.layer} with no opaque base beneath — ` +
153
+ `its see-through areas will show the map's void. Paint an opaque ground tile on a lower layer ` +
154
+ `first (layer 0), or place this on an upper tile layer over existing ground.`);
155
+ }
156
+ //# sourceMappingURL=tileTransparency.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tileTransparency.js","sourceRoot":"","sources":["../../src/tools/tileTransparency.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,SAAS,EAAgB,MAAM,iBAAiB,CAAC;AAC1D,OAAO,EAAY,uBAAuB,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AACxF,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAI1C,qDAAqD;AACrD,MAAM,UAAU,GAA6B;IAC3C,EAAE,EAAE,CAAC;IACL,EAAE,EAAE,CAAC;IACL,EAAE,EAAE,CAAC;IACL,EAAE,EAAE,CAAC;IACL,EAAE,EAAE,CAAC;IACL,CAAC,EAAE,CAAC;IACJ,CAAC,EAAE,CAAC;IACJ,CAAC,EAAE,CAAC;IACJ,CAAC,EAAE,CAAC;CACL,CAAC;AAEF,gGAAgG;AAChG,MAAM,UAAU,GAAG,IAAI,GAAG,EAAyD,CAAC;AAEpF;;;;GAIG;AACH,KAAK,UAAU,cAAc,CAC3B,WAAmB,EACnB,SAAiB;IAEjB,IAAI,CAAC,SAAS;QAAE,OAAO,SAAS,CAAC;IACjC,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,EAAE,KAAK,EAAE,UAAU,EAAE,GAAG,SAAS,MAAM,CAAC,CAAC;IACtE,IAAI,OAAe,CAAC;IACpB,IAAI,CAAC;QACH,OAAO,GAAG,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC;IACvC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,MAAM,MAAM,GAAG,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACpC,IAAI,MAAM,IAAI,MAAM,CAAC,OAAO,KAAK,OAAO;QAAE,OAAO,MAAM,CAAC,GAAG,IAAI,SAAS,CAAC;IACzE,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,SAAS,CAAC,MAAM,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;QAC5C,UAAU,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC;QACvC,OAAO,GAAG,CAAC;IACb,CAAC;IAAC,MAAM,CAAC;QACP,UAAU,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC;QAC7C,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,wFAAwF;AACxF,SAAS,QAAQ,CAAC,MAAc;IAC9B,MAAM,CAAC,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC;IAC7B,IAAI,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IACrC,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC;QACf,MAAM,IAAI,GAAG,CAAC,CAAC,KAAkC,CAAC;QAClD,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC,IAAK,GAAG,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC;IACzD,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,EAAE,UAAU,EAAE,CAAC,CAAC,UAAU,EAAE,CAAC;AACrD,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,WAAmB,EACnB,OAAgB,EAChB,MAAc,EACd,KAAwC;IAExC,IAAI,KAAK,EAAE,GAAG,CAAC,MAAM,CAAC;QAAE,OAAO,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACjD,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,WAAW,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;IAC5D,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC3B,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,KAAK,UAAU,QAAQ,CACrB,WAAmB,EACnB,OAAgB,EAChB,MAAc;IAEd,OAAO,CAAC,MAAM,sBAAsB,CAAC,WAAW,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC,EAAE,WAAW,CAAC;AACnF,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,WAAmB,EACnB,OAAgB,EAChB,MAAc;IAEd,MAAM,IAAI,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC9B,IAAI,CAAC,IAAI;QAAE,OAAO,SAAS,CAAC;IAC5B,MAAM,GAAG,GAAG,MAAM,cAAc,CAAC,WAAW,EAAE,OAAO,CAAC,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC3F,IAAI,CAAC,GAAG;QAAE,OAAO,SAAS,CAAC;IAC3B,MAAM,QAAQ,GAAG,uBAAuB,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;IAC1E,OAAO,EAAE,WAAW,EAAE,SAAS,CAAC,QAAQ,CAAC,EAAE,kBAAkB,EAAE,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,GAAG,CAAC,EAAE,CAAC;AAC9F,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,WAAmB,EACnB,OAAgB,EAChB,OAAuB;IAEvB,MAAM,KAAK,GAAG,IAAI,GAAG,EAA+B,CAAC;IACrD,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,MAAM,WAAW,GAAG,MAAM,iBAAiB,CAAC,WAAW,EAAE,OAAO,EAAE,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QACvF,IAAI,WAAW,KAAK,SAAS;YAAE,KAAK,CAAC,WAAW,GAAG,WAAW,CAAC;IACjE,CAAC;AACH,CAAC;AAUD;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,4BAA4B,CAChD,WAAmB,EACnB,GAAY,EACZ,OAAgB,EAChB,KAAoB;IAEpB,MAAM,KAAK,GAAG,IAAI,GAAG,EAA+B,CAAC;IACrD,MAAM,SAAS,GAA8C,EAAE,CAAC;IAEhE,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;YAAE,SAAS;QAChC,MAAM,WAAW,GAAG,MAAM,iBAAiB,CAAC,WAAW,EAAE,OAAO,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QACtF,IAAI,WAAW,KAAK,IAAI;YAAE,SAAS,CAAC,iCAAiC;QAErE,IAAI,OAAO,GAAG,KAAK,CAAC;QACpB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;YACpC,MAAM,KAAK,GAAG,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YAC5E,IAAI,KAAK,KAAK,CAAC;gBAAE,SAAS;YAC1B,IAAI,CAAC,MAAM,iBAAiB,CAAC,WAAW,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,KAAK,KAAK,EAAE,CAAC;gBAC5E,OAAO,GAAG,IAAI,CAAC,CAAC,yCAAyC;gBACzD,MAAM;YACR,CAAC;QACH,CAAC;QACD,IAAI,CAAC,OAAO;YAAE,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;IAC5E,CAAC;IAED,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IAC7C,MAAM,KAAK,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;IAC3B,MAAM,KAAK,GACT,SAAS,CAAC,MAAM,KAAK,CAAC;QACpB,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,GAAG;QAC5B,CAAC,CAAC,GAAG,SAAS,CAAC,MAAM,iBAAiB,KAAK,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,IAAI,CAAC;IAClE,OAAO,CACL,GAAG,KAAK,sCAAsC,KAAK,CAAC,KAAK,iCAAiC;QAC1F,+FAA+F;QAC/F,6EAA6E,CAC9E,CAAC;AACJ,CAAC"}
@@ -0,0 +1,23 @@
1
+ import { ToolDefinition } from '../registry.js';
2
+ import { Tileset } from '../utils/types.js';
3
+ /**
4
+ * List every tileset with its id, name, mode, and the image sheets it uses
5
+ * (`tilesetNames`, labelled by slot; empty slots omitted). The paint / catalog /
6
+ * flag tools all need a `tilesetId`, and `list_names('tilesets')` gives id→name,
7
+ * but this also exposes which sheets a tileset is built from — so a caller can
8
+ * pick the right tileset and know which `find_tile`/`get_tile_catalog` sheets
9
+ * apply. Read-only.
10
+ */
11
+ export declare function getTilesets(projectPath: string): Promise<{
12
+ count: number;
13
+ tilesets: Array<{
14
+ id: number;
15
+ name: string;
16
+ mode: number;
17
+ sheets: Record<string, string>;
18
+ }>;
19
+ }>;
20
+ /** Load one tileset from the project's data/Tilesets.json (1-indexed, slot 0 null). */
21
+ export declare function getTileset(projectPath: string, tilesetId: number): Promise<Tileset>;
22
+ export declare const tilesetToolDefinitions: ToolDefinition[];
23
+ //# sourceMappingURL=tilesetTools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tilesetTools.d.ts","sourceRoot":"","sources":["../../src/tools/tilesetTools.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAGhD,OAAO,EAAW,OAAO,EAAE,MAAM,mBAAmB,CAAC;AA+BrD;;;;;;;GAOG;AACH,wBAAsB,WAAW,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC;IAC9D,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;KAAE,CAAC,CAAC;CAC7F,CAAC,CAeD;AAED,uFAAuF;AACvF,wBAAsB,UAAU,CAAC,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CASzF;AAuCD,eAAO,MAAM,sBAAsB,EAAE,cAAc,EAoIlD,CAAC"}
@@ -0,0 +1,209 @@
1
+ import { z } from 'zod';
2
+ import { getDataPath, readJsonFile } from '../utils/fileHandler.js';
3
+ import { commitChange } from '../utils/commit.js';
4
+ import { getMap, tileIndex } from './mapTools.js';
5
+ import { decodeFlags, encodeFlags, layeredPassability, layeredTerrainTag, } from '../tiles/tileFlags.js';
6
+ import { AUTOTILE_SLOTS_PER_KIND, decodeTile, getAutotileKind, isAutotile, makeAutotileId, } from '../tiles/tileCodec.js';
7
+ /**
8
+ * Tools over a tileset's `flags[]` array (read side + passability
9
+ * editing) — the bit-packed per-tile-id metadata the editor sets and the engine
10
+ * reads for movement. `get_tile_flags` decodes one tile's flag word;
11
+ * `check_passability` reproduces the engine's *layered* passage logic for a real
12
+ * map cell (the stacked tiles decide, upper layer first); `set_tile_flags`
13
+ * writes the passability/terrain/behaviour flags back. Independent of the paint
14
+ * pipeline.
15
+ */
16
+ /** Slot labels for `Tileset.tilesetNames[9]` — the 9 image sheets in fixed order. */
17
+ const SHEET_SLOTS = ['A1', 'A2', 'A3', 'A4', 'A5', 'B', 'C', 'D', 'E'];
18
+ /**
19
+ * List every tileset with its id, name, mode, and the image sheets it uses
20
+ * (`tilesetNames`, labelled by slot; empty slots omitted). The paint / catalog /
21
+ * flag tools all need a `tilesetId`, and `list_names('tilesets')` gives id→name,
22
+ * but this also exposes which sheets a tileset is built from — so a caller can
23
+ * pick the right tileset and know which `find_tile`/`get_tile_catalog` sheets
24
+ * apply. Read-only.
25
+ */
26
+ export async function getTilesets(projectPath) {
27
+ const tilesets = await readJsonFile(getDataPath(projectPath, 'Tilesets.json'));
28
+ const entries = tilesets
29
+ .filter((t) => t != null)
30
+ .map((t) => {
31
+ const sheets = {};
32
+ SHEET_SLOTS.forEach((label, i) => {
33
+ const name = t.tilesetNames[i];
34
+ if (name)
35
+ sheets[label] = name;
36
+ });
37
+ return { id: t.id, name: t.name, mode: t.mode, sheets };
38
+ });
39
+ return { count: entries.length, tilesets: entries };
40
+ }
41
+ /** Load one tileset from the project's data/Tilesets.json (1-indexed, slot 0 null). */
42
+ export async function getTileset(projectPath, tilesetId) {
43
+ const tilesets = await readJsonFile(getDataPath(projectPath, 'Tilesets.json'));
44
+ const tileset = tilesets[tilesetId];
45
+ if (!tileset) {
46
+ throw new Error(`Tileset ${tilesetId} not found`);
47
+ }
48
+ return tileset;
49
+ }
50
+ /** Collect the caller's supplied flag fields into a FlagUpdate (omitting untouched ones). */
51
+ function flagUpdateFromArgs(args) {
52
+ const update = {};
53
+ if (args.passage !== undefined)
54
+ update.passage = args.passage;
55
+ if (args.star !== undefined)
56
+ update.star = args.star;
57
+ if (args.ladder !== undefined)
58
+ update.ladder = args.ladder;
59
+ if (args.bush !== undefined)
60
+ update.bush = args.bush;
61
+ if (args.counter !== undefined)
62
+ update.counter = args.counter;
63
+ if (args.damage !== undefined)
64
+ update.damage = args.damage;
65
+ if (args.terrainTag !== undefined)
66
+ update.terrainTag = args.terrainTag;
67
+ return update;
68
+ }
69
+ /**
70
+ * The tile ids a `set_tile_flags` write should touch. For a flat tile it's just
71
+ * the tile itself; for an autotile it's every shape slot of the kind (so painting
72
+ * any border shape keeps the same passability) unless the caller opts out.
73
+ */
74
+ function flagTargetIds(tileId, applyToKind) {
75
+ if (applyToKind && isAutotile(tileId)) {
76
+ const kind = getAutotileKind(tileId);
77
+ return Array.from({ length: AUTOTILE_SLOTS_PER_KIND }, (_, shape) => makeAutotileId(kind, shape));
78
+ }
79
+ return [tileId];
80
+ }
81
+ /** The four stacked tile ids at a cell, upper layer first (z 3,2,1,0) — the engine's `layeredTiles` order. */
82
+ function layeredTileIds(map, x, y) {
83
+ const ids = [];
84
+ for (let z = 3; z >= 0; z--) {
85
+ ids.push(map.data[tileIndex(map.width, map.height, x, y, z)] || 0);
86
+ }
87
+ return ids;
88
+ }
89
+ export const tilesetToolDefinitions = [
90
+ {
91
+ name: 'get_tilesets',
92
+ description: 'List every tileset in the project with its id, name, mode (0 world / 1 area), and the image sheets it uses (labelled A1–A4, A5, B–E; empty slots omitted). Use this to discover valid tilesetId values (needed by find_tile, get_tile_catalog, paint_tiles, fill_area, place_object, get_tile_flags, set_tile_flags, check_passability) and to see which sheets each tileset is built from. For a plain id→name list, list_names(type:"tilesets") is even cheaper. Read-only.',
93
+ inputSchema: {},
94
+ handler: (ctx) => getTilesets(ctx.projectPath),
95
+ },
96
+ {
97
+ name: 'get_tile_flags',
98
+ description: "Decode a tileset's flag word for a single tile id into a legible view: 4-direction passability (down/left/right/up — true = walkable that way), the [*] 'star' overlay bit, ladder/bush/counter/damage-floor flags, and terrain tag (0–7). Read-only inspection of data/Tilesets.json flags[]. Note passability here is for the tile in isolation; a real cell's passability layers its stacked tiles — use check_passability for that. Returns { tilesetId, tileId, tile, flags }.",
99
+ inputSchema: {
100
+ tilesetId: z.number().int().positive().describe('Tileset id (from Tilesets.json / the map)'),
101
+ tileId: z.number().int().nonnegative().describe('The raw tile id whose flags to decode'),
102
+ },
103
+ handler: async (ctx, args) => {
104
+ const tileset = await getTileset(ctx.projectPath, args.tilesetId);
105
+ const flag = tileset.flags[args.tileId] ?? 0;
106
+ return {
107
+ tilesetId: args.tilesetId,
108
+ tilesetName: tileset.name,
109
+ tileId: args.tileId,
110
+ tile: decodeTile(args.tileId),
111
+ flags: decodeFlags(flag),
112
+ };
113
+ },
114
+ },
115
+ {
116
+ name: 'check_passability',
117
+ description: "Check whether a map cell can be walked onto, reproducing the engine's layered passage rule: the stacked tiles at (x, y) are examined upper-layer first, and the first non-[*] tile decides each direction. Reads the map's tileset flags. Returns per-direction passability (down/left/right/up — true = a character can walk off the cell that way), the cell's terrain tag, the stacked tile ids, and — when `direction` is given — a single `passable` boolean for that direction. Read-only.",
118
+ inputSchema: {
119
+ mapId: z.number().int().positive().describe('The map id to inspect'),
120
+ x: z.number().int().nonnegative().describe('Tile x coordinate'),
121
+ y: z.number().int().nonnegative().describe('Tile y coordinate'),
122
+ direction: z
123
+ .enum(['down', 'left', 'right', 'up'])
124
+ .optional()
125
+ .describe('Optional: also report a single passable boolean for this direction'),
126
+ },
127
+ handler: async (ctx, args) => {
128
+ const map = await getMap(ctx.projectPath, args.mapId);
129
+ if (args.x < 0 || args.x >= map.width || args.y < 0 || args.y >= map.height) {
130
+ throw new Error(`Position (${args.x}, ${args.y}) is out of map bounds (${map.width}x${map.height})`);
131
+ }
132
+ const tileset = await getTileset(ctx.projectPath, map.tilesetId);
133
+ const stack = layeredTileIds(map, args.x, args.y);
134
+ const stackFlags = stack.map((id) => tileset.flags[id] ?? 0);
135
+ const passable = layeredPassability(stackFlags);
136
+ return {
137
+ mapId: args.mapId,
138
+ x: args.x,
139
+ y: args.y,
140
+ tilesetId: map.tilesetId,
141
+ stack,
142
+ passable,
143
+ terrainTag: layeredTerrainTag(stackFlags),
144
+ ...(args.direction
145
+ ? {
146
+ direction: args.direction,
147
+ passableInDirection: passable[args.direction],
148
+ }
149
+ : {}),
150
+ };
151
+ },
152
+ },
153
+ {
154
+ name: 'set_tile_flags',
155
+ mutates: true,
156
+ description: "Edit a tile's passability/terrain/behaviour flags in a tileset's flags[] array (the write side of get_tile_flags). Only the fields you pass change — everything else on the tile is preserved (a non-destructive merge onto the current flag word). `passage` is walkability (down/left/right/up, true = a character can walk off that way). Also settable: star ([*] overlay), ladder, bush, counter, damage (damage floor), and terrainTag (0–7). For an autotile id (A1–A4) the change is applied to all 48 shape slots of its kind by default (set applyToAutotileKind:false to touch only the exact id) so painting any border shape keeps the same passability. Writes data/Tilesets.json through the commit choke point (dry-run/diff). Returns { tilesetId, tileId, appliedTileCount, before, after }.",
157
+ inputSchema: {
158
+ tilesetId: z.number().int().positive().describe('Tileset id (from Tilesets.json / the map)'),
159
+ tileId: z.number().int().nonnegative().describe('The raw tile id whose flags to edit'),
160
+ passage: z
161
+ .object({
162
+ down: z.boolean().optional(),
163
+ left: z.boolean().optional(),
164
+ right: z.boolean().optional(),
165
+ up: z.boolean().optional(),
166
+ })
167
+ .optional()
168
+ .describe('Walkability per direction (true = walkable). Only the given directions change.'),
169
+ star: z.boolean().optional().describe('[*] overlay: tile drawn above the character.'),
170
+ ladder: z.boolean().optional(),
171
+ bush: z.boolean().optional(),
172
+ counter: z.boolean().optional(),
173
+ damage: z.boolean().optional().describe('Damage floor (standing on it hurts).'),
174
+ terrainTag: z.number().int().min(0).max(7).optional().describe('Terrain tag 0–7 (0 = none).'),
175
+ applyToAutotileKind: z
176
+ .boolean()
177
+ .optional()
178
+ .describe('When the tile is an autotile (A1–A4), apply the change to all 48 shape slots of its kind (default true). Ignored for flat tiles.'),
179
+ },
180
+ handler: async (ctx, args) => {
181
+ const update = flagUpdateFromArgs(args);
182
+ if (Object.keys(update).length === 0) {
183
+ throw new Error('No flag fields to update — pass at least one of passage/star/ladder/bush/counter/damage/terrainTag');
184
+ }
185
+ const path = getDataPath(ctx.projectPath, 'Tilesets.json');
186
+ const tilesets = await readJsonFile(path);
187
+ const tileset = tilesets[args.tilesetId];
188
+ if (!tileset) {
189
+ throw new Error(`Tileset ${args.tilesetId} not found`);
190
+ }
191
+ const targetIds = flagTargetIds(args.tileId, args.applyToAutotileKind ?? true);
192
+ const before = decodeFlags(tileset.flags[args.tileId] ?? 0);
193
+ for (const id of targetIds) {
194
+ tileset.flags[id] = encodeFlags(tileset.flags[id] ?? 0, update);
195
+ }
196
+ const after = decodeFlags(tileset.flags[args.tileId] ?? 0);
197
+ await commitChange(path, tilesets);
198
+ return {
199
+ tilesetId: args.tilesetId,
200
+ tilesetName: tileset.name,
201
+ tileId: args.tileId,
202
+ appliedTileCount: targetIds.length,
203
+ before,
204
+ after,
205
+ };
206
+ },
207
+ },
208
+ ];
209
+ //# sourceMappingURL=tilesetTools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tilesetTools.js","sourceRoot":"","sources":["../../src/tools/tilesetTools.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,50 @@
1
+ import { ToolDefinition } from '../registry.js';
2
+ import { ValidationWarning } from '../validation/eventCommands.js';
3
+ import { ReferenceWarning } from '../validation/references.js';
4
+ import { AssetWarning } from '../validation/assets.js';
5
+ /**
6
+ * Validate a single event's command lists against the known-command table.
7
+ * Warn-by-default: this reports problems, it never modifies anything.
8
+ */
9
+ export declare function validateEventTool(projectPath: string, mapId: number, eventId: number): Promise<{
10
+ mapId: number;
11
+ eventId: number;
12
+ ok: boolean;
13
+ warnings: ValidationWarning[];
14
+ }>;
15
+ /**
16
+ * Validate the event command lists of every map in the project. Aggregates each
17
+ * map's warnings, tagging them with the map ID so callers can locate them.
18
+ */
19
+ export declare function validateProjectTool(projectPath: string): Promise<{
20
+ ok: boolean;
21
+ mapsChecked: number;
22
+ warnings: Array<ValidationWarning & {
23
+ mapId: number;
24
+ }>;
25
+ }>;
26
+ /**
27
+ * Cross-file reference-integrity audit for the whole project. Read-only and
28
+ * warn-by-default: reports dangling/cyclic references (a Transfer Player to a
29
+ * missing map, a skill effect adding a non-existent state, a troop member for a
30
+ * deleted enemy, a cyclic map tree, …) without changing anything. Complements
31
+ * `validate_project`, which only checks event-command *shape*.
32
+ */
33
+ export declare function validateReferencesTool(projectPath: string): Promise<{
34
+ ok: boolean;
35
+ warnings: ReferenceWarning[];
36
+ }>;
37
+ /**
38
+ * Project-wide asset-*filename* audit (read-only, warn-by-default). Scans every
39
+ * asset-name field across the database, maps, and system against the files that
40
+ * actually exist on disk, reporting each dangling reference — the systematic
41
+ * complement to the per-record create-time warnings (a `battlerName` typo would
42
+ * otherwise only surface as a runtime "Failed to load …" error). The *id*-
43
+ * integrity sibling is `validate_references`.
44
+ */
45
+ export declare function validateAssetsTool(projectPath: string): Promise<{
46
+ ok: boolean;
47
+ warnings: AssetWarning[];
48
+ }>;
49
+ export declare const validationToolDefinitions: ToolDefinition[];
50
+ //# sourceMappingURL=validationTools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validationTools.d.ts","sourceRoot":"","sources":["../../src/tools/validationTools.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAEhD,OAAO,EAAiC,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AAElG,OAAO,EAAgC,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAC7F,OAAO,EAIL,YAAY,EACb,MAAM,yBAAyB,CAAC;AAajC;;;GAGG;AACH,wBAAsB,iBAAiB,CACrC,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,GACd,OAAO,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,OAAO,CAAC;IAAC,QAAQ,EAAE,iBAAiB,EAAE,CAAA;CAAE,CAAC,CAOzF;AAED;;;GAGG;AACH,wBAAsB,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC;IACtE,EAAE,EAAE,OAAO,CAAC;IACZ,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,KAAK,CAAC,iBAAiB,GAAG;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACxD,CAAC,CAuBD;AAgED;;;;;;GAMG;AACH,wBAAsB,sBAAsB,CAC1C,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC;IAAE,EAAE,EAAE,OAAO,CAAC;IAAC,QAAQ,EAAE,gBAAgB,EAAE,CAAA;CAAE,CAAC,CAIxD;AAwED;;;;;;;GAOG;AACH,wBAAsB,kBAAkB,CACtC,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC;IAAE,EAAE,EAAE,OAAO,CAAC;IAAC,QAAQ,EAAE,YAAY,EAAE,CAAA;CAAE,CAAC,CAOpD;AAED,eAAO,MAAM,yBAAyB,EAAE,cAAc,EAgCrD,CAAC"}