{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/registry/schema.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,KAAK,MAAM,EAAQ,MAAM,mBAAmB,CAAC;AAUtD,eAAO,MAAM,6BAA6B,uOAKxC,CAAC;AAEH,eAAO,MAAM,mBAAmB;IAC/B,oDAAoD;;IAEpD,kCAAkC;;IAElC,+BAA+B;;IAE/B,wBAAwB;;IAExB,0CAA0C;;IAE1C,2CAA2C;;IAE3C,6BAA6B;;EAE5B,CAAC;AAEH,eAAO,MAAM,0BAA0B,oLAIrC,CAAC;AAEH,eAAO,MAAM,0BAA0B,+mBAarC,CAAC;AAEH,eAAO,MAAM,2BAA2B;;;;;EAKtC,CAAC;AAEH,eAAO,MAAM,sBAAsB;IAClC,8DAA8D;;IAE9D,0BAA0B;;IAE1B,mEAAiE;;IAEjE,iCAAiC;;IAEjC,qBAAqB;;IAErB,yCAAyC;;;;;;;IAEzC,sCAAsC;;QAzDtC,oDAAoD;;QAEpD,kCAAkC;;QAElC,+BAA+B;;QAE/B,wBAAwB;;QAExB,0CAA0C;;QAE1C,2CAA2C;;QAE3C,6BAA6B;;;EA+C5B,CAAC;AAEH,eAAO,MAAM,cAAc;IAC1B,uCAAuC;;IAEvC,6BAA6B;;IAE7B,6DAA6D;;;QArB7D,8DAA8D;;QAE9D,0BAA0B;;QAE1B,mEAAiE;;QAEjE,iCAAiC;;QAEjC,qBAAqB;;QAErB,yCAAyC;;;;;;;QAEzC,sCAAsC;;YAzDtC,oDAAoD;;YAEpD,kCAAkC;;YAElC,+BAA+B;;YAE/B,wBAAwB;;YAExB,0CAA0C;;YAE1C,2CAA2C;;YAE3C,6BAA6B;;;;EAyD5B,CAAC;AAYH,MAAM,MAAM,aAAa,GAAG,MAAM,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAC/D,MAAM,MAAM,gBAAgB,GAAG,MAAM,CAAC,OAAO,sBAAsB,CAAC,CAAC;AACrE,MAAM,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,cAAc,CAAC,CAAC;AAMrD,MAAM,MAAM,wBAAwB,GAAG;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,QAAQ,EAAE,QAAQ,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC;AAE1G;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,OAAO,GAAG,wBAAwB,CAWvE","sourcesContent":["/**\n * WS15: Catwalk-style provider/model registry schema.\n *\n * Registry JSON schema defined with @sinclair/typebox (matches existing\n * @zhachory1/mewrite-ai conventions — ajv + typebox, no zod dependency).\n *\n * Validation: use validateRegistry() which returns a typed result.\n */\n\nimport { type Static, Type } from \"@sinclair/typebox\";\nimport AjvModule from \"ajv\";\n\nconst Ajv = (AjvModule as any).default ?? AjvModule;\nconst ajv = new Ajv({ allErrors: true });\n\n// ---------------------------------------------------------------------------\n// Sub-schemas\n// ---------------------------------------------------------------------------\n\nexport const RegistryModelCapabilitySchema = Type.Union([\n\tType.Literal(\"tools\"),\n\tType.Literal(\"vision\"),\n\tType.Literal(\"cache\"),\n\tType.Literal(\"reasoning\"),\n]);\n\nexport const RegistryModelSchema = Type.Object({\n\t/** Canonical model ID (e.g. \"claude-sonnet-4-5\") */\n\tid: Type.String({ minLength: 1 }),\n\t/** Human-readable display name */\n\tdisplayName: Type.String({ minLength: 1 }),\n\t/** Context window in tokens */\n\tcontextWindow: Type.Number({ minimum: 1 }),\n\t/** Max output tokens */\n\tmaxOutputTokens: Type.Optional(Type.Number({ minimum: 1 })),\n\t/** Input cost per million tokens (USD) */\n\tinputCostPerMtok: Type.Optional(Type.Number({ minimum: 0 })),\n\t/** Output cost per million tokens (USD) */\n\toutputCostPerMtok: Type.Optional(Type.Number({ minimum: 0 })),\n\t/** Supported capabilities */\n\tcapabilities: Type.Optional(Type.Array(RegistryModelCapabilitySchema)),\n});\n\nexport const RegistryProviderAuthSchema = Type.Union([\n\tType.Literal(\"api-key\"),\n\tType.Literal(\"oauth\"),\n\tType.Literal(\"none\"),\n]);\n\nexport const RegistryProviderKindSchema = Type.Union([\n\tType.Literal(\"anthropic\"),\n\tType.Literal(\"openai\"),\n\tType.Literal(\"google\"),\n\tType.Literal(\"openrouter\"),\n\tType.Literal(\"mistral\"),\n\tType.Literal(\"bedrock\"),\n\tType.Literal(\"gemini-cli\"),\n\tType.Literal(\"vertex\"),\n\tType.Literal(\"xai\"),\n\tType.Literal(\"groq\"),\n\tType.Literal(\"cerebras\"),\n\tType.Literal(\"other\"),\n]);\n\nexport const RegistryProviderOAuthSchema = Type.Object({\n\tauthorizationUrl: Type.String({ minLength: 1 }),\n\ttokenUrl: Type.String({ minLength: 1 }),\n\tclientId: Type.String({ minLength: 1 }),\n\tscopes: Type.Array(Type.String()),\n});\n\nexport const RegistryProviderSchema = Type.Object({\n\t/** Unique provider identifier (e.g. \"anthropic\", \"openai\") */\n\tid: Type.String({ minLength: 1 }),\n\t/** Human-readable name */\n\tname: Type.String({ minLength: 1 }),\n\t/** Provider API kind — maps to @zhachory1/mewrite-ai Api type */\n\tkind: RegistryProviderKindSchema,\n\t/** Optional override base URL */\n\tbaseUrl: Type.Optional(Type.String({ minLength: 1 })),\n\t/** Auth mechanism */\n\tauth: RegistryProviderAuthSchema,\n\t/** OAuth config when auth === \"oauth\" */\n\toauth: Type.Optional(RegistryProviderOAuthSchema),\n\t/** Models offered by this provider */\n\tmodels: Type.Array(RegistryModelSchema),\n});\n\nexport const RegistrySchema = Type.Object({\n\t/** Semver of this registry snapshot */\n\tversion: Type.String({ minLength: 1 }),\n\t/** Channel: stable | beta */\n\tchannel: Type.Optional(Type.Union([Type.Literal(\"stable\"), Type.Literal(\"beta\")])),\n\t/** ISO-8601 timestamp of when this registry was published */\n\tpublishedAt: Type.Optional(Type.String()),\n\tproviders: Type.Array(RegistryProviderSchema),\n});\n\n// ---------------------------------------------------------------------------\n// Compiled validator\n// ---------------------------------------------------------------------------\n\nconst validate = ajv.compile(RegistrySchema);\n\n// ---------------------------------------------------------------------------\n// Exported types\n// ---------------------------------------------------------------------------\n\nexport type RegistryModel = Static<typeof RegistryModelSchema>;\nexport type RegistryProvider = Static<typeof RegistryProviderSchema>;\nexport type Registry = Static<typeof RegistrySchema>;\n\n// ---------------------------------------------------------------------------\n// Validation helper\n// ---------------------------------------------------------------------------\n\nexport type RegistryValidationResult = { ok: true; registry: Registry } | { ok: false; errors: string[] };\n\n/**\n * Validate a raw unknown value against the registry schema.\n * Returns typed Registry on success, or descriptive error strings on failure.\n */\nexport function validateRegistry(raw: unknown): RegistryValidationResult {\n\tif (validate(raw)) {\n\t\treturn { ok: true, registry: raw as Registry };\n\t}\n\n\tconst errors = (validate.errors ?? []).map(\n\t\t(e: { instancePath?: string; message?: string }) =>\n\t\t\t`  - ${e.instancePath || \"(root)\"}: ${e.message ?? \"invalid\"}`,\n\t);\n\n\treturn { ok: false, errors };\n}\n"]}