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 +2 -1
- package/dist/tools/compound.js +24 -4
- package/dist/tools/compound.js.map +1 -1
- package/dist/tools/levels.js +158 -0
- package/dist/tools/levels.js.map +1 -0
- package/package.json +1 -1
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"] }`
|
package/dist/tools/compound.js
CHANGED
|
@@ -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
|
-
|
|
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":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,cAAc,EAAE,MAAM,gDAAgD,CAAC;AAChF,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AACpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,EAAE,wBAAwB,EAAE,MAAM,eAAe,CAAC;AACzD,OAAO,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"compound.js","sourceRoot":"","sources":["../../src/tools/compound.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,cAAc,EAAE,MAAM,gDAAgD,CAAC;AAChF,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AACpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,EAAE,wBAAwB,EAAE,MAAM,eAAe,CAAC;AACzD,OAAO,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AACrD,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAUjE,6DAA6D;AAC7D,MAAM,QAAQ,GAA2C;IACvD,MAAM,EAAE;QACN,OAAO,EAAE,aAAa;QACtB,KAAK,EAAE,YAAY;QACnB,MAAM,EAAE,YAAY;QACpB,IAAI,EAAE,UAAU;QAChB,IAAI,EAAE,UAAU;QAChB,OAAO,EAAE,aAAa;QACtB,MAAM,EAAE,YAAY;QACpB,QAAQ,EAAE,cAAc;QACxB,IAAI,EAAE,UAAU;QAChB,OAAO,EAAE,kBAAkB;QAC3B,OAAO,EAAE,aAAa;KACvB;IACD,SAAS,EAAE;QACT,KAAK,EAAE,iBAAiB;QACxB,MAAM,EAAE,kBAAkB;QAC1B,QAAQ,EAAE,oBAAoB;QAC9B,KAAK,EAAE,aAAa;QACpB,YAAY,EAAE,cAAc;KAC7B;IACD,YAAY,EAAE;QACZ,OAAO,EAAE,cAAc;QACvB,QAAQ,EAAE,eAAe;KAC1B;IACD,cAAc,EAAE;QACd,MAAM,EAAE,gBAAgB;QACxB,KAAK,EAAE,WAAW;KACnB;IACD,YAAY,EAAE;QACZ,OAAO,EAAE,cAAc;QACvB,OAAO,EAAE,cAAc;QACvB,GAAG,EAAE,SAAS;KACf;IACD,OAAO,EAAE;QACP,KAAK,EAAE,YAAY;QACnB,MAAM,EAAE,aAAa;QACrB,QAAQ,EAAE,gBAAgB;QAC1B,UAAU,EAAE,gBAAgB;QAC5B,WAAW,EAAE,kBAAkB;KAChC;CACF,CAAC;AAEF,4EAA4E;AAC5E,MAAM,KAAK,GAA2B;IACpC,aAAa,EAAE,eAAe;IAC9B,eAAe,EAAE,iBAAiB;CACnC,CAAC;AAEF,MAAM,YAAY,GAA2B;IAC3C,MAAM,EACJ,yjBAAyjB;IAC3jB,SAAS,EACP,obAAob;IACtb,YAAY,EACV,0cAA0c;IAC5c,cAAc,EACZ,2XAA2X;IAC7X,YAAY,EACV,+VAA+V;IACjW,OAAO,EACL,saAAsa;CACza,CAAC;AAEF,SAAS,OAAO;IACd,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC;IAChE,iBAAiB,CAAC,MAAM,CAAC,CAAC;IAC1B,iBAAiB,CAAC,MAAM,CAAC,CAAC;IAC1B,uBAAuB,CAAC,MAAM,CAAC,CAAC;IAChC,oBAAoB,CAAC,MAAM,CAAC,CAAC;IAC7B,iBAAiB,CAAC,MAAM,CAAC,CAAC;IAC1B,iBAAiB,CAAC,MAAM,CAAC,CAAC;IAC1B,kBAAkB,CAAC,MAAM,CAAC,CAAC;IAC3B,mBAAmB,CAAC,MAAM,CAAC,CAAC;IAC5B,mBAAmB,CAAC,MAAM,CAAC,CAAC;IAC5B,kBAAkB,CAAC,MAAM,CAAC,CAAC;IAC3B,iBAAiB,CAAC,MAAM,CAAC,CAAC;IAC1B,wBAAwB,CAAC,MAAM,CAAC,CAAC;IAIjC,MAAM,eAAe,GAAI,MAA8D,CAAC,gBAAgB,CAAC;IACzG,OAAO,eAAe,CAAC;AACzB,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,MAAiB;IACrD,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;IAEvB,KAAK,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACxD,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC;QACzB,MAAM,CAAC,YAAY,CACjB,SAAS,EACT;YACE,KAAK,EAAE,GAAG,CAAC,KAAK;YAChB,WAAW,EAAE,GAAG,CAAC,WAAW;YAC5B,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,GAAI,cAAc,CAAC,GAAG,CAAC,WAAW,CAAuB,EAAE,CAAC;YACvG,WAAW,EAAE,qBAAqB;SACnC,EACD,KAAK,EAAE,IAAI,EAAE,EAAE;YAEb,MAAM,MAAM,GAAG,IAAiB,CAAC;YACjC,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YACzC,IAAI,MAAM,CAAC,iBAAiB,IAAI,GAAG,CAAC,YAAY,EAAE,CAAC;gBACjD,MAAM,KAAK,GAAG,GAAG,CAAC,YAAY,CAAC,SAAS,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC;gBACnE,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;oBACnB,MAAM,IAAI,KAAK,CAAC,uCAAuC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;gBACtG,CAAC;YACH,CAAC;YACD,IAAI,MAAM,CAAC,iBAAiB,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;gBAChD,MAAM,MAAM,GAAG,UAAU,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;gBAChG,IAAI,MAAM,KAAK,MAAM,CAAC,iBAAiB,EAAE,CAAC;oBACxC,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,iBAAiB,EAAE,MAAM,EAAE,CAAC;gBAC3G,CAAC;YACH,CAAC;YACD,OAAO,MAAM,CAAC;QAChB,CAAC,CACF,CAAC;IACJ,CAAC;IAED,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;QACrD,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACrC,MAAM,QAAQ,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CACtC,CAAC,CAAC,MAAM,CAAC;YACP,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,OAAO,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC;YACjE,MAAM,EAAE,SAAS;YACjB,GAAI,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW,CAAuB;SACxE,CAAC,CAC6C,CAAC;QAClD,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QACtC,MAAM,CAAC,YAAY,CACjB,IAAI,EACJ;YACE,KAAK,EAAE,IAAI;iBACR,KAAK,CAAC,GAAG,CAAC;iBACV,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;iBAC3C,IAAI,CAAC,GAAG,CAAC;YACZ,WAAW,EAAE,YAAY,CAAC,IAAI,CAAC;YAC/B,WAAW;YACX,WAAW,EAAE,qBAAqB;SACnC,EACD,KAAK,EAAE,IAAI,EAAE,EAAE;YAIb,MAAM,MAAM,GAAG,IAAoB,CAAC;YACpC,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;YACrC,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YACzC,yEAAyE;YACzE,yEAAyE;YACzE,yEAAyE;YACzE,0EAA0E;YAC1E,IAAI,MAAM,CAAC,iBAAiB,IAAI,GAAG,CAAC,YAAY,EAAE,CAAC;gBACjD,MAAM,KAAK,GAAG,GAAG,CAAC,YAAY,CAAC,SAAS,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC;gBACnE,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;oBACnB,MAAM,IAAI,KAAK,CAAC,QAAQ,MAAM,CAAC,IAAI,wCAAwC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;gBAC1H,CAAC;YACH,CAAC;YACD,IAAI,MAAM,CAAC,iBAAiB,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;gBAChD,MAAM,MAAM,GAAG,UAAU,CAAC,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,MAAM,CAAC,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;gBACjH,IAAI,MAAM,KAAK,MAAM,CAAC,iBAAiB,EAAE,CAAC;oBACxC,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,iBAAiB,EAAE,MAAM,EAAE,CAAC;gBAC3G,CAAC;YACH,CAAC;YACD,OAAO,MAAM,CAAC;QAChB,CAAC,CACF,CAAC;IACJ,CAAC;AACH,CAAC"}
|
|
@@ -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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"}
|