@crowdedkingdoms/crowdyjs 8.6.0 → 8.8.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/MIGRATION.md +81 -0
- package/README.md +2 -2
- package/dist/crowdy-client.d.ts.map +1 -1
- package/dist/crowdy-client.js +1 -0
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -2
- package/dist/kit/combat.d.ts +38 -1
- package/dist/kit/combat.d.ts.map +1 -1
- package/dist/kit/combat.js +45 -1
- package/dist/kit/decks.d.ts +33 -1
- package/dist/kit/decks.d.ts.map +1 -1
- package/dist/kit/decks.js +49 -1
- package/dist/kit/director.d.ts +88 -0
- package/dist/kit/director.d.ts.map +1 -0
- package/dist/kit/director.js +86 -0
- package/dist/kit/economy.d.ts +46 -1
- package/dist/kit/economy.d.ts.map +1 -1
- package/dist/kit/economy.js +63 -1
- package/dist/kit/engine.d.ts +43 -0
- package/dist/kit/engine.d.ts.map +1 -0
- package/dist/kit/engine.js +108 -0
- package/dist/kit/index.d.ts +12 -4
- package/dist/kit/index.d.ts.map +1 -1
- package/dist/kit/index.js +10 -2
- package/dist/kit/instances.d.ts +52 -0
- package/dist/kit/instances.d.ts.map +1 -0
- package/dist/kit/instances.js +60 -0
- package/dist/kit/kit.d.ts +31 -1
- package/dist/kit/kit.d.ts.map +1 -1
- package/dist/kit/kit.js +21 -7
- package/dist/kit/leaderboards.d.ts +21 -1
- package/dist/kit/leaderboards.d.ts.map +1 -1
- package/dist/kit/leaderboards.js +40 -1
- package/dist/kit/matches.d.ts +33 -1
- package/dist/kit/matches.d.ts.map +1 -1
- package/dist/kit/matches.js +56 -1
- package/dist/kit/matchmaking.d.ts +57 -0
- package/dist/kit/matchmaking.d.ts.map +1 -0
- package/dist/kit/matchmaking.js +59 -0
- package/dist/kit/minigames.d.ts +30 -0
- package/dist/kit/minigames.d.ts.map +1 -0
- package/dist/kit/minigames.js +38 -0
- package/dist/kit/mobs.d.ts +90 -0
- package/dist/kit/mobs.d.ts.map +1 -0
- package/dist/kit/mobs.js +98 -0
- package/dist/kit/npcs.d.ts +38 -1
- package/dist/kit/npcs.d.ts.map +1 -1
- package/dist/kit/npcs.js +36 -1
- package/dist/kit/pets.d.ts +85 -0
- package/dist/kit/pets.d.ts.map +1 -0
- package/dist/kit/pets.js +96 -0
- package/dist/kit/quests.d.ts +57 -0
- package/dist/kit/quests.d.ts.map +1 -1
- package/dist/kit/quests.js +72 -0
- package/dist/kit/wire.d.ts +124 -0
- package/dist/kit/wire.d.ts.map +1 -0
- package/dist/kit/wire.js +206 -0
- package/dist/kit/worldsim.d.ts +34 -1
- package/dist/kit/worldsim.d.ts.map +1 -1
- package/dist/kit/worldsim.js +38 -1
- package/package.json +1 -1
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
function toRun(body) {
|
|
2
|
+
const boss = body.boss;
|
|
3
|
+
return {
|
|
4
|
+
runId: String(body.runId ?? ''),
|
|
5
|
+
encounterId: String(body.encounterId ?? ''),
|
|
6
|
+
players: Number(body.players ?? 1),
|
|
7
|
+
phase: body.phase ?? {},
|
|
8
|
+
pending: Number(body.pending ?? 0),
|
|
9
|
+
wavesCleared: Number(body.wavesCleared ?? 0),
|
|
10
|
+
wavesTotal: Number(body.wavesTotal ?? 0),
|
|
11
|
+
boss: boss
|
|
12
|
+
? {
|
|
13
|
+
hp: Number(boss.hp ?? 0),
|
|
14
|
+
maxHp: Number(boss.maxHp ?? 0),
|
|
15
|
+
phase: Number(boss.phase ?? 0),
|
|
16
|
+
thresholds: Array.isArray(boss.thresholds) ? boss.thresholds.map(Number) : [],
|
|
17
|
+
}
|
|
18
|
+
: null,
|
|
19
|
+
finished: body.finished === true,
|
|
20
|
+
outcome: String(body.outcome ?? ''),
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Runtime helpers for the director engine (Wave 2): data-driven encounter
|
|
25
|
+
* direction — wave schedules, spawn budgets, boss phases, party scaling.
|
|
26
|
+
* The director emits `director_spawn` compute events; the mob layer
|
|
27
|
+
* simulates and reports kills back.
|
|
28
|
+
*
|
|
29
|
+
* Obtained via `client.kit(appId).director`.
|
|
30
|
+
*/
|
|
31
|
+
export class DirectorKit {
|
|
32
|
+
constructor(appId, gameModel, engines, options = {}) {
|
|
33
|
+
this.appId = appId;
|
|
34
|
+
this.gameModel = gameModel;
|
|
35
|
+
this.engines = engines;
|
|
36
|
+
this.moduleName = options.moduleName ?? 'director';
|
|
37
|
+
this.defTypeName = options.defTypeName ?? 'EncounterDef';
|
|
38
|
+
}
|
|
39
|
+
/** Is the director deployed + enabled (cached per session)? */
|
|
40
|
+
engineAvailable() {
|
|
41
|
+
return this.engines.has(this.moduleName);
|
|
42
|
+
}
|
|
43
|
+
/** STUDIO (admin) — create an encounter definition container. */
|
|
44
|
+
async defineEncounter(input) {
|
|
45
|
+
return this.gameModel.createContainer({
|
|
46
|
+
appId: this.appId,
|
|
47
|
+
typeName: this.defTypeName,
|
|
48
|
+
displayName: input.displayName ?? `Encounter ${input.encounterId}`,
|
|
49
|
+
properties: [
|
|
50
|
+
{ key: 'encounter_id', valueType: 'string', valueJson: JSON.stringify(input.encounterId) },
|
|
51
|
+
{ key: 'waves', valueType: 'string', valueJson: JSON.stringify(JSON.stringify(input.waves)) },
|
|
52
|
+
...(input.spawnBudget !== undefined
|
|
53
|
+
? [{ key: 'spawn_budget', valueType: 'int', valueJson: String(input.spawnBudget) }]
|
|
54
|
+
: []),
|
|
55
|
+
],
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
/** Start a run (party size scales unit counts server-side). */
|
|
59
|
+
async startRun(encounterId, players = 1) {
|
|
60
|
+
return toRun(await this.invoke('start_run', { encounterId, players }));
|
|
61
|
+
}
|
|
62
|
+
/** Report kills toward the live wave (trusted callers/engines). */
|
|
63
|
+
async reportKill(runId, count = 1) {
|
|
64
|
+
return toRun(await this.invoke('report_kill', { runId, count }));
|
|
65
|
+
}
|
|
66
|
+
/** Report boss hp; phase transitions announce on the compute bus. */
|
|
67
|
+
async reportBossHp(runId, hp) {
|
|
68
|
+
return toRun(await this.invoke('report_boss_hp', { runId, hp }));
|
|
69
|
+
}
|
|
70
|
+
/** Force-clear the live wave (run creator only). */
|
|
71
|
+
async skipWave(runId) {
|
|
72
|
+
return toRun(await this.invoke('skip_wave', { runId }));
|
|
73
|
+
}
|
|
74
|
+
/** One run's state (or engine totals without an id). */
|
|
75
|
+
async runState(runId) {
|
|
76
|
+
const body = await this.invoke('run_state', runId ? { runId } : {});
|
|
77
|
+
return runId ? toRun(body) : body;
|
|
78
|
+
}
|
|
79
|
+
async invoke(exportName, params) {
|
|
80
|
+
const result = await this.engines.invoke(this.moduleName, exportName, params);
|
|
81
|
+
if (!result.success) {
|
|
82
|
+
throw new Error(`director.${exportName} failed: ${result.reason ?? 'unknown'}`);
|
|
83
|
+
}
|
|
84
|
+
return result.body;
|
|
85
|
+
}
|
|
86
|
+
}
|
package/dist/kit/economy.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { GameModelAPI } from '../domains/gameModel.js';
|
|
2
|
+
import type { EngineDetector } from './engine.js';
|
|
2
3
|
import type { Scalars, SeedPropertyInput } from '../generated/graphql.js';
|
|
3
4
|
import { type KitInvokeResult } from './shared.js';
|
|
4
5
|
/** Options for {@link EconomyKit}. Must match the deployed economy blueprint. */
|
|
@@ -7,6 +8,8 @@ export interface EconomyKitOptions {
|
|
|
7
8
|
typePrefix?: string;
|
|
8
9
|
/** The `currencies` the blueprint was deployed with. Defaults to `['gold']`. */
|
|
9
10
|
currencies?: string[];
|
|
11
|
+
/** The order-book market engine module. Defaults to `'market-engine'`. */
|
|
12
|
+
marketModuleName?: string;
|
|
10
13
|
}
|
|
11
14
|
/** A parsed view of one wallet. */
|
|
12
15
|
export interface KitWallet {
|
|
@@ -72,7 +75,14 @@ export declare class EconomyKit {
|
|
|
72
75
|
private readonly names;
|
|
73
76
|
private readonly typePrefix;
|
|
74
77
|
private readonly currencies;
|
|
75
|
-
constructor(appId: Scalars['BigInt']['input'], gameModel: GameModelAPI, options?: EconomyKitOptions);
|
|
78
|
+
constructor(appId: Scalars['BigInt']['input'], gameModel: GameModelAPI, options?: EconomyKitOptions, engines?: EngineDetector);
|
|
79
|
+
/**
|
|
80
|
+
* The order-book market (Wave 2 engine): bid/ask methods over the
|
|
81
|
+
* market-engine's escrowed order books. The model-side listing `market`
|
|
82
|
+
* on this kit keeps working without it (fixed-price stack listings);
|
|
83
|
+
* `orderBook` adds real price discovery when the engine is deployed.
|
|
84
|
+
*/
|
|
85
|
+
readonly orderBook: MarketKit;
|
|
76
86
|
private get defaultCurrency();
|
|
77
87
|
/**
|
|
78
88
|
* Find the player's wallet, creating it when absent (member-instantiable;
|
|
@@ -241,4 +251,39 @@ export declare class EconomyKit {
|
|
|
241
251
|
private ensureSellerWallet;
|
|
242
252
|
private toTrade;
|
|
243
253
|
}
|
|
254
|
+
/**
|
|
255
|
+
* Order-book market methods over the market-engine (Wave 2): price-time
|
|
256
|
+
* priority matching with escrowed settlement. Deposits/withdrawals bridge
|
|
257
|
+
* to the game's wallets via compute events the game layer consumes.
|
|
258
|
+
*
|
|
259
|
+
* Obtained via `client.kit(appId).economy.market`.
|
|
260
|
+
*/
|
|
261
|
+
export declare class MarketKit {
|
|
262
|
+
private readonly engines;
|
|
263
|
+
private readonly moduleName;
|
|
264
|
+
constructor(engines: EngineDetector | undefined, moduleName: string);
|
|
265
|
+
/** Is the market engine deployed + enabled (cached per session)? */
|
|
266
|
+
engineAvailable(): Promise<boolean>;
|
|
267
|
+
/** Move coins into your market account (escrow source for bids). */
|
|
268
|
+
depositCoins(amount: number): Promise<Record<string, unknown>>;
|
|
269
|
+
/** Move items into your market account (escrow source for asks). */
|
|
270
|
+
depositItems(item: string, quantity: number): Promise<Record<string, unknown>>;
|
|
271
|
+
/** Place a limit bid: locks coins at your limit; fills at maker price. */
|
|
272
|
+
bid(item: string, price: number, quantity: number): Promise<Record<string, unknown>>;
|
|
273
|
+
/** Place a limit ask: locks items until filled or cancelled. */
|
|
274
|
+
ask(item: string, price: number, quantity: number): Promise<Record<string, unknown>>;
|
|
275
|
+
/** Cancel a resting order (owner only); escrow refunds instantly. */
|
|
276
|
+
cancel(item: string, orderId: number): Promise<Record<string, unknown>>;
|
|
277
|
+
/** Book depth: best bids/asks as [price, quantity] levels. */
|
|
278
|
+
book(item: string): Promise<Record<string, unknown>>;
|
|
279
|
+
/** Your market account (settled + locked balances). */
|
|
280
|
+
account(): Promise<Record<string, unknown>>;
|
|
281
|
+
/** Withdraw settled balances back to the game layer. */
|
|
282
|
+
withdraw(input: {
|
|
283
|
+
coins?: number;
|
|
284
|
+
item?: string;
|
|
285
|
+
quantity?: number;
|
|
286
|
+
}): Promise<Record<string, unknown>>;
|
|
287
|
+
private invoke;
|
|
288
|
+
}
|
|
244
289
|
//# sourceMappingURL=economy.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"economy.d.ts","sourceRoot":"","sources":["../../src/kit/economy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,KAAK,EAAE,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAM1E,OAAO,EAGL,KAAK,eAAe,EACrB,MAAM,aAAa,CAAC;AAErB,iFAAiF;AACjF,MAAM,WAAW,iBAAiB;IAChC,gEAAgE;IAChE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gFAAgF;IAChF,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"economy.d.ts","sourceRoot":"","sources":["../../src/kit/economy.ts"],"names":[],"mappings":"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"}
|
package/dist/kit/economy.js
CHANGED
|
@@ -15,7 +15,7 @@ import { kitContainerProperties, kitInvoke, } from './shared.js';
|
|
|
15
15
|
* Obtained via `client.kit(appId).economy`.
|
|
16
16
|
*/
|
|
17
17
|
export class EconomyKit {
|
|
18
|
-
constructor(appId, gameModel, options = {}) {
|
|
18
|
+
constructor(appId, gameModel, options = {}, engines) {
|
|
19
19
|
this.appId = appId;
|
|
20
20
|
this.gameModel = gameModel;
|
|
21
21
|
/** Shop (admin-priced listings; atomic buys). */
|
|
@@ -258,6 +258,7 @@ export class EconomyKit {
|
|
|
258
258
|
this.typePrefix = options.typePrefix ?? '';
|
|
259
259
|
this.names = economyNames(this.typePrefix);
|
|
260
260
|
this.currencies = options.currencies ?? ['gold'];
|
|
261
|
+
this.orderBook = new MarketKit(engines, options.marketModuleName ?? 'market-engine');
|
|
261
262
|
}
|
|
262
263
|
get defaultCurrency() {
|
|
263
264
|
return this.currencies[0];
|
|
@@ -363,3 +364,64 @@ export class EconomyKit {
|
|
|
363
364
|
};
|
|
364
365
|
}
|
|
365
366
|
}
|
|
367
|
+
/**
|
|
368
|
+
* Order-book market methods over the market-engine (Wave 2): price-time
|
|
369
|
+
* priority matching with escrowed settlement. Deposits/withdrawals bridge
|
|
370
|
+
* to the game's wallets via compute events the game layer consumes.
|
|
371
|
+
*
|
|
372
|
+
* Obtained via `client.kit(appId).economy.market`.
|
|
373
|
+
*/
|
|
374
|
+
export class MarketKit {
|
|
375
|
+
constructor(engines, moduleName) {
|
|
376
|
+
this.engines = engines;
|
|
377
|
+
this.moduleName = moduleName;
|
|
378
|
+
}
|
|
379
|
+
/** Is the market engine deployed + enabled (cached per session)? */
|
|
380
|
+
engineAvailable() {
|
|
381
|
+
if (!this.engines)
|
|
382
|
+
return Promise.resolve(false);
|
|
383
|
+
return this.engines.has(this.moduleName);
|
|
384
|
+
}
|
|
385
|
+
/** Move coins into your market account (escrow source for bids). */
|
|
386
|
+
async depositCoins(amount) {
|
|
387
|
+
return this.invoke('deposit_coins', { amount });
|
|
388
|
+
}
|
|
389
|
+
/** Move items into your market account (escrow source for asks). */
|
|
390
|
+
async depositItems(item, quantity) {
|
|
391
|
+
return this.invoke('deposit_items', { item, quantity });
|
|
392
|
+
}
|
|
393
|
+
/** Place a limit bid: locks coins at your limit; fills at maker price. */
|
|
394
|
+
async bid(item, price, quantity) {
|
|
395
|
+
return this.invoke('place', { item, side: 'buy', price, quantity });
|
|
396
|
+
}
|
|
397
|
+
/** Place a limit ask: locks items until filled or cancelled. */
|
|
398
|
+
async ask(item, price, quantity) {
|
|
399
|
+
return this.invoke('place', { item, side: 'sell', price, quantity });
|
|
400
|
+
}
|
|
401
|
+
/** Cancel a resting order (owner only); escrow refunds instantly. */
|
|
402
|
+
async cancel(item, orderId) {
|
|
403
|
+
return this.invoke('cancel', { item, orderId });
|
|
404
|
+
}
|
|
405
|
+
/** Book depth: best bids/asks as [price, quantity] levels. */
|
|
406
|
+
async book(item) {
|
|
407
|
+
return this.invoke('book', { item });
|
|
408
|
+
}
|
|
409
|
+
/** Your market account (settled + locked balances). */
|
|
410
|
+
async account() {
|
|
411
|
+
return this.invoke('account', {});
|
|
412
|
+
}
|
|
413
|
+
/** Withdraw settled balances back to the game layer. */
|
|
414
|
+
async withdraw(input) {
|
|
415
|
+
return this.invoke('withdraw', input);
|
|
416
|
+
}
|
|
417
|
+
async invoke(exportName, params) {
|
|
418
|
+
if (!this.engines) {
|
|
419
|
+
throw new Error('market engine unavailable: compute domain not wired');
|
|
420
|
+
}
|
|
421
|
+
const result = await this.engines.invoke(this.moduleName, exportName, params);
|
|
422
|
+
if (!result.success) {
|
|
423
|
+
throw new Error(`market.${exportName} failed: ${result.reason ?? 'unknown'}`);
|
|
424
|
+
}
|
|
425
|
+
return result.body;
|
|
426
|
+
}
|
|
427
|
+
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Compute-engine capability detection + invoke envelope for the kit helpers.
|
|
3
|
+
* Games deploy engines (mob-engine, world-engine, bwf-mobs, ...) as compute
|
|
4
|
+
* modules; kit helpers probe once per module per session and route through
|
|
5
|
+
* the engine when it is present, falling back to the model/automation path
|
|
6
|
+
* when it is not — so the same client code works on model-only deployments.
|
|
7
|
+
*/
|
|
8
|
+
import type { ComputeAPI } from '../domains/compute.js';
|
|
9
|
+
/** The `{success, ...}` envelope engine invoke exports resolve with. */
|
|
10
|
+
export interface EngineInvokeResult<T = Record<string, unknown>> {
|
|
11
|
+
success: boolean;
|
|
12
|
+
/** The engine's denial reason when `success` is false. */
|
|
13
|
+
reason?: string;
|
|
14
|
+
/** The parsed result body (includes any extra fields the export returns). */
|
|
15
|
+
body: T & Record<string, unknown>;
|
|
16
|
+
fuelUsed?: string;
|
|
17
|
+
durationUs?: number;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Per-session cached probe of which compute modules an app has enabled.
|
|
21
|
+
* Obtained internally by kit helpers; share one via `kit.engines`.
|
|
22
|
+
*/
|
|
23
|
+
export declare class EngineDetector {
|
|
24
|
+
private readonly appId;
|
|
25
|
+
private readonly compute;
|
|
26
|
+
private readonly cache;
|
|
27
|
+
constructor(appId: string, compute: ComputeAPI | undefined);
|
|
28
|
+
/**
|
|
29
|
+
* Is `moduleName` deployed + enabled? Cached per module for the client's
|
|
30
|
+
* lifetime ({@link reset} to re-probe after deploys). Resolves false when
|
|
31
|
+
* the client has no compute domain wired.
|
|
32
|
+
*/
|
|
33
|
+
has(moduleName: string): Promise<boolean>;
|
|
34
|
+
/** Drop cached probes (call after deploying/enabling modules). */
|
|
35
|
+
reset(): void;
|
|
36
|
+
/**
|
|
37
|
+
* Invoke an engine export and parse the `{success, ...}` envelope.
|
|
38
|
+
* Envelope failures (denials) resolve — only transport/user errors throw.
|
|
39
|
+
*/
|
|
40
|
+
invoke<T = Record<string, unknown>>(moduleName: string, exportName: string, params?: Record<string, unknown>): Promise<EngineInvokeResult<T>>;
|
|
41
|
+
private probe;
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=engine.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../../src/kit/engine.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAExD,wEAAwE;AACxE,MAAM,WAAW,kBAAkB,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAC7D,OAAO,EAAE,OAAO,CAAC;IACjB,0DAA0D;IAC1D,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,6EAA6E;IAC7E,IAAI,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;;GAGG;AACH,qBAAa,cAAc;IAIvB,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,OAAO;IAJ1B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAuC;gBAG1C,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,UAAU,GAAG,SAAS;IAGlD;;;;OAIG;IACH,GAAG,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAUzC,kEAAkE;IAClE,KAAK,IAAI,IAAI;IAIb;;;OAGG;IACG,MAAM,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACtC,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,EAClB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC/B,OAAO,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC;YAwCnB,KAAK;CAmBpB"}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Compute-engine capability detection + invoke envelope for the kit helpers.
|
|
3
|
+
* Games deploy engines (mob-engine, world-engine, bwf-mobs, ...) as compute
|
|
4
|
+
* modules; kit helpers probe once per module per session and route through
|
|
5
|
+
* the engine when it is present, falling back to the model/automation path
|
|
6
|
+
* when it is not — so the same client code works on model-only deployments.
|
|
7
|
+
*/
|
|
8
|
+
import { CrowdyGraphQLError } from '../errors.js';
|
|
9
|
+
/**
|
|
10
|
+
* Per-session cached probe of which compute modules an app has enabled.
|
|
11
|
+
* Obtained internally by kit helpers; share one via `kit.engines`.
|
|
12
|
+
*/
|
|
13
|
+
export class EngineDetector {
|
|
14
|
+
constructor(appId, compute) {
|
|
15
|
+
this.appId = appId;
|
|
16
|
+
this.compute = compute;
|
|
17
|
+
this.cache = new Map();
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Is `moduleName` deployed + enabled? Cached per module for the client's
|
|
21
|
+
* lifetime ({@link reset} to re-probe after deploys). Resolves false when
|
|
22
|
+
* the client has no compute domain wired.
|
|
23
|
+
*/
|
|
24
|
+
has(moduleName) {
|
|
25
|
+
if (!this.compute)
|
|
26
|
+
return Promise.resolve(false);
|
|
27
|
+
let probe = this.cache.get(moduleName);
|
|
28
|
+
if (!probe) {
|
|
29
|
+
probe = this.probe(moduleName);
|
|
30
|
+
this.cache.set(moduleName, probe);
|
|
31
|
+
}
|
|
32
|
+
return probe;
|
|
33
|
+
}
|
|
34
|
+
/** Drop cached probes (call after deploying/enabling modules). */
|
|
35
|
+
reset() {
|
|
36
|
+
this.cache.clear();
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Invoke an engine export and parse the `{success, ...}` envelope.
|
|
40
|
+
* Envelope failures (denials) resolve — only transport/user errors throw.
|
|
41
|
+
*/
|
|
42
|
+
async invoke(moduleName, exportName, params) {
|
|
43
|
+
if (!this.compute) {
|
|
44
|
+
return {
|
|
45
|
+
success: false,
|
|
46
|
+
reason: 'compute domain unavailable',
|
|
47
|
+
body: {},
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
try {
|
|
51
|
+
const result = await this.compute.invoke({
|
|
52
|
+
appId: this.appId,
|
|
53
|
+
moduleName,
|
|
54
|
+
exportName,
|
|
55
|
+
...(params !== undefined ? { paramsJson: JSON.stringify(params) } : {}),
|
|
56
|
+
});
|
|
57
|
+
let body = {};
|
|
58
|
+
try {
|
|
59
|
+
body = JSON.parse(result.resultJson ?? '{}');
|
|
60
|
+
}
|
|
61
|
+
catch {
|
|
62
|
+
body = {};
|
|
63
|
+
}
|
|
64
|
+
return {
|
|
65
|
+
success: body.success !== false,
|
|
66
|
+
reason: typeof body.reason === 'string' ? body.reason : undefined,
|
|
67
|
+
body: body,
|
|
68
|
+
fuelUsed: result.fuelUsed != null ? String(result.fuelUsed) : undefined,
|
|
69
|
+
durationUs: result.durationUs != null ? Number(result.durationUs) : undefined,
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
catch (error) {
|
|
73
|
+
if (error instanceof CrowdyGraphQLError) {
|
|
74
|
+
return {
|
|
75
|
+
success: false,
|
|
76
|
+
reason: error.message,
|
|
77
|
+
body: {},
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
throw error;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
async probe(moduleName) {
|
|
84
|
+
if (!this.compute)
|
|
85
|
+
return false;
|
|
86
|
+
try {
|
|
87
|
+
const module = await this.compute.module({ appId: this.appId, name: moduleName });
|
|
88
|
+
return module != null && module.enabled === true;
|
|
89
|
+
}
|
|
90
|
+
catch (error) {
|
|
91
|
+
if (!(error instanceof CrowdyGraphQLError))
|
|
92
|
+
throw error;
|
|
93
|
+
if (error.code !== 'FORBIDDEN')
|
|
94
|
+
return false;
|
|
95
|
+
}
|
|
96
|
+
// Player tokens lack view_compute_diagnostics: probe via a status invoke
|
|
97
|
+
// (engines all export one). Missing modules reject; denials mean present.
|
|
98
|
+
try {
|
|
99
|
+
const result = await this.invoke(moduleName, 'status');
|
|
100
|
+
if (result.success)
|
|
101
|
+
return true;
|
|
102
|
+
return !/not found|no such module|not enabled/i.test(result.reason ?? '');
|
|
103
|
+
}
|
|
104
|
+
catch {
|
|
105
|
+
return false;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
}
|
package/dist/kit/index.d.ts
CHANGED
|
@@ -2,18 +2,26 @@ export { andPolicies, combatBlueprint, combatNames, composeBlueprints, decksBlue
|
|
|
2
2
|
export { GameKitClient, type GameKitDomains, type GameKitOptions, type KitDeployResult, } from './kit.js';
|
|
3
3
|
export { MatchesKit, type KitMatch, type KitMatchScore, type MatchesKitOptions, } from './matches.js';
|
|
4
4
|
export { InventoryKit, type InventoryKitOptions, type KitItemStack } from './inventory.js';
|
|
5
|
-
export { CombatKit, type CombatKitOptions, type KitCombatant, type KitStatusEffect, } from './combat.js';
|
|
5
|
+
export { CombatKit, type CombatKitOptions, type KitCombatant, type KitRoutedAttack, type KitStatusEffect, } from './combat.js';
|
|
6
6
|
export { DecksKit, type DecksKitOptions, type KitCard } from './decks.js';
|
|
7
7
|
export { FeaturesKit } from './features.js';
|
|
8
|
-
export { EconomyKit, type EconomyKitOptions, type KitMarketListing, type KitShopListing, type KitTradeOffer, type KitWallet, } from './economy.js';
|
|
8
|
+
export { EconomyKit, MarketKit, type EconomyKitOptions, type KitMarketListing, type KitShopListing, type KitTradeOffer, type KitWallet, } from './economy.js';
|
|
9
9
|
export { LeaderboardsKit, type KitLeaderboardEntry, type LeaderboardsKitOptions, } from './leaderboards.js';
|
|
10
10
|
export { LootKit, type KitLootRoll, type LootKitOptions } from './loot.js';
|
|
11
11
|
export { ObjectsKit, type ObjectsKitOptions } from './objects.js';
|
|
12
|
-
export { NpcsKit, type
|
|
12
|
+
export { NpcsKit, type KitNpc, type LiveNpcPose, type NpcsKitOptions, } from './npcs.js';
|
|
13
|
+
export { MobsKit, type KitAttackResult, type KitMobDef, type KitMobSlot, type MobsKitOptions, } from './mobs.js';
|
|
14
|
+
export { PetsKit, type KitPet, type KitPetResult, type PetsKitOptions, } from './pets.js';
|
|
15
|
+
export { EngineDetector, type EngineInvokeResult } from './engine.js';
|
|
16
|
+
export { InstancesKit, type InstancesKitOptions, type KitInstance, } from './instances.js';
|
|
17
|
+
export { DirectorKit, type DirectorKitOptions, type KitDirectorRun, type KitWaveSpec, } from './director.js';
|
|
18
|
+
export { MatchmakingKit, type KitQueueStatus, type MatchmakingKitOptions, } from './matchmaking.js';
|
|
19
|
+
export { MinigamesKit, type MinigamesKitOptions } from './minigames.js';
|
|
20
|
+
export { EVENT_CONTACT_DAMAGE, EVENT_WEATHER, FLAG_GROUNDED, FLAG_MOB, FLAG_NPC, FLAG_RESERVED3, POSE_BYTES, decodeEnginePose, encodeEnginePose, engineLanes, enginePoseCodec, parseContactDamage, parseEngineEvent, parseProposalEvent, parseScoreEvent, parseTurnEvent, parseWeatherEvent, poseSuffix, EVENT_PROPOSAL, EVENT_SCORE, EVENT_TURN, type ContactDamageEvent, type EnginePose, type ProposalEvent, type ScoreEvent, type TurnEvent, type WeatherEvent, } from './wire.js';
|
|
13
21
|
export { PlotsKit, type PlotsKitOptions, type KitPlot } from './plots.js';
|
|
14
22
|
export { QuestsKit, type KitQuestDef, type KitQuestProgress, type QuestsKitOptions, } from './quests.js';
|
|
15
23
|
export { ProgressionKit, type KitAchievementDef, type KitAchievementUnlock, type KitProgress, type KitSkillDef, type KitSkillRank, type ProgressionKitOptions, } from './progression.js';
|
|
16
24
|
export { SocialKit, type KitChatMessage, type KitGroupWithChannel, type SocialKitOptions, } from './social.js';
|
|
17
|
-
export { WorldsimKit, type KitCrop, type KitResourceNode, type KitWaveSpawner, type KitWorldState, type WorldsimKitOptions, } from './worldsim.js';
|
|
25
|
+
export { WorldsimKit, type KitCrop, type KitForecast, type KitResourceNode, type KitWaveSpawner, type KitWorldState, type WorldsimKitOptions, } from './worldsim.js';
|
|
18
26
|
export { kitInvoke, toKitInvokeResult, type KitInvokeResult, type RawInvokeResult, } from './shared.js';
|
|
19
27
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/kit/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/kit/index.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/kit/index.ts"],"names":[],"mappings":"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"}
|
package/dist/kit/index.js
CHANGED
|
@@ -5,11 +5,19 @@ export { InventoryKit } from './inventory.js';
|
|
|
5
5
|
export { CombatKit, } from './combat.js';
|
|
6
6
|
export { DecksKit } from './decks.js';
|
|
7
7
|
export { FeaturesKit } from './features.js';
|
|
8
|
-
export { EconomyKit, } from './economy.js';
|
|
8
|
+
export { EconomyKit, MarketKit, } from './economy.js';
|
|
9
9
|
export { LeaderboardsKit, } from './leaderboards.js';
|
|
10
10
|
export { LootKit } from './loot.js';
|
|
11
11
|
export { ObjectsKit } from './objects.js';
|
|
12
|
-
export { NpcsKit } from './npcs.js';
|
|
12
|
+
export { NpcsKit, } from './npcs.js';
|
|
13
|
+
export { MobsKit, } from './mobs.js';
|
|
14
|
+
export { PetsKit, } from './pets.js';
|
|
15
|
+
export { EngineDetector } from './engine.js';
|
|
16
|
+
export { InstancesKit, } from './instances.js';
|
|
17
|
+
export { DirectorKit, } from './director.js';
|
|
18
|
+
export { MatchmakingKit, } from './matchmaking.js';
|
|
19
|
+
export { MinigamesKit } from './minigames.js';
|
|
20
|
+
export { EVENT_CONTACT_DAMAGE, EVENT_WEATHER, FLAG_GROUNDED, FLAG_MOB, FLAG_NPC, FLAG_RESERVED3, POSE_BYTES, decodeEnginePose, encodeEnginePose, engineLanes, enginePoseCodec, parseContactDamage, parseEngineEvent, parseProposalEvent, parseScoreEvent, parseTurnEvent, parseWeatherEvent, poseSuffix, EVENT_PROPOSAL, EVENT_SCORE, EVENT_TURN, } from './wire.js';
|
|
13
21
|
export { PlotsKit } from './plots.js';
|
|
14
22
|
export { QuestsKit, } from './quests.js';
|
|
15
23
|
export { ProgressionKit, } from './progression.js';
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import type { Scalars } from '../generated/graphql.js';
|
|
2
|
+
import type { EngineDetector } from './engine.js';
|
|
3
|
+
/** Options for {@link InstancesKit}. */
|
|
4
|
+
export interface InstancesKitOptions {
|
|
5
|
+
/** The instance-engine module name. Defaults to `'instance-engine'`. */
|
|
6
|
+
moduleName?: string;
|
|
7
|
+
}
|
|
8
|
+
/** A parsed instance (private world slice). */
|
|
9
|
+
export interface KitInstance {
|
|
10
|
+
instanceId: string;
|
|
11
|
+
name: string;
|
|
12
|
+
creator: string;
|
|
13
|
+
members: string[];
|
|
14
|
+
/** Decimal string (u64 seeds exceed JS safe integers). */
|
|
15
|
+
seed: string;
|
|
16
|
+
status: string;
|
|
17
|
+
outcome: string;
|
|
18
|
+
sessionId: string;
|
|
19
|
+
containerId: string;
|
|
20
|
+
/** Reserved chunk-volume corner [x, y, z]. */
|
|
21
|
+
chunkBase: [number, number, number];
|
|
22
|
+
volumeChunks: number;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Runtime helpers for the instance-engine (Wave 2): private world slices
|
|
26
|
+
* with lifecycle (open/join/complete), per-run seeds for deterministic
|
|
27
|
+
* procedural content, and reserved disjoint chunk volumes. v1 spatial
|
|
28
|
+
* isolation is by-convention (disjoint volumes + distance-scoped emits).
|
|
29
|
+
*
|
|
30
|
+
* Obtained via `client.kit(appId).instances`.
|
|
31
|
+
*/
|
|
32
|
+
export declare class InstancesKit {
|
|
33
|
+
private readonly engines;
|
|
34
|
+
private readonly moduleName;
|
|
35
|
+
constructor(_appId: Scalars['BigInt']['input'], engines: EngineDetector, options?: InstancesKitOptions);
|
|
36
|
+
/** Is the instance engine deployed + enabled (cached per session)? */
|
|
37
|
+
engineAvailable(): Promise<boolean>;
|
|
38
|
+
/** Open a new instance (caller becomes creator + first member). */
|
|
39
|
+
open(input?: {
|
|
40
|
+
name?: string;
|
|
41
|
+
seed?: string;
|
|
42
|
+
sessionId?: string;
|
|
43
|
+
}): Promise<KitInstance>;
|
|
44
|
+
/** Join an open instance. */
|
|
45
|
+
join(instanceId: string): Promise<KitInstance>;
|
|
46
|
+
/** Complete an instance (member-only; announces `instance_completed`). */
|
|
47
|
+
complete(instanceId: string, outcome?: string): Promise<KitInstance>;
|
|
48
|
+
/** One instance's state (or the engine's totals without an id). */
|
|
49
|
+
state(instanceId?: string): Promise<KitInstance | Record<string, unknown>>;
|
|
50
|
+
private invoke;
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=instances.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"instances.d.ts","sourceRoot":"","sources":["../../src/kit/instances.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,KAAK,EAAE,cAAc,EAAsB,MAAM,aAAa,CAAC;AAEtE,wCAAwC;AACxC,MAAM,WAAW,mBAAmB;IAClC,wEAAwE;IACxE,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,+CAA+C;AAC/C,MAAM,WAAW,WAAW;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,0DAA0D;IAC1D,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,8CAA8C;IAC9C,SAAS,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IACpC,YAAY,EAAE,MAAM,CAAC;CACtB;AAsBD;;;;;;;GAOG;AACH,qBAAa,YAAY;IAKrB,OAAO,CAAC,QAAQ,CAAC,OAAO;IAJ1B,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;gBAGlC,MAAM,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,EACjB,OAAO,EAAE,cAAc,EACxC,OAAO,GAAE,mBAAwB;IAKnC,sEAAsE;IACtE,eAAe,IAAI,OAAO,CAAC,OAAO,CAAC;IAInC,mEAAmE;IAC7D,IAAI,CAAC,KAAK,GAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAO,GAAG,OAAO,CAAC,WAAW,CAAC;IAKlG,6BAA6B;IACvB,IAAI,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAKpD,0EAA0E;IACpE,QAAQ,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAK1E,mEAAmE;IAC7D,KAAK,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;YAKlE,MAAM;CAUrB"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
function toInstance(body) {
|
|
2
|
+
return {
|
|
3
|
+
instanceId: String(body.instanceId ?? ''),
|
|
4
|
+
name: String(body.name ?? ''),
|
|
5
|
+
creator: String(body.creator ?? ''),
|
|
6
|
+
members: Array.isArray(body.members) ? body.members.map(String) : [],
|
|
7
|
+
seed: String(body.seed ?? '0'),
|
|
8
|
+
status: String(body.status ?? ''),
|
|
9
|
+
outcome: String(body.outcome ?? ''),
|
|
10
|
+
sessionId: String(body.sessionId ?? ''),
|
|
11
|
+
containerId: String(body.containerId ?? ''),
|
|
12
|
+
chunkBase: (Array.isArray(body.chunkBase) ? body.chunkBase : [0, 0, 0]).map(Number),
|
|
13
|
+
volumeChunks: Number(body.volumeChunks ?? 0),
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Runtime helpers for the instance-engine (Wave 2): private world slices
|
|
18
|
+
* with lifecycle (open/join/complete), per-run seeds for deterministic
|
|
19
|
+
* procedural content, and reserved disjoint chunk volumes. v1 spatial
|
|
20
|
+
* isolation is by-convention (disjoint volumes + distance-scoped emits).
|
|
21
|
+
*
|
|
22
|
+
* Obtained via `client.kit(appId).instances`.
|
|
23
|
+
*/
|
|
24
|
+
export class InstancesKit {
|
|
25
|
+
constructor(_appId, engines, options = {}) {
|
|
26
|
+
this.engines = engines;
|
|
27
|
+
this.moduleName = options.moduleName ?? 'instance-engine';
|
|
28
|
+
}
|
|
29
|
+
/** Is the instance engine deployed + enabled (cached per session)? */
|
|
30
|
+
engineAvailable() {
|
|
31
|
+
return this.engines.has(this.moduleName);
|
|
32
|
+
}
|
|
33
|
+
/** Open a new instance (caller becomes creator + first member). */
|
|
34
|
+
async open(input = {}) {
|
|
35
|
+
const result = await this.invoke('open', input);
|
|
36
|
+
return toInstance(result.body);
|
|
37
|
+
}
|
|
38
|
+
/** Join an open instance. */
|
|
39
|
+
async join(instanceId) {
|
|
40
|
+
const result = await this.invoke('join', { instanceId });
|
|
41
|
+
return toInstance(result.body);
|
|
42
|
+
}
|
|
43
|
+
/** Complete an instance (member-only; announces `instance_completed`). */
|
|
44
|
+
async complete(instanceId, outcome) {
|
|
45
|
+
const result = await this.invoke('complete', { instanceId, outcome });
|
|
46
|
+
return toInstance(result.body);
|
|
47
|
+
}
|
|
48
|
+
/** One instance's state (or the engine's totals without an id). */
|
|
49
|
+
async state(instanceId) {
|
|
50
|
+
const result = await this.invoke('state', instanceId ? { instanceId } : {});
|
|
51
|
+
return instanceId ? toInstance(result.body) : result.body;
|
|
52
|
+
}
|
|
53
|
+
async invoke(exportName, params) {
|
|
54
|
+
const result = await this.engines.invoke(this.moduleName, exportName, params);
|
|
55
|
+
if (!result.success) {
|
|
56
|
+
throw new Error(`instances.${exportName} failed: ${result.reason ?? 'unknown'}`);
|
|
57
|
+
}
|
|
58
|
+
return result;
|
|
59
|
+
}
|
|
60
|
+
}
|