hoi4-agent-tools 2.3.0 → 2.3.4

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 (39) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/dist/bin/stdio.js +4 -0
  3. package/dist/hoi4_agent_tools/event/algorithms.js +178 -1
  4. package/dist/hoi4_agent_tools/event/graph.js +38 -9
  5. package/dist/hoi4_agent_tools/event/limits.js +4 -1
  6. package/dist/hoi4_agent_tools/event/service.js +200 -46
  7. package/dist/hoi4_agent_tools/mcp/tools/chaosx.js +480 -0
  8. package/dist/hoi4_agent_tools/mcp/tools/event.js +10 -3
  9. package/dist/hoi4_agent_tools/mcp/tools/technology.js +4 -1
  10. package/dist/hoi4_agent_tools/runtime.js +109 -7
  11. package/dist/hoi4_agent_tools/technology/graph.js +30 -3
  12. package/dist/hoi4_agent_tools/technology/queries.js +70 -3
  13. package/dist/hoi4_agent_tools/technology/service.js +38 -2
  14. package/dist/hoi4_agent_tools/version.js +1 -1
  15. package/docs/events.md +2 -2
  16. package/docs/setup.md +2 -0
  17. package/docs/technology.md +4 -2
  18. package/package.json +3 -1
  19. package/schemas/configuration.schema.json +1 -1
  20. package/schemas/continuous-focus-palette.schema.json +1 -1
  21. package/schemas/custom-weighted-pool.schema.json +1 -1
  22. package/schemas/event-feature-manifest.schema.json +1 -1
  23. package/schemas/focus-plan.schema.json +1 -1
  24. package/schemas/focus-planning-sidecar.schema.json +1 -1
  25. package/schemas/gui-animation-source.schema.json +1 -1
  26. package/schemas/gui-helper.schema.json +1 -1
  27. package/schemas/gui-scenario.schema.json +1 -1
  28. package/schemas/map-operation.schema.json +1 -1
  29. package/schemas/operation-result.schema.json +1 -1
  30. package/schemas/probability-analysis-result.schema.json +1 -1
  31. package/schemas/probability-compare-input.schema.json +1 -1
  32. package/schemas/probability-evaluate-input.schema.json +1 -1
  33. package/schemas/probability-inspect-input.schema.json +1 -1
  34. package/schemas/probability-render-input.schema.json +1 -1
  35. package/schemas/probability-scenario-set.schema.json +1 -1
  36. package/schemas/probability-sequence-input.schema.json +1 -1
  37. package/schemas/probability-simulate-input.schema.json +1 -1
  38. package/schemas/probability-sweep-input.schema.json +1 -1
  39. package/server.json +2 -2
@@ -315,9 +315,30 @@ function stronglyConnectedComponents(nodeIds, edges, signal) {
315
315
  }
316
316
  return components.sort((left, right) => compareCodeUnits(left[0] ?? '', right[0] ?? ''));
317
317
  }
318
- function expandHelperReferences(references, calls, unresolved, signal) {
318
+ function expandHelperReferences(references, calls, unresolved, analysisMode, signal) {
319
319
  const direct = references.filter(({ sourceKind }) => sourceKind === 'scripted_effect');
320
320
  const publicReferences = references.filter(({ sourceKind }) => sourceKind !== 'scripted_effect');
321
+ if (analysisMode === 'focused') {
322
+ if (calls.length > 0) {
323
+ unresolved.push({
324
+ id: 'tech-unresolved-helper-expansion-deferred',
325
+ kind: 'unsupported_construct',
326
+ expression: 'scripted_effect expansion',
327
+ confidence: 'unresolved',
328
+ blockers: [
329
+ {
330
+ code: 'TECH_HELPER_EXPANSION_DEFERRED',
331
+ message: 'Large-workspace technology analysis retains scripted-effect calls and direct references without materialising the full helper projection.',
332
+ },
333
+ ],
334
+ });
335
+ }
336
+ const deduplicated = new Map();
337
+ for (const reference of [...publicReferences, ...direct])
338
+ if (!deduplicated.has(reference.id))
339
+ deduplicated.set(reference.id, reference);
340
+ return [...deduplicated.values()].sort((left, right) => compareCodeUnits(left.id, right.id));
341
+ }
321
342
  const refsByHelper = new Map();
322
343
  for (const reference of direct) {
323
344
  const group = refsByHelper.get(reference.sourceId) ?? [];
@@ -1085,7 +1106,7 @@ export function buildTechnologyGraph(snapshot, options) {
1085
1106
  const unlocks = resolveUnlocks(selectOwnedRecords(fragments.flatMap(({ unlocks }) => unlocks), ({ technologyId }) => technologyId, ({ location }) => location, technologyById).sort((left, right) => compareCodeUnits(left.id, right.id)), unlockTargets, snapshot.complete);
1086
1107
  const unresolved = fragments.flatMap(({ unresolved }) => unresolved);
1087
1108
  const helperCalls = fragments.flatMap(({ helperCalls }) => helperCalls);
1088
- const externalReferences = expandHelperReferences(fragments.flatMap(({ externalReferences }) => externalReferences), helperCalls, unresolved, options.signal);
1109
+ const externalReferences = expandHelperReferences(fragments.flatMap(({ externalReferences }) => externalReferences), helperCalls, unresolved, options.analysisMode ?? 'full', options.signal);
1089
1110
  const issues = diagnose(technologies, folders, placements, gridboxes, edges, categories, doctrineDefinitions, unlocks, externalReferences, selectedTechnologies.duplicates.map((group) => group.map(({ iconSprite, effectSignatureFields, ...technology }) => ({
1090
1111
  ...technology,
1091
1112
  icon: iconStatus(iconSprite, snapshot.index, assets),
@@ -1111,10 +1132,13 @@ export function buildTechnologyGraph(snapshot, options) {
1111
1132
  const graph = {
1112
1133
  schemaVersion: TECHNOLOGY_GRAPH_SCHEMA_VERSION,
1113
1134
  parserVersion: TECHNOLOGY_PARSER_VERSION,
1135
+ analysisMode: options.analysisMode ?? 'full',
1114
1136
  workspaceId: snapshot.workspaceId,
1115
1137
  workspaceIdentity: options.workspaceIdentity,
1116
1138
  revision,
1117
- complete: snapshot.complete && unresolved.every(({ kind }) => kind !== 'partial_source'),
1139
+ complete: snapshot.complete &&
1140
+ unresolved.every(({ kind }) => kind !== 'partial_source') &&
1141
+ !(options.analysisMode === 'focused' && helperCalls.length > 0),
1118
1142
  analysisBoundary: {
1119
1143
  staticAnalysis: true,
1120
1144
  language: 'l_english',
@@ -1125,6 +1149,9 @@ export function buildTechnologyGraph(snapshot, options) {
1125
1149
  'meta-generated or variable technology identifiers',
1126
1150
  'exact AI research choice and runtime research time',
1127
1151
  'dynamic scripted localisation without supplied runtime values',
1152
+ ...(options.analysisMode === 'focused' && helperCalls.length > 0
1153
+ ? ['large-workspace scripted-effect helper projections are deferred']
1154
+ : []),
1128
1155
  ],
1129
1156
  assumptions: [
1130
1157
  'classic technology paths point from the defining technology to leads_to_tech',
@@ -8,17 +8,42 @@ function requireTechnology(graph, technologyId) {
8
8
  technologyId,
9
9
  });
10
10
  }
11
- export function technologyScanReport(graph) {
11
+ const TECHNOLOGY_SCAN_FULL_GRAPH_RECORD_LIMIT = 100_000;
12
+ function technologyRecordCount(graph) {
13
+ return (graph.technologies.length +
14
+ graph.folders.length +
15
+ graph.categories.length +
16
+ graph.placements.length +
17
+ graph.gridboxes.length +
18
+ graph.edges.length +
19
+ graph.unlocks.length +
20
+ graph.unlockTargets.length +
21
+ graph.externalReferences.length +
22
+ graph.helperCalls.length +
23
+ graph.issues.length +
24
+ graph.diagnostics.length +
25
+ graph.unresolved.length +
26
+ graph.doctrineDefinitions.length);
27
+ }
28
+ function groupedCounts(values, key) {
29
+ const counts = new Map();
30
+ for (const value of values)
31
+ counts.set(key(value), (counts.get(key(value)) ?? 0) + 1);
32
+ return Object.fromEntries([...counts].sort(([left], [right]) => compareCodeUnits(left, right)));
33
+ }
34
+ export function technologyScanReport(graph, fullGraphRecordLimit = TECHNOLOGY_SCAN_FULL_GRAPH_RECORD_LIMIT) {
35
+ const recordCount = technologyRecordCount(graph);
12
36
  const classifications = Object.fromEntries(['confirmed_error', 'probable_defect', 'design_warning', 'unresolved_analysis'].map((classification) => [
13
37
  classification,
14
38
  graph.issues.filter((issue) => issue.classification === classification).length,
15
39
  ]));
16
- return {
40
+ const summary = {
17
41
  schemaVersion: graph.schemaVersion,
18
42
  parserVersion: graph.parserVersion,
19
43
  workspaceId: graph.workspaceId,
20
44
  workspaceIdentity: graph.workspaceIdentity,
21
45
  revision: graph.revision,
46
+ analysisMode: graph.analysisMode ?? 'full',
22
47
  complete: graph.complete,
23
48
  statistics: graph.statistics,
24
49
  issueClassifications: classifications,
@@ -31,7 +56,49 @@ export function technologyScanReport(graph) {
31
56
  analysisBoundary: graph.analysisBoundary,
32
57
  issueSamples: graph.issues.slice(0, 100),
33
58
  unresolvedSamples: graph.unresolved.slice(0, 100),
34
- authoritativeGraphIncluded: true,
59
+ recordCounts: {
60
+ technologies: graph.technologies.length,
61
+ folders: graph.folders.length,
62
+ categories: graph.categories.length,
63
+ placements: graph.placements.length,
64
+ gridboxes: graph.gridboxes.length,
65
+ edges: graph.edges.length,
66
+ unlocks: graph.unlocks.length,
67
+ unlockTargets: graph.unlockTargets.length,
68
+ externalReferences: graph.externalReferences.length,
69
+ issues: graph.issues.length,
70
+ diagnostics: graph.diagnostics.length,
71
+ unresolved: graph.unresolved.length,
72
+ doctrineDefinitions: graph.doctrineDefinitions.length,
73
+ },
74
+ };
75
+ if (recordCount <= fullGraphRecordLimit) {
76
+ return {
77
+ ...summary,
78
+ authoritativeGraphIncluded: true,
79
+ graph,
80
+ };
81
+ }
82
+ return {
83
+ ...summary,
84
+ authoritativeGraphIncluded: false,
85
+ graphSummary: {
86
+ revision: graph.revision,
87
+ recordCounts: summary.recordCounts,
88
+ technologyKinds: groupedCounts(graph.technologies, ({ kind }) => kind),
89
+ edgeKinds: groupedCounts(graph.edges, ({ kind }) => kind),
90
+ issueCodes: groupedCounts(graph.issues, ({ code }) => code),
91
+ issueSeverities: groupedCounts(graph.issues, ({ severity }) => severity),
92
+ diagnosticCodes: groupedCounts(graph.diagnostics, ({ code }) => code),
93
+ diagnosticSeverities: groupedCounts(graph.diagnostics, ({ severity }) => severity),
94
+ },
95
+ diagnosticSamples: graph.diagnostics.slice(0, 100),
96
+ artifactProjection: {
97
+ mode: 'large-scan-summary',
98
+ fullGraphRecordCount: recordCount,
99
+ fullGraphRecordLimit,
100
+ detailQueries: ['folders', 'trace', 'explain', 'unlocks', 'bonus_coverage', 'lint', 'impact'],
101
+ },
35
102
  };
36
103
  }
37
104
  export function discoverTechnologyFolders(graph, folderId) {
@@ -18,6 +18,7 @@ const GRAPH_ARTIFACT_BYTES = 134_217_728;
18
18
  const GRAPH_ARTIFACT_CHUNKS = 2_048;
19
19
  const HISTORY_ENTRIES = 12;
20
20
  const FOCUSED_RENDER_LIMIT = 32;
21
+ const FOCUSED_GRAPH_FILE_THRESHOLD = 1_000;
21
22
  class BoundedTechnologyFragmentCache {
22
23
  #values = new Map();
23
24
  #bytes = 0;
@@ -58,6 +59,36 @@ function sharedState(engine) {
58
59
  }
59
60
  return state;
60
61
  }
62
+ function technologyScanPatterns(workspace) {
63
+ const roots = workspace.registration.roots;
64
+ const under = (values, glob) => values.map((root) => `${root.replaceAll('\\', '/').replace(/\/$/u, '')}/${glob}`);
65
+ return [
66
+ 'common/technologies/**/*.txt',
67
+ 'common/technology_tags/**/*.txt',
68
+ 'common/technology_sharing/**/*.txt',
69
+ 'common/doctrines/**/*.txt',
70
+ 'common/units/**/*.txt',
71
+ 'common/buildings/**/*.txt',
72
+ 'common/abilities/**/*.txt',
73
+ 'common/decisions/**/*.txt',
74
+ 'common/scripted_effects/**/*.txt',
75
+ 'common/on_actions/**/*.txt',
76
+ 'common/ideas/**/*.txt',
77
+ 'common/characters/**/*.txt',
78
+ 'common/combat_tactics.txt',
79
+ 'events/**/*.txt',
80
+ 'history/countries/**/*.txt',
81
+ ...under(roots.focus, '**/*.txt'),
82
+ ...under(roots.interface, '**/*.gui'),
83
+ ...under(roots.localisation, 'english/**/*.{yml,yaml}'),
84
+ ...under(roots.localisation, '*.{yml,yaml}'),
85
+ ].sort(compareCodeUnits);
86
+ }
87
+ function technologyAnalysisMode(workspace, snapshot) {
88
+ return workspace.gameRoot !== undefined || snapshot.files.length > FOCUSED_GRAPH_FILE_THRESHOLD
89
+ ? 'focused'
90
+ : 'full';
91
+ }
61
92
  function rememberGraph(state, graph) {
62
93
  const history = state.history.get(graph.workspaceId) ?? new Map();
63
94
  history.delete(graph.revision);
@@ -79,6 +110,7 @@ function safeSlug(value) {
79
110
  function graphHash(graph) {
80
111
  return hashCanonical({
81
112
  schemaVersion: graph.schemaVersion,
113
+ analysisMode: graph.analysisMode ?? 'full',
82
114
  workspaceIdentity: graph.workspaceIdentity,
83
115
  revision: graph.revision,
84
116
  statistics: graph.statistics,
@@ -322,10 +354,12 @@ export class TechnologyTreeViewer {
322
354
  const cached = this.#state.current.get(workspaceId);
323
355
  if (options.refresh !== true && cached?.generation === generation)
324
356
  return cached.graph;
325
- const snapshot = await this.engine.scan(workspaceId, {}, options.principal, options.signal);
357
+ const snapshot = await this.engine.scan(workspaceId, { patterns: technologyScanPatterns(workspace) }, options.principal, options.signal);
358
+ const analysisMode = technologyAnalysisMode(workspace, snapshot);
326
359
  const preliminary = buildTechnologyGraph(snapshot, {
327
360
  workspaceIdentity: workspace.workspaceIdentity,
328
361
  cache: this.#state.fragments,
362
+ analysisMode,
329
363
  ...(options.signal === undefined ? {} : { signal: options.signal }),
330
364
  });
331
365
  const patterns = technologyAssetPatterns(preliminary);
@@ -339,6 +373,7 @@ export class TechnologyTreeViewer {
339
373
  workspaceIdentity: workspace.workspaceIdentity,
340
374
  cache: this.#state.fragments,
341
375
  assetFiles,
376
+ analysisMode,
342
377
  ...(options.signal === undefined ? {} : { signal: options.signal }),
343
378
  });
344
379
  this.#state.current.set(workspaceId, { generation, snapshot, assetFiles, graph });
@@ -354,7 +389,7 @@ export class TechnologyTreeViewer {
354
389
  let report;
355
390
  switch (input.mode) {
356
391
  case 'scan':
357
- report = { ...technologyScanReport(graph), graph };
392
+ report = technologyScanReport(graph);
358
393
  break;
359
394
  case 'folders':
360
395
  report = discoverTechnologyFolders(graph, input.folderId);
@@ -588,6 +623,7 @@ export class TechnologyTreeViewer {
588
623
  workspaceIdentity: workspace.workspaceIdentity,
589
624
  cache: this.#state.fragments,
590
625
  assetFiles: cached.assetFiles,
626
+ analysisMode: cached.graph.analysisMode ?? 'full',
591
627
  ...(signal === undefined ? {} : { signal }),
592
628
  });
593
629
  }
@@ -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.3.0';
3
+ export const PACKAGE_VERSION = '2.3.4';
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/events.md CHANGED
@@ -16,9 +16,9 @@ Use the three event tools directly from the target mod.
16
16
  - `lint`: find missing targets, unreachable events, suspicious cycles, conflicting definitions, invalid timing, and unresolved dynamic calls.
17
17
  - `impact`: identify callers, descendants, state dependencies, and files affected by a proposed event change.
18
18
 
19
- Use narrow identifiers, direction, and depth limits when the task concerns one chain. Broad scans build the structural event graph without expanding every scripted helper into duplicate paths. Focused trace, path, state, impact, and render calls expand helper relationships when needed.
19
+ Use narrow identifiers, direction, and depth limits when the task concerns one chain. Broad scans build the structural event graph without expanding every scripted helper into duplicate paths. Game-backed or other large workspaces automatically use a focused source profile containing event definitions and on-actions, then defer workspace-wide helper projections and lifecycle passes. The result is marked partial and records that boundary in the linked evidence instead of waiting until the MCP transport times out. Focused trace and path calls collapse only the selected bounded route.
20
20
 
21
- The compact response summarizes the result. Small scan resources contain the complete graph; very large scan resources contain exact totals, grouped inventories, representative diagnostics, and the revision needed for focused follow-up queries. This keeps an agent's prompt and artifact storage bounded without reducing the results of those focused queries.
21
+ The compact response summarizes the result. Small scan resources contain the complete graph; large scan resources contain exact totals, grouped inventories, representative diagnostics, and the revision needed for focused follow-up queries. Large focused scans keep direct event and on-action evidence, call sites, state accesses, and source locations while leaving helper expansion and workspace-wide lifecycle analysis explicit as deferred boundaries. This keeps an agent's prompt and artifact storage bounded without allowing a broad scan to exhaust the MCP process.
22
22
 
23
23
  Selectors use one of these forms:
24
24
 
package/docs/setup.md CHANGED
@@ -12,6 +12,8 @@ Set the MCP process working directory to the mod being edited. The server create
12
12
 
13
13
  When the MCP server starts with its working directory inside a mod, every focus, GUI, map, event, and technology call uses that mod automatically. Configured multi-mod or remote deployments can use explicit workspace selection.
14
14
 
15
+ Local startup accepts normal descriptor-based mods and sparse descriptor-less mods that contain standard HOI4 content folders. Empty roots need a `descriptor.mod` or an explicit configuration so the server does not guess an unrelated directory.
16
+
15
17
  ## Optional persistent configuration
16
18
 
17
19
  Use `--init` only when you need several mod roots, a fixed game path, or a shared/remote process:
@@ -8,7 +8,7 @@ Use the three technology tools directly from the target mod.
8
8
 
9
9
  `hoi4.tech_inspect` provides eight focused modes:
10
10
 
11
- - `scan`: build the complete technology graph and report its inventory, diagnostics, analysis limits, and revision.
11
+ - `scan`: build the technology graph and report its inventory, diagnostics, analysis limits, and revision. Small graphs include the complete graph in the report; large graphs return exact counts, grouped findings, samples, and the revision for focused follow-up queries.
12
12
  - `folders`: list folder roots and source placements, or inspect one `folderId`.
13
13
  - `trace`: follow prerequisites, descendants, or both from a `technologyId` with bounded depth and node limits.
14
14
  - `explain`: collect one technology's definition, placements, paths, exclusivity, metadata, effects, unlocks, grants, bonuses, and unresolved references.
@@ -43,7 +43,9 @@ Impact mode takes a subject with `kind` set to `technology`, `category`, `folder
43
43
  }
44
44
  ```
45
45
 
46
- Findings are separated into confirmed errors, probable defects, design warnings, and unresolved analysis. Roots, grant-only technologies, early dates, zero AI weights, repeated effects, and routing nodes are evaluated in context instead of being treated as automatic defects.
46
+ Findings are separated into confirmed errors, probable defects, design warnings, and unresolved analysis. Roots, grant-only technologies, early dates, zero AI weights, repeated effects, and routing nodes are evaluated in context instead of being treated as automatic defects. The viewer keeps its authoritative graph in memory while the linked scan artifact remains a bounded summary; use its revision with the focused inspect modes or a render resource to inspect the relevant records.
47
+
48
+ Game-backed and otherwise large workspaces automatically use focused analysis mode. It keeps direct grants, bonuses, unlocks, definitions, and the source-linked scripted-effect call index while deferring the full helper projection that can otherwise make a vanilla-plus-mod scan take minutes or exhaust the server process. The result is marked partial and names this boundary in `analysisBoundary`; no direct source evidence is discarded.
47
49
 
48
50
  ## Render
49
51
 
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.3.0",
4
+ "version": "2.3.4",
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",
@@ -126,7 +126,9 @@
126
126
  },
127
127
  "overrides": {
128
128
  "@hono/node-server": "2.0.11",
129
+ "brace-expansion": "5.0.8",
129
130
  "fast-uri": "3.1.4",
131
+ "postcss": "8.5.23",
130
132
  "shell-quote": "1.10.0"
131
133
  },
132
134
  "publishConfig": {
@@ -1,5 +1,5 @@
1
1
  {
2
- "$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v2.3.0/schemas/configuration.schema.json",
2
+ "$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v2.3.4/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.3.0/schemas/continuous-focus-palette.schema.json",
2
+ "$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v2.3.4/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.3.0/schemas/custom-weighted-pool.schema.json",
2
+ "$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v2.3.4/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.3.0/schemas/event-feature-manifest.schema.json",
2
+ "$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v2.3.4/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.3.0/schemas/focus-plan.schema.json",
2
+ "$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v2.3.4/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.3.0/schemas/focus-planning-sidecar.schema.json",
2
+ "$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v2.3.4/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.3.0/schemas/gui-animation-source.schema.json",
2
+ "$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v2.3.4/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.3.0/schemas/gui-helper.schema.json",
2
+ "$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v2.3.4/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.3.0/schemas/gui-scenario.schema.json",
2
+ "$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v2.3.4/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.3.0/schemas/map-operation.schema.json",
2
+ "$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v2.3.4/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.3.0/schemas/operation-result.schema.json",
2
+ "$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v2.3.4/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.3.0/schemas/probability-analysis-result.schema.json",
2
+ "$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v2.3.4/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.3.0/schemas/probability-compare-input.schema.json",
2
+ "$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v2.3.4/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.3.0/schemas/probability-evaluate-input.schema.json",
2
+ "$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v2.3.4/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.3.0/schemas/probability-inspect-input.schema.json",
2
+ "$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v2.3.4/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.3.0/schemas/probability-render-input.schema.json",
2
+ "$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v2.3.4/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.3.0/schemas/probability-scenario-set.schema.json",
2
+ "$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v2.3.4/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.3.0/schemas/probability-sequence-input.schema.json",
2
+ "$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v2.3.4/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.3.0/schemas/probability-simulate-input.schema.json",
2
+ "$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v2.3.4/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.3.0/schemas/probability-sweep-input.schema.json",
2
+ "$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v2.3.4/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.3.0",
6
+ "version": "2.3.4",
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.3.0",
16
+ "version": "2.3.4",
17
17
  "transport": {
18
18
  "type": "stdio"
19
19
  }