@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 +74 -55
- package/dist/index.d.cts +7 -1
- package/dist/index.d.ts +7 -1
- package/dist/index.js +71 -52
- package/package.json +3 -2
- package/dist/index.cjs.map +0 -1
- package/dist/index.js.map +0 -1
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
|
|
10
|
-
__defProp(target,
|
|
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
|
|
15
|
-
if (!__hasOwnProp.call(to,
|
|
16
|
-
__defProp(to,
|
|
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
|
-
|
|
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: (
|
|
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,
|
|
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,
|
|
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:
|
|
668
|
-
name:
|
|
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:
|
|
677
|
-
name:
|
|
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:
|
|
696
|
-
stat_key:
|
|
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:
|
|
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:
|
|
727
|
-
stat_key:
|
|
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:
|
|
736
|
-
name:
|
|
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:
|
|
742
|
-
name:
|
|
743
|
-
stat_key:
|
|
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:
|
|
754
|
-
stat_key:
|
|
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:
|
|
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:
|
|
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:
|
|
770
|
-
name:
|
|
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:
|
|
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(
|
|
911
|
-
for (const s of this.stats) if (s.key ===
|
|
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,
|
|
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 ===
|
|
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 ===
|
|
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 ===
|
|
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(
|
|
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,
|
|
996
|
-
const arr = obj?.[
|
|
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,
|
|
1091
|
+
const refOk = (kind, key2, path) => {
|
|
1073
1092
|
const pool = kind === "currency" ? currencyKeys : statKeys;
|
|
1074
|
-
if (!pool.has(
|
|
1075
|
-
const hint = didYouMean(
|
|
1093
|
+
if (!pool.has(key2)) {
|
|
1094
|
+
const hint = didYouMean(key2, [...pool].sort());
|
|
1076
1095
|
bad(
|
|
1077
1096
|
path,
|
|
1078
|
-
`references unknown ${kind} '${
|
|
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,
|
|
1109
|
-
refOk(tk,
|
|
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,
|
|
1133
|
-
refOk(tk,
|
|
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 [
|
|
1434
|
+
for (const [key2, n] of counts) {
|
|
1416
1435
|
if (n !== 1) continue;
|
|
1417
|
-
const others = [...counts.keys()].filter((k) => k !==
|
|
1418
|
-
const match = didYouMean(
|
|
1419
|
-
if (match && similarityCloseEnough(
|
|
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 '${
|
|
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
|
-
/**
|
|
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
|
-
/**
|
|
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
|
|
4
|
-
__defProp(target,
|
|
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
|
-
|
|
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: (
|
|
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,
|
|
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,
|
|
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:
|
|
603
|
-
name:
|
|
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:
|
|
612
|
-
name:
|
|
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:
|
|
631
|
-
stat_key:
|
|
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:
|
|
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:
|
|
662
|
-
stat_key:
|
|
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:
|
|
671
|
-
name:
|
|
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:
|
|
677
|
-
name:
|
|
678
|
-
stat_key:
|
|
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:
|
|
689
|
-
stat_key:
|
|
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:
|
|
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:
|
|
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:
|
|
705
|
-
name:
|
|
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:
|
|
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(
|
|
846
|
-
for (const s of this.stats) if (s.key ===
|
|
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,
|
|
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 ===
|
|
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 ===
|
|
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 ===
|
|
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(
|
|
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,
|
|
931
|
-
const arr = obj?.[
|
|
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,
|
|
1026
|
+
const refOk = (kind, key2, path) => {
|
|
1008
1027
|
const pool = kind === "currency" ? currencyKeys : statKeys;
|
|
1009
|
-
if (!pool.has(
|
|
1010
|
-
const hint = didYouMean(
|
|
1028
|
+
if (!pool.has(key2)) {
|
|
1029
|
+
const hint = didYouMean(key2, [...pool].sort());
|
|
1011
1030
|
bad(
|
|
1012
1031
|
path,
|
|
1013
|
-
`references unknown ${kind} '${
|
|
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,
|
|
1044
|
-
refOk(tk,
|
|
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,
|
|
1068
|
-
refOk(tk,
|
|
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 [
|
|
1369
|
+
for (const [key2, n] of counts) {
|
|
1351
1370
|
if (n !== 1) continue;
|
|
1352
|
-
const others = [...counts.keys()].filter((k) => k !==
|
|
1353
|
-
const match = didYouMean(
|
|
1354
|
-
if (match && similarityCloseEnough(
|
|
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 '${
|
|
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.
|
|
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",
|
package/dist/index.cjs.map
DELETED
|
@@ -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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,2BAAmF;AAQ5E,IAAM,mBAAmB;AACzB,IAAM,gBAAgB;AAGtB,SAAS,eAAe,UAA2B;AACxD,SAAO,YAAY,QAAQ,IAAI,eAAe;AAChD;AAUO,IAAM,kBAAN,cAA8B,MAAM;AAAA,EACzC,YACE,SACS,QACA,MACA,QACT;AACA,UAAM,OAAO;AAJJ;AACA;AACA;AAGT,SAAK,OAAO;AAAA,EACd;AAAA,EANW;AAAA,EACA;AAAA,EACA;AAKb;AAEO,IAAM,oBAAN,cAAgC,gBAAgB;AAAA,EACrD,YAAY,QAAkB;AAC5B;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,SAAK,OAAO;AAAA,EACd;AACF;AAEO,IAAM,gBAAN,cAA4B,gBAAgB;AAAA,EACjD,YAAY,QAAkB;AAC5B,UAAM,cAAc,KAAK,aAAa,MAAM;AAC5C,SAAK,OAAO;AAAA,EACd;AACF;AAEO,IAAM,kBAAN,cAA8B,gBAAgB;AAAA,EACnD,YAAY,QAAkB;AAC5B,UAAM,uBAAuB,MAAM,GAAG,KAAK,oBAAoB,MAAM;AACrE,SAAK,OAAO;AAAA,EACd;AACF;AAEA,SAAS,uBAAuB,QAAyB;AAEvD,QAAM,OAAQ,QAAkE;AAChF,MAAI,MAAM,QAAQ,IAAI,KAAK,KAAK,QAAQ;AACtC,WAAO,KACJ,IAAI,CAAC,MAAM;AACV,YAAM,QAAQ,MAAM,QAAQ,EAAE,GAAG,IAAI,EAAE,IAAI,OAAO,CAAC,MAAM,MAAM,MAAM,EAAE,KAAK,GAAG,IAAI;AACnF,aAAO,QAAQ,GAAG,KAAK,KAAK,EAAE,GAAG,KAAM,EAAE,OAAO;AAAA,IAClD,CAAC,EACA,KAAK,IAAI;AAAA,EACd;AACA,MAAI,OAAQ,QAAgC,WAAW,UAAU;AAC/D,WAAQ,OAA8B;AAAA,EACxC;AACA,SAAO;AACT;AAEA,SAAS,kBAAkB,UAAoB,MAAgC;AAC7E,UAAQ,SAAS,QAAQ;AAAA,IACvB,KAAK;AACH,aAAO,IAAI,kBAAkB,IAAI;AAAA,IACnC,KAAK;AACH,aAAO,IAAI,cAAc,IAAI;AAAA,IAC/B,KAAK;AACH,aAAO,IAAI,gBAAgB,IAAI;AAAA,IACjC,SAAS;AACP,YAAM,MACH,MAA8B,UAC/B,mBAAmB,SAAS,MAAM,IAAI,SAAS,UAAU;AAC3D,aAAO,IAAI;AAAA,QACT,OAAO,QAAQ,WAAW,MAAM,mBAAmB,SAAS,MAAM;AAAA,QAClE,SAAS;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAQA,eAAsB,OAAU,SAA8C;AAC5E,QAAM,EAAE,MAAM,OAAO,SAAS,IAAI,MAAM;AACxC,MAAI,SAAS,GAAI,QAAO;AACxB,QAAM,kBAAkB,UAAU,SAAS,IAAI;AACjD;AAMO,IAAM,mBAAN,MAAuB;AAAA,EACnB;AAAA,EACA;AAAA,EAET,YAAY,OAAsB,CAAC,GAAG;AACpC,SAAK,UAAU,eAAe,KAAK,OAAO;AAC1C,UAAM,gBAAgB,KAAK;AAE3B,UAAM,OAAmB;AAAA,MACvB,MAAM,UAAU,EAAE,QAAQ,GAAG;AAC3B,cAAM,QAAQ,gBAAgB,MAAM,cAAc,SAAS,IAAI;AAC/D,YAAI,MAAO,SAAQ,QAAQ,IAAI,iBAAiB,UAAU,KAAK,EAAE;AACjE,eAAO;AAAA,MACT;AAAA,IACF;AAEA,SAAK,UAAM,qBAAAA,SAA2B;AAAA,MACpC,SAAS,KAAK;AAAA,MACd,OAAO,KAAK;AAAA,IACd,CAAC;AACD,SAAK,IAAI,IAAI,IAAI;AAAA,EACnB;AACF;AAEO,SAAS,aAAa,OAAsB,CAAC,GAAqB;AACvE,SAAO,IAAI,iBAAiB,IAAI;AAClC;;;ACnIA,eAAsB,gBACpB,SACA,OACA,OAAiB,CAAC,GACH;AACf,QAAM,IAAI,KAAK,SAAS,WAAW;AACnC,QAAM,MAAM,MAAM,EAAE,GAAG,OAAO,sBAAsB;AAAA,IAClD,QAAQ;AAAA,IACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,IAC9C,MAAM,KAAK,UAAU,EAAE,MAAM,CAAC;AAAA,EAChC,CAAC;AACD,MAAI,CAAC,IAAI,IAAI;AACX,UAAM,IAAI;AAAA,MACR,kCAAkC,KAAK,UAAU,IAAI,MAAM;AAAA,MAC3D,IAAI;AAAA,MACJ;AAAA,IACF;AAAA,EACF;AACF;AAGA,eAAsB,eACpB,SACA,OACA,KACA,OAAiB,CAAC,GACG;AACrB,QAAM,IAAI,KAAK,SAAS,WAAW;AACnC,QAAM,MAAM,MAAM,EAAE,GAAG,OAAO,2BAA2B;AAAA,IACvD,QAAQ;AAAA,IACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,IAC9C,MAAM,KAAK,UAAU,EAAE,OAAO,IAAI,CAAC;AAAA,EACrC,CAAC;AACD,QAAM,OAAQ,MAAM,IAAI,KAAK,EAAE,MAAM,OAAO,CAAC,EAAE;AAC/C,MAAI,CAAC,IAAI,MAAM,CAAC,KAAK,gBAAgB,CAAC,KAAK,eAAe;AACxD,UAAM,IAAI;AAAA,MACR,KAAK,UAAU;AAAA,MACf,IAAI;AAAA,MACJ;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACA,SAAO,EAAE,cAAc,KAAK,cAAc,eAAe,KAAK,cAAc;AAC9E;AAUO,SAAS,UAAU,OAAkC;AAC1D,QAAM,OAAO,MAAM,MAAM,GAAG,EAAE,CAAC;AAC/B,MAAI,CAAC,KAAM,QAAO;AAClB,MAAI;AACF,WAAO,KAAK,MAAM,OAAO,KAAK,MAAM,WAAW,EAAE,SAAS,MAAM,CAAC;AAAA,EACnE,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAGO,SAAS,UAAU,OAAe,cAAc,IAAa;AAClE,QAAM,MAAM,UAAU,KAAK,GAAG;AAC9B,MAAI,CAAC,IAAK,QAAO;AACjB,SAAO,MAAM,OAAQ,KAAK,IAAI,IAAI,cAAc;AAClD;AAGO,IAAM,sBAAN,MAAmD;AAAA,EACxD,YAA6B,OAAsB;AAAtB;AAAA,EAAuB;AAAA,EAAvB;AAAA,EAC7B,WAA0B;AACxB,WAAO,KAAK;AAAA,EACd;AACF;AAGO,IAAM,mBAAN,MAAgD;AAAA,EACrD,WAA0B;AACxB,WAAO,QAAQ,IAAI,mBAAmB;AAAA,EACxC;AACF;;;ACrFO,SAAS,KAAK,QAA0B;AAC7C,SAAO;AAAA,IACL,MAAM,MAAM,OAAO,OAAO,IAAI,IAAI,OAAO,CAAC;AAAA,IAC1C,QAAQ,CAAC,SAAiB,OAAO,OAAO,IAAI,KAAK,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;AAAA,IAC7E,QAAQ,CAAC,UACP,OAAO,OAAO,IAAI,OAAO,kBAAkB,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,MAAM,EAAE,EAAE,CAAC,CAAC;AAAA,EACvF;AACF;;;ACNO,SAAS,SAAS,QAA0B;AACjD,SAAO;AAAA,IACL,MAAM,CAAC,UACL,OAAO,OAAO,IAAI,IAAI,qBAAqB,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,MAAM,EAAE,EAAE,CAAC,CAAC;AAAA,IACrF,QAAQ,CAAC,OAAe,SACtB;AAAA,MACE,OAAO,IAAI,KAAK,qBAAqB;AAAA,QACnC,QAAQ,EAAE,MAAM,EAAE,QAAQ,MAAM,EAAE;AAAA,QAClC,MAAM,EAAE,KAAK;AAAA,MACf,CAAC;AAAA,IACH;AAAA,IACF,QAAQ,CAAC,OAAe,cACtB;AAAA,MACE,OAAO,IAAI,OAAO,mCAAmC;AAAA,QACnD,QAAQ,EAAE,MAAM,EAAE,QAAQ,OAAO,YAAY,UAAU,EAAE;AAAA,MAC3D,CAAC;AAAA,IACH;AAAA,IACF,eAAe,CAAC,OAAe,cAC7B;AAAA,MACE,OAAO,IAAI,KAAK,iDAAiD;AAAA,QAC/D,QAAQ,EAAE,MAAM,EAAE,QAAQ,OAAO,YAAY,UAAU,EAAE;AAAA,MAC3D,CAAC;AAAA,IACH;AAAA,EACJ;AACF;;;ACxBO,SAAS,aAAa,QAA0B;AACrD,QAAM,OAAO,CAAC,OAAe,eAAuB;AAAA,IAClD,MAAM,EAAE,QAAQ,OAAO,YAAY,UAAU;AAAA,EAC/C;AACA,QAAM,UAAU,CAAC,OAAe,WAAmB,mBAA2B;AAAA,IAC5E,MAAM,EAAE,QAAQ,OAAO,YAAY,WAAW,gBAAgB,cAAc;AAAA,EAC9E;AAEA,SAAO;AAAA,IACL,MAAM,CAAC,OAAe,cACpB;AAAA,MACE,OAAO,IAAI,IAAI,gDAAgD;AAAA,QAC7D,QAAQ,KAAK,OAAO,SAAS;AAAA,MAC/B,CAAC;AAAA,IACH;AAAA,IACF,QAAQ,CAAC,OAAe,WAAmB,SACzC;AAAA,MACE,OAAO,IAAI,KAAK,gDAAgD;AAAA,QAC9D,QAAQ,KAAK,OAAO,SAAS;AAAA,QAC7B,MAAM,EAAE,KAAK;AAAA,MACf,CAAC;AAAA,IACH;AAAA,IACF,QAAQ,CAAC,OAAe,WAAmB,kBACzC;AAAA,MACE,OAAO,IAAI,OAAO,gEAAgE;AAAA,QAChF,QAAQ,QAAQ,OAAO,WAAW,aAAa;AAAA,MACjD,CAAC;AAAA,IACH;AAAA,IACF,cAAc,CAAC,OAAe,WAAmB,kBAC/C;AAAA,MACE,OAAO,IAAI;AAAA,QACT;AAAA,QACA;AAAA,UACE,QAAQ,QAAQ,OAAO,WAAW,aAAa;AAAA,QACjD;AAAA,MACF;AAAA,IACF;AAAA,IACF,qBAAqB,CAAC,OAAe,WAAmB,kBACtD;AAAA,MACE,OAAO,IAAI;AAAA,QACT;AAAA,QACA,EAAE,QAAQ,QAAQ,OAAO,WAAW,aAAa,EAAE;AAAA,MACrD;AAAA,IACF;AAAA,EACJ;AACF;;;ACpCO,SAAS,SAAS,QAA0B;AACjD,QAAM,MAAM,CAAC,OAAe,WAAmB,eAAuB;AAAA,IACpE,MAAM,EAAE,QAAQ,OAAO,YAAY,WAAW,YAAY,UAAU;AAAA,EACtE;AAEA,SAAO;AAAA,IACL,MAAM,CAAC,OAAe,WAAmB,kBACvC;AAAA,MACE,OAAO,IAAI,IAAI,0EAA0E;AAAA,QACvF,QAAQ,EAAE,MAAM,EAAE,QAAQ,OAAO,YAAY,WAAW,gBAAgB,cAAc,EAAE;AAAA,MAC1F,CAAC;AAAA,IACH;AAAA,IACF,QAAQ,CACN,OACA,WACA,eACA,OAA6B,EAAE,eAAe,GAAG,MAEjD;AAAA,MACE,OAAO,IAAI,KAAK,0EAA0E;AAAA,QACxF,QAAQ,EAAE,MAAM,EAAE,QAAQ,OAAO,YAAY,WAAW,gBAAgB,cAAc,EAAE;AAAA,QACxF;AAAA,MACF,CAAC;AAAA,IACH;AAAA,IACF,QAAQ,CAAC,OAAe,WAAmB,WAAmB,SAC5D;AAAA,MACE,OAAO,IAAI,MAAM,wDAAwD;AAAA,QACvE,QAAQ,IAAI,OAAO,WAAW,SAAS;AAAA,QACvC;AAAA,MACF,CAAC;AAAA,IACH;AAAA,IACF,QAAQ,CAAC,OAAe,WAAmB,cACzC;AAAA,MACE,OAAO,IAAI,OAAO,wDAAwD;AAAA,QACxE,QAAQ,IAAI,OAAO,WAAW,SAAS;AAAA,MACzC,CAAC;AAAA,IACH;AAAA,IACF,UAAU,CAAC,OAAe,WAAmB,WAAmB,SAC9D;AAAA,MACE,OAAO,IAAI,KAAK,+DAA+D;AAAA,QAC7E,QAAQ,IAAI,OAAO,WAAW,SAAS;AAAA,QACvC;AAAA,MACF,CAAC;AAAA,IACH;AAAA,IACF,YAAY,CAAC,OAAe,WAAmB,WAAmB,WAChE;AAAA,MACE,OAAO,IAAI,OAAO,wEAAwE;AAAA,QACxF,QAAQ;AAAA,UACN,MAAM,EAAE,QAAQ,OAAO,YAAY,WAAW,YAAY,WAAW,SAAS,OAAO;AAAA,QACvF;AAAA,MACF,CAAC;AAAA,IACH;AAAA,IACF,MAAM,CAAC,OAAe,WAAmB,cACvC;AAAA,MACE,OAAO,IAAI,KAAK,6DAA6D;AAAA,QAC3E,QAAQ,IAAI,OAAO,WAAW,SAAS;AAAA,MACzC,CAAC;AAAA,IACH;AAAA,IACF,UAAU,CAAC,OAAe,WAAmB,cAC3C;AAAA,MACE,OAAO,IAAI,KAAK,iEAAiE;AAAA,QAC/E,QAAQ,IAAI,OAAO,WAAW,SAAS;AAAA,MACzC,CAAC;AAAA,IACH;AAAA,IACF,YAAY,CAAC,OAAe,WAAmB,cAC7C;AAAA,MACE,OAAO,IAAI,KAAK,mEAAmE;AAAA,QACjF,QAAQ,IAAI,OAAO,WAAW,SAAS;AAAA,MACzC,CAAC;AAAA,IACH;AAAA,IACF,MAAM,CACJ,OACA,WACA,WACA,qBACA,OAAO,OAEP;AAAA,MACE,OAAO,IAAI,KAAK,6DAA6D;AAAA,QAC3E,QAAQ,IAAI,OAAO,WAAW,SAAS;AAAA,QACvC,MAAM,EAAE,uBAAuB,qBAAqB,KAAK;AAAA,MAC3D,CAAC;AAAA,IACH;AAAA,IACF,MAAM,CACJ,OACA,WACA,WACA,qBACA,OAAO,OAEP;AAAA,MACE,OAAO,IAAI,KAAK,6DAA6D;AAAA,QAC3E,QAAQ,IAAI,OAAO,WAAW,SAAS;AAAA,QACvC,MAAM,EAAE,uBAAuB,qBAAqB,KAAK;AAAA,MAC3D,CAAC;AAAA,IACH;AAAA,EACJ;AACF;;;ACxGO,SAAS,WAAW,QAA0B;AACnD,QAAM,OAAO,CAAC,OAAe,eAAuB;AAAA,IAClD,MAAM,EAAE,QAAQ,OAAO,YAAY,UAAU;AAAA,EAC/C;AACA,QAAM,MAAM,CAAC,OAAe,WAAmB,kBAA0B;AAAA,IACvE,MAAM,EAAE,QAAQ,OAAO,YAAY,WAAW,eAAe,aAAa;AAAA,EAC5E;AAEA,SAAO;AAAA,IACL,MAAM,CAAC,OAAe,cACpB;AAAA,MACE,OAAO,IAAI,IAAI,gDAAgD;AAAA,QAC7D,QAAQ,KAAK,OAAO,SAAS;AAAA,MAC/B,CAAC;AAAA,IACH;AAAA,IACF,UAAU,CAAC,OAAe,cACxB;AAAA,MACE,OAAO,IAAI,IAAI,yDAAyD;AAAA,QACtE,QAAQ,KAAK,OAAO,SAAS;AAAA,MAC/B,CAAC;AAAA,IACH;AAAA,IACF,KAAK,CAAC,OAAe,WAAmB,iBACtC;AAAA,MACE,OAAO,IAAI,IAAI,gEAAgE;AAAA,QAC7E,QAAQ,IAAI,OAAO,WAAW,YAAY;AAAA,MAC5C,CAAC;AAAA,IACH;AAAA,IACF,QAAQ,CAAC,OAAe,WAAmB,SACzC;AAAA,MACE,OAAO,IAAI,KAAK,gDAAgD;AAAA,QAC9D,QAAQ,KAAK,OAAO,SAAS;AAAA,QAC7B;AAAA,MACF,CAAC;AAAA,IACH;AAAA,IACF,QAAQ,CACN,OACA,WACA,cACA,SAEA;AAAA,MACE,OAAO,IAAI,MAAM,gEAAgE;AAAA,QAC/E,QAAQ,IAAI,OAAO,WAAW,YAAY;AAAA,QAC1C;AAAA,MACF,CAAC;AAAA,IACH;AAAA,IACF,QAAQ,CAAC,OAAe,WAAmB,iBACzC;AAAA,MACE,OAAO,IAAI,OAAO,gEAAgE;AAAA,QAChF,QAAQ,IAAI,OAAO,WAAW,YAAY;AAAA,MAC5C,CAAC;AAAA,IACH;AAAA,EACJ;AACF;;;ACrDO,SAAS,MAAM,QAA0B;AAC9C,QAAM,OAAO,CAAC,OAAe,eAAuB;AAAA,IAClD,MAAM,EAAE,QAAQ,OAAO,YAAY,UAAU;AAAA,EAC/C;AACA,QAAM,MAAM,CAAC,OAAe,WAAmB,kBAA0B;AAAA,IACvE,MAAM,EAAE,QAAQ,OAAO,YAAY,WAAW,eAAe,aAAa;AAAA,EAC5E;AAEA,SAAO;AAAA,IACL,MAAM,CAAC,OAAe,cACpB;AAAA,MACE,OAAO,IAAI,IAAI,4CAA4C;AAAA,QACzD,QAAQ,KAAK,OAAO,SAAS;AAAA,MAC/B,CAAC;AAAA,IACH;AAAA,IACF,UAAU,CAAC,OAAe,cACxB;AAAA,MACE,OAAO,IAAI,IAAI,qDAAqD;AAAA,QAClE,QAAQ,KAAK,OAAO,SAAS;AAAA,MAC/B,CAAC;AAAA,IACH;AAAA,IACF,KAAK,CAAC,OAAe,WAAmB,iBACtC;AAAA,MACE,OAAO,IAAI,IAAI,4DAA4D;AAAA,QACzE,QAAQ,IAAI,OAAO,WAAW,YAAY;AAAA,MAC5C,CAAC;AAAA,IACH;AAAA,IACF,QAAQ,CAAC,OAAe,WAAmB,SACzC;AAAA,MACE,OAAO,IAAI,KAAK,4CAA4C;AAAA,QAC1D,QAAQ,KAAK,OAAO,SAAS;AAAA,QAC7B;AAAA,MACF,CAAC;AAAA,IACH;AAAA,IACF,QAAQ,CACN,OACA,WACA,cACA,SAEA;AAAA,MACE,OAAO,IAAI,MAAM,4DAA4D;AAAA,QAC3E,QAAQ,IAAI,OAAO,WAAW,YAAY;AAAA,QAC1C;AAAA,MACF,CAAC;AAAA,IACH;AAAA,IACF,QAAQ,CAAC,OAAe,WAAmB,iBACzC;AAAA,MACE,OAAO,IAAI,OAAO,4DAA4D;AAAA,QAC5E,QAAQ,IAAI,OAAO,WAAW,YAAY;AAAA,MAC5C,CAAC;AAAA,IACH;AAAA,EACJ;AACF;;;ACtDO,SAAS,UAAU,QAA0B;AAClD,QAAM,OAAO,CAAC,OAAe,eAAuB;AAAA,IAClD,MAAM,EAAE,QAAQ,OAAO,YAAY,UAAU;AAAA,EAC/C;AACA,QAAM,MAAM,CAAC,OAAe,WAAmB,gBAAwB;AAAA,IACrE,MAAM,EAAE,QAAQ,OAAO,YAAY,WAAW,aAAa,WAAW;AAAA,EACxE;AAEA,SAAO;AAAA,IACL,MAAM,CAAC,OAAe,cACpB;AAAA,MACE,OAAO,IAAI,IAAI,0CAA0C;AAAA,QACvD,QAAQ,KAAK,OAAO,SAAS;AAAA,MAC/B,CAAC;AAAA,IACH;AAAA,IACF,UAAU,CAAC,OAAe,cACxB;AAAA,MACE,OAAO,IAAI,IAAI,mDAAmD;AAAA,QAChE,QAAQ,KAAK,OAAO,SAAS;AAAA,MAC/B,CAAC;AAAA,IACH;AAAA,IACF,KAAK,CAAC,OAAe,WAAmB,eACtC;AAAA,MACE,OAAO,IAAI,IAAI,wDAAwD;AAAA,QACrE,QAAQ,IAAI,OAAO,WAAW,UAAU;AAAA,MAC1C,CAAC;AAAA,IACH;AAAA,IACF,QAAQ,CAAC,OAAe,WAAmB,SACzC;AAAA,MACE,OAAO,IAAI,KAAK,0CAA0C;AAAA,QACxD,QAAQ,KAAK,OAAO,SAAS;AAAA,QAC7B;AAAA,MACF,CAAC;AAAA,IACH;AAAA,IACF,QAAQ,CACN,OACA,WACA,YACA,SAEA;AAAA,MACE,OAAO,IAAI,MAAM,wDAAwD;AAAA,QACvE,QAAQ,IAAI,OAAO,WAAW,UAAU;AAAA,QACxC;AAAA,MACF,CAAC;AAAA,IACH;AAAA,IACF,QAAQ,CAAC,OAAe,WAAmB,eACzC;AAAA,MACE,OAAO,IAAI,OAAO,wDAAwD;AAAA,QACxE,QAAQ,IAAI,OAAO,WAAW,UAAU;AAAA,MAC1C,CAAC;AAAA,IACH;AAAA,EACJ;AACF;;;ACrDO,SAAS,aAAa,QAA0B;AACrD,QAAM,OAAO,CAAC,OAAe,eAAuB;AAAA,IAClD,MAAM,EAAE,QAAQ,OAAO,YAAY,UAAU;AAAA,EAC/C;AACA,QAAM,MAAM,CAAC,OAAe,WAAmB,mBAA2B;AAAA,IACxE,MAAM,EAAE,QAAQ,OAAO,YAAY,WAAW,gBAAgB,cAAc;AAAA,EAC9E;AAEA,SAAO;AAAA,IACL,MAAM,CAAC,OAAe,cACpB;AAAA,MACE,OAAO,IAAI,IAAI,wCAAwC,EAAE,QAAQ,KAAK,OAAO,SAAS,EAAE,CAAC;AAAA,IAC3F;AAAA,IACF,UAAU,CAAC,OAAe,cACxB;AAAA,MACE,OAAO,IAAI,IAAI,iDAAiD;AAAA,QAC9D,QAAQ,KAAK,OAAO,SAAS;AAAA,MAC/B,CAAC;AAAA,IACH;AAAA,IACF,KAAK,CAAC,OAAe,WAAmB,kBACtC;AAAA,MACE,OAAO,IAAI,IAAI,yDAAyD;AAAA,QACtE,QAAQ,IAAI,OAAO,WAAW,aAAa;AAAA,MAC7C,CAAC;AAAA,IACH;AAAA,IACF,QAAQ,CAAC,OAAe,WAAmB,SACzC;AAAA,MACE,OAAO,IAAI,KAAK,wCAAwC;AAAA,QACtD,QAAQ,KAAK,OAAO,SAAS;AAAA,QAC7B;AAAA,MACF,CAAC;AAAA,IACH;AAAA,IACF,QAAQ,CACN,OACA,WACA,eACA,SAEA;AAAA,MACE,OAAO,IAAI,MAAM,yDAAyD;AAAA,QACxE,QAAQ,IAAI,OAAO,WAAW,aAAa;AAAA,QAC3C;AAAA,MACF,CAAC;AAAA,IACH;AAAA,IACF,QAAQ,CAAC,OAAe,WAAmB,kBACzC;AAAA,MACE,OAAO,IAAI,OAAO,yDAAyD;AAAA,QACzE,QAAQ,IAAI,OAAO,WAAW,aAAa;AAAA,MAC7C,CAAC;AAAA,IACH;AAAA;AAAA,IAEF,cAAc,CAAC,OAAe,WAAmB,kBAC/C;AAAA,MACE,OAAO,IAAI,KAAK,uEAAuE;AAAA,QACrF,QAAQ,IAAI,OAAO,WAAW,aAAa;AAAA,MAC7C,CAAC;AAAA,IACH;AAAA,EACJ;AACF;;;AC1DO,SAAS,SAAS,QAA0B;AACjD,QAAM,OAAO,CAAC,OAAe,eAAuB;AAAA,IAClD,MAAM,EAAE,QAAQ,OAAO,YAAY,UAAU;AAAA,EAC/C;AACA,QAAM,MAAM,CAAC,OAAe,WAAmB,eAAuB;AAAA,IACpE,MAAM,EAAE,QAAQ,OAAO,YAAY,WAAW,YAAY,UAAU;AAAA,EACtE;AAEA,SAAO;AAAA,IACL,MAAM,CAAC,OAAe,cACpB;AAAA,MACE,OAAO,IAAI,IAAI,+CAA+C;AAAA,QAC5D,QAAQ,KAAK,OAAO,SAAS;AAAA,MAC/B,CAAC;AAAA,IACH;AAAA,IACF,SAAS,CAAC,OAAe,cACvB;AAAA,MACE,OAAO,IAAI,IAAI,uDAAuD;AAAA,QACpE,QAAQ,KAAK,OAAO,SAAS;AAAA,MAC/B,CAAC;AAAA,IACH;AAAA,IACF,KAAK,CAAC,OAAe,WAAmB,cACtC;AAAA,MACE,OAAO,IAAI,IAAI,4DAA4D;AAAA,QACzE,QAAQ,IAAI,OAAO,WAAW,SAAS;AAAA,MACzC,CAAC;AAAA,IACH;AAAA,IACF,QAAQ,CAAC,OAAe,WAAmB,SACzC;AAAA,MACE,OAAO,IAAI,KAAK,+CAA+C;AAAA,QAC7D,QAAQ,KAAK,OAAO,SAAS;AAAA,QAC7B;AAAA,MACF,CAAC;AAAA,IACH;AAAA,IACF,QAAQ,CACN,OACA,WACA,WACA,SAEA;AAAA,MACE,OAAO,IAAI,MAAM,4DAA4D;AAAA,QAC3E,QAAQ,IAAI,OAAO,WAAW,SAAS;AAAA,QACvC;AAAA,MACF,CAAC;AAAA,IACH;AAAA,IACF,QAAQ,CAAC,OAAe,WAAmB,cACzC;AAAA,MACE,OAAO,IAAI,OAAO,4DAA4D;AAAA,QAC5E,QAAQ,IAAI,OAAO,WAAW,SAAS;AAAA,MACzC,CAAC;AAAA,IACH;AAAA,EACJ;AACF;;;ACrDO,SAAS,OAAO,QAA0B;AAC/C,QAAM,OAAO,CAAC,OAAe,eAAuB;AAAA,IAClD,MAAM,EAAE,QAAQ,OAAO,YAAY,UAAU;AAAA,EAC/C;AACA,QAAM,MAAM,CAAC,OAAe,WAAmB,mBAA2B;AAAA,IACxE,MAAM,EAAE,QAAQ,OAAO,YAAY,WAAW,iBAAiB,cAAc;AAAA,EAC/E;AAEA,SAAO;AAAA,IACL,MAAM,CAAC,OAAe,cACpB;AAAA,MACE,OAAO,IAAI,IAAI,6CAA6C;AAAA,QAC1D,QAAQ,KAAK,OAAO,SAAS;AAAA,MAC/B,CAAC;AAAA,IACH;AAAA,IACF,UAAU,CAAC,OAAe,cACxB;AAAA,MACE,OAAO,IAAI,IAAI,sDAAsD;AAAA,QACnE,QAAQ,KAAK,OAAO,SAAS;AAAA,MAC/B,CAAC;AAAA,IACH;AAAA,IACF,QAAQ,CAAC,OAAe,WAAmB,SACzC;AAAA,MACE,OAAO,IAAI,KAAK,6CAA6C;AAAA,QAC3D,QAAQ,KAAK,OAAO,SAAS;AAAA,QAC7B;AAAA,MACF,CAAC;AAAA,IACH;AAAA,IACF,QAAQ,CACN,OACA,WACA,eACA,SAEA;AAAA,MACE,OAAO,IAAI,MAAM,+DAA+D;AAAA,QAC9E,QAAQ,IAAI,OAAO,WAAW,aAAa;AAAA,QAC3C;AAAA,MACF,CAAC;AAAA,IACH;AAAA,IACF,QAAQ,CAAC,OAAe,WAAmB,kBACzC;AAAA,MACE,OAAO,IAAI,OAAO,+DAA+D;AAAA,QAC/E,QAAQ,IAAI,OAAO,WAAW,aAAa;AAAA,MAC7C,CAAC;AAAA,IACH;AAAA,EACJ;AACF;;;AC3DA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAYA,iBAAkB;AAEX,IAAM,eAAe,aAAE,OAAO;AAAA,EACnC,KAAK,aAAE,OAAO;AAAA,EACd,MAAM,aAAE,OAAO;AAAA,EACf,QAAQ,aAAE,OAAO,EAAE,QAAQ,EAAE;AAAA,EAC7B,iBAAiB,aAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,CAAC;AAAA,EAC3C,aAAa,aAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,IAAI;AAAA,EACrD,kBAAkB,aAAE,QAAQ,EAAE,QAAQ,IAAI;AAAA,EAC1C,sBAAsB,aAAE,QAAQ,EAAE,QAAQ,IAAI;AAChD,CAAC;AAEM,IAAM,WAAW,aAAE,OAAO;AAAA,EAC/B,KAAK,aAAE,OAAO;AAAA,EACd,MAAM,aAAE,OAAO;AAAA,EACf,WAAW,aAAE,OAAO;AAAA;AAAA,EACpB,eAAe,aAAE,MAAM,CAAC,aAAE,OAAO,GAAG,aAAE,QAAQ,CAAC,CAAC;AAAA,EAChD,WAAW,aAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,IAAI;AAAA,EAC7C,WAAW,aAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,IAAI;AAAA,EAC7C,sBAAsB,aAAE,QAAQ,EAAE,QAAQ,IAAI;AAAA,EAC9C,kBAAkB,aAAE,QAAQ,EAAE,QAAQ,IAAI;AAC5C,CAAC;AAEM,IAAM,UAAU,aAAE,OAAO;AAAA,EAC9B,SAAS,aAAE,OAAO,EAAE,QAAQ;AAAA,EAC5B,KAAK,aAAE,OAAO,EAAE,QAAQ;AAC1B,CAAC;AAEM,IAAM,UAAU,aAAE,OAAO;AAAA,EAC9B,aAAa,aAAE,OAAO,EAAE,QAAQ;AAAA;AAAA,EAChC,eAAe,aAAE,OAAO,EAAE,QAAQ;AAAA;AAAA,EAClC,cAAc,aAAE,OAAO,EAAE,QAAQ;AAAA,EACjC,UAAU,aAAE,OAAO,EAAE,QAAQ;AAAA,EAC7B,WAAW,aAAE,OAAO,EAAE,QAAQ;AAAA;AAAA,EAC9B,OAAO,aAAE,OAAO,EAAE,QAAQ;AAAA,EAC1B,SAAS,QAAQ,QAAQ;AAC3B,CAAC;AAEM,IAAM,YAAY,aAAE,OAAO;AAAA,EAChC,aAAa,aAAE,OAAO,EAAE,QAAQ;AAAA,EAChC,UAAU,aAAE,OAAO,EAAE,QAAQ;AAAA;AAAA,EAC7B,gBAAgB,aAAE,MAAM,CAAC,aAAE,OAAO,GAAG,aAAE,QAAQ,GAAG,aAAE,OAAO,CAAC,CAAC,EAAE,QAAQ;AACzE,CAAC;AAEM,IAAM,eAAe,aAAE,OAAO;AAAA,EACnC,YAAY,aAAE,MAAM,SAAS,EAAE,QAAQ,CAAC,CAAC;AAAA,EACzC,UAAU,aAAE,MAAM,OAAO,EAAE,QAAQ,CAAC,CAAC;AACvC,CAAC;AAEM,IAAM,OAAO,aAAE,OAAO;AAAA,EAC3B,KAAK,aAAE,OAAO,EAAE,QAAQ;AAAA;AAAA,EACxB,MAAM,aAAE,OAAO,EAAE,QAAQ,EAAE;AAAA,EAC3B,UAAU,aAAE,QAAQ,EAAE,QAAQ,KAAK;AAAA,EACnC,aAAa,aAAE,QAAQ,EAAE,QAAQ,KAAK;AAAA,EACtC,gBAAgB,aAAE,MAAM,aAAE,OAAO,CAAC,EAAE,QAAQ,CAAC,CAAC;AAAA,EAC9C,gBAAgB,aAAE,MAAM,YAAY,EAAE,QAAQ,CAAC,CAAC;AAClD,CAAC;AAEM,IAAM,mBAAmB,aAAE,OAAO;AAAA,EACvC,kBAAkB,aAAE,OAAO,EAAE,QAAQ;AAAA;AAAA,EACrC,cAAc,aAAE,OAAO,EAAE,QAAQ;AAAA;AAAA,EACjC,cAAc,aAAE,OAAO,EAAE,QAAQ;AAAA,EACjC,UAAU,aAAE,OAAO,EAAE,QAAQ;AAAA,EAC7B,UAAU,aAAE,OAAO,EAAE,QAAQ;AAAA;AAAA,EAC7B,iBAAiB,aAAE,MAAM,CAAC,aAAE,OAAO,GAAG,aAAE,QAAQ,CAAC,CAAC,EAAE,QAAQ;AAAA,EAC5D,aAAa,aAAE,OAAO,EAAE,IAAI,EAAE,QAAQ;AAAA;AACxC,CAAC;AAEM,IAAM,eAAe,aAAE,OAAO;AAAA,EACnC,MAAM,aAAE,OAAO;AAAA,EACf,MAAM,aAAE,OAAO;AAAA,EACf,oBAAoB,aAAE,MAAM,gBAAgB,EAAE,QAAQ,CAAC,CAAC;AAAA,EACxD,OAAO,aAAE,MAAM,IAAI;AACrB,CAAC;AAEM,IAAM,kBAAkB,aAAE,OAAO;AAAA,EACtC,MAAM,aAAE,OAAO;AAAA,EACf,MAAM,aAAE,OAAO;AAAA,EACf,UAAU,aAAE,OAAO;AAAA;AAAA,EACnB,YAAY,aAAE,OAAO,EAAE,QAAQ,MAAM;AAAA,EACrC,kBAAkB,aAAE,OAAO,EAAE,QAAQ,UAAU;AAAA,EAC/C,YAAY,aAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,IAAI;AAAA,EAC9C,uBAAuB,aAAE,OAAO,EAAE,QAAQ;AAC5C,CAAC;AAEM,IAAM,SAAS,aAAE,OAAO;AAAA,EAC7B,aAAa,aAAE,OAAO,EAAE,QAAQ;AAAA;AAAA,EAChC,cAAc,aAAE,OAAO,EAAE,QAAQ;AAAA,EACjC,UAAU,aAAE,OAAO,EAAE,QAAQ;AAAA,EAC7B,QAAQ,aAAE,OAAO,EAAE,IAAI,EAAE,QAAQ;AACnC,CAAC;AAEM,IAAM,cAAc,aAAE,OAAO;AAAA,EAClC,OAAO,aAAE,OAAO;AAAA,EAChB,QAAQ;AAAA,EACR,aAAa,aAAE,OAAO,EAAE,IAAI;AAAA,EAC5B,cAAc,aAAE,QAAQ,EAAE,QAAQ,KAAK;AACzC,CAAC;AAEM,IAAM,mBAAmB,aAAE,OAAO;AAAA,EACvC,aAAa,aAAE,OAAO;AAAA;AAAA,EACtB,sBAAsB,aAAE,OAAO,EAAE,IAAI,EAAE,QAAQ;AACjD,CAAC;AAEM,IAAM,YAAY,aAAE,OAAO;AAAA,EAChC,UAAU,aAAE,OAAO;AAAA,EACnB,MAAM,aAAE,OAAO;AAAA,EACf,kBAAkB,aAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,CAAC;AAAA,EAC5C,kBAAkB,aAAE,QAAQ,EAAE,QAAQ,KAAK;AAAA,EAC3C,wBAAwB,aAAE,OAAO,EAAE,QAAQ,EAAE;AAAA,EAC7C,2BAA2B,aAAE,OAAO,EAAE,IAAI,EAAE,QAAQ;AAAA,EACpD,UAAU,aAAE,MAAM,gBAAgB,EAAE,QAAQ,CAAC,CAAC;AAChD,CAAC;AAEM,IAAM,cAAc,aAAE,OAAO;AAAA,EAClC,YAAY,aAAE,MAAM,YAAY,EAAE,QAAQ,CAAC,CAAC;AAAA,EAC5C,OAAO,aAAE,MAAM,QAAQ,EAAE,QAAQ,CAAC,CAAC;AAAA,EACnC,WAAW,aAAE,MAAM,YAAY,EAAE,QAAQ,CAAC,CAAC;AAAA,EAC3C,cAAc,aAAE,MAAM,eAAe,EAAE,QAAQ,CAAC,CAAC;AAAA,EACjD,UAAU,aAAE,MAAM,WAAW,EAAE,QAAQ,CAAC,CAAC;AAAA,EACzC,QAAQ,aAAE,MAAM,SAAS,EAAE,QAAQ,CAAC,CAAC;AACvC,CAAC;;;AC5GD,eAAsB,kBACpB,QACA,OACA,WAC8B;AAC9B,QAAM,CAAC,cAAc,UAAU,cAAc,iBAAiB,aAAa,SAAS,IAClF,MAAM,QAAQ,IAAI;AAAA,IAChB,WAAW,MAAM,EAAE,KAAK,OAAO,SAAS;AAAA,IACxC,MAAM,MAAM,EAAE,KAAK,OAAO,SAAS;AAAA,IACnC,UAAU,MAAM,EAAE,KAAK,OAAO,SAAS;AAAA,IACvC,aAAa,MAAM,EAAE,KAAK,OAAO,SAAS;AAAA,IAC1C,SAAS,MAAM,EAAE,KAAK,OAAO,SAAS;AAAA,IACtC,OAAO,MAAM,EAAE,KAAK,OAAO,SAAS;AAAA,EACtC,CAAC;AAEH,SAAO;AAAA,IACL,QAAQ;AAAA,IACR,YAAY;AAAA,IACZ,YAAY;AAAA,IACZ,OAAO;AAAA,IACP,WAAW;AAAA,IACX,cAAc;AAAA,IACd,UAAU;AAAA,IACV,QAAQ;AAAA,EACV;AACF;;;AC1BO,SAAS,WAAW,QAAgB,YAAqC;AAC9E,MAAI,OAAsB;AAC1B,MAAI,YAAY;AAChB,aAAW,KAAK,YAAY;AAC1B,UAAM,IAAI,WAAW,QAAQ,CAAC;AAC9B,QAAI,IAAI,WAAW;AACjB,kBAAY;AACZ,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO,aAAa,MAAM,OAAO;AACnC;AAEA,SAAS,WAAW,GAAW,GAAmB;AAIhD,MAAI,MAAM,EAAG,QAAO;AACpB,MAAI,CAAC,EAAE,UAAU,CAAC,EAAE,OAAQ,QAAO;AACnC,SAAQ,IAAI,UAAU,GAAG,CAAC,KAAM,EAAE,SAAS,EAAE;AAC/C;AAEA,SAAS,UAAU,GAAW,GAAmB;AAC/C,QAAM,IAAI,EAAE;AACZ,QAAM,IAAI,EAAE;AACZ,QAAM,MAAM,IAAI,MAAc,IAAI,CAAC,EAAE,KAAK,CAAC;AAC3C,WAAS,IAAI,GAAG,KAAK,GAAG,KAAK;AAC3B,QAAI,WAAW;AACf,aAAS,IAAI,GAAG,KAAK,GAAG,KAAK;AAC3B,YAAM,MAAM,IAAI,CAAC;AACjB,UAAI,CAAC,IACH,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,WAAW,IAAI,KAAK,IAAI,IAAI,CAAC,GAAa,IAAI,IAAI,CAAC,CAAW;AACxF,iBAAW;AAAA,IACb;AAAA,EACF;AACA,SAAO,IAAI,CAAC;AACd;AAEA,SAAS,IAAI,GAAgC;AAC3C,SAAO,OAAO,MAAM,YAAY,IAAI,IAAI;AAC1C;AAGO,UAAU,iBACf,UACoE;AACpE,aAAW,OAAQ,SAAS,sBAAgC,CAAC,GAAG;AAC9D,QAAI,OAAO,QAAQ,YAAY,QAAQ,KAAM;AAC7C,UAAM,KAAK,IAAI,IAAI,YAAY;AAC/B,QAAI,GAAI,OAAM,CAAC,YAAY,IAAI,mBAAmB;AAClD,UAAM,KAAK,IAAI,IAAI,QAAQ;AAC3B,QAAI,GAAI,OAAM,CAAC,QAAQ,IAAI,mBAAmB;AAAA,EAChD;AACA,aAAW,QAAS,SAAS,SAAmB,CAAC,GAAG;AAClD,QAAI,OAAO,SAAS,YAAY,SAAS,KAAM;AAC/C,UAAM,OAAO,IAAI,KAAK,GAAG,KAAK;AAC9B,eAAW,MAAO,KAAK,kBAA4B,CAAC,GAAG;AACrD,UAAI,OAAO,OAAO,YAAY,OAAO,KAAM;AAC3C,iBAAW,OAAQ,GAAG,YAAsB,CAAC,GAAG;AAC9C,YAAI,OAAO,QAAQ,YAAY,QAAQ,KAAM;AAC7C,cAAM,SAAS,IAAI;AACnB,YAAI,WAAW,YAAY;AACzB,gBAAM,KAAK,IAAI,IAAI,YAAY;AAC/B,cAAI,GAAI,OAAM,CAAC,YAAY,IAAI,oBAAoB,IAAI,GAAG;AAAA,QAC5D,WAAW,WAAW,QAAQ;AAC5B,gBAAM,KAAK,IAAI,IAAI,QAAQ;AAC3B,cAAI,GAAI,OAAM,CAAC,QAAQ,IAAI,oBAAoB,IAAI,GAAG;AAAA,QACxD;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAEO,UAAU,gBACf,SACoE;AACpE,QAAM,SAAU,QAAQ,UAAkB,CAAC;AAC3C,MAAI,OAAO,gBAAgB,YAAY;AACrC,UAAM,KAAK,IAAI,OAAO,YAAY;AAClC,QAAI,GAAI,OAAM,CAAC,YAAY,IAAI,gBAAgB;AAAA,EACjD,WAAW,OAAO,gBAAgB,QAAQ;AACxC,UAAM,KAAK,IAAI,OAAO,QAAQ;AAC9B,QAAI,GAAI,OAAM,CAAC,QAAQ,IAAI,gBAAgB;AAAA,EAC7C;AACF;AAGA,SAAS,WAAW,OAA2C;AAC7D,QAAM,MAAO,MAAM,aAAqB,CAAC;AACzC,QAAM,MAAO,MAAM,gBAAwB,CAAC;AAC5C,MAAI,OAAO,KAAK,GAAG,EAAE,WAAW,KAAK,OAAO,KAAK,GAAG,EAAE,WAAW,EAAG,QAAO,CAAC,OAAO,KAAK;AACxF,SAAO,CAAC,KAAK,GAAG;AAClB;AAEO,IAAM,eAAN,MAAmB;AAAA,EACxB,YACWC,aACAC,QACAC,YACAC,eACAC,WACAC,SACT;AANS,sBAAAL;AACA,iBAAAC;AACA,qBAAAC;AACA,wBAAAC;AACA,oBAAAC;AACA,kBAAAC;AAAA,EACR;AAAA,EANQ;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAGX,eAAyB;AACvB,WAAO,KAAK,WAAW,IAAI,CAAC,MAAM,IAAI,EAAE,GAAG,CAAC,EAAE,OAAO,CAAC,MAAmB,CAAC,CAAC,CAAC;AAAA,EAC9E;AAAA,EACA,WAAqB;AACnB,WAAO,KAAK,MAAM,IAAI,CAAC,MAAM,IAAI,EAAE,GAAG,CAAC,EAAE,OAAO,CAAC,MAAmB,CAAC,CAAC,CAAC;AAAA,EACzE;AAAA,EACA,aAAuB;AACrB,WAAO,KAAK,SAAS,IAAI,CAAC,MAAM,EAAE,EAAE,EAAE,OAAO,CAAC,MAAmB,OAAO,MAAM,QAAQ;AAAA,EACxF;AAAA,EAEQ,aAAa,KAA4B;AAC/C,eAAW,KAAK,KAAK,MAAO,KAAI,EAAE,QAAQ,IAAK,QAAQ,EAAE,MAAiB;AAC1E,WAAO;AAAA,EACT;AAAA;AAAA,EAGA,aAAa,MAAuC,KAAmC;AACrF,QAAI,SAAS,UAAW,QAAO,KAAK,cAAc,OAAO,GAAG,CAAC;AAC7D,WAAO,KAAK,iBAAiB,MAAM,OAAO,GAAG,CAAC;AAAA,EAChD;AAAA,EAEQ,iBAAiB,YAAiC,KAA0B;AAClF,UAAM,QAAqB,CAAC;AAC5B,eAAW,KAAK,KAAK,WAAW;AAC9B,iBAAW,CAAC,IAAI,QAAQ,KAAK,KAAK,iBAAiB,CAAC,GAAG;AACrD,YAAI,OAAO,cAAc,WAAW,KAAK;AACvC,gBAAM,KAAK;AAAA,YACT,iBAAiB;AAAA,YACjB,IAAK,EAAE,MAAiB;AAAA,YACxB,MAAM,IAAI,EAAE,IAAI,KAAK;AAAA,YACrB;AAAA,UACF,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF;AACA,eAAW,OAAO,KAAK,UAAU;AAC/B,iBAAW,CAAC,IAAI,MAAM,KAAK,gBAAgB,GAAG,GAAG;AAC/C,YAAI,OAAO,cAAc,WAAW,KAAK;AACvC,gBAAM,KAAK;AAAA,YACT,iBAAiB;AAAA,YACjB,IAAK,IAAI,MAAiB;AAAA,YAC1B,MAAM,IAAI,IAAI,KAAK,KAAK;AAAA,YACxB,OAAO;AAAA,UACT,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF;AACA,QAAI,eAAe,YAAY;AAC7B,iBAAW,KAAK,KAAK,QAAQ;AAC3B,cAAM,CAAC,KAAK,GAAG,IAAI,WAAW,CAAC;AAC/B,cAAM,OAAO,IAAI,IAAI,sBAAsB,KAAK,IAAI,IAAI,sBAAsB;AAC9E,YAAI,SAAS,KAAK;AAChB,gBAAM,KAAK;AAAA,YACT,iBAAiB;AAAA,YACjB,IAAK,IAAI,MAAiB;AAAA,YAC1B,MAAM,IAAI,IAAI,QAAQ,KAAK,IAAI,IAAI,QAAQ,KAAK;AAAA,YAChD,OAAO;AAAA,UACT,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF;AACA,QAAI,eAAe,QAAQ;AACzB,YAAM,SAAS,KAAK,aAAa,GAAG;AACpC,UAAI,WAAW,MAAM;AACnB,mBAAW,MAAM,KAAK,cAAc;AAClC,cAAI,GAAG,YAAY,QAAQ;AACzB,kBAAM,KAAK;AAAA,cACT,iBAAiB;AAAA,cACjB,IAAK,GAAG,MAAiB;AAAA,cACzB,MAAM,IAAI,GAAG,IAAI,KAAK;AAAA,cACtB,OAAO;AAAA,YACT,CAAC;AAAA,UACH;AAAA,QACF;AAAA,MACF;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA,EAEQ,cAAc,WAAgC;AACpD,UAAM,QAAqB,CAAC;AAC5B,eAAW,KAAK,KAAK,QAAQ;AAC3B,YAAM,CAAC,KAAK,GAAG,IAAI,WAAW,CAAC;AAC/B,YAAM,QAAU,IAAI,YAAuB,IAAI,YAAsB,CAAC;AACtE,UAAI,MAAM,KAAK,CAAC,MAAM,EAAE,eAAe,SAAS,GAAG;AACjD,cAAM,KAAK;AAAA,UACT,iBAAiB;AAAA,UACjB,IAAK,IAAI,MAAiB;AAAA,UAC1B,MAAM,IAAI,IAAI,QAAQ,KAAK,IAAI,IAAI,QAAQ,KAAK;AAAA,UAChD,OAAO;AAAA,QACT,CAAC;AAAA,MACH;AAAA,IACF;AACA,WAAO;AAAA,EACT;AACF;AAGA,eAAsB,oBACpB,QACA,OACA,WACuB;AACvB,QAAM,OAAO,EAAE,QAAQ,OAAO,YAAY,UAAU;AACpD,QAAM,OAAO,CAAC,KAAc,QAAuB;AACjD,UAAM,MAAO,MAAkC,GAAG;AAClD,WAAO,MAAM,QAAQ,GAAG,IAAK,MAAgB,CAAC;AAAA,EAChD;AAEA,QAAM,CAACL,aAAYC,QAAOC,YAAWC,eAAcC,WAAUC,OAAM,IAAI,MAAM,QAAQ,IAAI;AAAA,IACvF,OAAO,OAAO,IAAI,IAAI,gDAAgD,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;AAAA,IAC3F,OAAO,OAAO,IAAI,IAAI,4CAA4C,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;AAAA,IACvF,OAAO,OAAO,IAAI,IAAI,0CAA0C,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;AAAA,IACrF,OAAO,OAAO,IAAI,IAAI,wCAAwC,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;AAAA,IACnF,OAAO,OAAO,IAAI,IAAI,+CAA+C,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;AAAA,IAC1F,OAAO,OAAO,IAAI,IAAI,6CAA6C,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;AAAA,EAC1F,CAAC;AAED,SAAO,IAAI;AAAA,IACT,KAAKL,aAAY,sBAAsB;AAAA,IACvC,KAAKC,QAAO,kBAAkB;AAAA,IAC9B,KAAKC,YAAW,gBAAgB;AAAA,IAChC,KAAKC,eAAc,cAAc;AAAA,IACjC,KAAKC,WAAU,UAAU;AAAA,IACzB,KAAKC,SAAQ,QAAQ;AAAA,EACvB;AACF;;;ACxOA,IAAM,aAAa,CAAC,WAAW,SAAS,SAAS;AACjD,IAAM,cAAc,CAAC,QAAQ,KAAK;AAClC,IAAM,oBAAoB,CAAC,YAAY,UAAU;AACjD,IAAM,cAAc,CAAC,QAAQ,MAAM;AACnC,IAAM,eAAe,CAAC,YAAY,QAAQ,KAAK;AAC/C,IAAM,oBAAoB,CAAC,cAAc,aAAa;AACtD,IAAM,gBAAgB,CAAC,YAAY,MAAM;AACzC,IAAM,uBAAuB,CAAC,SAAS,UAAU;AACjD,IAAM,iBAAiB,CAAC,YAAY,QAAQ,KAAK;AACjD,IAAM,aAAa,CAAC,OAAO,YAAY,OAAO,UAAU;AACxD,IAAM,YAAY,CAAC,MAAM,OAAO,MAAM,OAAO,MAAM,KAAK;AAGxD,IAAM,gBAAgB;AACtB,IAAM,gBAAgB;AACtB,IAAM,gBAAgB,oBAAI,IAAI;AAAA,EAC5B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAKM,SAAS,aAAa,OAA4B;AACvD,QAAM,SAAS,YAAY,UAAU,KAAK;AAC1C,MAAI,CAAC,OAAO,SAAS;AACnB,UAAM,aAA0B,OAAO,MAAM,OAAO,IAAI,CAAC,WAAW;AAAA,MAClE,MAAM,MAAM,KAAK,KAAK,GAAG;AAAA,MACzB,SAAS,MAAM;AAAA,MACf,UAAU;AAAA,MACV,MAAM;AAAA,IACR,EAAE;AACF,WAAO,OAAO,UAAU;AAAA,EAC1B;AACA,SAAO,OAAO,gBAAgB,OAAO,IAAI,CAAC;AAC5C;AAEA,SAAS,OAAO,YAAqC;AACnD,QAAM,SAAS,WAAW,OAAO,CAAC,MAAM,EAAE,aAAa,OAAO,EAAE;AAChE,QAAM,WAAW,WAAW,SAAS;AACrC,SAAO,EAAE,IAAI,WAAW,GAAG,YAAY,SAAS,EAAE,QAAQ,SAAS,EAAE;AACvE;AAEA,SAAS,gBAAgB,MAAyB;AAChD,QAAM,MAAmB,CAAC;AAC1B,QAAM,eAAe,IAAI,IAAI,KAAK,WAAW,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC;AAC9D,QAAM,WAAW,IAAI,IAAI,KAAK,MAAM,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC;AACrD,QAAM,gBAAgB,IAAI,IAAI,KAAK,SAAS,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC;AAE/D,QAAM,MAAM,CACV,MACA,SACA,WAAgC,SAChC,SACG,IAAI,KAAK,EAAE,MAAM,SAAS,UAAU,KAAK,CAAC;AAE/C,QAAM,QAAQ,CAAC,MAA2B,KAAa,SAAiB;AACtE,UAAM,OAAO,SAAS,aAAa,eAAe;AAClD,QAAI,CAAC,KAAK,IAAI,GAAG,GAAG;AAClB,YAAM,OAAO,WAAW,KAAK,CAAC,GAAG,IAAI,EAAE,KAAK,CAAC;AAC7C;AAAA,QACE;AAAA,QACA,sBAAsB,IAAI,KAAK,GAAG,KAAK,OAAO,kBAAkB,IAAI,OAAO,EAAE;AAAA,QAC7E;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,aAAW,CAAC,UAAU,KAAK,KAAK;AAAA,IAC9B,CAAC,cAAc,KAAK,UAAU;AAAA,IAC9B,CAAC,SAAS,KAAK,KAAK;AAAA,EACtB,GAAY;AACV,UAAM,OAAO,oBAAI,IAAY;AAC7B,UAAM,QAAQ,CAAC,MAAM,MAAM;AACzB,UAAI,KAAK,IAAI,KAAK,GAAG;AACnB,YAAI,GAAG,QAAQ,IAAI,CAAC,SAAS,kBAAkB,KAAK,GAAG,MAAM,SAAS,eAAe;AACvF,WAAK,IAAI,KAAK,GAAG;AAAA,IACnB,CAAC;AAAA,EACH;AAEA,OAAK,MAAM,QAAQ,CAAC,GAAG,MAAM;AAC3B,QAAI,CAAC,WAAW,SAAS,EAAE,SAAS,GAAG;AACrC;AAAA,QACE,SAAS,CAAC;AAAA,QACV,kBAAkB,WAAW,KAAK,IAAI,CAAC;AAAA,QACvC;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAC;AAED,OAAK,UAAU,QAAQ,CAAC,GAAG,MAAM;AAC/B,UAAM,WAAW,cAAc,CAAC;AAChC,QAAI,SAAU,KAAI,aAAa,CAAC,WAAW,UAAU,SAAS,aAAa;AAC3E,eAAW,CAAC,IAAI,KAAK,KAAK,KAAK,iBAAiB,CAAuC,GAAG;AACxF,YAAM,IAAI,KAAK,aAAa,CAAC,MAAM,KAAK,GAAG;AAAA,IAC7C;AACA,8BAA0B,KAAK,GAAG,CAAC;AACnC,8BAA0B,KAAK,GAAG,CAAC;AACnC,qBAAiB,KAAK,GAAG,CAAC;AAC1B,oBAAgB,KAAK,GAAG,CAAC;AAAA,EAC3B,CAAC;AAED,OAAK,aAAa,QAAQ,CAAC,IAAI,MAAM;AACnC,UAAM,QAAQ,0BAA0B,EAAE;AAC1C,QAAI,MAAO,KAAI,gBAAgB,CAAC,KAAK,OAAO,SAAS,oBAAoB;AACzE,QAAI,CAAC,SAAS,IAAI,GAAG,QAAQ,GAAG;AAC9B,YAAM,OAAO,WAAW,GAAG,UAAU,CAAC,GAAG,QAAQ,EAAE,KAAK,CAAC;AACzD;AAAA,QACE,gBAAgB,CAAC;AAAA,QACjB,iBAAiB,GAAG,QAAQ,KAAK,OAAO,kBAAkB,IAAI,OAAO,EAAE;AAAA,QACvE;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAC;AAED,OAAK,SAAS,QAAQ,CAAC,KAAK,MAAM;AAChC,UAAM,OAAO,eAAe,IAAI,MAAM;AACtC,QAAI,KAAM,KAAI,YAAY,CAAC,YAAY,MAAM,SAAS,cAAc;AACpE,eAAW,CAAC,IAAI,GAAG,KAAK,gBAAgB,EAAE,QAAQ,IAAI,OAAO,CAA4B,GAAG;AAC1F,YAAM,IAAI,KAAK,YAAY,CAAC,UAAU;AAAA,IACxC;AACA,QAAI,IAAI,OAAO,gBAAgB,OAAO;AACpC;AAAA,QACE,YAAY,CAAC;AAAA,QACb;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAC;AAED,OAAK,OAAO,QAAQ,CAAC,GAAG,MAAM,kBAAkB,KAAK,GAAG,GAAG,MAAM,cAAc,aAAa,CAAC;AAE7F,mBAAiB,KAAK,IAAI;AAC1B,uBAAqB,KAAK,IAAI;AAC9B,SAAO;AACT;AAIA,SAAS,cAAc,GAAgC;AACrD,QAAM,QAAQ,EAAE,SAAS,CAAC;AAC1B,MAAI,MAAM,WAAW,EAAG,QAAO;AAC/B,QAAM,OAAO,MAAM,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,OAAO,CAAC,MAAmB,CAAC,CAAC,CAAC;AACnE,MAAI,KAAK,WAAW,MAAM,OAAQ,QAAO;AACzC,MAAI,IAAI,IAAI,IAAI,EAAE,SAAS,KAAK,OAAQ,QAAO;AAC/C,QAAM,UAAU,MAAM,OAAO,CAAC,MAAM,EAAE,QAAQ;AAC9C,MAAI,QAAQ,WAAW,EAAG,QAAO,4CAA4C,QAAQ,MAAM;AAC3F,MAAI,CAAC,MAAM,KAAK,CAAC,MAAM,EAAE,WAAW,EAAG,QAAO;AAC9C,QAAM,SAAS,IAAI,IAAI,IAAI;AAC3B,aAAW,KAAK,OAAO;AACrB,eAAW,MAAM,EAAE,kBAAkB,CAAC,GAAG;AACvC,UAAI,CAAC,OAAO,IAAI,EAAE,EAAG,QAAO,SAAS,EAAE,GAAG,kCAAkC,EAAE;AAAA,IAChF;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,0BAA0B,IAAoC;AACrE,MAAI,CAAC,YAAY,SAAS,GAAG,UAAU;AACrC,WAAO,6BAA6B,YAAY,KAAK,IAAI,CAAC;AAC5D,MAAI,CAAC,kBAAkB,SAAS,GAAG,gBAAgB;AACjD,WAAO,mCAAmC,kBAAkB,KAAK,IAAI,CAAC;AACxE,MAAI,GAAG,cAAc,QAAQ,CAAC,YAAY,SAAS,GAAG,UAAU;AAC9D,WAAO,6BAA6B,YAAY,KAAK,IAAI,CAAC;AAC5D,MAAI,GAAG,eAAe,QAAQ;AAC5B,UAAM,IAAI,GAAG;AACb,QAAI,KAAK,QAAQ,KAAK,KAAK,IAAI;AAC7B,aAAO;AAAA,EACX;AACA,SAAO;AACT;AAEA,SAAS,eAAe,QAA+B;AACrD,MAAI,CAAC,OAAO,YAAa,QAAO;AAChC,MAAI,CAAC,aAAa,SAAS,OAAO,WAAW;AAC3C,WAAO,8BAA8B,aAAa,KAAK,IAAI,CAAC;AAC9D,MAAI,OAAO,gBAAgB,cAAc,CAAC,OAAO;AAC/C,WAAO;AACT,MAAI,OAAO,gBAAgB,UAAU,CAAC,OAAO,SAAU,QAAO;AAC9D,MAAI,OAAO,UAAU,QAAQ,OAAO,SAAS,EAAG,QAAO;AACvD,SAAO;AACT;AAIA,SAAS,0BAA0B,KAAU,GAAW,GAAuB;AAC7E,IAAE,mBAAmB,QAAQ,CAAC,KAAK,MAAM;AACvC,UAAM,OAAO,aAAa,CAAC,wBAAwB,CAAC;AACpD,QAAI,CAAC,IAAI,oBAAoB,CAAC,kBAAkB,SAAS,IAAI,gBAAgB,GAAG;AAC9E;AAAA,QACE,GAAG,IAAI;AAAA,QACP,kBAAkB,kBAAkB,KAAK,IAAI,CAAC,SAAS,KAAK,UAAU,IAAI,gBAAgB,CAAC;AAAA,QAC3F;AAAA,QACA;AAAA,MACF;AAAA,IACF;AACA,QAAI,CAAC,IAAI,gBAAgB,CAAC,cAAc,SAAS,IAAI,YAAY,GAAG;AAClE;AAAA,QACE,GAAG,IAAI;AAAA,QACP,kCAAkC,cAAc,KAAK,IAAI,CAAC;AAAA,QAC1D;AAAA,QACA;AAAA,MACF;AAAA,IACF;AACA,QAAI,IAAI,qBAAqB,iBAAiB,IAAI,eAAe,QAAQ,IAAI,cAAc,IAAI;AAC7F;AAAA,QACE,GAAG,IAAI;AAAA,QACP;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAC;AACH;AAEA,SAAS,0BAA0B,KAAU,GAAW,GAAuB;AAC7E,IAAE,MAAM,QAAQ,CAAC,MAAM,MAAM;AAC3B,SAAK,eAAe,QAAQ,CAAC,IAAI,MAAM;AACrC,YAAM,SAAS,aAAa,CAAC,WAAW,CAAC,oBAAoB,CAAC;AAC9D,SAAG,WAAW,QAAQ,CAAC,MAAM,MAAM;AACjC,YAAI,KAAK,YAAY,QAAQ,CAAC,UAAU,SAAS,KAAK,QAAQ,GAAG;AAC/D;AAAA,YACE,GAAG,MAAM,eAAe,CAAC;AAAA,YACzB,kBAAkB,UAAU,KAAK,IAAI,CAAC;AAAA,YACtC;AAAA,YACA;AAAA,UACF;AAAA,QACF;AACA,YAAI,OAAO,KAAK,mBAAmB,YAAY,cAAc,KAAK,KAAK,cAAc,GAAG;AACtF;AAAA,YACE,GAAG,MAAM,eAAe,CAAC;AAAA,YACzB,IAAI,KAAK,cAAc;AAAA,YACvB;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,MACF,CAAC;AACD,SAAG,SAAS,QAAQ,CAAC,IAAI,MAAM;AAC7B,cAAM,OAAO,GAAG,MAAM,aAAa,CAAC;AACpC,YAAI,CAAC,GAAG;AACN,cAAI,MAAM,sDAAsD,SAAS,cAAc;AAAA,iBAChF,CAAC,qBAAqB,SAAS,GAAG,WAAW;AACpD;AAAA,YACE,GAAG,IAAI;AAAA,YACP,kBAAkB,qBAAqB,KAAK,IAAI,CAAC;AAAA,YACjD;AAAA,YACA;AAAA,UACF;AACF,YAAI,CAAC,GAAG;AACN;AAAA,YACE;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,iBACO,CAAC,eAAe,SAAS,GAAG,aAAa;AAChD;AAAA,YACE,GAAG,IAAI;AAAA,YACP,kBAAkB,eAAe,KAAK,IAAI,CAAC;AAAA,YAC3C;AAAA,YACA;AAAA,UACF;AACF,YAAI,GAAG,aAAa,QAAQ,CAAC,WAAW,SAAS,GAAG,SAAS;AAC3D;AAAA,YACE,GAAG,IAAI;AAAA,YACP,kBAAkB,WAAW,KAAK,IAAI,CAAC;AAAA,YACvC;AAAA,YACA;AAAA,UACF;AAEF,cAAM,aAAa,GAAG,WAAW,QAAQ,CAAC,CAAC,GAAG,QAAQ;AACtD,YAAI,GAAG,gBAAgB,SAAS;AAC9B,cAAI,GAAG,SAAS,KAAM,KAAI,MAAM,iCAAiC,SAAS,SAAS;AACnF,cAAI;AACF;AAAA,cACE;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAAA,QACJ,WAAW,GAAG,gBAAgB,YAAY;AACxC,cAAI,CAAC;AACH,gBAAI,MAAM,8CAA8C,SAAS,SAAS;AAC5E,cAAI,GAAG,SAAS;AACd;AAAA,cACE;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAAA,QACJ;AACA,YACE,GAAG,kBAAkB,SACrB,GAAG,gBAAgB,cACnB,GAAG,WAAW,QACd,GAAG,QAAQ,OAAO,MAClB;AACA;AAAA,YACE,GAAG,IAAI;AAAA,YACP;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,MACF,CAAC;AAAA,IACH,CAAC;AAAA,EACH,CAAC;AACH;AAEA,SAAS,kBACP,KACA,GACA,OACA,MACA,cACA,eACM;AACN,QAAM,cAAc,IAAI,IAAI,KAAK,SAAS,IAAI,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC;AAC9E,MAAI,QAAQ;AACZ,QAAM,SAAS,QAAQ,CAAC,MAAM,MAAM;AAClC,QAAI,CAAC,cAAc,IAAI,KAAK,WAAW,GAAG;AACxC,YAAM,OAAO,WAAW,KAAK,aAAa,CAAC,GAAG,aAAa,EAAE,KAAK,CAAC;AACnE,UAAI,KAAK;AAAA,QACP,MAAM,UAAU,CAAC,cAAc,CAAC;AAAA,QAChC,SAAS,oBAAoB,KAAK,WAAW,KAAK,OAAO,kBAAkB,IAAI,OAAO,EAAE;AAAA,QACxF,UAAU;AAAA,QACV,MAAM;AAAA,MACR,CAAC;AACD;AAAA,IACF;AACA,aAAS,KAAK,wBAAwB,YAAY,IAAI,KAAK,WAAW,KAAK;AAAA,EAC7E,CAAC;AACD,MAAI,MAAM,SAAS,UAAU,UAAU,KAAK;AAC1C,QAAI,KAAK;AAAA,MACP,MAAM,UAAU,CAAC;AAAA,MACjB,SAAS,iCAAiC,KAAK;AAAA,MAC/C,UAAU;AAAA,MACV,MAAM;AAAA,IACR,CAAC;AAAA,EACH;AACA,MAAI,MAAM,kBAAkB;AAC1B,QAAI,CAAC,aAAa,IAAI,MAAM,sBAAsB,GAAG;AACnD,YAAM,OAAO,WAAW,MAAM,wBAAwB,CAAC,GAAG,YAAY,EAAE,KAAK,CAAC;AAC9E,UAAI,KAAK;AAAA,QACP,MAAM,UAAU,CAAC;AAAA,QACjB,SAAS,qBAAqB,MAAM,sBAAsB,KAAK,OAAO,kBAAkB,IAAI,OAAO,EAAE;AAAA,QACrG,UAAU;AAAA,QACV,MAAM;AAAA,MACR,CAAC;AAAA,IACH;AACA,QAAI,MAAM,6BAA6B,QAAQ,MAAM,4BAA4B,GAAG;AAClF,UAAI,KAAK;AAAA,QACP,MAAM,UAAU,CAAC;AAAA,QACjB,SAAS;AAAA,QACT,UAAU;AAAA,QACV,MAAM;AAAA,MACR,CAAC;AAAA,IACH;AAEA,UAAM,gBAAgB,IAAI,IAAI,KAAK,SAAS,IAAI,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;AAC3E,UAAM,MAAM,MAAM;AAClB,QACE,aAAa,IAAI,MAAM,sBAAsB,KAC7C,OACA,OAAO,KACP,MAAM,SAAS,QACf;AACA,UAAI,KAAK;AACT,iBAAW,QAAQ,MAAM,UAAU;AACjC,cAAM,SAAS,cAAc,IAAI,KAAK,WAAW;AACjD,YAAI,CAAC,UAAU,OAAO,gBAAgB,cAAc,CAAC,OAAO,OAAQ;AACpE,YAAI,OAAO,iBAAiB,MAAM,uBAAwB;AAC1D,cAAM,OAAO,KAAK,wBAAwB,YAAY,IAAI,KAAK,WAAW,KAAK;AAC/E,cAAO,OAAO,MAAO,OAAO;AAAA,MAC9B;AACA,UAAI,MAAM,KAAK;AACb,YAAI,KAAK;AAAA,UACP,MAAM,UAAU,CAAC;AAAA,UACjB,SAAS,mDAAmD,GAAG,QAAQ,CAAC,CAAC,KAAK,MAAM,sBAAsB,sBAAsB,GAAG;AAAA,UACnI,UAAU;AAAA,UACV,MAAM;AAAA,QACR,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AACF;AAIA,SAAS,iBAAiB,GAAsC;AAC9D,QAAM,SAAS,oBAAI,IAAoB;AACvC,QAAM,MAAM,CAAC,MAAc,OAAO,IAAI,IAAI,OAAO,IAAI,CAAC,KAAK,KAAK,CAAC;AACjE,aAAW,QAAQ,EAAE,OAAO;AAC1B,eAAW,MAAM,KAAK,gBAAgB;AACpC,iBAAW,QAAQ,GAAG,WAAY,KAAI,KAAK,YAAa,KAAI,KAAK,WAAW;AAC5E,iBAAW,MAAM,GAAG,UAAU;AAC5B,YAAI,GAAG,SAAS,SAAS;AACvB,qBAAW,OAAO,GAAG,QAAQ,QAAQ,MAAM,aAAa,KAAK,CAAC,GAAG;AAC/D,gBAAI,CAAC,cAAc,IAAI,IAAI,YAAY,CAAC,EAAG,KAAI,GAAG;AAAA,UACpD;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,iBAAiB,KAAU,GAAW,GAAuB;AACpE,QAAM,aAAa,IAAI,IAAI,EAAE,MAAM,OAAO,CAAC,MAAM,EAAE,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,KAAe,CAAC,CAAC,CAAC;AACxF,QAAM,UAAU,EAAE,MAAM,OAAO,CAAC,MAAM,EAAE,YAAY,EAAE,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,GAAa;AACrF,MAAI,QAAQ,WAAW,EAAG;AAC1B,QAAM,OAAO,oBAAI,IAAI,CAAC,QAAQ,CAAC,CAAW,CAAC;AAC3C,QAAM,WAAW,CAAC,QAAQ,CAAC,CAAW;AACtC,SAAO,SAAS,QAAQ;AACtB,UAAM,OAAO,WAAW,IAAI,SAAS,IAAI,CAAW;AACpD,eAAW,MAAM,MAAM,kBAAkB,CAAC,GAAG;AAC3C,UAAI,WAAW,IAAI,EAAE,KAAK,CAAC,KAAK,IAAI,EAAE,GAAG;AACvC,aAAK,IAAI,EAAE;AACX,iBAAS,KAAK,EAAE;AAAA,MAClB;AAAA,IACF;AAAA,EACF;AACA,IAAE,MAAM,QAAQ,CAAC,GAAG,MAAM;AACxB,QAAI,EAAE,OAAO,CAAC,KAAK,IAAI,EAAE,GAAG,GAAG;AAC7B;AAAA,QACE,aAAa,CAAC,WAAW,CAAC;AAAA,QAC1B,SAAS,EAAE,GAAG;AAAA,QACd;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAC;AACH;AAEA,SAAS,gBAAgB,KAAU,GAAW,GAAuB;AACnE,QAAM,SAAS,iBAAiB,CAAC;AACjC,aAAW,CAAC,KAAK,CAAC,KAAK,QAAQ;AAC7B,QAAI,MAAM,EAAG;AACb,UAAM,SAAS,CAAC,GAAG,OAAO,KAAK,CAAC,EAAE,OAAO,CAAC,MAAM,MAAM,GAAG;AACzD,UAAM,QAAQ,WAAW,KAAK,MAAM;AAEpC,QAAI,SAAS,sBAAsB,KAAK,KAAK,GAAG;AAC9C;AAAA,QACE,aAAa,CAAC;AAAA,QACd,gBAAgB,GAAG,uCAAkC,KAAK;AAAA,QAC1D;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,sBAAsB,GAAW,GAAoB;AAE5D,QAAM,SAAS,KAAK,IAAI,EAAE,QAAQ,EAAE,MAAM,KAAK;AAC/C,MAAI,OAAO;AACX,QAAM,KAAK,CAAC,GAAG,CAAC;AAChB,aAAW,MAAM,GAAG;AAClB,UAAM,MAAM,GAAG,QAAQ,EAAE;AACzB,QAAI,QAAQ,IAAI;AACd;AACA,SAAG,OAAO,KAAK,CAAC;AAAA,IAClB;AAAA,EACF;AACA,SACG,IAAI,QAAS,EAAE,SAAS,EAAE,WAAW,QAAQ,MAAM,KAAK,KAAK,IAAI,EAAE,SAAS,EAAE,MAAM,KAAK;AAE9F;AAEA,SAAS,iBAAiB,KAAU,MAAkB;AACpD,QAAM,UAAU,oBAAI,IAAY;AAChC,aAAW,KAAK,KAAK;AACnB,eAAW,KAAK,EAAE;AAChB,iBAAW,MAAM,EAAE;AACjB,mBAAW,MAAM,GAAG,SAAU,KAAI,GAAG,SAAU,SAAQ,IAAI,GAAG,QAAQ;AAC5E,QAAM,SAAS,IAAI,IAAI,KAAK,aAAa,IAAI,CAAC,OAAO,GAAG,QAAQ,CAAC;AACjE,QAAM,WAAW,IAAI;AAAA,IACnB,KAAK,SAAS,IAAI,CAAC,MAAM,EAAE,OAAO,QAAQ,EAAE,OAAO,CAAC,MAAmB,CAAC,CAAC,CAAC;AAAA,EAC5E;AACA,QAAM,cAAc,oBAAI,IAAY;AACpC,aAAW,KAAK,KAAK,UAAW,YAAW,KAAK,iBAAiB,CAAC,EAAE,KAAK,EAAG,aAAY,IAAI,CAAC;AAC7F,QAAM,aAAa,oBAAI,IAAI,CAAC,GAAG,SAAS,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAC/D,OAAK,MAAM,QAAQ,CAAC,IAAI,MAAM;AAC5B,QAAI,CAAC,WAAW,IAAI,GAAG,GAAG,KAAK,YAAY,IAAI,GAAG,GAAG,GAAG;AACtD;AAAA,QACE,SAAS,CAAC;AAAA,QACV,IAAI,GAAG,GAAG;AAAA,QACV;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAC;AACH;AAEA,SAAS,qBAAqB,KAAU,MAAkB;AACxD,QAAM,UAAU,oBAAI,IAAY;AAChC,QAAM,QAAQ,oBAAI,IAAY;AAC9B,aAAW,KAAK,KAAK,WAAW;AAC9B,eAAW,OAAO,EAAE,mBAAoB,KAAI,IAAI,aAAc,OAAM,IAAI,IAAI,YAAY;AACxF,eAAW,KAAK,EAAE;AAChB,iBAAW,MAAM,EAAE;AACjB,mBAAW,MAAM,GAAG;AAClB,cAAI,GAAG,kBAAkB,cAAc,GAAG;AACxC,aAAC,GAAG,cAAc,aAAa,QAAQ,SAAS,IAAI,GAAG,YAAY;AAAA,EAC7E;AACA,aAAW,OAAO,KAAK;AACrB,QAAI,IAAI,OAAO,gBAAgB,cAAc,IAAI,OAAO;AACtD,cAAQ,IAAI,IAAI,OAAO,YAAY;AACvC,aAAW,KAAK,KAAK;AACnB,QAAI,EAAE,oBAAoB,EAAE,uBAAwB,OAAM,IAAI,EAAE,sBAAsB;AACxF,OAAK,WAAW,QAAQ,CAAC,GAAG,MAAM;AAChC,QAAI,CAAC,QAAQ,IAAI,EAAE,GAAG;AACpB;AAAA,QACE,cAAc,CAAC;AAAA,QACf,IAAI,EAAE,GAAG;AAAA,QACT;AAAA,QACA;AAAA,MACF;AACF,QAAI,CAAC,MAAM,IAAI,EAAE,GAAG;AAClB;AAAA,QACE,cAAc,CAAC;AAAA,QACf,IAAI,EAAE,GAAG;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,EACJ,CAAC;AACH;AAcA,eAAsB,WACpB,QACA,OACA,WACA,MACA,KACuB;AACvB,QAAM,QAAQ,MAAM,oBAAoB,QAAQ,OAAO,SAAS;AAChE,QAAM,SACJ,SAAS,aACL,MAAM,aAAa,EAAE,SAAS,OAAO,GAAG,CAAC,IACzC,SAAS,SACP,MAAM,SAAS,EAAE,SAAS,OAAO,GAAG,CAAC,IACrC,MAAM,WAAW,EAAE,SAAS,OAAO,GAAG,CAAC;AAE/C,QAAM,OAAO,MAAM,aAAa,MAAM,GAAG;AACzC,QAAM,SAAiC,CAAC;AACxC,aAAW,KAAK,KAAM,QAAO,EAAE,eAAe,KAAK,OAAO,EAAE,eAAe,KAAK,KAAK;AAErF,SAAO;AAAA,IACL,QAAQ,EAAE,MAAM,IAAI;AAAA,IACpB;AAAA,IACA,gBAAgB,KAAK;AAAA,IACrB;AAAA,IACA,YAAY,KAAK,IAAI,CAAC,OAAO;AAAA,MAC3B,MAAM,EAAE;AAAA,MACR,IAAI,EAAE;AAAA,MACN,MAAM,EAAE;AAAA,MACR,OAAO,EAAE;AAAA,IACX,EAAE;AAAA,IACF,UAAU,KAAK,SAAS;AAAA,EAC1B;AACF;;;AhB5lBO,IAAM,eAAe;","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"]}
|