@crowdedkingdoms/crowdyjs 8.7.0 → 8.9.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.
Files changed (83) hide show
  1. package/MIGRATION.md +85 -0
  2. package/README.md +2 -2
  3. package/dist/domains/compute.d.ts +12 -1
  4. package/dist/domains/compute.d.ts.map +1 -1
  5. package/dist/domains/compute.js +18 -1
  6. package/dist/generated/graphql.d.ts +60 -0
  7. package/dist/generated/graphql.d.ts.map +1 -1
  8. package/dist/generated/graphql.js +2 -0
  9. package/dist/index.d.ts +2 -2
  10. package/dist/index.d.ts.map +1 -1
  11. package/dist/index.js +2 -2
  12. package/dist/kit/abilities.d.ts +66 -0
  13. package/dist/kit/abilities.d.ts.map +1 -0
  14. package/dist/kit/abilities.js +71 -0
  15. package/dist/kit/blueprints/index.d.ts +2 -0
  16. package/dist/kit/blueprints/index.d.ts.map +1 -1
  17. package/dist/kit/blueprints/index.js +2 -0
  18. package/dist/kit/blueprints/liveops.d.ts +42 -0
  19. package/dist/kit/blueprints/liveops.d.ts.map +1 -0
  20. package/dist/kit/blueprints/liveops.js +170 -0
  21. package/dist/kit/blueprints/moderation.d.ts +32 -0
  22. package/dist/kit/blueprints/moderation.d.ts.map +1 -0
  23. package/dist/kit/blueprints/moderation.js +140 -0
  24. package/dist/kit/decks.d.ts +33 -1
  25. package/dist/kit/decks.d.ts.map +1 -1
  26. package/dist/kit/decks.js +49 -1
  27. package/dist/kit/director.d.ts +88 -0
  28. package/dist/kit/director.d.ts.map +1 -0
  29. package/dist/kit/director.js +86 -0
  30. package/dist/kit/economy.d.ts +46 -1
  31. package/dist/kit/economy.d.ts.map +1 -1
  32. package/dist/kit/economy.js +63 -1
  33. package/dist/kit/index.d.ts +14 -3
  34. package/dist/kit/index.d.ts.map +1 -1
  35. package/dist/kit/index.js +14 -3
  36. package/dist/kit/instances.d.ts +52 -0
  37. package/dist/kit/instances.d.ts.map +1 -0
  38. package/dist/kit/instances.js +60 -0
  39. package/dist/kit/kit.d.ts +60 -0
  40. package/dist/kit/kit.d.ts.map +1 -1
  41. package/dist/kit/kit.js +47 -5
  42. package/dist/kit/leaderboards.d.ts +21 -1
  43. package/dist/kit/leaderboards.d.ts.map +1 -1
  44. package/dist/kit/leaderboards.js +40 -1
  45. package/dist/kit/liveops.d.ts +112 -0
  46. package/dist/kit/liveops.d.ts.map +1 -0
  47. package/dist/kit/liveops.js +183 -0
  48. package/dist/kit/loot.d.ts +22 -1
  49. package/dist/kit/loot.d.ts.map +1 -1
  50. package/dist/kit/loot.js +41 -1
  51. package/dist/kit/matches.d.ts +33 -1
  52. package/dist/kit/matches.d.ts.map +1 -1
  53. package/dist/kit/matches.js +56 -1
  54. package/dist/kit/matchmaking.d.ts +57 -0
  55. package/dist/kit/matchmaking.d.ts.map +1 -0
  56. package/dist/kit/matchmaking.js +59 -0
  57. package/dist/kit/minigames.d.ts +30 -0
  58. package/dist/kit/minigames.d.ts.map +1 -0
  59. package/dist/kit/minigames.js +38 -0
  60. package/dist/kit/moderation.d.ts +73 -0
  61. package/dist/kit/moderation.d.ts.map +1 -0
  62. package/dist/kit/moderation.js +103 -0
  63. package/dist/kit/movement.d.ts +78 -0
  64. package/dist/kit/movement.d.ts.map +1 -0
  65. package/dist/kit/movement.js +103 -0
  66. package/dist/kit/npcs.d.ts.map +1 -1
  67. package/dist/kit/quests.d.ts +57 -0
  68. package/dist/kit/quests.d.ts.map +1 -1
  69. package/dist/kit/quests.js +72 -0
  70. package/dist/kit/racing.d.ts +85 -0
  71. package/dist/kit/racing.d.ts.map +1 -0
  72. package/dist/kit/racing.js +99 -0
  73. package/dist/kit/social.d.ts.map +1 -1
  74. package/dist/kit/telemetry.d.ts +66 -0
  75. package/dist/kit/telemetry.d.ts.map +1 -0
  76. package/dist/kit/telemetry.js +133 -0
  77. package/dist/kit/territory.d.ts +97 -0
  78. package/dist/kit/territory.d.ts.map +1 -0
  79. package/dist/kit/territory.js +114 -0
  80. package/dist/kit/wire.d.ts +88 -0
  81. package/dist/kit/wire.d.ts.map +1 -1
  82. package/dist/kit/wire.js +110 -0
  83. package/package.json +1 -1
@@ -0,0 +1,140 @@
1
+ import { toSnakeCase, trustedAuthorityFields } from './core.js';
2
+ /** Compute the type/function names a moderation blueprint (and its runtime helper) uses. */
3
+ export function moderationNames(typePrefix = '') {
4
+ const fnPrefix = typePrefix ? `${toSnakeCase(typePrefix)}_` : '';
5
+ return {
6
+ reportType: `${typePrefix}ModReport`,
7
+ muteType: `${typePrefix}ModMute`,
8
+ fileReportFn: `${fnPrefix}file_report`,
9
+ resolveReportFn: `${fnPrefix}resolve_report`,
10
+ };
11
+ }
12
+ /**
13
+ * Blueprint for **moderation** (matrix P6) — MODEL + CLIENT, no compute:
14
+ *
15
+ * - `ModReport` containers are the escalation queue: any player files one
16
+ * against a subject (`file_report` is member-instantiable through the
17
+ * runtime helper — the caller's own report row); app admins read the
18
+ * open queue and `resolve_report` with a disposition.
19
+ * - `ModMute` containers are per-player mute lists (client-enforced: the
20
+ * runtime helper filters chat client-side — mutes are personal, not
21
+ * punitive).
22
+ * - ENFORCEMENT stays on existing platform surfaces: admins revoke access
23
+ * tiers / grid permissions; nothing new to trust here.
24
+ *
25
+ * Runtime counterpart: `client.kit(appId).moderation`.
26
+ */
27
+ export function moderationBlueprint(options = {}) {
28
+ const { typePrefix = '' } = options;
29
+ const names = moderationNames(typePrefix);
30
+ const propertyDefinitions = [
31
+ {
32
+ containerTypeName: names.reportType,
33
+ key: 'reporter_user_id',
34
+ valueType: 'string',
35
+ defaultValueJson: '""',
36
+ description: 'Who filed the report.',
37
+ },
38
+ {
39
+ containerTypeName: names.reportType,
40
+ key: 'subject_user_id',
41
+ valueType: 'string',
42
+ defaultValueJson: '""',
43
+ description: 'Who the report is about.',
44
+ },
45
+ {
46
+ containerTypeName: names.reportType,
47
+ key: 'reason',
48
+ valueType: 'string',
49
+ defaultValueJson: '""',
50
+ description: "App-defined category ('harassment', 'cheating', 'spam', ...).",
51
+ },
52
+ {
53
+ containerTypeName: names.reportType,
54
+ key: 'detail',
55
+ valueType: 'string',
56
+ defaultValueJson: '""',
57
+ description: 'Free-text context from the reporter (client-truncated).',
58
+ },
59
+ {
60
+ containerTypeName: names.reportType,
61
+ key: 'status',
62
+ valueType: 'string',
63
+ defaultValueJson: '"open"',
64
+ description: "Queue state: 'open' | 'actioned' | 'dismissed'.",
65
+ },
66
+ {
67
+ containerTypeName: names.reportType,
68
+ key: 'resolution',
69
+ valueType: 'string',
70
+ defaultValueJson: '""',
71
+ description: 'Admin note recorded by resolve_report.',
72
+ },
73
+ {
74
+ containerTypeName: names.reportType,
75
+ key: 'filed_at_ms',
76
+ valueType: 'int',
77
+ defaultValueJson: '0',
78
+ description: 'Client-reported epoch ms (informational; the event log holds server time).',
79
+ },
80
+ {
81
+ containerTypeName: names.muteType,
82
+ key: 'owner_user_id',
83
+ valueType: 'string',
84
+ defaultValueJson: '""',
85
+ description: 'Whose mute list this row belongs to (kit owner mirror).',
86
+ },
87
+ {
88
+ containerTypeName: names.muteType,
89
+ key: 'muted_user_id',
90
+ valueType: 'string',
91
+ defaultValueJson: '""',
92
+ description: 'The muted player (client-side chat filtering).',
93
+ },
94
+ ];
95
+ const functions = [
96
+ {
97
+ name: names.resolveReportFn,
98
+ containerTypeName: names.reportType,
99
+ returnType: 'string',
100
+ parameters: [
101
+ {
102
+ name: 'status',
103
+ valueType: 'string',
104
+ required: true,
105
+ description: "'actioned' or 'dismissed'.",
106
+ },
107
+ {
108
+ name: 'resolution',
109
+ valueType: 'string',
110
+ required: true,
111
+ description: 'Admin disposition note.',
112
+ },
113
+ ],
114
+ mutations: [
115
+ { target: 'self', property: 'status', expression: '$status' },
116
+ { target: 'self', property: 'resolution', expression: '$resolution' },
117
+ ],
118
+ returnExpression: 'self.status',
119
+ ...trustedAuthorityFields('server'),
120
+ description: 'Close a report with a disposition (app admins). Enforcement happens on platform surfaces (tier revocation, grid permissions).',
121
+ },
122
+ ];
123
+ return {
124
+ name: 'moderation',
125
+ containerTypes: [
126
+ {
127
+ typeName: names.reportType,
128
+ displayName: 'Moderation report',
129
+ description: 'One player report in the escalation queue (open/actioned/dismissed).',
130
+ },
131
+ {
132
+ typeName: names.muteType,
133
+ displayName: 'Moderation mute',
134
+ description: 'One personal mute entry (client-enforced chat filtering).',
135
+ },
136
+ ],
137
+ propertyDefinitions,
138
+ functions,
139
+ };
140
+ }
@@ -1,8 +1,14 @@
1
1
  import type { GameModelAPI } from '../domains/gameModel.js';
2
+ import type { EngineDetector } from './engine.js';
2
3
  import type { Scalars } from '../generated/graphql.js';
3
4
  import { type KitInvokeResult } from './shared.js';
4
5
  /** Options for {@link DecksKit}. Must match the deployed decks blueprint. */
5
6
  export interface DecksKitOptions {
7
+ /**
8
+ * The compute module holding hidden hands when the app runs a deck
9
+ * engine. Defaults to `'deck-engine'`.
10
+ */
11
+ engineModuleName?: string;
6
12
  /** The `typePrefix` the decks blueprint was deployed with. */
7
13
  typePrefix?: string;
8
14
  }
@@ -33,8 +39,34 @@ export interface KitCard {
33
39
  export declare class DecksKit {
34
40
  private readonly appId;
35
41
  private readonly gameModel;
42
+ private readonly engines?;
36
43
  private readonly names;
37
- constructor(appId: Scalars['BigInt']['input'], gameModel: GameModelAPI, options?: DecksKitOptions);
44
+ constructor(appId: Scalars['BigInt']['input'], gameModel: GameModelAPI, options?: DecksKitOptions, engines?: EngineDetector | undefined);
45
+ private readonly engineModuleName;
46
+ /**
47
+ * Is a deck compute engine deployed + enabled (cached per session)? When
48
+ * true, hands and deck order live in MODULE state (server-held secrets);
49
+ * the blueprint's owner-visibility hands remain for model-only apps.
50
+ */
51
+ engineAvailable(): Promise<boolean>;
52
+ /** Create an engine table with seeded shuffle + hidden deals (creator seats itself). */
53
+ engineNewTable(input: {
54
+ tableId: string;
55
+ players: string[];
56
+ handSize?: number;
57
+ deckDef?: string;
58
+ }): Promise<Record<string, unknown>>;
59
+ /** YOUR hidden hand (the only read path; opponents can never see it). */
60
+ engineHand(tableId: string): Promise<string[]>;
61
+ /** Draw one card into your hidden hand. */
62
+ engineDraw(tableId: string): Promise<Record<string, unknown>>;
63
+ /** Play (reveal) a card from your hand into a public zone. */
64
+ enginePlay(tableId: string, card: string, zone?: string): Promise<Record<string, unknown>>;
65
+ /** Collect a public zone to the discard (trick taken). */
66
+ engineTakeZone(tableId: string, zone: string): Promise<Record<string, unknown>>;
67
+ /** The public table view (counts + zones — never hidden hands). */
68
+ engineTable(tableId: string): Promise<Record<string, unknown>>;
69
+ private engineInvoke;
38
70
  /**
39
71
  * Deal a deck to a player: creates one CardInstance per card id (zone
40
72
  * `deck`), owned by the player. Run {@link shuffle} afterwards to deal
@@ -1 +1 @@
1
- {"version":3,"file":"decks.d.ts","sourceRoot":"","sources":["../../src/kit/decks.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAEvD,OAAO,EAGL,KAAK,eAAe,EACrB,MAAM,aAAa,CAAC;AAErB,6EAA6E;AAC7E,MAAM,WAAW,eAAe;IAC9B,8DAA8D;IAC9D,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,oEAAoE;AACpE,MAAM,WAAW,OAAO;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B;;;OAGG;IACH,MAAM,EAAE,MAAM,CAAC;IACf,0DAA0D;IAC1D,cAAc,EAAE,MAAM,CAAC;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;;;;;;;GAQG;AACH,qBAAa,QAAQ;IAIjB,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAJ5B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAa;gBAGhB,KAAK,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,EACjC,SAAS,EAAE,YAAY,EACxC,OAAO,GAAE,eAAoB;IAK/B;;;;OAIG;IACG,IAAI,CAAC,KAAK,EAAE;QAChB,WAAW,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,CAAC;QACxC,OAAO,EAAE,MAAM,EAAE,CAAC;QAClB,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB;;;;;;;;;;;IAwBD;;;;OAIG;IACG,OAAO;;;;;;;;;;;;;;;;;;;;;;IAOb,8DAA8D;IACxD,KAAK,CACT,WAAW,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,GAAG,IAAI,EAC9C,OAAO,GAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAO,GAClD,OAAO,CAAC,OAAO,EAAE,CAAC;IA2BrB,iEAAiE;IAC3D,MAAM,CACV,WAAW,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,EACvC,OAAO,GAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAO,GACnC,OAAO,CAAC,OAAO,EAAE,CAAC;IAIrB,sDAAsD;IAChD,KAAK,CAAC,OAAO,GAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAO,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;IAIrE;;;;OAIG;IACG,IAAI,CACR,WAAW,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,EACvC,OAAO,GAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAO,GACnC,OAAO,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;IASnC,yEAAyE;IACnE,QAAQ,CACZ,cAAc,EAAE,MAAM,EACtB,OAAO,GAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAO,GACnC,OAAO,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;IAUnC;;;OAGG;IACG,IAAI,CACR,cAAc,EAAE,MAAM,EACtB,OAAO,GAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAO,GACnC,OAAO,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;IAUnC,8BAA8B;IACxB,OAAO,CACX,cAAc,EAAE,MAAM,EACtB,OAAO,GAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAO,GACnC,OAAO,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;YAUrB,MAAM;CAsBrB"}
1
+ {"version":3,"file":"decks.d.ts","sourceRoot":"","sources":["../../src/kit/decks.ts"],"names":[],"mappings":"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"}
package/dist/kit/decks.js CHANGED
@@ -10,10 +10,58 @@ import { kitContainerProperties, kitInvoke, } from './shared.js';
10
10
  * Obtained via `client.kit(appId).decks`.
11
11
  */
12
12
  export class DecksKit {
13
- constructor(appId, gameModel, options = {}) {
13
+ constructor(appId, gameModel, options = {}, engines) {
14
14
  this.appId = appId;
15
15
  this.gameModel = gameModel;
16
+ this.engines = engines;
16
17
  this.names = decksNames(options.typePrefix ?? '');
18
+ this.engineModuleName = options.engineModuleName ?? 'deck-engine';
19
+ }
20
+ // -- Engine path (Wave 2): true hidden information over the deck engine --
21
+ /**
22
+ * Is a deck compute engine deployed + enabled (cached per session)? When
23
+ * true, hands and deck order live in MODULE state (server-held secrets);
24
+ * the blueprint's owner-visibility hands remain for model-only apps.
25
+ */
26
+ engineAvailable() {
27
+ if (!this.engines)
28
+ return Promise.resolve(false);
29
+ return this.engines.has(this.engineModuleName);
30
+ }
31
+ /** Create an engine table with seeded shuffle + hidden deals (creator seats itself). */
32
+ async engineNewTable(input) {
33
+ return this.engineInvoke('new_table', input);
34
+ }
35
+ /** YOUR hidden hand (the only read path; opponents can never see it). */
36
+ async engineHand(tableId) {
37
+ const body = await this.engineInvoke('hand', { tableId });
38
+ return Array.isArray(body.hand) ? body.hand.map(String) : [];
39
+ }
40
+ /** Draw one card into your hidden hand. */
41
+ async engineDraw(tableId) {
42
+ return this.engineInvoke('draw', { tableId });
43
+ }
44
+ /** Play (reveal) a card from your hand into a public zone. */
45
+ async enginePlay(tableId, card, zone = 'table') {
46
+ return this.engineInvoke('play', { tableId, card, zone });
47
+ }
48
+ /** Collect a public zone to the discard (trick taken). */
49
+ async engineTakeZone(tableId, zone) {
50
+ return this.engineInvoke('take_zone', { tableId, zone });
51
+ }
52
+ /** The public table view (counts + zones — never hidden hands). */
53
+ async engineTable(tableId) {
54
+ return this.engineInvoke('table', { tableId });
55
+ }
56
+ async engineInvoke(exportName, params) {
57
+ if (!this.engines) {
58
+ throw new Error('deck engine unavailable: compute domain not wired');
59
+ }
60
+ const result = await this.engines.invoke(this.engineModuleName, exportName, params);
61
+ if (!result.success) {
62
+ throw new Error(`decks.${exportName} failed: ${result.reason ?? 'unknown'}`);
63
+ }
64
+ return result.body;
17
65
  }
18
66
  /**
19
67
  * Deal a deck to a player: creates one CardInstance per card id (zone
@@ -0,0 +1,88 @@
1
+ import type { GameModelAPI } from '../domains/gameModel.js';
2
+ import type { Scalars } from '../generated/graphql.js';
3
+ import type { EngineDetector } from './engine.js';
4
+ /** Options for {@link DirectorKit}. */
5
+ export interface DirectorKitOptions {
6
+ /** The director module name. Defaults to `'director'`. */
7
+ moduleName?: string;
8
+ /** The encounter-definition container type. Defaults to `'EncounterDef'`. */
9
+ defTypeName?: string;
10
+ }
11
+ /** One wave of an encounter definition. */
12
+ export interface KitWaveSpec {
13
+ units: Array<{
14
+ mobId: string;
15
+ count: number;
16
+ }>;
17
+ delayMs?: number;
18
+ /** Boss wave: hp + phase thresholds (descending hp percentages). */
19
+ boss?: {
20
+ hp: number;
21
+ phases?: number[];
22
+ };
23
+ }
24
+ /** A director run's state. */
25
+ export interface KitDirectorRun {
26
+ runId: string;
27
+ encounterId: string;
28
+ players: number;
29
+ phase: Record<string, unknown>;
30
+ pending: number;
31
+ wavesCleared: number;
32
+ wavesTotal: number;
33
+ boss: {
34
+ hp: number;
35
+ maxHp: number;
36
+ phase: number;
37
+ thresholds: number[];
38
+ } | null;
39
+ finished: boolean;
40
+ outcome: string;
41
+ }
42
+ /**
43
+ * Runtime helpers for the director engine (Wave 2): data-driven encounter
44
+ * direction — wave schedules, spawn budgets, boss phases, party scaling.
45
+ * The director emits `director_spawn` compute events; the mob layer
46
+ * simulates and reports kills back.
47
+ *
48
+ * Obtained via `client.kit(appId).director`.
49
+ */
50
+ export declare class DirectorKit {
51
+ private readonly appId;
52
+ private readonly gameModel;
53
+ private readonly engines;
54
+ private readonly moduleName;
55
+ private readonly defTypeName;
56
+ constructor(appId: Scalars['BigInt']['input'], gameModel: GameModelAPI, engines: EngineDetector, options?: DirectorKitOptions);
57
+ /** Is the director deployed + enabled (cached per session)? */
58
+ engineAvailable(): Promise<boolean>;
59
+ /** STUDIO (admin) — create an encounter definition container. */
60
+ defineEncounter(input: {
61
+ encounterId: string;
62
+ displayName?: string;
63
+ waves: KitWaveSpec[];
64
+ spawnBudget?: number;
65
+ }): Promise<{
66
+ __typename?: "GmContainer";
67
+ containerId: string;
68
+ appId: string;
69
+ sessionId: string | null;
70
+ typeName: string;
71
+ displayName: string;
72
+ description: string | null;
73
+ ownerUserId: string | null;
74
+ metadataJson: string;
75
+ }>;
76
+ /** Start a run (party size scales unit counts server-side). */
77
+ startRun(encounterId: string, players?: number): Promise<KitDirectorRun>;
78
+ /** Report kills toward the live wave (trusted callers/engines). */
79
+ reportKill(runId: string, count?: number): Promise<KitDirectorRun>;
80
+ /** Report boss hp; phase transitions announce on the compute bus. */
81
+ reportBossHp(runId: string, hp: number): Promise<KitDirectorRun>;
82
+ /** Force-clear the live wave (run creator only). */
83
+ skipWave(runId: string): Promise<KitDirectorRun>;
84
+ /** One run's state (or engine totals without an id). */
85
+ runState(runId?: string): Promise<KitDirectorRun | Record<string, unknown>>;
86
+ private invoke;
87
+ }
88
+ //# sourceMappingURL=director.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"director.d.ts","sourceRoot":"","sources":["../../src/kit/director.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAElD,uCAAuC;AACvC,MAAM,WAAW,kBAAkB;IACjC,0DAA0D;IAC1D,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,6EAA6E;IAC7E,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,2CAA2C;AAC3C,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC/C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,oEAAoE;IACpE,IAAI,CAAC,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;CAC1C;AAED,8BAA8B;AAC9B,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,EAAE,CAAA;KAAE,GAAG,IAAI,CAAC;IAChF,QAAQ,EAAE,OAAO,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;CACjB;AAyBD;;;;;;;GAOG;AACH,qBAAa,WAAW;IAKpB,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,OAAO;IAN1B,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;gBAGlB,KAAK,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,EACjC,SAAS,EAAE,YAAY,EACvB,OAAO,EAAE,cAAc,EACxC,OAAO,GAAE,kBAAuB;IAMlC,+DAA+D;IAC/D,eAAe,IAAI,OAAO,CAAC,OAAO,CAAC;IAInC,iEAAiE;IAC3D,eAAe,CAAC,KAAK,EAAE;QAC3B,WAAW,EAAE,MAAM,CAAC;QACpB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,KAAK,EAAE,WAAW,EAAE,CAAC;QACrB,WAAW,CAAC,EAAE,MAAM,CAAC;KACtB;;;;;;;;;;;IAeD,+DAA+D;IACzD,QAAQ,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,SAAI,GAAG,OAAO,CAAC,cAAc,CAAC;IAIzE,mEAAmE;IAC7D,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,SAAI,GAAG,OAAO,CAAC,cAAc,CAAC;IAInE,qEAAqE;IAC/D,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAItE,oDAAoD;IAC9C,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAItD,wDAAwD;IAClD,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;YAKnE,MAAM;CAOrB"}
@@ -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
+ }
@@ -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":"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"}
1
+ {"version":3,"file":"economy.d.ts","sourceRoot":"","sources":["../../src/kit/economy.ts"],"names":[],"mappings":"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"}
@@ -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
+ }