hoi4-agent-tools 2.3.0 → 2.3.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.
- package/CHANGELOG.md +13 -0
- package/dist/bin/stdio.js +4 -0
- package/dist/hoi4_agent_tools/event/algorithms.js +178 -1
- package/dist/hoi4_agent_tools/event/graph.js +24 -9
- package/dist/hoi4_agent_tools/event/limits.js +4 -1
- package/dist/hoi4_agent_tools/event/service.js +182 -45
- package/dist/hoi4_agent_tools/mcp/tools/chaosx.js +480 -0
- package/dist/hoi4_agent_tools/mcp/tools/technology.js +4 -1
- package/dist/hoi4_agent_tools/runtime.js +109 -7
- package/dist/hoi4_agent_tools/technology/graph.js +30 -3
- package/dist/hoi4_agent_tools/technology/queries.js +70 -3
- package/dist/hoi4_agent_tools/technology/service.js +38 -2
- package/dist/hoi4_agent_tools/version.js +1 -1
- package/docs/events.md +2 -2
- package/docs/setup.md +2 -0
- package/docs/technology.md +4 -2
- package/package.json +3 -1
- package/schemas/configuration.schema.json +1 -1
- package/schemas/continuous-focus-palette.schema.json +1 -1
- package/schemas/custom-weighted-pool.schema.json +1 -1
- package/schemas/event-feature-manifest.schema.json +1 -1
- package/schemas/focus-plan.schema.json +1 -1
- package/schemas/focus-planning-sidecar.schema.json +1 -1
- package/schemas/gui-animation-source.schema.json +1 -1
- package/schemas/gui-helper.schema.json +1 -1
- package/schemas/gui-scenario.schema.json +1 -1
- package/schemas/map-operation.schema.json +1 -1
- package/schemas/operation-result.schema.json +1 -1
- package/schemas/probability-analysis-result.schema.json +1 -1
- package/schemas/probability-compare-input.schema.json +1 -1
- package/schemas/probability-evaluate-input.schema.json +1 -1
- package/schemas/probability-inspect-input.schema.json +1 -1
- package/schemas/probability-render-input.schema.json +1 -1
- package/schemas/probability-scenario-set.schema.json +1 -1
- package/schemas/probability-sequence-input.schema.json +1 -1
- package/schemas/probability-simulate-input.schema.json +1 -1
- package/schemas/probability-sweep-input.schema.json +1 -1
- 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 &&
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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 =
|
|
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.
|
|
3
|
+
export const PACKAGE_VERSION = '2.3.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/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
|
|
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 and path calls traverse helper nodes and collapse only the selected bounded route, while state, impact, and render calls expand helper relationships when their workspace-wide evidence requires it.
|
|
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; very large scan resources contain exact totals, grouped inventories, representative diagnostics, and the revision needed for focused follow-up queries. The viewer retains the complete in-memory graph for those follow-up queries, and the event issue ceiling is high enough for installed-game-scale diagnostic inventories. This keeps an agent's prompt and artifact storage bounded without reducing the results of those focused queries.
|
|
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:
|
package/docs/technology.md
CHANGED
|
@@ -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
|
|
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.
|
|
4
|
+
"version": "2.3.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",
|
|
@@ -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.
|
|
2
|
+
"$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v2.3.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.3.
|
|
2
|
+
"$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v2.3.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.3.
|
|
2
|
+
"$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v2.3.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.3.
|
|
2
|
+
"$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v2.3.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.3.
|
|
2
|
+
"$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v2.3.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.3.
|
|
2
|
+
"$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v2.3.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.3.
|
|
2
|
+
"$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v2.3.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.3.
|
|
2
|
+
"$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v2.3.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.3.
|
|
2
|
+
"$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v2.3.3/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.
|
|
2
|
+
"$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v2.3.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.3.
|
|
2
|
+
"$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v2.3.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.3.
|
|
2
|
+
"$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v2.3.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.3.
|
|
2
|
+
"$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v2.3.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.3.
|
|
2
|
+
"$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v2.3.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.3.
|
|
2
|
+
"$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v2.3.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.3.
|
|
2
|
+
"$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v2.3.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.3.
|
|
2
|
+
"$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v2.3.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.3.
|
|
2
|
+
"$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v2.3.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.3.
|
|
2
|
+
"$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v2.3.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.3.
|
|
2
|
+
"$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v2.3.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.3.
|
|
6
|
+
"version": "2.3.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.3.
|
|
16
|
+
"version": "2.3.3",
|
|
17
17
|
"transport": {
|
|
18
18
|
"type": "stdio"
|
|
19
19
|
}
|