getcompetitive 5.0.0 → 6.0.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.
package/README.md CHANGED
@@ -30,7 +30,7 @@ Built on [`@pkmn/dex`](https://github.com/pkmn/EPOKe) (Showdown data) and
30
30
 
31
31
  ## Tools
32
32
 
33
- Eight compound tools; each dispatches on a `mode` field where the name alone is ambiguous.
33
+ Eight compound tools; each dispatches on a `mode` field where the name alone is ambiguous, and each accepts `detail: "compact" | "evidence" | "debug"` — compact by default, so responses carry conclusions and the numbers needed to reason, and you ask for ranges, benchmarks and provenance only when the reasoning needs them.
34
34
 
35
35
  | Tool | Purpose | Modes |
36
36
  | --- | --- | --- |
@@ -144,6 +144,7 @@ npm test # builds and drives every tool over real MCP stdio, plus the HTTP ent
144
144
  - `calculate` `{ "mode": "damage", "attacker": { "species": "Garchomp", "level": 50, "nature": "Jolly", "evs": { "atk": 252, "spe": 252 }, "item": "Choice Band" }, "defender": { "species": "Corviknight", "level": 50, "nature": "Impish", "evs": { "hp": 252, "def": 252 } }, "move": "Dragon Claw" }`
145
145
  - `team_io` `{ "mode": "legality", "regulation": "m-c", "team": [ { "species": "Garchomp", "item": "Choice Band" } ] }`
146
146
  - `analyze_team` `{ "mode": "synergy", "team": [ { "species": "Garchomp", "moves": ["Earthquake", "Dragon Claw", "Rock Slide"] } ], "regulation": "m-c" }`
147
+ - `analyze_team` `{ "mode": "synergy", "team": [...], "regulation": "m-c", "detail": "evidence" }` → adds the per-type tables; `"debug"` adds the `engine` provenance block
147
148
  - `team_io` `{ "mode": "parse", "text": "Garchomp @ Choice Scarf | Rough Skin | Jolly | 252 Atk / 252 Spe | Earthquake / Dragon Claw" }`
148
149
  - `analyze_team` `{ "mode": "diagnose", "team": [ { "species": "Garchomp", "nature": "Jolly", "evs": { "atk": 252, "spe": 252 } } ], "goal": "improve against the current meta" }`
149
150
  - `prepare_matchup` `{ "team": [ { "species": "Garchomp" } ], "opponent": ["Sneasler", "Salamence-Mega", "Gholdengo"] }`
@@ -37,6 +37,7 @@ import { registerReplayTool } from './replay.js';
37
37
  import { registerInferTool } from './infer.js';
38
38
  import { registerOptimizeTeamTool } from './optimize.js';
39
39
  import { READ_ONLY_ANNOTATIONS } from '../result.js';
40
+ import { detailArg, applyLevel, LEVEL_SPECS } from './levels.js';
40
41
  /** mode -> underlying tool name, per compound entrypoint. */
41
42
  const COMPOUND = {
42
43
  lookup: {
@@ -117,18 +118,31 @@ export function registerCompoundTools(server) {
117
118
  server.registerTool(plainName, {
118
119
  title: def.title,
119
120
  description: def.description,
120
- inputSchema: def.inputSchema,
121
- outputSchema: def.outputSchema,
121
+ inputSchema: z.object({ detail: detailArg, ...getObjectShape(def.inputSchema) }),
122
122
  annotations: READ_ONLY_ANNOTATIONS,
123
- }, (args) => {
123
+ }, async (args) => {
124
124
  const parsed = args;
125
- return def.handler(parsed);
125
+ const result = await def.handler(parsed);
126
+ if (result.structuredContent && def.outputSchema) {
127
+ const check = def.outputSchema.safeParse(result.structuredContent);
128
+ if (!check.success) {
129
+ throw new Error(`produced output outside its schema: ${JSON.stringify(check.error).slice(0, 200)}`);
130
+ }
131
+ }
132
+ if (result.structuredContent && !result.isError) {
133
+ const shaped = applyLevel(LEVEL_SPECS[target], result.structuredContent, parsed.detail, target);
134
+ if (shaped !== result.structuredContent) {
135
+ return { content: [{ type: 'text', text: JSON.stringify(shaped, null, 2) }], structuredContent: shaped };
136
+ }
137
+ }
138
+ return result;
126
139
  });
127
140
  }
128
141
  for (const [name, modes] of Object.entries(COMPOUND)) {
129
142
  const modeNames = Object.keys(modes);
130
143
  const variants = modeNames.map((mode) => z.object({
131
144
  mode: z.literal(mode).describe(`Run ${modes[mode]}'s operation.`),
145
+ detail: detailArg,
132
146
  ...getObjectShape(defs[modes[mode]].inputSchema),
133
147
  }));
134
148
  const inputSchema = z.union(variants);
@@ -154,6 +168,12 @@ export function registerCompoundTools(server) {
154
168
  throw new Error(`mode ${parsed.mode} produced output outside its schema: ${JSON.stringify(check.error).slice(0, 200)}`);
155
169
  }
156
170
  }
171
+ if (result.structuredContent && !result.isError) {
172
+ const shaped = applyLevel(LEVEL_SPECS[modes[parsed.mode]], result.structuredContent, parsed.detail, parsed.mode);
173
+ if (shaped !== result.structuredContent) {
174
+ return { content: [{ type: 'text', text: JSON.stringify(shaped, null, 2) }], structuredContent: shaped };
175
+ }
176
+ }
157
177
  return result;
158
178
  });
159
179
  }
@@ -1 +1 @@
1
- {"version":3,"file":"compound.js","sourceRoot":"","sources":["../../src/tools/compound.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"compound.js","sourceRoot":"","sources":["../../src/tools/compound.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,158 @@
1
+ /**
2
+ * Response levels: compact (default), evidence, debug — the token-efficiency
3
+ * half of the north star. Every compound tool accepts `detail`; the compound
4
+ * layer filters each mode's result through a declarative field-tier spec, so
5
+ * the engines themselves stay untouched.
6
+ *
7
+ * Tier semantics:
8
+ * compact conclusions and the numbers needed to reason (default)
9
+ * evidence compact plus ranges, benchmarks, assumptions and per-row detail
10
+ * debug everything, plus an `engine` block with the data version
11
+ *
12
+ * A mode with no spec returns its full payload at every level — its data is
13
+ * already the answer (species lookups, regulations, pastes). Specs exist only
14
+ * where compaction pays: the heavy analysis outputs.
15
+ */
16
+ import { z } from 'zod';
17
+ import { readFileSync } from 'node:fs';
18
+ export const detailArg = z
19
+ .enum(['compact', 'evidence', 'debug'])
20
+ .optional()
21
+ .describe('How much detail to return: "compact" (default) gives conclusions and the numbers needed to reason; "evidence" adds ranges, benchmarks and per-row detail; "debug" adds provenance and every intermediate. Ask for more only when the reasoning actually needs it — model context is the expensive resource.');
22
+ const VERSION = JSON.parse(readFileSync(new URL('../../package.json', import.meta.url), 'utf8')).version;
23
+ function pickFields(source, keep) {
24
+ const out = {};
25
+ for (const k of keep)
26
+ if (k in source)
27
+ out[k] = source[k];
28
+ return out;
29
+ }
30
+ /** Apply a keep-list at `path` into a value, projecting array elements along the way. */
31
+ function projectInto(value, path, keep) {
32
+ if (Array.isArray(value)) {
33
+ return value.map((row) => (row && typeof row === 'object' ? projectInto(row, path, keep) : row));
34
+ }
35
+ if (value && typeof value === 'object') {
36
+ const obj = value;
37
+ if (path.length === 0)
38
+ return pickFields(obj, keep);
39
+ const [head, ...rest] = path;
40
+ const next = obj[head];
41
+ if (next === undefined)
42
+ return obj;
43
+ return { ...obj, [head]: projectInto(next, rest, keep) };
44
+ }
45
+ return value;
46
+ }
47
+ /**
48
+ * Filter one mode's payload to the requested level. `data` is the inner
49
+ * tool's structuredContent; the returned object becomes the response, with
50
+ * the text regenerated by the caller.
51
+ */
52
+ export function applyLevel(spec, data, detail, mode) {
53
+ const level = detail ?? 'compact';
54
+ if (!spec || level === 'debug') {
55
+ if (level === 'debug')
56
+ return { ...data, engine: { version: VERSION, mode } };
57
+ return data;
58
+ }
59
+ const allowed = new Set([...(spec.compact ?? []), ...(level === 'evidence' ? (spec.evidence ?? []) : [])]);
60
+ const elementPaths = spec.elements ?? {};
61
+ const trimElements = level === 'compact';
62
+ const out = {};
63
+ for (const [key, value] of Object.entries(data)) {
64
+ if (!allowed.has(key))
65
+ continue;
66
+ let projected = value;
67
+ if (trimElements) {
68
+ for (const [path, keep] of Object.entries(elementPaths)) {
69
+ if (path === key)
70
+ projected = projectInto(projected, [], keep);
71
+ else if (path.startsWith(`${key}.`))
72
+ projected = projectInto(projected, path.slice(key.length + 1).split('.'), keep);
73
+ }
74
+ }
75
+ out[key] = projected;
76
+ }
77
+ return out;
78
+ }
79
+ /**
80
+ * Field tiers per mode. Unlisted fields are debug-tier. Modes absent here
81
+ * return their full payload at every level.
82
+ */
83
+ export const LEVEL_SPECS = {
84
+ analyze_team: {
85
+ compact: ['atRiskTypes', 'score', 'speed', 'threatCoverage', 'bringFour'],
86
+ evidence: ['team', 'defensiveWeaknesses', 'offensiveCoverage', 'unknownMoves'],
87
+ elements: {
88
+ 'threatCoverage.threats': ['species', 'usage', 'hitMultiplier', 'answerClass', 'answerBy'],
89
+ 'threatCoverage.unanswered': ['species'],
90
+ },
91
+ },
92
+ diagnose_team: {
93
+ compact: ['problems', 'candidateChanges'],
94
+ evidence: ['regulation', 'goal', 'unknownMoves', 'note'],
95
+ elements: {
96
+ problems: ['statement', 'severity'],
97
+ candidateChanges: ['kind', 'change', 'confidence'],
98
+ },
99
+ },
100
+ prepare_matchup: {
101
+ compact: ['regulation', 'opponent', 'recommendedBringFour', 'matchupConfidence', 'winConditions', 'lossConditions', 'pokemonToPreserve'],
102
+ evidence: ['likelySets', 'speedTiers', 'relevantDamageCalcs', 'possibleLeads', 'dangerousOpponentLeads', 'note'],
103
+ elements: {
104
+ 'recommendedBringFour.picks': ['species', 'score'],
105
+ 'recommendedBringFour.leftBehind': ['species'],
106
+ 'recommendedBringFour.alternates': ['species'],
107
+ 'matchupConfidence': ['score'],
108
+ },
109
+ },
110
+ infer_set: {
111
+ compact: ['priorSets', 'survivingSets', 'candidates'],
112
+ evidence: ['constraints', 'regulation', 'note'],
113
+ elements: {
114
+ candidates: ['item', 'ability', 'nature', 'speed', 'probability'],
115
+ },
116
+ },
117
+ analyze_replay: {
118
+ compact: ['players', 'winner', 'turns', 'teams', 'kos', 'typeRead'],
119
+ evidence: ['teamSize', 'speedConstraints', 'damageEvents', 'unresolvedSpecies', 'note'],
120
+ elements: {
121
+ kos: ['turn', 'move', 'attacker', 'defender'],
122
+ },
123
+ },
124
+ calculate_damage: {
125
+ compact: ['move', 'damageRange', 'koChance', 'description'],
126
+ evidence: ['attacker', 'defender', 'field'],
127
+ },
128
+ calculate_matchups: {
129
+ compact: ['attacker', 'attackerSpeed', 'move'],
130
+ evidence: [],
131
+ elements: {
132
+ matchups: ['defender', 'bestMove', 'damageRange', 'koChance', 'immune'],
133
+ },
134
+ },
135
+ check_speed: {
136
+ compact: ['species', 'level', 'nature', 'finalSpeed', 'modifiers'],
137
+ evidence: ['baseSpe', 'evSpe', 'ivSpe', 'comparison'],
138
+ },
139
+ parse_team: {
140
+ compact: [],
141
+ evidence: ['warnings', 'note'],
142
+ elements: {
143
+ team: ['species', 'item', 'ability', 'nature', 'evs', 'championsPoints', 'moves'],
144
+ },
145
+ },
146
+ check_legality: {
147
+ compact: ['regulation', 'valid', 'violations'],
148
+ evidence: ['status', 'teamSize', 'members', 'mega'],
149
+ },
150
+ optimize_team: {
151
+ compact: ['regulation', 'constraints', 'recommendations'],
152
+ evidence: ['note'],
153
+ elements: {
154
+ 'recommendations': ['members', 'score', 'reasons'],
155
+ },
156
+ },
157
+ };
158
+ //# sourceMappingURL=levels.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"levels.js","sourceRoot":"","sources":["../../src/tools/levels.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "getcompetitive",
3
- "version": "5.0.0",
3
+ "version": "6.0.0",
4
4
  "description": "MCP server exposing competitive Pokemon data and battle mechanics for team building and decision making",
5
5
  "type": "module",
6
6
  "bin": {