@magicweave/core 0.1.0 → 0.1.1

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/dist/index.cjs CHANGED
@@ -6,14 +6,14 @@ var __getOwnPropNames = Object.getOwnPropertyNames;
6
6
  var __getProtoOf = Object.getPrototypeOf;
7
7
  var __hasOwnProp = Object.prototype.hasOwnProperty;
8
8
  var __export = (target, all) => {
9
- for (var name in all)
10
- __defProp(target, name, { get: all[name], enumerable: true });
9
+ for (var name2 in all)
10
+ __defProp(target, name2, { get: all[name2], enumerable: true });
11
11
  };
12
12
  var __copyProps = (to, from, except, desc) => {
13
13
  if (from && typeof from === "object" || typeof from === "function") {
14
- for (let key of __getOwnPropNames(from))
15
- if (!__hasOwnProp.call(to, key) && key !== except)
16
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
14
+ for (let key2 of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key2) && key2 !== except)
16
+ __defProp(to, key2, { get: () => from[key2], enumerable: !(desc = __getOwnPropDesc(from, key2)) || desc.enumerable });
17
17
  }
18
18
  return to;
19
19
  };
@@ -74,7 +74,22 @@ var import_openapi_fetch = __toESM(require("openapi-fetch"), 1);
74
74
  var STAGING_API_BASE = "https://console.staging.magicweave.xyz/api";
75
75
  var PROD_API_BASE = "https://console.magicweave.xyz/api";
76
76
  function resolveBaseUrl(explicit) {
77
- return explicit ?? process.env.MW_API_BASE ?? STAGING_API_BASE;
77
+ const raw = explicit ?? process.env.MW_API_BASE ?? STAGING_API_BASE;
78
+ let url;
79
+ try {
80
+ url = new URL(raw);
81
+ } catch {
82
+ throw new MagicweaveError(`Invalid API base URL: ${raw}`, 0, "invalid_api_base");
83
+ }
84
+ const isLoopback = url.hostname === "localhost" || url.hostname === "127.0.0.1" || url.hostname === "[::1]";
85
+ if (url.protocol !== "https:" && !(url.protocol === "http:" && isLoopback)) {
86
+ throw new MagicweaveError(
87
+ `Refusing to use a non-HTTPS API base URL: ${raw}. Credentials are only sent over HTTPS (plain http is allowed for localhost only).`,
88
+ 0,
89
+ "insecure_api_base"
90
+ );
91
+ }
92
+ return raw;
78
93
  }
79
94
  var MagicweaveError = class extends Error {
80
95
  constructor(message, status, code, detail) {
@@ -239,7 +254,7 @@ var EnvTokenProvider = class {
239
254
  function orgs(client) {
240
255
  return {
241
256
  list: () => unwrap(client.raw.GET("/org/")),
242
- create: (name) => unwrap(client.raw.POST("/org/", { body: { name } })),
257
+ create: (name2) => unwrap(client.raw.POST("/org/", { body: { name: name2 } })),
243
258
  remove: (orgId) => unwrap(client.raw.DELETE("/org/{org_id}/", { params: { path: { org_id: orgId } } }))
244
259
  };
245
260
  }
@@ -248,10 +263,10 @@ function orgs(client) {
248
263
  function projects(client) {
249
264
  return {
250
265
  list: (orgId) => unwrap(client.raw.GET("/project/{org_id}", { params: { path: { org_id: orgId } } })),
251
- create: (orgId, name) => unwrap(
266
+ create: (orgId, name2) => unwrap(
252
267
  client.raw.POST("/project/{org_id}", {
253
268
  params: { path: { org_id: orgId } },
254
- body: { name }
269
+ body: { name: name2 }
255
270
  })
256
271
  ),
257
272
  remove: (orgId, projectId) => unwrap(
@@ -281,10 +296,10 @@ function environments(client) {
281
296
  params: base(orgId, projectId)
282
297
  })
283
298
  ),
284
- create: (orgId, projectId, name) => unwrap(
299
+ create: (orgId, projectId, name2) => unwrap(
285
300
  client.raw.POST("/project/{org_id}/{project_id}/environments/", {
286
301
  params: base(orgId, projectId),
287
- body: { name }
302
+ body: { name: name2 }
288
303
  })
289
304
  ),
290
305
  remove: (orgId, projectId, environmentId) => unwrap(
@@ -663,18 +678,22 @@ __export(spec_exports, {
663
678
  WheelSpec: () => WheelSpec
664
679
  });
665
680
  var import_zod = require("zod");
681
+ var MAX_KEY = 128;
682
+ var MAX_NAME = 255;
683
+ var key = () => import_zod.z.string().max(MAX_KEY);
684
+ var name = () => import_zod.z.string().max(MAX_NAME);
666
685
  var CurrencySpec = import_zod.z.object({
667
- key: import_zod.z.string(),
668
- name: import_zod.z.string(),
669
- symbol: import_zod.z.string().default(""),
686
+ key: key(),
687
+ name: name(),
688
+ symbol: import_zod.z.string().max(16).default(""),
670
689
  initial_balance: import_zod.z.number().int().default(0),
671
690
  max_balance: import_zod.z.number().int().nullable().default(null),
672
691
  usable_as_reward: import_zod.z.boolean().default(true),
673
692
  usable_in_conditions: import_zod.z.boolean().default(true)
674
693
  });
675
694
  var StatSpec = import_zod.z.object({
676
- key: import_zod.z.string(),
677
- name: import_zod.z.string(),
695
+ key: key(),
696
+ name: name(),
678
697
  stat_type: import_zod.z.string(),
679
698
  // integer | float | boolean
680
699
  default_value: import_zod.z.union([import_zod.z.number(), import_zod.z.boolean()]),
@@ -692,8 +711,8 @@ var Outcome = import_zod.z.object({
692
711
  // fixed | variable
693
712
  reward_target: import_zod.z.string().nullish(),
694
713
  // currency | stat | gem
695
- currency_key: import_zod.z.string().nullish(),
696
- stat_key: import_zod.z.string().nullish(),
714
+ currency_key: key().nullish(),
715
+ stat_key: key().nullish(),
697
716
  operation: import_zod.z.string().nullish(),
698
717
  // add | subtract | set | multiply
699
718
  value: import_zod.z.number().nullish(),
@@ -710,7 +729,7 @@ var ConditionSet = import_zod.z.object({
710
729
  outcomes: import_zod.z.array(Outcome).default([])
711
730
  });
712
731
  var Step = import_zod.z.object({
713
- key: import_zod.z.string().nullish(),
732
+ key: key().nullish(),
714
733
  // optional so the validator, not Zod, reports "missing key"
715
734
  name: import_zod.z.string().default(""),
716
735
  is_entry: import_zod.z.boolean().default(false),
@@ -723,8 +742,8 @@ var EntryRequirement = import_zod.z.object({
723
742
  // entry_cost | eligibility
724
743
  value_source: import_zod.z.string().nullish(),
725
744
  // currency | stat
726
- currency_key: import_zod.z.string().nullish(),
727
- stat_key: import_zod.z.string().nullish(),
745
+ currency_key: key().nullish(),
746
+ stat_key: key().nullish(),
728
747
  operator: import_zod.z.string().nullish(),
729
748
  // gte | lte | eq (eligibility)
730
749
  threshold_value: import_zod.z.union([import_zod.z.number(), import_zod.z.boolean()]).nullish(),
@@ -732,15 +751,15 @@ var EntryRequirement = import_zod.z.object({
732
751
  // REQUIRED by the admin API for entry_cost
733
752
  });
734
753
  var ManifestSpec = import_zod.z.object({
735
- slug: import_zod.z.string(),
736
- name: import_zod.z.string(),
754
+ slug: key(),
755
+ name: name(),
737
756
  entry_requirements: import_zod.z.array(EntryRequirement).default([]),
738
757
  steps: import_zod.z.array(Step)
739
758
  });
740
759
  var LeaderboardSpec = import_zod.z.object({
741
- slug: import_zod.z.string(),
742
- name: import_zod.z.string(),
743
- stat_key: import_zod.z.string(),
760
+ slug: key(),
761
+ name: name(),
762
+ stat_key: key(),
744
763
  // authored by key; resolved to stat_id at create time
745
764
  sort_order: import_zod.z.string().default("desc"),
746
765
  leaderboard_type: import_zod.z.string().default("relative"),
@@ -750,27 +769,27 @@ var LeaderboardSpec = import_zod.z.object({
750
769
  var Reward = import_zod.z.object({
751
770
  reward_type: import_zod.z.string().nullish(),
752
771
  // currency | stat | gem
753
- currency_key: import_zod.z.string().nullish(),
754
- stat_key: import_zod.z.string().nullish(),
772
+ currency_key: key().nullish(),
773
+ stat_key: key().nullish(),
755
774
  amount: import_zod.z.number().int().nullish()
756
775
  });
757
776
  var SegmentSpec = import_zod.z.object({
758
- label: import_zod.z.string(),
777
+ label: name(),
759
778
  reward: Reward,
760
779
  probability: import_zod.z.number().int(),
761
780
  can_override: import_zod.z.boolean().default(false)
762
781
  });
763
782
  var WheelSegmentLink = import_zod.z.object({
764
- segment_ref: import_zod.z.string(),
783
+ segment_ref: name(),
765
784
  // label of a segment defined in this spec
766
785
  probability_override: import_zod.z.number().int().nullish()
767
786
  });
768
787
  var WheelSpec = import_zod.z.object({
769
- key_slug: import_zod.z.string(),
770
- name: import_zod.z.string(),
788
+ key_slug: key(),
789
+ name: name(),
771
790
  daily_free_spins: import_zod.z.number().int().default(1),
772
791
  allow_paid_spins: import_zod.z.boolean().default(false),
773
- paid_spin_currency_key: import_zod.z.string().default(""),
792
+ paid_spin_currency_key: key().default(""),
774
793
  paid_spin_currency_amount: import_zod.z.number().int().nullish(),
775
794
  segments: import_zod.z.array(WheelSegmentLink).default([])
776
795
  });
@@ -907,8 +926,8 @@ var ProjectGraph = class {
907
926
  segmentIds() {
908
927
  return this.segments.map((s) => s.id).filter((v) => typeof v === "number");
909
928
  }
910
- statIdForKey(key) {
911
- for (const s of this.stats) if (s.key === key) return s.id ?? null;
929
+ statIdForKey(key2) {
930
+ for (const s of this.stats) if (s.key === key2) return s.id ?? null;
912
931
  return null;
913
932
  }
914
933
  /** Inbound references (blast radius) to a currency/stat (by key) or segment (by id). */
@@ -916,11 +935,11 @@ var ProjectGraph = class {
916
935
  if (kind === "segment") return this.refsToSegment(Number(ref));
917
936
  return this.refsToDefinition(kind, String(ref));
918
937
  }
919
- refsToDefinition(targetKind, key) {
938
+ refsToDefinition(targetKind, key2) {
920
939
  const found = [];
921
940
  for (const m of this.manifests) {
922
941
  for (const [tk, refKey, locus] of iterManifestRefs(m)) {
923
- if (tk === targetKind && refKey === key) {
942
+ if (tk === targetKind && refKey === key2) {
924
943
  found.push({
925
944
  referencingKind: "manifest",
926
945
  id: m.id ?? null,
@@ -932,7 +951,7 @@ var ProjectGraph = class {
932
951
  }
933
952
  for (const seg of this.segments) {
934
953
  for (const [tk, refKey] of iterSegmentRefs(seg)) {
935
- if (tk === targetKind && refKey === key) {
954
+ if (tk === targetKind && refKey === key2) {
936
955
  found.push({
937
956
  referencingKind: "segment",
938
957
  id: seg.id ?? null,
@@ -946,7 +965,7 @@ var ProjectGraph = class {
946
965
  for (const w of this.wheels) {
947
966
  const [eff, cfg] = wheelViews(w);
948
967
  const paid = str(cfg.paid_spin_currency_key) ?? str(eff.paid_spin_currency_key);
949
- if (paid === key) {
968
+ if (paid === key2) {
950
969
  found.push({
951
970
  referencingKind: "wheel",
952
971
  id: cfg.id ?? null,
@@ -957,7 +976,7 @@ var ProjectGraph = class {
957
976
  }
958
977
  }
959
978
  if (targetKind === "stat") {
960
- const statId = this.statIdForKey(key);
979
+ const statId = this.statIdForKey(key2);
961
980
  if (statId !== null) {
962
981
  for (const lb of this.leaderboards) {
963
982
  if (lb.stat_id === statId) {
@@ -992,8 +1011,8 @@ var ProjectGraph = class {
992
1011
  };
993
1012
  async function buildReferenceGraph(client, orgId, projectId) {
994
1013
  const path = { org_id: orgId, project_id: projectId };
995
- const pick = (obj, key) => {
996
- const arr = obj?.[key];
1014
+ const pick = (obj, key2) => {
1015
+ const arr = obj?.[key2];
997
1016
  return Array.isArray(arr) ? arr : [];
998
1017
  };
999
1018
  const [currencies2, stats2, manifests2, leaderboards2, segments2, wheels2] = await Promise.all([
@@ -1069,13 +1088,13 @@ function validateEconomy(spec) {
1069
1088
  const statKeys = new Set(spec.stats.map((s) => s.key));
1070
1089
  const segmentLabels = new Set(spec.segments.map((s) => s.label));
1071
1090
  const bad = (path, message, severity = "error", rule) => out.push({ path, message, severity, rule });
1072
- const refOk = (kind, key, path) => {
1091
+ const refOk = (kind, key2, path) => {
1073
1092
  const pool = kind === "currency" ? currencyKeys : statKeys;
1074
- if (!pool.has(key)) {
1075
- const hint = didYouMean(key, [...pool].sort());
1093
+ if (!pool.has(key2)) {
1094
+ const hint = didYouMean(key2, [...pool].sort());
1076
1095
  bad(
1077
1096
  path,
1078
- `references unknown ${kind} '${key}'.${hint ? ` Did you mean '${hint}'?` : ""}`,
1097
+ `references unknown ${kind} '${key2}'.${hint ? ` Did you mean '${hint}'?` : ""}`,
1079
1098
  "error",
1080
1099
  "unknown-ref"
1081
1100
  );
@@ -1105,8 +1124,8 @@ function validateEconomy(spec) {
1105
1124
  spec.manifests.forEach((m, i) => {
1106
1125
  const stepsErr = validateSteps(m);
1107
1126
  if (stepsErr) bad(`manifests[${i}].steps`, stepsErr, "error", "steps-shape");
1108
- for (const [tk, key, locus] of iterManifestRefs(m)) {
1109
- refOk(tk, key, `manifests[${i}] (${locus})`);
1127
+ for (const [tk, key2, locus] of iterManifestRefs(m)) {
1128
+ refOk(tk, key2, `manifests[${i}] (${locus})`);
1110
1129
  }
1111
1130
  validateManifestInternals(bad, i, m);
1112
1131
  validateEntryRequirements(bad, i, m);
@@ -1129,8 +1148,8 @@ function validateEconomy(spec) {
1129
1148
  spec.segments.forEach((seg, i) => {
1130
1149
  const rErr = validateReward(seg.reward);
1131
1150
  if (rErr) bad(`segments[${i}].reward`, rErr, "error", "reward-shape");
1132
- for (const [tk, key] of iterSegmentRefs({ reward: seg.reward })) {
1133
- refOk(tk, key, `segments[${i}].reward`);
1151
+ for (const [tk, key2] of iterSegmentRefs({ reward: seg.reward })) {
1152
+ refOk(tk, key2, `segments[${i}].reward`);
1134
1153
  }
1135
1154
  if (seg.reward.reward_type === "gem") {
1136
1155
  bad(
@@ -1412,14 +1431,14 @@ function lintReachability(bad, i, m) {
1412
1431
  }
1413
1432
  function lintFormulaKeys(bad, i, m) {
1414
1433
  const counts = payloadKeyCounts(m);
1415
- for (const [key, n] of counts) {
1434
+ for (const [key2, n] of counts) {
1416
1435
  if (n !== 1) continue;
1417
- const others = [...counts.keys()].filter((k) => k !== key);
1418
- const match = didYouMean(key, others);
1419
- if (match && similarityCloseEnough(key, match)) {
1436
+ const others = [...counts.keys()].filter((k) => k !== key2);
1437
+ const match = didYouMean(key2, others);
1438
+ if (match && similarityCloseEnough(key2, match)) {
1420
1439
  bad(
1421
1440
  `manifests[${i}]`,
1422
- `payload key '${key}' is used once \u2014 did you mean '${match}'?`,
1441
+ `payload key '${key2}' is used once \u2014 did you mean '${match}'?`,
1423
1442
  "warning",
1424
1443
  "payload-typo"
1425
1444
  );
package/dist/index.d.cts CHANGED
@@ -7830,7 +7830,13 @@ interface TokenProvider {
7830
7830
  }
7831
7831
  declare const STAGING_API_BASE = "https://console.staging.magicweave.xyz/api";
7832
7832
  declare const PROD_API_BASE = "https://console.magicweave.xyz/api";
7833
- /** Resolve the admin API base URL: explicit > $MW_API_BASE > staging default. */
7833
+ /**
7834
+ * Resolve the admin API base URL: explicit > $MW_API_BASE > staging default.
7835
+ *
7836
+ * The resolved base is where the bearer token, email, and OTP are sent, so it
7837
+ * must be HTTPS — a cleartext or malformed override could leak credentials. We
7838
+ * allow plain http only for loopback hosts (local backend development).
7839
+ */
7834
7840
  declare function resolveBaseUrl(explicit?: string): string;
7835
7841
  interface ClientOptions {
7836
7842
  baseUrl?: string;
package/dist/index.d.ts CHANGED
@@ -7830,7 +7830,13 @@ interface TokenProvider {
7830
7830
  }
7831
7831
  declare const STAGING_API_BASE = "https://console.staging.magicweave.xyz/api";
7832
7832
  declare const PROD_API_BASE = "https://console.magicweave.xyz/api";
7833
- /** Resolve the admin API base URL: explicit > $MW_API_BASE > staging default. */
7833
+ /**
7834
+ * Resolve the admin API base URL: explicit > $MW_API_BASE > staging default.
7835
+ *
7836
+ * The resolved base is where the bearer token, email, and OTP are sent, so it
7837
+ * must be HTTPS — a cleartext or malformed override could leak credentials. We
7838
+ * allow plain http only for loopback hosts (local backend development).
7839
+ */
7834
7840
  declare function resolveBaseUrl(explicit?: string): string;
7835
7841
  interface ClientOptions {
7836
7842
  baseUrl?: string;
package/dist/index.js CHANGED
@@ -1,7 +1,7 @@
1
1
  var __defProp = Object.defineProperty;
2
2
  var __export = (target, all) => {
3
- for (var name in all)
4
- __defProp(target, name, { get: all[name], enumerable: true });
3
+ for (var name2 in all)
4
+ __defProp(target, name2, { get: all[name2], enumerable: true });
5
5
  };
6
6
 
7
7
  // src/client.ts
@@ -9,7 +9,22 @@ import createOpenapiClient from "openapi-fetch";
9
9
  var STAGING_API_BASE = "https://console.staging.magicweave.xyz/api";
10
10
  var PROD_API_BASE = "https://console.magicweave.xyz/api";
11
11
  function resolveBaseUrl(explicit) {
12
- return explicit ?? process.env.MW_API_BASE ?? STAGING_API_BASE;
12
+ const raw = explicit ?? process.env.MW_API_BASE ?? STAGING_API_BASE;
13
+ let url;
14
+ try {
15
+ url = new URL(raw);
16
+ } catch {
17
+ throw new MagicweaveError(`Invalid API base URL: ${raw}`, 0, "invalid_api_base");
18
+ }
19
+ const isLoopback = url.hostname === "localhost" || url.hostname === "127.0.0.1" || url.hostname === "[::1]";
20
+ if (url.protocol !== "https:" && !(url.protocol === "http:" && isLoopback)) {
21
+ throw new MagicweaveError(
22
+ `Refusing to use a non-HTTPS API base URL: ${raw}. Credentials are only sent over HTTPS (plain http is allowed for localhost only).`,
23
+ 0,
24
+ "insecure_api_base"
25
+ );
26
+ }
27
+ return raw;
13
28
  }
14
29
  var MagicweaveError = class extends Error {
15
30
  constructor(message, status, code, detail) {
@@ -174,7 +189,7 @@ var EnvTokenProvider = class {
174
189
  function orgs(client) {
175
190
  return {
176
191
  list: () => unwrap(client.raw.GET("/org/")),
177
- create: (name) => unwrap(client.raw.POST("/org/", { body: { name } })),
192
+ create: (name2) => unwrap(client.raw.POST("/org/", { body: { name: name2 } })),
178
193
  remove: (orgId) => unwrap(client.raw.DELETE("/org/{org_id}/", { params: { path: { org_id: orgId } } }))
179
194
  };
180
195
  }
@@ -183,10 +198,10 @@ function orgs(client) {
183
198
  function projects(client) {
184
199
  return {
185
200
  list: (orgId) => unwrap(client.raw.GET("/project/{org_id}", { params: { path: { org_id: orgId } } })),
186
- create: (orgId, name) => unwrap(
201
+ create: (orgId, name2) => unwrap(
187
202
  client.raw.POST("/project/{org_id}", {
188
203
  params: { path: { org_id: orgId } },
189
- body: { name }
204
+ body: { name: name2 }
190
205
  })
191
206
  ),
192
207
  remove: (orgId, projectId) => unwrap(
@@ -216,10 +231,10 @@ function environments(client) {
216
231
  params: base(orgId, projectId)
217
232
  })
218
233
  ),
219
- create: (orgId, projectId, name) => unwrap(
234
+ create: (orgId, projectId, name2) => unwrap(
220
235
  client.raw.POST("/project/{org_id}/{project_id}/environments/", {
221
236
  params: base(orgId, projectId),
222
- body: { name }
237
+ body: { name: name2 }
223
238
  })
224
239
  ),
225
240
  remove: (orgId, projectId, environmentId) => unwrap(
@@ -598,18 +613,22 @@ __export(spec_exports, {
598
613
  WheelSpec: () => WheelSpec
599
614
  });
600
615
  import { z } from "zod";
616
+ var MAX_KEY = 128;
617
+ var MAX_NAME = 255;
618
+ var key = () => z.string().max(MAX_KEY);
619
+ var name = () => z.string().max(MAX_NAME);
601
620
  var CurrencySpec = z.object({
602
- key: z.string(),
603
- name: z.string(),
604
- symbol: z.string().default(""),
621
+ key: key(),
622
+ name: name(),
623
+ symbol: z.string().max(16).default(""),
605
624
  initial_balance: z.number().int().default(0),
606
625
  max_balance: z.number().int().nullable().default(null),
607
626
  usable_as_reward: z.boolean().default(true),
608
627
  usable_in_conditions: z.boolean().default(true)
609
628
  });
610
629
  var StatSpec = z.object({
611
- key: z.string(),
612
- name: z.string(),
630
+ key: key(),
631
+ name: name(),
613
632
  stat_type: z.string(),
614
633
  // integer | float | boolean
615
634
  default_value: z.union([z.number(), z.boolean()]),
@@ -627,8 +646,8 @@ var Outcome = z.object({
627
646
  // fixed | variable
628
647
  reward_target: z.string().nullish(),
629
648
  // currency | stat | gem
630
- currency_key: z.string().nullish(),
631
- stat_key: z.string().nullish(),
649
+ currency_key: key().nullish(),
650
+ stat_key: key().nullish(),
632
651
  operation: z.string().nullish(),
633
652
  // add | subtract | set | multiply
634
653
  value: z.number().nullish(),
@@ -645,7 +664,7 @@ var ConditionSet = z.object({
645
664
  outcomes: z.array(Outcome).default([])
646
665
  });
647
666
  var Step = z.object({
648
- key: z.string().nullish(),
667
+ key: key().nullish(),
649
668
  // optional so the validator, not Zod, reports "missing key"
650
669
  name: z.string().default(""),
651
670
  is_entry: z.boolean().default(false),
@@ -658,8 +677,8 @@ var EntryRequirement = z.object({
658
677
  // entry_cost | eligibility
659
678
  value_source: z.string().nullish(),
660
679
  // currency | stat
661
- currency_key: z.string().nullish(),
662
- stat_key: z.string().nullish(),
680
+ currency_key: key().nullish(),
681
+ stat_key: key().nullish(),
663
682
  operator: z.string().nullish(),
664
683
  // gte | lte | eq (eligibility)
665
684
  threshold_value: z.union([z.number(), z.boolean()]).nullish(),
@@ -667,15 +686,15 @@ var EntryRequirement = z.object({
667
686
  // REQUIRED by the admin API for entry_cost
668
687
  });
669
688
  var ManifestSpec = z.object({
670
- slug: z.string(),
671
- name: z.string(),
689
+ slug: key(),
690
+ name: name(),
672
691
  entry_requirements: z.array(EntryRequirement).default([]),
673
692
  steps: z.array(Step)
674
693
  });
675
694
  var LeaderboardSpec = z.object({
676
- slug: z.string(),
677
- name: z.string(),
678
- stat_key: z.string(),
695
+ slug: key(),
696
+ name: name(),
697
+ stat_key: key(),
679
698
  // authored by key; resolved to stat_id at create time
680
699
  sort_order: z.string().default("desc"),
681
700
  leaderboard_type: z.string().default("relative"),
@@ -685,27 +704,27 @@ var LeaderboardSpec = z.object({
685
704
  var Reward = z.object({
686
705
  reward_type: z.string().nullish(),
687
706
  // currency | stat | gem
688
- currency_key: z.string().nullish(),
689
- stat_key: z.string().nullish(),
707
+ currency_key: key().nullish(),
708
+ stat_key: key().nullish(),
690
709
  amount: z.number().int().nullish()
691
710
  });
692
711
  var SegmentSpec = z.object({
693
- label: z.string(),
712
+ label: name(),
694
713
  reward: Reward,
695
714
  probability: z.number().int(),
696
715
  can_override: z.boolean().default(false)
697
716
  });
698
717
  var WheelSegmentLink = z.object({
699
- segment_ref: z.string(),
718
+ segment_ref: name(),
700
719
  // label of a segment defined in this spec
701
720
  probability_override: z.number().int().nullish()
702
721
  });
703
722
  var WheelSpec = z.object({
704
- key_slug: z.string(),
705
- name: z.string(),
723
+ key_slug: key(),
724
+ name: name(),
706
725
  daily_free_spins: z.number().int().default(1),
707
726
  allow_paid_spins: z.boolean().default(false),
708
- paid_spin_currency_key: z.string().default(""),
727
+ paid_spin_currency_key: key().default(""),
709
728
  paid_spin_currency_amount: z.number().int().nullish(),
710
729
  segments: z.array(WheelSegmentLink).default([])
711
730
  });
@@ -842,8 +861,8 @@ var ProjectGraph = class {
842
861
  segmentIds() {
843
862
  return this.segments.map((s) => s.id).filter((v) => typeof v === "number");
844
863
  }
845
- statIdForKey(key) {
846
- for (const s of this.stats) if (s.key === key) return s.id ?? null;
864
+ statIdForKey(key2) {
865
+ for (const s of this.stats) if (s.key === key2) return s.id ?? null;
847
866
  return null;
848
867
  }
849
868
  /** Inbound references (blast radius) to a currency/stat (by key) or segment (by id). */
@@ -851,11 +870,11 @@ var ProjectGraph = class {
851
870
  if (kind === "segment") return this.refsToSegment(Number(ref));
852
871
  return this.refsToDefinition(kind, String(ref));
853
872
  }
854
- refsToDefinition(targetKind, key) {
873
+ refsToDefinition(targetKind, key2) {
855
874
  const found = [];
856
875
  for (const m of this.manifests) {
857
876
  for (const [tk, refKey, locus] of iterManifestRefs(m)) {
858
- if (tk === targetKind && refKey === key) {
877
+ if (tk === targetKind && refKey === key2) {
859
878
  found.push({
860
879
  referencingKind: "manifest",
861
880
  id: m.id ?? null,
@@ -867,7 +886,7 @@ var ProjectGraph = class {
867
886
  }
868
887
  for (const seg of this.segments) {
869
888
  for (const [tk, refKey] of iterSegmentRefs(seg)) {
870
- if (tk === targetKind && refKey === key) {
889
+ if (tk === targetKind && refKey === key2) {
871
890
  found.push({
872
891
  referencingKind: "segment",
873
892
  id: seg.id ?? null,
@@ -881,7 +900,7 @@ var ProjectGraph = class {
881
900
  for (const w of this.wheels) {
882
901
  const [eff, cfg] = wheelViews(w);
883
902
  const paid = str(cfg.paid_spin_currency_key) ?? str(eff.paid_spin_currency_key);
884
- if (paid === key) {
903
+ if (paid === key2) {
885
904
  found.push({
886
905
  referencingKind: "wheel",
887
906
  id: cfg.id ?? null,
@@ -892,7 +911,7 @@ var ProjectGraph = class {
892
911
  }
893
912
  }
894
913
  if (targetKind === "stat") {
895
- const statId = this.statIdForKey(key);
914
+ const statId = this.statIdForKey(key2);
896
915
  if (statId !== null) {
897
916
  for (const lb of this.leaderboards) {
898
917
  if (lb.stat_id === statId) {
@@ -927,8 +946,8 @@ var ProjectGraph = class {
927
946
  };
928
947
  async function buildReferenceGraph(client, orgId, projectId) {
929
948
  const path = { org_id: orgId, project_id: projectId };
930
- const pick = (obj, key) => {
931
- const arr = obj?.[key];
949
+ const pick = (obj, key2) => {
950
+ const arr = obj?.[key2];
932
951
  return Array.isArray(arr) ? arr : [];
933
952
  };
934
953
  const [currencies2, stats2, manifests2, leaderboards2, segments2, wheels2] = await Promise.all([
@@ -1004,13 +1023,13 @@ function validateEconomy(spec) {
1004
1023
  const statKeys = new Set(spec.stats.map((s) => s.key));
1005
1024
  const segmentLabels = new Set(spec.segments.map((s) => s.label));
1006
1025
  const bad = (path, message, severity = "error", rule) => out.push({ path, message, severity, rule });
1007
- const refOk = (kind, key, path) => {
1026
+ const refOk = (kind, key2, path) => {
1008
1027
  const pool = kind === "currency" ? currencyKeys : statKeys;
1009
- if (!pool.has(key)) {
1010
- const hint = didYouMean(key, [...pool].sort());
1028
+ if (!pool.has(key2)) {
1029
+ const hint = didYouMean(key2, [...pool].sort());
1011
1030
  bad(
1012
1031
  path,
1013
- `references unknown ${kind} '${key}'.${hint ? ` Did you mean '${hint}'?` : ""}`,
1032
+ `references unknown ${kind} '${key2}'.${hint ? ` Did you mean '${hint}'?` : ""}`,
1014
1033
  "error",
1015
1034
  "unknown-ref"
1016
1035
  );
@@ -1040,8 +1059,8 @@ function validateEconomy(spec) {
1040
1059
  spec.manifests.forEach((m, i) => {
1041
1060
  const stepsErr = validateSteps(m);
1042
1061
  if (stepsErr) bad(`manifests[${i}].steps`, stepsErr, "error", "steps-shape");
1043
- for (const [tk, key, locus] of iterManifestRefs(m)) {
1044
- refOk(tk, key, `manifests[${i}] (${locus})`);
1062
+ for (const [tk, key2, locus] of iterManifestRefs(m)) {
1063
+ refOk(tk, key2, `manifests[${i}] (${locus})`);
1045
1064
  }
1046
1065
  validateManifestInternals(bad, i, m);
1047
1066
  validateEntryRequirements(bad, i, m);
@@ -1064,8 +1083,8 @@ function validateEconomy(spec) {
1064
1083
  spec.segments.forEach((seg, i) => {
1065
1084
  const rErr = validateReward(seg.reward);
1066
1085
  if (rErr) bad(`segments[${i}].reward`, rErr, "error", "reward-shape");
1067
- for (const [tk, key] of iterSegmentRefs({ reward: seg.reward })) {
1068
- refOk(tk, key, `segments[${i}].reward`);
1086
+ for (const [tk, key2] of iterSegmentRefs({ reward: seg.reward })) {
1087
+ refOk(tk, key2, `segments[${i}].reward`);
1069
1088
  }
1070
1089
  if (seg.reward.reward_type === "gem") {
1071
1090
  bad(
@@ -1347,14 +1366,14 @@ function lintReachability(bad, i, m) {
1347
1366
  }
1348
1367
  function lintFormulaKeys(bad, i, m) {
1349
1368
  const counts = payloadKeyCounts(m);
1350
- for (const [key, n] of counts) {
1369
+ for (const [key2, n] of counts) {
1351
1370
  if (n !== 1) continue;
1352
- const others = [...counts.keys()].filter((k) => k !== key);
1353
- const match = didYouMean(key, others);
1354
- if (match && similarityCloseEnough(key, match)) {
1371
+ const others = [...counts.keys()].filter((k) => k !== key2);
1372
+ const match = didYouMean(key2, others);
1373
+ if (match && similarityCloseEnough(key2, match)) {
1355
1374
  bad(
1356
1375
  `manifests[${i}]`,
1357
- `payload key '${key}' is used once \u2014 did you mean '${match}'?`,
1376
+ `payload key '${key2}' is used once \u2014 did you mean '${match}'?`,
1358
1377
  "warning",
1359
1378
  "payload-typo"
1360
1379
  );
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@magicweave/core",
3
- "version": "0.1.0",
3
+ "version": "0.1.1",
4
4
  "description": "Shared TypeScript SDK for Magicweave — admin API client, EconomySpec schemas, and the deterministic smart layer. Powers the CLI, MCP, and OpenAI surfaces.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",
@@ -14,7 +14,8 @@
14
14
  }
15
15
  },
16
16
  "files": [
17
- "dist"
17
+ "dist",
18
+ "!dist/**/*.map"
18
19
  ],
19
20
  "dependencies": {
20
21
  "openapi-fetch": "^0.13.4",
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/index.ts","../src/client.ts","../src/auth.ts","../src/resources/orgs.ts","../src/resources/projects.ts","../src/resources/environments.ts","../src/resources/releases.ts","../src/resources/currencies.ts","../src/resources/stats.ts","../src/resources/manifests.ts","../src/resources/leaderboards.ts","../src/resources/segments.ts","../src/resources/wheels.ts","../src/schemas/spec.ts","../src/smart/export.ts","../src/smart/refgraph.ts","../src/smart/validate.ts"],"sourcesContent":["/**\n * @magicweave/core — the shared Magicweave SDK.\n *\n * All admin/business logic lives here: the typed HTTP client, resource modules,\n * the Zod EconomySpec schemas, the deterministic smart layer, and the capability\n * registry. Surfaces (cli/mcp/openai) import from here and never the reverse.\n */\n\nexport const CORE_VERSION = \"0.0.0\";\n\nexport * from \"./client.js\";\nexport * from \"./auth.js\";\nexport type { paths, components, operations } from \"./generated/schema.js\";\n\n// --- resources ---\nexport * from \"./resources/orgs.js\";\nexport * from \"./resources/projects.js\";\nexport * from \"./resources/environments.js\";\nexport * from \"./resources/releases.js\";\nexport * from \"./resources/currencies.js\";\nexport * from \"./resources/stats.js\";\nexport * from \"./resources/manifests.js\";\nexport * from \"./resources/leaderboards.js\";\nexport * from \"./resources/segments.js\";\nexport * from \"./resources/wheels.js\";\n\n// --- spec schemas ---\nexport * as spec from \"./schemas/spec.js\";\n\n// --- smart layer ---\nexport * from \"./smart/export.js\";\nexport * from \"./smart/refgraph.js\";\nexport * from \"./smart/validate.js\";\n","import createOpenapiClient, { type Client as OpenapiClient, type Middleware } from \"openapi-fetch\";\nimport type { paths } from \"./generated/schema.js\";\n\n/** Where the CLI/tests supply an access token from (keychain, env, or a fake). */\nexport interface TokenProvider {\n getToken(): string | null | Promise<string | null>;\n}\n\nexport const STAGING_API_BASE = \"https://console.staging.magicweave.xyz/api\";\nexport const PROD_API_BASE = \"https://console.magicweave.xyz/api\";\n\n/** Resolve the admin API base URL: explicit > $MW_API_BASE > staging default. */\nexport function resolveBaseUrl(explicit?: string): string {\n return explicit ?? process.env.MW_API_BASE ?? STAGING_API_BASE;\n}\n\nexport interface ClientOptions {\n baseUrl?: string;\n tokenProvider?: TokenProvider;\n /** Inject a fetch (msw/tests). Defaults to the global fetch. */\n fetch?: typeof globalThis.fetch;\n}\n\n/** Base error for every admin API failure. `status` maps to a CLI exit code. */\nexport class MagicweaveError extends Error {\n constructor(\n message: string,\n readonly status: number,\n readonly code: string,\n readonly detail?: unknown,\n ) {\n super(message);\n this.name = \"MagicweaveError\";\n }\n}\n\nexport class UnauthorizedError extends MagicweaveError {\n constructor(detail?: unknown) {\n super(\n \"Not authenticated or your session expired. Run `mw login`.\",\n 401,\n \"unauthorized\",\n detail,\n );\n this.name = \"UnauthorizedError\";\n }\n}\n\nexport class NotFoundError extends MagicweaveError {\n constructor(detail?: unknown) {\n super(\"Not found.\", 404, \"not_found\", detail);\n this.name = \"NotFoundError\";\n }\n}\n\nexport class ValidationError extends MagicweaveError {\n constructor(detail?: unknown) {\n super(formatValidationDetail(detail), 422, \"validation_error\", detail);\n this.name = \"ValidationError\";\n }\n}\n\nfunction formatValidationDetail(detail: unknown): string {\n // FastAPI shape: { detail: [{ loc: [...], msg: string, type: string }, ...] }\n const list = (detail as { detail?: Array<{ loc?: unknown[]; msg?: string }> })?.detail;\n if (Array.isArray(list) && list.length) {\n return list\n .map((e) => {\n const field = Array.isArray(e.loc) ? e.loc.filter((p) => p !== \"body\").join(\".\") : \"\";\n return field ? `${field}: ${e.msg}` : (e.msg ?? \"invalid\");\n })\n .join(\"; \");\n }\n if (typeof (detail as { detail?: string })?.detail === \"string\") {\n return (detail as { detail: string }).detail;\n }\n return \"Request validation failed.\";\n}\n\nfunction errorFromResponse(response: Response, body: unknown): MagicweaveError {\n switch (response.status) {\n case 401:\n return new UnauthorizedError(body);\n case 404:\n return new NotFoundError(body);\n case 422:\n return new ValidationError(body);\n default: {\n const msg =\n (body as { detail?: string })?.detail ??\n `Request failed: ${response.status} ${response.statusText}`;\n return new MagicweaveError(\n typeof msg === \"string\" ? msg : `Request failed: ${response.status}`,\n response.status,\n \"http_error\",\n body,\n );\n }\n }\n}\n\n/** The raw openapi-fetch client, fully typed against the admin OpenAPI paths. */\nexport type Raw = OpenapiClient<paths>;\n\ntype FetchResult<T> = { data?: T; error?: unknown; response: Response };\n\n/** Await an openapi-fetch call, returning `data` on success or throwing a typed error. */\nexport async function unwrap<T>(promise: Promise<FetchResult<T>>): Promise<T> {\n const { data, error, response } = await promise;\n if (response.ok) return data as T;\n throw errorFromResponse(response, error ?? data);\n}\n\n/**\n * The Magicweave admin SDK client. Wraps a typed openapi-fetch client and\n * injects the bearer token from an (optional) TokenProvider on every request.\n */\nexport class MagicweaveClient {\n readonly raw: Raw;\n readonly baseUrl: string;\n\n constructor(opts: ClientOptions = {}) {\n this.baseUrl = resolveBaseUrl(opts.baseUrl);\n const tokenProvider = opts.tokenProvider;\n\n const auth: Middleware = {\n async onRequest({ request }) {\n const token = tokenProvider ? await tokenProvider.getToken() : null;\n if (token) request.headers.set(\"Authorization\", `Bearer ${token}`);\n return request;\n },\n };\n\n this.raw = createOpenapiClient<paths>({\n baseUrl: this.baseUrl,\n fetch: opts.fetch,\n });\n this.raw.use(auth);\n }\n}\n\nexport function createClient(opts: ClientOptions = {}): MagicweaveClient {\n return new MagicweaveClient(opts);\n}\n","import { MagicweaveError, type TokenProvider } from \"./client.js\";\n\nexport interface AuthTokens {\n access_token: string;\n refresh_token: string;\n}\n\ninterface OtpFetch {\n fetch?: typeof globalThis.fetch;\n}\n\n/** Step 1 of login: ask the backend to email a one-time code. */\nexport async function requestLoginOtp(\n baseUrl: string,\n email: string,\n opts: OtpFetch = {},\n): Promise<void> {\n const f = opts.fetch ?? globalThis.fetch;\n const res = await f(`${baseUrl}/auth/login-email/`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ email }),\n });\n if (!res.ok) {\n throw new MagicweaveError(\n `Could not send a login code to ${email} (HTTP ${res.status}).`,\n res.status,\n \"otp_request_failed\",\n );\n }\n}\n\n/** Step 2 of login: exchange the emailed code for access + refresh tokens. */\nexport async function verifyLoginOtp(\n baseUrl: string,\n email: string,\n otp: string,\n opts: OtpFetch = {},\n): Promise<AuthTokens> {\n const f = opts.fetch ?? globalThis.fetch;\n const res = await f(`${baseUrl}/auth/verify-email-otp/`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ email, otp }),\n });\n const body = (await res.json().catch(() => ({}))) as Partial<AuthTokens> & { detail?: string };\n if (!res.ok || !body.access_token || !body.refresh_token) {\n throw new MagicweaveError(\n body.detail ?? \"That code was not accepted. Check it and try again.\",\n res.status,\n \"otp_verify_failed\",\n body,\n );\n }\n return { access_token: body.access_token, refresh_token: body.refresh_token };\n}\n\nexport interface JwtPayload {\n user_id?: number;\n email?: string;\n exp?: number;\n [key: string]: unknown;\n}\n\n/** Decode a JWT payload without verifying the signature (server owns verification). */\nexport function decodeJwt(token: string): JwtPayload | null {\n const part = token.split(\".\")[1];\n if (!part) return null;\n try {\n return JSON.parse(Buffer.from(part, \"base64url\").toString(\"utf8\")) as JwtPayload;\n } catch {\n return null;\n }\n}\n\n/** True if the token is missing an exp, or expires within `skewSeconds`. */\nexport function isExpired(token: string, skewSeconds = 30): boolean {\n const exp = decodeJwt(token)?.exp;\n if (!exp) return true;\n return exp * 1000 <= Date.now() + skewSeconds * 1000;\n}\n\n/** A fixed token, e.g. one just read from the keychain. */\nexport class StaticTokenProvider implements TokenProvider {\n constructor(private readonly token: string | null) {}\n getToken(): string | null {\n return this.token;\n }\n}\n\n/** Reads $MW_ACCESS_TOKEN — the non-interactive/CI path. */\nexport class EnvTokenProvider implements TokenProvider {\n getToken(): string | null {\n return process.env.MW_ACCESS_TOKEN ?? null;\n }\n}\n","import type { MagicweaveClient } from \"../client.js\";\nimport { unwrap } from \"../client.js\";\nimport type { components } from \"../generated/schema.js\";\n\ntype S = components[\"schemas\"];\nexport type OrganizationListResponse = S[\"OrganizationListResponse\"];\nexport type OrganizationCreateResponse = S[\"OrganizationCreateResponse\"];\nexport type OrganizationDeleteResponse = S[\"OrganizationDeleteResponse\"];\n\n/** Organizations you belong to. */\nexport function orgs(client: MagicweaveClient) {\n return {\n list: () => unwrap(client.raw.GET(\"/org/\")),\n create: (name: string) => unwrap(client.raw.POST(\"/org/\", { body: { name } })),\n remove: (orgId: number) =>\n unwrap(client.raw.DELETE(\"/org/{org_id}/\", { params: { path: { org_id: orgId } } })),\n };\n}\n","import type { MagicweaveClient } from \"../client.js\";\nimport { unwrap } from \"../client.js\";\nimport type { components } from \"../generated/schema.js\";\n\ntype S = components[\"schemas\"];\nexport type ProjectListResponse = S[\"ProjectListResponse\"];\nexport type ProjectCreateResponse = S[\"ProjectCreateResponse\"];\nexport type ProjectDeleteResponse = S[\"ProjectDeleteResponse\"];\nexport type ProjectResponse = S[\"ProjectResponse\"];\n\n/** Projects within an organization. */\nexport function projects(client: MagicweaveClient) {\n return {\n list: (orgId: number) =>\n unwrap(client.raw.GET(\"/project/{org_id}\", { params: { path: { org_id: orgId } } })),\n create: (orgId: number, name: string) =>\n unwrap(\n client.raw.POST(\"/project/{org_id}\", {\n params: { path: { org_id: orgId } },\n body: { name },\n }),\n ),\n remove: (orgId: number, projectId: number) =>\n unwrap(\n client.raw.DELETE(\"/project/{org_id}/{project_id}/\", {\n params: { path: { org_id: orgId, project_id: projectId } },\n }),\n ),\n enableNetwork: (orgId: number, projectId: number) =>\n unwrap(\n client.raw.POST(\"/project/{org_id}/{project_id}/enable-network\", {\n params: { path: { org_id: orgId, project_id: projectId } },\n }),\n ),\n };\n}\n","import type { MagicweaveClient } from \"../client.js\";\nimport { unwrap } from \"../client.js\";\nimport type { components } from \"../generated/schema.js\";\n\ntype S = components[\"schemas\"];\nexport type EnvironmentListResponse = S[\"EnvironmentListResponse\"];\n/** Creating an env (or rotating a secret) returns the fresh client credentials. */\nexport type EnvironmentCreateResponse = S[\"EnvironmentCreateResponse\"];\nexport type EnvironmentDeleteResponse = S[\"EnvironmentDeleteResponse\"];\n\n/** Environments (testing/production) and their client credentials. */\nexport function environments(client: MagicweaveClient) {\n const base = (orgId: number, projectId: number) => ({\n path: { org_id: orgId, project_id: projectId },\n });\n const withEnv = (orgId: number, projectId: number, environmentId: number) => ({\n path: { org_id: orgId, project_id: projectId, environment_id: environmentId },\n });\n\n return {\n list: (orgId: number, projectId: number) =>\n unwrap(\n client.raw.GET(\"/project/{org_id}/{project_id}/environments/\", {\n params: base(orgId, projectId),\n }),\n ),\n create: (orgId: number, projectId: number, name: string) =>\n unwrap(\n client.raw.POST(\"/project/{org_id}/{project_id}/environments/\", {\n params: base(orgId, projectId),\n body: { name },\n }),\n ),\n remove: (orgId: number, projectId: number, environmentId: number) =>\n unwrap(\n client.raw.DELETE(\"/project/{org_id}/{project_id}/environments/{environment_id}\", {\n params: withEnv(orgId, projectId, environmentId),\n }),\n ),\n rotateSecret: (orgId: number, projectId: number, environmentId: number) =>\n unwrap(\n client.raw.POST(\n \"/project/{org_id}/{project_id}/environments/{environment_id}/rotate-secret\",\n {\n params: withEnv(orgId, projectId, environmentId),\n },\n ),\n ),\n rotatePreviewSecret: (orgId: number, projectId: number, environmentId: number) =>\n unwrap(\n client.raw.POST(\n \"/project/{org_id}/{project_id}/environments/{environment_id}/rotate-preview-secret\",\n { params: withEnv(orgId, projectId, environmentId) },\n ),\n ),\n };\n}\n","import type { MagicweaveClient } from \"../client.js\";\nimport { unwrap } from \"../client.js\";\nimport type { components } from \"../generated/schema.js\";\n\ntype S = components[\"schemas\"];\nexport type ReleaseResponse = S[\"ReleaseResponse\"];\nexport type ReleaseListResponse = S[\"ReleaseListResponse\"];\nexport type ReleaseDeleteResponse = S[\"ReleaseDeleteResponse\"];\nexport type CreateReleaseRequest = S[\"CreateReleaseRequest\"];\nexport type ReleaseUpdateRequest = S[\"ReleaseUpdateRequest\"];\nexport type ReleaseItemPushRequest = S[\"ReleaseItemPushRequest\"];\n\n/**\n * Release lifecycle: draft → add items → lock → activate, plus promote\n * (copy/move) across environments and deactivate/delete.\n *\n * Note: list/create are environment-scoped; the mutating lifecycle ops are\n * project+release-scoped. The admin API exposes no GET-single-release — read a\n * release from `list`.\n */\nexport function releases(client: MagicweaveClient) {\n const rel = (orgId: number, projectId: number, releaseId: number) => ({\n path: { org_id: orgId, project_id: projectId, release_id: releaseId },\n });\n\n return {\n list: (orgId: number, projectId: number, environmentId: number) =>\n unwrap(\n client.raw.GET(\"/project/{org_id}/{project_id}/environments/{environment_id}/releases/\", {\n params: { path: { org_id: orgId, project_id: projectId, environment_id: environmentId } },\n }),\n ),\n create: (\n orgId: number,\n projectId: number,\n environmentId: number,\n body: CreateReleaseRequest = { release_notes: \"\" },\n ) =>\n unwrap(\n client.raw.POST(\"/project/{org_id}/{project_id}/environments/{environment_id}/releases/\", {\n params: { path: { org_id: orgId, project_id: projectId, environment_id: environmentId } },\n body,\n }),\n ),\n update: (orgId: number, projectId: number, releaseId: number, body: ReleaseUpdateRequest) =>\n unwrap(\n client.raw.PATCH(\"/project/{org_id}/{project_id}/releases/{release_id}\", {\n params: rel(orgId, projectId, releaseId),\n body,\n }),\n ),\n remove: (orgId: number, projectId: number, releaseId: number) =>\n unwrap(\n client.raw.DELETE(\"/project/{org_id}/{project_id}/releases/{release_id}\", {\n params: rel(orgId, projectId, releaseId),\n }),\n ),\n pushItem: (orgId: number, projectId: number, releaseId: number, body: ReleaseItemPushRequest) =>\n unwrap(\n client.raw.POST(\"/project/{org_id}/{project_id}/releases/{release_id}/items/\", {\n params: rel(orgId, projectId, releaseId),\n body,\n }),\n ),\n removeItem: (orgId: number, projectId: number, releaseId: number, itemId: number) =>\n unwrap(\n client.raw.DELETE(\"/project/{org_id}/{project_id}/releases/{release_id}/items/{item_id}\", {\n params: {\n path: { org_id: orgId, project_id: projectId, release_id: releaseId, item_id: itemId },\n },\n }),\n ),\n lock: (orgId: number, projectId: number, releaseId: number) =>\n unwrap(\n client.raw.POST(\"/project/{org_id}/{project_id}/releases/{release_id}/lock\", {\n params: rel(orgId, projectId, releaseId),\n }),\n ),\n activate: (orgId: number, projectId: number, releaseId: number) =>\n unwrap(\n client.raw.POST(\"/project/{org_id}/{project_id}/releases/{release_id}/activate\", {\n params: rel(orgId, projectId, releaseId),\n }),\n ),\n deactivate: (orgId: number, projectId: number, releaseId: number) =>\n unwrap(\n client.raw.POST(\"/project/{org_id}/{project_id}/releases/{release_id}/deactivate\", {\n params: rel(orgId, projectId, releaseId),\n }),\n ),\n move: (\n orgId: number,\n projectId: number,\n releaseId: number,\n targetEnvironmentId: number,\n note = \"\",\n ) =>\n unwrap(\n client.raw.POST(\"/project/{org_id}/{project_id}/releases/{release_id}/move\", {\n params: rel(orgId, projectId, releaseId),\n body: { target_environment_id: targetEnvironmentId, note },\n }),\n ),\n copy: (\n orgId: number,\n projectId: number,\n releaseId: number,\n targetEnvironmentId: number,\n note = \"\",\n ) =>\n unwrap(\n client.raw.POST(\"/project/{org_id}/{project_id}/releases/{release_id}/copy\", {\n params: rel(orgId, projectId, releaseId),\n body: { target_environment_id: targetEnvironmentId, note },\n }),\n ),\n };\n}\n","import type { MagicweaveClient } from \"../client.js\";\nimport { unwrap } from \"../client.js\";\nimport type { components } from \"../generated/schema.js\";\n\ntype S = components[\"schemas\"];\nexport type CurrencyDefinitionListResponse = S[\"CurrencyDefinitionListResponse\"];\nexport type CurrencyDefinitionResponse = S[\"CurrencyDefinitionResponse\"];\nexport type CurrencyDefinitionCreateRequest = S[\"CurrencyDefinitionCreateRequest\"];\n/** Update never changes the immutable `key` — the backend forbids it. */\nexport type CurrencyDefinitionUpdateRequest = S[\"CurrencyDefinitionUpdateRequest\"];\nexport type CurrencyOverviewListResponse = S[\"CurrencyOverviewListResponse\"];\n\n/** Currency definitions for a project. */\nexport function currencies(client: MagicweaveClient) {\n const proj = (orgId: number, projectId: number) => ({\n path: { org_id: orgId, project_id: projectId },\n });\n const one = (orgId: number, projectId: number, definitionId: number) => ({\n path: { org_id: orgId, project_id: projectId, definition_id: definitionId },\n });\n\n return {\n list: (orgId: number, projectId: number) =>\n unwrap(\n client.raw.GET(\"/currency-definitions/{org_id}/{project_id}/\", {\n params: proj(orgId, projectId),\n }),\n ),\n overview: (orgId: number, projectId: number) =>\n unwrap(\n client.raw.GET(\"/currency-definitions/{org_id}/{project_id}/overview/\", {\n params: proj(orgId, projectId),\n }),\n ),\n get: (orgId: number, projectId: number, definitionId: number) =>\n unwrap(\n client.raw.GET(\"/currency-definitions/{org_id}/{project_id}/{definition_id}/\", {\n params: one(orgId, projectId, definitionId),\n }),\n ),\n create: (orgId: number, projectId: number, body: CurrencyDefinitionCreateRequest) =>\n unwrap(\n client.raw.POST(\"/currency-definitions/{org_id}/{project_id}/\", {\n params: proj(orgId, projectId),\n body,\n }),\n ),\n update: (\n orgId: number,\n projectId: number,\n definitionId: number,\n body: CurrencyDefinitionUpdateRequest,\n ) =>\n unwrap(\n client.raw.PATCH(\"/currency-definitions/{org_id}/{project_id}/{definition_id}/\", {\n params: one(orgId, projectId, definitionId),\n body,\n }),\n ),\n remove: (orgId: number, projectId: number, definitionId: number) =>\n unwrap(\n client.raw.DELETE(\"/currency-definitions/{org_id}/{project_id}/{definition_id}/\", {\n params: one(orgId, projectId, definitionId),\n }),\n ),\n };\n}\n","import type { MagicweaveClient } from \"../client.js\";\nimport { unwrap } from \"../client.js\";\nimport type { components } from \"../generated/schema.js\";\n\ntype S = components[\"schemas\"];\nexport type StatDefinitionListResponse = S[\"StatDefinitionListResponse\"];\nexport type StatDefinitionResponse = S[\"StatDefinitionResponse\"];\nexport type StatDefinitionCreateRequest = S[\"StatDefinitionCreateRequest\"];\n/** Update never changes the immutable `key`. */\nexport type StatDefinitionUpdateRequest = S[\"StatDefinitionUpdateRequest\"];\nexport type StatOverviewListResponse = S[\"StatOverviewListResponse\"];\n\n/** Stat definitions for a project. */\nexport function stats(client: MagicweaveClient) {\n const proj = (orgId: number, projectId: number) => ({\n path: { org_id: orgId, project_id: projectId },\n });\n const one = (orgId: number, projectId: number, definitionId: number) => ({\n path: { org_id: orgId, project_id: projectId, definition_id: definitionId },\n });\n\n return {\n list: (orgId: number, projectId: number) =>\n unwrap(\n client.raw.GET(\"/stat-definitions/{org_id}/{project_id}/\", {\n params: proj(orgId, projectId),\n }),\n ),\n overview: (orgId: number, projectId: number) =>\n unwrap(\n client.raw.GET(\"/stat-definitions/{org_id}/{project_id}/overview/\", {\n params: proj(orgId, projectId),\n }),\n ),\n get: (orgId: number, projectId: number, definitionId: number) =>\n unwrap(\n client.raw.GET(\"/stat-definitions/{org_id}/{project_id}/{definition_id}/\", {\n params: one(orgId, projectId, definitionId),\n }),\n ),\n create: (orgId: number, projectId: number, body: StatDefinitionCreateRequest) =>\n unwrap(\n client.raw.POST(\"/stat-definitions/{org_id}/{project_id}/\", {\n params: proj(orgId, projectId),\n body,\n }),\n ),\n update: (\n orgId: number,\n projectId: number,\n definitionId: number,\n body: StatDefinitionUpdateRequest,\n ) =>\n unwrap(\n client.raw.PATCH(\"/stat-definitions/{org_id}/{project_id}/{definition_id}/\", {\n params: one(orgId, projectId, definitionId),\n body,\n }),\n ),\n remove: (orgId: number, projectId: number, definitionId: number) =>\n unwrap(\n client.raw.DELETE(\"/stat-definitions/{org_id}/{project_id}/{definition_id}/\", {\n params: one(orgId, projectId, definitionId),\n }),\n ),\n };\n}\n","import type { MagicweaveClient } from \"../client.js\";\nimport { unwrap } from \"../client.js\";\nimport type { components } from \"../generated/schema.js\";\n\ntype S = components[\"schemas\"];\nexport type GameManifestListResponse = S[\"GameManifestListResponse\"];\nexport type GameManifestResponse = S[\"GameManifestResponse\"];\nexport type GameManifestCreateRequest = S[\"GameManifestCreateRequest\"];\nexport type GameManifestUpdateRequest = S[\"GameManifestUpdateRequest\"];\nexport type GameManifestOverviewListResponse = S[\"GameManifestOverviewListResponse\"];\n\n/** Game manifests (the game-loop step graph) for a project. */\nexport function manifests(client: MagicweaveClient) {\n const proj = (orgId: number, projectId: number) => ({\n path: { org_id: orgId, project_id: projectId },\n });\n const one = (orgId: number, projectId: number, manifestId: number) => ({\n path: { org_id: orgId, project_id: projectId, manifest_id: manifestId },\n });\n\n return {\n list: (orgId: number, projectId: number) =>\n unwrap(\n client.raw.GET(\"/game-manifests/{org_id}/{project_id}/\", {\n params: proj(orgId, projectId),\n }),\n ),\n overview: (orgId: number, projectId: number) =>\n unwrap(\n client.raw.GET(\"/game-manifests/{org_id}/{project_id}/overview/\", {\n params: proj(orgId, projectId),\n }),\n ),\n get: (orgId: number, projectId: number, manifestId: number) =>\n unwrap(\n client.raw.GET(\"/game-manifests/{org_id}/{project_id}/{manifest_id}/\", {\n params: one(orgId, projectId, manifestId),\n }),\n ),\n create: (orgId: number, projectId: number, body: GameManifestCreateRequest) =>\n unwrap(\n client.raw.POST(\"/game-manifests/{org_id}/{project_id}/\", {\n params: proj(orgId, projectId),\n body,\n }),\n ),\n update: (\n orgId: number,\n projectId: number,\n manifestId: number,\n body: GameManifestUpdateRequest,\n ) =>\n unwrap(\n client.raw.PATCH(\"/game-manifests/{org_id}/{project_id}/{manifest_id}/\", {\n params: one(orgId, projectId, manifestId),\n body,\n }),\n ),\n remove: (orgId: number, projectId: number, manifestId: number) =>\n unwrap(\n client.raw.DELETE(\"/game-manifests/{org_id}/{project_id}/{manifest_id}/\", {\n params: one(orgId, projectId, manifestId),\n }),\n ),\n };\n}\n","import type { MagicweaveClient } from \"../client.js\";\nimport { unwrap } from \"../client.js\";\nimport type { components } from \"../generated/schema.js\";\n\ntype S = components[\"schemas\"];\nexport type LeaderboardListResponse = S[\"LeaderboardListResponse\"];\nexport type LeaderboardResponse = S[\"LeaderboardResponse\"];\nexport type LeaderboardCreateRequest = S[\"LeaderboardCreateRequest\"];\nexport type LeaderboardUpdateRequest = S[\"LeaderboardUpdateRequest\"];\nexport type LeaderboardOverviewListResponse = S[\"LeaderboardOverviewListResponse\"];\n\n/** Leaderboards for a project (incl. the irreversible process-reset). */\nexport function leaderboards(client: MagicweaveClient) {\n const proj = (orgId: number, projectId: number) => ({\n path: { org_id: orgId, project_id: projectId },\n });\n const one = (orgId: number, projectId: number, leaderboardId: number) => ({\n path: { org_id: orgId, project_id: projectId, leaderboard_id: leaderboardId },\n });\n\n return {\n list: (orgId: number, projectId: number) =>\n unwrap(\n client.raw.GET(\"/leaderboards/{org_id}/{project_id}/\", { params: proj(orgId, projectId) }),\n ),\n overview: (orgId: number, projectId: number) =>\n unwrap(\n client.raw.GET(\"/leaderboards/{org_id}/{project_id}/overview/\", {\n params: proj(orgId, projectId),\n }),\n ),\n get: (orgId: number, projectId: number, leaderboardId: number) =>\n unwrap(\n client.raw.GET(\"/leaderboards/{org_id}/{project_id}/{leaderboard_id}/\", {\n params: one(orgId, projectId, leaderboardId),\n }),\n ),\n create: (orgId: number, projectId: number, body: LeaderboardCreateRequest) =>\n unwrap(\n client.raw.POST(\"/leaderboards/{org_id}/{project_id}/\", {\n params: proj(orgId, projectId),\n body,\n }),\n ),\n update: (\n orgId: number,\n projectId: number,\n leaderboardId: number,\n body: LeaderboardUpdateRequest,\n ) =>\n unwrap(\n client.raw.PATCH(\"/leaderboards/{org_id}/{project_id}/{leaderboard_id}/\", {\n params: one(orgId, projectId, leaderboardId),\n body,\n }),\n ),\n remove: (orgId: number, projectId: number, leaderboardId: number) =>\n unwrap(\n client.raw.DELETE(\"/leaderboards/{org_id}/{project_id}/{leaderboard_id}/\", {\n params: one(orgId, projectId, leaderboardId),\n }),\n ),\n /** Irreversible: archive scores and reset the board. Confirm-gate in the CLI. */\n processReset: (orgId: number, projectId: number, leaderboardId: number) =>\n unwrap(\n client.raw.POST(\"/leaderboards/{org_id}/{project_id}/{leaderboard_id}/process-reset/\", {\n params: one(orgId, projectId, leaderboardId),\n }),\n ),\n };\n}\n","import type { MagicweaveClient } from \"../client.js\";\nimport { unwrap } from \"../client.js\";\nimport type { components } from \"../generated/schema.js\";\n\ntype S = components[\"schemas\"];\nexport type ProjectSegmentListResponse = S[\"ProjectSegmentListResponse\"];\nexport type ProjectSegmentResponse = S[\"ProjectSegmentResponse\"];\nexport type ProjectSegmentCreateRequest = S[\"ProjectSegmentCreateRequest\"];\nexport type ProjectSegmentUpdateRequest = S[\"ProjectSegmentUpdateRequest\"];\nexport type SegmentCatalogResponse = S[\"SegmentCatalogResponse\"];\n\n/** Reward segments — the building blocks referenced by spin wheels. */\nexport function segments(client: MagicweaveClient) {\n const proj = (orgId: number, projectId: number) => ({\n path: { org_id: orgId, project_id: projectId },\n });\n const one = (orgId: number, projectId: number, segmentId: number) => ({\n path: { org_id: orgId, project_id: projectId, segment_id: segmentId },\n });\n\n return {\n list: (orgId: number, projectId: number) =>\n unwrap(\n client.raw.GET(\"/spin-wheel/{org_id}/{project_id}/segments/\", {\n params: proj(orgId, projectId),\n }),\n ),\n catalog: (orgId: number, projectId: number) =>\n unwrap(\n client.raw.GET(\"/spin-wheel/{org_id}/{project_id}/segments/catalog/\", {\n params: proj(orgId, projectId),\n }),\n ),\n get: (orgId: number, projectId: number, segmentId: number) =>\n unwrap(\n client.raw.GET(\"/spin-wheel/{org_id}/{project_id}/segments/{segment_id}/\", {\n params: one(orgId, projectId, segmentId),\n }),\n ),\n create: (orgId: number, projectId: number, body: ProjectSegmentCreateRequest) =>\n unwrap(\n client.raw.POST(\"/spin-wheel/{org_id}/{project_id}/segments/\", {\n params: proj(orgId, projectId),\n body,\n }),\n ),\n update: (\n orgId: number,\n projectId: number,\n segmentId: number,\n body: ProjectSegmentUpdateRequest,\n ) =>\n unwrap(\n client.raw.PATCH(\"/spin-wheel/{org_id}/{project_id}/segments/{segment_id}/\", {\n params: one(orgId, projectId, segmentId),\n body,\n }),\n ),\n remove: (orgId: number, projectId: number, segmentId: number) =>\n unwrap(\n client.raw.DELETE(\"/spin-wheel/{org_id}/{project_id}/segments/{segment_id}/\", {\n params: one(orgId, projectId, segmentId),\n }),\n ),\n };\n}\n","import type { MagicweaveClient } from \"../client.js\";\nimport { unwrap } from \"../client.js\";\nimport type { components } from \"../generated/schema.js\";\n\ntype S = components[\"schemas\"];\nexport type SpinWheelProjectListResponse = S[\"SpinWheelProjectListResponse\"];\nexport type WheelConfigCreateRequest = S[\"WheelConfigCreateRequest\"];\nexport type WheelConfigCreateResponse = S[\"WheelConfigCreateResponse\"];\nexport type WheelConfigPatchRequest = S[\"WheelConfigPatchRequest\"];\nexport type WheelOverviewListResponse = S[\"WheelOverviewListResponse\"];\n\n/** Spin-wheel configurations for a project. */\nexport function wheels(client: MagicweaveClient) {\n const proj = (orgId: number, projectId: number) => ({\n path: { org_id: orgId, project_id: projectId },\n });\n const one = (orgId: number, projectId: number, wheelConfigId: number) => ({\n path: { org_id: orgId, project_id: projectId, wheel_config_id: wheelConfigId },\n });\n\n return {\n list: (orgId: number, projectId: number) =>\n unwrap(\n client.raw.GET(\"/spin-wheel/{org_id}/{project_id}/wheels/\", {\n params: proj(orgId, projectId),\n }),\n ),\n overview: (orgId: number, projectId: number) =>\n unwrap(\n client.raw.GET(\"/spin-wheel/{org_id}/{project_id}/wheels/overview/\", {\n params: proj(orgId, projectId),\n }),\n ),\n create: (orgId: number, projectId: number, body: WheelConfigCreateRequest) =>\n unwrap(\n client.raw.POST(\"/spin-wheel/{org_id}/{project_id}/wheels/\", {\n params: proj(orgId, projectId),\n body,\n }),\n ),\n update: (\n orgId: number,\n projectId: number,\n wheelConfigId: number,\n body: WheelConfigPatchRequest,\n ) =>\n unwrap(\n client.raw.PATCH(\"/spin-wheel/{org_id}/{project_id}/wheels/{wheel_config_id}/\", {\n params: one(orgId, projectId, wheelConfigId),\n body,\n }),\n ),\n remove: (orgId: number, projectId: number, wheelConfigId: number) =>\n unwrap(\n client.raw.DELETE(\"/spin-wheel/{org_id}/{project_id}/wheels/{wheel_config_id}/\", {\n params: one(orgId, projectId, wheelConfigId),\n }),\n ),\n };\n}\n","/**\n * The EconomySpec — a whole game's game-layer definitions in one object.\n *\n * Ported faithfully from magicweave-fastmcp/tools/spec.py. This is the contract a\n * human/agent authors up front; `validateSpec` (smart/validate.ts) checks it for\n * every violation at once — including cross-references — before any create call.\n *\n * As in the Python source, manifest step-graph internals are intentionally lax\n * (every inner field optional): the deterministic validator owns the friendly\n * semantic messages; these schemas only enforce that an outcome/condition IS an\n * object, not a scalar.\n */\nimport { z } from \"zod\";\n\nexport const CurrencySpec = z.object({\n key: z.string(),\n name: z.string(),\n symbol: z.string().default(\"\"),\n initial_balance: z.number().int().default(0),\n max_balance: z.number().int().nullable().default(null),\n usable_as_reward: z.boolean().default(true),\n usable_in_conditions: z.boolean().default(true),\n});\n\nexport const StatSpec = z.object({\n key: z.string(),\n name: z.string(),\n stat_type: z.string(), // integer | float | boolean\n default_value: z.union([z.number(), z.boolean()]),\n min_value: z.number().nullable().default(null),\n max_value: z.number().nullable().default(null),\n usable_in_conditions: z.boolean().default(true),\n usable_as_reward: z.boolean().default(true),\n});\n\nexport const Formula = z.object({\n formula: z.string().nullish(),\n max: z.number().nullish(),\n});\n\nexport const Outcome = z.object({\n reward_type: z.string().nullish(), // fixed | variable\n reward_target: z.string().nullish(), // currency | stat | gem\n currency_key: z.string().nullish(),\n stat_key: z.string().nullish(),\n operation: z.string().nullish(), // add | subtract | set | multiply\n value: z.number().nullish(),\n formula: Formula.nullish(),\n});\n\nexport const Condition = z.object({\n payload_key: z.string().nullish(),\n operator: z.string().nullish(), // eq | neq | gt | gte | lt | lte\n expected_value: z.union([z.number(), z.boolean(), z.string()]).nullish(),\n});\n\nexport const ConditionSet = z.object({\n conditions: z.array(Condition).default([]),\n outcomes: z.array(Outcome).default([]),\n});\n\nexport const Step = z.object({\n key: z.string().nullish(), // optional so the validator, not Zod, reports \"missing key\"\n name: z.string().default(\"\"),\n is_entry: z.boolean().default(false),\n is_terminal: z.boolean().default(false),\n next_step_keys: z.array(z.string()).default([]),\n condition_sets: z.array(ConditionSet).default([]),\n});\n\nexport const EntryRequirement = z.object({\n requirement_type: z.string().nullish(), // entry_cost | eligibility\n value_source: z.string().nullish(), // currency | stat\n currency_key: z.string().nullish(),\n stat_key: z.string().nullish(),\n operator: z.string().nullish(), // gte | lte | eq (eligibility)\n threshold_value: z.union([z.number(), z.boolean()]).nullish(),\n cost_amount: z.number().int().nullish(), // REQUIRED by the admin API for entry_cost\n});\n\nexport const ManifestSpec = z.object({\n slug: z.string(),\n name: z.string(),\n entry_requirements: z.array(EntryRequirement).default([]),\n steps: z.array(Step),\n});\n\nexport const LeaderboardSpec = z.object({\n slug: z.string(),\n name: z.string(),\n stat_key: z.string(), // authored by key; resolved to stat_id at create time\n sort_order: z.string().default(\"desc\"),\n leaderboard_type: z.string().default(\"relative\"),\n reset_type: z.string().nullable().default(null),\n soft_reset_percentage: z.number().nullish(),\n});\n\nexport const Reward = z.object({\n reward_type: z.string().nullish(), // currency | stat | gem\n currency_key: z.string().nullish(),\n stat_key: z.string().nullish(),\n amount: z.number().int().nullish(),\n});\n\nexport const SegmentSpec = z.object({\n label: z.string(),\n reward: Reward,\n probability: z.number().int(),\n can_override: z.boolean().default(false),\n});\n\nexport const WheelSegmentLink = z.object({\n segment_ref: z.string(), // label of a segment defined in this spec\n probability_override: z.number().int().nullish(),\n});\n\nexport const WheelSpec = z.object({\n key_slug: z.string(),\n name: z.string(),\n daily_free_spins: z.number().int().default(1),\n allow_paid_spins: z.boolean().default(false),\n paid_spin_currency_key: z.string().default(\"\"),\n paid_spin_currency_amount: z.number().int().nullish(),\n segments: z.array(WheelSegmentLink).default([]),\n});\n\nexport const EconomySpec = z.object({\n currencies: z.array(CurrencySpec).default([]),\n stats: z.array(StatSpec).default([]),\n manifests: z.array(ManifestSpec).default([]),\n leaderboards: z.array(LeaderboardSpec).default([]),\n segments: z.array(SegmentSpec).default([]),\n wheels: z.array(WheelSpec).default([]),\n});\n\nexport type CurrencySpec = z.infer<typeof CurrencySpec>;\nexport type StatSpec = z.infer<typeof StatSpec>;\nexport type Outcome = z.infer<typeof Outcome>;\nexport type Condition = z.infer<typeof Condition>;\nexport type ConditionSet = z.infer<typeof ConditionSet>;\nexport type Step = z.infer<typeof Step>;\nexport type EntryRequirement = z.infer<typeof EntryRequirement>;\nexport type ManifestSpec = z.infer<typeof ManifestSpec>;\nexport type LeaderboardSpec = z.infer<typeof LeaderboardSpec>;\nexport type Reward = z.infer<typeof Reward>;\nexport type SegmentSpec = z.infer<typeof SegmentSpec>;\nexport type WheelSegmentLink = z.infer<typeof WheelSegmentLink>;\nexport type WheelSpec = z.infer<typeof WheelSpec>;\nexport type EconomySpec = z.infer<typeof EconomySpec>;\n\n/** A single problem found by the validator. `rule` is a stable machine id. */\nexport interface Violation {\n path: string;\n message: string;\n severity: \"error\" | \"warning\";\n rule?: string;\n}\n\nexport interface SpecReport {\n ok: boolean;\n violations: Violation[];\n summary: Record<string, number>;\n}\n","import type { MagicweaveClient } from \"../client.js\";\nimport { currencies } from \"../resources/currencies.js\";\nimport { leaderboards } from \"../resources/leaderboards.js\";\nimport { manifests } from \"../resources/manifests.js\";\nimport { segments } from \"../resources/segments.js\";\nimport { stats } from \"../resources/stats.js\";\nimport { wheels } from \"../resources/wheels.js\";\n\n/**\n * A point-in-time snapshot of every game-layer definition in a project — for\n * backup, diffing, or version control. Mirrors fastmcp's export_definitions:\n * fan out the list reads for all definition types and collect them under one\n * object, in dependency order (currencies/stats first).\n */\nexport interface DefinitionsSnapshot {\n org_id: number;\n project_id: number;\n currencies: Awaited<ReturnType<ReturnType<typeof currencies>[\"list\"]>>;\n stats: Awaited<ReturnType<ReturnType<typeof stats>[\"list\"]>>;\n manifests: Awaited<ReturnType<ReturnType<typeof manifests>[\"list\"]>>;\n leaderboards: Awaited<ReturnType<ReturnType<typeof leaderboards>[\"list\"]>>;\n segments: Awaited<ReturnType<ReturnType<typeof segments>[\"list\"]>>;\n wheels: Awaited<ReturnType<ReturnType<typeof wheels>[\"list\"]>>;\n}\n\nexport async function exportDefinitions(\n client: MagicweaveClient,\n orgId: number,\n projectId: number,\n): Promise<DefinitionsSnapshot> {\n const [currencyList, statList, manifestList, leaderboardList, segmentList, wheelList] =\n await Promise.all([\n currencies(client).list(orgId, projectId),\n stats(client).list(orgId, projectId),\n manifests(client).list(orgId, projectId),\n leaderboards(client).list(orgId, projectId),\n segments(client).list(orgId, projectId),\n wheels(client).list(orgId, projectId),\n ]);\n\n return {\n org_id: orgId,\n project_id: projectId,\n currencies: currencyList,\n stats: statList,\n manifests: manifestList,\n leaderboards: leaderboardList,\n segments: segmentList,\n wheels: wheelList,\n };\n}\n","/**\n * Reference graph over a project's game-layer definitions — ported from\n * magicweave-fastmcp/tools/refgraph.py.\n *\n * The admin API has no \"what references this\" endpoint, but the answer is fully\n * computable from the six list reads: manifests/segments reference currencies and\n * stats BY KEY, leaderboards reference a stat BY numeric stat_id, and wheels\n * reference project segments BY numeric segment_id. We fan out the six reads once\n * and answer inbound-reference (\"blast radius\") queries.\n */\nimport type { MagicweaveClient } from \"../client.js\";\nimport { unwrap } from \"../client.js\";\n\n// Live definitions are dynamic dict shapes here (we only read a few fields).\ntype Def = Record<string, unknown>;\n\nexport interface Reference {\n referencingKind: \"manifest\" | \"leaderboard\" | \"segment\" | \"wheel\";\n id: number | null;\n name: string;\n locus: string;\n}\n\n/** Closest candidate to a mistyped key/slug, or null (difflib-style, cutoff 0.6). */\nexport function didYouMean(needle: string, candidates: string[]): string | null {\n let best: string | null = null;\n let bestRatio = 0;\n for (const c of candidates) {\n const r = similarity(needle, c);\n if (r > bestRatio) {\n bestRatio = r;\n best = c;\n }\n }\n return bestRatio >= 0.6 ? best : null;\n}\n\nfunction similarity(a: string, b: string): number {\n // Approximates Python difflib's SequenceMatcher.ratio (2*M/T) with an LCS-based\n // ratio, which — unlike raw Levenshtein — scores transpositions (\"glod\"/\"gold\")\n // generously, matching the fastmcp did_you_mean behavior.\n if (a === b) return 1;\n if (!a.length || !b.length) return 0;\n return (2 * lcsLength(a, b)) / (a.length + b.length);\n}\n\nfunction lcsLength(a: string, b: string): number {\n const m = a.length;\n const n = b.length;\n const row = new Array<number>(n + 1).fill(0);\n for (let i = 1; i <= m; i++) {\n let prevDiag = 0;\n for (let j = 1; j <= n; j++) {\n const tmp = row[j] as number;\n row[j] =\n a[i - 1] === b[j - 1] ? prevDiag + 1 : Math.max(row[j] as number, row[j - 1] as number);\n prevDiag = tmp;\n }\n }\n return row[n] as number;\n}\n\nfunction str(v: unknown): string | undefined {\n return typeof v === \"string\" && v ? v : undefined;\n}\n\n/** Yield [targetKind, key, locus] for every definition a manifest references. */\nexport function* iterManifestRefs(\n manifest: Def,\n): Generator<[kind: \"currency\" | \"stat\", key: string, locus: string]> {\n for (const req of (manifest.entry_requirements as Def[]) ?? []) {\n if (typeof req !== \"object\" || req === null) continue;\n const ck = str(req.currency_key);\n if (ck) yield [\"currency\", ck, \"entry requirement\"];\n const sk = str(req.stat_key);\n if (sk) yield [\"stat\", sk, \"entry requirement\"];\n }\n for (const step of (manifest.steps as Def[]) ?? []) {\n if (typeof step !== \"object\" || step === null) continue;\n const skey = str(step.key) ?? \"?\";\n for (const cs of (step.condition_sets as Def[]) ?? []) {\n if (typeof cs !== \"object\" || cs === null) continue;\n for (const out of (cs.outcomes as Def[]) ?? []) {\n if (typeof out !== \"object\" || out === null) continue;\n const target = out.reward_target;\n if (target === \"currency\") {\n const ck = str(out.currency_key);\n if (ck) yield [\"currency\", ck, `outcome in step '${skey}'`];\n } else if (target === \"stat\") {\n const sk = str(out.stat_key);\n if (sk) yield [\"stat\", sk, `outcome in step '${skey}'`];\n }\n }\n }\n }\n}\n\nexport function* iterSegmentRefs(\n segment: Def,\n): Generator<[kind: \"currency\" | \"stat\", key: string, locus: string]> {\n const reward = (segment.reward as Def) ?? {};\n if (reward.reward_type === \"currency\") {\n const ck = str(reward.currency_key);\n if (ck) yield [\"currency\", ck, \"segment reward\"];\n } else if (reward.reward_type === \"stat\") {\n const sk = str(reward.stat_key);\n if (sk) yield [\"stat\", sk, \"segment reward\"];\n }\n}\n\n/** A wheel list item is { effective, wheel_config } (or already flat). */\nfunction wheelViews(wheel: Def): [effective: Def, config: Def] {\n const eff = (wheel.effective as Def) ?? {};\n const cfg = (wheel.wheel_config as Def) ?? {};\n if (Object.keys(eff).length === 0 && Object.keys(cfg).length === 0) return [wheel, wheel];\n return [eff, cfg];\n}\n\nexport class ProjectGraph {\n constructor(\n readonly currencies: Def[],\n readonly stats: Def[],\n readonly manifests: Def[],\n readonly leaderboards: Def[],\n readonly segments: Def[],\n readonly wheels: Def[],\n ) {}\n\n currencyKeys(): string[] {\n return this.currencies.map((c) => str(c.key)).filter((k): k is string => !!k);\n }\n statKeys(): string[] {\n return this.stats.map((s) => str(s.key)).filter((k): k is string => !!k);\n }\n segmentIds(): number[] {\n return this.segments.map((s) => s.id).filter((v): v is number => typeof v === \"number\");\n }\n\n private statIdForKey(key: string): number | null {\n for (const s of this.stats) if (s.key === key) return (s.id as number) ?? null;\n return null;\n }\n\n /** Inbound references (blast radius) to a currency/stat (by key) or segment (by id). */\n referencesTo(kind: \"currency\" | \"stat\" | \"segment\", ref: string | number): Reference[] {\n if (kind === \"segment\") return this.refsToSegment(Number(ref));\n return this.refsToDefinition(kind, String(ref));\n }\n\n private refsToDefinition(targetKind: \"currency\" | \"stat\", key: string): Reference[] {\n const found: Reference[] = [];\n for (const m of this.manifests) {\n for (const [tk, refKey, locus] of iterManifestRefs(m)) {\n if (tk === targetKind && refKey === key) {\n found.push({\n referencingKind: \"manifest\",\n id: (m.id as number) ?? null,\n name: str(m.slug) ?? \"?\",\n locus,\n });\n }\n }\n }\n for (const seg of this.segments) {\n for (const [tk, refKey] of iterSegmentRefs(seg)) {\n if (tk === targetKind && refKey === key) {\n found.push({\n referencingKind: \"segment\",\n id: (seg.id as number) ?? null,\n name: str(seg.label) ?? \"?\",\n locus: \"segment reward\",\n });\n }\n }\n }\n if (targetKind === \"currency\") {\n for (const w of this.wheels) {\n const [eff, cfg] = wheelViews(w);\n const paid = str(cfg.paid_spin_currency_key) ?? str(eff.paid_spin_currency_key);\n if (paid === key) {\n found.push({\n referencingKind: \"wheel\",\n id: (cfg.id as number) ?? null,\n name: str(cfg.key_slug) ?? str(eff.key_slug) ?? \"?\",\n locus: \"paid-spin currency\",\n });\n }\n }\n }\n if (targetKind === \"stat\") {\n const statId = this.statIdForKey(key);\n if (statId !== null) {\n for (const lb of this.leaderboards) {\n if (lb.stat_id === statId) {\n found.push({\n referencingKind: \"leaderboard\",\n id: (lb.id as number) ?? null,\n name: str(lb.slug) ?? \"?\",\n locus: \"ranked stat\",\n });\n }\n }\n }\n }\n return found;\n }\n\n private refsToSegment(segmentId: number): Reference[] {\n const found: Reference[] = [];\n for (const w of this.wheels) {\n const [eff, cfg] = wheelViews(w);\n const links = ((eff.segments as Def[]) ?? (cfg.segments as Def[]) ?? []) as Def[];\n if (links.some((l) => l.segment_id === segmentId)) {\n found.push({\n referencingKind: \"wheel\",\n id: (cfg.id as number) ?? null,\n name: str(cfg.key_slug) ?? str(eff.key_slug) ?? \"?\",\n locus: \"wheel segment link\",\n });\n }\n }\n return found;\n }\n}\n\n/** Fan out the six list reads and build the graph. */\nexport async function buildReferenceGraph(\n client: MagicweaveClient,\n orgId: number,\n projectId: number,\n): Promise<ProjectGraph> {\n const path = { org_id: orgId, project_id: projectId };\n const pick = (obj: unknown, key: string): Def[] => {\n const arr = (obj as Record<string, unknown>)?.[key];\n return Array.isArray(arr) ? (arr as Def[]) : [];\n };\n\n const [currencies, stats, manifests, leaderboards, segments, wheels] = await Promise.all([\n unwrap(client.raw.GET(\"/currency-definitions/{org_id}/{project_id}/\", { params: { path } })),\n unwrap(client.raw.GET(\"/stat-definitions/{org_id}/{project_id}/\", { params: { path } })),\n unwrap(client.raw.GET(\"/game-manifests/{org_id}/{project_id}/\", { params: { path } })),\n unwrap(client.raw.GET(\"/leaderboards/{org_id}/{project_id}/\", { params: { path } })),\n unwrap(client.raw.GET(\"/spin-wheel/{org_id}/{project_id}/segments/\", { params: { path } })),\n unwrap(client.raw.GET(\"/spin-wheel/{org_id}/{project_id}/wheels/\", { params: { path } })),\n ]);\n\n return new ProjectGraph(\n pick(currencies, \"currency_definitions\"),\n pick(stats, \"stat_definitions\"),\n pick(manifests, \"game_manifests\"),\n pick(leaderboards, \"leaderboards\"),\n pick(segments, \"segments\"),\n pick(wheels, \"wheels\"),\n );\n}\n","/**\n * validateSpec — check a whole EconomySpec for EVERY violation at once, and\n * impactScan — the blast radius of a live definition. Ported from\n * magicweave-fastmcp/tools/insight.py (the deterministic economy linter).\n *\n * The rules run on the parsed EconomySpec (Zod applies defaults first). Structural\n * problems that Zod itself rejects (missing key/name) surface as `schema`\n * violations so the caller still gets one report with everything.\n */\nimport type { z } from \"zod\";\nimport type { MagicweaveClient } from \"../client.js\";\nimport {\n EconomySpec,\n type LeaderboardSpec,\n type ManifestSpec,\n type Reward,\n type SpecReport,\n type Violation,\n type WheelSpec,\n} from \"../schemas/spec.js\";\nimport { buildReferenceGraph, didYouMean, iterManifestRefs, iterSegmentRefs } from \"./refgraph.js\";\n\nconst STAT_TYPES = [\"integer\", \"float\", \"boolean\"];\nconst SORT_ORDERS = [\"desc\", \"asc\"];\nconst LEADERBOARD_TYPES = [\"relative\", \"absolute\"];\nconst RESET_TYPES = [\"soft\", \"hard\"];\nconst REWARD_TYPES = [\"currency\", \"stat\", \"gem\"];\nconst REQUIREMENT_TYPES = [\"entry_cost\", \"eligibility\"];\nconst VALUE_SOURCES = [\"currency\", \"stat\"];\nconst OUTCOME_REWARD_TYPES = [\"fixed\", \"variable\"];\nconst REWARD_TARGETS = [\"currency\", \"stat\", \"gem\"];\nconst OPERATIONS = [\"add\", \"subtract\", \"set\", \"multiply\"];\nconst OPERATORS = [\"eq\", \"neq\", \"gt\", \"gte\", \"lt\", \"lte\"];\n// an arithmetic operator surrounded by spaces inside a string expected_value —\n// \"day + 2\" is an expression; \"power-up\" is a legitimate literal.\nconst EXPR_IN_VALUE = /\\s[-+*/]\\s/;\nconst FORMULA_TOKEN = /[A-Za-z_][A-Za-z0-9_]*/g;\nconst FORMULA_NOISE = new Set([\n \"max\",\n \"min\",\n \"abs\",\n \"round\",\n \"floor\",\n \"ceil\",\n \"sqrt\",\n \"pow\",\n \"if\",\n \"else\",\n \"and\",\n \"or\",\n \"not\",\n \"true\",\n \"false\",\n]);\n\ntype Spec = z.infer<typeof EconomySpec>;\n\n/** Validate a whole economy spec; returns every violation in one pass. */\nexport function validateSpec(input: unknown): SpecReport {\n const parsed = EconomySpec.safeParse(input);\n if (!parsed.success) {\n const violations: Violation[] = parsed.error.issues.map((issue) => ({\n path: issue.path.join(\".\"),\n message: issue.message,\n severity: \"error\",\n rule: \"schema\",\n }));\n return report(violations);\n }\n return report(validateEconomy(parsed.data));\n}\n\nfunction report(violations: Violation[]): SpecReport {\n const errors = violations.filter((v) => v.severity === \"error\").length;\n const warnings = violations.length - errors;\n return { ok: errors === 0, violations, summary: { errors, warnings } };\n}\n\nfunction validateEconomy(spec: Spec): Violation[] {\n const out: Violation[] = [];\n const currencyKeys = new Set(spec.currencies.map((c) => c.key));\n const statKeys = new Set(spec.stats.map((s) => s.key));\n const segmentLabels = new Set(spec.segments.map((s) => s.label));\n\n const bad = (\n path: string,\n message: string,\n severity: \"error\" | \"warning\" = \"error\",\n rule?: string,\n ) => out.push({ path, message, severity, rule });\n\n const refOk = (kind: \"currency\" | \"stat\", key: string, path: string) => {\n const pool = kind === \"currency\" ? currencyKeys : statKeys;\n if (!pool.has(key)) {\n const hint = didYouMean(key, [...pool].sort());\n bad(\n path,\n `references unknown ${kind} '${key}'.${hint ? ` Did you mean '${hint}'?` : \"\"}`,\n \"error\",\n \"unknown-ref\",\n );\n }\n };\n\n // duplicate keys\n for (const [poolName, items] of [\n [\"currencies\", spec.currencies],\n [\"stats\", spec.stats],\n ] as const) {\n const seen = new Set<string>();\n items.forEach((item, i) => {\n if (seen.has(item.key))\n bad(`${poolName}[${i}].key`, `duplicate key '${item.key}'.`, \"error\", \"duplicate-key\");\n seen.add(item.key);\n });\n }\n\n spec.stats.forEach((s, i) => {\n if (!STAT_TYPES.includes(s.stat_type)) {\n bad(\n `stats[${i}].stat_type`,\n `must be one of ${STAT_TYPES.join(\", \")}.`,\n \"error\",\n \"stat-type\",\n );\n }\n });\n\n spec.manifests.forEach((m, i) => {\n const stepsErr = validateSteps(m);\n if (stepsErr) bad(`manifests[${i}].steps`, stepsErr, \"error\", \"steps-shape\");\n for (const [tk, key, locus] of iterManifestRefs(m as unknown as Record<string, unknown>)) {\n refOk(tk, key, `manifests[${i}] (${locus})`);\n }\n validateManifestInternals(bad, i, m);\n validateEntryRequirements(bad, i, m);\n lintReachability(bad, i, m);\n lintFormulaKeys(bad, i, m);\n });\n\n spec.leaderboards.forEach((lb, i) => {\n const lbErr = validateLeaderboardFields(lb);\n if (lbErr) bad(`leaderboards[${i}]`, lbErr, \"error\", \"leaderboard-fields\");\n if (!statKeys.has(lb.stat_key)) {\n const hint = didYouMean(lb.stat_key, [...statKeys].sort());\n bad(\n `leaderboards[${i}].stat_key`,\n `unknown stat '${lb.stat_key}'.${hint ? ` Did you mean '${hint}'?` : \"\"}`,\n \"error\",\n \"unknown-ref\",\n );\n }\n });\n\n spec.segments.forEach((seg, i) => {\n const rErr = validateReward(seg.reward);\n if (rErr) bad(`segments[${i}].reward`, rErr, \"error\", \"reward-shape\");\n for (const [tk, key] of iterSegmentRefs({ reward: seg.reward } as Record<string, unknown>)) {\n refOk(tk, key, `segments[${i}].reward`);\n }\n if (seg.reward.reward_type === \"gem\") {\n bad(\n `segments[${i}].reward.reward_type`,\n \"gem rewards are only allowed on network catalog segments — project segments may reward currency only. Link network gem segments into the wheel at authoring time (get_segment_catalog).\",\n \"error\",\n \"gem-project-segment\",\n );\n }\n });\n\n spec.wheels.forEach((w, i) => validateWheelSpec(out, i, w, spec, currencyKeys, segmentLabels));\n\n lintPhantomStats(bad, spec);\n lintOrphanCurrencies(bad, spec);\n return out;\n}\n\n// --- ported helper validators (approximations of the fastmcp fail-fast helpers) ---\n\nfunction validateSteps(m: ManifestSpec): string | null {\n const steps = m.steps ?? [];\n if (steps.length === 0) return \"manifest has no steps.\";\n const keys = steps.map((s) => s.key).filter((k): k is string => !!k);\n if (keys.length !== steps.length) return \"every step must have a key.\";\n if (new Set(keys).size !== keys.length) return \"step keys must be unique.\";\n const entries = steps.filter((s) => s.is_entry);\n if (entries.length !== 1) return `exactly one step must be is_entry (found ${entries.length}).`;\n if (!steps.some((s) => s.is_terminal)) return \"at least one step must be is_terminal.\";\n const keySet = new Set(keys);\n for (const s of steps) {\n for (const nk of s.next_step_keys ?? []) {\n if (!keySet.has(nk)) return `step '${s.key}' points to unknown next step '${nk}'.`;\n }\n }\n return null;\n}\n\nfunction validateLeaderboardFields(lb: LeaderboardSpec): string | null {\n if (!SORT_ORDERS.includes(lb.sort_order))\n return `sort_order must be one of ${SORT_ORDERS.join(\", \")}.`;\n if (!LEADERBOARD_TYPES.includes(lb.leaderboard_type))\n return `leaderboard_type must be one of ${LEADERBOARD_TYPES.join(\", \")}.`;\n if (lb.reset_type != null && !RESET_TYPES.includes(lb.reset_type))\n return `reset_type must be one of ${RESET_TYPES.join(\", \")} or null.`;\n if (lb.reset_type === \"soft\") {\n const p = lb.soft_reset_percentage;\n if (p == null || p <= 0 || p > 100)\n return \"soft reset requires soft_reset_percentage in (0, 100].\";\n }\n return null;\n}\n\nfunction validateReward(reward: Reward): string | null {\n if (!reward.reward_type) return \"reward is missing reward_type (currency | stat | gem).\";\n if (!REWARD_TYPES.includes(reward.reward_type))\n return `reward_type must be one of ${REWARD_TYPES.join(\", \")}.`;\n if (reward.reward_type === \"currency\" && !reward.currency_key)\n return \"currency reward must set currency_key.\";\n if (reward.reward_type === \"stat\" && !reward.stat_key) return \"stat reward must set stat_key.\";\n if (reward.amount == null || reward.amount < 1) return \"reward amount must be an integer >= 1.\";\n return null;\n}\n\ntype Bad = (path: string, message: string, severity?: \"error\" | \"warning\", rule?: string) => void;\n\nfunction validateEntryRequirements(bad: Bad, i: number, m: ManifestSpec): void {\n m.entry_requirements.forEach((req, j) => {\n const base = `manifests[${i}].entry_requirements[${j}]`;\n if (!req.requirement_type || !REQUIREMENT_TYPES.includes(req.requirement_type)) {\n bad(\n `${base}.requirement_type`,\n `must be one of ${REQUIREMENT_TYPES.join(\", \")} (got ${JSON.stringify(req.requirement_type)}).`,\n \"error\",\n \"entry-requirement\",\n );\n }\n if (!req.value_source || !VALUE_SOURCES.includes(req.value_source)) {\n bad(\n `${base}.value_source`,\n `is required and must be one of ${VALUE_SOURCES.join(\", \")}.`,\n \"error\",\n \"entry-requirement\",\n );\n }\n if (req.requirement_type === \"entry_cost\" && (req.cost_amount == null || req.cost_amount < 1)) {\n bad(\n `${base}.cost_amount`,\n \"cost_amount (integer >= 1) is required for entry_cost.\",\n \"error\",\n \"entry-requirement\",\n );\n }\n });\n}\n\nfunction validateManifestInternals(bad: Bad, i: number, m: ManifestSpec): void {\n m.steps.forEach((step, j) => {\n step.condition_sets.forEach((cs, k) => {\n const baseCs = `manifests[${i}].steps[${j}].condition_sets[${k}]`;\n cs.conditions.forEach((cond, c) => {\n if (cond.operator != null && !OPERATORS.includes(cond.operator)) {\n bad(\n `${baseCs}.conditions[${c}].operator`,\n `must be one of ${OPERATORS.join(\", \")}.`,\n \"error\",\n \"condition-operator\",\n );\n }\n if (typeof cond.expected_value === \"string\" && EXPR_IN_VALUE.test(cond.expected_value)) {\n bad(\n `${baseCs}.conditions[${c}].expected_value`,\n `'${cond.expected_value}' looks like an expression — expected_value must be a literal; compute the value client-side and send the result in the record payload.`,\n \"warning\",\n \"expected-value-literal\",\n );\n }\n });\n cs.outcomes.forEach((oc, o) => {\n const base = `${baseCs}.outcomes[${o}]`;\n if (!oc.reward_type)\n bad(base, \"outcome is missing reward_type (fixed | variable).\", \"error\", \"outcome-enum\");\n else if (!OUTCOME_REWARD_TYPES.includes(oc.reward_type))\n bad(\n `${base}.reward_type`,\n `must be one of ${OUTCOME_REWARD_TYPES.join(\", \")}.`,\n \"error\",\n \"outcome-enum\",\n );\n if (!oc.reward_target)\n bad(\n base,\n \"outcome is missing reward_target (currency | stat | gem).\",\n \"error\",\n \"outcome-enum\",\n );\n else if (!REWARD_TARGETS.includes(oc.reward_target))\n bad(\n `${base}.reward_target`,\n `must be one of ${REWARD_TARGETS.join(\", \")}.`,\n \"error\",\n \"outcome-enum\",\n );\n if (oc.operation != null && !OPERATIONS.includes(oc.operation))\n bad(\n `${base}.operation`,\n `must be one of ${OPERATIONS.join(\", \")}.`,\n \"error\",\n \"outcome-enum\",\n );\n\n const hasFormula = oc.formula != null && !!oc.formula.formula;\n if (oc.reward_type === \"fixed\") {\n if (oc.value == null) bad(base, \"fixed outcome must set value.\", \"error\", \"pairing\");\n if (hasFormula)\n bad(\n base,\n \"fixed outcome must not carry a formula — use reward_type 'variable' to evaluate a formula.\",\n \"error\",\n \"pairing\",\n );\n } else if (oc.reward_type === \"variable\") {\n if (!hasFormula)\n bad(base, \"variable outcome must set formula.formula.\", \"error\", \"pairing\");\n if (oc.value != null)\n bad(\n base,\n \"variable outcome must not set value — use reward_type 'fixed' to award a fixed value.\",\n \"error\",\n \"pairing\",\n );\n }\n if (\n oc.reward_target === \"gem\" &&\n oc.reward_type === \"variable\" &&\n oc.formula != null &&\n oc.formula.max == null\n ) {\n bad(\n `${base}.formula.max`,\n \"uncapped variable gem award — set formula.max (gems are the network-wide premium wallet).\",\n \"warning\",\n \"uncapped-gem\",\n );\n }\n });\n });\n });\n}\n\nfunction validateWheelSpec(\n out: Violation[],\n i: number,\n wheel: WheelSpec,\n spec: Spec,\n currencyKeys: Set<string>,\n segmentLabels: Set<string>,\n): void {\n const probByLabel = new Map(spec.segments.map((s) => [s.label, s.probability]));\n let total = 0;\n wheel.segments.forEach((link, j) => {\n if (!segmentLabels.has(link.segment_ref)) {\n const hint = didYouMean(link.segment_ref, [...segmentLabels].sort());\n out.push({\n path: `wheels[${i}].segments[${j}].segment_ref`,\n message: `unknown segment '${link.segment_ref}'.${hint ? ` Did you mean '${hint}'?` : \"\"}`,\n severity: \"error\",\n rule: \"segment-ref\",\n });\n return;\n }\n total += link.probability_override ?? probByLabel.get(link.segment_ref) ?? 0;\n });\n if (wheel.segments.length && total !== 100) {\n out.push({\n path: `wheels[${i}].segments`,\n message: `effective probabilities total ${total}, must be exactly 100.`,\n severity: \"error\",\n rule: \"probability-total\",\n });\n }\n if (wheel.allow_paid_spins) {\n if (!currencyKeys.has(wheel.paid_spin_currency_key)) {\n const hint = didYouMean(wheel.paid_spin_currency_key, [...currencyKeys].sort());\n out.push({\n path: `wheels[${i}].paid_spin_currency_key`,\n message: `unknown currency '${wheel.paid_spin_currency_key}'.${hint ? ` Did you mean '${hint}'?` : \"\"}`,\n severity: \"error\",\n rule: \"unknown-ref\",\n });\n }\n if (wheel.paid_spin_currency_amount == null || wheel.paid_spin_currency_amount < 1) {\n out.push({\n path: `wheels[${i}].paid_spin_currency_amount`,\n message: \"must be an integer >= 1 when allow_paid_spins is true.\",\n severity: \"error\",\n rule: \"paid-spin\",\n });\n }\n // Money printer: expected payout in the paid currency vs the spin cost.\n const rewardByLabel = new Map(spec.segments.map((s) => [s.label, s.reward]));\n const amt = wheel.paid_spin_currency_amount;\n if (\n currencyKeys.has(wheel.paid_spin_currency_key) &&\n amt &&\n amt >= 1 &&\n wheel.segments.length\n ) {\n let ev = 0;\n for (const link of wheel.segments) {\n const reward = rewardByLabel.get(link.segment_ref);\n if (!reward || reward.reward_type !== \"currency\" || !reward.amount) continue;\n if (reward.currency_key !== wheel.paid_spin_currency_key) continue;\n const prob = link.probability_override ?? probByLabel.get(link.segment_ref) ?? 0;\n ev += (prob / 100) * reward.amount;\n }\n if (ev >= amt) {\n out.push({\n path: `wheels[${i}].paid_spin_currency_amount`,\n message: `money printer: expected payout per paid spin is ${ev.toFixed(1)} '${wheel.paid_spin_currency_key}' but a spin costs ${amt} — raise the cost or lower the payouts.`,\n severity: \"error\",\n rule: \"money-printer\",\n });\n }\n }\n }\n}\n\n// --- economy lints (advisory warnings) ---\n\nfunction payloadKeyCounts(m: ManifestSpec): Map<string, number> {\n const counts = new Map<string, number>();\n const inc = (k: string) => counts.set(k, (counts.get(k) ?? 0) + 1);\n for (const step of m.steps) {\n for (const cs of step.condition_sets) {\n for (const cond of cs.conditions) if (cond.payload_key) inc(cond.payload_key);\n for (const oc of cs.outcomes) {\n if (oc.formula?.formula) {\n for (const tok of oc.formula.formula.match(FORMULA_TOKEN) ?? []) {\n if (!FORMULA_NOISE.has(tok.toLowerCase())) inc(tok);\n }\n }\n }\n }\n }\n return counts;\n}\n\nfunction lintReachability(bad: Bad, i: number, m: ManifestSpec): void {\n const stepsByKey = new Map(m.steps.filter((s) => s.key).map((s) => [s.key as string, s]));\n const entries = m.steps.filter((s) => s.is_entry && s.key).map((s) => s.key as string);\n if (entries.length !== 1) return;\n const seen = new Set([entries[0] as string]);\n const frontier = [entries[0] as string];\n while (frontier.length) {\n const step = stepsByKey.get(frontier.pop() as string);\n for (const nk of step?.next_step_keys ?? []) {\n if (stepsByKey.has(nk) && !seen.has(nk)) {\n seen.add(nk);\n frontier.push(nk);\n }\n }\n }\n m.steps.forEach((s, j) => {\n if (s.key && !seen.has(s.key)) {\n bad(\n `manifests[${i}].steps[${j}]`,\n `step '${s.key}' is unreachable from the entry step.`,\n \"warning\",\n \"unreachable-step\",\n );\n }\n });\n}\n\nfunction lintFormulaKeys(bad: Bad, i: number, m: ManifestSpec): void {\n const counts = payloadKeyCounts(m);\n for (const [key, n] of counts) {\n if (n !== 1) continue;\n const others = [...counts.keys()].filter((k) => k !== key);\n const match = didYouMean(key, others);\n // tighter cutoff than the default did-you-mean: a real typo is very close.\n if (match && similarityCloseEnough(key, match)) {\n bad(\n `manifests[${i}]`,\n `payload key '${key}' is used once — did you mean '${match}'?`,\n \"warning\",\n \"payload-typo\",\n );\n }\n }\n}\n\nfunction similarityCloseEnough(a: string, b: string): boolean {\n // approximate difflib cutoff 0.85 used by the fastmcp payload-typo lint\n const maxLen = Math.max(a.length, b.length) || 1;\n let same = 0;\n const bl = [...b];\n for (const ch of a) {\n const idx = bl.indexOf(ch);\n if (idx !== -1) {\n same++;\n bl.splice(idx, 1);\n }\n }\n return (\n (2 * same) / (a.length + b.length) >= 0.85 && a !== b && Math.abs(a.length - b.length) <= maxLen\n );\n}\n\nfunction lintPhantomStats(bad: Bad, spec: Spec): void {\n const written = new Set<string>();\n for (const m of spec.manifests)\n for (const s of m.steps)\n for (const cs of s.condition_sets)\n for (const oc of cs.outcomes) if (oc.stat_key) written.add(oc.stat_key);\n const ranked = new Set(spec.leaderboards.map((lb) => lb.stat_key));\n const rewarded = new Set(\n spec.segments.map((s) => s.reward.stat_key).filter((k): k is string => !!k),\n );\n const payloadKeys = new Set<string>();\n for (const m of spec.manifests) for (const k of payloadKeyCounts(m).keys()) payloadKeys.add(k);\n const referenced = new Set([...written, ...ranked, ...rewarded]);\n spec.stats.forEach((st, i) => {\n if (!referenced.has(st.key) && payloadKeys.has(st.key)) {\n bad(\n `stats[${i}]`,\n `'${st.key}' looks like a runtime payload key, not a stat — no outcome writes it and no leaderboard ranks it. Payload keys are read from the record payload and need no definition.`,\n \"warning\",\n \"phantom-stat\",\n );\n }\n });\n}\n\nfunction lintOrphanCurrencies(bad: Bad, spec: Spec): void {\n const sources = new Set<string>();\n const sinks = new Set<string>();\n for (const m of spec.manifests) {\n for (const req of m.entry_requirements) if (req.currency_key) sinks.add(req.currency_key);\n for (const s of m.steps)\n for (const cs of s.condition_sets)\n for (const oc of cs.outcomes)\n if (oc.reward_target === \"currency\" && oc.currency_key)\n (oc.operation === \"subtract\" ? sinks : sources).add(oc.currency_key);\n }\n for (const seg of spec.segments)\n if (seg.reward.reward_type === \"currency\" && seg.reward.currency_key)\n sources.add(seg.reward.currency_key);\n for (const w of spec.wheels)\n if (w.allow_paid_spins && w.paid_spin_currency_key) sinks.add(w.paid_spin_currency_key);\n spec.currencies.forEach((c, i) => {\n if (!sources.has(c.key))\n bad(\n `currencies[${i}]`,\n `'${c.key}' has no source — nothing awards it.`,\n \"warning\",\n \"orphan-currency\",\n );\n if (!sinks.has(c.key))\n bad(\n `currencies[${i}]`,\n `'${c.key}' has no sink — add an entry cost, a subtract outcome, or paid wheel spins.`,\n \"warning\",\n \"orphan-currency\",\n );\n });\n}\n\n// --- impact scan (blast radius) ---\n\nexport interface ImpactReport {\n target: { kind: \"currency\" | \"stat\" | \"segment\"; ref: string | number };\n exists: boolean;\n referenceCount: number;\n byKind: Record<string, number>;\n references: Array<{ kind: string; id: number | null; name: string; locus: string }>;\n breaking: boolean;\n}\n\n/** What references a live definition — the maintenance harness's \"impact-scan before you edit\". */\nexport async function impactScan(\n client: MagicweaveClient,\n orgId: number,\n projectId: number,\n kind: \"currency\" | \"stat\" | \"segment\",\n ref: string | number,\n): Promise<ImpactReport> {\n const graph = await buildReferenceGraph(client, orgId, projectId);\n const exists =\n kind === \"currency\"\n ? graph.currencyKeys().includes(String(ref))\n : kind === \"stat\"\n ? graph.statKeys().includes(String(ref))\n : graph.segmentIds().includes(Number(ref));\n\n const refs = graph.referencesTo(kind, ref);\n const byKind: Record<string, number> = {};\n for (const r of refs) byKind[r.referencingKind] = (byKind[r.referencingKind] ?? 0) + 1;\n\n return {\n target: { kind, ref },\n exists,\n referenceCount: refs.length,\n byKind,\n references: refs.map((r) => ({\n kind: r.referencingKind,\n id: r.id,\n name: r.name,\n locus: r.locus,\n })),\n breaking: refs.length > 0,\n };\n}\n"],"mappings":"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","names":["createOpenapiClient","currencies","stats","manifests","leaderboards","segments","wheels"]}
package/dist/index.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/client.ts","../src/auth.ts","../src/resources/orgs.ts","../src/resources/projects.ts","../src/resources/environments.ts","../src/resources/releases.ts","../src/resources/currencies.ts","../src/resources/stats.ts","../src/resources/manifests.ts","../src/resources/leaderboards.ts","../src/resources/segments.ts","../src/resources/wheels.ts","../src/schemas/spec.ts","../src/smart/export.ts","../src/smart/refgraph.ts","../src/smart/validate.ts","../src/index.ts"],"sourcesContent":["import createOpenapiClient, { type Client as OpenapiClient, type Middleware } from \"openapi-fetch\";\nimport type { paths } from \"./generated/schema.js\";\n\n/** Where the CLI/tests supply an access token from (keychain, env, or a fake). */\nexport interface TokenProvider {\n getToken(): string | null | Promise<string | null>;\n}\n\nexport const STAGING_API_BASE = \"https://console.staging.magicweave.xyz/api\";\nexport const PROD_API_BASE = \"https://console.magicweave.xyz/api\";\n\n/** Resolve the admin API base URL: explicit > $MW_API_BASE > staging default. */\nexport function resolveBaseUrl(explicit?: string): string {\n return explicit ?? process.env.MW_API_BASE ?? STAGING_API_BASE;\n}\n\nexport interface ClientOptions {\n baseUrl?: string;\n tokenProvider?: TokenProvider;\n /** Inject a fetch (msw/tests). Defaults to the global fetch. */\n fetch?: typeof globalThis.fetch;\n}\n\n/** Base error for every admin API failure. `status` maps to a CLI exit code. */\nexport class MagicweaveError extends Error {\n constructor(\n message: string,\n readonly status: number,\n readonly code: string,\n readonly detail?: unknown,\n ) {\n super(message);\n this.name = \"MagicweaveError\";\n }\n}\n\nexport class UnauthorizedError extends MagicweaveError {\n constructor(detail?: unknown) {\n super(\n \"Not authenticated or your session expired. Run `mw login`.\",\n 401,\n \"unauthorized\",\n detail,\n );\n this.name = \"UnauthorizedError\";\n }\n}\n\nexport class NotFoundError extends MagicweaveError {\n constructor(detail?: unknown) {\n super(\"Not found.\", 404, \"not_found\", detail);\n this.name = \"NotFoundError\";\n }\n}\n\nexport class ValidationError extends MagicweaveError {\n constructor(detail?: unknown) {\n super(formatValidationDetail(detail), 422, \"validation_error\", detail);\n this.name = \"ValidationError\";\n }\n}\n\nfunction formatValidationDetail(detail: unknown): string {\n // FastAPI shape: { detail: [{ loc: [...], msg: string, type: string }, ...] }\n const list = (detail as { detail?: Array<{ loc?: unknown[]; msg?: string }> })?.detail;\n if (Array.isArray(list) && list.length) {\n return list\n .map((e) => {\n const field = Array.isArray(e.loc) ? e.loc.filter((p) => p !== \"body\").join(\".\") : \"\";\n return field ? `${field}: ${e.msg}` : (e.msg ?? \"invalid\");\n })\n .join(\"; \");\n }\n if (typeof (detail as { detail?: string })?.detail === \"string\") {\n return (detail as { detail: string }).detail;\n }\n return \"Request validation failed.\";\n}\n\nfunction errorFromResponse(response: Response, body: unknown): MagicweaveError {\n switch (response.status) {\n case 401:\n return new UnauthorizedError(body);\n case 404:\n return new NotFoundError(body);\n case 422:\n return new ValidationError(body);\n default: {\n const msg =\n (body as { detail?: string })?.detail ??\n `Request failed: ${response.status} ${response.statusText}`;\n return new MagicweaveError(\n typeof msg === \"string\" ? msg : `Request failed: ${response.status}`,\n response.status,\n \"http_error\",\n body,\n );\n }\n }\n}\n\n/** The raw openapi-fetch client, fully typed against the admin OpenAPI paths. */\nexport type Raw = OpenapiClient<paths>;\n\ntype FetchResult<T> = { data?: T; error?: unknown; response: Response };\n\n/** Await an openapi-fetch call, returning `data` on success or throwing a typed error. */\nexport async function unwrap<T>(promise: Promise<FetchResult<T>>): Promise<T> {\n const { data, error, response } = await promise;\n if (response.ok) return data as T;\n throw errorFromResponse(response, error ?? data);\n}\n\n/**\n * The Magicweave admin SDK client. Wraps a typed openapi-fetch client and\n * injects the bearer token from an (optional) TokenProvider on every request.\n */\nexport class MagicweaveClient {\n readonly raw: Raw;\n readonly baseUrl: string;\n\n constructor(opts: ClientOptions = {}) {\n this.baseUrl = resolveBaseUrl(opts.baseUrl);\n const tokenProvider = opts.tokenProvider;\n\n const auth: Middleware = {\n async onRequest({ request }) {\n const token = tokenProvider ? await tokenProvider.getToken() : null;\n if (token) request.headers.set(\"Authorization\", `Bearer ${token}`);\n return request;\n },\n };\n\n this.raw = createOpenapiClient<paths>({\n baseUrl: this.baseUrl,\n fetch: opts.fetch,\n });\n this.raw.use(auth);\n }\n}\n\nexport function createClient(opts: ClientOptions = {}): MagicweaveClient {\n return new MagicweaveClient(opts);\n}\n","import { MagicweaveError, type TokenProvider } from \"./client.js\";\n\nexport interface AuthTokens {\n access_token: string;\n refresh_token: string;\n}\n\ninterface OtpFetch {\n fetch?: typeof globalThis.fetch;\n}\n\n/** Step 1 of login: ask the backend to email a one-time code. */\nexport async function requestLoginOtp(\n baseUrl: string,\n email: string,\n opts: OtpFetch = {},\n): Promise<void> {\n const f = opts.fetch ?? globalThis.fetch;\n const res = await f(`${baseUrl}/auth/login-email/`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ email }),\n });\n if (!res.ok) {\n throw new MagicweaveError(\n `Could not send a login code to ${email} (HTTP ${res.status}).`,\n res.status,\n \"otp_request_failed\",\n );\n }\n}\n\n/** Step 2 of login: exchange the emailed code for access + refresh tokens. */\nexport async function verifyLoginOtp(\n baseUrl: string,\n email: string,\n otp: string,\n opts: OtpFetch = {},\n): Promise<AuthTokens> {\n const f = opts.fetch ?? globalThis.fetch;\n const res = await f(`${baseUrl}/auth/verify-email-otp/`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ email, otp }),\n });\n const body = (await res.json().catch(() => ({}))) as Partial<AuthTokens> & { detail?: string };\n if (!res.ok || !body.access_token || !body.refresh_token) {\n throw new MagicweaveError(\n body.detail ?? \"That code was not accepted. Check it and try again.\",\n res.status,\n \"otp_verify_failed\",\n body,\n );\n }\n return { access_token: body.access_token, refresh_token: body.refresh_token };\n}\n\nexport interface JwtPayload {\n user_id?: number;\n email?: string;\n exp?: number;\n [key: string]: unknown;\n}\n\n/** Decode a JWT payload without verifying the signature (server owns verification). */\nexport function decodeJwt(token: string): JwtPayload | null {\n const part = token.split(\".\")[1];\n if (!part) return null;\n try {\n return JSON.parse(Buffer.from(part, \"base64url\").toString(\"utf8\")) as JwtPayload;\n } catch {\n return null;\n }\n}\n\n/** True if the token is missing an exp, or expires within `skewSeconds`. */\nexport function isExpired(token: string, skewSeconds = 30): boolean {\n const exp = decodeJwt(token)?.exp;\n if (!exp) return true;\n return exp * 1000 <= Date.now() + skewSeconds * 1000;\n}\n\n/** A fixed token, e.g. one just read from the keychain. */\nexport class StaticTokenProvider implements TokenProvider {\n constructor(private readonly token: string | null) {}\n getToken(): string | null {\n return this.token;\n }\n}\n\n/** Reads $MW_ACCESS_TOKEN — the non-interactive/CI path. */\nexport class EnvTokenProvider implements TokenProvider {\n getToken(): string | null {\n return process.env.MW_ACCESS_TOKEN ?? null;\n }\n}\n","import type { MagicweaveClient } from \"../client.js\";\nimport { unwrap } from \"../client.js\";\nimport type { components } from \"../generated/schema.js\";\n\ntype S = components[\"schemas\"];\nexport type OrganizationListResponse = S[\"OrganizationListResponse\"];\nexport type OrganizationCreateResponse = S[\"OrganizationCreateResponse\"];\nexport type OrganizationDeleteResponse = S[\"OrganizationDeleteResponse\"];\n\n/** Organizations you belong to. */\nexport function orgs(client: MagicweaveClient) {\n return {\n list: () => unwrap(client.raw.GET(\"/org/\")),\n create: (name: string) => unwrap(client.raw.POST(\"/org/\", { body: { name } })),\n remove: (orgId: number) =>\n unwrap(client.raw.DELETE(\"/org/{org_id}/\", { params: { path: { org_id: orgId } } })),\n };\n}\n","import type { MagicweaveClient } from \"../client.js\";\nimport { unwrap } from \"../client.js\";\nimport type { components } from \"../generated/schema.js\";\n\ntype S = components[\"schemas\"];\nexport type ProjectListResponse = S[\"ProjectListResponse\"];\nexport type ProjectCreateResponse = S[\"ProjectCreateResponse\"];\nexport type ProjectDeleteResponse = S[\"ProjectDeleteResponse\"];\nexport type ProjectResponse = S[\"ProjectResponse\"];\n\n/** Projects within an organization. */\nexport function projects(client: MagicweaveClient) {\n return {\n list: (orgId: number) =>\n unwrap(client.raw.GET(\"/project/{org_id}\", { params: { path: { org_id: orgId } } })),\n create: (orgId: number, name: string) =>\n unwrap(\n client.raw.POST(\"/project/{org_id}\", {\n params: { path: { org_id: orgId } },\n body: { name },\n }),\n ),\n remove: (orgId: number, projectId: number) =>\n unwrap(\n client.raw.DELETE(\"/project/{org_id}/{project_id}/\", {\n params: { path: { org_id: orgId, project_id: projectId } },\n }),\n ),\n enableNetwork: (orgId: number, projectId: number) =>\n unwrap(\n client.raw.POST(\"/project/{org_id}/{project_id}/enable-network\", {\n params: { path: { org_id: orgId, project_id: projectId } },\n }),\n ),\n };\n}\n","import type { MagicweaveClient } from \"../client.js\";\nimport { unwrap } from \"../client.js\";\nimport type { components } from \"../generated/schema.js\";\n\ntype S = components[\"schemas\"];\nexport type EnvironmentListResponse = S[\"EnvironmentListResponse\"];\n/** Creating an env (or rotating a secret) returns the fresh client credentials. */\nexport type EnvironmentCreateResponse = S[\"EnvironmentCreateResponse\"];\nexport type EnvironmentDeleteResponse = S[\"EnvironmentDeleteResponse\"];\n\n/** Environments (testing/production) and their client credentials. */\nexport function environments(client: MagicweaveClient) {\n const base = (orgId: number, projectId: number) => ({\n path: { org_id: orgId, project_id: projectId },\n });\n const withEnv = (orgId: number, projectId: number, environmentId: number) => ({\n path: { org_id: orgId, project_id: projectId, environment_id: environmentId },\n });\n\n return {\n list: (orgId: number, projectId: number) =>\n unwrap(\n client.raw.GET(\"/project/{org_id}/{project_id}/environments/\", {\n params: base(orgId, projectId),\n }),\n ),\n create: (orgId: number, projectId: number, name: string) =>\n unwrap(\n client.raw.POST(\"/project/{org_id}/{project_id}/environments/\", {\n params: base(orgId, projectId),\n body: { name },\n }),\n ),\n remove: (orgId: number, projectId: number, environmentId: number) =>\n unwrap(\n client.raw.DELETE(\"/project/{org_id}/{project_id}/environments/{environment_id}\", {\n params: withEnv(orgId, projectId, environmentId),\n }),\n ),\n rotateSecret: (orgId: number, projectId: number, environmentId: number) =>\n unwrap(\n client.raw.POST(\n \"/project/{org_id}/{project_id}/environments/{environment_id}/rotate-secret\",\n {\n params: withEnv(orgId, projectId, environmentId),\n },\n ),\n ),\n rotatePreviewSecret: (orgId: number, projectId: number, environmentId: number) =>\n unwrap(\n client.raw.POST(\n \"/project/{org_id}/{project_id}/environments/{environment_id}/rotate-preview-secret\",\n { params: withEnv(orgId, projectId, environmentId) },\n ),\n ),\n };\n}\n","import type { MagicweaveClient } from \"../client.js\";\nimport { unwrap } from \"../client.js\";\nimport type { components } from \"../generated/schema.js\";\n\ntype S = components[\"schemas\"];\nexport type ReleaseResponse = S[\"ReleaseResponse\"];\nexport type ReleaseListResponse = S[\"ReleaseListResponse\"];\nexport type ReleaseDeleteResponse = S[\"ReleaseDeleteResponse\"];\nexport type CreateReleaseRequest = S[\"CreateReleaseRequest\"];\nexport type ReleaseUpdateRequest = S[\"ReleaseUpdateRequest\"];\nexport type ReleaseItemPushRequest = S[\"ReleaseItemPushRequest\"];\n\n/**\n * Release lifecycle: draft → add items → lock → activate, plus promote\n * (copy/move) across environments and deactivate/delete.\n *\n * Note: list/create are environment-scoped; the mutating lifecycle ops are\n * project+release-scoped. The admin API exposes no GET-single-release — read a\n * release from `list`.\n */\nexport function releases(client: MagicweaveClient) {\n const rel = (orgId: number, projectId: number, releaseId: number) => ({\n path: { org_id: orgId, project_id: projectId, release_id: releaseId },\n });\n\n return {\n list: (orgId: number, projectId: number, environmentId: number) =>\n unwrap(\n client.raw.GET(\"/project/{org_id}/{project_id}/environments/{environment_id}/releases/\", {\n params: { path: { org_id: orgId, project_id: projectId, environment_id: environmentId } },\n }),\n ),\n create: (\n orgId: number,\n projectId: number,\n environmentId: number,\n body: CreateReleaseRequest = { release_notes: \"\" },\n ) =>\n unwrap(\n client.raw.POST(\"/project/{org_id}/{project_id}/environments/{environment_id}/releases/\", {\n params: { path: { org_id: orgId, project_id: projectId, environment_id: environmentId } },\n body,\n }),\n ),\n update: (orgId: number, projectId: number, releaseId: number, body: ReleaseUpdateRequest) =>\n unwrap(\n client.raw.PATCH(\"/project/{org_id}/{project_id}/releases/{release_id}\", {\n params: rel(orgId, projectId, releaseId),\n body,\n }),\n ),\n remove: (orgId: number, projectId: number, releaseId: number) =>\n unwrap(\n client.raw.DELETE(\"/project/{org_id}/{project_id}/releases/{release_id}\", {\n params: rel(orgId, projectId, releaseId),\n }),\n ),\n pushItem: (orgId: number, projectId: number, releaseId: number, body: ReleaseItemPushRequest) =>\n unwrap(\n client.raw.POST(\"/project/{org_id}/{project_id}/releases/{release_id}/items/\", {\n params: rel(orgId, projectId, releaseId),\n body,\n }),\n ),\n removeItem: (orgId: number, projectId: number, releaseId: number, itemId: number) =>\n unwrap(\n client.raw.DELETE(\"/project/{org_id}/{project_id}/releases/{release_id}/items/{item_id}\", {\n params: {\n path: { org_id: orgId, project_id: projectId, release_id: releaseId, item_id: itemId },\n },\n }),\n ),\n lock: (orgId: number, projectId: number, releaseId: number) =>\n unwrap(\n client.raw.POST(\"/project/{org_id}/{project_id}/releases/{release_id}/lock\", {\n params: rel(orgId, projectId, releaseId),\n }),\n ),\n activate: (orgId: number, projectId: number, releaseId: number) =>\n unwrap(\n client.raw.POST(\"/project/{org_id}/{project_id}/releases/{release_id}/activate\", {\n params: rel(orgId, projectId, releaseId),\n }),\n ),\n deactivate: (orgId: number, projectId: number, releaseId: number) =>\n unwrap(\n client.raw.POST(\"/project/{org_id}/{project_id}/releases/{release_id}/deactivate\", {\n params: rel(orgId, projectId, releaseId),\n }),\n ),\n move: (\n orgId: number,\n projectId: number,\n releaseId: number,\n targetEnvironmentId: number,\n note = \"\",\n ) =>\n unwrap(\n client.raw.POST(\"/project/{org_id}/{project_id}/releases/{release_id}/move\", {\n params: rel(orgId, projectId, releaseId),\n body: { target_environment_id: targetEnvironmentId, note },\n }),\n ),\n copy: (\n orgId: number,\n projectId: number,\n releaseId: number,\n targetEnvironmentId: number,\n note = \"\",\n ) =>\n unwrap(\n client.raw.POST(\"/project/{org_id}/{project_id}/releases/{release_id}/copy\", {\n params: rel(orgId, projectId, releaseId),\n body: { target_environment_id: targetEnvironmentId, note },\n }),\n ),\n };\n}\n","import type { MagicweaveClient } from \"../client.js\";\nimport { unwrap } from \"../client.js\";\nimport type { components } from \"../generated/schema.js\";\n\ntype S = components[\"schemas\"];\nexport type CurrencyDefinitionListResponse = S[\"CurrencyDefinitionListResponse\"];\nexport type CurrencyDefinitionResponse = S[\"CurrencyDefinitionResponse\"];\nexport type CurrencyDefinitionCreateRequest = S[\"CurrencyDefinitionCreateRequest\"];\n/** Update never changes the immutable `key` — the backend forbids it. */\nexport type CurrencyDefinitionUpdateRequest = S[\"CurrencyDefinitionUpdateRequest\"];\nexport type CurrencyOverviewListResponse = S[\"CurrencyOverviewListResponse\"];\n\n/** Currency definitions for a project. */\nexport function currencies(client: MagicweaveClient) {\n const proj = (orgId: number, projectId: number) => ({\n path: { org_id: orgId, project_id: projectId },\n });\n const one = (orgId: number, projectId: number, definitionId: number) => ({\n path: { org_id: orgId, project_id: projectId, definition_id: definitionId },\n });\n\n return {\n list: (orgId: number, projectId: number) =>\n unwrap(\n client.raw.GET(\"/currency-definitions/{org_id}/{project_id}/\", {\n params: proj(orgId, projectId),\n }),\n ),\n overview: (orgId: number, projectId: number) =>\n unwrap(\n client.raw.GET(\"/currency-definitions/{org_id}/{project_id}/overview/\", {\n params: proj(orgId, projectId),\n }),\n ),\n get: (orgId: number, projectId: number, definitionId: number) =>\n unwrap(\n client.raw.GET(\"/currency-definitions/{org_id}/{project_id}/{definition_id}/\", {\n params: one(orgId, projectId, definitionId),\n }),\n ),\n create: (orgId: number, projectId: number, body: CurrencyDefinitionCreateRequest) =>\n unwrap(\n client.raw.POST(\"/currency-definitions/{org_id}/{project_id}/\", {\n params: proj(orgId, projectId),\n body,\n }),\n ),\n update: (\n orgId: number,\n projectId: number,\n definitionId: number,\n body: CurrencyDefinitionUpdateRequest,\n ) =>\n unwrap(\n client.raw.PATCH(\"/currency-definitions/{org_id}/{project_id}/{definition_id}/\", {\n params: one(orgId, projectId, definitionId),\n body,\n }),\n ),\n remove: (orgId: number, projectId: number, definitionId: number) =>\n unwrap(\n client.raw.DELETE(\"/currency-definitions/{org_id}/{project_id}/{definition_id}/\", {\n params: one(orgId, projectId, definitionId),\n }),\n ),\n };\n}\n","import type { MagicweaveClient } from \"../client.js\";\nimport { unwrap } from \"../client.js\";\nimport type { components } from \"../generated/schema.js\";\n\ntype S = components[\"schemas\"];\nexport type StatDefinitionListResponse = S[\"StatDefinitionListResponse\"];\nexport type StatDefinitionResponse = S[\"StatDefinitionResponse\"];\nexport type StatDefinitionCreateRequest = S[\"StatDefinitionCreateRequest\"];\n/** Update never changes the immutable `key`. */\nexport type StatDefinitionUpdateRequest = S[\"StatDefinitionUpdateRequest\"];\nexport type StatOverviewListResponse = S[\"StatOverviewListResponse\"];\n\n/** Stat definitions for a project. */\nexport function stats(client: MagicweaveClient) {\n const proj = (orgId: number, projectId: number) => ({\n path: { org_id: orgId, project_id: projectId },\n });\n const one = (orgId: number, projectId: number, definitionId: number) => ({\n path: { org_id: orgId, project_id: projectId, definition_id: definitionId },\n });\n\n return {\n list: (orgId: number, projectId: number) =>\n unwrap(\n client.raw.GET(\"/stat-definitions/{org_id}/{project_id}/\", {\n params: proj(orgId, projectId),\n }),\n ),\n overview: (orgId: number, projectId: number) =>\n unwrap(\n client.raw.GET(\"/stat-definitions/{org_id}/{project_id}/overview/\", {\n params: proj(orgId, projectId),\n }),\n ),\n get: (orgId: number, projectId: number, definitionId: number) =>\n unwrap(\n client.raw.GET(\"/stat-definitions/{org_id}/{project_id}/{definition_id}/\", {\n params: one(orgId, projectId, definitionId),\n }),\n ),\n create: (orgId: number, projectId: number, body: StatDefinitionCreateRequest) =>\n unwrap(\n client.raw.POST(\"/stat-definitions/{org_id}/{project_id}/\", {\n params: proj(orgId, projectId),\n body,\n }),\n ),\n update: (\n orgId: number,\n projectId: number,\n definitionId: number,\n body: StatDefinitionUpdateRequest,\n ) =>\n unwrap(\n client.raw.PATCH(\"/stat-definitions/{org_id}/{project_id}/{definition_id}/\", {\n params: one(orgId, projectId, definitionId),\n body,\n }),\n ),\n remove: (orgId: number, projectId: number, definitionId: number) =>\n unwrap(\n client.raw.DELETE(\"/stat-definitions/{org_id}/{project_id}/{definition_id}/\", {\n params: one(orgId, projectId, definitionId),\n }),\n ),\n };\n}\n","import type { MagicweaveClient } from \"../client.js\";\nimport { unwrap } from \"../client.js\";\nimport type { components } from \"../generated/schema.js\";\n\ntype S = components[\"schemas\"];\nexport type GameManifestListResponse = S[\"GameManifestListResponse\"];\nexport type GameManifestResponse = S[\"GameManifestResponse\"];\nexport type GameManifestCreateRequest = S[\"GameManifestCreateRequest\"];\nexport type GameManifestUpdateRequest = S[\"GameManifestUpdateRequest\"];\nexport type GameManifestOverviewListResponse = S[\"GameManifestOverviewListResponse\"];\n\n/** Game manifests (the game-loop step graph) for a project. */\nexport function manifests(client: MagicweaveClient) {\n const proj = (orgId: number, projectId: number) => ({\n path: { org_id: orgId, project_id: projectId },\n });\n const one = (orgId: number, projectId: number, manifestId: number) => ({\n path: { org_id: orgId, project_id: projectId, manifest_id: manifestId },\n });\n\n return {\n list: (orgId: number, projectId: number) =>\n unwrap(\n client.raw.GET(\"/game-manifests/{org_id}/{project_id}/\", {\n params: proj(orgId, projectId),\n }),\n ),\n overview: (orgId: number, projectId: number) =>\n unwrap(\n client.raw.GET(\"/game-manifests/{org_id}/{project_id}/overview/\", {\n params: proj(orgId, projectId),\n }),\n ),\n get: (orgId: number, projectId: number, manifestId: number) =>\n unwrap(\n client.raw.GET(\"/game-manifests/{org_id}/{project_id}/{manifest_id}/\", {\n params: one(orgId, projectId, manifestId),\n }),\n ),\n create: (orgId: number, projectId: number, body: GameManifestCreateRequest) =>\n unwrap(\n client.raw.POST(\"/game-manifests/{org_id}/{project_id}/\", {\n params: proj(orgId, projectId),\n body,\n }),\n ),\n update: (\n orgId: number,\n projectId: number,\n manifestId: number,\n body: GameManifestUpdateRequest,\n ) =>\n unwrap(\n client.raw.PATCH(\"/game-manifests/{org_id}/{project_id}/{manifest_id}/\", {\n params: one(orgId, projectId, manifestId),\n body,\n }),\n ),\n remove: (orgId: number, projectId: number, manifestId: number) =>\n unwrap(\n client.raw.DELETE(\"/game-manifests/{org_id}/{project_id}/{manifest_id}/\", {\n params: one(orgId, projectId, manifestId),\n }),\n ),\n };\n}\n","import type { MagicweaveClient } from \"../client.js\";\nimport { unwrap } from \"../client.js\";\nimport type { components } from \"../generated/schema.js\";\n\ntype S = components[\"schemas\"];\nexport type LeaderboardListResponse = S[\"LeaderboardListResponse\"];\nexport type LeaderboardResponse = S[\"LeaderboardResponse\"];\nexport type LeaderboardCreateRequest = S[\"LeaderboardCreateRequest\"];\nexport type LeaderboardUpdateRequest = S[\"LeaderboardUpdateRequest\"];\nexport type LeaderboardOverviewListResponse = S[\"LeaderboardOverviewListResponse\"];\n\n/** Leaderboards for a project (incl. the irreversible process-reset). */\nexport function leaderboards(client: MagicweaveClient) {\n const proj = (orgId: number, projectId: number) => ({\n path: { org_id: orgId, project_id: projectId },\n });\n const one = (orgId: number, projectId: number, leaderboardId: number) => ({\n path: { org_id: orgId, project_id: projectId, leaderboard_id: leaderboardId },\n });\n\n return {\n list: (orgId: number, projectId: number) =>\n unwrap(\n client.raw.GET(\"/leaderboards/{org_id}/{project_id}/\", { params: proj(orgId, projectId) }),\n ),\n overview: (orgId: number, projectId: number) =>\n unwrap(\n client.raw.GET(\"/leaderboards/{org_id}/{project_id}/overview/\", {\n params: proj(orgId, projectId),\n }),\n ),\n get: (orgId: number, projectId: number, leaderboardId: number) =>\n unwrap(\n client.raw.GET(\"/leaderboards/{org_id}/{project_id}/{leaderboard_id}/\", {\n params: one(orgId, projectId, leaderboardId),\n }),\n ),\n create: (orgId: number, projectId: number, body: LeaderboardCreateRequest) =>\n unwrap(\n client.raw.POST(\"/leaderboards/{org_id}/{project_id}/\", {\n params: proj(orgId, projectId),\n body,\n }),\n ),\n update: (\n orgId: number,\n projectId: number,\n leaderboardId: number,\n body: LeaderboardUpdateRequest,\n ) =>\n unwrap(\n client.raw.PATCH(\"/leaderboards/{org_id}/{project_id}/{leaderboard_id}/\", {\n params: one(orgId, projectId, leaderboardId),\n body,\n }),\n ),\n remove: (orgId: number, projectId: number, leaderboardId: number) =>\n unwrap(\n client.raw.DELETE(\"/leaderboards/{org_id}/{project_id}/{leaderboard_id}/\", {\n params: one(orgId, projectId, leaderboardId),\n }),\n ),\n /** Irreversible: archive scores and reset the board. Confirm-gate in the CLI. */\n processReset: (orgId: number, projectId: number, leaderboardId: number) =>\n unwrap(\n client.raw.POST(\"/leaderboards/{org_id}/{project_id}/{leaderboard_id}/process-reset/\", {\n params: one(orgId, projectId, leaderboardId),\n }),\n ),\n };\n}\n","import type { MagicweaveClient } from \"../client.js\";\nimport { unwrap } from \"../client.js\";\nimport type { components } from \"../generated/schema.js\";\n\ntype S = components[\"schemas\"];\nexport type ProjectSegmentListResponse = S[\"ProjectSegmentListResponse\"];\nexport type ProjectSegmentResponse = S[\"ProjectSegmentResponse\"];\nexport type ProjectSegmentCreateRequest = S[\"ProjectSegmentCreateRequest\"];\nexport type ProjectSegmentUpdateRequest = S[\"ProjectSegmentUpdateRequest\"];\nexport type SegmentCatalogResponse = S[\"SegmentCatalogResponse\"];\n\n/** Reward segments — the building blocks referenced by spin wheels. */\nexport function segments(client: MagicweaveClient) {\n const proj = (orgId: number, projectId: number) => ({\n path: { org_id: orgId, project_id: projectId },\n });\n const one = (orgId: number, projectId: number, segmentId: number) => ({\n path: { org_id: orgId, project_id: projectId, segment_id: segmentId },\n });\n\n return {\n list: (orgId: number, projectId: number) =>\n unwrap(\n client.raw.GET(\"/spin-wheel/{org_id}/{project_id}/segments/\", {\n params: proj(orgId, projectId),\n }),\n ),\n catalog: (orgId: number, projectId: number) =>\n unwrap(\n client.raw.GET(\"/spin-wheel/{org_id}/{project_id}/segments/catalog/\", {\n params: proj(orgId, projectId),\n }),\n ),\n get: (orgId: number, projectId: number, segmentId: number) =>\n unwrap(\n client.raw.GET(\"/spin-wheel/{org_id}/{project_id}/segments/{segment_id}/\", {\n params: one(orgId, projectId, segmentId),\n }),\n ),\n create: (orgId: number, projectId: number, body: ProjectSegmentCreateRequest) =>\n unwrap(\n client.raw.POST(\"/spin-wheel/{org_id}/{project_id}/segments/\", {\n params: proj(orgId, projectId),\n body,\n }),\n ),\n update: (\n orgId: number,\n projectId: number,\n segmentId: number,\n body: ProjectSegmentUpdateRequest,\n ) =>\n unwrap(\n client.raw.PATCH(\"/spin-wheel/{org_id}/{project_id}/segments/{segment_id}/\", {\n params: one(orgId, projectId, segmentId),\n body,\n }),\n ),\n remove: (orgId: number, projectId: number, segmentId: number) =>\n unwrap(\n client.raw.DELETE(\"/spin-wheel/{org_id}/{project_id}/segments/{segment_id}/\", {\n params: one(orgId, projectId, segmentId),\n }),\n ),\n };\n}\n","import type { MagicweaveClient } from \"../client.js\";\nimport { unwrap } from \"../client.js\";\nimport type { components } from \"../generated/schema.js\";\n\ntype S = components[\"schemas\"];\nexport type SpinWheelProjectListResponse = S[\"SpinWheelProjectListResponse\"];\nexport type WheelConfigCreateRequest = S[\"WheelConfigCreateRequest\"];\nexport type WheelConfigCreateResponse = S[\"WheelConfigCreateResponse\"];\nexport type WheelConfigPatchRequest = S[\"WheelConfigPatchRequest\"];\nexport type WheelOverviewListResponse = S[\"WheelOverviewListResponse\"];\n\n/** Spin-wheel configurations for a project. */\nexport function wheels(client: MagicweaveClient) {\n const proj = (orgId: number, projectId: number) => ({\n path: { org_id: orgId, project_id: projectId },\n });\n const one = (orgId: number, projectId: number, wheelConfigId: number) => ({\n path: { org_id: orgId, project_id: projectId, wheel_config_id: wheelConfigId },\n });\n\n return {\n list: (orgId: number, projectId: number) =>\n unwrap(\n client.raw.GET(\"/spin-wheel/{org_id}/{project_id}/wheels/\", {\n params: proj(orgId, projectId),\n }),\n ),\n overview: (orgId: number, projectId: number) =>\n unwrap(\n client.raw.GET(\"/spin-wheel/{org_id}/{project_id}/wheels/overview/\", {\n params: proj(orgId, projectId),\n }),\n ),\n create: (orgId: number, projectId: number, body: WheelConfigCreateRequest) =>\n unwrap(\n client.raw.POST(\"/spin-wheel/{org_id}/{project_id}/wheels/\", {\n params: proj(orgId, projectId),\n body,\n }),\n ),\n update: (\n orgId: number,\n projectId: number,\n wheelConfigId: number,\n body: WheelConfigPatchRequest,\n ) =>\n unwrap(\n client.raw.PATCH(\"/spin-wheel/{org_id}/{project_id}/wheels/{wheel_config_id}/\", {\n params: one(orgId, projectId, wheelConfigId),\n body,\n }),\n ),\n remove: (orgId: number, projectId: number, wheelConfigId: number) =>\n unwrap(\n client.raw.DELETE(\"/spin-wheel/{org_id}/{project_id}/wheels/{wheel_config_id}/\", {\n params: one(orgId, projectId, wheelConfigId),\n }),\n ),\n };\n}\n","/**\n * The EconomySpec — a whole game's game-layer definitions in one object.\n *\n * Ported faithfully from magicweave-fastmcp/tools/spec.py. This is the contract a\n * human/agent authors up front; `validateSpec` (smart/validate.ts) checks it for\n * every violation at once — including cross-references — before any create call.\n *\n * As in the Python source, manifest step-graph internals are intentionally lax\n * (every inner field optional): the deterministic validator owns the friendly\n * semantic messages; these schemas only enforce that an outcome/condition IS an\n * object, not a scalar.\n */\nimport { z } from \"zod\";\n\nexport const CurrencySpec = z.object({\n key: z.string(),\n name: z.string(),\n symbol: z.string().default(\"\"),\n initial_balance: z.number().int().default(0),\n max_balance: z.number().int().nullable().default(null),\n usable_as_reward: z.boolean().default(true),\n usable_in_conditions: z.boolean().default(true),\n});\n\nexport const StatSpec = z.object({\n key: z.string(),\n name: z.string(),\n stat_type: z.string(), // integer | float | boolean\n default_value: z.union([z.number(), z.boolean()]),\n min_value: z.number().nullable().default(null),\n max_value: z.number().nullable().default(null),\n usable_in_conditions: z.boolean().default(true),\n usable_as_reward: z.boolean().default(true),\n});\n\nexport const Formula = z.object({\n formula: z.string().nullish(),\n max: z.number().nullish(),\n});\n\nexport const Outcome = z.object({\n reward_type: z.string().nullish(), // fixed | variable\n reward_target: z.string().nullish(), // currency | stat | gem\n currency_key: z.string().nullish(),\n stat_key: z.string().nullish(),\n operation: z.string().nullish(), // add | subtract | set | multiply\n value: z.number().nullish(),\n formula: Formula.nullish(),\n});\n\nexport const Condition = z.object({\n payload_key: z.string().nullish(),\n operator: z.string().nullish(), // eq | neq | gt | gte | lt | lte\n expected_value: z.union([z.number(), z.boolean(), z.string()]).nullish(),\n});\n\nexport const ConditionSet = z.object({\n conditions: z.array(Condition).default([]),\n outcomes: z.array(Outcome).default([]),\n});\n\nexport const Step = z.object({\n key: z.string().nullish(), // optional so the validator, not Zod, reports \"missing key\"\n name: z.string().default(\"\"),\n is_entry: z.boolean().default(false),\n is_terminal: z.boolean().default(false),\n next_step_keys: z.array(z.string()).default([]),\n condition_sets: z.array(ConditionSet).default([]),\n});\n\nexport const EntryRequirement = z.object({\n requirement_type: z.string().nullish(), // entry_cost | eligibility\n value_source: z.string().nullish(), // currency | stat\n currency_key: z.string().nullish(),\n stat_key: z.string().nullish(),\n operator: z.string().nullish(), // gte | lte | eq (eligibility)\n threshold_value: z.union([z.number(), z.boolean()]).nullish(),\n cost_amount: z.number().int().nullish(), // REQUIRED by the admin API for entry_cost\n});\n\nexport const ManifestSpec = z.object({\n slug: z.string(),\n name: z.string(),\n entry_requirements: z.array(EntryRequirement).default([]),\n steps: z.array(Step),\n});\n\nexport const LeaderboardSpec = z.object({\n slug: z.string(),\n name: z.string(),\n stat_key: z.string(), // authored by key; resolved to stat_id at create time\n sort_order: z.string().default(\"desc\"),\n leaderboard_type: z.string().default(\"relative\"),\n reset_type: z.string().nullable().default(null),\n soft_reset_percentage: z.number().nullish(),\n});\n\nexport const Reward = z.object({\n reward_type: z.string().nullish(), // currency | stat | gem\n currency_key: z.string().nullish(),\n stat_key: z.string().nullish(),\n amount: z.number().int().nullish(),\n});\n\nexport const SegmentSpec = z.object({\n label: z.string(),\n reward: Reward,\n probability: z.number().int(),\n can_override: z.boolean().default(false),\n});\n\nexport const WheelSegmentLink = z.object({\n segment_ref: z.string(), // label of a segment defined in this spec\n probability_override: z.number().int().nullish(),\n});\n\nexport const WheelSpec = z.object({\n key_slug: z.string(),\n name: z.string(),\n daily_free_spins: z.number().int().default(1),\n allow_paid_spins: z.boolean().default(false),\n paid_spin_currency_key: z.string().default(\"\"),\n paid_spin_currency_amount: z.number().int().nullish(),\n segments: z.array(WheelSegmentLink).default([]),\n});\n\nexport const EconomySpec = z.object({\n currencies: z.array(CurrencySpec).default([]),\n stats: z.array(StatSpec).default([]),\n manifests: z.array(ManifestSpec).default([]),\n leaderboards: z.array(LeaderboardSpec).default([]),\n segments: z.array(SegmentSpec).default([]),\n wheels: z.array(WheelSpec).default([]),\n});\n\nexport type CurrencySpec = z.infer<typeof CurrencySpec>;\nexport type StatSpec = z.infer<typeof StatSpec>;\nexport type Outcome = z.infer<typeof Outcome>;\nexport type Condition = z.infer<typeof Condition>;\nexport type ConditionSet = z.infer<typeof ConditionSet>;\nexport type Step = z.infer<typeof Step>;\nexport type EntryRequirement = z.infer<typeof EntryRequirement>;\nexport type ManifestSpec = z.infer<typeof ManifestSpec>;\nexport type LeaderboardSpec = z.infer<typeof LeaderboardSpec>;\nexport type Reward = z.infer<typeof Reward>;\nexport type SegmentSpec = z.infer<typeof SegmentSpec>;\nexport type WheelSegmentLink = z.infer<typeof WheelSegmentLink>;\nexport type WheelSpec = z.infer<typeof WheelSpec>;\nexport type EconomySpec = z.infer<typeof EconomySpec>;\n\n/** A single problem found by the validator. `rule` is a stable machine id. */\nexport interface Violation {\n path: string;\n message: string;\n severity: \"error\" | \"warning\";\n rule?: string;\n}\n\nexport interface SpecReport {\n ok: boolean;\n violations: Violation[];\n summary: Record<string, number>;\n}\n","import type { MagicweaveClient } from \"../client.js\";\nimport { currencies } from \"../resources/currencies.js\";\nimport { leaderboards } from \"../resources/leaderboards.js\";\nimport { manifests } from \"../resources/manifests.js\";\nimport { segments } from \"../resources/segments.js\";\nimport { stats } from \"../resources/stats.js\";\nimport { wheels } from \"../resources/wheels.js\";\n\n/**\n * A point-in-time snapshot of every game-layer definition in a project — for\n * backup, diffing, or version control. Mirrors fastmcp's export_definitions:\n * fan out the list reads for all definition types and collect them under one\n * object, in dependency order (currencies/stats first).\n */\nexport interface DefinitionsSnapshot {\n org_id: number;\n project_id: number;\n currencies: Awaited<ReturnType<ReturnType<typeof currencies>[\"list\"]>>;\n stats: Awaited<ReturnType<ReturnType<typeof stats>[\"list\"]>>;\n manifests: Awaited<ReturnType<ReturnType<typeof manifests>[\"list\"]>>;\n leaderboards: Awaited<ReturnType<ReturnType<typeof leaderboards>[\"list\"]>>;\n segments: Awaited<ReturnType<ReturnType<typeof segments>[\"list\"]>>;\n wheels: Awaited<ReturnType<ReturnType<typeof wheels>[\"list\"]>>;\n}\n\nexport async function exportDefinitions(\n client: MagicweaveClient,\n orgId: number,\n projectId: number,\n): Promise<DefinitionsSnapshot> {\n const [currencyList, statList, manifestList, leaderboardList, segmentList, wheelList] =\n await Promise.all([\n currencies(client).list(orgId, projectId),\n stats(client).list(orgId, projectId),\n manifests(client).list(orgId, projectId),\n leaderboards(client).list(orgId, projectId),\n segments(client).list(orgId, projectId),\n wheels(client).list(orgId, projectId),\n ]);\n\n return {\n org_id: orgId,\n project_id: projectId,\n currencies: currencyList,\n stats: statList,\n manifests: manifestList,\n leaderboards: leaderboardList,\n segments: segmentList,\n wheels: wheelList,\n };\n}\n","/**\n * Reference graph over a project's game-layer definitions — ported from\n * magicweave-fastmcp/tools/refgraph.py.\n *\n * The admin API has no \"what references this\" endpoint, but the answer is fully\n * computable from the six list reads: manifests/segments reference currencies and\n * stats BY KEY, leaderboards reference a stat BY numeric stat_id, and wheels\n * reference project segments BY numeric segment_id. We fan out the six reads once\n * and answer inbound-reference (\"blast radius\") queries.\n */\nimport type { MagicweaveClient } from \"../client.js\";\nimport { unwrap } from \"../client.js\";\n\n// Live definitions are dynamic dict shapes here (we only read a few fields).\ntype Def = Record<string, unknown>;\n\nexport interface Reference {\n referencingKind: \"manifest\" | \"leaderboard\" | \"segment\" | \"wheel\";\n id: number | null;\n name: string;\n locus: string;\n}\n\n/** Closest candidate to a mistyped key/slug, or null (difflib-style, cutoff 0.6). */\nexport function didYouMean(needle: string, candidates: string[]): string | null {\n let best: string | null = null;\n let bestRatio = 0;\n for (const c of candidates) {\n const r = similarity(needle, c);\n if (r > bestRatio) {\n bestRatio = r;\n best = c;\n }\n }\n return bestRatio >= 0.6 ? best : null;\n}\n\nfunction similarity(a: string, b: string): number {\n // Approximates Python difflib's SequenceMatcher.ratio (2*M/T) with an LCS-based\n // ratio, which — unlike raw Levenshtein — scores transpositions (\"glod\"/\"gold\")\n // generously, matching the fastmcp did_you_mean behavior.\n if (a === b) return 1;\n if (!a.length || !b.length) return 0;\n return (2 * lcsLength(a, b)) / (a.length + b.length);\n}\n\nfunction lcsLength(a: string, b: string): number {\n const m = a.length;\n const n = b.length;\n const row = new Array<number>(n + 1).fill(0);\n for (let i = 1; i <= m; i++) {\n let prevDiag = 0;\n for (let j = 1; j <= n; j++) {\n const tmp = row[j] as number;\n row[j] =\n a[i - 1] === b[j - 1] ? prevDiag + 1 : Math.max(row[j] as number, row[j - 1] as number);\n prevDiag = tmp;\n }\n }\n return row[n] as number;\n}\n\nfunction str(v: unknown): string | undefined {\n return typeof v === \"string\" && v ? v : undefined;\n}\n\n/** Yield [targetKind, key, locus] for every definition a manifest references. */\nexport function* iterManifestRefs(\n manifest: Def,\n): Generator<[kind: \"currency\" | \"stat\", key: string, locus: string]> {\n for (const req of (manifest.entry_requirements as Def[]) ?? []) {\n if (typeof req !== \"object\" || req === null) continue;\n const ck = str(req.currency_key);\n if (ck) yield [\"currency\", ck, \"entry requirement\"];\n const sk = str(req.stat_key);\n if (sk) yield [\"stat\", sk, \"entry requirement\"];\n }\n for (const step of (manifest.steps as Def[]) ?? []) {\n if (typeof step !== \"object\" || step === null) continue;\n const skey = str(step.key) ?? \"?\";\n for (const cs of (step.condition_sets as Def[]) ?? []) {\n if (typeof cs !== \"object\" || cs === null) continue;\n for (const out of (cs.outcomes as Def[]) ?? []) {\n if (typeof out !== \"object\" || out === null) continue;\n const target = out.reward_target;\n if (target === \"currency\") {\n const ck = str(out.currency_key);\n if (ck) yield [\"currency\", ck, `outcome in step '${skey}'`];\n } else if (target === \"stat\") {\n const sk = str(out.stat_key);\n if (sk) yield [\"stat\", sk, `outcome in step '${skey}'`];\n }\n }\n }\n }\n}\n\nexport function* iterSegmentRefs(\n segment: Def,\n): Generator<[kind: \"currency\" | \"stat\", key: string, locus: string]> {\n const reward = (segment.reward as Def) ?? {};\n if (reward.reward_type === \"currency\") {\n const ck = str(reward.currency_key);\n if (ck) yield [\"currency\", ck, \"segment reward\"];\n } else if (reward.reward_type === \"stat\") {\n const sk = str(reward.stat_key);\n if (sk) yield [\"stat\", sk, \"segment reward\"];\n }\n}\n\n/** A wheel list item is { effective, wheel_config } (or already flat). */\nfunction wheelViews(wheel: Def): [effective: Def, config: Def] {\n const eff = (wheel.effective as Def) ?? {};\n const cfg = (wheel.wheel_config as Def) ?? {};\n if (Object.keys(eff).length === 0 && Object.keys(cfg).length === 0) return [wheel, wheel];\n return [eff, cfg];\n}\n\nexport class ProjectGraph {\n constructor(\n readonly currencies: Def[],\n readonly stats: Def[],\n readonly manifests: Def[],\n readonly leaderboards: Def[],\n readonly segments: Def[],\n readonly wheels: Def[],\n ) {}\n\n currencyKeys(): string[] {\n return this.currencies.map((c) => str(c.key)).filter((k): k is string => !!k);\n }\n statKeys(): string[] {\n return this.stats.map((s) => str(s.key)).filter((k): k is string => !!k);\n }\n segmentIds(): number[] {\n return this.segments.map((s) => s.id).filter((v): v is number => typeof v === \"number\");\n }\n\n private statIdForKey(key: string): number | null {\n for (const s of this.stats) if (s.key === key) return (s.id as number) ?? null;\n return null;\n }\n\n /** Inbound references (blast radius) to a currency/stat (by key) or segment (by id). */\n referencesTo(kind: \"currency\" | \"stat\" | \"segment\", ref: string | number): Reference[] {\n if (kind === \"segment\") return this.refsToSegment(Number(ref));\n return this.refsToDefinition(kind, String(ref));\n }\n\n private refsToDefinition(targetKind: \"currency\" | \"stat\", key: string): Reference[] {\n const found: Reference[] = [];\n for (const m of this.manifests) {\n for (const [tk, refKey, locus] of iterManifestRefs(m)) {\n if (tk === targetKind && refKey === key) {\n found.push({\n referencingKind: \"manifest\",\n id: (m.id as number) ?? null,\n name: str(m.slug) ?? \"?\",\n locus,\n });\n }\n }\n }\n for (const seg of this.segments) {\n for (const [tk, refKey] of iterSegmentRefs(seg)) {\n if (tk === targetKind && refKey === key) {\n found.push({\n referencingKind: \"segment\",\n id: (seg.id as number) ?? null,\n name: str(seg.label) ?? \"?\",\n locus: \"segment reward\",\n });\n }\n }\n }\n if (targetKind === \"currency\") {\n for (const w of this.wheels) {\n const [eff, cfg] = wheelViews(w);\n const paid = str(cfg.paid_spin_currency_key) ?? str(eff.paid_spin_currency_key);\n if (paid === key) {\n found.push({\n referencingKind: \"wheel\",\n id: (cfg.id as number) ?? null,\n name: str(cfg.key_slug) ?? str(eff.key_slug) ?? \"?\",\n locus: \"paid-spin currency\",\n });\n }\n }\n }\n if (targetKind === \"stat\") {\n const statId = this.statIdForKey(key);\n if (statId !== null) {\n for (const lb of this.leaderboards) {\n if (lb.stat_id === statId) {\n found.push({\n referencingKind: \"leaderboard\",\n id: (lb.id as number) ?? null,\n name: str(lb.slug) ?? \"?\",\n locus: \"ranked stat\",\n });\n }\n }\n }\n }\n return found;\n }\n\n private refsToSegment(segmentId: number): Reference[] {\n const found: Reference[] = [];\n for (const w of this.wheels) {\n const [eff, cfg] = wheelViews(w);\n const links = ((eff.segments as Def[]) ?? (cfg.segments as Def[]) ?? []) as Def[];\n if (links.some((l) => l.segment_id === segmentId)) {\n found.push({\n referencingKind: \"wheel\",\n id: (cfg.id as number) ?? null,\n name: str(cfg.key_slug) ?? str(eff.key_slug) ?? \"?\",\n locus: \"wheel segment link\",\n });\n }\n }\n return found;\n }\n}\n\n/** Fan out the six list reads and build the graph. */\nexport async function buildReferenceGraph(\n client: MagicweaveClient,\n orgId: number,\n projectId: number,\n): Promise<ProjectGraph> {\n const path = { org_id: orgId, project_id: projectId };\n const pick = (obj: unknown, key: string): Def[] => {\n const arr = (obj as Record<string, unknown>)?.[key];\n return Array.isArray(arr) ? (arr as Def[]) : [];\n };\n\n const [currencies, stats, manifests, leaderboards, segments, wheels] = await Promise.all([\n unwrap(client.raw.GET(\"/currency-definitions/{org_id}/{project_id}/\", { params: { path } })),\n unwrap(client.raw.GET(\"/stat-definitions/{org_id}/{project_id}/\", { params: { path } })),\n unwrap(client.raw.GET(\"/game-manifests/{org_id}/{project_id}/\", { params: { path } })),\n unwrap(client.raw.GET(\"/leaderboards/{org_id}/{project_id}/\", { params: { path } })),\n unwrap(client.raw.GET(\"/spin-wheel/{org_id}/{project_id}/segments/\", { params: { path } })),\n unwrap(client.raw.GET(\"/spin-wheel/{org_id}/{project_id}/wheels/\", { params: { path } })),\n ]);\n\n return new ProjectGraph(\n pick(currencies, \"currency_definitions\"),\n pick(stats, \"stat_definitions\"),\n pick(manifests, \"game_manifests\"),\n pick(leaderboards, \"leaderboards\"),\n pick(segments, \"segments\"),\n pick(wheels, \"wheels\"),\n );\n}\n","/**\n * validateSpec — check a whole EconomySpec for EVERY violation at once, and\n * impactScan — the blast radius of a live definition. Ported from\n * magicweave-fastmcp/tools/insight.py (the deterministic economy linter).\n *\n * The rules run on the parsed EconomySpec (Zod applies defaults first). Structural\n * problems that Zod itself rejects (missing key/name) surface as `schema`\n * violations so the caller still gets one report with everything.\n */\nimport type { z } from \"zod\";\nimport type { MagicweaveClient } from \"../client.js\";\nimport {\n EconomySpec,\n type LeaderboardSpec,\n type ManifestSpec,\n type Reward,\n type SpecReport,\n type Violation,\n type WheelSpec,\n} from \"../schemas/spec.js\";\nimport { buildReferenceGraph, didYouMean, iterManifestRefs, iterSegmentRefs } from \"./refgraph.js\";\n\nconst STAT_TYPES = [\"integer\", \"float\", \"boolean\"];\nconst SORT_ORDERS = [\"desc\", \"asc\"];\nconst LEADERBOARD_TYPES = [\"relative\", \"absolute\"];\nconst RESET_TYPES = [\"soft\", \"hard\"];\nconst REWARD_TYPES = [\"currency\", \"stat\", \"gem\"];\nconst REQUIREMENT_TYPES = [\"entry_cost\", \"eligibility\"];\nconst VALUE_SOURCES = [\"currency\", \"stat\"];\nconst OUTCOME_REWARD_TYPES = [\"fixed\", \"variable\"];\nconst REWARD_TARGETS = [\"currency\", \"stat\", \"gem\"];\nconst OPERATIONS = [\"add\", \"subtract\", \"set\", \"multiply\"];\nconst OPERATORS = [\"eq\", \"neq\", \"gt\", \"gte\", \"lt\", \"lte\"];\n// an arithmetic operator surrounded by spaces inside a string expected_value —\n// \"day + 2\" is an expression; \"power-up\" is a legitimate literal.\nconst EXPR_IN_VALUE = /\\s[-+*/]\\s/;\nconst FORMULA_TOKEN = /[A-Za-z_][A-Za-z0-9_]*/g;\nconst FORMULA_NOISE = new Set([\n \"max\",\n \"min\",\n \"abs\",\n \"round\",\n \"floor\",\n \"ceil\",\n \"sqrt\",\n \"pow\",\n \"if\",\n \"else\",\n \"and\",\n \"or\",\n \"not\",\n \"true\",\n \"false\",\n]);\n\ntype Spec = z.infer<typeof EconomySpec>;\n\n/** Validate a whole economy spec; returns every violation in one pass. */\nexport function validateSpec(input: unknown): SpecReport {\n const parsed = EconomySpec.safeParse(input);\n if (!parsed.success) {\n const violations: Violation[] = parsed.error.issues.map((issue) => ({\n path: issue.path.join(\".\"),\n message: issue.message,\n severity: \"error\",\n rule: \"schema\",\n }));\n return report(violations);\n }\n return report(validateEconomy(parsed.data));\n}\n\nfunction report(violations: Violation[]): SpecReport {\n const errors = violations.filter((v) => v.severity === \"error\").length;\n const warnings = violations.length - errors;\n return { ok: errors === 0, violations, summary: { errors, warnings } };\n}\n\nfunction validateEconomy(spec: Spec): Violation[] {\n const out: Violation[] = [];\n const currencyKeys = new Set(spec.currencies.map((c) => c.key));\n const statKeys = new Set(spec.stats.map((s) => s.key));\n const segmentLabels = new Set(spec.segments.map((s) => s.label));\n\n const bad = (\n path: string,\n message: string,\n severity: \"error\" | \"warning\" = \"error\",\n rule?: string,\n ) => out.push({ path, message, severity, rule });\n\n const refOk = (kind: \"currency\" | \"stat\", key: string, path: string) => {\n const pool = kind === \"currency\" ? currencyKeys : statKeys;\n if (!pool.has(key)) {\n const hint = didYouMean(key, [...pool].sort());\n bad(\n path,\n `references unknown ${kind} '${key}'.${hint ? ` Did you mean '${hint}'?` : \"\"}`,\n \"error\",\n \"unknown-ref\",\n );\n }\n };\n\n // duplicate keys\n for (const [poolName, items] of [\n [\"currencies\", spec.currencies],\n [\"stats\", spec.stats],\n ] as const) {\n const seen = new Set<string>();\n items.forEach((item, i) => {\n if (seen.has(item.key))\n bad(`${poolName}[${i}].key`, `duplicate key '${item.key}'.`, \"error\", \"duplicate-key\");\n seen.add(item.key);\n });\n }\n\n spec.stats.forEach((s, i) => {\n if (!STAT_TYPES.includes(s.stat_type)) {\n bad(\n `stats[${i}].stat_type`,\n `must be one of ${STAT_TYPES.join(\", \")}.`,\n \"error\",\n \"stat-type\",\n );\n }\n });\n\n spec.manifests.forEach((m, i) => {\n const stepsErr = validateSteps(m);\n if (stepsErr) bad(`manifests[${i}].steps`, stepsErr, \"error\", \"steps-shape\");\n for (const [tk, key, locus] of iterManifestRefs(m as unknown as Record<string, unknown>)) {\n refOk(tk, key, `manifests[${i}] (${locus})`);\n }\n validateManifestInternals(bad, i, m);\n validateEntryRequirements(bad, i, m);\n lintReachability(bad, i, m);\n lintFormulaKeys(bad, i, m);\n });\n\n spec.leaderboards.forEach((lb, i) => {\n const lbErr = validateLeaderboardFields(lb);\n if (lbErr) bad(`leaderboards[${i}]`, lbErr, \"error\", \"leaderboard-fields\");\n if (!statKeys.has(lb.stat_key)) {\n const hint = didYouMean(lb.stat_key, [...statKeys].sort());\n bad(\n `leaderboards[${i}].stat_key`,\n `unknown stat '${lb.stat_key}'.${hint ? ` Did you mean '${hint}'?` : \"\"}`,\n \"error\",\n \"unknown-ref\",\n );\n }\n });\n\n spec.segments.forEach((seg, i) => {\n const rErr = validateReward(seg.reward);\n if (rErr) bad(`segments[${i}].reward`, rErr, \"error\", \"reward-shape\");\n for (const [tk, key] of iterSegmentRefs({ reward: seg.reward } as Record<string, unknown>)) {\n refOk(tk, key, `segments[${i}].reward`);\n }\n if (seg.reward.reward_type === \"gem\") {\n bad(\n `segments[${i}].reward.reward_type`,\n \"gem rewards are only allowed on network catalog segments — project segments may reward currency only. Link network gem segments into the wheel at authoring time (get_segment_catalog).\",\n \"error\",\n \"gem-project-segment\",\n );\n }\n });\n\n spec.wheels.forEach((w, i) => validateWheelSpec(out, i, w, spec, currencyKeys, segmentLabels));\n\n lintPhantomStats(bad, spec);\n lintOrphanCurrencies(bad, spec);\n return out;\n}\n\n// --- ported helper validators (approximations of the fastmcp fail-fast helpers) ---\n\nfunction validateSteps(m: ManifestSpec): string | null {\n const steps = m.steps ?? [];\n if (steps.length === 0) return \"manifest has no steps.\";\n const keys = steps.map((s) => s.key).filter((k): k is string => !!k);\n if (keys.length !== steps.length) return \"every step must have a key.\";\n if (new Set(keys).size !== keys.length) return \"step keys must be unique.\";\n const entries = steps.filter((s) => s.is_entry);\n if (entries.length !== 1) return `exactly one step must be is_entry (found ${entries.length}).`;\n if (!steps.some((s) => s.is_terminal)) return \"at least one step must be is_terminal.\";\n const keySet = new Set(keys);\n for (const s of steps) {\n for (const nk of s.next_step_keys ?? []) {\n if (!keySet.has(nk)) return `step '${s.key}' points to unknown next step '${nk}'.`;\n }\n }\n return null;\n}\n\nfunction validateLeaderboardFields(lb: LeaderboardSpec): string | null {\n if (!SORT_ORDERS.includes(lb.sort_order))\n return `sort_order must be one of ${SORT_ORDERS.join(\", \")}.`;\n if (!LEADERBOARD_TYPES.includes(lb.leaderboard_type))\n return `leaderboard_type must be one of ${LEADERBOARD_TYPES.join(\", \")}.`;\n if (lb.reset_type != null && !RESET_TYPES.includes(lb.reset_type))\n return `reset_type must be one of ${RESET_TYPES.join(\", \")} or null.`;\n if (lb.reset_type === \"soft\") {\n const p = lb.soft_reset_percentage;\n if (p == null || p <= 0 || p > 100)\n return \"soft reset requires soft_reset_percentage in (0, 100].\";\n }\n return null;\n}\n\nfunction validateReward(reward: Reward): string | null {\n if (!reward.reward_type) return \"reward is missing reward_type (currency | stat | gem).\";\n if (!REWARD_TYPES.includes(reward.reward_type))\n return `reward_type must be one of ${REWARD_TYPES.join(\", \")}.`;\n if (reward.reward_type === \"currency\" && !reward.currency_key)\n return \"currency reward must set currency_key.\";\n if (reward.reward_type === \"stat\" && !reward.stat_key) return \"stat reward must set stat_key.\";\n if (reward.amount == null || reward.amount < 1) return \"reward amount must be an integer >= 1.\";\n return null;\n}\n\ntype Bad = (path: string, message: string, severity?: \"error\" | \"warning\", rule?: string) => void;\n\nfunction validateEntryRequirements(bad: Bad, i: number, m: ManifestSpec): void {\n m.entry_requirements.forEach((req, j) => {\n const base = `manifests[${i}].entry_requirements[${j}]`;\n if (!req.requirement_type || !REQUIREMENT_TYPES.includes(req.requirement_type)) {\n bad(\n `${base}.requirement_type`,\n `must be one of ${REQUIREMENT_TYPES.join(\", \")} (got ${JSON.stringify(req.requirement_type)}).`,\n \"error\",\n \"entry-requirement\",\n );\n }\n if (!req.value_source || !VALUE_SOURCES.includes(req.value_source)) {\n bad(\n `${base}.value_source`,\n `is required and must be one of ${VALUE_SOURCES.join(\", \")}.`,\n \"error\",\n \"entry-requirement\",\n );\n }\n if (req.requirement_type === \"entry_cost\" && (req.cost_amount == null || req.cost_amount < 1)) {\n bad(\n `${base}.cost_amount`,\n \"cost_amount (integer >= 1) is required for entry_cost.\",\n \"error\",\n \"entry-requirement\",\n );\n }\n });\n}\n\nfunction validateManifestInternals(bad: Bad, i: number, m: ManifestSpec): void {\n m.steps.forEach((step, j) => {\n step.condition_sets.forEach((cs, k) => {\n const baseCs = `manifests[${i}].steps[${j}].condition_sets[${k}]`;\n cs.conditions.forEach((cond, c) => {\n if (cond.operator != null && !OPERATORS.includes(cond.operator)) {\n bad(\n `${baseCs}.conditions[${c}].operator`,\n `must be one of ${OPERATORS.join(\", \")}.`,\n \"error\",\n \"condition-operator\",\n );\n }\n if (typeof cond.expected_value === \"string\" && EXPR_IN_VALUE.test(cond.expected_value)) {\n bad(\n `${baseCs}.conditions[${c}].expected_value`,\n `'${cond.expected_value}' looks like an expression — expected_value must be a literal; compute the value client-side and send the result in the record payload.`,\n \"warning\",\n \"expected-value-literal\",\n );\n }\n });\n cs.outcomes.forEach((oc, o) => {\n const base = `${baseCs}.outcomes[${o}]`;\n if (!oc.reward_type)\n bad(base, \"outcome is missing reward_type (fixed | variable).\", \"error\", \"outcome-enum\");\n else if (!OUTCOME_REWARD_TYPES.includes(oc.reward_type))\n bad(\n `${base}.reward_type`,\n `must be one of ${OUTCOME_REWARD_TYPES.join(\", \")}.`,\n \"error\",\n \"outcome-enum\",\n );\n if (!oc.reward_target)\n bad(\n base,\n \"outcome is missing reward_target (currency | stat | gem).\",\n \"error\",\n \"outcome-enum\",\n );\n else if (!REWARD_TARGETS.includes(oc.reward_target))\n bad(\n `${base}.reward_target`,\n `must be one of ${REWARD_TARGETS.join(\", \")}.`,\n \"error\",\n \"outcome-enum\",\n );\n if (oc.operation != null && !OPERATIONS.includes(oc.operation))\n bad(\n `${base}.operation`,\n `must be one of ${OPERATIONS.join(\", \")}.`,\n \"error\",\n \"outcome-enum\",\n );\n\n const hasFormula = oc.formula != null && !!oc.formula.formula;\n if (oc.reward_type === \"fixed\") {\n if (oc.value == null) bad(base, \"fixed outcome must set value.\", \"error\", \"pairing\");\n if (hasFormula)\n bad(\n base,\n \"fixed outcome must not carry a formula — use reward_type 'variable' to evaluate a formula.\",\n \"error\",\n \"pairing\",\n );\n } else if (oc.reward_type === \"variable\") {\n if (!hasFormula)\n bad(base, \"variable outcome must set formula.formula.\", \"error\", \"pairing\");\n if (oc.value != null)\n bad(\n base,\n \"variable outcome must not set value — use reward_type 'fixed' to award a fixed value.\",\n \"error\",\n \"pairing\",\n );\n }\n if (\n oc.reward_target === \"gem\" &&\n oc.reward_type === \"variable\" &&\n oc.formula != null &&\n oc.formula.max == null\n ) {\n bad(\n `${base}.formula.max`,\n \"uncapped variable gem award — set formula.max (gems are the network-wide premium wallet).\",\n \"warning\",\n \"uncapped-gem\",\n );\n }\n });\n });\n });\n}\n\nfunction validateWheelSpec(\n out: Violation[],\n i: number,\n wheel: WheelSpec,\n spec: Spec,\n currencyKeys: Set<string>,\n segmentLabels: Set<string>,\n): void {\n const probByLabel = new Map(spec.segments.map((s) => [s.label, s.probability]));\n let total = 0;\n wheel.segments.forEach((link, j) => {\n if (!segmentLabels.has(link.segment_ref)) {\n const hint = didYouMean(link.segment_ref, [...segmentLabels].sort());\n out.push({\n path: `wheels[${i}].segments[${j}].segment_ref`,\n message: `unknown segment '${link.segment_ref}'.${hint ? ` Did you mean '${hint}'?` : \"\"}`,\n severity: \"error\",\n rule: \"segment-ref\",\n });\n return;\n }\n total += link.probability_override ?? probByLabel.get(link.segment_ref) ?? 0;\n });\n if (wheel.segments.length && total !== 100) {\n out.push({\n path: `wheels[${i}].segments`,\n message: `effective probabilities total ${total}, must be exactly 100.`,\n severity: \"error\",\n rule: \"probability-total\",\n });\n }\n if (wheel.allow_paid_spins) {\n if (!currencyKeys.has(wheel.paid_spin_currency_key)) {\n const hint = didYouMean(wheel.paid_spin_currency_key, [...currencyKeys].sort());\n out.push({\n path: `wheels[${i}].paid_spin_currency_key`,\n message: `unknown currency '${wheel.paid_spin_currency_key}'.${hint ? ` Did you mean '${hint}'?` : \"\"}`,\n severity: \"error\",\n rule: \"unknown-ref\",\n });\n }\n if (wheel.paid_spin_currency_amount == null || wheel.paid_spin_currency_amount < 1) {\n out.push({\n path: `wheels[${i}].paid_spin_currency_amount`,\n message: \"must be an integer >= 1 when allow_paid_spins is true.\",\n severity: \"error\",\n rule: \"paid-spin\",\n });\n }\n // Money printer: expected payout in the paid currency vs the spin cost.\n const rewardByLabel = new Map(spec.segments.map((s) => [s.label, s.reward]));\n const amt = wheel.paid_spin_currency_amount;\n if (\n currencyKeys.has(wheel.paid_spin_currency_key) &&\n amt &&\n amt >= 1 &&\n wheel.segments.length\n ) {\n let ev = 0;\n for (const link of wheel.segments) {\n const reward = rewardByLabel.get(link.segment_ref);\n if (!reward || reward.reward_type !== \"currency\" || !reward.amount) continue;\n if (reward.currency_key !== wheel.paid_spin_currency_key) continue;\n const prob = link.probability_override ?? probByLabel.get(link.segment_ref) ?? 0;\n ev += (prob / 100) * reward.amount;\n }\n if (ev >= amt) {\n out.push({\n path: `wheels[${i}].paid_spin_currency_amount`,\n message: `money printer: expected payout per paid spin is ${ev.toFixed(1)} '${wheel.paid_spin_currency_key}' but a spin costs ${amt} — raise the cost or lower the payouts.`,\n severity: \"error\",\n rule: \"money-printer\",\n });\n }\n }\n }\n}\n\n// --- economy lints (advisory warnings) ---\n\nfunction payloadKeyCounts(m: ManifestSpec): Map<string, number> {\n const counts = new Map<string, number>();\n const inc = (k: string) => counts.set(k, (counts.get(k) ?? 0) + 1);\n for (const step of m.steps) {\n for (const cs of step.condition_sets) {\n for (const cond of cs.conditions) if (cond.payload_key) inc(cond.payload_key);\n for (const oc of cs.outcomes) {\n if (oc.formula?.formula) {\n for (const tok of oc.formula.formula.match(FORMULA_TOKEN) ?? []) {\n if (!FORMULA_NOISE.has(tok.toLowerCase())) inc(tok);\n }\n }\n }\n }\n }\n return counts;\n}\n\nfunction lintReachability(bad: Bad, i: number, m: ManifestSpec): void {\n const stepsByKey = new Map(m.steps.filter((s) => s.key).map((s) => [s.key as string, s]));\n const entries = m.steps.filter((s) => s.is_entry && s.key).map((s) => s.key as string);\n if (entries.length !== 1) return;\n const seen = new Set([entries[0] as string]);\n const frontier = [entries[0] as string];\n while (frontier.length) {\n const step = stepsByKey.get(frontier.pop() as string);\n for (const nk of step?.next_step_keys ?? []) {\n if (stepsByKey.has(nk) && !seen.has(nk)) {\n seen.add(nk);\n frontier.push(nk);\n }\n }\n }\n m.steps.forEach((s, j) => {\n if (s.key && !seen.has(s.key)) {\n bad(\n `manifests[${i}].steps[${j}]`,\n `step '${s.key}' is unreachable from the entry step.`,\n \"warning\",\n \"unreachable-step\",\n );\n }\n });\n}\n\nfunction lintFormulaKeys(bad: Bad, i: number, m: ManifestSpec): void {\n const counts = payloadKeyCounts(m);\n for (const [key, n] of counts) {\n if (n !== 1) continue;\n const others = [...counts.keys()].filter((k) => k !== key);\n const match = didYouMean(key, others);\n // tighter cutoff than the default did-you-mean: a real typo is very close.\n if (match && similarityCloseEnough(key, match)) {\n bad(\n `manifests[${i}]`,\n `payload key '${key}' is used once — did you mean '${match}'?`,\n \"warning\",\n \"payload-typo\",\n );\n }\n }\n}\n\nfunction similarityCloseEnough(a: string, b: string): boolean {\n // approximate difflib cutoff 0.85 used by the fastmcp payload-typo lint\n const maxLen = Math.max(a.length, b.length) || 1;\n let same = 0;\n const bl = [...b];\n for (const ch of a) {\n const idx = bl.indexOf(ch);\n if (idx !== -1) {\n same++;\n bl.splice(idx, 1);\n }\n }\n return (\n (2 * same) / (a.length + b.length) >= 0.85 && a !== b && Math.abs(a.length - b.length) <= maxLen\n );\n}\n\nfunction lintPhantomStats(bad: Bad, spec: Spec): void {\n const written = new Set<string>();\n for (const m of spec.manifests)\n for (const s of m.steps)\n for (const cs of s.condition_sets)\n for (const oc of cs.outcomes) if (oc.stat_key) written.add(oc.stat_key);\n const ranked = new Set(spec.leaderboards.map((lb) => lb.stat_key));\n const rewarded = new Set(\n spec.segments.map((s) => s.reward.stat_key).filter((k): k is string => !!k),\n );\n const payloadKeys = new Set<string>();\n for (const m of spec.manifests) for (const k of payloadKeyCounts(m).keys()) payloadKeys.add(k);\n const referenced = new Set([...written, ...ranked, ...rewarded]);\n spec.stats.forEach((st, i) => {\n if (!referenced.has(st.key) && payloadKeys.has(st.key)) {\n bad(\n `stats[${i}]`,\n `'${st.key}' looks like a runtime payload key, not a stat — no outcome writes it and no leaderboard ranks it. Payload keys are read from the record payload and need no definition.`,\n \"warning\",\n \"phantom-stat\",\n );\n }\n });\n}\n\nfunction lintOrphanCurrencies(bad: Bad, spec: Spec): void {\n const sources = new Set<string>();\n const sinks = new Set<string>();\n for (const m of spec.manifests) {\n for (const req of m.entry_requirements) if (req.currency_key) sinks.add(req.currency_key);\n for (const s of m.steps)\n for (const cs of s.condition_sets)\n for (const oc of cs.outcomes)\n if (oc.reward_target === \"currency\" && oc.currency_key)\n (oc.operation === \"subtract\" ? sinks : sources).add(oc.currency_key);\n }\n for (const seg of spec.segments)\n if (seg.reward.reward_type === \"currency\" && seg.reward.currency_key)\n sources.add(seg.reward.currency_key);\n for (const w of spec.wheels)\n if (w.allow_paid_spins && w.paid_spin_currency_key) sinks.add(w.paid_spin_currency_key);\n spec.currencies.forEach((c, i) => {\n if (!sources.has(c.key))\n bad(\n `currencies[${i}]`,\n `'${c.key}' has no source — nothing awards it.`,\n \"warning\",\n \"orphan-currency\",\n );\n if (!sinks.has(c.key))\n bad(\n `currencies[${i}]`,\n `'${c.key}' has no sink — add an entry cost, a subtract outcome, or paid wheel spins.`,\n \"warning\",\n \"orphan-currency\",\n );\n });\n}\n\n// --- impact scan (blast radius) ---\n\nexport interface ImpactReport {\n target: { kind: \"currency\" | \"stat\" | \"segment\"; ref: string | number };\n exists: boolean;\n referenceCount: number;\n byKind: Record<string, number>;\n references: Array<{ kind: string; id: number | null; name: string; locus: string }>;\n breaking: boolean;\n}\n\n/** What references a live definition — the maintenance harness's \"impact-scan before you edit\". */\nexport async function impactScan(\n client: MagicweaveClient,\n orgId: number,\n projectId: number,\n kind: \"currency\" | \"stat\" | \"segment\",\n ref: string | number,\n): Promise<ImpactReport> {\n const graph = await buildReferenceGraph(client, orgId, projectId);\n const exists =\n kind === \"currency\"\n ? graph.currencyKeys().includes(String(ref))\n : kind === \"stat\"\n ? graph.statKeys().includes(String(ref))\n : graph.segmentIds().includes(Number(ref));\n\n const refs = graph.referencesTo(kind, ref);\n const byKind: Record<string, number> = {};\n for (const r of refs) byKind[r.referencingKind] = (byKind[r.referencingKind] ?? 0) + 1;\n\n return {\n target: { kind, ref },\n exists,\n referenceCount: refs.length,\n byKind,\n references: refs.map((r) => ({\n kind: r.referencingKind,\n id: r.id,\n name: r.name,\n locus: r.locus,\n })),\n breaking: refs.length > 0,\n };\n}\n","/**\n * @magicweave/core — the shared Magicweave SDK.\n *\n * All admin/business logic lives here: the typed HTTP client, resource modules,\n * the Zod EconomySpec schemas, the deterministic smart layer, and the capability\n * registry. Surfaces (cli/mcp/openai) import from here and never the reverse.\n */\n\nexport const CORE_VERSION = \"0.0.0\";\n\nexport * from \"./client.js\";\nexport * from \"./auth.js\";\nexport type { paths, components, operations } from \"./generated/schema.js\";\n\n// --- resources ---\nexport * from \"./resources/orgs.js\";\nexport * from \"./resources/projects.js\";\nexport * from \"./resources/environments.js\";\nexport * from \"./resources/releases.js\";\nexport * from \"./resources/currencies.js\";\nexport * from \"./resources/stats.js\";\nexport * from \"./resources/manifests.js\";\nexport * from \"./resources/leaderboards.js\";\nexport * from \"./resources/segments.js\";\nexport * from \"./resources/wheels.js\";\n\n// --- spec schemas ---\nexport * as spec from \"./schemas/spec.js\";\n\n// --- smart layer ---\nexport * from \"./smart/export.js\";\nexport * from \"./smart/refgraph.js\";\nexport * from \"./smart/validate.js\";\n"],"mappings":"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","names":["currencies","stats","manifests","leaderboards","segments","wheels"]}