hoi4-agent-tools 2.8.6 → 2.8.7
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 +5 -0
- package/dist/hoi4_agent_tools/core/artifacts.js +103 -42
- package/dist/hoi4_agent_tools/probability/service.js +3 -2
- package/dist/hoi4_agent_tools/version.js +1 -1
- package/package.json +1 -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
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,11 @@
|
|
|
4
4
|
|
|
5
5
|
No unreleased changes.
|
|
6
6
|
|
|
7
|
+
## 2.8.7 - 2026-08-28
|
|
8
|
+
|
|
9
|
+
- Isolate stale, foreign, oversized, malformed, and address-mismatched artifact manifests so one bad generated record cannot block unrelated probability, event, GUI, or other MCP evidence routes.
|
|
10
|
+
- Repair corrupted deterministic manifests from recomputed expected bytes, validate cached probability resources before reuse, and keep direct foreign-artifact access unavailable without exposing cross-workspace content.
|
|
11
|
+
|
|
7
12
|
## 2.8.6 - 2026-08-28
|
|
8
13
|
|
|
9
14
|
- Generate source-aware scripted-GUI scenarios from complete parent/child surfaces, real scripted-localisation candidates, simple threshold conditions, coherent tab states, scoped values, meter ranges, and dynamic-list rows while keeping explicit scenario values authoritative.
|
|
@@ -132,11 +132,14 @@ export function boundedSourceHashEvidence(sourceHashes) {
|
|
|
132
132
|
}
|
|
133
133
|
function assertManifestIntegrity(manifest, expected, workspace) {
|
|
134
134
|
assertManifestAddressIntegrity(manifest, expected);
|
|
135
|
-
if (manifest
|
|
136
|
-
manifest
|
|
137
|
-
throw new ServiceError('ARTIFACT_MANIFEST_INTEGRITY_FAILED', 'Artifact provenance manifest does not match its immutable address');
|
|
135
|
+
if (!manifestBelongsToWorkspace(manifest, workspace)) {
|
|
136
|
+
throw new ServiceError('ARTIFACT_NOT_FOUND', 'Artifact provenance manifest is unavailable');
|
|
138
137
|
}
|
|
139
138
|
}
|
|
139
|
+
function manifestBelongsToWorkspace(manifest, workspace) {
|
|
140
|
+
return (manifest.workspaceIdentity === workspace.workspaceIdentity &&
|
|
141
|
+
manifest.ownerIdentity === workspace.ownerIdentity);
|
|
142
|
+
}
|
|
140
143
|
function assertManifestAddressIntegrity(manifest, expected) {
|
|
141
144
|
if (manifest.sha256 !== expected.sha256 ||
|
|
142
145
|
manifest.provenanceHash !== expected.provenanceHash ||
|
|
@@ -145,6 +148,33 @@ function assertManifestAddressIntegrity(manifest, expected) {
|
|
|
145
148
|
throw new ServiceError('ARTIFACT_MANIFEST_INTEGRITY_FAILED', 'Artifact provenance manifest does not match its immutable address');
|
|
146
149
|
}
|
|
147
150
|
}
|
|
151
|
+
function recoverableManifestError(error) {
|
|
152
|
+
return (error instanceof ServiceError &&
|
|
153
|
+
[
|
|
154
|
+
'ARTIFACT_NOT_FOUND',
|
|
155
|
+
'ARTIFACT_MANIFEST_INVALID',
|
|
156
|
+
'ARTIFACT_MANIFEST_LIMIT',
|
|
157
|
+
'ARTIFACT_MANIFEST_INTEGRITY_FAILED',
|
|
158
|
+
].includes(error.code));
|
|
159
|
+
}
|
|
160
|
+
async function enumerableArtifactManifest(workspace, directory, entryName, signal) {
|
|
161
|
+
try {
|
|
162
|
+
const manifest = await readArtifactManifest(path.join(directory, entryName), signal);
|
|
163
|
+
if (entryName !== `${manifest.name}.${manifest.provenanceHash}.manifest.json`)
|
|
164
|
+
return undefined;
|
|
165
|
+
assertManifestAddressIntegrity(manifest, {
|
|
166
|
+
sha256: path.basename(directory),
|
|
167
|
+
provenanceHash: manifest.provenanceHash,
|
|
168
|
+
name: manifest.name,
|
|
169
|
+
});
|
|
170
|
+
return manifestBelongsToWorkspace(manifest, workspace) ? manifest : undefined;
|
|
171
|
+
}
|
|
172
|
+
catch (error) {
|
|
173
|
+
if (recoverableManifestError(error))
|
|
174
|
+
return undefined;
|
|
175
|
+
throw error;
|
|
176
|
+
}
|
|
177
|
+
}
|
|
148
178
|
/** Return the only artifact fields that may cross the MCP trust boundary. */
|
|
149
179
|
export function publicArtifactLink(artifact) {
|
|
150
180
|
return {
|
|
@@ -501,6 +531,23 @@ async function existingManifestMatches(filePath, expectedBytes, signal) {
|
|
|
501
531
|
try {
|
|
502
532
|
const manifest = await readArtifactManifest(filePath, signal);
|
|
503
533
|
if (`${canonicalJson(manifest)}\n` !== expectedBytes) {
|
|
534
|
+
const expected = artifactManifestSchema.parse(JSON.parse(expectedBytes));
|
|
535
|
+
try {
|
|
536
|
+
assertManifestAddressIntegrity(manifest, {
|
|
537
|
+
sha256: expected.sha256,
|
|
538
|
+
provenanceHash: expected.provenanceHash,
|
|
539
|
+
name: expected.name,
|
|
540
|
+
});
|
|
541
|
+
}
|
|
542
|
+
catch (error) {
|
|
543
|
+
if (!recoverableManifestError(error))
|
|
544
|
+
throw error;
|
|
545
|
+
await unlink(filePath).catch((unlinkError) => {
|
|
546
|
+
if (unlinkError.code !== 'ENOENT')
|
|
547
|
+
throw unlinkError;
|
|
548
|
+
});
|
|
549
|
+
return false;
|
|
550
|
+
}
|
|
504
551
|
throw new ServiceError('ARTIFACT_MANIFEST_INTEGRITY_FAILED', 'Immutable artifact provenance manifest contains different bytes');
|
|
505
552
|
}
|
|
506
553
|
return true;
|
|
@@ -508,11 +555,17 @@ async function existingManifestMatches(filePath, expectedBytes, signal) {
|
|
|
508
555
|
catch (error) {
|
|
509
556
|
if (error instanceof ServiceError && error.code === 'ARTIFACT_NOT_FOUND')
|
|
510
557
|
return false;
|
|
511
|
-
if (!(error instanceof ServiceError) ||
|
|
558
|
+
if (!(error instanceof ServiceError) ||
|
|
559
|
+
!['ARTIFACT_MANIFEST_INVALID', 'ARTIFACT_MANIFEST_LIMIT'].includes(error.code))
|
|
512
560
|
throw error;
|
|
513
561
|
const state = await interruptedManifestState(filePath, expectedBytes, signal);
|
|
514
|
-
if (!state.interrupted)
|
|
515
|
-
|
|
562
|
+
if (!state.interrupted) {
|
|
563
|
+
await unlink(filePath).catch((unlinkError) => {
|
|
564
|
+
if (unlinkError.code !== 'ENOENT')
|
|
565
|
+
throw unlinkError;
|
|
566
|
+
});
|
|
567
|
+
return false;
|
|
568
|
+
}
|
|
516
569
|
try {
|
|
517
570
|
await unlink(filePath);
|
|
518
571
|
}
|
|
@@ -689,19 +742,31 @@ export class ArtifactStore {
|
|
|
689
742
|
catch (error) {
|
|
690
743
|
if (error instanceof ServiceError && error.code === 'ARTIFACT_NOT_FOUND')
|
|
691
744
|
continue;
|
|
692
|
-
if (!(error
|
|
745
|
+
if (!recoverableManifestError(error))
|
|
693
746
|
throw error;
|
|
694
|
-
let interrupted;
|
|
695
747
|
try {
|
|
696
|
-
|
|
748
|
+
await unlink(candidate);
|
|
697
749
|
}
|
|
698
|
-
catch (
|
|
699
|
-
if (
|
|
700
|
-
|
|
701
|
-
continue;
|
|
702
|
-
throw interruptedError;
|
|
750
|
+
catch (unlinkError) {
|
|
751
|
+
if (unlinkError.code !== 'ENOENT')
|
|
752
|
+
throw unlinkError;
|
|
703
753
|
}
|
|
704
|
-
|
|
754
|
+
usage.entries = Math.max(0, usage.entries - 1);
|
|
755
|
+
usage.bytes = Math.max(0, usage.bytes - metadata.size);
|
|
756
|
+
continue;
|
|
757
|
+
}
|
|
758
|
+
try {
|
|
759
|
+
if (child.name !== `${manifest.name}.${manifest.provenanceHash}.manifest.json`) {
|
|
760
|
+
throw new ServiceError('ARTIFACT_MANIFEST_INTEGRITY_FAILED', 'Artifact provenance manifest filename does not match its contents');
|
|
761
|
+
}
|
|
762
|
+
assertManifestAddressIntegrity(manifest, {
|
|
763
|
+
sha256: path.basename(directory),
|
|
764
|
+
provenanceHash: manifest.provenanceHash,
|
|
765
|
+
name: manifest.name,
|
|
766
|
+
});
|
|
767
|
+
}
|
|
768
|
+
catch (error) {
|
|
769
|
+
if (!recoverableManifestError(error))
|
|
705
770
|
throw error;
|
|
706
771
|
try {
|
|
707
772
|
await unlink(candidate);
|
|
@@ -711,17 +776,9 @@ export class ArtifactStore {
|
|
|
711
776
|
throw unlinkError;
|
|
712
777
|
}
|
|
713
778
|
usage.entries = Math.max(0, usage.entries - 1);
|
|
714
|
-
usage.bytes = Math.max(0, usage.bytes -
|
|
779
|
+
usage.bytes = Math.max(0, usage.bytes - metadata.size);
|
|
715
780
|
continue;
|
|
716
781
|
}
|
|
717
|
-
if (child.name !== `${manifest.name}.${manifest.provenanceHash}.manifest.json`) {
|
|
718
|
-
throw new ServiceError('ARTIFACT_MANIFEST_INTEGRITY_FAILED', 'Artifact provenance manifest filename does not match its contents');
|
|
719
|
-
}
|
|
720
|
-
assertManifestAddressIntegrity(manifest, {
|
|
721
|
-
sha256: path.basename(directory),
|
|
722
|
-
provenanceHash: manifest.provenanceHash,
|
|
723
|
-
name: manifest.name,
|
|
724
|
-
});
|
|
725
782
|
const targetPath = await containedGeneratedPath(workspace.artifactRoot, path.relative(workspace.artifactRoot, path.join(directory, manifest.name)));
|
|
726
783
|
let targetBytes = 0;
|
|
727
784
|
try {
|
|
@@ -867,15 +924,10 @@ export class ArtifactStore {
|
|
|
867
924
|
await walk(await containedGeneratedPath(workspace.artifactRoot, path.relative(workspace.artifactRoot, candidate)));
|
|
868
925
|
}
|
|
869
926
|
else if (entry.isFile() && entry.name.endsWith('.manifest.json')) {
|
|
870
|
-
|
|
871
|
-
|
|
872
|
-
|
|
873
|
-
|
|
874
|
-
assertManifestIntegrity(manifest, {
|
|
875
|
-
sha256: path.basename(directory),
|
|
876
|
-
provenanceHash: manifest.provenanceHash,
|
|
877
|
-
name: manifest.name,
|
|
878
|
-
}, workspace);
|
|
927
|
+
await containedGeneratedPath(workspace.artifactRoot, path.relative(workspace.artifactRoot, candidate));
|
|
928
|
+
const manifest = await enumerableArtifactManifest(workspace, directory, entry.name, signal);
|
|
929
|
+
if (manifest === undefined)
|
|
930
|
+
continue;
|
|
879
931
|
results.push({
|
|
880
932
|
uri: this.uri(workspace.id, manifest.sha256, manifest.provenanceHash, manifest.name),
|
|
881
933
|
name: manifest.name,
|
|
@@ -908,15 +960,10 @@ export class ArtifactStore {
|
|
|
908
960
|
let hasMore = false;
|
|
909
961
|
const visitManifest = async (directory, entryName) => {
|
|
910
962
|
signal?.throwIfAborted();
|
|
911
|
-
|
|
912
|
-
|
|
913
|
-
|
|
914
|
-
|
|
915
|
-
assertManifestIntegrity(manifest, {
|
|
916
|
-
sha256: path.basename(directory),
|
|
917
|
-
provenanceHash: manifest.provenanceHash,
|
|
918
|
-
name: manifest.name,
|
|
919
|
-
}, workspace);
|
|
963
|
+
await containedGeneratedPath(workspace.artifactRoot, path.relative(workspace.artifactRoot, path.join(directory, entryName)));
|
|
964
|
+
const manifest = await enumerableArtifactManifest(workspace, directory, entryName, signal);
|
|
965
|
+
if (manifest === undefined)
|
|
966
|
+
return;
|
|
920
967
|
const uri = this.uri(workspace.id, manifest.sha256, manifest.provenanceHash, manifest.name);
|
|
921
968
|
revision.update(`${Buffer.byteLength(uri, 'utf8')}:${uri}`);
|
|
922
969
|
total += 1;
|
|
@@ -989,6 +1036,20 @@ export class ArtifactStore {
|
|
|
989
1036
|
path: await containedGeneratedPath(workspace.artifactRoot, parsed.sha256.slice(0, 2), parsed.sha256, parsed.name),
|
|
990
1037
|
};
|
|
991
1038
|
}
|
|
1039
|
+
async available(workspace, artifacts, signal) {
|
|
1040
|
+
for (const artifact of artifacts) {
|
|
1041
|
+
signal?.throwIfAborted();
|
|
1042
|
+
try {
|
|
1043
|
+
await this.describe(workspace, artifact.uri, signal);
|
|
1044
|
+
}
|
|
1045
|
+
catch (error) {
|
|
1046
|
+
if (recoverableManifestError(error))
|
|
1047
|
+
return false;
|
|
1048
|
+
throw error;
|
|
1049
|
+
}
|
|
1050
|
+
}
|
|
1051
|
+
return true;
|
|
1052
|
+
}
|
|
992
1053
|
async put(workspace, name, mimeType, content, provenance, description, signal) {
|
|
993
1054
|
return this.withAtomicWrites(workspace, [
|
|
994
1055
|
{
|
|
@@ -735,11 +735,12 @@ export class ProbabilityAnalyzer {
|
|
|
735
735
|
}
|
|
736
736
|
async store(result, outputs, includeHtml = false, signal, principal) {
|
|
737
737
|
const cached = this.state.byCacheKey.get(result.metadata.cacheKey);
|
|
738
|
+
const workspace = this.engine.resolver.get(result.metadata.workspaceId, principal);
|
|
738
739
|
if (cached?.operation === result.operation &&
|
|
739
740
|
cached.status === result.status &&
|
|
740
|
-
visualOutputs(outputs).length === 0
|
|
741
|
+
visualOutputs(outputs).length === 0 &&
|
|
742
|
+
(await this.engine.artifacts.available(workspace, cached.resources, signal)))
|
|
741
743
|
return cached;
|
|
742
|
-
const workspace = this.engine.resolver.get(result.metadata.workspaceId, principal);
|
|
743
744
|
const provenance = {
|
|
744
745
|
kind: 'probability-analysis',
|
|
745
746
|
toolVersion: PACKAGE_VERSION,
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { LATEST_PROTOCOL_VERSION } from '@modelcontextprotocol/sdk/types.js';
|
|
2
2
|
export const PACKAGE_NAME = 'hoi4-agent-tools';
|
|
3
|
-
export const PACKAGE_VERSION = '2.8.
|
|
3
|
+
export const PACKAGE_VERSION = '2.8.7';
|
|
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/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "hoi4-agent-tools",
|
|
3
3
|
"mcpName": "io.github.klimPaskov/hoi4-agent-tools",
|
|
4
|
-
"version": "2.8.
|
|
4
|
+
"version": "2.8.7",
|
|
5
5
|
"description": "Analyze HOI4 events, tech trees, AI weights, and MTTH; build focus trees, GUIs, and maps.",
|
|
6
6
|
"type": "module",
|
|
7
7
|
"license": "Apache-2.0",
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
-
"$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v2.8.
|
|
2
|
+
"$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v2.8.7/schemas/configuration.schema.json",
|
|
3
3
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
4
4
|
"type": "object",
|
|
5
5
|
"properties": {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
-
"$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v2.8.
|
|
2
|
+
"$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v2.8.7/schemas/continuous-focus-palette.schema.json",
|
|
3
3
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
4
4
|
"type": "object",
|
|
5
5
|
"properties": {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
-
"$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v2.8.
|
|
2
|
+
"$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v2.8.7/schemas/custom-weighted-pool.schema.json",
|
|
3
3
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
4
4
|
"type": "object",
|
|
5
5
|
"properties": {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
-
"$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v2.8.
|
|
2
|
+
"$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v2.8.7/schemas/event-feature-manifest.schema.json",
|
|
3
3
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
4
4
|
"type": "object",
|
|
5
5
|
"properties": {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
-
"$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v2.8.
|
|
2
|
+
"$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v2.8.7/schemas/focus-plan.schema.json",
|
|
3
3
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
4
4
|
"type": "object",
|
|
5
5
|
"properties": {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
-
"$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v2.8.
|
|
2
|
+
"$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v2.8.7/schemas/focus-planning-sidecar.schema.json",
|
|
3
3
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
4
4
|
"type": "object",
|
|
5
5
|
"properties": {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
-
"$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v2.8.
|
|
2
|
+
"$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v2.8.7/schemas/gui-animation-source.schema.json",
|
|
3
3
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
4
4
|
"type": "object",
|
|
5
5
|
"properties": {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
-
"$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v2.8.
|
|
2
|
+
"$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v2.8.7/schemas/gui-helper.schema.json",
|
|
3
3
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
4
4
|
"type": "object",
|
|
5
5
|
"properties": {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
-
"$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v2.8.
|
|
2
|
+
"$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v2.8.7/schemas/gui-scenario.schema.json",
|
|
3
3
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
4
4
|
"type": "object",
|
|
5
5
|
"properties": {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
-
"$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v2.8.
|
|
2
|
+
"$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v2.8.7/schemas/map-operation.schema.json",
|
|
3
3
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
4
4
|
"oneOf": [
|
|
5
5
|
{
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
-
"$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v2.8.
|
|
2
|
+
"$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v2.8.7/schemas/operation-result.schema.json",
|
|
3
3
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
4
4
|
"type": "object",
|
|
5
5
|
"properties": {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
-
"$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v2.8.
|
|
2
|
+
"$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v2.8.7/schemas/probability-analysis-result.schema.json",
|
|
3
3
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
4
4
|
"type": "object",
|
|
5
5
|
"properties": {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
-
"$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v2.8.
|
|
2
|
+
"$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v2.8.7/schemas/probability-compare-input.schema.json",
|
|
3
3
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
4
4
|
"type": "object",
|
|
5
5
|
"properties": {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
-
"$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v2.8.
|
|
2
|
+
"$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v2.8.7/schemas/probability-evaluate-input.schema.json",
|
|
3
3
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
4
4
|
"type": "object",
|
|
5
5
|
"properties": {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
-
"$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v2.8.
|
|
2
|
+
"$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v2.8.7/schemas/probability-inspect-input.schema.json",
|
|
3
3
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
4
4
|
"type": "object",
|
|
5
5
|
"properties": {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
-
"$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v2.8.
|
|
2
|
+
"$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v2.8.7/schemas/probability-render-input.schema.json",
|
|
3
3
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
4
4
|
"type": "object",
|
|
5
5
|
"properties": {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
-
"$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v2.8.
|
|
2
|
+
"$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v2.8.7/schemas/probability-scenario-set.schema.json",
|
|
3
3
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
4
4
|
"type": "object",
|
|
5
5
|
"properties": {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
-
"$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v2.8.
|
|
2
|
+
"$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v2.8.7/schemas/probability-sequence-input.schema.json",
|
|
3
3
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
4
4
|
"type": "object",
|
|
5
5
|
"properties": {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
-
"$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v2.8.
|
|
2
|
+
"$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v2.8.7/schemas/probability-simulate-input.schema.json",
|
|
3
3
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
4
4
|
"type": "object",
|
|
5
5
|
"properties": {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
-
"$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v2.8.
|
|
2
|
+
"$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v2.8.7/schemas/probability-sweep-input.schema.json",
|
|
3
3
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
4
4
|
"type": "object",
|
|
5
5
|
"properties": {
|
package/server.json
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
"name": "io.github.klimPaskov/hoi4-agent-tools",
|
|
4
4
|
"title": "HOI4 Agent Tools",
|
|
5
5
|
"description": "Analyze HOI4 events, tech trees, AI weights, and MTTH; build focus trees, GUIs, and maps.",
|
|
6
|
-
"version": "2.8.
|
|
6
|
+
"version": "2.8.7",
|
|
7
7
|
"repository": {
|
|
8
8
|
"url": "https://github.com/klimPaskov/hoi4-agent-tools",
|
|
9
9
|
"source": "github"
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
{
|
|
14
14
|
"registryType": "npm",
|
|
15
15
|
"identifier": "hoi4-agent-tools",
|
|
16
|
-
"version": "2.8.
|
|
16
|
+
"version": "2.8.7",
|
|
17
17
|
"transport": {
|
|
18
18
|
"type": "stdio"
|
|
19
19
|
}
|