@kradle/challenges-sdk 0.10.0 → 0.12.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 +47 -1
- package/LLM_README.md +235 -2333
- package/README.md +150 -570
- package/dist/index.d.ts +1 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -6
- package/dist/index.js.map +1 -1
- package/dist/runtime/examples/capture-the-flag.d.ts +33 -0
- package/dist/runtime/examples/capture-the-flag.d.ts.map +1 -0
- package/dist/runtime/examples/capture-the-flag.js +79 -0
- package/dist/runtime/examples/capture-the-flag.js.map +1 -0
- package/dist/runtime/examples/climb.d.ts +34 -0
- package/dist/runtime/examples/climb.d.ts.map +1 -0
- package/dist/runtime/examples/climb.js +54 -0
- package/dist/runtime/examples/climb.js.map +1 -0
- package/dist/runtime/examples/four-bridges.d.ts +107 -0
- package/dist/runtime/examples/four-bridges.d.ts.map +1 -0
- package/dist/runtime/examples/four-bridges.js +294 -0
- package/dist/runtime/examples/four-bridges.js.map +1 -0
- package/dist/runtime/examples/herding.d.ts +59 -0
- package/dist/runtime/examples/herding.d.ts.map +1 -0
- package/dist/runtime/examples/herding.js +181 -0
- package/dist/runtime/examples/herding.js.map +1 -0
- package/dist/runtime/examples/skywars.d.ts +116 -0
- package/dist/runtime/examples/skywars.d.ts.map +1 -0
- package/dist/runtime/examples/skywars.js +253 -0
- package/dist/runtime/examples/skywars.js.map +1 -0
- package/dist/runtime/sandbox-registry.d.ts +7 -0
- package/dist/runtime/sandbox-registry.d.ts.map +1 -0
- package/dist/runtime/sandbox-registry.js +16 -0
- package/dist/runtime/sandbox-registry.js.map +1 -0
- package/dist/runtime/sandbox.d.ts +29 -0
- package/dist/runtime/sandbox.d.ts.map +1 -0
- package/dist/runtime/sandbox.js +70 -0
- package/dist/runtime/sandbox.js.map +1 -0
- package/dist/runtime/sdk.d.ts +1038 -0
- package/dist/runtime/sdk.d.ts.map +1 -0
- package/dist/runtime/sdk.js +1271 -0
- package/dist/runtime/sdk.js.map +1 -0
- package/dist/runtime/world.d.ts +141 -0
- package/dist/runtime/world.d.ts.map +1 -0
- package/dist/runtime/world.js +344 -0
- package/dist/runtime/world.js.map +1 -0
- package/dist/test/harness.d.ts +176 -0
- package/dist/test/harness.d.ts.map +1 -0
- package/dist/test/harness.js +441 -0
- package/dist/test/harness.js.map +1 -0
- package/dist/test/helpers.d.ts +7 -0
- package/dist/test/helpers.d.ts.map +1 -0
- package/dist/test/helpers.js +12 -0
- package/dist/test/helpers.js.map +1 -0
- package/dist/test/index.d.ts +3 -0
- package/dist/test/index.d.ts.map +1 -0
- package/dist/test/index.js +20 -0
- package/dist/test/index.js.map +1 -0
- package/package.json +69 -40
- package/dist/actions.d.ts +0 -901
- package/dist/actions.d.ts.map +0 -1
- package/dist/actions.js +0 -1155
- package/dist/actions.js.map +0 -1
- package/dist/api_utils.d.ts +0 -25
- package/dist/api_utils.d.ts.map +0 -1
- package/dist/api_utils.js +0 -48
- package/dist/api_utils.js.map +0 -1
- package/dist/challenge.d.ts +0 -58
- package/dist/challenge.d.ts.map +0 -1
- package/dist/challenge.js +0 -582
- package/dist/challenge.js.map +0 -1
- package/dist/commands.d.ts +0 -57
- package/dist/commands.d.ts.map +0 -1
- package/dist/commands.js +0 -200
- package/dist/commands.js.map +0 -1
- package/dist/constants.d.ts +0 -78
- package/dist/constants.d.ts.map +0 -1
- package/dist/constants.js +0 -109
- package/dist/constants.js.map +0 -1
- package/dist/testmode.d.ts +0 -3
- package/dist/testmode.d.ts.map +0 -1
- package/dist/testmode.js +0 -19
- package/dist/testmode.js.map +0 -1
- package/dist/types.d.ts +0 -195
- package/dist/types.d.ts.map +0 -1
- package/dist/types.js +0 -38
- package/dist/types.js.map +0 -1
- package/dist/utils.d.ts +0 -17
- package/dist/utils.d.ts.map +0 -1
- package/dist/utils.js +0 -22
- package/dist/utils.js.map +0 -1
|
@@ -0,0 +1,253 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.MID_LOOT = exports.STARTING_LOOT = exports.BORDER_SHRINKS = exports.config = exports.CENTER = void 0;
|
|
4
|
+
exports.rollChest = rollChest;
|
|
5
|
+
// Skywars on the runtime SDK. Same rules as team-kradle-challenges/challenges/skywars:
|
|
6
|
+
// four starting islands around a mid island, random chests with weighted loot,
|
|
7
|
+
// a border that shrinks at 3:00, 4:00 and 4:30, one life, last player standing wins.
|
|
8
|
+
// The world carries armor stands tagged kradle.island.<name> plus kradle.chest or
|
|
9
|
+
// kradle.spawn; the loot tables are data here and roll from the run's seed, so a
|
|
10
|
+
// replay opens the same chests.
|
|
11
|
+
const sdk_js_1 = require("../sdk.js");
|
|
12
|
+
exports.CENTER = { x: 70, y: -51, z: 12 };
|
|
13
|
+
exports.config = {
|
|
14
|
+
name: "Skywars",
|
|
15
|
+
challengeConfig: { locations: { center: { coordinates: exports.CENTER } } },
|
|
16
|
+
roles: { fighter: { description: "fighter", minParticipants: 2 } },
|
|
17
|
+
endStates: {
|
|
18
|
+
last_standing: "One player remains alive; that player wins",
|
|
19
|
+
time_up: "The timer ran out with several players alive; nobody wins",
|
|
20
|
+
},
|
|
21
|
+
};
|
|
22
|
+
const INITIAL_BORDER_SIZE = 100;
|
|
23
|
+
const STARTING_ISLANDS = ["north", "east", "south", "west"];
|
|
24
|
+
const MIDDLE_ISLAND = "middle";
|
|
25
|
+
const STARTING_CHESTS_PER_ISLAND = 2;
|
|
26
|
+
const MIDDLE_CHESTS = 4;
|
|
27
|
+
const CHEST_SLOTS = 27;
|
|
28
|
+
exports.BORDER_SHRINKS = [
|
|
29
|
+
{ at: (0, sdk_js_1.seconds)(180), size: 50, seconds: 30, message: "The world border is SHRINKING! Move toward the center!" },
|
|
30
|
+
{ at: (0, sdk_js_1.seconds)(240), size: 15, seconds: 15, message: "The border is closing in FAST!" },
|
|
31
|
+
{ at: (0, sdk_js_1.seconds)(270), size: 5, seconds: 10, message: "FINAL CIRCLE! Fight or die!" },
|
|
32
|
+
];
|
|
33
|
+
const one = (item, weight, count, nbt) => ({
|
|
34
|
+
weight,
|
|
35
|
+
items: [{ item, ...(count === undefined ? {} : { count }), ...(nbt === undefined ? {} : { nbt }) }],
|
|
36
|
+
});
|
|
37
|
+
const bowAndArrows = (weight) => ({
|
|
38
|
+
weight,
|
|
39
|
+
items: [{ item: "minecraft:bow" }, { item: "minecraft:arrow", count: [3, 6] }],
|
|
40
|
+
});
|
|
41
|
+
const SHARPNESS_1 = '{Enchantments:[{id:"minecraft:sharpness",lvl:1s}]}';
|
|
42
|
+
exports.STARTING_LOOT = [
|
|
43
|
+
// Weapon: stone sword / iron sword / bow + 3-6 arrows
|
|
44
|
+
{
|
|
45
|
+
rolls: 1,
|
|
46
|
+
entries: [
|
|
47
|
+
one("minecraft:stone_sword", 3),
|
|
48
|
+
one("minecraft:wooden_sword", 1, undefined, SHARPNESS_1),
|
|
49
|
+
one("minecraft:iron_sword", 1),
|
|
50
|
+
bowAndArrows(2),
|
|
51
|
+
],
|
|
52
|
+
},
|
|
53
|
+
// Armor: leather piece / chainmail helmet
|
|
54
|
+
{
|
|
55
|
+
rolls: 1,
|
|
56
|
+
entries: [
|
|
57
|
+
one("minecraft:leather_helmet", 2),
|
|
58
|
+
one("minecraft:leather_chestplate", 2),
|
|
59
|
+
one("minecraft:leather_leggings", 2),
|
|
60
|
+
one("minecraft:leather_boots", 2),
|
|
61
|
+
one("minecraft:chainmail_helmet", 1),
|
|
62
|
+
],
|
|
63
|
+
},
|
|
64
|
+
// Food: bread / cooked beef / golden apple
|
|
65
|
+
{
|
|
66
|
+
rolls: 1,
|
|
67
|
+
entries: [
|
|
68
|
+
one("minecraft:bread", 3, [3, 8]),
|
|
69
|
+
one("minecraft:cooked_beef", 2, [2, 5]),
|
|
70
|
+
one("minecraft:golden_apple", 1),
|
|
71
|
+
],
|
|
72
|
+
},
|
|
73
|
+
// Blocks: cobblestone / oak planks (for bridging)
|
|
74
|
+
{ rolls: 1, entries: [one("minecraft:cobblestone", 3, 16), one("minecraft:oak_planks", 2, 16)] },
|
|
75
|
+
];
|
|
76
|
+
exports.MID_LOOT = [
|
|
77
|
+
// Weapon: iron sword / diamond sword / bow + 3-6 arrows
|
|
78
|
+
{ rolls: 1, entries: [one("minecraft:iron_sword", 3), one("minecraft:diamond_sword", 1), bowAndArrows(2)] },
|
|
79
|
+
// Armor (1-2 pieces): iron set / diamond helmet / diamond chestplate
|
|
80
|
+
{
|
|
81
|
+
rolls: [1, 2],
|
|
82
|
+
entries: [
|
|
83
|
+
one("minecraft:iron_helmet", 2),
|
|
84
|
+
one("minecraft:iron_chestplate", 2),
|
|
85
|
+
one("minecraft:iron_leggings", 2),
|
|
86
|
+
one("minecraft:iron_boots", 2),
|
|
87
|
+
one("minecraft:diamond_helmet", 1),
|
|
88
|
+
one("minecraft:diamond_chestplate", 1),
|
|
89
|
+
],
|
|
90
|
+
},
|
|
91
|
+
// Food: golden apples / enchanted golden apple / cooked beef
|
|
92
|
+
{
|
|
93
|
+
rolls: 1,
|
|
94
|
+
entries: [
|
|
95
|
+
one("minecraft:golden_apple", 2, 3),
|
|
96
|
+
one("minecraft:enchanted_golden_apple", 1),
|
|
97
|
+
one("minecraft:cooked_beef", 3, 8),
|
|
98
|
+
],
|
|
99
|
+
},
|
|
100
|
+
// Utility: ender pearls / cobblestone / arrows
|
|
101
|
+
{
|
|
102
|
+
rolls: 1,
|
|
103
|
+
entries: [one("minecraft:ender_pearl", 2, 2), one("minecraft:cobblestone", 3, 32), one("minecraft:arrow", 2, 16)],
|
|
104
|
+
},
|
|
105
|
+
];
|
|
106
|
+
// ---------------------------------------------------------------- state
|
|
107
|
+
const state = {
|
|
108
|
+
game: () => ({ chests: [] }),
|
|
109
|
+
player: () => ({ island: "", damageDealt: 0 }),
|
|
110
|
+
markers: {
|
|
111
|
+
tags: ["kradle.island.", "kradle.chest", "kradle.spawn"],
|
|
112
|
+
within: {
|
|
113
|
+
from: { x: exports.CENTER.x - 90, y: -64, z: exports.CENTER.z - 90 },
|
|
114
|
+
to: { x: exports.CENTER.x + 90, y: 100, z: exports.CENTER.z + 90 },
|
|
115
|
+
},
|
|
116
|
+
},
|
|
117
|
+
};
|
|
118
|
+
const blockOf = (at) => ({ x: Math.floor(at.x), y: Math.floor(at.y), z: Math.floor(at.z) });
|
|
119
|
+
const island = (m) => m.tags.find((t) => t.startsWith("kradle.island."))?.slice("kradle.island.".length);
|
|
120
|
+
function count(g, c) {
|
|
121
|
+
if (c === undefined)
|
|
122
|
+
return 1;
|
|
123
|
+
return typeof c === "number" ? c : g.rand(c[0], c[1]);
|
|
124
|
+
}
|
|
125
|
+
function pickEntry(g, entries) {
|
|
126
|
+
const total = entries.reduce((n, e) => n + e.weight, 0);
|
|
127
|
+
let r = g.rand(1, total);
|
|
128
|
+
for (const e of entries) {
|
|
129
|
+
r -= e.weight;
|
|
130
|
+
if (r <= 0)
|
|
131
|
+
return e;
|
|
132
|
+
}
|
|
133
|
+
return entries[entries.length - 1];
|
|
134
|
+
}
|
|
135
|
+
/** Rolls every pool of a table into chest items on random slots, like a vanilla loot table would. */
|
|
136
|
+
function rollChest(g, table) {
|
|
137
|
+
const stacks = [];
|
|
138
|
+
for (const pool of table) {
|
|
139
|
+
const rolls = count(g, pool.rolls);
|
|
140
|
+
for (let i = 0; i < rolls; i++) {
|
|
141
|
+
for (const it of pickEntry(g, pool.entries).items) {
|
|
142
|
+
stacks.push({ item: it.item, count: count(g, it.count), ...(it.nbt === undefined ? {} : { nbt: it.nbt }) });
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
const slots = g.shuffle(Array.from({ length: CHEST_SLOTS }, (_, i) => i));
|
|
147
|
+
return stacks.map((stack, i) => ({ slot: slots[i], ...stack }));
|
|
148
|
+
}
|
|
149
|
+
// ---------------------------------------------------------------- the challenge
|
|
150
|
+
exports.default = (0, sdk_js_1.defineChallenge)(exports.config, {
|
|
151
|
+
...state,
|
|
152
|
+
duration: (0, sdk_js_1.seconds)(300),
|
|
153
|
+
life: "single",
|
|
154
|
+
announce: { deaths: false },
|
|
155
|
+
world: { spawn: exports.CENTER, naturalRegeneration: true },
|
|
156
|
+
// The world build is one batch: border, health display, and every chest with its loot.
|
|
157
|
+
setup(g) {
|
|
158
|
+
g.gamerule("doWeatherCycle", false);
|
|
159
|
+
g.worldBorder({ center: { x: exports.CENTER.x, z: exports.CENTER.z }, size: INITIAL_BORDER_SIZE });
|
|
160
|
+
g.command('scoreboard objectives add kradle.health health {"text":"❤","color":"red","bold":true}');
|
|
161
|
+
g.command("scoreboard objectives setdisplay below_name kradle.health");
|
|
162
|
+
// The world must carry its markers: without them the game would start
|
|
163
|
+
// with no chest or with players who have no island.
|
|
164
|
+
const chestStands = g.markers("kradle.chest");
|
|
165
|
+
if (chestStands.length === 0)
|
|
166
|
+
throw new Error("The world has no kradle.chest marker; no chest can be placed.");
|
|
167
|
+
const spawns = g.markers("kradle.spawn");
|
|
168
|
+
const noSpawn = STARTING_ISLANDS.filter((name) => !spawns.some((m) => island(m) === name));
|
|
169
|
+
if (noSpawn.length > 0)
|
|
170
|
+
throw new Error(`The world has no kradle.spawn marker for: ${noSpawn.join(", ")}.`);
|
|
171
|
+
// Each island must offer as many distinct chest spots as the layout places:
|
|
172
|
+
// fewer, or markers on the same block, would give players unequal loot.
|
|
173
|
+
const spotsOn = (name) => new Set(chestStands
|
|
174
|
+
.filter((m) => island(m) === name)
|
|
175
|
+
.map((m) => `${blockOf(m.at).x},${blockOf(m.at).y},${blockOf(m.at).z}`)).size;
|
|
176
|
+
const short = [
|
|
177
|
+
...STARTING_ISLANDS.map((name) => [name, STARTING_CHESTS_PER_ISLAND]),
|
|
178
|
+
[MIDDLE_ISLAND, MIDDLE_CHESTS],
|
|
179
|
+
]
|
|
180
|
+
.filter(([name, n]) => spotsOn(name) < n)
|
|
181
|
+
.map(([name, n]) => `${name} (${spotsOn(name)} of ${n})`);
|
|
182
|
+
if (short.length > 0)
|
|
183
|
+
throw new Error(`The world has too few distinct kradle.chest markers: ${short.join(", ")}.`);
|
|
184
|
+
const plan = [
|
|
185
|
+
...STARTING_ISLANDS.map((name) => [name, STARTING_CHESTS_PER_ISLAND, exports.STARTING_LOOT]),
|
|
186
|
+
[MIDDLE_ISLAND, MIDDLE_CHESTS, exports.MID_LOOT],
|
|
187
|
+
];
|
|
188
|
+
for (const [name, n, table] of plan) {
|
|
189
|
+
// One marker per block: two markers on one block are one chest spot.
|
|
190
|
+
const distinct = [
|
|
191
|
+
...new Map(chestStands
|
|
192
|
+
.filter((m) => island(m) === name)
|
|
193
|
+
.map((m) => [`${blockOf(m.at).x},${blockOf(m.at).y},${blockOf(m.at).z}`, m])).values(),
|
|
194
|
+
];
|
|
195
|
+
const spots = g.shuffle(distinct).slice(0, n);
|
|
196
|
+
for (const spot of spots) {
|
|
197
|
+
const at = blockOf(spot.at);
|
|
198
|
+
g.game.chests.push(at);
|
|
199
|
+
g.setblock(at, "minecraft:chest");
|
|
200
|
+
g.container(at, rollChest(g, table));
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
},
|
|
204
|
+
start(g) {
|
|
205
|
+
g.say("=== SKYBLOCK BATTLE ROYALE ===");
|
|
206
|
+
g.say("Loot chests, gear up, and fight! Last player standing wins!");
|
|
207
|
+
const spawns = g.markers("kradle.spawn");
|
|
208
|
+
const order = g.shuffle([...STARTING_ISLANDS]);
|
|
209
|
+
g.players.forEach((p, i) => {
|
|
210
|
+
const name = order[i % order.length];
|
|
211
|
+
const spawn = spawns.find((m) => island(m) === name);
|
|
212
|
+
p.island = name;
|
|
213
|
+
if (spawn)
|
|
214
|
+
g.teleport(p, spawn.at);
|
|
215
|
+
g.tell(p, `You spawned on ${name.toUpperCase()}! Find chests to gear up!`);
|
|
216
|
+
});
|
|
217
|
+
g.say(`The CENTER ISLAND is at X: ${exports.CENTER.x} Z: ${exports.CENTER.z}: bridge there for BETTER GEAR!`);
|
|
218
|
+
g.say(`The world border shrinks at ${exports.BORDER_SHRINKS[0].at / 1200}:00! Stay inside or die!`);
|
|
219
|
+
},
|
|
220
|
+
at: exports.BORDER_SHRINKS.map((shrink) => ({
|
|
221
|
+
at: shrink.at,
|
|
222
|
+
run: (g) => {
|
|
223
|
+
g.worldBorder({ size: shrink.size, seconds: shrink.seconds });
|
|
224
|
+
g.say(shrink.message);
|
|
225
|
+
},
|
|
226
|
+
})),
|
|
227
|
+
on: {
|
|
228
|
+
damaged(_g, { attacker, amount }) {
|
|
229
|
+
if (attacker)
|
|
230
|
+
attacker.damageDealt += amount;
|
|
231
|
+
},
|
|
232
|
+
died(g, { player, killer }) {
|
|
233
|
+
g.say(`${player.name} has been eliminated!`);
|
|
234
|
+
if (killer)
|
|
235
|
+
killer.score = killer.kills;
|
|
236
|
+
},
|
|
237
|
+
},
|
|
238
|
+
end: (g) => g.active.length <= 1,
|
|
239
|
+
endState: (g) => (g.active.length <= 1 ? "last_standing" : "time_up"),
|
|
240
|
+
winners: (g) => (g.active.length === 1 ? g.active.filter((p) => p.deaths === 0) : []),
|
|
241
|
+
onOver(g) {
|
|
242
|
+
const winners = new Set(g.active.length === 1 ? g.active.filter((p) => p.deaths === 0).map((p) => p.name) : []);
|
|
243
|
+
for (const p of g.players) {
|
|
244
|
+
const won = winners.has(p.name);
|
|
245
|
+
g.title(p, won ? "VICTORY" : "DEFEAT", won ? "You won the challenge!" : "You lost the challenge.", {
|
|
246
|
+
fadeIn: 10,
|
|
247
|
+
stay: 100,
|
|
248
|
+
fadeOut: 20,
|
|
249
|
+
});
|
|
250
|
+
}
|
|
251
|
+
},
|
|
252
|
+
});
|
|
253
|
+
//# sourceMappingURL=skywars.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skywars.js","sourceRoot":"","sources":["../../../src/runtime/examples/skywars.ts"],"names":[],"mappings":";;;AA+JA,8BAYC;AA3KD,uFAAuF;AACvF,+EAA+E;AAC/E,qFAAqF;AACrF,kFAAkF;AAClF,iFAAiF;AACjF,gCAAgC;AAChC,sCASmB;AAEN,QAAA,MAAM,GAAS,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC;AAExC,QAAA,MAAM,GAAG;IACrB,IAAI,EAAE,SAAS;IACf,eAAe,EAAE,EAAE,SAAS,EAAE,EAAE,MAAM,EAAE,EAAE,WAAW,EAAE,cAAM,EAAE,EAAE,EAAE;IACnE,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,WAAW,EAAE,SAAS,EAAE,eAAe,EAAE,CAAC,EAAE,EAAE;IAClE,SAAS,EAAE;QACV,aAAa,EAAE,4CAA4C;QAC3D,OAAO,EAAE,2DAA2D;KACpE;CACkC,CAAC;AAErC,MAAM,mBAAmB,GAAG,GAAG,CAAC;AAChC,MAAM,gBAAgB,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAU,CAAC;AACrE,MAAM,aAAa,GAAG,QAAQ,CAAC;AAC/B,MAAM,0BAA0B,GAAG,CAAC,CAAC;AACrC,MAAM,aAAa,GAAG,CAAC,CAAC;AACxB,MAAM,WAAW,GAAG,EAAE,CAAC;AAEV,QAAA,cAAc,GAAG;IAC7B,EAAE,EAAE,EAAE,IAAA,gBAAO,EAAC,GAAG,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,wDAAwD,EAAE;IAC9G,EAAE,EAAE,EAAE,IAAA,gBAAO,EAAC,GAAG,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,gCAAgC,EAAE;IACtF,EAAE,EAAE,EAAE,IAAA,gBAAO,EAAC,GAAG,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,6BAA6B,EAAE;CAClF,CAAC;AAQF,MAAM,GAAG,GAAG,CAAC,IAAU,EAAE,MAAc,EAAE,KAAa,EAAE,GAAY,EAAS,EAAE,CAAC,CAAC;IAChF,MAAM;IACN,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC;CACnG,CAAC,CAAC;AACH,MAAM,YAAY,GAAG,CAAC,MAAc,EAAS,EAAE,CAAC,CAAC;IAChD,MAAM;IACN,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,EAAE,EAAE,IAAI,EAAE,iBAAiB,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;CAC9E,CAAC,CAAC;AACH,MAAM,WAAW,GAAG,oDAAoD,CAAC;AAE5D,QAAA,aAAa,GAAW;IACpC,sDAAsD;IACtD;QACC,KAAK,EAAE,CAAC;QACR,OAAO,EAAE;YACR,GAAG,CAAC,uBAAuB,EAAE,CAAC,CAAC;YAC/B,GAAG,CAAC,wBAAwB,EAAE,CAAC,EAAE,SAAS,EAAE,WAAW,CAAC;YACxD,GAAG,CAAC,sBAAsB,EAAE,CAAC,CAAC;YAC9B,YAAY,CAAC,CAAC,CAAC;SACf;KACD;IACD,0CAA0C;IAC1C;QACC,KAAK,EAAE,CAAC;QACR,OAAO,EAAE;YACR,GAAG,CAAC,0BAA0B,EAAE,CAAC,CAAC;YAClC,GAAG,CAAC,8BAA8B,EAAE,CAAC,CAAC;YACtC,GAAG,CAAC,4BAA4B,EAAE,CAAC,CAAC;YACpC,GAAG,CAAC,yBAAyB,EAAE,CAAC,CAAC;YACjC,GAAG,CAAC,4BAA4B,EAAE,CAAC,CAAC;SACpC;KACD;IACD,2CAA2C;IAC3C;QACC,KAAK,EAAE,CAAC;QACR,OAAO,EAAE;YACR,GAAG,CAAC,iBAAiB,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YACjC,GAAG,CAAC,uBAAuB,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YACvC,GAAG,CAAC,wBAAwB,EAAE,CAAC,CAAC;SAChC;KACD;IACD,kDAAkD;IAClD,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,GAAG,CAAC,uBAAuB,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,GAAG,CAAC,sBAAsB,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE;CAChG,CAAC;AAEW,QAAA,QAAQ,GAAW;IAC/B,wDAAwD;IACxD,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,GAAG,CAAC,sBAAsB,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,yBAAyB,EAAE,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC,EAAE;IAC3G,qEAAqE;IACrE;QACC,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;QACb,OAAO,EAAE;YACR,GAAG,CAAC,uBAAuB,EAAE,CAAC,CAAC;YAC/B,GAAG,CAAC,2BAA2B,EAAE,CAAC,CAAC;YACnC,GAAG,CAAC,yBAAyB,EAAE,CAAC,CAAC;YACjC,GAAG,CAAC,sBAAsB,EAAE,CAAC,CAAC;YAC9B,GAAG,CAAC,0BAA0B,EAAE,CAAC,CAAC;YAClC,GAAG,CAAC,8BAA8B,EAAE,CAAC,CAAC;SACtC;KACD;IACD,6DAA6D;IAC7D;QACC,KAAK,EAAE,CAAC;QACR,OAAO,EAAE;YACR,GAAG,CAAC,wBAAwB,EAAE,CAAC,EAAE,CAAC,CAAC;YACnC,GAAG,CAAC,kCAAkC,EAAE,CAAC,CAAC;YAC1C,GAAG,CAAC,uBAAuB,EAAE,CAAC,EAAE,CAAC,CAAC;SAClC;KACD;IACD,+CAA+C;IAC/C;QACC,KAAK,EAAE,CAAC;QACR,OAAO,EAAE,CAAC,GAAG,CAAC,uBAAuB,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,uBAAuB,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,GAAG,CAAC,iBAAiB,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;KACjH;CACD,CAAC;AAEF,yEAAyE;AAEzE,MAAM,KAAK,GAAG;IACb,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,EAAY,EAAE,CAAC;IACtC,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,WAAW,EAAE,CAAC,EAAE,CAAC;IAC9C,OAAO,EAAE;QACR,IAAI,EAAE,CAAC,gBAAgB,EAAE,cAAc,EAAE,cAAc,CAAC;QACxD,MAAM,EAAE;YACP,IAAI,EAAE,EAAE,CAAC,EAAE,cAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,cAAM,CAAC,CAAC,GAAG,EAAE,EAAE;YACpD,EAAE,EAAE,EAAE,CAAC,EAAE,cAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,cAAM,CAAC,CAAC,GAAG,EAAE,EAAE;SAClD;KACD;CACD,CAAC;AAGF,MAAM,OAAO,GAAG,CAAC,EAAQ,EAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;AACxG,MAAM,MAAM,GAAG,CAAC,CAAS,EAAsB,EAAE,CAChD,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,gBAAgB,CAAC,CAAC,EAAE,KAAK,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC;AAEpF,SAAS,KAAK,CAAC,CAAI,EAAE,CAAoB;IACxC,IAAI,CAAC,KAAK,SAAS;QAAE,OAAO,CAAC,CAAC;IAC9B,OAAO,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACvD,CAAC;AAED,SAAS,SAAS,CAAC,CAAI,EAAE,OAAgB;IACxC,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IACxD,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IACzB,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACzB,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC;QACd,IAAI,CAAC,IAAI,CAAC;YAAE,OAAO,CAAC,CAAC;IACtB,CAAC;IACD,OAAO,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AACpC,CAAC;AAED,qGAAqG;AACrG,SAAgB,SAAS,CAAC,CAAI,EAAE,KAAa;IAC5C,MAAM,MAAM,GAAuC,EAAE,CAAC;IACtD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QAC1B,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;QACnC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;YAChC,KAAK,MAAM,EAAE,IAAI,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,CAAC;gBACnD,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;YAC7G,CAAC;QACF,CAAC;IACF,CAAC;IACD,MAAM,KAAK,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1E,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,GAAG,KAAK,EAAE,CAAC,CAAC,CAAC;AACjE,CAAC;AAED,iFAAiF;AAEjF,kBAAe,IAAA,wBAAe,EAAC,cAAM,EAAE;IACtC,GAAG,KAAK;IACR,QAAQ,EAAE,IAAA,gBAAO,EAAC,GAAG,CAAC;IACtB,IAAI,EAAE,QAAQ;IACd,QAAQ,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE;IAC3B,KAAK,EAAE,EAAE,KAAK,EAAE,cAAM,EAAE,mBAAmB,EAAE,IAAI,EAAE;IAEnD,uFAAuF;IACvF,KAAK,CAAC,CAAC;QACN,CAAC,CAAC,QAAQ,CAAC,gBAAgB,EAAE,KAAK,CAAC,CAAC;QACpC,CAAC,CAAC,WAAW,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,cAAM,CAAC,CAAC,EAAE,CAAC,EAAE,cAAM,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,mBAAmB,EAAE,CAAC,CAAC;QACnF,CAAC,CAAC,OAAO,CAAC,uFAAuF,CAAC,CAAC;QACnG,CAAC,CAAC,OAAO,CAAC,2DAA2D,CAAC,CAAC;QACvE,sEAAsE;QACtE,oDAAoD;QACpD,MAAM,WAAW,GAAG,CAAC,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;QAC9C,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,+DAA+D,CAAC,CAAC;QAC/G,MAAM,MAAM,GAAG,CAAC,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;QACzC,MAAM,OAAO,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC;QAC3F,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,6CAA6C,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC5G,4EAA4E;QAC5E,wEAAwE;QACxE,MAAM,OAAO,GAAG,CAAC,IAAY,EAAE,EAAE,CAChC,IAAI,GAAG,CACN,WAAW;aACT,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC;aACjC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CACxE,CAAC,IAAI,CAAC;QACR,MAAM,KAAK,GAAG;YACb,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC,IAAI,EAAoB,EAAE,CAAC,CAAC,IAAI,EAAE,0BAA0B,CAAC,CAAC;YACvF,CAAC,aAAa,EAAE,aAAa,CAAqB;SAClD;aACC,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;aACxC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,IAAI,KAAK,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAC3D,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,wDAAwD,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACnH,MAAM,IAAI,GAAoC;YAC7C,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC,IAAI,EAA4B,EAAE,CAAC,CAAC,IAAI,EAAE,0BAA0B,EAAE,qBAAa,CAAC,CAAC;YAC9G,CAAC,aAAa,EAAE,aAAa,EAAE,gBAAQ,CAAC;SACxC,CAAC;QACF,KAAK,MAAM,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,CAAC,IAAI,IAAI,EAAE,CAAC;YACrC,qEAAqE;YACrE,MAAM,QAAQ,GAAG;gBAChB,GAAG,IAAI,GAAG,CACT,WAAW;qBACT,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC;qBACjC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAU,CAAC,CACtF,CAAC,MAAM,EAAE;aACV,CAAC;YACF,MAAM,KAAK,GAAG,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAC9C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBAC1B,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBAC5B,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBACvB,CAAC,CAAC,QAAQ,CAAC,EAAE,EAAE,iBAAiB,CAAC,CAAC;gBAClC,CAAC,CAAC,SAAS,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;YACtC,CAAC;QACF,CAAC;IACF,CAAC;IAED,KAAK,CAAC,CAAC;QACN,CAAC,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC;QACxC,CAAC,CAAC,GAAG,CAAC,6DAA6D,CAAC,CAAC;QACrE,MAAM,MAAM,GAAG,CAAC,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;QACzC,MAAM,KAAK,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,gBAAgB,CAAC,CAAC,CAAC;QAC/C,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;YAC1B,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;YACrC,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC;YACrD,CAAC,CAAC,MAAM,GAAG,IAAI,CAAC;YAChB,IAAI,KAAK;gBAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC;YACnC,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,kBAAkB,IAAI,CAAC,WAAW,EAAE,2BAA2B,CAAC,CAAC;QAC5E,CAAC,CAAC,CAAC;QACH,CAAC,CAAC,GAAG,CAAC,8BAA8B,cAAM,CAAC,CAAC,OAAO,cAAM,CAAC,CAAC,iCAAiC,CAAC,CAAC;QAC9F,CAAC,CAAC,GAAG,CAAC,+BAA+B,sBAAc,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,0BAA0B,CAAC,CAAC;IAC7F,CAAC;IAED,EAAE,EAAE,sBAAc,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QACnC,EAAE,EAAE,MAAM,CAAC,EAAE;QACb,GAAG,EAAE,CAAC,CAAI,EAAE,EAAE;YACb,CAAC,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;YAC9D,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACvB,CAAC;KACD,CAAC,CAAC;IAEH,EAAE,EAAE;QACH,OAAO,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE;YAC/B,IAAI,QAAQ;gBAAE,QAAQ,CAAC,WAAW,IAAI,MAAM,CAAC;QAC9C,CAAC;QACD,IAAI,CAAC,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE;YACzB,CAAC,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,IAAI,uBAAuB,CAAC,CAAC;YAC7C,IAAI,MAAM;gBAAE,MAAM,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;QACzC,CAAC;KACD;IAED,GAAG,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC;IAChC,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,SAAS,CAAC;IACrE,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACrF,MAAM,CAAC,CAAC;QACP,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAChH,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC;YAC3B,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YAChC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC,wBAAwB,CAAC,CAAC,CAAC,yBAAyB,EAAE;gBAClG,MAAM,EAAE,EAAE;gBACV,IAAI,EAAE,GAAG;gBACT,OAAO,EAAE,EAAE;aACX,CAAC,CAAC;QACJ,CAAC;IACF,CAAC;CACD,CAAC,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/** Records a challenge that came out of a compartment; `origin` is the bundle file, when there is one. */
|
|
2
|
+
export declare function markSandboxed(challenge: object, origin: string | null): void;
|
|
3
|
+
/** The bundle a challenge came from, or `undefined` for an imported source. */
|
|
4
|
+
export declare function sandboxOrigin(challenge: object): {
|
|
5
|
+
origin: string | null;
|
|
6
|
+
} | undefined;
|
|
7
|
+
//# sourceMappingURL=sandbox-registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sandbox-registry.d.ts","sourceRoot":"","sources":["../../src/runtime/sandbox-registry.ts"],"names":[],"mappings":"AAIA,0GAA0G;AAC1G,wBAAgB,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAE5E;AAED,+EAA+E;AAC/E,wBAAgB,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG;IAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,GAAG,SAAS,CAEtF"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.markSandboxed = markSandboxed;
|
|
4
|
+
exports.sandboxOrigin = sandboxOrigin;
|
|
5
|
+
// What `loadBundle` handed out, so the harness can tell a bundle from an
|
|
6
|
+
// imported source. No `ses` here: the harness reads this without loading it.
|
|
7
|
+
const origins = new WeakMap();
|
|
8
|
+
/** Records a challenge that came out of a compartment; `origin` is the bundle file, when there is one. */
|
|
9
|
+
function markSandboxed(challenge, origin) {
|
|
10
|
+
origins.set(challenge, { origin });
|
|
11
|
+
}
|
|
12
|
+
/** The bundle a challenge came from, or `undefined` for an imported source. */
|
|
13
|
+
function sandboxOrigin(challenge) {
|
|
14
|
+
return origins.get(challenge);
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=sandbox-registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sandbox-registry.js","sourceRoot":"","sources":["../../src/runtime/sandbox-registry.ts"],"names":[],"mappings":";;AAKA,sCAEC;AAGD,sCAEC;AAZD,yEAAyE;AACzE,6EAA6E;AAC7E,MAAM,OAAO,GAAG,IAAI,OAAO,EAAqC,CAAC;AAEjE,0GAA0G;AAC1G,SAAgB,aAAa,CAAC,SAAiB,EAAE,MAAqB;IACrE,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;AACpC,CAAC;AAED,+EAA+E;AAC/E,SAAgB,aAAa,CAAC,SAAiB;IAC9C,OAAO,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;AAC/B,CAAC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { AnyChallenge, RuntimeManifest } from "./sdk.js";
|
|
2
|
+
/** The arena's lockdown options (arena-minecraft, src/AgentLib/lockdown.ts). Keep them in step. */
|
|
3
|
+
export declare const LOCKDOWN_OPTIONS: {
|
|
4
|
+
readonly localeTaming: "unsafe";
|
|
5
|
+
readonly consoleTaming: "unsafe";
|
|
6
|
+
readonly errorTaming: "unsafe";
|
|
7
|
+
readonly stackFiltering: "verbose";
|
|
8
|
+
readonly evalTaming: "unsafeEval";
|
|
9
|
+
};
|
|
10
|
+
/** Locks the process down once. A second call is a no-op (SES refuses a second lockdown). */
|
|
11
|
+
export declare function lockdownOnce(): Promise<void>;
|
|
12
|
+
/** A loaded bundle: what the arena's reducer worker holds. */
|
|
13
|
+
export interface LoadedChallenge {
|
|
14
|
+
manifest: RuntimeManifest;
|
|
15
|
+
init(): unknown;
|
|
16
|
+
reduce(state: unknown, event: unknown): {
|
|
17
|
+
state: unknown;
|
|
18
|
+
actions: unknown[];
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Evaluates a CommonJS-shaped bundle (the CLI's `kradle-runtime/challenge.js`)
|
|
23
|
+
* inside a fresh compartment and returns its default export, checked to be a
|
|
24
|
+
* runtime challenge. The same wrapper and checks as the arena's worker.
|
|
25
|
+
*/
|
|
26
|
+
export declare function loadBundle(source: string, origin?: string | null): Promise<AnyChallenge>;
|
|
27
|
+
/** `loadBundle` on a file; the file is the challenge's origin for the harness. */
|
|
28
|
+
export declare function loadBundleFile(path: string): Promise<AnyChallenge>;
|
|
29
|
+
//# sourceMappingURL=sandbox.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sandbox.d.ts","sourceRoot":"","sources":["../../src/runtime/sandbox.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAE9D,mGAAmG;AACnG,eAAO,MAAM,gBAAgB;;;;;;CAMnB,CAAC;AAcX,6FAA6F;AAC7F,wBAAsB,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CAKlD;AAED,8DAA8D;AAC9D,MAAM,WAAW,eAAe;IAC/B,QAAQ,EAAE,eAAe,CAAC;IAC1B,IAAI,IAAI,OAAO,CAAC;IAChB,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,GAAG;QAAE,KAAK,EAAE,OAAO,CAAC;QAAC,OAAO,EAAE,OAAO,EAAE,CAAA;KAAE,CAAC;CAC/E;AAED;;;;GAIG;AACH,wBAAsB,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,GAAE,MAAM,GAAG,IAAW,GAAG,OAAO,CAAC,YAAY,CAAC,CAiBpG;AAED,kFAAkF;AAClF,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAElE"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.LOCKDOWN_OPTIONS = void 0;
|
|
4
|
+
exports.lockdownOnce = lockdownOnce;
|
|
5
|
+
exports.loadBundle = loadBundle;
|
|
6
|
+
exports.loadBundleFile = loadBundleFile;
|
|
7
|
+
// The arena's sandbox, for tests: SES lockdown with the arena's options, and a
|
|
8
|
+
// challenge bundle evaluated inside a fresh Compartment with no endowments. What
|
|
9
|
+
// the bundle sees is what it sees in the arena: the tamed intrinsics (Date.now()
|
|
10
|
+
// and a bare Date throw, Math.random() throws), no timers, no process, no
|
|
11
|
+
// network, and the arguments of each reduce call. Nothing else.
|
|
12
|
+
//
|
|
13
|
+
// Only the bundle is sandboxed. The test process itself keeps a working clock
|
|
14
|
+
// after lockdown (SES tames the start compartment's Date and Math only for the
|
|
15
|
+
// other compartments), so a challenge imported as a module is not sandboxed by
|
|
16
|
+
// this file: it has to be the built bundle (`kradle challenge test` builds it).
|
|
17
|
+
//
|
|
18
|
+
// `ses` enters through a dynamic import: Bun runs a required `ses` in sloppy
|
|
19
|
+
// mode and it refuses to initialize (SES_NO_SLOPPY); the ES module loads
|
|
20
|
+
// everywhere. So the loaders are async, and a test awaits `sandboxed()`.
|
|
21
|
+
const node_fs_1 = require("node:fs");
|
|
22
|
+
const sandbox_registry_js_1 = require("./sandbox-registry.js");
|
|
23
|
+
/** The arena's lockdown options (arena-minecraft, src/AgentLib/lockdown.ts). Keep them in step. */
|
|
24
|
+
exports.LOCKDOWN_OPTIONS = {
|
|
25
|
+
localeTaming: "unsafe",
|
|
26
|
+
consoleTaming: "unsafe",
|
|
27
|
+
errorTaming: "unsafe",
|
|
28
|
+
stackFiltering: "verbose",
|
|
29
|
+
evalTaming: "unsafeEval",
|
|
30
|
+
};
|
|
31
|
+
let ses;
|
|
32
|
+
/** Loads `ses` once: `lockdown` and `Compartment` become globals. */
|
|
33
|
+
function loadSes() {
|
|
34
|
+
if (typeof globalThis.lockdown === "function")
|
|
35
|
+
return Promise.resolve();
|
|
36
|
+
ses ??= import("ses").then(() => undefined);
|
|
37
|
+
return ses;
|
|
38
|
+
}
|
|
39
|
+
/** Locks the process down once. A second call is a no-op (SES refuses a second lockdown). */
|
|
40
|
+
async function lockdownOnce() {
|
|
41
|
+
await loadSes();
|
|
42
|
+
if (typeof globalThis.harden === "function")
|
|
43
|
+
return;
|
|
44
|
+
// `reporting`: the list of removed intrinsics is noise in a test report (the arena logs it).
|
|
45
|
+
lockdown({ ...exports.LOCKDOWN_OPTIONS, reporting: "none" });
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Evaluates a CommonJS-shaped bundle (the CLI's `kradle-runtime/challenge.js`)
|
|
49
|
+
* inside a fresh compartment and returns its default export, checked to be a
|
|
50
|
+
* runtime challenge. The same wrapper and checks as the arena's worker.
|
|
51
|
+
*/
|
|
52
|
+
async function loadBundle(source, origin = null) {
|
|
53
|
+
await lockdownOnce();
|
|
54
|
+
const compartment = new Compartment({});
|
|
55
|
+
const wrapped = `(function () { var module = { exports: {} }; var exports = module.exports;\n${source}\nreturn module.exports; })()`;
|
|
56
|
+
const exported = compartment.evaluate(wrapped);
|
|
57
|
+
const challenge = (exported.default ?? exported);
|
|
58
|
+
if (typeof challenge?.reduce !== "function" ||
|
|
59
|
+
typeof challenge?.init !== "function" ||
|
|
60
|
+
challenge?.manifest?.runtime !== 1) {
|
|
61
|
+
throw new Error("the bundle does not export a runtime challenge (expected default = defineChallenge(config, spec))");
|
|
62
|
+
}
|
|
63
|
+
(0, sandbox_registry_js_1.markSandboxed)(challenge, origin);
|
|
64
|
+
return challenge;
|
|
65
|
+
}
|
|
66
|
+
/** `loadBundle` on a file; the file is the challenge's origin for the harness. */
|
|
67
|
+
function loadBundleFile(path) {
|
|
68
|
+
return loadBundle((0, node_fs_1.readFileSync)(path, "utf8"), path);
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=sandbox.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sandbox.js","sourceRoot":"","sources":["../../src/runtime/sandbox.ts"],"names":[],"mappings":";;;AAyCA,oCAKC;AAcD,gCAiBC;AAGD,wCAEC;AAlFD,+EAA+E;AAC/E,iFAAiF;AACjF,iFAAiF;AACjF,0EAA0E;AAC1E,gEAAgE;AAChE,EAAE;AACF,8EAA8E;AAC9E,+EAA+E;AAC/E,+EAA+E;AAC/E,gFAAgF;AAChF,EAAE;AACF,6EAA6E;AAC7E,yEAAyE;AACzE,yEAAyE;AACzE,qCAAuC;AAEvC,+DAAsD;AAGtD,mGAAmG;AACtF,QAAA,gBAAgB,GAAG;IAC/B,YAAY,EAAE,QAAQ;IACtB,aAAa,EAAE,QAAQ;IACvB,WAAW,EAAE,QAAQ;IACrB,cAAc,EAAE,SAAS;IACzB,UAAU,EAAE,YAAY;CACf,CAAC;AAKX,IAAI,GAA8B,CAAC;AAEnC,qEAAqE;AACrE,SAAS,OAAO;IACf,IAAI,OAAQ,UAAqC,CAAC,QAAQ,KAAK,UAAU;QAAE,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;IACpG,GAAG,KAAK,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;IAC5C,OAAO,GAAG,CAAC;AACZ,CAAC;AAED,6FAA6F;AACtF,KAAK,UAAU,YAAY;IACjC,MAAM,OAAO,EAAE,CAAC;IAChB,IAAI,OAAQ,UAAmC,CAAC,MAAM,KAAK,UAAU;QAAE,OAAO;IAC9E,6FAA6F;IAC7F,QAAQ,CAAC,EAAE,GAAG,wBAAgB,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,CAAC;AACtD,CAAC;AASD;;;;GAIG;AACI,KAAK,UAAU,UAAU,CAAC,MAAc,EAAE,SAAwB,IAAI;IAC5E,MAAM,YAAY,EAAE,CAAC;IACrB,MAAM,WAAW,GAAG,IAAI,WAAW,CAAC,EAAE,CAAC,CAAC;IACxC,MAAM,OAAO,GAAG,+EAA+E,MAAM,+BAA+B,CAAC;IACrI,MAAM,QAAQ,GAAG,WAAW,CAAC,QAAQ,CAAC,OAAO,CAA6D,CAAC;IAC3G,MAAM,SAAS,GAAG,CAAC,QAAQ,CAAC,OAAO,IAAI,QAAQ,CAAoB,CAAC;IACpE,IACC,OAAO,SAAS,EAAE,MAAM,KAAK,UAAU;QACvC,OAAO,SAAS,EAAE,IAAI,KAAK,UAAU;QACrC,SAAS,EAAE,QAAQ,EAAE,OAAO,KAAK,CAAC,EACjC,CAAC;QACF,MAAM,IAAI,KAAK,CACd,mGAAmG,CACnG,CAAC;IACH,CAAC;IACD,IAAA,mCAAa,EAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IACjC,OAAO,SAAoC,CAAC;AAC7C,CAAC;AAED,kFAAkF;AAClF,SAAgB,cAAc,CAAC,IAAY;IAC1C,OAAO,UAAU,CAAC,IAAA,sBAAY,EAAC,IAAI,EAAE,MAAM,CAAC,EAAE,IAAI,CAAC,CAAC;AACrD,CAAC"}
|