@magicweave/core 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts","../src/client.ts","../src/auth.ts","../src/resources/orgs.ts","../src/resources/projects.ts","../src/resources/environments.ts","../src/resources/releases.ts","../src/resources/currencies.ts","../src/resources/stats.ts","../src/resources/manifests.ts","../src/resources/leaderboards.ts","../src/resources/segments.ts","../src/resources/wheels.ts","../src/schemas/spec.ts","../src/smart/export.ts","../src/smart/refgraph.ts","../src/smart/validate.ts"],"sourcesContent":["/**\n * @magicweave/core — the shared Magicweave SDK.\n *\n * All admin/business logic lives here: the typed HTTP client, resource modules,\n * the Zod EconomySpec schemas, the deterministic smart layer, and the capability\n * registry. Surfaces (cli/mcp/openai) import from here and never the reverse.\n */\n\nexport const CORE_VERSION = \"0.0.0\";\n\nexport * from \"./client.js\";\nexport * from \"./auth.js\";\nexport type { paths, components, operations } from \"./generated/schema.js\";\n\n// --- resources ---\nexport * from \"./resources/orgs.js\";\nexport * from \"./resources/projects.js\";\nexport * from \"./resources/environments.js\";\nexport * from \"./resources/releases.js\";\nexport * from \"./resources/currencies.js\";\nexport * from \"./resources/stats.js\";\nexport * from \"./resources/manifests.js\";\nexport * from \"./resources/leaderboards.js\";\nexport * from \"./resources/segments.js\";\nexport * from \"./resources/wheels.js\";\n\n// --- spec schemas ---\nexport * as spec from \"./schemas/spec.js\";\n\n// --- smart layer ---\nexport * from \"./smart/export.js\";\nexport * from \"./smart/refgraph.js\";\nexport * from \"./smart/validate.js\";\n","import createOpenapiClient, { type Client as OpenapiClient, type Middleware } from \"openapi-fetch\";\nimport type { paths } from \"./generated/schema.js\";\n\n/** Where the CLI/tests supply an access token from (keychain, env, or a fake). */\nexport interface TokenProvider {\n getToken(): string | null | Promise<string | null>;\n}\n\nexport const STAGING_API_BASE = \"https://console.staging.magicweave.xyz/api\";\nexport const PROD_API_BASE = \"https://console.magicweave.xyz/api\";\n\n/** Resolve the admin API base URL: explicit > $MW_API_BASE > staging default. */\nexport function resolveBaseUrl(explicit?: string): string {\n return explicit ?? process.env.MW_API_BASE ?? STAGING_API_BASE;\n}\n\nexport interface ClientOptions {\n baseUrl?: string;\n tokenProvider?: TokenProvider;\n /** Inject a fetch (msw/tests). Defaults to the global fetch. */\n fetch?: typeof globalThis.fetch;\n}\n\n/** Base error for every admin API failure. `status` maps to a CLI exit code. */\nexport class MagicweaveError extends Error {\n constructor(\n message: string,\n readonly status: number,\n readonly code: string,\n readonly detail?: unknown,\n ) {\n super(message);\n this.name = \"MagicweaveError\";\n }\n}\n\nexport class UnauthorizedError extends MagicweaveError {\n constructor(detail?: unknown) {\n super(\n \"Not authenticated or your session expired. Run `mw login`.\",\n 401,\n \"unauthorized\",\n detail,\n );\n this.name = \"UnauthorizedError\";\n }\n}\n\nexport class NotFoundError extends MagicweaveError {\n constructor(detail?: unknown) {\n super(\"Not found.\", 404, \"not_found\", detail);\n this.name = \"NotFoundError\";\n }\n}\n\nexport class ValidationError extends MagicweaveError {\n constructor(detail?: unknown) {\n super(formatValidationDetail(detail), 422, \"validation_error\", detail);\n this.name = \"ValidationError\";\n }\n}\n\nfunction formatValidationDetail(detail: unknown): string {\n // FastAPI shape: { detail: [{ loc: [...], msg: string, type: string }, ...] }\n const list = (detail as { detail?: Array<{ loc?: unknown[]; msg?: string }> })?.detail;\n if (Array.isArray(list) && list.length) {\n return list\n .map((e) => {\n const field = Array.isArray(e.loc) ? e.loc.filter((p) => p !== \"body\").join(\".\") : \"\";\n return field ? `${field}: ${e.msg}` : (e.msg ?? \"invalid\");\n })\n .join(\"; \");\n }\n if (typeof (detail as { detail?: string })?.detail === \"string\") {\n return (detail as { detail: string }).detail;\n }\n return \"Request validation failed.\";\n}\n\nfunction errorFromResponse(response: Response, body: unknown): MagicweaveError {\n switch (response.status) {\n case 401:\n return new UnauthorizedError(body);\n case 404:\n return new NotFoundError(body);\n case 422:\n return new ValidationError(body);\n default: {\n const msg =\n (body as { detail?: string })?.detail ??\n `Request failed: ${response.status} ${response.statusText}`;\n return new MagicweaveError(\n typeof msg === \"string\" ? msg : `Request failed: ${response.status}`,\n response.status,\n \"http_error\",\n body,\n );\n }\n }\n}\n\n/** The raw openapi-fetch client, fully typed against the admin OpenAPI paths. */\nexport type Raw = OpenapiClient<paths>;\n\ntype FetchResult<T> = { data?: T; error?: unknown; response: Response };\n\n/** Await an openapi-fetch call, returning `data` on success or throwing a typed error. */\nexport async function unwrap<T>(promise: Promise<FetchResult<T>>): Promise<T> {\n const { data, error, response } = await promise;\n if (response.ok) return data as T;\n throw errorFromResponse(response, error ?? data);\n}\n\n/**\n * The Magicweave admin SDK client. Wraps a typed openapi-fetch client and\n * injects the bearer token from an (optional) TokenProvider on every request.\n */\nexport class MagicweaveClient {\n readonly raw: Raw;\n readonly baseUrl: string;\n\n constructor(opts: ClientOptions = {}) {\n this.baseUrl = resolveBaseUrl(opts.baseUrl);\n const tokenProvider = opts.tokenProvider;\n\n const auth: Middleware = {\n async onRequest({ request }) {\n const token = tokenProvider ? await tokenProvider.getToken() : null;\n if (token) request.headers.set(\"Authorization\", `Bearer ${token}`);\n return request;\n },\n };\n\n this.raw = createOpenapiClient<paths>({\n baseUrl: this.baseUrl,\n fetch: opts.fetch,\n });\n this.raw.use(auth);\n }\n}\n\nexport function createClient(opts: ClientOptions = {}): MagicweaveClient {\n return new MagicweaveClient(opts);\n}\n","import { MagicweaveError, type TokenProvider } from \"./client.js\";\n\nexport interface AuthTokens {\n access_token: string;\n refresh_token: string;\n}\n\ninterface OtpFetch {\n fetch?: typeof globalThis.fetch;\n}\n\n/** Step 1 of login: ask the backend to email a one-time code. */\nexport async function requestLoginOtp(\n baseUrl: string,\n email: string,\n opts: OtpFetch = {},\n): Promise<void> {\n const f = opts.fetch ?? globalThis.fetch;\n const res = await f(`${baseUrl}/auth/login-email/`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ email }),\n });\n if (!res.ok) {\n throw new MagicweaveError(\n `Could not send a login code to ${email} (HTTP ${res.status}).`,\n res.status,\n \"otp_request_failed\",\n );\n }\n}\n\n/** Step 2 of login: exchange the emailed code for access + refresh tokens. */\nexport async function verifyLoginOtp(\n baseUrl: string,\n email: string,\n otp: string,\n opts: OtpFetch = {},\n): Promise<AuthTokens> {\n const f = opts.fetch ?? globalThis.fetch;\n const res = await f(`${baseUrl}/auth/verify-email-otp/`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ email, otp }),\n });\n const body = (await res.json().catch(() => ({}))) as Partial<AuthTokens> & { detail?: string };\n if (!res.ok || !body.access_token || !body.refresh_token) {\n throw new MagicweaveError(\n body.detail ?? \"That code was not accepted. Check it and try again.\",\n res.status,\n \"otp_verify_failed\",\n body,\n );\n }\n return { access_token: body.access_token, refresh_token: body.refresh_token };\n}\n\nexport interface JwtPayload {\n user_id?: number;\n email?: string;\n exp?: number;\n [key: string]: unknown;\n}\n\n/** Decode a JWT payload without verifying the signature (server owns verification). */\nexport function decodeJwt(token: string): JwtPayload | null {\n const part = token.split(\".\")[1];\n if (!part) return null;\n try {\n return JSON.parse(Buffer.from(part, \"base64url\").toString(\"utf8\")) as JwtPayload;\n } catch {\n return null;\n }\n}\n\n/** True if the token is missing an exp, or expires within `skewSeconds`. */\nexport function isExpired(token: string, skewSeconds = 30): boolean {\n const exp = decodeJwt(token)?.exp;\n if (!exp) return true;\n return exp * 1000 <= Date.now() + skewSeconds * 1000;\n}\n\n/** A fixed token, e.g. one just read from the keychain. */\nexport class StaticTokenProvider implements TokenProvider {\n constructor(private readonly token: string | null) {}\n getToken(): string | null {\n return this.token;\n }\n}\n\n/** Reads $MW_ACCESS_TOKEN — the non-interactive/CI path. */\nexport class EnvTokenProvider implements TokenProvider {\n getToken(): string | null {\n return process.env.MW_ACCESS_TOKEN ?? null;\n }\n}\n","import type { MagicweaveClient } from \"../client.js\";\nimport { unwrap } from \"../client.js\";\nimport type { components } from \"../generated/schema.js\";\n\ntype S = components[\"schemas\"];\nexport type OrganizationListResponse = S[\"OrganizationListResponse\"];\nexport type OrganizationCreateResponse = S[\"OrganizationCreateResponse\"];\nexport type OrganizationDeleteResponse = S[\"OrganizationDeleteResponse\"];\n\n/** Organizations you belong to. */\nexport function orgs(client: MagicweaveClient) {\n return {\n list: () => unwrap(client.raw.GET(\"/org/\")),\n create: (name: string) => unwrap(client.raw.POST(\"/org/\", { body: { name } })),\n remove: (orgId: number) =>\n unwrap(client.raw.DELETE(\"/org/{org_id}/\", { params: { path: { org_id: orgId } } })),\n };\n}\n","import type { MagicweaveClient } from \"../client.js\";\nimport { unwrap } from \"../client.js\";\nimport type { components } from \"../generated/schema.js\";\n\ntype S = components[\"schemas\"];\nexport type ProjectListResponse = S[\"ProjectListResponse\"];\nexport type ProjectCreateResponse = S[\"ProjectCreateResponse\"];\nexport type ProjectDeleteResponse = S[\"ProjectDeleteResponse\"];\nexport type ProjectResponse = S[\"ProjectResponse\"];\n\n/** Projects within an organization. */\nexport function projects(client: MagicweaveClient) {\n return {\n list: (orgId: number) =>\n unwrap(client.raw.GET(\"/project/{org_id}\", { params: { path: { org_id: orgId } } })),\n create: (orgId: number, name: string) =>\n unwrap(\n client.raw.POST(\"/project/{org_id}\", {\n params: { path: { org_id: orgId } },\n body: { name },\n }),\n ),\n remove: (orgId: number, projectId: number) =>\n unwrap(\n client.raw.DELETE(\"/project/{org_id}/{project_id}/\", {\n params: { path: { org_id: orgId, project_id: projectId } },\n }),\n ),\n enableNetwork: (orgId: number, projectId: number) =>\n unwrap(\n client.raw.POST(\"/project/{org_id}/{project_id}/enable-network\", {\n params: { path: { org_id: orgId, project_id: projectId } },\n }),\n ),\n };\n}\n","import type { MagicweaveClient } from \"../client.js\";\nimport { unwrap } from \"../client.js\";\nimport type { components } from \"../generated/schema.js\";\n\ntype S = components[\"schemas\"];\nexport type EnvironmentListResponse = S[\"EnvironmentListResponse\"];\n/** Creating an env (or rotating a secret) returns the fresh client credentials. */\nexport type EnvironmentCreateResponse = S[\"EnvironmentCreateResponse\"];\nexport type EnvironmentDeleteResponse = S[\"EnvironmentDeleteResponse\"];\n\n/** Environments (testing/production) and their client credentials. */\nexport function environments(client: MagicweaveClient) {\n const base = (orgId: number, projectId: number) => ({\n path: { org_id: orgId, project_id: projectId },\n });\n const withEnv = (orgId: number, projectId: number, environmentId: number) => ({\n path: { org_id: orgId, project_id: projectId, environment_id: environmentId },\n });\n\n return {\n list: (orgId: number, projectId: number) =>\n unwrap(\n client.raw.GET(\"/project/{org_id}/{project_id}/environments/\", {\n params: base(orgId, projectId),\n }),\n ),\n create: (orgId: number, projectId: number, name: string) =>\n unwrap(\n client.raw.POST(\"/project/{org_id}/{project_id}/environments/\", {\n params: base(orgId, projectId),\n body: { name },\n }),\n ),\n remove: (orgId: number, projectId: number, environmentId: number) =>\n unwrap(\n client.raw.DELETE(\"/project/{org_id}/{project_id}/environments/{environment_id}\", {\n params: withEnv(orgId, projectId, environmentId),\n }),\n ),\n rotateSecret: (orgId: number, projectId: number, environmentId: number) =>\n unwrap(\n client.raw.POST(\n \"/project/{org_id}/{project_id}/environments/{environment_id}/rotate-secret\",\n {\n params: withEnv(orgId, projectId, environmentId),\n },\n ),\n ),\n rotatePreviewSecret: (orgId: number, projectId: number, environmentId: number) =>\n unwrap(\n client.raw.POST(\n \"/project/{org_id}/{project_id}/environments/{environment_id}/rotate-preview-secret\",\n { params: withEnv(orgId, projectId, environmentId) },\n ),\n ),\n };\n}\n","import type { MagicweaveClient } from \"../client.js\";\nimport { unwrap } from \"../client.js\";\nimport type { components } from \"../generated/schema.js\";\n\ntype S = components[\"schemas\"];\nexport type ReleaseResponse = S[\"ReleaseResponse\"];\nexport type ReleaseListResponse = S[\"ReleaseListResponse\"];\nexport type ReleaseDeleteResponse = S[\"ReleaseDeleteResponse\"];\nexport type CreateReleaseRequest = S[\"CreateReleaseRequest\"];\nexport type ReleaseUpdateRequest = S[\"ReleaseUpdateRequest\"];\nexport type ReleaseItemPushRequest = S[\"ReleaseItemPushRequest\"];\n\n/**\n * Release lifecycle: draft → add items → lock → activate, plus promote\n * (copy/move) across environments and deactivate/delete.\n *\n * Note: list/create are environment-scoped; the mutating lifecycle ops are\n * project+release-scoped. The admin API exposes no GET-single-release — read a\n * release from `list`.\n */\nexport function releases(client: MagicweaveClient) {\n const rel = (orgId: number, projectId: number, releaseId: number) => ({\n path: { org_id: orgId, project_id: projectId, release_id: releaseId },\n });\n\n return {\n list: (orgId: number, projectId: number, environmentId: number) =>\n unwrap(\n client.raw.GET(\"/project/{org_id}/{project_id}/environments/{environment_id}/releases/\", {\n params: { path: { org_id: orgId, project_id: projectId, environment_id: environmentId } },\n }),\n ),\n create: (\n orgId: number,\n projectId: number,\n environmentId: number,\n body: CreateReleaseRequest = { release_notes: \"\" },\n ) =>\n unwrap(\n client.raw.POST(\"/project/{org_id}/{project_id}/environments/{environment_id}/releases/\", {\n params: { path: { org_id: orgId, project_id: projectId, environment_id: environmentId } },\n body,\n }),\n ),\n update: (orgId: number, projectId: number, releaseId: number, body: ReleaseUpdateRequest) =>\n unwrap(\n client.raw.PATCH(\"/project/{org_id}/{project_id}/releases/{release_id}\", {\n params: rel(orgId, projectId, releaseId),\n body,\n }),\n ),\n remove: (orgId: number, projectId: number, releaseId: number) =>\n unwrap(\n client.raw.DELETE(\"/project/{org_id}/{project_id}/releases/{release_id}\", {\n params: rel(orgId, projectId, releaseId),\n }),\n ),\n pushItem: (orgId: number, projectId: number, releaseId: number, body: ReleaseItemPushRequest) =>\n unwrap(\n client.raw.POST(\"/project/{org_id}/{project_id}/releases/{release_id}/items/\", {\n params: rel(orgId, projectId, releaseId),\n body,\n }),\n ),\n removeItem: (orgId: number, projectId: number, releaseId: number, itemId: number) =>\n unwrap(\n client.raw.DELETE(\"/project/{org_id}/{project_id}/releases/{release_id}/items/{item_id}\", {\n params: {\n path: { org_id: orgId, project_id: projectId, release_id: releaseId, item_id: itemId },\n },\n }),\n ),\n lock: (orgId: number, projectId: number, releaseId: number) =>\n unwrap(\n client.raw.POST(\"/project/{org_id}/{project_id}/releases/{release_id}/lock\", {\n params: rel(orgId, projectId, releaseId),\n }),\n ),\n activate: (orgId: number, projectId: number, releaseId: number) =>\n unwrap(\n client.raw.POST(\"/project/{org_id}/{project_id}/releases/{release_id}/activate\", {\n params: rel(orgId, projectId, releaseId),\n }),\n ),\n deactivate: (orgId: number, projectId: number, releaseId: number) =>\n unwrap(\n client.raw.POST(\"/project/{org_id}/{project_id}/releases/{release_id}/deactivate\", {\n params: rel(orgId, projectId, releaseId),\n }),\n ),\n move: (\n orgId: number,\n projectId: number,\n releaseId: number,\n targetEnvironmentId: number,\n note = \"\",\n ) =>\n unwrap(\n client.raw.POST(\"/project/{org_id}/{project_id}/releases/{release_id}/move\", {\n params: rel(orgId, projectId, releaseId),\n body: { target_environment_id: targetEnvironmentId, note },\n }),\n ),\n copy: (\n orgId: number,\n projectId: number,\n releaseId: number,\n targetEnvironmentId: number,\n note = \"\",\n ) =>\n unwrap(\n client.raw.POST(\"/project/{org_id}/{project_id}/releases/{release_id}/copy\", {\n params: rel(orgId, projectId, releaseId),\n body: { target_environment_id: targetEnvironmentId, note },\n }),\n ),\n };\n}\n","import type { MagicweaveClient } from \"../client.js\";\nimport { unwrap } from \"../client.js\";\nimport type { components } from \"../generated/schema.js\";\n\ntype S = components[\"schemas\"];\nexport type CurrencyDefinitionListResponse = S[\"CurrencyDefinitionListResponse\"];\nexport type CurrencyDefinitionResponse = S[\"CurrencyDefinitionResponse\"];\nexport type CurrencyDefinitionCreateRequest = S[\"CurrencyDefinitionCreateRequest\"];\n/** Update never changes the immutable `key` — the backend forbids it. */\nexport type CurrencyDefinitionUpdateRequest = S[\"CurrencyDefinitionUpdateRequest\"];\nexport type CurrencyOverviewListResponse = S[\"CurrencyOverviewListResponse\"];\n\n/** Currency definitions for a project. */\nexport function currencies(client: MagicweaveClient) {\n const proj = (orgId: number, projectId: number) => ({\n path: { org_id: orgId, project_id: projectId },\n });\n const one = (orgId: number, projectId: number, definitionId: number) => ({\n path: { org_id: orgId, project_id: projectId, definition_id: definitionId },\n });\n\n return {\n list: (orgId: number, projectId: number) =>\n unwrap(\n client.raw.GET(\"/currency-definitions/{org_id}/{project_id}/\", {\n params: proj(orgId, projectId),\n }),\n ),\n overview: (orgId: number, projectId: number) =>\n unwrap(\n client.raw.GET(\"/currency-definitions/{org_id}/{project_id}/overview/\", {\n params: proj(orgId, projectId),\n }),\n ),\n get: (orgId: number, projectId: number, definitionId: number) =>\n unwrap(\n client.raw.GET(\"/currency-definitions/{org_id}/{project_id}/{definition_id}/\", {\n params: one(orgId, projectId, definitionId),\n }),\n ),\n create: (orgId: number, projectId: number, body: CurrencyDefinitionCreateRequest) =>\n unwrap(\n client.raw.POST(\"/currency-definitions/{org_id}/{project_id}/\", {\n params: proj(orgId, projectId),\n body,\n }),\n ),\n update: (\n orgId: number,\n projectId: number,\n definitionId: number,\n body: CurrencyDefinitionUpdateRequest,\n ) =>\n unwrap(\n client.raw.PATCH(\"/currency-definitions/{org_id}/{project_id}/{definition_id}/\", {\n params: one(orgId, projectId, definitionId),\n body,\n }),\n ),\n remove: (orgId: number, projectId: number, definitionId: number) =>\n unwrap(\n client.raw.DELETE(\"/currency-definitions/{org_id}/{project_id}/{definition_id}/\", {\n params: one(orgId, projectId, definitionId),\n }),\n ),\n };\n}\n","import type { MagicweaveClient } from \"../client.js\";\nimport { unwrap } from \"../client.js\";\nimport type { components } from \"../generated/schema.js\";\n\ntype S = components[\"schemas\"];\nexport type StatDefinitionListResponse = S[\"StatDefinitionListResponse\"];\nexport type StatDefinitionResponse = S[\"StatDefinitionResponse\"];\nexport type StatDefinitionCreateRequest = S[\"StatDefinitionCreateRequest\"];\n/** Update never changes the immutable `key`. */\nexport type StatDefinitionUpdateRequest = S[\"StatDefinitionUpdateRequest\"];\nexport type StatOverviewListResponse = S[\"StatOverviewListResponse\"];\n\n/** Stat definitions for a project. */\nexport function stats(client: MagicweaveClient) {\n const proj = (orgId: number, projectId: number) => ({\n path: { org_id: orgId, project_id: projectId },\n });\n const one = (orgId: number, projectId: number, definitionId: number) => ({\n path: { org_id: orgId, project_id: projectId, definition_id: definitionId },\n });\n\n return {\n list: (orgId: number, projectId: number) =>\n unwrap(\n client.raw.GET(\"/stat-definitions/{org_id}/{project_id}/\", {\n params: proj(orgId, projectId),\n }),\n ),\n overview: (orgId: number, projectId: number) =>\n unwrap(\n client.raw.GET(\"/stat-definitions/{org_id}/{project_id}/overview/\", {\n params: proj(orgId, projectId),\n }),\n ),\n get: (orgId: number, projectId: number, definitionId: number) =>\n unwrap(\n client.raw.GET(\"/stat-definitions/{org_id}/{project_id}/{definition_id}/\", {\n params: one(orgId, projectId, definitionId),\n }),\n ),\n create: (orgId: number, projectId: number, body: StatDefinitionCreateRequest) =>\n unwrap(\n client.raw.POST(\"/stat-definitions/{org_id}/{project_id}/\", {\n params: proj(orgId, projectId),\n body,\n }),\n ),\n update: (\n orgId: number,\n projectId: number,\n definitionId: number,\n body: StatDefinitionUpdateRequest,\n ) =>\n unwrap(\n client.raw.PATCH(\"/stat-definitions/{org_id}/{project_id}/{definition_id}/\", {\n params: one(orgId, projectId, definitionId),\n body,\n }),\n ),\n remove: (orgId: number, projectId: number, definitionId: number) =>\n unwrap(\n client.raw.DELETE(\"/stat-definitions/{org_id}/{project_id}/{definition_id}/\", {\n params: one(orgId, projectId, definitionId),\n }),\n ),\n };\n}\n","import type { MagicweaveClient } from \"../client.js\";\nimport { unwrap } from \"../client.js\";\nimport type { components } from \"../generated/schema.js\";\n\ntype S = components[\"schemas\"];\nexport type GameManifestListResponse = S[\"GameManifestListResponse\"];\nexport type GameManifestResponse = S[\"GameManifestResponse\"];\nexport type GameManifestCreateRequest = S[\"GameManifestCreateRequest\"];\nexport type GameManifestUpdateRequest = S[\"GameManifestUpdateRequest\"];\nexport type GameManifestOverviewListResponse = S[\"GameManifestOverviewListResponse\"];\n\n/** Game manifests (the game-loop step graph) for a project. */\nexport function manifests(client: MagicweaveClient) {\n const proj = (orgId: number, projectId: number) => ({\n path: { org_id: orgId, project_id: projectId },\n });\n const one = (orgId: number, projectId: number, manifestId: number) => ({\n path: { org_id: orgId, project_id: projectId, manifest_id: manifestId },\n });\n\n return {\n list: (orgId: number, projectId: number) =>\n unwrap(\n client.raw.GET(\"/game-manifests/{org_id}/{project_id}/\", {\n params: proj(orgId, projectId),\n }),\n ),\n overview: (orgId: number, projectId: number) =>\n unwrap(\n client.raw.GET(\"/game-manifests/{org_id}/{project_id}/overview/\", {\n params: proj(orgId, projectId),\n }),\n ),\n get: (orgId: number, projectId: number, manifestId: number) =>\n unwrap(\n client.raw.GET(\"/game-manifests/{org_id}/{project_id}/{manifest_id}/\", {\n params: one(orgId, projectId, manifestId),\n }),\n ),\n create: (orgId: number, projectId: number, body: GameManifestCreateRequest) =>\n unwrap(\n client.raw.POST(\"/game-manifests/{org_id}/{project_id}/\", {\n params: proj(orgId, projectId),\n body,\n }),\n ),\n update: (\n orgId: number,\n projectId: number,\n manifestId: number,\n body: GameManifestUpdateRequest,\n ) =>\n unwrap(\n client.raw.PATCH(\"/game-manifests/{org_id}/{project_id}/{manifest_id}/\", {\n params: one(orgId, projectId, manifestId),\n body,\n }),\n ),\n remove: (orgId: number, projectId: number, manifestId: number) =>\n unwrap(\n client.raw.DELETE(\"/game-manifests/{org_id}/{project_id}/{manifest_id}/\", {\n params: one(orgId, projectId, manifestId),\n }),\n ),\n };\n}\n","import type { MagicweaveClient } from \"../client.js\";\nimport { unwrap } from \"../client.js\";\nimport type { components } from \"../generated/schema.js\";\n\ntype S = components[\"schemas\"];\nexport type LeaderboardListResponse = S[\"LeaderboardListResponse\"];\nexport type LeaderboardResponse = S[\"LeaderboardResponse\"];\nexport type LeaderboardCreateRequest = S[\"LeaderboardCreateRequest\"];\nexport type LeaderboardUpdateRequest = S[\"LeaderboardUpdateRequest\"];\nexport type LeaderboardOverviewListResponse = S[\"LeaderboardOverviewListResponse\"];\n\n/** Leaderboards for a project (incl. the irreversible process-reset). */\nexport function leaderboards(client: MagicweaveClient) {\n const proj = (orgId: number, projectId: number) => ({\n path: { org_id: orgId, project_id: projectId },\n });\n const one = (orgId: number, projectId: number, leaderboardId: number) => ({\n path: { org_id: orgId, project_id: projectId, leaderboard_id: leaderboardId },\n });\n\n return {\n list: (orgId: number, projectId: number) =>\n unwrap(\n client.raw.GET(\"/leaderboards/{org_id}/{project_id}/\", { params: proj(orgId, projectId) }),\n ),\n overview: (orgId: number, projectId: number) =>\n unwrap(\n client.raw.GET(\"/leaderboards/{org_id}/{project_id}/overview/\", {\n params: proj(orgId, projectId),\n }),\n ),\n get: (orgId: number, projectId: number, leaderboardId: number) =>\n unwrap(\n client.raw.GET(\"/leaderboards/{org_id}/{project_id}/{leaderboard_id}/\", {\n params: one(orgId, projectId, leaderboardId),\n }),\n ),\n create: (orgId: number, projectId: number, body: LeaderboardCreateRequest) =>\n unwrap(\n client.raw.POST(\"/leaderboards/{org_id}/{project_id}/\", {\n params: proj(orgId, projectId),\n body,\n }),\n ),\n update: (\n orgId: number,\n projectId: number,\n leaderboardId: number,\n body: LeaderboardUpdateRequest,\n ) =>\n unwrap(\n client.raw.PATCH(\"/leaderboards/{org_id}/{project_id}/{leaderboard_id}/\", {\n params: one(orgId, projectId, leaderboardId),\n body,\n }),\n ),\n remove: (orgId: number, projectId: number, leaderboardId: number) =>\n unwrap(\n client.raw.DELETE(\"/leaderboards/{org_id}/{project_id}/{leaderboard_id}/\", {\n params: one(orgId, projectId, leaderboardId),\n }),\n ),\n /** Irreversible: archive scores and reset the board. Confirm-gate in the CLI. */\n processReset: (orgId: number, projectId: number, leaderboardId: number) =>\n unwrap(\n client.raw.POST(\"/leaderboards/{org_id}/{project_id}/{leaderboard_id}/process-reset/\", {\n params: one(orgId, projectId, leaderboardId),\n }),\n ),\n };\n}\n","import type { MagicweaveClient } from \"../client.js\";\nimport { unwrap } from \"../client.js\";\nimport type { components } from \"../generated/schema.js\";\n\ntype S = components[\"schemas\"];\nexport type ProjectSegmentListResponse = S[\"ProjectSegmentListResponse\"];\nexport type ProjectSegmentResponse = S[\"ProjectSegmentResponse\"];\nexport type ProjectSegmentCreateRequest = S[\"ProjectSegmentCreateRequest\"];\nexport type ProjectSegmentUpdateRequest = S[\"ProjectSegmentUpdateRequest\"];\nexport type SegmentCatalogResponse = S[\"SegmentCatalogResponse\"];\n\n/** Reward segments — the building blocks referenced by spin wheels. */\nexport function segments(client: MagicweaveClient) {\n const proj = (orgId: number, projectId: number) => ({\n path: { org_id: orgId, project_id: projectId },\n });\n const one = (orgId: number, projectId: number, segmentId: number) => ({\n path: { org_id: orgId, project_id: projectId, segment_id: segmentId },\n });\n\n return {\n list: (orgId: number, projectId: number) =>\n unwrap(\n client.raw.GET(\"/spin-wheel/{org_id}/{project_id}/segments/\", {\n params: proj(orgId, projectId),\n }),\n ),\n catalog: (orgId: number, projectId: number) =>\n unwrap(\n client.raw.GET(\"/spin-wheel/{org_id}/{project_id}/segments/catalog/\", {\n params: proj(orgId, projectId),\n }),\n ),\n get: (orgId: number, projectId: number, segmentId: number) =>\n unwrap(\n client.raw.GET(\"/spin-wheel/{org_id}/{project_id}/segments/{segment_id}/\", {\n params: one(orgId, projectId, segmentId),\n }),\n ),\n create: (orgId: number, projectId: number, body: ProjectSegmentCreateRequest) =>\n unwrap(\n client.raw.POST(\"/spin-wheel/{org_id}/{project_id}/segments/\", {\n params: proj(orgId, projectId),\n body,\n }),\n ),\n update: (\n orgId: number,\n projectId: number,\n segmentId: number,\n body: ProjectSegmentUpdateRequest,\n ) =>\n unwrap(\n client.raw.PATCH(\"/spin-wheel/{org_id}/{project_id}/segments/{segment_id}/\", {\n params: one(orgId, projectId, segmentId),\n body,\n }),\n ),\n remove: (orgId: number, projectId: number, segmentId: number) =>\n unwrap(\n client.raw.DELETE(\"/spin-wheel/{org_id}/{project_id}/segments/{segment_id}/\", {\n params: one(orgId, projectId, segmentId),\n }),\n ),\n };\n}\n","import type { MagicweaveClient } from \"../client.js\";\nimport { unwrap } from \"../client.js\";\nimport type { components } from \"../generated/schema.js\";\n\ntype S = components[\"schemas\"];\nexport type SpinWheelProjectListResponse = S[\"SpinWheelProjectListResponse\"];\nexport type WheelConfigCreateRequest = S[\"WheelConfigCreateRequest\"];\nexport type WheelConfigCreateResponse = S[\"WheelConfigCreateResponse\"];\nexport type WheelConfigPatchRequest = S[\"WheelConfigPatchRequest\"];\nexport type WheelOverviewListResponse = S[\"WheelOverviewListResponse\"];\n\n/** Spin-wheel configurations for a project. */\nexport function wheels(client: MagicweaveClient) {\n const proj = (orgId: number, projectId: number) => ({\n path: { org_id: orgId, project_id: projectId },\n });\n const one = (orgId: number, projectId: number, wheelConfigId: number) => ({\n path: { org_id: orgId, project_id: projectId, wheel_config_id: wheelConfigId },\n });\n\n return {\n list: (orgId: number, projectId: number) =>\n unwrap(\n client.raw.GET(\"/spin-wheel/{org_id}/{project_id}/wheels/\", {\n params: proj(orgId, projectId),\n }),\n ),\n overview: (orgId: number, projectId: number) =>\n unwrap(\n client.raw.GET(\"/spin-wheel/{org_id}/{project_id}/wheels/overview/\", {\n params: proj(orgId, projectId),\n }),\n ),\n create: (orgId: number, projectId: number, body: WheelConfigCreateRequest) =>\n unwrap(\n client.raw.POST(\"/spin-wheel/{org_id}/{project_id}/wheels/\", {\n params: proj(orgId, projectId),\n body,\n }),\n ),\n update: (\n orgId: number,\n projectId: number,\n wheelConfigId: number,\n body: WheelConfigPatchRequest,\n ) =>\n unwrap(\n client.raw.PATCH(\"/spin-wheel/{org_id}/{project_id}/wheels/{wheel_config_id}/\", {\n params: one(orgId, projectId, wheelConfigId),\n body,\n }),\n ),\n remove: (orgId: number, projectId: number, wheelConfigId: number) =>\n unwrap(\n client.raw.DELETE(\"/spin-wheel/{org_id}/{project_id}/wheels/{wheel_config_id}/\", {\n params: one(orgId, projectId, wheelConfigId),\n }),\n ),\n };\n}\n","/**\n * The EconomySpec — a whole game's game-layer definitions in one object.\n *\n * Ported faithfully from magicweave-fastmcp/tools/spec.py. This is the contract a\n * human/agent authors up front; `validateSpec` (smart/validate.ts) checks it for\n * every violation at once — including cross-references — before any create call.\n *\n * As in the Python source, manifest step-graph internals are intentionally lax\n * (every inner field optional): the deterministic validator owns the friendly\n * semantic messages; these schemas only enforce that an outcome/condition IS an\n * object, not a scalar.\n */\nimport { z } from \"zod\";\n\nexport const CurrencySpec = z.object({\n key: z.string(),\n name: z.string(),\n symbol: z.string().default(\"\"),\n initial_balance: z.number().int().default(0),\n max_balance: z.number().int().nullable().default(null),\n usable_as_reward: z.boolean().default(true),\n usable_in_conditions: z.boolean().default(true),\n});\n\nexport const StatSpec = z.object({\n key: z.string(),\n name: z.string(),\n stat_type: z.string(), // integer | float | boolean\n default_value: z.union([z.number(), z.boolean()]),\n min_value: z.number().nullable().default(null),\n max_value: z.number().nullable().default(null),\n usable_in_conditions: z.boolean().default(true),\n usable_as_reward: z.boolean().default(true),\n});\n\nexport const Formula = z.object({\n formula: z.string().nullish(),\n max: z.number().nullish(),\n});\n\nexport const Outcome = z.object({\n reward_type: z.string().nullish(), // fixed | variable\n reward_target: z.string().nullish(), // currency | stat | gem\n currency_key: z.string().nullish(),\n stat_key: z.string().nullish(),\n operation: z.string().nullish(), // add | subtract | set | multiply\n value: z.number().nullish(),\n formula: Formula.nullish(),\n});\n\nexport const Condition = z.object({\n payload_key: z.string().nullish(),\n operator: z.string().nullish(), // eq | neq | gt | gte | lt | lte\n expected_value: z.union([z.number(), z.boolean(), z.string()]).nullish(),\n});\n\nexport const ConditionSet = z.object({\n conditions: z.array(Condition).default([]),\n outcomes: z.array(Outcome).default([]),\n});\n\nexport const Step = z.object({\n key: z.string().nullish(), // optional so the validator, not Zod, reports \"missing key\"\n name: z.string().default(\"\"),\n is_entry: z.boolean().default(false),\n is_terminal: z.boolean().default(false),\n next_step_keys: z.array(z.string()).default([]),\n condition_sets: z.array(ConditionSet).default([]),\n});\n\nexport const EntryRequirement = z.object({\n requirement_type: z.string().nullish(), // entry_cost | eligibility\n value_source: z.string().nullish(), // currency | stat\n currency_key: z.string().nullish(),\n stat_key: z.string().nullish(),\n operator: z.string().nullish(), // gte | lte | eq (eligibility)\n threshold_value: z.union([z.number(), z.boolean()]).nullish(),\n cost_amount: z.number().int().nullish(), // REQUIRED by the admin API for entry_cost\n});\n\nexport const ManifestSpec = z.object({\n slug: z.string(),\n name: z.string(),\n entry_requirements: z.array(EntryRequirement).default([]),\n steps: z.array(Step),\n});\n\nexport const LeaderboardSpec = z.object({\n slug: z.string(),\n name: z.string(),\n stat_key: z.string(), // authored by key; resolved to stat_id at create time\n sort_order: z.string().default(\"desc\"),\n leaderboard_type: z.string().default(\"relative\"),\n reset_type: z.string().nullable().default(null),\n soft_reset_percentage: z.number().nullish(),\n});\n\nexport const Reward = z.object({\n reward_type: z.string().nullish(), // currency | stat | gem\n currency_key: z.string().nullish(),\n stat_key: z.string().nullish(),\n amount: z.number().int().nullish(),\n});\n\nexport const SegmentSpec = z.object({\n label: z.string(),\n reward: Reward,\n probability: z.number().int(),\n can_override: z.boolean().default(false),\n});\n\nexport const WheelSegmentLink = z.object({\n segment_ref: z.string(), // label of a segment defined in this spec\n probability_override: z.number().int().nullish(),\n});\n\nexport const WheelSpec = z.object({\n key_slug: z.string(),\n name: z.string(),\n daily_free_spins: z.number().int().default(1),\n allow_paid_spins: z.boolean().default(false),\n paid_spin_currency_key: z.string().default(\"\"),\n paid_spin_currency_amount: z.number().int().nullish(),\n segments: z.array(WheelSegmentLink).default([]),\n});\n\nexport const EconomySpec = z.object({\n currencies: z.array(CurrencySpec).default([]),\n stats: z.array(StatSpec).default([]),\n manifests: z.array(ManifestSpec).default([]),\n leaderboards: z.array(LeaderboardSpec).default([]),\n segments: z.array(SegmentSpec).default([]),\n wheels: z.array(WheelSpec).default([]),\n});\n\nexport type CurrencySpec = z.infer<typeof CurrencySpec>;\nexport type StatSpec = z.infer<typeof StatSpec>;\nexport type Outcome = z.infer<typeof Outcome>;\nexport type Condition = z.infer<typeof Condition>;\nexport type ConditionSet = z.infer<typeof ConditionSet>;\nexport type Step = z.infer<typeof Step>;\nexport type EntryRequirement = z.infer<typeof EntryRequirement>;\nexport type ManifestSpec = z.infer<typeof ManifestSpec>;\nexport type LeaderboardSpec = z.infer<typeof LeaderboardSpec>;\nexport type Reward = z.infer<typeof Reward>;\nexport type SegmentSpec = z.infer<typeof SegmentSpec>;\nexport type WheelSegmentLink = z.infer<typeof WheelSegmentLink>;\nexport type WheelSpec = z.infer<typeof WheelSpec>;\nexport type EconomySpec = z.infer<typeof EconomySpec>;\n\n/** A single problem found by the validator. `rule` is a stable machine id. */\nexport interface Violation {\n path: string;\n message: string;\n severity: \"error\" | \"warning\";\n rule?: string;\n}\n\nexport interface SpecReport {\n ok: boolean;\n violations: Violation[];\n summary: Record<string, number>;\n}\n","import type { MagicweaveClient } from \"../client.js\";\nimport { currencies } from \"../resources/currencies.js\";\nimport { leaderboards } from \"../resources/leaderboards.js\";\nimport { manifests } from \"../resources/manifests.js\";\nimport { segments } from \"../resources/segments.js\";\nimport { stats } from \"../resources/stats.js\";\nimport { wheels } from \"../resources/wheels.js\";\n\n/**\n * A point-in-time snapshot of every game-layer definition in a project — for\n * backup, diffing, or version control. Mirrors fastmcp's export_definitions:\n * fan out the list reads for all definition types and collect them under one\n * object, in dependency order (currencies/stats first).\n */\nexport interface DefinitionsSnapshot {\n org_id: number;\n project_id: number;\n currencies: Awaited<ReturnType<ReturnType<typeof currencies>[\"list\"]>>;\n stats: Awaited<ReturnType<ReturnType<typeof stats>[\"list\"]>>;\n manifests: Awaited<ReturnType<ReturnType<typeof manifests>[\"list\"]>>;\n leaderboards: Awaited<ReturnType<ReturnType<typeof leaderboards>[\"list\"]>>;\n segments: Awaited<ReturnType<ReturnType<typeof segments>[\"list\"]>>;\n wheels: Awaited<ReturnType<ReturnType<typeof wheels>[\"list\"]>>;\n}\n\nexport async function exportDefinitions(\n client: MagicweaveClient,\n orgId: number,\n projectId: number,\n): Promise<DefinitionsSnapshot> {\n const [currencyList, statList, manifestList, leaderboardList, segmentList, wheelList] =\n await Promise.all([\n currencies(client).list(orgId, projectId),\n stats(client).list(orgId, projectId),\n manifests(client).list(orgId, projectId),\n leaderboards(client).list(orgId, projectId),\n segments(client).list(orgId, projectId),\n wheels(client).list(orgId, projectId),\n ]);\n\n return {\n org_id: orgId,\n project_id: projectId,\n currencies: currencyList,\n stats: statList,\n manifests: manifestList,\n leaderboards: leaderboardList,\n segments: segmentList,\n wheels: wheelList,\n };\n}\n","/**\n * Reference graph over a project's game-layer definitions — ported from\n * magicweave-fastmcp/tools/refgraph.py.\n *\n * The admin API has no \"what references this\" endpoint, but the answer is fully\n * computable from the six list reads: manifests/segments reference currencies and\n * stats BY KEY, leaderboards reference a stat BY numeric stat_id, and wheels\n * reference project segments BY numeric segment_id. We fan out the six reads once\n * and answer inbound-reference (\"blast radius\") queries.\n */\nimport type { MagicweaveClient } from \"../client.js\";\nimport { unwrap } from \"../client.js\";\n\n// Live definitions are dynamic dict shapes here (we only read a few fields).\ntype Def = Record<string, unknown>;\n\nexport interface Reference {\n referencingKind: \"manifest\" | \"leaderboard\" | \"segment\" | \"wheel\";\n id: number | null;\n name: string;\n locus: string;\n}\n\n/** Closest candidate to a mistyped key/slug, or null (difflib-style, cutoff 0.6). */\nexport function didYouMean(needle: string, candidates: string[]): string | null {\n let best: string | null = null;\n let bestRatio = 0;\n for (const c of candidates) {\n const r = similarity(needle, c);\n if (r > bestRatio) {\n bestRatio = r;\n best = c;\n }\n }\n return bestRatio >= 0.6 ? best : null;\n}\n\nfunction similarity(a: string, b: string): number {\n // Approximates Python difflib's SequenceMatcher.ratio (2*M/T) with an LCS-based\n // ratio, which — unlike raw Levenshtein — scores transpositions (\"glod\"/\"gold\")\n // generously, matching the fastmcp did_you_mean behavior.\n if (a === b) return 1;\n if (!a.length || !b.length) return 0;\n return (2 * lcsLength(a, b)) / (a.length + b.length);\n}\n\nfunction lcsLength(a: string, b: string): number {\n const m = a.length;\n const n = b.length;\n const row = new Array<number>(n + 1).fill(0);\n for (let i = 1; i <= m; i++) {\n let prevDiag = 0;\n for (let j = 1; j <= n; j++) {\n const tmp = row[j] as number;\n row[j] =\n a[i - 1] === b[j - 1] ? prevDiag + 1 : Math.max(row[j] as number, row[j - 1] as number);\n prevDiag = tmp;\n }\n }\n return row[n] as number;\n}\n\nfunction str(v: unknown): string | undefined {\n return typeof v === \"string\" && v ? v : undefined;\n}\n\n/** Yield [targetKind, key, locus] for every definition a manifest references. */\nexport function* iterManifestRefs(\n manifest: Def,\n): Generator<[kind: \"currency\" | \"stat\", key: string, locus: string]> {\n for (const req of (manifest.entry_requirements as Def[]) ?? []) {\n if (typeof req !== \"object\" || req === null) continue;\n const ck = str(req.currency_key);\n if (ck) yield [\"currency\", ck, \"entry requirement\"];\n const sk = str(req.stat_key);\n if (sk) yield [\"stat\", sk, \"entry requirement\"];\n }\n for (const step of (manifest.steps as Def[]) ?? []) {\n if (typeof step !== \"object\" || step === null) continue;\n const skey = str(step.key) ?? \"?\";\n for (const cs of (step.condition_sets as Def[]) ?? []) {\n if (typeof cs !== \"object\" || cs === null) continue;\n for (const out of (cs.outcomes as Def[]) ?? []) {\n if (typeof out !== \"object\" || out === null) continue;\n const target = out.reward_target;\n if (target === \"currency\") {\n const ck = str(out.currency_key);\n if (ck) yield [\"currency\", ck, `outcome in step '${skey}'`];\n } else if (target === \"stat\") {\n const sk = str(out.stat_key);\n if (sk) yield [\"stat\", sk, `outcome in step '${skey}'`];\n }\n }\n }\n }\n}\n\nexport function* iterSegmentRefs(\n segment: Def,\n): Generator<[kind: \"currency\" | \"stat\", key: string, locus: string]> {\n const reward = (segment.reward as Def) ?? {};\n if (reward.reward_type === \"currency\") {\n const ck = str(reward.currency_key);\n if (ck) yield [\"currency\", ck, \"segment reward\"];\n } else if (reward.reward_type === \"stat\") {\n const sk = str(reward.stat_key);\n if (sk) yield [\"stat\", sk, \"segment reward\"];\n }\n}\n\n/** A wheel list item is { effective, wheel_config } (or already flat). */\nfunction wheelViews(wheel: Def): [effective: Def, config: Def] {\n const eff = (wheel.effective as Def) ?? {};\n const cfg = (wheel.wheel_config as Def) ?? {};\n if (Object.keys(eff).length === 0 && Object.keys(cfg).length === 0) return [wheel, wheel];\n return [eff, cfg];\n}\n\nexport class ProjectGraph {\n constructor(\n readonly currencies: Def[],\n readonly stats: Def[],\n readonly manifests: Def[],\n readonly leaderboards: Def[],\n readonly segments: Def[],\n readonly wheels: Def[],\n ) {}\n\n currencyKeys(): string[] {\n return this.currencies.map((c) => str(c.key)).filter((k): k is string => !!k);\n }\n statKeys(): string[] {\n return this.stats.map((s) => str(s.key)).filter((k): k is string => !!k);\n }\n segmentIds(): number[] {\n return this.segments.map((s) => s.id).filter((v): v is number => typeof v === \"number\");\n }\n\n private statIdForKey(key: string): number | null {\n for (const s of this.stats) if (s.key === key) return (s.id as number) ?? null;\n return null;\n }\n\n /** Inbound references (blast radius) to a currency/stat (by key) or segment (by id). */\n referencesTo(kind: \"currency\" | \"stat\" | \"segment\", ref: string | number): Reference[] {\n if (kind === \"segment\") return this.refsToSegment(Number(ref));\n return this.refsToDefinition(kind, String(ref));\n }\n\n private refsToDefinition(targetKind: \"currency\" | \"stat\", key: string): Reference[] {\n const found: Reference[] = [];\n for (const m of this.manifests) {\n for (const [tk, refKey, locus] of iterManifestRefs(m)) {\n if (tk === targetKind && refKey === key) {\n found.push({\n referencingKind: \"manifest\",\n id: (m.id as number) ?? null,\n name: str(m.slug) ?? \"?\",\n locus,\n });\n }\n }\n }\n for (const seg of this.segments) {\n for (const [tk, refKey] of iterSegmentRefs(seg)) {\n if (tk === targetKind && refKey === key) {\n found.push({\n referencingKind: \"segment\",\n id: (seg.id as number) ?? null,\n name: str(seg.label) ?? \"?\",\n locus: \"segment reward\",\n });\n }\n }\n }\n if (targetKind === \"currency\") {\n for (const w of this.wheels) {\n const [eff, cfg] = wheelViews(w);\n const paid = str(cfg.paid_spin_currency_key) ?? str(eff.paid_spin_currency_key);\n if (paid === key) {\n found.push({\n referencingKind: \"wheel\",\n id: (cfg.id as number) ?? null,\n name: str(cfg.key_slug) ?? str(eff.key_slug) ?? \"?\",\n locus: \"paid-spin currency\",\n });\n }\n }\n }\n if (targetKind === \"stat\") {\n const statId = this.statIdForKey(key);\n if (statId !== null) {\n for (const lb of this.leaderboards) {\n if (lb.stat_id === statId) {\n found.push({\n referencingKind: \"leaderboard\",\n id: (lb.id as number) ?? null,\n name: str(lb.slug) ?? \"?\",\n locus: \"ranked stat\",\n });\n }\n }\n }\n }\n return found;\n }\n\n private refsToSegment(segmentId: number): Reference[] {\n const found: Reference[] = [];\n for (const w of this.wheels) {\n const [eff, cfg] = wheelViews(w);\n const links = ((eff.segments as Def[]) ?? (cfg.segments as Def[]) ?? []) as Def[];\n if (links.some((l) => l.segment_id === segmentId)) {\n found.push({\n referencingKind: \"wheel\",\n id: (cfg.id as number) ?? null,\n name: str(cfg.key_slug) ?? str(eff.key_slug) ?? \"?\",\n locus: \"wheel segment link\",\n });\n }\n }\n return found;\n }\n}\n\n/** Fan out the six list reads and build the graph. */\nexport async function buildReferenceGraph(\n client: MagicweaveClient,\n orgId: number,\n projectId: number,\n): Promise<ProjectGraph> {\n const path = { org_id: orgId, project_id: projectId };\n const pick = (obj: unknown, key: string): Def[] => {\n const arr = (obj as Record<string, unknown>)?.[key];\n return Array.isArray(arr) ? (arr as Def[]) : [];\n };\n\n const [currencies, stats, manifests, leaderboards, segments, wheels] = await Promise.all([\n unwrap(client.raw.GET(\"/currency-definitions/{org_id}/{project_id}/\", { params: { path } })),\n unwrap(client.raw.GET(\"/stat-definitions/{org_id}/{project_id}/\", { params: { path } })),\n unwrap(client.raw.GET(\"/game-manifests/{org_id}/{project_id}/\", { params: { path } })),\n unwrap(client.raw.GET(\"/leaderboards/{org_id}/{project_id}/\", { params: { path } })),\n unwrap(client.raw.GET(\"/spin-wheel/{org_id}/{project_id}/segments/\", { params: { path } })),\n unwrap(client.raw.GET(\"/spin-wheel/{org_id}/{project_id}/wheels/\", { params: { path } })),\n ]);\n\n return new ProjectGraph(\n pick(currencies, \"currency_definitions\"),\n pick(stats, \"stat_definitions\"),\n pick(manifests, \"game_manifests\"),\n pick(leaderboards, \"leaderboards\"),\n pick(segments, \"segments\"),\n pick(wheels, \"wheels\"),\n );\n}\n","/**\n * validateSpec — check a whole EconomySpec for EVERY violation at once, and\n * impactScan — the blast radius of a live definition. Ported from\n * magicweave-fastmcp/tools/insight.py (the deterministic economy linter).\n *\n * The rules run on the parsed EconomySpec (Zod applies defaults first). Structural\n * problems that Zod itself rejects (missing key/name) surface as `schema`\n * violations so the caller still gets one report with everything.\n */\nimport type { z } from \"zod\";\nimport type { MagicweaveClient } from \"../client.js\";\nimport {\n EconomySpec,\n type LeaderboardSpec,\n type ManifestSpec,\n type Reward,\n type SpecReport,\n type Violation,\n type WheelSpec,\n} from \"../schemas/spec.js\";\nimport { buildReferenceGraph, didYouMean, iterManifestRefs, iterSegmentRefs } from \"./refgraph.js\";\n\nconst STAT_TYPES = [\"integer\", \"float\", \"boolean\"];\nconst SORT_ORDERS = [\"desc\", \"asc\"];\nconst LEADERBOARD_TYPES = [\"relative\", \"absolute\"];\nconst RESET_TYPES = [\"soft\", \"hard\"];\nconst REWARD_TYPES = [\"currency\", \"stat\", \"gem\"];\nconst REQUIREMENT_TYPES = [\"entry_cost\", \"eligibility\"];\nconst VALUE_SOURCES = [\"currency\", \"stat\"];\nconst OUTCOME_REWARD_TYPES = [\"fixed\", \"variable\"];\nconst REWARD_TARGETS = [\"currency\", \"stat\", \"gem\"];\nconst OPERATIONS = [\"add\", \"subtract\", \"set\", \"multiply\"];\nconst OPERATORS = [\"eq\", \"neq\", \"gt\", \"gte\", \"lt\", \"lte\"];\n// an arithmetic operator surrounded by spaces inside a string expected_value —\n// \"day + 2\" is an expression; \"power-up\" is a legitimate literal.\nconst EXPR_IN_VALUE = /\\s[-+*/]\\s/;\nconst FORMULA_TOKEN = /[A-Za-z_][A-Za-z0-9_]*/g;\nconst FORMULA_NOISE = new Set([\n \"max\",\n \"min\",\n \"abs\",\n \"round\",\n \"floor\",\n \"ceil\",\n \"sqrt\",\n \"pow\",\n \"if\",\n \"else\",\n \"and\",\n \"or\",\n \"not\",\n \"true\",\n \"false\",\n]);\n\ntype Spec = z.infer<typeof EconomySpec>;\n\n/** Validate a whole economy spec; returns every violation in one pass. */\nexport function validateSpec(input: unknown): SpecReport {\n const parsed = EconomySpec.safeParse(input);\n if (!parsed.success) {\n const violations: Violation[] = parsed.error.issues.map((issue) => ({\n path: issue.path.join(\".\"),\n message: issue.message,\n severity: \"error\",\n rule: \"schema\",\n }));\n return report(violations);\n }\n return report(validateEconomy(parsed.data));\n}\n\nfunction report(violations: Violation[]): SpecReport {\n const errors = violations.filter((v) => v.severity === \"error\").length;\n const warnings = violations.length - errors;\n return { ok: errors === 0, violations, summary: { errors, warnings } };\n}\n\nfunction validateEconomy(spec: Spec): Violation[] {\n const out: Violation[] = [];\n const currencyKeys = new Set(spec.currencies.map((c) => c.key));\n const statKeys = new Set(spec.stats.map((s) => s.key));\n const segmentLabels = new Set(spec.segments.map((s) => s.label));\n\n const bad = (\n path: string,\n message: string,\n severity: \"error\" | \"warning\" = \"error\",\n rule?: string,\n ) => out.push({ path, message, severity, rule });\n\n const refOk = (kind: \"currency\" | \"stat\", key: string, path: string) => {\n const pool = kind === \"currency\" ? currencyKeys : statKeys;\n if (!pool.has(key)) {\n const hint = didYouMean(key, [...pool].sort());\n bad(\n path,\n `references unknown ${kind} '${key}'.${hint ? ` Did you mean '${hint}'?` : \"\"}`,\n \"error\",\n \"unknown-ref\",\n );\n }\n };\n\n // duplicate keys\n for (const [poolName, items] of [\n [\"currencies\", spec.currencies],\n [\"stats\", spec.stats],\n ] as const) {\n const seen = new Set<string>();\n items.forEach((item, i) => {\n if (seen.has(item.key))\n bad(`${poolName}[${i}].key`, `duplicate key '${item.key}'.`, \"error\", \"duplicate-key\");\n seen.add(item.key);\n });\n }\n\n spec.stats.forEach((s, i) => {\n if (!STAT_TYPES.includes(s.stat_type)) {\n bad(\n `stats[${i}].stat_type`,\n `must be one of ${STAT_TYPES.join(\", \")}.`,\n \"error\",\n \"stat-type\",\n );\n }\n });\n\n spec.manifests.forEach((m, i) => {\n const stepsErr = validateSteps(m);\n if (stepsErr) bad(`manifests[${i}].steps`, stepsErr, \"error\", \"steps-shape\");\n for (const [tk, key, locus] of iterManifestRefs(m as unknown as Record<string, unknown>)) {\n refOk(tk, key, `manifests[${i}] (${locus})`);\n }\n validateManifestInternals(bad, i, m);\n validateEntryRequirements(bad, i, m);\n lintReachability(bad, i, m);\n lintFormulaKeys(bad, i, m);\n });\n\n spec.leaderboards.forEach((lb, i) => {\n const lbErr = validateLeaderboardFields(lb);\n if (lbErr) bad(`leaderboards[${i}]`, lbErr, \"error\", \"leaderboard-fields\");\n if (!statKeys.has(lb.stat_key)) {\n const hint = didYouMean(lb.stat_key, [...statKeys].sort());\n bad(\n `leaderboards[${i}].stat_key`,\n `unknown stat '${lb.stat_key}'.${hint ? ` Did you mean '${hint}'?` : \"\"}`,\n \"error\",\n \"unknown-ref\",\n );\n }\n });\n\n spec.segments.forEach((seg, i) => {\n const rErr = validateReward(seg.reward);\n if (rErr) bad(`segments[${i}].reward`, rErr, \"error\", \"reward-shape\");\n for (const [tk, key] of iterSegmentRefs({ reward: seg.reward } as Record<string, unknown>)) {\n refOk(tk, key, `segments[${i}].reward`);\n }\n if (seg.reward.reward_type === \"gem\") {\n bad(\n `segments[${i}].reward.reward_type`,\n \"gem rewards are only allowed on network catalog segments — project segments may reward currency only. Link network gem segments into the wheel at authoring time (get_segment_catalog).\",\n \"error\",\n \"gem-project-segment\",\n );\n }\n });\n\n spec.wheels.forEach((w, i) => validateWheelSpec(out, i, w, spec, currencyKeys, segmentLabels));\n\n lintPhantomStats(bad, spec);\n lintOrphanCurrencies(bad, spec);\n return out;\n}\n\n// --- ported helper validators (approximations of the fastmcp fail-fast helpers) ---\n\nfunction validateSteps(m: ManifestSpec): string | null {\n const steps = m.steps ?? [];\n if (steps.length === 0) return \"manifest has no steps.\";\n const keys = steps.map((s) => s.key).filter((k): k is string => !!k);\n if (keys.length !== steps.length) return \"every step must have a key.\";\n if (new Set(keys).size !== keys.length) return \"step keys must be unique.\";\n const entries = steps.filter((s) => s.is_entry);\n if (entries.length !== 1) return `exactly one step must be is_entry (found ${entries.length}).`;\n if (!steps.some((s) => s.is_terminal)) return \"at least one step must be is_terminal.\";\n const keySet = new Set(keys);\n for (const s of steps) {\n for (const nk of s.next_step_keys ?? []) {\n if (!keySet.has(nk)) return `step '${s.key}' points to unknown next step '${nk}'.`;\n }\n }\n return null;\n}\n\nfunction validateLeaderboardFields(lb: LeaderboardSpec): string | null {\n if (!SORT_ORDERS.includes(lb.sort_order))\n return `sort_order must be one of ${SORT_ORDERS.join(\", \")}.`;\n if (!LEADERBOARD_TYPES.includes(lb.leaderboard_type))\n return `leaderboard_type must be one of ${LEADERBOARD_TYPES.join(\", \")}.`;\n if (lb.reset_type != null && !RESET_TYPES.includes(lb.reset_type))\n return `reset_type must be one of ${RESET_TYPES.join(\", \")} or null.`;\n if (lb.reset_type === \"soft\") {\n const p = lb.soft_reset_percentage;\n if (p == null || p <= 0 || p > 100)\n return \"soft reset requires soft_reset_percentage in (0, 100].\";\n }\n return null;\n}\n\nfunction validateReward(reward: Reward): string | null {\n if (!reward.reward_type) return \"reward is missing reward_type (currency | stat | gem).\";\n if (!REWARD_TYPES.includes(reward.reward_type))\n return `reward_type must be one of ${REWARD_TYPES.join(\", \")}.`;\n if (reward.reward_type === \"currency\" && !reward.currency_key)\n return \"currency reward must set currency_key.\";\n if (reward.reward_type === \"stat\" && !reward.stat_key) return \"stat reward must set stat_key.\";\n if (reward.amount == null || reward.amount < 1) return \"reward amount must be an integer >= 1.\";\n return null;\n}\n\ntype Bad = (path: string, message: string, severity?: \"error\" | \"warning\", rule?: string) => void;\n\nfunction validateEntryRequirements(bad: Bad, i: number, m: ManifestSpec): void {\n m.entry_requirements.forEach((req, j) => {\n const base = `manifests[${i}].entry_requirements[${j}]`;\n if (!req.requirement_type || !REQUIREMENT_TYPES.includes(req.requirement_type)) {\n bad(\n `${base}.requirement_type`,\n `must be one of ${REQUIREMENT_TYPES.join(\", \")} (got ${JSON.stringify(req.requirement_type)}).`,\n \"error\",\n \"entry-requirement\",\n );\n }\n if (!req.value_source || !VALUE_SOURCES.includes(req.value_source)) {\n bad(\n `${base}.value_source`,\n `is required and must be one of ${VALUE_SOURCES.join(\", \")}.`,\n \"error\",\n \"entry-requirement\",\n );\n }\n if (req.requirement_type === \"entry_cost\" && (req.cost_amount == null || req.cost_amount < 1)) {\n bad(\n `${base}.cost_amount`,\n \"cost_amount (integer >= 1) is required for entry_cost.\",\n \"error\",\n \"entry-requirement\",\n );\n }\n });\n}\n\nfunction validateManifestInternals(bad: Bad, i: number, m: ManifestSpec): void {\n m.steps.forEach((step, j) => {\n step.condition_sets.forEach((cs, k) => {\n const baseCs = `manifests[${i}].steps[${j}].condition_sets[${k}]`;\n cs.conditions.forEach((cond, c) => {\n if (cond.operator != null && !OPERATORS.includes(cond.operator)) {\n bad(\n `${baseCs}.conditions[${c}].operator`,\n `must be one of ${OPERATORS.join(\", \")}.`,\n \"error\",\n \"condition-operator\",\n );\n }\n if (typeof cond.expected_value === \"string\" && EXPR_IN_VALUE.test(cond.expected_value)) {\n bad(\n `${baseCs}.conditions[${c}].expected_value`,\n `'${cond.expected_value}' looks like an expression — expected_value must be a literal; compute the value client-side and send the result in the record payload.`,\n \"warning\",\n \"expected-value-literal\",\n );\n }\n });\n cs.outcomes.forEach((oc, o) => {\n const base = `${baseCs}.outcomes[${o}]`;\n if (!oc.reward_type)\n bad(base, \"outcome is missing reward_type (fixed | variable).\", \"error\", \"outcome-enum\");\n else if (!OUTCOME_REWARD_TYPES.includes(oc.reward_type))\n bad(\n `${base}.reward_type`,\n `must be one of ${OUTCOME_REWARD_TYPES.join(\", \")}.`,\n \"error\",\n \"outcome-enum\",\n );\n if (!oc.reward_target)\n bad(\n base,\n \"outcome is missing reward_target (currency | stat | gem).\",\n \"error\",\n \"outcome-enum\",\n );\n else if (!REWARD_TARGETS.includes(oc.reward_target))\n bad(\n `${base}.reward_target`,\n `must be one of ${REWARD_TARGETS.join(\", \")}.`,\n \"error\",\n \"outcome-enum\",\n );\n if (oc.operation != null && !OPERATIONS.includes(oc.operation))\n bad(\n `${base}.operation`,\n `must be one of ${OPERATIONS.join(\", \")}.`,\n \"error\",\n \"outcome-enum\",\n );\n\n const hasFormula = oc.formula != null && !!oc.formula.formula;\n if (oc.reward_type === \"fixed\") {\n if (oc.value == null) bad(base, \"fixed outcome must set value.\", \"error\", \"pairing\");\n if (hasFormula)\n bad(\n base,\n \"fixed outcome must not carry a formula — use reward_type 'variable' to evaluate a formula.\",\n \"error\",\n \"pairing\",\n );\n } else if (oc.reward_type === \"variable\") {\n if (!hasFormula)\n bad(base, \"variable outcome must set formula.formula.\", \"error\", \"pairing\");\n if (oc.value != null)\n bad(\n base,\n \"variable outcome must not set value — use reward_type 'fixed' to award a fixed value.\",\n \"error\",\n \"pairing\",\n );\n }\n if (\n oc.reward_target === \"gem\" &&\n oc.reward_type === \"variable\" &&\n oc.formula != null &&\n oc.formula.max == null\n ) {\n bad(\n `${base}.formula.max`,\n \"uncapped variable gem award — set formula.max (gems are the network-wide premium wallet).\",\n \"warning\",\n \"uncapped-gem\",\n );\n }\n });\n });\n });\n}\n\nfunction validateWheelSpec(\n out: Violation[],\n i: number,\n wheel: WheelSpec,\n spec: Spec,\n currencyKeys: Set<string>,\n segmentLabels: Set<string>,\n): void {\n const probByLabel = new Map(spec.segments.map((s) => [s.label, s.probability]));\n let total = 0;\n wheel.segments.forEach((link, j) => {\n if (!segmentLabels.has(link.segment_ref)) {\n const hint = didYouMean(link.segment_ref, [...segmentLabels].sort());\n out.push({\n path: `wheels[${i}].segments[${j}].segment_ref`,\n message: `unknown segment '${link.segment_ref}'.${hint ? ` Did you mean '${hint}'?` : \"\"}`,\n severity: \"error\",\n rule: \"segment-ref\",\n });\n return;\n }\n total += link.probability_override ?? probByLabel.get(link.segment_ref) ?? 0;\n });\n if (wheel.segments.length && total !== 100) {\n out.push({\n path: `wheels[${i}].segments`,\n message: `effective probabilities total ${total}, must be exactly 100.`,\n severity: \"error\",\n rule: \"probability-total\",\n });\n }\n if (wheel.allow_paid_spins) {\n if (!currencyKeys.has(wheel.paid_spin_currency_key)) {\n const hint = didYouMean(wheel.paid_spin_currency_key, [...currencyKeys].sort());\n out.push({\n path: `wheels[${i}].paid_spin_currency_key`,\n message: `unknown currency '${wheel.paid_spin_currency_key}'.${hint ? ` Did you mean '${hint}'?` : \"\"}`,\n severity: \"error\",\n rule: \"unknown-ref\",\n });\n }\n if (wheel.paid_spin_currency_amount == null || wheel.paid_spin_currency_amount < 1) {\n out.push({\n path: `wheels[${i}].paid_spin_currency_amount`,\n message: \"must be an integer >= 1 when allow_paid_spins is true.\",\n severity: \"error\",\n rule: \"paid-spin\",\n });\n }\n // Money printer: expected payout in the paid currency vs the spin cost.\n const rewardByLabel = new Map(spec.segments.map((s) => [s.label, s.reward]));\n const amt = wheel.paid_spin_currency_amount;\n if (\n currencyKeys.has(wheel.paid_spin_currency_key) &&\n amt &&\n amt >= 1 &&\n wheel.segments.length\n ) {\n let ev = 0;\n for (const link of wheel.segments) {\n const reward = rewardByLabel.get(link.segment_ref);\n if (!reward || reward.reward_type !== \"currency\" || !reward.amount) continue;\n if (reward.currency_key !== wheel.paid_spin_currency_key) continue;\n const prob = link.probability_override ?? probByLabel.get(link.segment_ref) ?? 0;\n ev += (prob / 100) * reward.amount;\n }\n if (ev >= amt) {\n out.push({\n path: `wheels[${i}].paid_spin_currency_amount`,\n message: `money printer: expected payout per paid spin is ${ev.toFixed(1)} '${wheel.paid_spin_currency_key}' but a spin costs ${amt} — raise the cost or lower the payouts.`,\n severity: \"error\",\n rule: \"money-printer\",\n });\n }\n }\n }\n}\n\n// --- economy lints (advisory warnings) ---\n\nfunction payloadKeyCounts(m: ManifestSpec): Map<string, number> {\n const counts = new Map<string, number>();\n const inc = (k: string) => counts.set(k, (counts.get(k) ?? 0) + 1);\n for (const step of m.steps) {\n for (const cs of step.condition_sets) {\n for (const cond of cs.conditions) if (cond.payload_key) inc(cond.payload_key);\n for (const oc of cs.outcomes) {\n if (oc.formula?.formula) {\n for (const tok of oc.formula.formula.match(FORMULA_TOKEN) ?? []) {\n if (!FORMULA_NOISE.has(tok.toLowerCase())) inc(tok);\n }\n }\n }\n }\n }\n return counts;\n}\n\nfunction lintReachability(bad: Bad, i: number, m: ManifestSpec): void {\n const stepsByKey = new Map(m.steps.filter((s) => s.key).map((s) => [s.key as string, s]));\n const entries = m.steps.filter((s) => s.is_entry && s.key).map((s) => s.key as string);\n if (entries.length !== 1) return;\n const seen = new Set([entries[0] as string]);\n const frontier = [entries[0] as string];\n while (frontier.length) {\n const step = stepsByKey.get(frontier.pop() as string);\n for (const nk of step?.next_step_keys ?? []) {\n if (stepsByKey.has(nk) && !seen.has(nk)) {\n seen.add(nk);\n frontier.push(nk);\n }\n }\n }\n m.steps.forEach((s, j) => {\n if (s.key && !seen.has(s.key)) {\n bad(\n `manifests[${i}].steps[${j}]`,\n `step '${s.key}' is unreachable from the entry step.`,\n \"warning\",\n \"unreachable-step\",\n );\n }\n });\n}\n\nfunction lintFormulaKeys(bad: Bad, i: number, m: ManifestSpec): void {\n const counts = payloadKeyCounts(m);\n for (const [key, n] of counts) {\n if (n !== 1) continue;\n const others = [...counts.keys()].filter((k) => k !== key);\n const match = didYouMean(key, others);\n // tighter cutoff than the default did-you-mean: a real typo is very close.\n if (match && similarityCloseEnough(key, match)) {\n bad(\n `manifests[${i}]`,\n `payload key '${key}' is used once — did you mean '${match}'?`,\n \"warning\",\n \"payload-typo\",\n );\n }\n }\n}\n\nfunction similarityCloseEnough(a: string, b: string): boolean {\n // approximate difflib cutoff 0.85 used by the fastmcp payload-typo lint\n const maxLen = Math.max(a.length, b.length) || 1;\n let same = 0;\n const bl = [...b];\n for (const ch of a) {\n const idx = bl.indexOf(ch);\n if (idx !== -1) {\n same++;\n bl.splice(idx, 1);\n }\n }\n return (\n (2 * same) / (a.length + b.length) >= 0.85 && a !== b && Math.abs(a.length - b.length) <= maxLen\n );\n}\n\nfunction lintPhantomStats(bad: Bad, spec: Spec): void {\n const written = new Set<string>();\n for (const m of spec.manifests)\n for (const s of m.steps)\n for (const cs of s.condition_sets)\n for (const oc of cs.outcomes) if (oc.stat_key) written.add(oc.stat_key);\n const ranked = new Set(spec.leaderboards.map((lb) => lb.stat_key));\n const rewarded = new Set(\n spec.segments.map((s) => s.reward.stat_key).filter((k): k is string => !!k),\n );\n const payloadKeys = new Set<string>();\n for (const m of spec.manifests) for (const k of payloadKeyCounts(m).keys()) payloadKeys.add(k);\n const referenced = new Set([...written, ...ranked, ...rewarded]);\n spec.stats.forEach((st, i) => {\n if (!referenced.has(st.key) && payloadKeys.has(st.key)) {\n bad(\n `stats[${i}]`,\n `'${st.key}' looks like a runtime payload key, not a stat — no outcome writes it and no leaderboard ranks it. Payload keys are read from the record payload and need no definition.`,\n \"warning\",\n \"phantom-stat\",\n );\n }\n });\n}\n\nfunction lintOrphanCurrencies(bad: Bad, spec: Spec): void {\n const sources = new Set<string>();\n const sinks = new Set<string>();\n for (const m of spec.manifests) {\n for (const req of m.entry_requirements) if (req.currency_key) sinks.add(req.currency_key);\n for (const s of m.steps)\n for (const cs of s.condition_sets)\n for (const oc of cs.outcomes)\n if (oc.reward_target === \"currency\" && oc.currency_key)\n (oc.operation === \"subtract\" ? sinks : sources).add(oc.currency_key);\n }\n for (const seg of spec.segments)\n if (seg.reward.reward_type === \"currency\" && seg.reward.currency_key)\n sources.add(seg.reward.currency_key);\n for (const w of spec.wheels)\n if (w.allow_paid_spins && w.paid_spin_currency_key) sinks.add(w.paid_spin_currency_key);\n spec.currencies.forEach((c, i) => {\n if (!sources.has(c.key))\n bad(\n `currencies[${i}]`,\n `'${c.key}' has no source — nothing awards it.`,\n \"warning\",\n \"orphan-currency\",\n );\n if (!sinks.has(c.key))\n bad(\n `currencies[${i}]`,\n `'${c.key}' has no sink — add an entry cost, a subtract outcome, or paid wheel spins.`,\n \"warning\",\n \"orphan-currency\",\n );\n });\n}\n\n// --- impact scan (blast radius) ---\n\nexport interface ImpactReport {\n target: { kind: \"currency\" | \"stat\" | \"segment\"; ref: string | number };\n exists: boolean;\n referenceCount: number;\n byKind: Record<string, number>;\n references: Array<{ kind: string; id: number | null; name: string; locus: string }>;\n breaking: boolean;\n}\n\n/** What references a live definition — the maintenance harness's \"impact-scan before you edit\". */\nexport async function impactScan(\n client: MagicweaveClient,\n orgId: number,\n projectId: number,\n kind: \"currency\" | \"stat\" | \"segment\",\n ref: string | number,\n): Promise<ImpactReport> {\n const graph = await buildReferenceGraph(client, orgId, projectId);\n const exists =\n kind === \"currency\"\n ? graph.currencyKeys().includes(String(ref))\n : kind === \"stat\"\n ? graph.statKeys().includes(String(ref))\n : graph.segmentIds().includes(Number(ref));\n\n const refs = graph.referencesTo(kind, ref);\n const byKind: Record<string, number> = {};\n for (const r of refs) byKind[r.referencingKind] = (byKind[r.referencingKind] ?? 0) + 1;\n\n return {\n target: { kind, ref },\n exists,\n referenceCount: refs.length,\n byKind,\n references: refs.map((r) => ({\n kind: r.referencingKind,\n id: r.id,\n name: r.name,\n locus: r.locus,\n })),\n breaking: refs.length > 0,\n };\n}\n"],"mappings":"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","names":["createOpenapiClient","currencies","stats","manifests","leaderboards","segments","wheels"]}