hoi4-agent-tools 2.8.8 → 2.8.9

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/CHANGELOG.md CHANGED
@@ -4,6 +4,11 @@
4
4
 
5
5
  No unreleased changes.
6
6
 
7
+ ## 2.8.9 - 2026-08-29
8
+
9
+ - Decode BMFont channel roles so installed HOI4 atlases render their face and outline masks separately instead of losing localisation colours.
10
+ - Infer black-on-white and white-on-transparent glyph-mask polarity, preserving support for both vanilla fonts and custom mod fonts.
11
+
7
12
  ## 2.8.8 - 2026-08-29
8
13
 
9
14
  - Correct GUI font selection so mod definitions override lower-load-order game definitions, language-specific overrides only apply to their language, and extensionless WOFF assets resolve.
@@ -43,6 +43,7 @@ export function parseBmFont(text) {
43
43
  let size = 16;
44
44
  let lineHeight = 16;
45
45
  let base;
46
+ let channelRoles;
46
47
  const pages = new Map();
47
48
  const characters = new Map();
48
49
  const kerning = new Map();
@@ -66,6 +67,9 @@ export function parseBmFont(text) {
66
67
  const fields = parseFields(line);
67
68
  lineHeight = typeof fields.lineHeight === 'number' ? fields.lineHeight : lineHeight;
68
69
  base = typeof fields.base === 'number' ? fields.base : base;
70
+ const roles = [fields.redChnl, fields.greenChnl, fields.blueChnl, fields.alphaChnl];
71
+ if (roles.every((role) => typeof role === 'number'))
72
+ channelRoles = roles;
69
73
  recognised = true;
70
74
  }
71
75
  else if (line.startsWith('page ')) {
@@ -137,6 +141,7 @@ export function parseBmFont(text) {
137
141
  pages: [...pages.entries()].sort(([left], [right]) => left - right).map(([, page]) => page),
138
142
  characters,
139
143
  kerning,
144
+ ...(channelRoles === undefined ? {} : { channelRoles }),
140
145
  }
141
146
  : undefined;
142
147
  }
@@ -476,6 +481,7 @@ export class GuiAssetCatalog {
476
481
  kind: 'bitmap',
477
482
  key: `${entry.sourceFile.sha256}:${codePoint}:${Math.max(1, fontSize)}`,
478
483
  dataUri: raster.dataUri,
484
+ ...(raster.borderDataUri === undefined ? {} : { borderDataUri: raster.borderDataUri }),
479
485
  x: penX + metric.xOffset * scale,
480
486
  y: metric.yOffset * scale,
481
487
  width: raster.width * scale,
@@ -612,14 +618,63 @@ export class GuiAssetCatalog {
612
618
  .ensureAlpha()
613
619
  .raw()
614
620
  .toBuffer({ resolveWithObject: true });
615
- const png = await sharp(extracted.data, {
621
+ const channelRoles = entry.bmfont?.channelRoles;
622
+ let facePixels = extracted.data;
623
+ let borderPixels;
624
+ if (channelRoles?.some((role) => role === 0) === true) {
625
+ facePixels = Buffer.alloc(extracted.data.length);
626
+ borderPixels = channelRoles.some((role) => role === 1)
627
+ ? Buffer.alloc(extracted.data.length)
628
+ : undefined;
629
+ let backgroundSamples = 0;
630
+ let backgroundTotal = 0;
631
+ for (let offset = 0; offset < extracted.data.length; offset += 4) {
632
+ const borderCoverage = channelRoles.reduce((maximum, role, channel) => role === 1 ? Math.max(maximum, extracted.data[offset + channel] ?? 0) : maximum, 0);
633
+ if (borderCoverage !== 0)
634
+ continue;
635
+ for (let channel = 0; channel < 4; channel += 1) {
636
+ if (channelRoles[channel] !== 0)
637
+ continue;
638
+ backgroundTotal += extracted.data[offset + channel] ?? 0;
639
+ backgroundSamples += 1;
640
+ }
641
+ }
642
+ const invertedFace = backgroundSamples > 0 && backgroundTotal / backgroundSamples > 127;
643
+ for (let offset = 0; offset < extracted.data.length; offset += 4) {
644
+ let faceCoverage = 0;
645
+ let borderCoverage = 0;
646
+ for (let channel = 0; channel < 4; channel += 1) {
647
+ const sample = extracted.data[offset + channel] ?? 0;
648
+ if (channelRoles[channel] === 0)
649
+ faceCoverage = Math.max(faceCoverage, invertedFace ? 255 - sample : sample);
650
+ if (channelRoles[channel] === 1)
651
+ borderCoverage = Math.max(borderCoverage, sample);
652
+ }
653
+ facePixels[offset] = 255;
654
+ facePixels[offset + 1] = 255;
655
+ facePixels[offset + 2] = 255;
656
+ facePixels[offset + 3] = faceCoverage;
657
+ if (borderPixels !== undefined) {
658
+ borderPixels[offset] = 255;
659
+ borderPixels[offset + 1] = 255;
660
+ borderPixels[offset + 2] = 255;
661
+ borderPixels[offset + 3] = borderCoverage;
662
+ }
663
+ }
664
+ }
665
+ const encodeMask = (pixels) => sharp(pixels, {
616
666
  raw: { width: extracted.info.width, height: extracted.info.height, channels: 4 },
617
667
  limitInputPixels: RENDER_MAX_DECODED_PIXELS,
618
668
  })
619
669
  .png({ compressionLevel: 9, adaptiveFiltering: false, palette: false })
620
670
  .toBuffer();
671
+ const png = await encodeMask(facePixels);
672
+ const borderPng = borderPixels === undefined ? undefined : await encodeMask(borderPixels);
621
673
  return {
622
674
  dataUri: `data:image/png;base64,${png.toString('base64')}`,
675
+ ...(borderPng === undefined
676
+ ? {}
677
+ : { borderDataUri: `data:image/png;base64,${borderPng.toString('base64')}` }),
623
678
  width: metric.width,
624
679
  height: metric.height,
625
680
  };
@@ -33,8 +33,8 @@ function colourFor(value) {
33
33
  function outlineDefinitionId(key) {
34
34
  return `gui-font-outline-${sha256Bytes(key).slice(0, 20)}`;
35
35
  }
36
- function bitmapDefinitionId(key) {
37
- return `gui-font-bitmap-${sha256Bytes(key).slice(0, 20)}`;
36
+ function bitmapDefinitionId(key, layer = 'face') {
37
+ return `gui-font-bitmap-${layer === 'face' ? '' : 'border-'}${sha256Bytes(key).slice(0, 20)}`;
38
38
  }
39
39
  function sceneGlyphDefinitions(scene) {
40
40
  const outlines = new Map();
@@ -47,6 +47,7 @@ function sceneGlyphDefinitions(scene) {
47
47
  else
48
48
  bitmaps.set(glyph.key, {
49
49
  dataUri: glyph.dataUri,
50
+ ...(glyph.borderDataUri === undefined ? {} : { borderDataUri: glyph.borderDataUri }),
50
51
  width: glyph.width,
51
52
  height: glyph.height,
52
53
  });
@@ -59,7 +60,7 @@ function sceneGlyphDefinitions(scene) {
59
60
  .map(([key, glyphPath]) => `<path id="${outlineDefinitionId(key)}" d="${glyphPath}"/>`),
60
61
  ...[...bitmaps.entries()]
61
62
  .sort(([left], [right]) => compareCodeUnits(left, right))
62
- .map(([key, glyph]) => `<image id="${bitmapDefinitionId(key)}" width="${finite(glyph.width)}" height="${finite(glyph.height)}" href="${glyph.dataUri}" preserveAspectRatio="none"/>`),
63
+ .map(([key, glyph]) => `<image id="${bitmapDefinitionId(key)}" width="${finite(glyph.width)}" height="${finite(glyph.height)}" href="${glyph.dataUri}" preserveAspectRatio="none"/>${glyph.borderDataUri === undefined ? '' : `<image id="${bitmapDefinitionId(key, 'border')}" width="${finite(glyph.width)}" height="${finite(glyph.height)}" href="${glyph.borderDataUri}" preserveAspectRatio="none"/>`}`),
63
64
  ].join('');
64
65
  }
65
66
  function bitmapTintMarkup(id, colour, glyphs, rect) {
@@ -76,7 +77,7 @@ function bitmapTintMarkup(id, colour, glyphs, rect) {
76
77
  const matrix = `${red} 0 0 0 0 0 ${green} 0 0 0 0 0 ${blue} 0 0 0 0 0 ${opacity} 0`;
77
78
  return `<defs><filter id="${id}" filterUnits="userSpaceOnUse" ${rectAttributes(rect)} color-interpolation-filters="sRGB"><feColorMatrix type="matrix" values="${matrix}"/></filter></defs><g filter="url(#${id})">${glyphs}</g>`;
78
79
  }
79
- function actualGlyphMarkup(glyphLine, originX, baseline, horizontalScale) {
80
+ function actualGlyphMarkup(glyphLine, originX, baseline, horizontalScale, bitmapLayer = 'face') {
80
81
  if (glyphLine.source === 'fontkit-path')
81
82
  return glyphLine.glyphs
82
83
  .filter((glyph) => glyph.kind === 'outline')
@@ -85,7 +86,8 @@ function actualGlyphMarkup(glyphLine, originX, baseline, horizontalScale) {
85
86
  if (glyphLine.source === 'bmfont-atlas')
86
87
  return glyphLine.glyphs
87
88
  .filter((glyph) => glyph.kind === 'bitmap')
88
- .map((glyph) => `<use href="#${bitmapDefinitionId(glyph.key)}" transform="translate(${finite(originX + glyph.x * horizontalScale)} ${finite(baseline + glyph.y - glyphLine.baseline)}) scale(${finite(horizontalScale)} 1)"/>`)
89
+ .filter((glyph) => bitmapLayer === 'face' || glyph.borderDataUri !== undefined)
90
+ .map((glyph) => `<use href="#${bitmapDefinitionId(glyph.key, bitmapLayer)}" transform="translate(${finite(originX + glyph.x * horizontalScale)} ${finite(baseline + glyph.y - glyphLine.baseline)}) scale(${finite(horizontalScale)} 1)"/>`)
89
91
  .join('');
90
92
  return '';
91
93
  }
@@ -140,14 +142,19 @@ function renderText(element, toolText) {
140
142
  definitions.push(`<clipPath id="${clipId}"><rect x="${finite(runX - 0.25)}" y="${finite(lineTop - text.lineHeight)}" width="${finite(run.width * horizontalScale + 0.5)}" height="${finite(text.lineHeight * 3)}"/></clipPath>`);
141
143
  const glyphs = actualGlyphMarkup(glyphLine, originX, baseline, horizontalScale);
142
144
  if (glyphLine.source === 'bmfont-atlas') {
143
- const maskId = `gui-font-mask-${sha256Bytes(key).slice(0, 20)}`;
145
+ const faceFilterId = `gui-font-face-${sha256Bytes(key).slice(0, 20)}`;
146
+ const borderFilterId = `gui-font-border-${sha256Bytes(key).slice(0, 20)}`;
144
147
  const runRect = {
145
148
  x: runX - 0.25,
146
149
  y: lineTop - text.lineHeight,
147
150
  width: run.width * horizontalScale + 0.5,
148
151
  height: text.lineHeight * 3,
149
152
  };
150
- return `<g clip-path="url(#${clipId})" data-font-colour="${run.colour}">${bitmapTintMarkup(maskId, run.colour, glyphs, runRect)}</g>`;
153
+ const borderGlyphs = actualGlyphMarkup(glyphLine, originX, baseline, horizontalScale, 'border');
154
+ const border = borderGlyphs.length === 0
155
+ ? ''
156
+ : bitmapTintMarkup(borderFilterId, text.borderColour ?? '#000000ff', borderGlyphs, runRect);
157
+ return `<g clip-path="url(#${clipId})" data-font-colour="${run.colour}">${border}${bitmapTintMarkup(faceFilterId, run.colour, glyphs, runRect)}</g>`;
151
158
  }
152
159
  return `<g clip-path="url(#${clipId})" fill="${run.colour}" stroke="${text.borderColour ?? '#12151a'}" data-font-colour="${run.colour}">${glyphs}</g>`;
153
160
  });
@@ -171,11 +178,17 @@ function renderText(element, toolText) {
171
178
  }
172
179
  if (glyphLine?.source === 'bmfont-atlas') {
173
180
  const glyphs = actualGlyphMarkup(glyphLine, originX, baseline, horizontalScale);
174
- if (text.colour === undefined)
181
+ const borderGlyphs = actualGlyphMarkup(glyphLine, originX, baseline, horizontalScale, 'border');
182
+ if (text.colour === undefined && borderGlyphs.length === 0)
175
183
  return `<g data-font-sha256="${glyphLine.sourceHash}">${glyphs}${inlineIconMarkup}</g>`;
176
- const maskId = `gui-font-mask-${sha256Bytes(`${element.id}:${index}:${text.colour}`).slice(0, 20)}`;
184
+ const colour = text.colour ?? '#ffffffff';
185
+ const faceFilterId = `gui-font-face-${sha256Bytes(`${element.id}:${index}:${colour}`).slice(0, 20)}`;
186
+ const borderFilterId = `gui-font-border-${sha256Bytes(`${element.id}:${index}:${text.borderColour ?? '#000000ff'}`).slice(0, 20)}`;
177
187
  const lineRect = { x: originX, y: lineTop, width, height: text.lineHeight };
178
- return `<g data-font-sha256="${glyphLine.sourceHash}" data-font-colour="${text.colour}">${bitmapTintMarkup(maskId, text.colour, glyphs, lineRect)}${inlineIconMarkup}</g>`;
188
+ const border = borderGlyphs.length === 0
189
+ ? ''
190
+ : bitmapTintMarkup(borderFilterId, text.borderColour ?? '#000000ff', borderGlyphs, lineRect);
191
+ return `<g data-font-sha256="${glyphLine.sourceHash}" data-font-colour="${colour}">${border}${bitmapTintMarkup(faceFilterId, colour, glyphs, lineRect)}${inlineIconMarkup}</g>`;
179
192
  }
180
193
  const visibleLine = line.replace(/[\uE000-\uF8FF]/gu, ' ');
181
194
  return `<g>${toolText.render(visibleLine, {
@@ -1,6 +1,6 @@
1
1
  import { LATEST_PROTOCOL_VERSION } from '@modelcontextprotocol/sdk/types.js';
2
2
  export const PACKAGE_NAME = 'hoi4-agent-tools';
3
- export const PACKAGE_VERSION = '2.8.8';
3
+ export const PACKAGE_VERSION = '2.8.9';
4
4
  export const MCP_PROTOCOL_VERSION = LATEST_PROTOCOL_VERSION;
5
5
  export const CONFIG_VERSION = 1;
6
6
  export const TRANSACTION_VERSION = 1;
package/docs/gui.md CHANGED
@@ -33,7 +33,7 @@ Inspection checks missing assets and localisation, invalid sizes, overlap, clipp
33
33
 
34
34
  The renderer resolves sprites and fonts through the complete mod, dependency, and installed-game load order. Mod windows therefore render ordinary vanilla sprites, tiled vanilla panels, progress bars, masked shields, button frames, and localisation icons such as `£command_power` without copying game assets into the mod. Case differences in GFX and font identifiers do not prevent a valid asset from resolving.
35
35
 
36
- Bitmap text uses the language-appropriate HOI4 font definition and its real glyph atlas. Header, serif, compact, typewriter, black, inverted, and other declared faces keep their own glyph shapes, native metrics, face colour, border colour, language override, and font-specific `textcolors` palette. HOI4 localisation colour runs such as `§Y` and `§R` multiply the selected palette colour into the native glyph pixels, preserving the atlas's sharp antialiasing and dark shadow pixels instead of flattening the glyph into a blurred monochrome mask or switching to the tool font. The default language uses the base font rather than an unrelated language override, and the renderer recognizes installed-game atlases whose filename omits a page suffix declared by the matching `.fnt` file.
36
+ Bitmap text uses the language-appropriate HOI4 font definition and its real glyph atlas. Header, serif, compact, typewriter, black, inverted, and other declared faces keep their own glyph shapes, native metrics, face colour, border colour, language override, and font-specific `textcolors` palette. The renderer reads BMFont channel roles, separates face and outline coverage, and recognizes both vanilla black-on-white masks and conventional white-on-transparent custom masks. HOI4 localisation colour runs such as `§Y` and `§R` therefore colour the glyph face while retaining its sharp antialiasing and declared border instead of flattening the glyph into a blurred monochrome mask or switching to the tool font. The default language uses the base font rather than an unrelated language override, and the renderer recognizes installed-game atlases whose filename omits a page suffix declared by the matching `.fnt` file.
37
37
 
38
38
  Layout follows Clausewitz orientation and element-origin anchors, including `CENTER_LEFT`, `CENTER_RIGHT`, `CENTER_UP`, `CENTER_DOWN`, `origo`, `centerposition`, inherited container coordinate origins, local scale, and both `%` and `%%` relative dimensions. Text boxes use native font metrics together with `maxWidth`, `maxHeight`, alignment, wrapping, and `fixedsize` clipping. Cornered tile sprites use fixed nine-slice borders and optional center tiling; progress bars composite their filled and background textures; masked shields composite their background and mask textures.
39
39
 
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "hoi4-agent-tools",
3
3
  "mcpName": "io.github.klimPaskov/hoi4-agent-tools",
4
- "version": "2.8.8",
4
+ "version": "2.8.9",
5
5
  "description": "Analyze HOI4 events, tech trees, AI weights, and MTTH; build focus trees, GUIs, and maps.",
6
6
  "type": "module",
7
7
  "license": "Apache-2.0",
@@ -1,5 +1,5 @@
1
1
  {
2
- "$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v2.8.8/schemas/configuration.schema.json",
2
+ "$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v2.8.9/schemas/configuration.schema.json",
3
3
  "$schema": "https://json-schema.org/draft/2020-12/schema",
4
4
  "type": "object",
5
5
  "properties": {
@@ -1,5 +1,5 @@
1
1
  {
2
- "$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v2.8.8/schemas/continuous-focus-palette.schema.json",
2
+ "$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v2.8.9/schemas/continuous-focus-palette.schema.json",
3
3
  "$schema": "https://json-schema.org/draft/2020-12/schema",
4
4
  "type": "object",
5
5
  "properties": {
@@ -1,5 +1,5 @@
1
1
  {
2
- "$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v2.8.8/schemas/custom-weighted-pool.schema.json",
2
+ "$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v2.8.9/schemas/custom-weighted-pool.schema.json",
3
3
  "$schema": "https://json-schema.org/draft/2020-12/schema",
4
4
  "type": "object",
5
5
  "properties": {
@@ -1,5 +1,5 @@
1
1
  {
2
- "$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v2.8.8/schemas/event-feature-manifest.schema.json",
2
+ "$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v2.8.9/schemas/event-feature-manifest.schema.json",
3
3
  "$schema": "https://json-schema.org/draft/2020-12/schema",
4
4
  "type": "object",
5
5
  "properties": {
@@ -1,5 +1,5 @@
1
1
  {
2
- "$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v2.8.8/schemas/focus-plan.schema.json",
2
+ "$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v2.8.9/schemas/focus-plan.schema.json",
3
3
  "$schema": "https://json-schema.org/draft/2020-12/schema",
4
4
  "type": "object",
5
5
  "properties": {
@@ -1,5 +1,5 @@
1
1
  {
2
- "$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v2.8.8/schemas/focus-planning-sidecar.schema.json",
2
+ "$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v2.8.9/schemas/focus-planning-sidecar.schema.json",
3
3
  "$schema": "https://json-schema.org/draft/2020-12/schema",
4
4
  "type": "object",
5
5
  "properties": {
@@ -1,5 +1,5 @@
1
1
  {
2
- "$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v2.8.8/schemas/gui-animation-source.schema.json",
2
+ "$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v2.8.9/schemas/gui-animation-source.schema.json",
3
3
  "$schema": "https://json-schema.org/draft/2020-12/schema",
4
4
  "type": "object",
5
5
  "properties": {
@@ -1,5 +1,5 @@
1
1
  {
2
- "$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v2.8.8/schemas/gui-helper.schema.json",
2
+ "$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v2.8.9/schemas/gui-helper.schema.json",
3
3
  "$schema": "https://json-schema.org/draft/2020-12/schema",
4
4
  "type": "object",
5
5
  "properties": {
@@ -1,5 +1,5 @@
1
1
  {
2
- "$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v2.8.8/schemas/gui-scenario.schema.json",
2
+ "$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v2.8.9/schemas/gui-scenario.schema.json",
3
3
  "$schema": "https://json-schema.org/draft/2020-12/schema",
4
4
  "type": "object",
5
5
  "properties": {
@@ -1,5 +1,5 @@
1
1
  {
2
- "$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v2.8.8/schemas/map-operation.schema.json",
2
+ "$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v2.8.9/schemas/map-operation.schema.json",
3
3
  "$schema": "https://json-schema.org/draft/2020-12/schema",
4
4
  "oneOf": [
5
5
  {
@@ -1,5 +1,5 @@
1
1
  {
2
- "$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v2.8.8/schemas/operation-result.schema.json",
2
+ "$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v2.8.9/schemas/operation-result.schema.json",
3
3
  "$schema": "https://json-schema.org/draft/2020-12/schema",
4
4
  "type": "object",
5
5
  "properties": {
@@ -1,5 +1,5 @@
1
1
  {
2
- "$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v2.8.8/schemas/probability-analysis-result.schema.json",
2
+ "$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v2.8.9/schemas/probability-analysis-result.schema.json",
3
3
  "$schema": "https://json-schema.org/draft/2020-12/schema",
4
4
  "type": "object",
5
5
  "properties": {
@@ -1,5 +1,5 @@
1
1
  {
2
- "$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v2.8.8/schemas/probability-compare-input.schema.json",
2
+ "$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v2.8.9/schemas/probability-compare-input.schema.json",
3
3
  "$schema": "https://json-schema.org/draft/2020-12/schema",
4
4
  "type": "object",
5
5
  "properties": {
@@ -1,5 +1,5 @@
1
1
  {
2
- "$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v2.8.8/schemas/probability-evaluate-input.schema.json",
2
+ "$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v2.8.9/schemas/probability-evaluate-input.schema.json",
3
3
  "$schema": "https://json-schema.org/draft/2020-12/schema",
4
4
  "type": "object",
5
5
  "properties": {
@@ -1,5 +1,5 @@
1
1
  {
2
- "$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v2.8.8/schemas/probability-inspect-input.schema.json",
2
+ "$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v2.8.9/schemas/probability-inspect-input.schema.json",
3
3
  "$schema": "https://json-schema.org/draft/2020-12/schema",
4
4
  "type": "object",
5
5
  "properties": {
@@ -1,5 +1,5 @@
1
1
  {
2
- "$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v2.8.8/schemas/probability-render-input.schema.json",
2
+ "$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v2.8.9/schemas/probability-render-input.schema.json",
3
3
  "$schema": "https://json-schema.org/draft/2020-12/schema",
4
4
  "type": "object",
5
5
  "properties": {
@@ -1,5 +1,5 @@
1
1
  {
2
- "$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v2.8.8/schemas/probability-scenario-set.schema.json",
2
+ "$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v2.8.9/schemas/probability-scenario-set.schema.json",
3
3
  "$schema": "https://json-schema.org/draft/2020-12/schema",
4
4
  "type": "object",
5
5
  "properties": {
@@ -1,5 +1,5 @@
1
1
  {
2
- "$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v2.8.8/schemas/probability-sequence-input.schema.json",
2
+ "$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v2.8.9/schemas/probability-sequence-input.schema.json",
3
3
  "$schema": "https://json-schema.org/draft/2020-12/schema",
4
4
  "type": "object",
5
5
  "properties": {
@@ -1,5 +1,5 @@
1
1
  {
2
- "$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v2.8.8/schemas/probability-simulate-input.schema.json",
2
+ "$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v2.8.9/schemas/probability-simulate-input.schema.json",
3
3
  "$schema": "https://json-schema.org/draft/2020-12/schema",
4
4
  "type": "object",
5
5
  "properties": {
@@ -1,5 +1,5 @@
1
1
  {
2
- "$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v2.8.8/schemas/probability-sweep-input.schema.json",
2
+ "$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v2.8.9/schemas/probability-sweep-input.schema.json",
3
3
  "$schema": "https://json-schema.org/draft/2020-12/schema",
4
4
  "type": "object",
5
5
  "properties": {
package/server.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "name": "io.github.klimPaskov/hoi4-agent-tools",
4
4
  "title": "HOI4 Agent Tools",
5
5
  "description": "Analyze HOI4 events, tech trees, AI weights, and MTTH; build focus trees, GUIs, and maps.",
6
- "version": "2.8.8",
6
+ "version": "2.8.9",
7
7
  "repository": {
8
8
  "url": "https://github.com/klimPaskov/hoi4-agent-tools",
9
9
  "source": "github"
@@ -13,7 +13,7 @@
13
13
  {
14
14
  "registryType": "npm",
15
15
  "identifier": "hoi4-agent-tools",
16
- "version": "2.8.8",
16
+ "version": "2.8.9",
17
17
  "transport": {
18
18
  "type": "stdio"
19
19
  }