@mcptoolshop/roll 1.0.0 → 2.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/CHANGELOG.md +64 -0
- package/README.md +105 -137
- package/dist/analyze/distribution.d.ts.map +1 -1
- package/dist/analyze/distribution.js +249 -33
- package/dist/analyze/distribution.js.map +1 -1
- package/dist/bridge/handler.d.ts +14 -0
- package/dist/bridge/handler.d.ts.map +1 -0
- package/dist/bridge/handler.js +163 -0
- package/dist/bridge/handler.js.map +1 -0
- package/dist/bridge/protocol.d.ts +53 -0
- package/dist/bridge/protocol.d.ts.map +1 -0
- package/dist/bridge/protocol.js +8 -0
- package/dist/bridge/protocol.js.map +1 -0
- package/dist/bridge/server.d.ts +3 -0
- package/dist/bridge/server.d.ts.map +1 -0
- package/dist/bridge/server.js +71 -0
- package/dist/bridge/server.js.map +1 -0
- package/dist/display/format.d.ts.map +1 -1
- package/dist/display/format.js +28 -3
- package/dist/display/format.js.map +1 -1
- package/dist/engine/pipeline.d.ts +27 -0
- package/dist/engine/pipeline.d.ts.map +1 -0
- package/dist/engine/pipeline.js +304 -0
- package/dist/engine/pipeline.js.map +1 -0
- package/dist/engine/roller.d.ts +3 -0
- package/dist/engine/roller.d.ts.map +1 -1
- package/dist/engine/roller.js +82 -125
- package/dist/engine/roller.js.map +1 -1
- package/dist/index.d.ts +9 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +9 -1
- package/dist/index.js.map +1 -1
- package/dist/mcp/server.d.ts +3 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +182 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/mcp/tools.d.ts +12 -0
- package/dist/mcp/tools.d.ts.map +1 -0
- package/dist/mcp/tools.js +106 -0
- package/dist/mcp/tools.js.map +1 -0
- package/dist/parser/ast.d.ts +7 -1
- package/dist/parser/ast.d.ts.map +1 -1
- package/dist/parser/lexer.d.ts.map +1 -1
- package/dist/parser/lexer.js +138 -45
- package/dist/parser/lexer.js.map +1 -1
- package/dist/parser/parser.d.ts.map +1 -1
- package/dist/parser/parser.js +107 -15
- package/dist/parser/parser.js.map +1 -1
- package/dist/parser/tokens.d.ts +14 -0
- package/dist/parser/tokens.d.ts.map +1 -1
- package/dist/parser/tokens.js +22 -0
- package/dist/parser/tokens.js.map +1 -1
- package/dist/tables/conditions.d.ts +7 -0
- package/dist/tables/conditions.d.ts.map +1 -0
- package/dist/tables/conditions.js +65 -0
- package/dist/tables/conditions.js.map +1 -0
- package/dist/tables/engine.d.ts +10 -0
- package/dist/tables/engine.d.ts.map +1 -0
- package/dist/tables/engine.js +147 -0
- package/dist/tables/engine.js.map +1 -0
- package/dist/tables/schema.d.ts +89 -0
- package/dist/tables/schema.d.ts.map +1 -0
- package/dist/tables/schema.js +3 -0
- package/dist/tables/schema.js.map +1 -0
- package/dist/tables/validate.d.ts +4 -0
- package/dist/tables/validate.d.ts.map +1 -0
- package/dist/tables/validate.js +98 -0
- package/dist/tables/validate.js.map +1 -0
- package/package.json +12 -2
package/dist/engine/roller.d.ts
CHANGED
|
@@ -4,11 +4,14 @@ export interface DieResult {
|
|
|
4
4
|
value: number;
|
|
5
5
|
kept: boolean;
|
|
6
6
|
exploded: boolean;
|
|
7
|
+
rerolledFrom?: number;
|
|
8
|
+
critical?: "success" | "failure";
|
|
7
9
|
}
|
|
8
10
|
export interface DiceGroupResult {
|
|
9
11
|
expression: string;
|
|
10
12
|
dice: DieResult[];
|
|
11
13
|
total: number;
|
|
14
|
+
resultMode: "sum" | "success_count";
|
|
12
15
|
}
|
|
13
16
|
export interface RollResult {
|
|
14
17
|
expression: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"roller.d.ts","sourceRoot":"","sources":["../../src/engine/roller.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,
|
|
1
|
+
{"version":3,"file":"roller.d.ts","sourceRoot":"","sources":["../../src/engine/roller.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAuB,MAAM,kBAAkB,CAAC;AACrE,OAAO,EAAa,KAAK,KAAK,EAAE,MAAM,aAAa,CAAC;AAGpD,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,OAAO,CAAC;IACd,QAAQ,EAAE,OAAO,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,SAAS,GAAG,SAAS,CAAC;CAClC;AAED,MAAM,WAAW,eAAe;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,SAAS,EAAE,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,KAAK,GAAG,eAAe,CAAC;CACrC;AAED,MAAM,WAAW,UAAU;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,eAAe,EAAE,CAAC;CAC3B;AA6FD,wBAAgB,QAAQ,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,GAAE,KAAiB,GAAG,UAAU,CAsCzE"}
|
package/dist/engine/roller.js
CHANGED
|
@@ -1,135 +1,92 @@
|
|
|
1
1
|
import { cryptoRng } from "./random.js";
|
|
2
|
-
|
|
3
|
-
function
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
2
|
+
import { runPipeline } from "./pipeline.js";
|
|
3
|
+
function pipelineDieToDieResult(d) {
|
|
4
|
+
const result = {
|
|
5
|
+
value: d.value,
|
|
6
|
+
kept: d.kept,
|
|
7
|
+
exploded: d.exploded,
|
|
8
|
+
};
|
|
9
|
+
if (d.rerolledFrom !== undefined)
|
|
10
|
+
result.rerolledFrom = d.rerolledFrom;
|
|
11
|
+
if (d.critical !== undefined)
|
|
12
|
+
result.critical = d.critical;
|
|
13
|
+
return result;
|
|
9
14
|
}
|
|
10
|
-
function
|
|
11
|
-
if (sides === "F") {
|
|
12
|
-
return rng(0, 2) - 1; // -1, 0, +1
|
|
13
|
-
}
|
|
14
|
-
const max = sides === "%" ? 100 : sides;
|
|
15
|
-
return rng(1, max);
|
|
16
|
-
}
|
|
17
|
-
function rollDiceGroup(node, rng) {
|
|
18
|
-
const maxSide = resolveSides(node.sides);
|
|
19
|
-
const isFate = node.sides === "F";
|
|
20
|
-
// Determine explosion settings
|
|
21
|
-
const explodeMod = node.modifiers.find((m) => m.kind === "explode");
|
|
22
|
-
const explodeThreshold = explodeMod
|
|
23
|
-
? explodeMod.value ?? (isFate ? undefined : maxSide)
|
|
24
|
-
: undefined;
|
|
25
|
-
// Roll initial dice
|
|
26
|
-
const rawRolls = [];
|
|
27
|
-
for (let i = 0; i < node.count; i++) {
|
|
28
|
-
let roll = rollSingleDie(node.sides, rng);
|
|
29
|
-
rawRolls.push(roll);
|
|
30
|
-
// Handle exploding
|
|
31
|
-
if (explodeThreshold !== undefined && !isFate) {
|
|
32
|
-
let explosions = 0;
|
|
33
|
-
while (roll >= explodeThreshold && explosions < MAX_EXPLOSIONS) {
|
|
34
|
-
roll = rollSingleDie(node.sides, rng);
|
|
35
|
-
rawRolls.push(roll);
|
|
36
|
-
explosions++;
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
// Build die results (all kept initially)
|
|
41
|
-
const dice = rawRolls.map((value) => ({
|
|
42
|
-
value,
|
|
43
|
-
kept: true,
|
|
44
|
-
exploded: false,
|
|
45
|
-
}));
|
|
46
|
-
// Mark exploded dice
|
|
47
|
-
if (explodeThreshold !== undefined && !isFate) {
|
|
48
|
-
let dieIndex = 0;
|
|
49
|
-
for (let i = 0; i < node.count; i++) {
|
|
50
|
-
// Skip the initial die
|
|
51
|
-
dieIndex++;
|
|
52
|
-
// Mark subsequent exploded dice
|
|
53
|
-
while (dieIndex < dice.length &&
|
|
54
|
-
dice[dieIndex - 1].value >= explodeThreshold) {
|
|
55
|
-
dice[dieIndex].exploded = true;
|
|
56
|
-
dieIndex++;
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
// Apply keep/drop modifiers
|
|
61
|
-
for (const mod of node.modifiers) {
|
|
62
|
-
if (mod.kind === "explode")
|
|
63
|
-
continue;
|
|
64
|
-
applyKeepDrop(dice, mod);
|
|
65
|
-
}
|
|
66
|
-
const total = dice.filter((d) => d.kept).reduce((sum, d) => sum + d.value, 0);
|
|
67
|
-
// Build expression string
|
|
15
|
+
function buildExpression(node) {
|
|
68
16
|
let expr = `${node.count}d${node.sides === "%" ? "%" : node.sides === "F" ? "F" : node.sides}`;
|
|
69
17
|
for (const mod of node.modifiers) {
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
18
|
+
switch (mod.kind) {
|
|
19
|
+
case "explode":
|
|
20
|
+
expr += "!";
|
|
21
|
+
if (mod.compare)
|
|
22
|
+
expr += `${mod.compare.operator}${mod.compare.value}`;
|
|
23
|
+
break;
|
|
24
|
+
case "compound":
|
|
25
|
+
expr += "!!";
|
|
26
|
+
if (mod.compare)
|
|
27
|
+
expr += `${mod.compare.operator}${mod.compare.value}`;
|
|
28
|
+
break;
|
|
29
|
+
case "penetrate":
|
|
30
|
+
expr += "!p";
|
|
31
|
+
if (mod.compare)
|
|
32
|
+
expr += `${mod.compare.operator}${mod.compare.value}`;
|
|
33
|
+
break;
|
|
34
|
+
case "reroll":
|
|
35
|
+
expr += "r";
|
|
36
|
+
if (mod.compare)
|
|
37
|
+
expr += `${mod.compare.operator}${mod.compare.value}`;
|
|
38
|
+
break;
|
|
39
|
+
case "reroll_once":
|
|
40
|
+
expr += "ro";
|
|
41
|
+
if (mod.compare)
|
|
42
|
+
expr += `${mod.compare.operator}${mod.compare.value}`;
|
|
43
|
+
break;
|
|
44
|
+
case "cs_count":
|
|
45
|
+
expr += "cs";
|
|
46
|
+
if (mod.compare)
|
|
47
|
+
expr += `${mod.compare.operator}${mod.compare.value}`;
|
|
48
|
+
break;
|
|
49
|
+
case "cf_count":
|
|
50
|
+
expr += "f";
|
|
51
|
+
if (mod.compare)
|
|
52
|
+
expr += `${mod.compare.operator}${mod.compare.value}`;
|
|
53
|
+
break;
|
|
54
|
+
case "cs_mark":
|
|
55
|
+
expr += "cs";
|
|
56
|
+
break;
|
|
57
|
+
case "cf_mark":
|
|
58
|
+
expr += "cf";
|
|
59
|
+
break;
|
|
60
|
+
case "min":
|
|
61
|
+
expr += `min${mod.value}`;
|
|
62
|
+
break;
|
|
63
|
+
case "max":
|
|
64
|
+
expr += `max${mod.value}`;
|
|
65
|
+
break;
|
|
66
|
+
case "sort_asc":
|
|
67
|
+
expr += "sa";
|
|
68
|
+
break;
|
|
69
|
+
case "sort_desc":
|
|
70
|
+
expr += "sd";
|
|
71
|
+
break;
|
|
72
|
+
default:
|
|
73
|
+
// kh, kl, dh, dl
|
|
74
|
+
expr += mod.kind;
|
|
75
|
+
if (mod.value !== undefined)
|
|
76
|
+
expr += mod.value;
|
|
79
77
|
}
|
|
80
78
|
}
|
|
81
|
-
return
|
|
79
|
+
return expr;
|
|
82
80
|
}
|
|
83
|
-
function
|
|
84
|
-
const
|
|
85
|
-
const
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
let dropped = 0;
|
|
93
|
-
for (const d of sorted) {
|
|
94
|
-
if (dropped < threshold) {
|
|
95
|
-
d.kept = false;
|
|
96
|
-
dropped++;
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
break;
|
|
100
|
-
}
|
|
101
|
-
case "kl": {
|
|
102
|
-
// Keep lowest N — drop everything else
|
|
103
|
-
let kept = 0;
|
|
104
|
-
for (const d of sorted) {
|
|
105
|
-
if (kept < n) {
|
|
106
|
-
kept++;
|
|
107
|
-
}
|
|
108
|
-
else {
|
|
109
|
-
d.kept = false;
|
|
110
|
-
}
|
|
111
|
-
}
|
|
112
|
-
break;
|
|
113
|
-
}
|
|
114
|
-
case "dh": {
|
|
115
|
-
// Drop highest N
|
|
116
|
-
let dropped = 0;
|
|
117
|
-
for (let i = sorted.length - 1; i >= 0 && dropped < n; i--) {
|
|
118
|
-
sorted[i].kept = false;
|
|
119
|
-
dropped++;
|
|
120
|
-
}
|
|
121
|
-
break;
|
|
122
|
-
}
|
|
123
|
-
case "dl": {
|
|
124
|
-
// Drop lowest N
|
|
125
|
-
let dropped = 0;
|
|
126
|
-
for (let i = 0; i < sorted.length && dropped < n; i++) {
|
|
127
|
-
sorted[i].kept = false;
|
|
128
|
-
dropped++;
|
|
129
|
-
}
|
|
130
|
-
break;
|
|
131
|
-
}
|
|
132
|
-
}
|
|
81
|
+
function rollDiceGroup(node, rng) {
|
|
82
|
+
const resultMode = node.resultMode ?? "sum";
|
|
83
|
+
const pipeline = runPipeline(node.count, node.sides, node.modifiers, rng, resultMode);
|
|
84
|
+
return {
|
|
85
|
+
expression: buildExpression(node),
|
|
86
|
+
dice: pipeline.dice.map(pipelineDieToDieResult),
|
|
87
|
+
total: pipeline.total,
|
|
88
|
+
resultMode: pipeline.resultMode,
|
|
89
|
+
};
|
|
133
90
|
}
|
|
134
91
|
export function evaluate(ast, rng = cryptoRng) {
|
|
135
92
|
const groups = [];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"roller.js","sourceRoot":"","sources":["../../src/engine/roller.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAc,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"roller.js","sourceRoot":"","sources":["../../src/engine/roller.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,12 +1,14 @@
|
|
|
1
1
|
export { parse, ParseError } from "./parser/parser.js";
|
|
2
2
|
export { tokenize, LexerError } from "./parser/lexer.js";
|
|
3
|
-
export type { ASTNode, DiceNode, NumberNode, BinaryOpNode, UnaryMinusNode, DiceModifier, DiceSides } from "./parser/ast.js";
|
|
3
|
+
export type { ASTNode, DiceNode, NumberNode, BinaryOpNode, UnaryMinusNode, DiceModifier, DiceSides, ComparePoint } from "./parser/ast.js";
|
|
4
4
|
export { TokenType } from "./parser/tokens.js";
|
|
5
5
|
export type { Token } from "./parser/tokens.js";
|
|
6
6
|
export { evaluate } from "./engine/roller.js";
|
|
7
7
|
export type { RollResult, DiceGroupResult, DieResult } from "./engine/roller.js";
|
|
8
8
|
export { cryptoRng, seededRng } from "./engine/random.js";
|
|
9
9
|
export type { RngFn } from "./engine/random.js";
|
|
10
|
+
export { runPipeline, matchesCompare } from "./engine/pipeline.js";
|
|
11
|
+
export type { PipelineDie, PipelineResult } from "./engine/pipeline.js";
|
|
10
12
|
export { computeDistribution } from "./analyze/distribution.js";
|
|
11
13
|
export type { Distribution } from "./analyze/distribution.js";
|
|
12
14
|
export { computeStats, probabilityAtLeast } from "./analyze/stats.js";
|
|
@@ -14,6 +16,12 @@ export type { DistributionStats } from "./analyze/stats.js";
|
|
|
14
16
|
export { monteCarloDistribution } from "./analyze/montecarlo.js";
|
|
15
17
|
export { rollLootTable, validateLootTables } from "./loot/table.js";
|
|
16
18
|
export type { LootTable, LootItem, LootDrop, LootTableCollection } from "./loot/table.js";
|
|
19
|
+
export { rollGameTable, rollMultiple, convertLootToGameTable } from "./tables/engine.js";
|
|
20
|
+
export { validateGameTables } from "./tables/validate.js";
|
|
21
|
+
export { evaluateCondition, filterEligibleEntries } from "./tables/conditions.js";
|
|
22
|
+
export type { GameTable, GameTableCollection, TableEntry, TableResult, TableContext, TableCondition, TableKind, CompareCondition, NatCondition, TagCondition, ContextCondition, } from "./tables/schema.js";
|
|
23
|
+
export { BridgeHandler } from "./bridge/handler.js";
|
|
24
|
+
export type { JsonRpcRequest, JsonRpcResponse, JsonRpcError, BridgeMethod, } from "./bridge/protocol.js";
|
|
17
25
|
import type { RollResult } from "./engine/roller.js";
|
|
18
26
|
import type { RngFn } from "./engine/random.js";
|
|
19
27
|
/** Roll a dice expression and return the result. */
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACzD,YAAY,EAAE,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,YAAY,EAAE,cAAc,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACzD,YAAY,EAAE,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,YAAY,EAAE,cAAc,EAAE,YAAY,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC1I,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,YAAY,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAGhD,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,YAAY,EAAE,UAAU,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AACjF,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC1D,YAAY,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAGhD,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACnE,YAAY,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAGxE,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAChE,YAAY,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACtE,YAAY,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AAGjE,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACpE,YAAY,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAG1F,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AACzF,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAClF,YAAY,EACV,SAAS,EAAE,mBAAmB,EAAE,UAAU,EAAE,WAAW,EACvD,YAAY,EAAE,cAAc,EAAE,SAAS,EACvC,gBAAgB,EAAE,YAAY,EAAE,YAAY,EAAE,gBAAgB,GAC/D,MAAM,oBAAoB,CAAC;AAG5B,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,YAAY,EACV,cAAc,EAAE,eAAe,EAAE,YAAY,EAAE,YAAY,GAC5D,MAAM,sBAAsB,CAAC;AAO9B,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAEhD,oDAAoD;AACpD,wBAAgB,IAAI,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,KAAK,GAAG,UAAU,CAKhE;AAED,2FAA2F;AAC3F,wBAAgB,OAAO,CAAC,UAAU,EAAE,MAAM;;;iCAOT,MAAM;EAEtC"}
|
package/dist/index.js
CHANGED
|
@@ -5,12 +5,20 @@ export { TokenType } from "./parser/tokens.js";
|
|
|
5
5
|
// Engine
|
|
6
6
|
export { evaluate } from "./engine/roller.js";
|
|
7
7
|
export { cryptoRng, seededRng } from "./engine/random.js";
|
|
8
|
+
// Pipeline
|
|
9
|
+
export { runPipeline, matchesCompare } from "./engine/pipeline.js";
|
|
8
10
|
// Analysis
|
|
9
11
|
export { computeDistribution } from "./analyze/distribution.js";
|
|
10
12
|
export { computeStats, probabilityAtLeast } from "./analyze/stats.js";
|
|
11
13
|
export { monteCarloDistribution } from "./analyze/montecarlo.js";
|
|
12
|
-
// Loot
|
|
14
|
+
// Loot (V1 — unchanged)
|
|
13
15
|
export { rollLootTable, validateLootTables } from "./loot/table.js";
|
|
16
|
+
// Game Tables (V2)
|
|
17
|
+
export { rollGameTable, rollMultiple, convertLootToGameTable } from "./tables/engine.js";
|
|
18
|
+
export { validateGameTables } from "./tables/validate.js";
|
|
19
|
+
export { evaluateCondition, filterEligibleEntries } from "./tables/conditions.js";
|
|
20
|
+
// Bridge
|
|
21
|
+
export { BridgeHandler } from "./bridge/handler.js";
|
|
14
22
|
// Convenience functions
|
|
15
23
|
import { parse as _parse } from "./parser/parser.js";
|
|
16
24
|
import { evaluate as _evaluate } from "./engine/roller.js";
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,SAAS;AACT,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAEzD,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAG/C,SAAS;AACT,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAE9C,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAG1D,WAAW;AACX,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAEhE,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAEtE,OAAO,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AAEjE,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,SAAS;AACT,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAEzD,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAG/C,SAAS;AACT,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAE9C,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAG1D,WAAW;AACX,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAGnE,WAAW;AACX,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAEhE,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAEtE,OAAO,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AAEjE,wBAAwB;AACxB,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAGpE,mBAAmB;AACnB,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AACzF,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAOlF,SAAS;AACT,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAKpD,wBAAwB;AACxB,OAAO,EAAE,KAAK,IAAI,MAAM,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,QAAQ,IAAI,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,EAAE,mBAAmB,IAAI,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAChF,OAAO,EAAE,YAAY,IAAI,aAAa,EAAE,kBAAkB,IAAI,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAIvG,oDAAoD;AACpD,MAAM,UAAU,IAAI,CAAC,UAAkB,EAAE,GAAW;IAClD,MAAM,GAAG,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC;IAC/B,MAAM,MAAM,GAAG,SAAS,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IACnC,MAAM,CAAC,UAAU,GAAG,UAAU,CAAC;IAC/B,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,2FAA2F;AAC3F,MAAM,UAAU,OAAO,CAAC,UAAkB;IACxC,MAAM,GAAG,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC;IAC/B,MAAM,IAAI,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;IAC/B,MAAM,KAAK,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;IAClC,OAAO;QACL,YAAY,EAAE,IAAI;QAClB,KAAK;QACL,kBAAkB,EAAE,CAAC,MAAc,EAAE,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC;KACnE,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Roll MCP Server — Model Context Protocol server for the Roll dice engine.
|
|
4
|
+
* Communicates via stdio using JSON-RPC 2.0 (MCP transport).
|
|
5
|
+
*/
|
|
6
|
+
import { createInterface } from "node:readline";
|
|
7
|
+
import { TOOLS } from "./tools.js";
|
|
8
|
+
import { parse } from "../parser/parser.js";
|
|
9
|
+
import { evaluate } from "../engine/roller.js";
|
|
10
|
+
import { computeDistribution } from "../analyze/distribution.js";
|
|
11
|
+
import { computeStats, probabilityAtLeast } from "../analyze/stats.js";
|
|
12
|
+
import { seededRng, cryptoRng } from "../engine/random.js";
|
|
13
|
+
import { rollGameTable } from "../tables/engine.js";
|
|
14
|
+
// ─── Server info ─────────────────────────────────────────────────────────────
|
|
15
|
+
const SERVER_INFO = {
|
|
16
|
+
name: "roll",
|
|
17
|
+
version: "2.0.0",
|
|
18
|
+
};
|
|
19
|
+
const CAPABILITIES = {
|
|
20
|
+
tools: {},
|
|
21
|
+
};
|
|
22
|
+
// ─── Tool handlers ───────────────────────────────────────────────────────────
|
|
23
|
+
function handleToolCall(name, args) {
|
|
24
|
+
switch (name) {
|
|
25
|
+
case "roll_dice": {
|
|
26
|
+
const expression = args.expression;
|
|
27
|
+
const times = args.times ?? 1;
|
|
28
|
+
const rng = args.seed !== undefined ? seededRng(args.seed) : cryptoRng;
|
|
29
|
+
const results = [];
|
|
30
|
+
for (let i = 0; i < times; i++) {
|
|
31
|
+
const ast = parse(expression);
|
|
32
|
+
const result = evaluate(ast, rng);
|
|
33
|
+
result.expression = expression;
|
|
34
|
+
results.push(result);
|
|
35
|
+
}
|
|
36
|
+
return times === 1 ? results[0] : results;
|
|
37
|
+
}
|
|
38
|
+
case "analyze_dice": {
|
|
39
|
+
const expression = args.expression;
|
|
40
|
+
const ast = parse(expression);
|
|
41
|
+
const dist = computeDistribution(ast);
|
|
42
|
+
const stats = computeStats(dist);
|
|
43
|
+
const distribution = [...dist.entries()].sort((a, b) => a[0] - b[0]);
|
|
44
|
+
const result = { stats, distribution };
|
|
45
|
+
if (args.at_least !== undefined) {
|
|
46
|
+
result.atLeastProbability = probabilityAtLeast(dist, args.at_least);
|
|
47
|
+
result.atLeastTarget = args.at_least;
|
|
48
|
+
}
|
|
49
|
+
return result;
|
|
50
|
+
}
|
|
51
|
+
case "compare_dice": {
|
|
52
|
+
const exprA = args.expression_a;
|
|
53
|
+
const exprB = args.expression_b;
|
|
54
|
+
const analyze = (expr) => {
|
|
55
|
+
const ast = parse(expr);
|
|
56
|
+
const dist = computeDistribution(ast);
|
|
57
|
+
return { expression: expr, stats: computeStats(dist) };
|
|
58
|
+
};
|
|
59
|
+
return [analyze(exprA), analyze(exprB)];
|
|
60
|
+
}
|
|
61
|
+
case "roll_table": {
|
|
62
|
+
const tableName = args.table_name;
|
|
63
|
+
const collection = args.collection;
|
|
64
|
+
const context = (args.context ?? {});
|
|
65
|
+
const count = args.count ?? 1;
|
|
66
|
+
const results = [];
|
|
67
|
+
for (let i = 0; i < count; i++) {
|
|
68
|
+
results.push(...rollGameTable(collection, tableName, context));
|
|
69
|
+
}
|
|
70
|
+
return results;
|
|
71
|
+
}
|
|
72
|
+
case "query_table": {
|
|
73
|
+
const tableName = args.table_name;
|
|
74
|
+
const collection = args.collection;
|
|
75
|
+
const table = collection.tables.find((t) => t.table === tableName);
|
|
76
|
+
if (!table)
|
|
77
|
+
throw new Error(`Table not found: ${tableName}`);
|
|
78
|
+
return table;
|
|
79
|
+
}
|
|
80
|
+
default:
|
|
81
|
+
throw new Error(`Unknown tool: ${name}`);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
// ─── MCP dispatch ────────────────────────────────────────────────────────────
|
|
85
|
+
function handleRequest(request) {
|
|
86
|
+
const { id, method, params } = request;
|
|
87
|
+
try {
|
|
88
|
+
switch (method) {
|
|
89
|
+
case "initialize":
|
|
90
|
+
return {
|
|
91
|
+
jsonrpc: "2.0",
|
|
92
|
+
id,
|
|
93
|
+
result: {
|
|
94
|
+
protocolVersion: "2024-11-05",
|
|
95
|
+
serverInfo: SERVER_INFO,
|
|
96
|
+
capabilities: CAPABILITIES,
|
|
97
|
+
},
|
|
98
|
+
};
|
|
99
|
+
case "notifications/initialized":
|
|
100
|
+
// Client acknowledgment — no response needed for notifications
|
|
101
|
+
// but since we got an id, respond with empty result
|
|
102
|
+
return { jsonrpc: "2.0", id, result: {} };
|
|
103
|
+
case "tools/list":
|
|
104
|
+
return {
|
|
105
|
+
jsonrpc: "2.0",
|
|
106
|
+
id,
|
|
107
|
+
result: { tools: TOOLS },
|
|
108
|
+
};
|
|
109
|
+
case "tools/call": {
|
|
110
|
+
const toolName = params?.name;
|
|
111
|
+
const toolArgs = (params?.arguments ?? {});
|
|
112
|
+
if (!toolName) {
|
|
113
|
+
return {
|
|
114
|
+
jsonrpc: "2.0",
|
|
115
|
+
id,
|
|
116
|
+
error: { code: -32602, message: "Missing tool name" },
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
const toolResult = handleToolCall(toolName, toolArgs);
|
|
120
|
+
return {
|
|
121
|
+
jsonrpc: "2.0",
|
|
122
|
+
id,
|
|
123
|
+
result: {
|
|
124
|
+
content: [
|
|
125
|
+
{
|
|
126
|
+
type: "text",
|
|
127
|
+
text: JSON.stringify(toolResult, null, 2),
|
|
128
|
+
},
|
|
129
|
+
],
|
|
130
|
+
},
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
default:
|
|
134
|
+
return {
|
|
135
|
+
jsonrpc: "2.0",
|
|
136
|
+
id,
|
|
137
|
+
error: { code: -32601, message: `Unknown method: ${method}` },
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
catch (e) {
|
|
142
|
+
const message = e instanceof Error ? e.message : String(e);
|
|
143
|
+
return {
|
|
144
|
+
jsonrpc: "2.0",
|
|
145
|
+
id,
|
|
146
|
+
result: {
|
|
147
|
+
content: [{ type: "text", text: `Error: ${message}` }],
|
|
148
|
+
isError: true,
|
|
149
|
+
},
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
// ─── Stdio transport ─────────────────────────────────────────────────────────
|
|
154
|
+
function main() {
|
|
155
|
+
const rl = createInterface({ input: process.stdin, terminal: false });
|
|
156
|
+
rl.on("line", (line) => {
|
|
157
|
+
const trimmed = line.trim();
|
|
158
|
+
if (!trimmed)
|
|
159
|
+
return;
|
|
160
|
+
let request;
|
|
161
|
+
try {
|
|
162
|
+
request = JSON.parse(trimmed);
|
|
163
|
+
}
|
|
164
|
+
catch {
|
|
165
|
+
const res = {
|
|
166
|
+
jsonrpc: "2.0",
|
|
167
|
+
id: 0,
|
|
168
|
+
error: { code: -32700, message: "Parse error" },
|
|
169
|
+
};
|
|
170
|
+
process.stdout.write(JSON.stringify(res) + "\n");
|
|
171
|
+
return;
|
|
172
|
+
}
|
|
173
|
+
// Skip notifications (no id)
|
|
174
|
+
if (request.id === undefined || request.id === null)
|
|
175
|
+
return;
|
|
176
|
+
const response = handleRequest(request);
|
|
177
|
+
process.stdout.write(JSON.stringify(response) + "\n");
|
|
178
|
+
});
|
|
179
|
+
rl.on("close", () => process.exit(0));
|
|
180
|
+
}
|
|
181
|
+
main();
|
|
182
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/** MCP tool definitions for the Roll dice engine. */
|
|
2
|
+
export interface McpToolDefinition {
|
|
3
|
+
name: string;
|
|
4
|
+
description: string;
|
|
5
|
+
inputSchema: {
|
|
6
|
+
type: "object";
|
|
7
|
+
properties: Record<string, unknown>;
|
|
8
|
+
required?: string[];
|
|
9
|
+
};
|
|
10
|
+
}
|
|
11
|
+
export declare const TOOLS: McpToolDefinition[];
|
|
12
|
+
//# sourceMappingURL=tools.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../src/mcp/tools.ts"],"names":[],"mappings":"AAAA,qDAAqD;AAErD,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE;QACX,IAAI,EAAE,QAAQ,CAAC;QACf,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACpC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;KACrB,CAAC;CACH;AAED,eAAO,MAAM,KAAK,EAAE,iBAAiB,EA4GpC,CAAC"}
|