hoi4-agent-tools 2.8.2 → 2.8.3

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 (29) hide show
  1. package/CHANGELOG.md +5 -0
  2. package/dist/hoi4_agent_tools/gui/layout.js +64 -8
  3. package/dist/hoi4_agent_tools/gui/scenario.js +1 -0
  4. package/dist/hoi4_agent_tools/gui/source-graph.js +11 -1
  5. package/dist/hoi4_agent_tools/gui/studio.js +1 -1
  6. package/dist/hoi4_agent_tools/version.js +1 -1
  7. package/docs/gui.md +8 -2
  8. package/package.json +1 -1
  9. package/schemas/configuration.schema.json +1 -1
  10. package/schemas/continuous-focus-palette.schema.json +1 -1
  11. package/schemas/custom-weighted-pool.schema.json +1 -1
  12. package/schemas/event-feature-manifest.schema.json +1 -1
  13. package/schemas/focus-plan.schema.json +1 -1
  14. package/schemas/focus-planning-sidecar.schema.json +1 -1
  15. package/schemas/gui-animation-source.schema.json +1 -1
  16. package/schemas/gui-helper.schema.json +1 -1
  17. package/schemas/gui-scenario.schema.json +29 -22
  18. package/schemas/map-operation.schema.json +1 -1
  19. package/schemas/operation-result.schema.json +1 -1
  20. package/schemas/probability-analysis-result.schema.json +1 -1
  21. package/schemas/probability-compare-input.schema.json +1 -1
  22. package/schemas/probability-evaluate-input.schema.json +1 -1
  23. package/schemas/probability-inspect-input.schema.json +1 -1
  24. package/schemas/probability-render-input.schema.json +1 -1
  25. package/schemas/probability-scenario-set.schema.json +1 -1
  26. package/schemas/probability-sequence-input.schema.json +1 -1
  27. package/schemas/probability-simulate-input.schema.json +1 -1
  28. package/schemas/probability-sweep-input.schema.json +1 -1
  29. package/server.json +2 -2
package/CHANGELOG.md CHANGED
@@ -4,6 +4,11 @@
4
4
 
5
5
  No unreleased changes.
6
6
 
7
+ ## 2.8.3 - 2026-08-27
8
+
9
+ - Centered native button labels when HOI4 GUI source uses `text =` instead of `buttonText =`, matching the in-game horizontal and vertical alignment inside button frames.
10
+ - Added one scenario `values` map for concrete runtime variables, dynamic text, meter fills, sprites, frames, positions, visibility, and enabled states so agents can render complete value-driven GUI versions without assembling several low-level override maps.
11
+
7
12
  ## 2.8.2 - 2026-08-27
8
13
 
9
14
  - Composed top-level scripted-GUI child windows through `parent_scripted_gui`, instantiated external dynamic-list entry containers, and applied row-scoped image, frame, position, visibility, and enabled values.
@@ -218,6 +218,8 @@ function resolveTokenText(value, scenario, localisation, rowValues) {
218
218
  const shortKey = key.slice(key.lastIndexOf('.') + 1);
219
219
  const replacement = rowValues?.[key] ??
220
220
  rowValues?.[shortKey] ??
221
+ scenario.values[key] ??
222
+ scenario.values[shortKey] ??
221
223
  scenario.variables[key] ??
222
224
  scenario.variables[shortKey] ??
223
225
  scenario.scriptedGui[key] ??
@@ -235,7 +237,10 @@ function resolveTokenText(value, scenario, localisation, rowValues) {
235
237
  if (key === 'X' || key === 'dynamic_loc')
236
238
  return match[0];
237
239
  const countryKey = key.replace(/^(?:ROOT|This)\./u, '');
238
- const replacement = rowValues?.[countryKey] ??
240
+ const replacement = rowValues?.[key] ??
241
+ rowValues?.[countryKey] ??
242
+ scenario.values[key] ??
243
+ scenario.values[countryKey] ??
239
244
  scenario.country?.[countryKey] ??
240
245
  scenario.stateValues?.[countryKey] ??
241
246
  scenario.scriptedGui[key];
@@ -247,6 +252,15 @@ function resolveTokenText(value, scenario, localisation, rowValues) {
247
252
  }, 'GUI scope substitution');
248
253
  return { text, unresolved: [...new Set(unresolved)].sort(), missingLocalisation };
249
254
  }
255
+ function scenarioExpressionValue(expression, values) {
256
+ if (typeof expression !== 'string')
257
+ return undefined;
258
+ const variableMatch = /^\[\?([^\]|]+)(?:\|[^\]]+)?\]$/u.exec(expression);
259
+ const localisationMatch = /^\[([^\]]+)\]$/u.exec(expression);
260
+ const token = variableMatch?.[1] ?? localisationMatch?.[1] ?? expression;
261
+ const shortToken = token.slice(token.lastIndexOf('.') + 1);
262
+ return values[token] ?? values[shortToken];
263
+ }
250
264
  function measureTextWithInlineIcons(catalog, fontName, text, fontSize, inlineIcons) {
251
265
  if (inlineIcons.size === 0 || ![...inlineIcons.keys()].some((marker) => text.includes(marker)))
252
266
  return catalog.measureText(fontName, text, fontSize);
@@ -465,7 +479,9 @@ function frameFor(element, sprite, scenario, rowValues) {
465
479
  const selected = scenario.selectedFrames[element.name] ?? scenario.selectedFrames[sprite.name];
466
480
  if (selected !== undefined)
467
481
  return Math.min(frameCount - 1, selected);
468
- const scriptedFrame = rowValues?.[`${element.name}.frame`] ?? scenario.scriptedGui[`${element.name}.frame`];
482
+ const scriptedFrame = rowValues?.[`${element.name}.frame`] ??
483
+ scenario.values[`${element.name}.frame`] ??
484
+ scenario.scriptedGui[`${element.name}.frame`];
469
485
  if (typeof scriptedFrame === 'number' && Number.isFinite(scriptedFrame))
470
486
  return Math.min(frameCount - 1, Math.max(0, Math.trunc(scriptedFrame > 0 ? scriptedFrame - 1 : scriptedFrame)));
471
487
  const explicit = scalarNumber(property(element.attributes, 'frame'), frameCount);
@@ -600,8 +616,12 @@ async function layoutElement(definition, parentRect, inheritedClip, parentScale,
600
616
  const scale = parentScale * localScale;
601
617
  const position = objectProperty(property(definition.attributes, 'position'));
602
618
  const size = objectProperty(property(definition.attributes, 'size'));
603
- const scriptedX = rowValues?.[`${definition.name}.x`] ?? scenario.scriptedGui[`${definition.name}.x`];
604
- const scriptedY = rowValues?.[`${definition.name}.y`] ?? scenario.scriptedGui[`${definition.name}.y`];
619
+ const scriptedX = rowValues?.[`${definition.name}.x`] ??
620
+ scenario.values[`${definition.name}.x`] ??
621
+ scenario.scriptedGui[`${definition.name}.x`];
622
+ const scriptedY = rowValues?.[`${definition.name}.y`] ??
623
+ scenario.values[`${definition.name}.y`] ??
624
+ scenario.scriptedGui[`${definition.name}.y`];
605
625
  const localX = (typeof scriptedX === 'number' && Number.isFinite(scriptedX)
606
626
  ? scriptedX * parentScale
607
627
  : undefined) ??
@@ -617,6 +637,8 @@ async function layoutElement(definition, parentRect, inheritedClip, parentScale,
617
637
  const background = objectProperty(property(definition.attributes, 'background'));
618
638
  const scriptedImage = rowValues?.[`${definition.name}.image`] ??
619
639
  rowValues?.[definition.name] ??
640
+ scenario.values[`${definition.name}.image`] ??
641
+ scenario.values[definition.name] ??
620
642
  scenario.scriptedGui[`${definition.name}.image`] ??
621
643
  scenario.scriptedGui[definition.name];
622
644
  const spriteName = (typeof scriptedImage === 'string' && scriptedImage.length > 0 ? scriptedImage : undefined) ??
@@ -706,6 +728,8 @@ async function layoutElement(definition, parentRect, inheritedClip, parentScale,
706
728
  addFidelity(fidelity, 'modelled', 'scripted_gui_position', `Scenario properties positioned ${definition.name} at ${localX},${localY} before anchoring.`, definition);
707
729
  const rawButtonText = scalarString(property(definition.attributes, 'buttonText'));
708
730
  const rawText = scalarString(property(definition.attributes, 'text')) ?? rawButtonText;
731
+ const embeddedButtonText = rawText !== undefined &&
732
+ (rawButtonText !== undefined || definition.elementType.toLowerCase().includes('button'));
709
733
  let text;
710
734
  if (rawText !== undefined) {
711
735
  const resolved = resolveTokenText(rawText, scenario, context.localisation, rowValues);
@@ -786,7 +810,7 @@ async function layoutElement(definition, parentRect, inheritedClip, parentScale,
786
810
  measuredWidth,
787
811
  measuredHeight,
788
812
  metricSource: wrapped.metricSource,
789
- ...alignment(definition.attributes, rawButtonText !== undefined),
813
+ ...alignment(definition.attributes, embeddedButtonText),
790
814
  ...(fontName === undefined ? {} : { fontName }),
791
815
  glyphLines,
792
816
  overflowX: width > 0 && measuredWidth > width + 0.01,
@@ -845,7 +869,9 @@ async function layoutElement(definition, parentRect, inheritedClip, parentScale,
845
869
  const clipRect = inheritedClip;
846
870
  const clipped = clipRect !== undefined &&
847
871
  (availableClip === undefined || !equalRect(unclippedRect, availableClip));
848
- const scriptedVisible = rowValues?.[`${definition.name}.visible`] ?? scenario.scriptedGui[`${definition.name}.visible`];
872
+ const scriptedVisible = rowValues?.[`${definition.name}.visible`] ??
873
+ scenario.values[`${definition.name}.visible`] ??
874
+ scenario.scriptedGui[`${definition.name}.visible`];
849
875
  const explicitlyVisible = scenario.visibility[definition.name] ??
850
876
  scenario.visibility[definition.id] ??
851
877
  (typeof scriptedVisible === 'boolean' ? scriptedVisible : undefined);
@@ -853,6 +879,7 @@ async function layoutElement(definition, parentRect, inheritedClip, parentScale,
853
879
  (explicitlyVisible ?? (availableClip !== undefined || inheritedClip === undefined));
854
880
  const clickThrough = scalarBoolean(property(definition.attributes, 'clickThrough', 'alwaystransparent', 'allwaystransparent')) ?? false;
855
881
  const scriptedEnabled = rowValues?.[`${definition.name}.enabled`] ??
882
+ scenario.values[`${definition.name}.enabled`] ??
856
883
  scenario.scriptedGui[`${definition.name}.enabled`] ??
857
884
  context.constantElementEnabled[definition.name];
858
885
  const clickable = clickableTypes.test(definition.elementType) && !clickThrough && scriptedEnabled !== false;
@@ -862,7 +889,15 @@ async function layoutElement(definition, parentRect, inheritedClip, parentScale,
862
889
  if (/progressbar/iu.test(definition.elementType)) {
863
890
  const minimum = scalarNumber(property(definition.attributes, 'minValue'), 1) ?? 0;
864
891
  const maximum = scalarNumber(property(definition.attributes, 'maxValue'), 1) ?? 100;
865
- const scriptedValue = rowValues?.[definition.name] ?? scenario.scriptedGui[definition.name];
892
+ const startValueToken = scalarString(property(definition.attributes, 'startValue'));
893
+ const shortStartValueToken = startValueToken?.slice(startValueToken.lastIndexOf('.') + 1);
894
+ const scriptedValue = rowValues?.[definition.name] ??
895
+ scenario.values[definition.name] ??
896
+ (startValueToken === undefined ? undefined : scenario.values[startValueToken]) ??
897
+ (shortStartValueToken === undefined ? undefined : scenario.values[shortStartValueToken]) ??
898
+ (startValueToken === undefined ? undefined : scenario.variables[startValueToken]) ??
899
+ (shortStartValueToken === undefined ? undefined : scenario.variables[shortStartValueToken]) ??
900
+ scenario.scriptedGui[definition.name];
866
901
  let value = typeof scriptedValue === 'number'
867
902
  ? scriptedValue
868
903
  : (scalarNumber(property(definition.attributes, 'startValue'), maximum) ?? minimum);
@@ -1085,10 +1120,25 @@ export async function buildGuiScene(graph, scannedFiles, windowName, scenario, c
1085
1120
  const scriptedWindowVisibility = {};
1086
1121
  const constantElementVisibility = {};
1087
1122
  const constantElementEnabled = {};
1123
+ const resolvedScriptedProperties = {};
1088
1124
  const dynamicListsByName = new Map();
1089
1125
  for (const scripted of graph.scriptedGuis.filter(({ name }) => relevantScriptedGuiNames.has(name))) {
1090
1126
  for (const dynamicList of scripted.dynamicListDefinitions)
1091
1127
  dynamicListsByName.set(dynamicList.name, dynamicList);
1128
+ for (const propertyDefinition of scripted.propertyDefinitions) {
1129
+ for (const [attribute, expression] of Object.entries(propertyDefinition.attributes)) {
1130
+ const suffix = attribute.toLowerCase();
1131
+ if (!['image', 'frame', 'x', 'y', 'visible', 'enabled'].includes(suffix))
1132
+ continue;
1133
+ const resolved = scenarioExpressionValue(expression, scenario.values);
1134
+ if (resolved === undefined)
1135
+ continue;
1136
+ const key = `${propertyDefinition.elementName}.${suffix}`;
1137
+ if (scenario.values[key] === undefined)
1138
+ resolvedScriptedProperties[key] = resolved;
1139
+ addFidelity(fidelity, 'modelled', 'scripted_gui_scenario_property', `${key} resolved from a scenario runtime value.`);
1140
+ }
1141
+ }
1092
1142
  for (const trigger of scripted.triggerDefinitions) {
1093
1143
  if (trigger.constantResult === undefined)
1094
1144
  continue;
@@ -1101,7 +1151,9 @@ export async function buildGuiScene(graph, scannedFiles, windowName, scenario, c
1101
1151
  addFidelity(fidelity, 'modelled', 'scripted_gui_context', `${scripted.name} uses ${scripted.contextType ?? '<unspecified>'} context.`);
1102
1152
  if (scripted.visibleExpression === undefined)
1103
1153
  continue;
1104
- const mockedVisibility = scenario.visibility[scripted.name] ?? scenario.scriptedGui[`${scripted.name}.visible`];
1154
+ const mockedVisibility = scenario.visibility[scripted.name] ??
1155
+ scenario.values[`${scripted.name}.visible`] ??
1156
+ scenario.scriptedGui[`${scripted.name}.visible`];
1105
1157
  if (typeof mockedVisibility === 'boolean') {
1106
1158
  if (scripted.windowName !== undefined)
1107
1159
  scriptedWindowVisibility[scripted.windowName] =
@@ -1114,6 +1166,10 @@ export async function buildGuiScene(graph, scannedFiles, windowName, scenario, c
1114
1166
  }
1115
1167
  const layoutScenario = {
1116
1168
  ...scenario,
1169
+ values: {
1170
+ ...resolvedScriptedProperties,
1171
+ ...scenario.values,
1172
+ },
1117
1173
  visibility: {
1118
1174
  ...scriptedWindowVisibility,
1119
1175
  ...constantElementVisibility,
@@ -118,6 +118,7 @@ const GuiPreviewScenarioBodySchema = z
118
118
  flags: z.record(z.string(), z.boolean()).default({}),
119
119
  lists: z.record(z.string(), z.array(objectSchema).max(10_000)).default({}),
120
120
  localisation: z.record(z.string(), z.string()).default({}),
121
+ values: objectSchema.default({}),
121
122
  scriptedGui: objectSchema.default({}),
122
123
  visibility: z.record(z.string(), z.boolean()).default({}),
123
124
  elementStates: z.record(z.string(), previewStateSchema).default({}),
@@ -531,7 +531,16 @@ function indexScriptedGuis(document, file, fileNodeId, nodes, edges, scriptedGui
531
531
  };
532
532
  });
533
533
  const triggers = triggerDefinitions.map(({ name: trigger }) => trigger);
534
- const properties = namedAssignments(block, 'properties').map(({ key }) => key.value);
534
+ const propertyAssignments = namedAssignments(block, 'properties');
535
+ const properties = propertyAssignments.map(({ key }) => key.value);
536
+ const propertyDefinitions = propertyAssignments.map((property) => ({
537
+ elementName: property.key.value,
538
+ attributes: property.value.type === 'block'
539
+ ? sourceValueToProperty(property.value, constantsFor(document))
540
+ : {},
541
+ rawSource: raw(document, property),
542
+ location: nodeLocation(document, property, property.key.value),
543
+ }));
535
544
  const dynamicListDefinitions = namedAssignments(block, 'dynamic_lists').map((dynamicList) => {
536
545
  const entryContainer = dynamicList.value.type === 'block'
537
546
  ? firstScalarInsensitive(dynamicList.value, 'entry_container')
@@ -571,6 +580,7 @@ function indexScriptedGuis(document, file, fileNodeId, nodes, edges, scriptedGui
571
580
  triggers: triggers.sort((a, b) => compareCodeUnits(a, b)),
572
581
  triggerDefinitions: triggerDefinitions.sort((a, b) => compareCodeUnits(a.name, b.name)),
573
582
  properties: properties.sort((a, b) => compareCodeUnits(a, b)),
583
+ propertyDefinitions: propertyDefinitions.sort((a, b) => compareCodeUnits(a.elementName, b.elementName)),
574
584
  dynamicLists: dynamicLists.sort((a, b) => compareCodeUnits(a, b)),
575
585
  dynamicListDefinitions: dynamicListDefinitions.sort((left, right) => compareCodeUnits(left.name, right.name)),
576
586
  aiWeights: aiWeights.sort((a, b) => compareCodeUnits(a, b)),
@@ -379,7 +379,7 @@ function referencedAssetPatternsForWindow(graph, windowName, additionalSpriteNam
379
379
  }
380
380
  function scenarioSpriteNames(scenarios) {
381
381
  return [
382
- ...new Set(scenarios.flatMap(({ scriptedGui }) => Object.entries(scriptedGui)
382
+ ...new Set(scenarios.flatMap(({ values, scriptedGui }) => Object.entries({ ...scriptedGui, ...values })
383
383
  .filter(([key, value]) => typeof value === 'string' &&
384
384
  value.startsWith('GFX_') &&
385
385
  (key.endsWith('.image') || !key.includes('.')))
@@ -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.2';
3
+ export const PACKAGE_VERSION = '2.8.3';
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
@@ -37,13 +37,19 @@ Bitmap text uses the language-appropriate HOI4 font definition and its real glyp
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
 
40
- Scripted-GUI composition follows `parent_scripted_gui` chains even when the linked child window is a top-level sibling in the `.gui` file. Literal `always = yes` and `always = no` visibility and click-enabled blocks are applied automatically. Scenario properties can select an element image or frame, move it with `.x` and `.y`, and control `.visible` or `.enabled` values. Dynamic lists instantiate their declared `entry_container` or `country_scope_entry_container`; each scenario row can select the country template with `countryScope`, choose an explicit `entryContainer`, and provide row-scoped text, image, frame, position, visibility, and enabled values.
40
+ Scripted-GUI composition follows `parent_scripted_gui` chains even when the linked child window is a top-level sibling in the `.gui` file. Literal `always = yes` and `always = no` visibility and click-enabled blocks are applied automatically. A scenario's `values` object supplies concrete runtime values in one place: variable names resolve numeric text, scripted-localisation names resolve dynamic labels, a progress-bar element name sets its fill value, and element keys ending in `.image`, `.frame`, `.x`, `.y`, `.visible`, or `.enabled` update that visual property. Scripted-GUI property expressions such as `image = "[GetMeterSprite]"` or `x = meter_fill_width` consume matching scenario values automatically. Dynamic lists instantiate their declared `entry_container` or `country_scope_entry_container`; each scenario row can select the country template with `countryScope`, choose an explicit `entryContainer`, and provide row-scoped text, image, frame, position, visibility, and enabled values.
41
41
 
42
42
  Preview scenarios can include exact layout expectations:
43
43
 
44
44
  ```json
45
45
  {
46
46
  "id": "populated-unlocked",
47
+ "values": {
48
+ "threat": 73,
49
+ "GetThreatLabel": "High",
50
+ "threat_meter": 73,
51
+ "confirm_button.enabled": true
52
+ },
47
53
  "flags": { "panel_open": true },
48
54
  "lists": { "target_list": [{ "id": 1, "label": "First target" }] },
49
55
  "visibility": { "target_list": true, "confirm_button": true },
@@ -68,6 +74,6 @@ Large inspections, renders, and rewrites send periodic MCP progress heartbeats w
68
74
 
69
75
  The renderer does not run the game engine. Each render includes a fidelity report that separates fields it models from fields it approximates, ignores, cannot resolve, or does not support. Treat that report as part of the review.
70
76
 
71
- Unresolved numeric runtime values such as `[?variable|format]` render as `[X]`. Unresolved text-returning scripted or scoped localisation such as `[GetStatusText]`, `[FROM.GetName]`, and `[?leader_scope.GetName]` renders as `[dynamic_loc]`. Provide scenario values when the exact value matters. Supported HOI4 `§` localisation colour controls are applied to preview text and `§!` restores the default colour.
77
+ Unresolved numeric runtime values such as `[?variable|format]` render as `[X]`. Unresolved text-returning scripted or scoped localisation such as `[GetStatusText]`, `[FROM.GetName]`, and `[?leader_scope.GetName]` renders as `[dynamic_loc]`. Put `variable` or `GetStatusText` in the scenario's `values` object when the exact value matters; the same scenario can set the related meter or state-dependent controls. Supported HOI4 `§` localisation colour controls are applied to preview text and `§!` restores the default colour.
72
78
 
73
79
  A rewrite stops if malformed or unsupported GUI script makes the requested change ambiguous. Frame-sheet animation, nine-slice tiling, progress composition, masking, and the primary and secondary textures referenced by vanilla GFX definitions render offline. Engine shader programs, hardcoded controls, and dynamic values that are not supplied by a scenario remain fidelity-report entries; an unexecuted shader never hides its resolved base texture.
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.2",
4
+ "version": "2.8.3",
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.2/schemas/configuration.schema.json",
2
+ "$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v2.8.3/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.2/schemas/continuous-focus-palette.schema.json",
2
+ "$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v2.8.3/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.2/schemas/custom-weighted-pool.schema.json",
2
+ "$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v2.8.3/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.2/schemas/event-feature-manifest.schema.json",
2
+ "$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v2.8.3/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.2/schemas/focus-plan.schema.json",
2
+ "$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v2.8.3/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.2/schemas/focus-planning-sidecar.schema.json",
2
+ "$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v2.8.3/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.2/schemas/gui-animation-source.schema.json",
2
+ "$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v2.8.3/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.2/schemas/gui-helper.schema.json",
2
+ "$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v2.8.3/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.2/schemas/gui-scenario.schema.json",
2
+ "$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v2.8.3/schemas/gui-scenario.schema.json",
3
3
  "$schema": "https://json-schema.org/draft/2020-12/schema",
4
4
  "type": "object",
5
5
  "properties": {
@@ -45,29 +45,32 @@
45
45
  "localisation": {
46
46
  "$ref": "#/$defs/__schema17"
47
47
  },
48
- "scriptedGui": {
48
+ "values": {
49
49
  "$ref": "#/$defs/__schema18"
50
50
  },
51
- "visibility": {
51
+ "scriptedGui": {
52
52
  "$ref": "#/$defs/__schema19"
53
53
  },
54
- "elementStates": {
54
+ "visibility": {
55
55
  "$ref": "#/$defs/__schema20"
56
56
  },
57
- "selectedFrames": {
57
+ "elementStates": {
58
58
  "$ref": "#/$defs/__schema21"
59
59
  },
60
- "scrollOffsets": {
60
+ "selectedFrames": {
61
61
  "$ref": "#/$defs/__schema22"
62
62
  },
63
- "guiCosts": {
63
+ "scrollOffsets": {
64
64
  "$ref": "#/$defs/__schema23"
65
65
  },
66
- "scriptCosts": {
66
+ "guiCosts": {
67
67
  "$ref": "#/$defs/__schema24"
68
68
  },
69
- "expectations": {
69
+ "scriptCosts": {
70
70
  "$ref": "#/$defs/__schema25"
71
+ },
72
+ "expectations": {
73
+ "$ref": "#/$defs/__schema26"
71
74
  }
72
75
  },
73
76
  "required": [
@@ -235,6 +238,10 @@
235
238
  "$ref": "#/$defs/__schema12"
236
239
  },
237
240
  "__schema19": {
241
+ "default": {},
242
+ "$ref": "#/$defs/__schema12"
243
+ },
244
+ "__schema20": {
238
245
  "default": {},
239
246
  "type": "object",
240
247
  "propertyNames": {
@@ -244,7 +251,7 @@
244
251
  "type": "boolean"
245
252
  }
246
253
  },
247
- "__schema20": {
254
+ "__schema21": {
248
255
  "default": {},
249
256
  "type": "object",
250
257
  "propertyNames": {
@@ -254,7 +261,7 @@
254
261
  "$ref": "#/$defs/__schema7"
255
262
  }
256
263
  },
257
- "__schema21": {
264
+ "__schema22": {
258
265
  "default": {},
259
266
  "type": "object",
260
267
  "propertyNames": {
@@ -266,7 +273,7 @@
266
273
  "maximum": 9007199254740991
267
274
  }
268
275
  },
269
- "__schema22": {
276
+ "__schema23": {
270
277
  "default": {},
271
278
  "type": "object",
272
279
  "propertyNames": {
@@ -277,7 +284,7 @@
277
284
  "minimum": 0
278
285
  }
279
286
  },
280
- "__schema23": {
287
+ "__schema24": {
281
288
  "default": {},
282
289
  "type": "object",
283
290
  "propertyNames": {
@@ -287,7 +294,7 @@
287
294
  "type": "number"
288
295
  }
289
296
  },
290
- "__schema24": {
297
+ "__schema25": {
291
298
  "default": {},
292
299
  "type": "object",
293
300
  "propertyNames": {
@@ -297,7 +304,7 @@
297
304
  "type": "number"
298
305
  }
299
306
  },
300
- "__schema25": {
307
+ "__schema26": {
301
308
  "default": {
302
309
  "visible": [],
303
310
  "hidden": [],
@@ -311,7 +318,7 @@
311
318
  "maxItems": 10000,
312
319
  "type": "array",
313
320
  "items": {
314
- "$ref": "#/$defs/__schema26"
321
+ "$ref": "#/$defs/__schema27"
315
322
  }
316
323
  },
317
324
  "hidden": {
@@ -319,33 +326,33 @@
319
326
  "maxItems": 10000,
320
327
  "type": "array",
321
328
  "items": {
322
- "$ref": "#/$defs/__schema26"
329
+ "$ref": "#/$defs/__schema27"
323
330
  }
324
331
  },
325
332
  "containedBy": {
326
333
  "default": {},
327
334
  "type": "object",
328
335
  "propertyNames": {
329
- "$ref": "#/$defs/__schema26"
336
+ "$ref": "#/$defs/__schema27"
330
337
  },
331
338
  "additionalProperties": {
332
- "$ref": "#/$defs/__schema26"
339
+ "$ref": "#/$defs/__schema27"
333
340
  }
334
341
  },
335
342
  "centeredOn": {
336
343
  "default": {},
337
344
  "type": "object",
338
345
  "propertyNames": {
339
- "$ref": "#/$defs/__schema26"
346
+ "$ref": "#/$defs/__schema27"
340
347
  },
341
348
  "additionalProperties": {
342
- "$ref": "#/$defs/__schema26"
349
+ "$ref": "#/$defs/__schema27"
343
350
  }
344
351
  }
345
352
  },
346
353
  "additionalProperties": false
347
354
  },
348
- "__schema26": {
355
+ "__schema27": {
349
356
  "type": "string",
350
357
  "minLength": 1,
351
358
  "maxLength": 256
@@ -1,5 +1,5 @@
1
1
  {
2
- "$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v2.8.2/schemas/map-operation.schema.json",
2
+ "$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v2.8.3/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.2/schemas/operation-result.schema.json",
2
+ "$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v2.8.3/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.2/schemas/probability-analysis-result.schema.json",
2
+ "$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v2.8.3/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.2/schemas/probability-compare-input.schema.json",
2
+ "$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v2.8.3/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.2/schemas/probability-evaluate-input.schema.json",
2
+ "$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v2.8.3/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.2/schemas/probability-inspect-input.schema.json",
2
+ "$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v2.8.3/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.2/schemas/probability-render-input.schema.json",
2
+ "$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v2.8.3/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.2/schemas/probability-scenario-set.schema.json",
2
+ "$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v2.8.3/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.2/schemas/probability-sequence-input.schema.json",
2
+ "$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v2.8.3/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.2/schemas/probability-simulate-input.schema.json",
2
+ "$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v2.8.3/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.2/schemas/probability-sweep-input.schema.json",
2
+ "$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v2.8.3/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.2",
6
+ "version": "2.8.3",
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.2",
16
+ "version": "2.8.3",
17
17
  "transport": {
18
18
  "type": "stdio"
19
19
  }