hoi4-agent-tools 4.0.3 → 4.0.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 (63) hide show
  1. package/CHANGELOG.md +10 -0
  2. package/dist/hoi4_agent_tools/core/clausewitz-evaluation.js +5 -3
  3. package/dist/hoi4_agent_tools/core/condition-evaluator.js +5 -1
  4. package/dist/hoi4_agent_tools/core/index.js +11 -0
  5. package/dist/hoi4_agent_tools/core/job-executor.js +3 -1
  6. package/dist/hoi4_agent_tools/core/job-worker-host.js +1 -1
  7. package/dist/hoi4_agent_tools/core/render-progress.js +7 -0
  8. package/dist/hoi4_agent_tools/gui/layout.js +15 -8
  9. package/dist/hoi4_agent_tools/gui/scenario-generator.js +3 -3
  10. package/dist/hoi4_agent_tools/gui/source-graph.js +58 -26
  11. package/dist/hoi4_agent_tools/gui/studio.js +97 -31
  12. package/dist/hoi4_agent_tools/gui/tool-operations.js +8 -2
  13. package/dist/hoi4_agent_tools/mcp/server/create-modern-operations.js +2 -1
  14. package/dist/hoi4_agent_tools/mcp/server/job-task-store.js +3 -1
  15. package/dist/hoi4_agent_tools/mcp/server/modern-tasks.js +2 -0
  16. package/dist/hoi4_agent_tools/mcp/server/progress.js +12 -0
  17. package/dist/hoi4_agent_tools/mcp/server/request-lifecycle.js +2 -2
  18. package/dist/hoi4_agent_tools/mcp/server/task-request-context.js +5 -2
  19. package/dist/hoi4_agent_tools/technology/job-operations.js +1 -0
  20. package/dist/hoi4_agent_tools/technology/service.js +18 -37
  21. package/dist/hoi4_agent_tools/version.js +1 -1
  22. package/docs/gui.md +8 -0
  23. package/docs/technology.md +2 -0
  24. package/npm-shrinkwrap.json +2 -2
  25. package/package.json +1 -1
  26. package/schemas/configuration.schema.json +1 -1
  27. package/schemas/continuous-focus-palette.schema.json +1 -1
  28. package/schemas/custom-weighted-pool.schema.json +1 -1
  29. package/schemas/decision-inspect-input.schema.json +1 -1
  30. package/schemas/error-log-input.schema.json +1 -1
  31. package/schemas/event-feature-manifest.schema.json +1 -1
  32. package/schemas/focus-plan.schema.json +1 -1
  33. package/schemas/focus-planning-sidecar.schema.json +1 -1
  34. package/schemas/gui-animation-source.schema.json +1 -1
  35. package/schemas/gui-helper.schema.json +1 -1
  36. package/schemas/gui-scenario.schema.json +1 -1
  37. package/schemas/helper-expansion-request.schema.json +1 -1
  38. package/schemas/helper-expansion-summary.schema.json +1 -1
  39. package/schemas/impact-inspect-input.schema.json +1 -1
  40. package/schemas/map-operation.schema.json +1 -1
  41. package/schemas/mechanic-test-input.schema.json +1 -1
  42. package/schemas/mod-index-input.schema.json +1 -1
  43. package/schemas/operation-result.schema.json +1 -1
  44. package/schemas/package-check-input.schema.json +1 -1
  45. package/schemas/package-manifest.schema.json +1 -1
  46. package/schemas/probability-analysis-result.schema.json +1 -1
  47. package/schemas/probability-compare-input.schema.json +1 -1
  48. package/schemas/probability-evaluate-input.schema.json +1 -1
  49. package/schemas/probability-inspect-input.schema.json +1 -1
  50. package/schemas/probability-render-input.schema.json +1 -1
  51. package/schemas/probability-scenario-set.schema.json +1 -1
  52. package/schemas/probability-sequence-input.schema.json +1 -1
  53. package/schemas/probability-simulate-input.schema.json +1 -1
  54. package/schemas/probability-sweep-input.schema.json +1 -1
  55. package/schemas/reference-context-input.schema.json +1 -1
  56. package/schemas/reference-read-input.schema.json +1 -1
  57. package/schemas/reference-search-input.schema.json +1 -1
  58. package/schemas/scenario-suite.schema.json +1 -1
  59. package/schemas/scenario-test-input.schema.json +1 -1
  60. package/schemas/script-validate-input.schema.json +1 -1
  61. package/schemas/shared-scenario.schema.json +1 -1
  62. package/schemas/source-lookup-input.schema.json +1 -1
  63. package/server.json +2 -2
@@ -120,11 +120,14 @@ export async function inspectGui(engine, studio, input, context) {
120
120
  const linted = await studio.lint({
121
121
  workspaceId: context.workspaceId,
122
122
  windowName: input.windowName,
123
+ progress: (phase) => context.progress(1, 3, phase),
123
124
  scenario: input.scenario,
124
125
  ...(input.relatedScenarios === undefined
125
126
  ? {}
126
127
  : { relatedScenarios: input.relatedScenarios }),
127
- generatedScenarios: input.generatedScenarios ?? {},
128
+ ...(input.generatedScenarios === undefined
129
+ ? {}
130
+ : { generatedScenarios: input.generatedScenarios }),
128
131
  ...(context.principal === undefined ? {} : { principal: context.principal }),
129
132
  ...(context.signal === undefined ? {} : { signal: context.signal }),
130
133
  });
@@ -217,6 +220,7 @@ export async function inspectGui(engine, studio, input, context) {
217
220
  export async function renderGui(studio, input, context) {
218
221
  await context.progress(0, 4, 'Building GUI source graph');
219
222
  const rendered = await studio.renderAndStore({
223
+ progress: (phase) => context.progress(1, 4, phase),
220
224
  workspaceId: context.workspaceId,
221
225
  windowName: input.windowName,
222
226
  scenario: input.scenario,
@@ -231,7 +235,9 @@ export async function renderGui(studio, input, context) {
231
235
  })),
232
236
  }),
233
237
  ...(input.relatedScenarios === undefined ? {} : { relatedScenarios: input.relatedScenarios }),
234
- generatedScenarios: input.generatedScenarios ?? {},
238
+ ...(input.generatedScenarios === undefined
239
+ ? {}
240
+ : { generatedScenarios: input.generatedScenarios }),
235
241
  ...(input.comparisonScenario === undefined
236
242
  ? {}
237
243
  : { comparisonScenario: input.comparisonScenario }),
@@ -17,7 +17,7 @@ import { referenceTools } from '../tools/reference.js';
17
17
  import { isReferenceTool, ReferenceToolService } from '../../reference/operations.js';
18
18
  import { ModernTaskAdapter, TASKS_EXTENSION } from './modern-tasks.js';
19
19
  import { SERVER_INSTRUCTIONS } from './instructions.js';
20
- import { modernProgressReporter, withProgressHeartbeat } from './progress.js';
20
+ import { jobProgressReporter, modernProgressReporter, withProgressHeartbeat } from './progress.js';
21
21
  import { taskToolCatalog } from './task-tool-catalog.js';
22
22
  const rootsResponseSchema = z
23
23
  .object({
@@ -187,6 +187,7 @@ export function createModernOperationServer(engine, context = {}, tasks = new Op
187
187
  const progress = modernProgressReporter(extra);
188
188
  const result = await withProgressHeartbeat(async () => {
189
189
  const completed = await adapter.call({ name: definition.name, arguments: arguments_ }, capabilities, operationContext, {
190
+ progress: jobProgressReporter(progress),
190
191
  requestId: extra.mcpReq.id,
191
192
  signal: extra.mcpReq.signal,
192
193
  ...(extra.sessionId === undefined ? {} : { sessionId: extra.sessionId }),
@@ -2,7 +2,7 @@ import { CallToolResultSchema, } from '@modelcontextprotocol/sdk/types.js';
2
2
  import { jobTaskTiming } from '../../core/job-store.js';
3
3
  import { OperationTaskService, operationTaskCallSchema, operationTaskId, operationTaskMessage, operationTaskStatus, } from '../../core/operation-tasks.js';
4
4
  import { ServiceError } from '../../core/result.js';
5
- import { currentTaskRequestSignal } from './task-request-context.js';
5
+ import { currentTaskRequestSignal, currentTaskRequestProgress } from './task-request-context.js';
6
6
  function legacyTask(record) {
7
7
  if (record.request.protocolTask === undefined)
8
8
  throw new ServiceError('TASK_NOT_FOUND', 'The requested protocol task does not exist');
@@ -44,6 +44,8 @@ export class PersistentJobTaskStore {
44
44
  }
45
45
  async getTask(value, _sessionId) {
46
46
  const record = await this.tasks.get(value, this.context());
47
+ if (record?.progress !== undefined)
48
+ await currentTaskRequestProgress()?.(record.progress.completed, record.progress.total ?? 1, record.progress.message);
47
49
  return record === null ? null : legacyTask(record);
48
50
  }
49
51
  async storeTaskResult(value, status, result, _sessionId) {
@@ -112,6 +112,8 @@ export class ModernTaskAdapter {
112
112
  options.signal?.throwIfAborted();
113
113
  await delay(100, undefined, { signal: options.signal });
114
114
  latest = await this.known(taskId, context);
115
+ if (latest.progress !== undefined)
116
+ await options.progress?.(latest.progress.completed, latest.progress.total ?? 1, latest.progress.message);
115
117
  }
116
118
  return modernToolResult(latest, await this.tasks.result(operationTaskId(record), context));
117
119
  }
@@ -101,3 +101,15 @@ export async function withProgressHeartbeat(operation, reporter, message, interv
101
101
  heartbeatOwners.delete(reporter);
102
102
  }
103
103
  }
104
+ /** Reserve the outer request's final two steps for retrieval/completion while forwarding worker phases. */
105
+ export function jobProgressReporter(reporter) {
106
+ let previous;
107
+ return async (completed, total, message) => {
108
+ const identity = JSON.stringify([completed, total, message]);
109
+ if (identity === previous)
110
+ return;
111
+ previous = identity;
112
+ await reporter.report(Math.min(1, completed / Math.max(1, total)), 3, message);
113
+ await reporter.pulse(message);
114
+ };
115
+ }
@@ -5,7 +5,7 @@ import { referenceTools } from '../tools/reference.js';
5
5
  import { jobControlTools } from '../tools/job.js';
6
6
  import { invalidArgumentsResult } from './argument-errors.js';
7
7
  import { taskToolCatalog } from './task-tool-catalog.js';
8
- import { progressReporter, withProgressHeartbeat } from './progress.js';
8
+ import { jobProgressReporter, progressReporter, withProgressHeartbeat } from './progress.js';
9
9
  import { withTaskRequestSignal } from './task-request-context.js';
10
10
  import { slimToolList } from './tool-listing.js';
11
11
  // Durable task compatibility and cancellation are control traffic. They must
@@ -42,7 +42,7 @@ export function installRequestLifecycle(server, engine) {
42
42
  return handler(request, extra);
43
43
  if (taskCall.success && backgroundTools.has(taskCall.data.params.name)) {
44
44
  return withProgressHeartbeat(async () => {
45
- const result = await withTaskRequestSignal(extra.signal, () => handler(request, extra));
45
+ const result = await withTaskRequestSignal(extra.signal, () => handler(request, extra), jobProgressReporter(progress));
46
46
  if (taskCall.data.params.task === undefined) {
47
47
  await progress.report(2, 3, 'Retrieving persistent operation result');
48
48
  await progress.report(3, 3, 'Persistent operation complete');
@@ -1,9 +1,12 @@
1
1
  import { AsyncLocalStorage } from 'node:async_hooks';
2
2
  const taskRequestContext = new AsyncLocalStorage();
3
3
  /** Bind transport cancellation to foreground-compatible task creation only. */
4
- export function withTaskRequestSignal(signal, action) {
5
- return taskRequestContext.run({ signal }, action);
4
+ export function withTaskRequestSignal(signal, action, progress) {
5
+ return taskRequestContext.run({ signal, ...(progress === undefined ? {} : { progress }) }, action);
6
6
  }
7
7
  export function currentTaskRequestSignal() {
8
8
  return taskRequestContext.getStore()?.signal;
9
9
  }
10
+ export function currentTaskRequestProgress() {
11
+ return taskRequestContext.getStore()?.progress;
12
+ }
@@ -22,6 +22,7 @@ export function registerTechnologyJobs(operations, engine) {
22
22
  workspaceId: context.workspaceId,
23
23
  ...(context.principal === undefined ? {} : { principal: context.principal }),
24
24
  signal: context.signal,
25
+ progress: (phase) => context.progress({ completed: 1, total: 3, message: phase }),
25
26
  });
26
27
  await context.progress({
27
28
  completed: 3,
@@ -4,6 +4,7 @@ import { technologyHelperInventory } from './helper-expansion.js';
4
4
  import { clearSemanticDependencies } from '../core/semantic-dependencies.js';
5
5
  import { canonicalJson, compareCodeUnits, hashCanonical, sha256Bytes } from '../core/canonical.js';
6
6
  import { boundedSourceHashEvidence, } from '../core/artifacts.js';
7
+ import { renderStage } from '../core/render-progress.js';
7
8
  import { RenderBudget } from '../core/render-budget.js';
8
9
  import { ServiceError } from '../core/result.js';
9
10
  import { SOURCE_MAX_BYTES } from '../core/source/index.js';
@@ -96,43 +97,17 @@ function technologyScanPatterns(workspace) {
96
97
  ...under(roots.localisation, '*.{yml,yaml}'),
97
98
  ].sort(compareCodeUnits);
98
99
  }
99
- function recomputeTechnologyShadowing(files) {
100
- const groups = new Map();
101
- for (const file of files) {
102
- delete file.shadowedBy;
103
- const key = file.relativePath.replaceAll('\\', '/').toLowerCase();
104
- const group = groups.get(key) ?? [];
105
- group.push(file);
106
- groups.set(key, group);
107
- }
108
- for (const group of groups.values()) {
109
- group.sort((left, right) => right.loadOrder - left.loadOrder || compareCodeUnits(left.displayPath, right.displayPath));
110
- const active = group[0];
111
- for (const shadowed of group.slice(1))
112
- shadowed.shadowedBy = active.displayPath;
113
- }
114
- }
115
- async function scanTechnologySources(engine, workspaceId, workspace, principal, signal) {
116
- const patterns = technologyScanPatterns(workspace);
117
- const scans = await Promise.all([
118
- engine.scan(workspaceId, { patterns, rootKinds: ['mod', 'dependency', 'fixture'] }, principal, signal),
119
- ...(workspace.roots.some(({ kind }) => kind === 'game')
120
- ? [engine.scan(workspaceId, { patterns, rootKinds: ['game', 'dlc'] }, principal, signal)]
121
- : []),
122
- ]);
123
- const files = scans.flatMap(({ files }) => files.map((file) => ({ ...file })));
124
- recomputeTechnologyShadowing(files);
125
- files.sort((left, right) => left.loadOrder - right.loadOrder || compareCodeUnits(left.displayPath, right.displayPath));
126
- const index = engine.indexFiles(files);
100
+ async function scanTechnologySources(engine, workspaceId, workspace, principal, signal, renderOnly = false) {
101
+ const patterns = technologyScanPatterns(workspace).filter((pattern) => !renderOnly ||
102
+ !/^(?:events|history|common\/(?:national_focus|decisions|scripted_effects|on_actions|ideas|characters))\//u.test(pattern));
103
+ const snapshot = await engine.scan(workspaceId, { patterns }, principal, signal);
127
104
  return {
128
- workspaceId,
129
- revision: hashCanonical(files.map(({ displayPath, loadOrder, sha256 }) => ({ displayPath, loadOrder, sha256 }))),
130
- files,
131
- index,
132
- complete: scans.every(({ complete }) => complete) && index.complete,
133
- skippedSourceCount: index.skippedSourceCount,
134
- skippedSources: index.skippedSources,
135
- diagnostics: [...scans.flatMap(({ diagnostics }) => diagnostics), ...index.diagnostics],
105
+ ...snapshot,
106
+ revision: hashCanonical(snapshot.files.map(({ displayPath, loadOrder, sha256 }) => ({
107
+ displayPath,
108
+ loadOrder,
109
+ sha256,
110
+ }))),
136
111
  };
137
112
  }
138
113
  function activeTechnologySprite(spriteName, spritePath, sprites) {
@@ -472,7 +447,7 @@ export class TechnologyTreeViewer {
472
447
  const workspace = this.engine.resolver.get(workspaceId, options.principal);
473
448
  const generation = this.engine.generation(workspaceId);
474
449
  const cached = this.#state.current.get(workspaceId);
475
- const snapshot = await scanTechnologySources(this.engine, workspaceId, workspace, options.principal, options.signal);
450
+ const snapshot = await scanTechnologySources(this.engine, workspaceId, workspace, options.principal, options.signal, options.renderOnly);
476
451
  const analysisMode = workspace.roots.some(({ kind }) => kind === 'game') || snapshot.files.length > 1_000
477
452
  ? 'focused'
478
453
  : undefined;
@@ -526,6 +501,8 @@ export class TechnologyTreeViewer {
526
501
  ...(analysisMode === undefined ? {} : { analysisMode }),
527
502
  ...(options.signal === undefined ? {} : { signal: options.signal }),
528
503
  });
504
+ if (options.renderOnly === true)
505
+ graph.analysisBoundary.assumptions.push('Folder renders scan technology definitions, layouts, unlock targets and assets; inbound grants and references require technology inspection.');
529
506
  this.#state.current.set(workspaceId, { generation, snapshot, assetFiles, graph });
530
507
  rememberGraph(this.#state, graph);
531
508
  return graph;
@@ -650,7 +627,9 @@ export class TechnologyTreeViewer {
650
627
  };
651
628
  }
652
629
  async renderAndStore(input) {
630
+ await renderStage(input, 'Indexing technology view sources');
653
631
  const graph = await this.scan(input.workspaceId, {
632
+ renderOnly: input.view === 'folder',
654
633
  ...(input.refresh === undefined ? {} : { refresh: input.refresh }),
655
634
  ...(input.principal === undefined ? {} : { principal: input.principal }),
656
635
  ...(input.signal === undefined ? {} : { signal: input.signal }),
@@ -684,9 +663,11 @@ export class TechnologyTreeViewer {
684
663
  maxNodes: 1_000,
685
664
  })),
686
665
  ]);
666
+ await renderStage(input, 'Decoding selected technology assets');
687
667
  const { dataUris: iconDataUris, dimensions: spriteDimensions } = await resolveTechnologyIconDataUris(cached, requestedIconSprites, budget, input.signal);
688
668
  renderOptions.iconDataUris = iconDataUris;
689
669
  renderOptions.spriteDimensions = spriteDimensions;
670
+ await renderStage(input, 'Laying out and rasterizing technology view');
690
671
  const render = await renderTechnologyGraph(graph, renderOptions);
691
672
  const focused = [];
692
673
  for (const folder of focusedFolders) {
@@ -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 = '4.0.3';
3
+ export const PACKAGE_VERSION = '4.0.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/gui.md CHANGED
@@ -11,6 +11,14 @@ Dashed amber regions are potential controls with unresolved visibility or enabli
11
11
  The scene retains the reason so the agent can supply the missing facts instead of guessing.
12
12
  These are source-model results, not proof of native click execution.
13
13
 
14
+ ## Render one supplied state
15
+
16
+ For a focused render, use `states: []`, one `resolutions` entry matching `scenario.resolution`, and the flags, variables and list rows needed to open the window. Inspection and rendering preserve the supplied scenario; `generatedScenarios` is opt-in. A full state/resolution matrix still runs when those arrays are omitted.
17
+
18
+ Progress reports scanning, graph construction, selected asset loading, layout and rasterization. Deadline errors name the last phase. Missing texture fallback searches configured graphics/interface roots and fonts, never documentation or unrelated workspace folders. Move assets under a configured asset root if they previously depended on a workspace-wide basename search.
19
+
20
+ Nested `$KEY$` localisation references resolve across files. Scenario values can supply runtime tokens; cycles, more than 16 nested substitutions, and missing values remain unresolved. Animated sprites use `animationTimeSeconds` (and `visibleTimeSeconds` for play-on-show timing); each PNG is a deterministic frame at that time, not an animation.
21
+
14
22
  ## Preview immediate tooltip text
15
23
 
16
24
  An explicit tooltip request uses a visible element's `pdx_tooltip` localisation key. Supply `tooltip.target` with its inspected instance ID or a unique element name, plus viewport `x`, `y`, `width` and `padding` values.
@@ -127,3 +127,5 @@ The comparison render is produced unless `render` is `false`; `maxRenderNodes` r
127
127
  For an unfamiliar technology system, an agent can scan it, discover folders, trace or explain the relevant path, render only the needed views, edit Clausewitz source through its normal repository workflow, and compare the result. The same graph and revision back every query and artifact, so folder placement, dependency structure, unlock impact, and cross-file references stay aligned.
128
128
 
129
129
  This is static analysis. Exact runtime research time, AI choices, balance, arbitrary dynamic grants, and unsupported visibility behavior are not inferred. Dynamic expressions remain in the results with their confidence and blockers, and no destination is invented.
130
+
131
+ Folder rendering scans technology definitions, GUI layouts, unlock targets, localisation and assets. It omits inbound event, decision, focus and history references; use `hoi4.tech_inspect` for grants, bonuses, impact and complete reference evidence. The render manifest records this source scope.
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "hoi4-agent-tools",
3
- "version": "4.0.3",
3
+ "version": "4.0.4",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "hoi4-agent-tools",
9
- "version": "4.0.3",
9
+ "version": "4.0.4",
10
10
  "license": "Apache-2.0",
11
11
  "dependencies": {
12
12
  "@fontsource-variable/roboto": "5.3.0",
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": "4.0.3",
4
+ "version": "4.0.4",
5
5
  "description": "Build HOI4 mods: focus trees, events, decisions, worlds, GUI previews, docs and AI balance.",
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/v4.0.3/schemas/configuration.schema.json",
2
+ "$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v4.0.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/v4.0.3/schemas/continuous-focus-palette.schema.json",
2
+ "$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v4.0.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/v4.0.3/schemas/custom-weighted-pool.schema.json",
2
+ "$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v4.0.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/v4.0.3/schemas/decision-inspect-input.schema.json",
2
+ "$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v4.0.4/schemas/decision-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/v4.0.3/schemas/error-log-input.schema.json",
2
+ "$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v4.0.4/schemas/error-log-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/v4.0.3/schemas/event-feature-manifest.schema.json",
2
+ "$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v4.0.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/v4.0.3/schemas/focus-plan.schema.json",
2
+ "$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v4.0.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/v4.0.3/schemas/focus-planning-sidecar.schema.json",
2
+ "$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v4.0.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/v4.0.3/schemas/gui-animation-source.schema.json",
2
+ "$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v4.0.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/v4.0.3/schemas/gui-helper.schema.json",
2
+ "$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v4.0.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/v4.0.3/schemas/gui-scenario.schema.json",
2
+ "$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v4.0.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/v4.0.3/schemas/helper-expansion-request.schema.json",
2
+ "$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v4.0.4/schemas/helper-expansion-request.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/v4.0.3/schemas/helper-expansion-summary.schema.json",
2
+ "$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v4.0.4/schemas/helper-expansion-summary.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/v4.0.3/schemas/impact-inspect-input.schema.json",
2
+ "$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v4.0.4/schemas/impact-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/v4.0.3/schemas/map-operation.schema.json",
2
+ "$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v4.0.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/v4.0.3/schemas/mechanic-test-input.schema.json",
2
+ "$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v4.0.4/schemas/mechanic-test-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/v4.0.3/schemas/mod-index-input.schema.json",
2
+ "$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v4.0.4/schemas/mod-index-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/v4.0.3/schemas/operation-result.schema.json",
2
+ "$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v4.0.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/v4.0.3/schemas/package-check-input.schema.json",
2
+ "$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v4.0.4/schemas/package-check-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/v4.0.3/schemas/package-manifest.schema.json",
2
+ "$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v4.0.4/schemas/package-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/v4.0.3/schemas/probability-analysis-result.schema.json",
2
+ "$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v4.0.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/v4.0.3/schemas/probability-compare-input.schema.json",
2
+ "$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v4.0.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/v4.0.3/schemas/probability-evaluate-input.schema.json",
2
+ "$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v4.0.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/v4.0.3/schemas/probability-inspect-input.schema.json",
2
+ "$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v4.0.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/v4.0.3/schemas/probability-render-input.schema.json",
2
+ "$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v4.0.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/v4.0.3/schemas/probability-scenario-set.schema.json",
2
+ "$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v4.0.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/v4.0.3/schemas/probability-sequence-input.schema.json",
2
+ "$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v4.0.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/v4.0.3/schemas/probability-simulate-input.schema.json",
2
+ "$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v4.0.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/v4.0.3/schemas/probability-sweep-input.schema.json",
2
+ "$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v4.0.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": {
@@ -1,5 +1,5 @@
1
1
  {
2
- "$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v4.0.3/schemas/reference-context-input.schema.json",
2
+ "$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v4.0.4/schemas/reference-context-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/v4.0.3/schemas/reference-read-input.schema.json",
2
+ "$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v4.0.4/schemas/reference-read-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/v4.0.3/schemas/reference-search-input.schema.json",
2
+ "$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v4.0.4/schemas/reference-search-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/v4.0.3/schemas/scenario-suite.schema.json",
2
+ "$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v4.0.4/schemas/scenario-suite.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/v4.0.3/schemas/scenario-test-input.schema.json",
2
+ "$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v4.0.4/schemas/scenario-test-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/v4.0.3/schemas/script-validate-input.schema.json",
2
+ "$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v4.0.4/schemas/script-validate-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/v4.0.3/schemas/shared-scenario.schema.json",
2
+ "$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v4.0.4/schemas/shared-scenario.schema.json",
3
3
  "$schema": "https://json-schema.org/draft/2020-12/schema",
4
4
  "type": "object",
5
5
  "properties": {