hoi4-agent-tools 3.0.9 → 3.2.0

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 (145) hide show
  1. package/CHANGELOG.md +32 -1
  2. package/README.md +10 -2
  3. package/dist/bin/stdio.js +23 -12
  4. package/dist/hoi4_agent_tools/core/analysis-checkpoints.js +82 -0
  5. package/dist/hoi4_agent_tools/core/analysis-evidence.js +9 -0
  6. package/dist/hoi4_agent_tools/core/analysis-job-operations.js +38 -0
  7. package/dist/hoi4_agent_tools/core/artifact-resource.js +173 -0
  8. package/dist/hoi4_agent_tools/core/artifacts.js +84 -2
  9. package/dist/hoi4_agent_tools/core/condition-evaluator.js +16 -0
  10. package/dist/hoi4_agent_tools/core/dependency-pages.js +216 -0
  11. package/dist/hoi4_agent_tools/core/dependency-walk.js +266 -0
  12. package/dist/hoi4_agent_tools/core/domain-validation.js +188 -0
  13. package/dist/hoi4_agent_tools/core/engine.js +48 -5
  14. package/dist/hoi4_agent_tools/core/helper-expansion.js +186 -0
  15. package/dist/hoi4_agent_tools/core/impact-comparison.js +49 -0
  16. package/dist/hoi4_agent_tools/core/impact-graph.js +301 -0
  17. package/dist/hoi4_agent_tools/core/impact-semantic.js +256 -0
  18. package/dist/hoi4_agent_tools/core/index-segments.js +137 -0
  19. package/dist/hoi4_agent_tools/core/index.js +47 -4
  20. package/dist/hoi4_agent_tools/core/job-controls.js +109 -0
  21. package/dist/hoi4_agent_tools/core/job-executor.js +190 -0
  22. package/dist/hoi4_agent_tools/core/job-service.js +112 -0
  23. package/dist/hoi4_agent_tools/core/job-store.js +641 -0
  24. package/dist/hoi4_agent_tools/core/job-transactions.js +126 -0
  25. package/dist/hoi4_agent_tools/core/job-worker-host.js +202 -0
  26. package/dist/hoi4_agent_tools/core/job-worker.js +64 -0
  27. package/dist/hoi4_agent_tools/core/operation-context.js +31 -0
  28. package/dist/hoi4_agent_tools/core/operation-result.js +412 -0
  29. package/dist/hoi4_agent_tools/core/operation-tasks.js +387 -0
  30. package/dist/hoi4_agent_tools/core/persistent-analysis-cache.js +383 -0
  31. package/dist/hoi4_agent_tools/core/result.js +1 -0
  32. package/dist/hoi4_agent_tools/core/scanner.js +15 -75
  33. package/dist/hoi4_agent_tools/core/semantic-dependencies.js +233 -0
  34. package/dist/hoi4_agent_tools/core/shared-request-capacity.js +43 -11
  35. package/dist/hoi4_agent_tools/core/source/cache.js +107 -0
  36. package/dist/hoi4_agent_tools/core/source/parser.js +11 -1
  37. package/dist/hoi4_agent_tools/core/source-overlay.js +125 -0
  38. package/dist/hoi4_agent_tools/core/transaction-execution.js +134 -0
  39. package/dist/hoi4_agent_tools/core/transactions.js +80 -27
  40. package/dist/hoi4_agent_tools/decision/ai.js +104 -0
  41. package/dist/hoi4_agent_tools/decision/comparison.js +106 -0
  42. package/dist/hoi4_agent_tools/decision/cost.js +177 -0
  43. package/dist/hoi4_agent_tools/decision/evaluation.js +256 -0
  44. package/dist/hoi4_agent_tools/decision/lifecycle.js +114 -0
  45. package/dist/hoi4_agent_tools/decision/service.js +172 -0
  46. package/dist/hoi4_agent_tools/decision/source-inventory.js +182 -0
  47. package/dist/hoi4_agent_tools/event/graph.js +214 -290
  48. package/dist/hoi4_agent_tools/event/helper-expansion.js +33 -0
  49. package/dist/hoi4_agent_tools/event/job-operations.js +51 -0
  50. package/dist/hoi4_agent_tools/event/operations.js +179 -0
  51. package/dist/hoi4_agent_tools/event/service.js +67 -15
  52. package/dist/hoi4_agent_tools/event/source-analysis.js +5 -4
  53. package/dist/hoi4_agent_tools/focus/job-operations.js +77 -0
  54. package/dist/hoi4_agent_tools/focus/tool-operations.js +669 -0
  55. package/dist/hoi4_agent_tools/focus/tool-support.js +123 -0
  56. package/dist/hoi4_agent_tools/gui/job-operations.js +81 -0
  57. package/dist/hoi4_agent_tools/gui/tool-operations.js +270 -0
  58. package/dist/hoi4_agent_tools/impact/scenario-suites.js +74 -0
  59. package/dist/hoi4_agent_tools/impact/service.js +127 -0
  60. package/dist/hoi4_agent_tools/map/job-operations.js +76 -0
  61. package/dist/hoi4_agent_tools/map/tool-operations.js +493 -0
  62. package/dist/hoi4_agent_tools/mcp/prompts/probability.js +25 -0
  63. package/dist/hoi4_agent_tools/mcp/prompts/register-modern.js +29 -0
  64. package/dist/hoi4_agent_tools/mcp/resources/register-modern.js +34 -0
  65. package/dist/hoi4_agent_tools/mcp/resources/register.js +4 -150
  66. package/dist/hoi4_agent_tools/mcp/server/base-tools.js +3 -219
  67. package/dist/hoi4_agent_tools/mcp/server/create-modern-operations.js +188 -0
  68. package/dist/hoi4_agent_tools/mcp/server/create.js +18 -6
  69. package/dist/hoi4_agent_tools/mcp/server/instructions.js +2 -0
  70. package/dist/hoi4_agent_tools/mcp/server/job-task-store.js +67 -0
  71. package/dist/hoi4_agent_tools/mcp/server/legacy-task-tools.js +20 -0
  72. package/dist/hoi4_agent_tools/mcp/server/modern-tasks.js +168 -0
  73. package/dist/hoi4_agent_tools/mcp/server/progress.js +17 -15
  74. package/dist/hoi4_agent_tools/mcp/server/request-lifecycle.js +45 -0
  75. package/dist/hoi4_agent_tools/mcp/server/result.js +2 -412
  76. package/dist/hoi4_agent_tools/mcp/server/task-request-context.js +9 -0
  77. package/dist/hoi4_agent_tools/mcp/server/task-tool-catalog.js +16 -0
  78. package/dist/hoi4_agent_tools/mcp/server/task-tool-definition.js +1 -0
  79. package/dist/hoi4_agent_tools/mcp/server/transaction-execution.js +1 -123
  80. package/dist/hoi4_agent_tools/mcp/tools/analysis.js +65 -0
  81. package/dist/hoi4_agent_tools/mcp/tools/chaosx.js +38 -21
  82. package/dist/hoi4_agent_tools/mcp/tools/event.js +24 -315
  83. package/dist/hoi4_agent_tools/mcp/tools/focus.js +34 -1039
  84. package/dist/hoi4_agent_tools/mcp/tools/gui.js +19 -504
  85. package/dist/hoi4_agent_tools/mcp/tools/job.js +46 -0
  86. package/dist/hoi4_agent_tools/mcp/tools/map.js +21 -600
  87. package/dist/hoi4_agent_tools/mcp/tools/probability.js +39 -463
  88. package/dist/hoi4_agent_tools/mcp/tools/technology.js +40 -304
  89. package/dist/hoi4_agent_tools/mcp/transports/http.js +58 -1
  90. package/dist/hoi4_agent_tools/mcp/transports/modern-task-routing.js +109 -0
  91. package/dist/hoi4_agent_tools/mcp/transports/negotiated-stdio.js +121 -0
  92. package/dist/hoi4_agent_tools/probability/job-operations.js +58 -0
  93. package/dist/hoi4_agent_tools/probability/operations.js +183 -0
  94. package/dist/hoi4_agent_tools/probability/service.js +24 -3
  95. package/dist/hoi4_agent_tools/schemas/analysis.js +228 -0
  96. package/dist/hoi4_agent_tools/schemas/common.js +2 -0
  97. package/dist/hoi4_agent_tools/schemas/event.js +72 -1
  98. package/dist/hoi4_agent_tools/schemas/focus-requests.js +189 -0
  99. package/dist/hoi4_agent_tools/schemas/gui-requests.js +193 -0
  100. package/dist/hoi4_agent_tools/schemas/helper-expansion.js +58 -0
  101. package/dist/hoi4_agent_tools/schemas/map-requests.js +85 -0
  102. package/dist/hoi4_agent_tools/schemas/probability-requests.js +168 -0
  103. package/dist/hoi4_agent_tools/schemas/technology.js +90 -1
  104. package/dist/hoi4_agent_tools/schemas/transaction.js +1 -0
  105. package/dist/hoi4_agent_tools/technology/graph.js +83 -78
  106. package/dist/hoi4_agent_tools/technology/helper-expansion.js +33 -0
  107. package/dist/hoi4_agent_tools/technology/job-operations.js +60 -0
  108. package/dist/hoi4_agent_tools/technology/operations.js +125 -0
  109. package/dist/hoi4_agent_tools/technology/service.js +89 -15
  110. package/dist/hoi4_agent_tools/technology/source-analysis.js +2 -1
  111. package/dist/hoi4_agent_tools/version.js +1 -1
  112. package/docs/README.md +3 -0
  113. package/docs/analysis.md +100 -0
  114. package/docs/development.md +2 -0
  115. package/docs/events.md +7 -2
  116. package/docs/helper-expansion.md +78 -0
  117. package/docs/http.md +2 -0
  118. package/docs/jobs.md +86 -0
  119. package/docs/technology.md +6 -2
  120. package/package.json +15 -6
  121. package/schemas/configuration.schema.json +1 -1
  122. package/schemas/continuous-focus-palette.schema.json +1 -1
  123. package/schemas/custom-weighted-pool.schema.json +1 -1
  124. package/schemas/decision-inspect-input.schema.json +290 -0
  125. package/schemas/event-feature-manifest.schema.json +1 -1
  126. package/schemas/focus-plan.schema.json +1 -1
  127. package/schemas/focus-planning-sidecar.schema.json +1 -1
  128. package/schemas/gui-animation-source.schema.json +1 -1
  129. package/schemas/gui-helper.schema.json +1 -1
  130. package/schemas/gui-scenario.schema.json +1 -1
  131. package/schemas/helper-expansion-request.schema.json +44 -0
  132. package/schemas/helper-expansion-summary.schema.json +70 -0
  133. package/schemas/impact-inspect-input.schema.json +203 -0
  134. package/schemas/map-operation.schema.json +1 -1
  135. package/schemas/operation-result.schema.json +1 -1
  136. package/schemas/probability-analysis-result.schema.json +1 -1
  137. package/schemas/probability-compare-input.schema.json +1 -1
  138. package/schemas/probability-evaluate-input.schema.json +1 -1
  139. package/schemas/probability-inspect-input.schema.json +1 -1
  140. package/schemas/probability-render-input.schema.json +1 -1
  141. package/schemas/probability-scenario-set.schema.json +1 -1
  142. package/schemas/probability-sequence-input.schema.json +1 -1
  143. package/schemas/probability-simulate-input.schema.json +1 -1
  144. package/schemas/probability-sweep-input.schema.json +1 -1
  145. package/server.json +3 -3
@@ -1,176 +1,9 @@
1
+ import { registerLegacyTaskTools } from '../server/legacy-task-tools.js';
2
+ import { probabilityPrompt, probabilityPromptArguments, probabilityPromptDefinition, } from '../prompts/probability.js';
1
3
  import { z } from 'zod/v4';
2
- import { IdleCacheLifetime } from '../../core/idle-cache-lifetime.js';
3
- import { emptyServiceResult } from '../../core/result.js';
4
- import { ProbabilityAnalyzer, } from '../../probability/service.js';
5
- import { customWeightedPoolManifestSchema, probabilityAcceptanceBandSchema, probabilityAdapterIdSchema, probabilityDiagnosticThresholdsSchema, probabilityMetricSchema, probabilityOutputSchema, probabilityRenderFilterSchema, probabilityScenarioSetSchema, probabilitySamplingMethodSchema, probabilitySourceSchema, } from '../../schemas/probability.js';
6
- import { workspaceIdSchema } from '../../schemas/common.js';
7
- import { resolveServerWorkspaceId } from '../server/base-tools.js';
8
- import { compactValidatedInputSchema } from '../server/context-schemas.js';
4
+ import { probabilityCompareRequestSchema, probabilityEvaluateRequestSchema, probabilityInspectRequestSchema, probabilityRenderRequestSchema, probabilitySequenceRequestSchema, probabilitySimulateRequestSchema, probabilitySweepRequestSchema, } from '../../schemas/probability-requests.js';
9
5
  import { nonNegativeIntegerSchema, sha256Schema } from '../server/output-schemas.js';
10
- import { progressReporter } from '../server/progress.js';
11
- import { errorResult, setInlineFilesScanned, strictOperationResultSchema, toolResult, } from '../server/result.js';
12
- const nestedSource = compactValidatedInputSchema(probabilitySourceSchema, 'Source selector or proposed source.');
13
- const nestedScenarios = compactValidatedInputSchema(probabilityScenarioSetSchema, 'Explicit world-state scenarios.');
14
- const nestedManifest = compactValidatedInputSchema(customWeightedPoolManifestSchema, 'Declared custom weighted pool and state transitions.');
15
- const nestedRenderFilter = compactValidatedInputSchema(probabilityRenderFilterSchema, 'Optional scenario, candidate, metric, diagnostic, source, and page filter.');
16
- const nestedAcceptanceBands = compactValidatedInputSchema(z.array(probabilityAcceptanceBandSchema).max(100_000), 'Optional named metric acceptance bands.');
17
- const nestedDiagnosticThresholds = compactValidatedInputSchema(probabilityDiagnosticThresholdsSchema, 'Optional diagnostic thresholds.');
18
- const candidatePool = z.array(z.string().min(1).max(512)).max(100_000).optional();
19
- const outputs = z.array(probabilityOutputSchema).max(10).optional();
20
- const commonShape = {
21
- workspaceId: workspaceIdSchema,
22
- adapter: probabilityAdapterIdSchema.optional(),
23
- scenarioSet: nestedScenarios,
24
- candidatePool,
25
- horizonDays: z.number().positive().max(1_000_000).optional(),
26
- metrics: z.array(probabilityMetricSchema).min(1).max(4).optional(),
27
- acceptanceBands: nestedAcceptanceBands.optional(),
28
- diagnosticThresholds: nestedDiagnosticThresholds.optional(),
29
- outputs,
30
- refresh: z.boolean().optional(),
31
- };
32
- const inspectInput = z
33
- .object({
34
- workspaceId: workspaceIdSchema,
35
- adapter: probabilityAdapterIdSchema.optional(),
36
- source: nestedSource.optional(),
37
- customPoolManifest: nestedManifest.optional(),
38
- candidatePool,
39
- refresh: z.boolean().optional(),
40
- })
41
- .strict()
42
- .superRefine((value, context) => {
43
- if (value.source !== undefined && value.customPoolManifest !== undefined)
44
- context.addIssue({
45
- code: 'custom',
46
- message: 'Provide either source or customPoolManifest',
47
- });
48
- if (value.adapter !== undefined &&
49
- value.source === undefined &&
50
- value.customPoolManifest === undefined)
51
- context.addIssue({
52
- code: 'custom',
53
- message: 'An adapter requires a source; provide a source alone to discover compatible adapters',
54
- });
55
- if (value.customPoolManifest !== undefined &&
56
- value.adapter !== undefined &&
57
- value.adapter !== 'custom_weighted_pool')
58
- context.addIssue({
59
- code: 'custom',
60
- path: ['adapter'],
61
- message: 'customPoolManifest requires adapter custom_weighted_pool',
62
- });
63
- });
64
- const evaluateInput = z
65
- .object({
66
- ...commonShape,
67
- source: nestedSource.optional(),
68
- customPoolManifest: nestedManifest.optional(),
69
- })
70
- .strict()
71
- .superRefine((value, context) => {
72
- if ((value.source === undefined) === (value.customPoolManifest === undefined))
73
- context.addIssue({
74
- code: 'custom',
75
- message: 'Provide exactly one source or customPoolManifest',
76
- });
77
- if (value.customPoolManifest !== undefined &&
78
- value.adapter !== undefined &&
79
- value.adapter !== 'custom_weighted_pool')
80
- context.addIssue({
81
- code: 'custom',
82
- path: ['adapter'],
83
- message: 'customPoolManifest requires adapter custom_weighted_pool',
84
- });
85
- });
86
- const sweepInput = z
87
- .object({
88
- ...commonShape,
89
- source: nestedSource,
90
- sweep: z
91
- .object({
92
- paths: z.array(z.string().min(1).max(1024)).min(1).max(32),
93
- steps: z.number().int().min(2).max(10_000).default(25),
94
- pairwise: z.boolean().default(false),
95
- findRankReversals: z.boolean().default(true),
96
- })
97
- .strict(),
98
- })
99
- .strict();
100
- const simulateInput = z
101
- .object({
102
- ...commonShape,
103
- source: nestedSource,
104
- samples: z.number().int().min(100).max(10_000_000).default(100_000),
105
- seed: z.number().int().min(-2_147_483_648).max(2_147_483_647).default(1),
106
- confidenceLevel: z.number().min(0.5).max(0.9999).default(0.95),
107
- samplingMethod: probabilitySamplingMethodSchema.default('latin_hypercube'),
108
- })
109
- .strict();
110
- const sequenceInput = z
111
- .object({
112
- workspaceId: workspaceIdSchema,
113
- scenarioSet: nestedScenarios,
114
- customPoolManifest: nestedManifest,
115
- horizonDays: z.number().positive().max(1_000_000),
116
- maxSteps: z.number().int().min(1).max(100_000).default(1_000),
117
- samples: z.number().int().min(100).max(10_000_000).default(100_000),
118
- seed: z.number().int().min(-2_147_483_648).max(2_147_483_647).default(1),
119
- confidenceLevel: z.number().min(0.5).max(0.9999).default(0.95),
120
- acceptanceBands: nestedAcceptanceBands.optional(),
121
- diagnosticThresholds: nestedDiagnosticThresholds.optional(),
122
- outputs,
123
- })
124
- .strict();
125
- const compareInput = z
126
- .object({
127
- workspaceId: workspaceIdSchema,
128
- adapter: probabilityAdapterIdSchema.optional(),
129
- before: nestedSource.optional(),
130
- after: nestedSource.optional(),
131
- beforeManifest: nestedManifest.optional(),
132
- afterManifest: nestedManifest.optional(),
133
- scenarioSet: nestedScenarios,
134
- candidatePool,
135
- horizonDays: z.number().positive().max(1_000_000).optional(),
136
- acceptanceBands: nestedAcceptanceBands.optional(),
137
- diagnosticThresholds: nestedDiagnosticThresholds.optional(),
138
- outputs,
139
- refresh: z.boolean().optional(),
140
- })
141
- .strict()
142
- .superRefine((value, context) => {
143
- const sourceMode = value.before !== undefined || value.after !== undefined;
144
- const manifestMode = value.beforeManifest !== undefined || value.afterManifest !== undefined;
145
- if (sourceMode === manifestMode)
146
- context.addIssue({
147
- code: 'custom',
148
- message: 'Compare either before/after sources or beforeManifest/afterManifest',
149
- });
150
- if (sourceMode && (value.before === undefined || value.after === undefined))
151
- context.addIssue({ code: 'custom', message: 'Source comparison requires before and after' });
152
- if (manifestMode && (value.beforeManifest === undefined || value.afterManifest === undefined))
153
- context.addIssue({
154
- code: 'custom',
155
- message: 'Custom-pool comparison requires beforeManifest and afterManifest',
156
- });
157
- if (manifestMode && value.adapter !== undefined && value.adapter !== 'custom_weighted_pool')
158
- context.addIssue({
159
- code: 'custom',
160
- path: ['adapter'],
161
- message: 'Manifest comparison requires adapter custom_weighted_pool',
162
- });
163
- });
164
- const renderInput = z
165
- .object({
166
- workspaceId: workspaceIdSchema,
167
- analysisId: z.string().min(1).max(256),
168
- expectedScenarioHash: sha256Schema.optional(),
169
- outputs: z.array(probabilityOutputSchema).min(1).max(10),
170
- includeHtml: z.boolean().default(false),
171
- filter: nestedRenderFilter.optional(),
172
- })
173
- .strict();
6
+ import { strictOperationResultSchema } from '../server/result.js';
174
7
  const analysisDataSchema = z
175
8
  .object({
176
9
  operation: z.enum(['evaluate', 'sweep', 'simulate', 'sequence', 'compare', 'render']),
@@ -239,323 +72,66 @@ const readOnly = {
239
72
  idempotentHint: true,
240
73
  openWorldHint: false,
241
74
  };
242
- async function requestContext(engine, context, workspaceId, refresh, signal) {
243
- return {
244
- workspaceId: await resolveServerWorkspaceId(engine, context, workspaceId, signal),
245
- ...(context.principal === undefined ? {} : { principal: context.principal }),
246
- ...(refresh === undefined ? {} : { refresh }),
247
- signal,
248
- };
249
- }
250
- function analysisData(result) {
251
- return {
252
- operation: result.operation,
253
- analysisId: result.analysisId,
254
- analysisStatus: result.status,
255
- adapterId: result.adapter.id,
256
- sourceRevision: result.metadata.sourceRevision,
257
- sourceHash: result.metadata.sourceHash,
258
- scenarioHash: result.metadata.scenarioHash,
259
- cacheKey: result.metadata.cacheKey,
260
- scenarios: result.scenarios.length,
261
- candidates: result.scenarios.reduce((sum, scenario) => sum + scenario.candidates.length, 0),
262
- ...(result.scenarios.some(({ scopePools }) => (scopePools?.length ?? 0) > 0)
263
- ? {
264
- scopePools: result.scenarios.reduce((sum, scenario) => sum + (scenario.scopePools?.length ?? 0), 0),
265
- scopePoolCandidates: result.scenarios.reduce((sum, scenario) => sum +
266
- (scenario.scopePools?.reduce((poolSum, pool) => poolSum + pool.candidates.length, 0) ?? 0), 0),
267
- }
268
- : {}),
269
- unresolved: result.unresolved.length,
270
- diagnostics: result.diagnostics.length,
271
- ...(result.sweep === undefined ? {} : { sweepPoints: result.sweep.points.length }),
272
- ...(result.metadata.samples === undefined ? {} : { samples: result.metadata.samples }),
273
- ...(result.sequence === undefined ? {} : { sequenceMethod: result.sequence.method }),
274
- ...(result.comparison === undefined
275
- ? {}
276
- : { comparisonChanges: result.comparison.scenarioChanges.length }),
277
- visualResources: result.resources.filter(({ mimeType }) => mimeType.startsWith('image/'))
278
- .length,
279
- };
280
- }
281
- function analysisServiceResult(workspaceId, result) {
282
- const output = emptyServiceResult(workspaceId, analysisData(result));
283
- output.code =
284
- result.status === 'complete'
285
- ? 'PROBABILITY_ANALYZED'
286
- : result.status === 'stale'
287
- ? result.diagnostics.some(({ code }) => code === 'PROBABILITY_SCENARIO_STALE')
288
- ? 'PROBABILITY_SCENARIO_STALE'
289
- : 'PROBABILITY_ANALYSIS_STALE'
290
- : 'PROBABILITY_ANALYZED_PARTIAL';
291
- output.artifacts = result.resources;
292
- output.diagnostics = result.diagnostics;
293
- output.validation = {
294
- passed: result.status !== 'blocked' && result.status !== 'cancelled',
295
- checks: [
296
- {
297
- id: 'uncertainty-visible',
298
- passed: true,
299
- message: `${result.unresolved.length} unresolved or bounded analysis item(s) are explicit`,
300
- },
301
- ],
302
- };
303
- return output;
304
- }
305
- export function registerProbabilityTools(server, engine, context) {
306
- const analyzer = new ProbabilityAnalyzer(engine);
307
- const cacheLifetime = new IdleCacheLifetime(() => analyzer.clearCaches());
308
- server.registerTool('hoi4.probability_inspect', {
75
+ export const probabilityTaskTools = [
76
+ {
77
+ name: 'hoi4.probability_inspect',
309
78
  title: 'Inspect AI and MTTH weighted logic',
310
79
  description: 'Discover weighted adapters, candidates, provenance, and required inputs.',
311
- inputSchema: inspectInput,
80
+ inputSchema: probabilityInspectRequestSchema,
312
81
  outputSchema: inspectOutput,
313
82
  annotations: readOnly,
314
- }, async (input, extra) => {
315
- const progress = progressReporter(extra);
316
- const base = await requestContext(engine, context, input.workspaceId, input.refresh, progress.signal);
317
- const releaseCaches = cacheLifetime.begin();
318
- try {
319
- await progress.report(0, 2, 'Inspecting weighted source');
320
- const inspected = await analyzer.inspect(base, input.adapter, input.source, input.candidatePool, input.customPoolManifest);
321
- const result = emptyServiceResult(base.workspaceId, {
322
- adapters: inspected.adapters.length,
323
- ...(inspected.surface === undefined
324
- ? {}
325
- : {
326
- adapterId: inspected.surface.adapter.id,
327
- sourceRevision: inspected.surface.sourceRevision,
328
- sourceHash: inspected.surface.sourceHash,
329
- poolComplete: inspected.surface.poolComplete,
330
- }),
331
- ...(inspected.discovery === undefined
332
- ? {}
333
- : {
334
- ...(inspected.discovery.requestedAdapter === undefined
335
- ? {}
336
- : { requestedAdapter: inspected.discovery.requestedAdapter }),
337
- ...(inspected.discovery.suggestedAdapter === undefined
338
- ? {}
339
- : { suggestedAdapter: inspected.discovery.suggestedAdapter }),
340
- discoveryReason: inspected.discovery.reason,
341
- sourceRevision: inspected.discovery.sourceRevision,
342
- sourceHash: inspected.discovery.sourceHash,
343
- }),
344
- candidates: inspected.surface?.candidateCount ?? 0,
345
- availableCandidates: inspected.discovery?.availableAdapters.reduce((sum, { candidateCount }) => sum + candidateCount, 0) ?? 0,
346
- availableAdapters: inspected.discovery?.availableAdapters.map((available) => ({
347
- adapterId: available.adapterId,
348
- candidates: available.candidateCount,
349
- identifierMatches: available.identifierMatchCount,
350
- candidatePoolMatches: available.candidatePoolMatchCount,
351
- })) ?? [],
352
- candidateExamples: inspected.discovery?.exampleCandidateIds ?? [],
353
- requiredInputs: inspected.surface?.requiredInputs.length ?? 0,
354
- unresolved: inspected.surface?.unsupported.length ?? 0,
355
- });
356
- result.code =
357
- inspected.surface !== undefined
358
- ? 'PROBABILITY_SOURCE_INSPECTED'
359
- : inspected.discovery !== undefined
360
- ? 'PROBABILITY_SOURCE_DISCOVERED'
361
- : 'PROBABILITY_ADAPTERS_LISTED';
362
- result.artifacts = inspected.artifacts;
363
- setInlineFilesScanned(result, inspected.filesScanned);
364
- await progress.report(2, 2, 'Weighted source inspection complete');
365
- return toolResult(result);
366
- }
367
- catch (error) {
368
- return errorResult(error, base.workspaceId);
369
- }
370
- finally {
371
- releaseCaches();
372
- }
373
- });
374
- server.registerTool('hoi4.probability_evaluate', {
83
+ },
84
+ {
85
+ name: 'hoi4.probability_evaluate',
375
86
  title: 'Evaluate AI and MTTH scenarios',
376
87
  description: 'Evaluate weights and probabilities under explicit scenarios.',
377
- inputSchema: evaluateInput,
88
+ inputSchema: probabilityEvaluateRequestSchema,
378
89
  outputSchema: analysisOutput,
379
90
  annotations: readOnly,
380
- }, async (input, extra) => {
381
- const progress = progressReporter(extra);
382
- const base = await requestContext(engine, context, input.workspaceId, input.refresh, progress.signal);
383
- const releaseCaches = cacheLifetime.begin();
384
- try {
385
- await progress.report(0, 3, 'Scanning and evaluating weighted source');
386
- const request = {
387
- ...base,
388
- ...input,
389
- workspaceId: base.workspaceId,
390
- };
391
- const analyzed = await analyzer.evaluate(request);
392
- await progress.report(3, 3, 'Scenario evaluation complete');
393
- return toolResult(analysisServiceResult(base.workspaceId, analyzed));
394
- }
395
- catch (error) {
396
- return errorResult(error, base.workspaceId);
397
- }
398
- finally {
399
- releaseCaches();
400
- }
401
- });
402
- server.registerTool('hoi4.probability_sweep', {
91
+ },
92
+ {
93
+ name: 'hoi4.probability_sweep',
403
94
  title: 'Sweep AI and MTTH parameters',
404
95
  description: 'Evaluate declared ranges, breakpoints, and rank reversals.',
405
- inputSchema: sweepInput,
96
+ inputSchema: probabilitySweepRequestSchema,
406
97
  outputSchema: analysisOutput,
407
98
  annotations: readOnly,
408
- }, async (input, extra) => {
409
- const progress = progressReporter(extra);
410
- const base = await requestContext(engine, context, input.workspaceId, input.refresh, progress.signal);
411
- const releaseCaches = cacheLifetime.begin();
412
- try {
413
- await progress.report(0, 3, 'Evaluating parameter sweep');
414
- const request = {
415
- ...base,
416
- ...input,
417
- workspaceId: base.workspaceId,
418
- };
419
- const analyzed = await analyzer.sweep(request);
420
- await progress.report(3, 3, 'Parameter sweep complete');
421
- return toolResult(analysisServiceResult(base.workspaceId, analyzed));
422
- }
423
- catch (error) {
424
- return errorResult(error, base.workspaceId);
425
- }
426
- finally {
427
- releaseCaches();
428
- }
429
- });
430
- server.registerTool('hoi4.probability_simulate', {
99
+ },
100
+ {
101
+ name: 'hoi4.probability_simulate',
431
102
  title: 'Simulate uncertain weighted scenarios',
432
103
  description: 'Run seeded simulations with distributions and confidence intervals.',
433
- inputSchema: simulateInput,
104
+ inputSchema: probabilitySimulateRequestSchema,
434
105
  outputSchema: analysisOutput,
435
106
  annotations: readOnly,
436
- }, async (input, extra) => {
437
- const progress = progressReporter(extra);
438
- const base = await requestContext(engine, context, input.workspaceId, input.refresh, progress.signal);
439
- const releaseCaches = cacheLifetime.begin();
440
- try {
441
- await progress.report(0, input.samples, 'Sampling uncertain scenarios');
442
- const request = {
443
- ...base,
444
- ...input,
445
- workspaceId: base.workspaceId,
446
- };
447
- const analyzed = await analyzer.simulate(request);
448
- await progress.report(input.samples, input.samples, 'Seeded simulation complete');
449
- return toolResult(analysisServiceResult(base.workspaceId, analyzed));
450
- }
451
- catch (error) {
452
- return errorResult(error, base.workspaceId);
453
- }
454
- finally {
455
- releaseCaches();
456
- }
457
- });
458
- server.registerTool('hoi4.probability_sequence', {
107
+ },
108
+ {
109
+ name: 'hoi4.probability_sequence',
459
110
  title: 'Analyze a declared weighted sequence',
460
111
  description: 'Analyze a manifest-declared dynamic weighted sequence.',
461
- inputSchema: sequenceInput,
112
+ inputSchema: probabilitySequenceRequestSchema,
462
113
  outputSchema: analysisOutput,
463
114
  annotations: readOnly,
464
- }, async (input, extra) => {
465
- const progress = progressReporter(extra);
466
- const base = await requestContext(engine, context, input.workspaceId, undefined, progress.signal);
467
- const releaseCaches = cacheLifetime.begin();
468
- try {
469
- await progress.report(0, input.maxSteps, 'Analyzing declared sequence');
470
- const request = {
471
- ...base,
472
- ...input,
473
- workspaceId: base.workspaceId,
474
- };
475
- const analyzed = await analyzer.sequence(request);
476
- await progress.report(input.maxSteps, input.maxSteps, 'Sequence analysis complete');
477
- return toolResult(analysisServiceResult(base.workspaceId, analyzed));
478
- }
479
- catch (error) {
480
- return errorResult(error, base.workspaceId);
481
- }
482
- finally {
483
- releaseCaches();
484
- }
485
- });
486
- server.registerTool('hoi4.probability_compare', {
115
+ },
116
+ {
117
+ name: 'hoi4.probability_compare',
487
118
  title: 'Compare weighted source patches',
488
119
  description: 'Compare sources or declared pools under identical scenarios.',
489
- inputSchema: compareInput,
120
+ inputSchema: probabilityCompareRequestSchema,
490
121
  outputSchema: analysisOutput,
491
122
  annotations: readOnly,
492
- }, async (input, extra) => {
493
- const progress = progressReporter(extra);
494
- const base = await requestContext(engine, context, input.workspaceId, input.refresh, progress.signal);
495
- const releaseCaches = cacheLifetime.begin();
496
- try {
497
- await progress.report(0, 4, 'Comparing weighted source');
498
- const request = {
499
- ...base,
500
- ...input,
501
- workspaceId: base.workspaceId,
502
- };
503
- const analyzed = await analyzer.compare(request);
504
- await progress.report(4, 4, 'Weighted source comparison complete');
505
- return toolResult(analysisServiceResult(base.workspaceId, analyzed));
506
- }
507
- catch (error) {
508
- return errorResult(error, base.workspaceId);
509
- }
510
- finally {
511
- releaseCaches();
512
- }
513
- });
514
- server.registerTool('hoi4.probability_render', {
123
+ },
124
+ {
125
+ name: 'hoi4.probability_render',
515
126
  title: 'Render AI and MTTH analysis',
516
- description: 'Render cached probability analysis as deterministic resources.',
517
- inputSchema: renderInput,
127
+ description: 'Render retained probability analysis as deterministic resources.',
128
+ inputSchema: probabilityRenderRequestSchema,
518
129
  outputSchema: analysisOutput,
519
130
  annotations: readOnly,
520
- }, async (input, extra) => {
521
- const progress = progressReporter(extra);
522
- const base = await requestContext(engine, context, input.workspaceId, undefined, progress.signal);
523
- const releaseCaches = cacheLifetime.begin();
524
- try {
525
- await progress.report(0, input.outputs.length, 'Rendering analysis resources');
526
- const request = {
527
- ...base,
528
- ...input,
529
- workspaceId: base.workspaceId,
530
- outputs: input.outputs.filter((output) => output !== 'json'),
531
- };
532
- const analyzed = await analyzer.render(request);
533
- await progress.report(input.outputs.length, input.outputs.length, 'Analysis rendering complete');
534
- return toolResult(analysisServiceResult(base.workspaceId, analyzed));
535
- }
536
- catch (error) {
537
- return errorResult(error, base.workspaceId);
538
- }
539
- finally {
540
- releaseCaches();
541
- }
542
- });
543
- server.registerPrompt('hoi4.probability_analysis', {
544
- title: 'Analyze HOI4 weighted logic',
545
- description: 'Plan one source-linked AI, MTTH, random, or declared-pool analysis and return to the owning modding workflow.',
546
- argsSchema: {
547
- objective: z.string().min(1).max(4096),
548
- sourceHint: z.string().max(1024).optional(),
549
- },
550
- }, ({ objective, sourceHint }) => ({
551
- messages: [
552
- {
553
- role: 'user',
554
- content: {
555
- type: 'text',
556
- text: `Analyze this HOI4 weighted-logic task: ${objective}${sourceHint === undefined ? '' : `\nSource hint: ${sourceHint}`}\nIdentify the exact weighted surface and adapter, declare representative world-state scenarios and every required candidate or external factor, inspect first, run the narrowest useful evaluate/sweep/simulate/sequence/compare operation, review linked uncertainty and provenance, then return the findings to the normal owning modding workflow. Do not infer missing state, execute effects, or edit source through probability tools.`,
557
- },
558
- },
559
- ],
560
- }));
131
+ },
132
+ ];
133
+ export function registerProbabilityTools(server) {
134
+ registerLegacyTaskTools(server, probabilityTaskTools);
135
+ const { name, ...metadata } = probabilityPromptDefinition;
136
+ server.registerPrompt(name, { ...metadata, argsSchema: probabilityPromptArguments.shape }, probabilityPrompt);
561
137
  }