@x12i/ai-profiles 1.4.0 → 1.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (144) hide show
  1. package/README.md +186 -16
  2. package/dist/buildCatalogFromOpenRouterApi.d.ts +29 -0
  3. package/dist/buildCatalogFromOpenRouterApi.d.ts.map +1 -0
  4. package/dist/buildCatalogFromOpenRouterApi.js +113 -0
  5. package/dist/buildCatalogFromOpenRouterApi.js.map +1 -0
  6. package/dist/buildModelsRegistry.d.ts +25 -0
  7. package/dist/buildModelsRegistry.d.ts.map +1 -0
  8. package/dist/buildModelsRegistry.js +190 -0
  9. package/dist/buildModelsRegistry.js.map +1 -0
  10. package/dist/buildResolvedProfile.d.ts +3 -1
  11. package/dist/buildResolvedProfile.d.ts.map +1 -1
  12. package/dist/buildResolvedProfile.js +94 -11
  13. package/dist/buildResolvedProfile.js.map +1 -1
  14. package/dist/catalogEnrichment.d.ts +19 -0
  15. package/dist/catalogEnrichment.d.ts.map +1 -0
  16. package/dist/catalogEnrichment.js +87 -0
  17. package/dist/catalogEnrichment.js.map +1 -0
  18. package/dist/computeRegistryStatistics.d.ts +15 -0
  19. package/dist/computeRegistryStatistics.d.ts.map +1 -0
  20. package/dist/computeRegistryStatistics.js +168 -0
  21. package/dist/computeRegistryStatistics.js.map +1 -0
  22. package/dist/constants.d.ts +6 -0
  23. package/dist/constants.d.ts.map +1 -1
  24. package/dist/constants.js +10 -0
  25. package/dist/constants.js.map +1 -1
  26. package/dist/data/models-catalog.json +2219 -0
  27. package/dist/data/models-profiles.json +1361 -193
  28. package/dist/data/models-profiles.schema.json +130 -0
  29. package/dist/data/models-registry.json +1606 -0
  30. package/dist/data/openrouter-models-catalog.json +857 -0
  31. package/dist/data/profiles-shortcuts.json +101 -2
  32. package/dist/errors.d.ts +1 -1
  33. package/dist/errors.d.ts.map +1 -1
  34. package/dist/errors.js.map +1 -1
  35. package/dist/formatRegistryStatistics.d.ts +4 -0
  36. package/dist/formatRegistryStatistics.d.ts.map +1 -0
  37. package/dist/formatRegistryStatistics.js +34 -0
  38. package/dist/formatRegistryStatistics.js.map +1 -0
  39. package/dist/getAIRegistryStatistics.d.ts +11 -0
  40. package/dist/getAIRegistryStatistics.d.ts.map +1 -0
  41. package/dist/getAIRegistryStatistics.js +52 -0
  42. package/dist/getAIRegistryStatistics.js.map +1 -0
  43. package/dist/index.d.ts +22 -1
  44. package/dist/index.d.ts.map +1 -1
  45. package/dist/index.js +19 -0
  46. package/dist/index.js.map +1 -1
  47. package/dist/listAIProfiles.d.ts +6 -0
  48. package/dist/listAIProfiles.d.ts.map +1 -1
  49. package/dist/listAIProfiles.js +6 -0
  50. package/dist/listAIProfiles.js.map +1 -1
  51. package/dist/loadModelsRegistry.d.ts +6 -0
  52. package/dist/loadModelsRegistry.d.ts.map +1 -0
  53. package/dist/loadModelsRegistry.js +43 -0
  54. package/dist/loadModelsRegistry.js.map +1 -0
  55. package/dist/loader/catalogMemoryCache.d.ts +12 -0
  56. package/dist/loader/catalogMemoryCache.d.ts.map +1 -0
  57. package/dist/loader/catalogMemoryCache.js +14 -0
  58. package/dist/loader/catalogMemoryCache.js.map +1 -0
  59. package/dist/loader/loadBundledModelsCatalog.d.ts +3 -0
  60. package/dist/loader/loadBundledModelsCatalog.d.ts.map +1 -0
  61. package/dist/loader/loadBundledModelsCatalog.js +20 -0
  62. package/dist/loader/loadBundledModelsCatalog.js.map +1 -0
  63. package/dist/loader/loadBundledModelsProfiles.d.ts +4 -0
  64. package/dist/loader/loadBundledModelsProfiles.d.ts.map +1 -0
  65. package/dist/loader/loadBundledModelsProfiles.js +14 -0
  66. package/dist/loader/loadBundledModelsProfiles.js.map +1 -0
  67. package/dist/loader/loadBundledRegistry.d.ts.map +1 -1
  68. package/dist/loader/loadBundledRegistry.js +2 -1
  69. package/dist/loader/loadBundledRegistry.js.map +1 -1
  70. package/dist/loader/loadModelsCatalog.d.ts +9 -0
  71. package/dist/loader/loadModelsCatalog.d.ts.map +1 -0
  72. package/dist/loader/loadModelsCatalog.js +72 -0
  73. package/dist/loader/loadModelsCatalog.js.map +1 -0
  74. package/dist/loader/loadModelsProfilesJson.d.ts +3 -0
  75. package/dist/loader/loadModelsProfilesJson.d.ts.map +1 -0
  76. package/dist/loader/loadModelsProfilesJson.js +18 -0
  77. package/dist/loader/loadModelsProfilesJson.js.map +1 -0
  78. package/dist/loader/loadRemoteModelsCatalog.d.ts +3 -0
  79. package/dist/loader/loadRemoteModelsCatalog.d.ts.map +1 -0
  80. package/dist/loader/loadRemoteModelsCatalog.js +23 -0
  81. package/dist/loader/loadRemoteModelsCatalog.js.map +1 -0
  82. package/dist/loader/loadRemoteModelsProfiles.d.ts +3 -0
  83. package/dist/loader/loadRemoteModelsProfiles.d.ts.map +1 -0
  84. package/dist/loader/loadRemoteModelsProfiles.js +21 -0
  85. package/dist/loader/loadRemoteModelsProfiles.js.map +1 -0
  86. package/dist/loader/loadRemoteRegistry.d.ts.map +1 -1
  87. package/dist/loader/loadRemoteRegistry.js +2 -1
  88. package/dist/loader/loadRemoteRegistry.js.map +1 -1
  89. package/dist/mergeCatalogSupplement.d.ts +4 -0
  90. package/dist/mergeCatalogSupplement.d.ts.map +1 -0
  91. package/dist/mergeCatalogSupplement.js +26 -0
  92. package/dist/mergeCatalogSupplement.js.map +1 -0
  93. package/dist/modelIdentity.d.ts +33 -0
  94. package/dist/modelIdentity.d.ts.map +1 -0
  95. package/dist/modelIdentity.js +150 -0
  96. package/dist/modelIdentity.js.map +1 -0
  97. package/dist/modelsCatalog.d.ts +21 -0
  98. package/dist/modelsCatalog.d.ts.map +1 -0
  99. package/dist/modelsCatalog.js +187 -0
  100. package/dist/modelsCatalog.js.map +1 -0
  101. package/dist/profileCatalogSupplement.d.ts +7 -0
  102. package/dist/profileCatalogSupplement.d.ts.map +1 -0
  103. package/dist/profileCatalogSupplement.js +292 -0
  104. package/dist/profileCatalogSupplement.js.map +1 -0
  105. package/dist/profileRegistryV2.d.ts +19 -0
  106. package/dist/profileRegistryV2.d.ts.map +1 -0
  107. package/dist/profileRegistryV2.js +257 -0
  108. package/dist/profileRegistryV2.js.map +1 -0
  109. package/dist/profileRegistryV3.d.ts +11 -0
  110. package/dist/profileRegistryV3.d.ts.map +1 -0
  111. package/dist/profileRegistryV3.js +526 -0
  112. package/dist/profileRegistryV3.js.map +1 -0
  113. package/dist/resolveAIProfile.d.ts +8 -0
  114. package/dist/resolveAIProfile.d.ts.map +1 -1
  115. package/dist/resolveAIProfile.js +62 -18
  116. package/dist/resolveAIProfile.js.map +1 -1
  117. package/dist/resolveModelRouting.d.ts +2 -1
  118. package/dist/resolveModelRouting.d.ts.map +1 -1
  119. package/dist/resolveModelRouting.js +9 -10
  120. package/dist/resolveModelRouting.js.map +1 -1
  121. package/dist/types.d.ts +339 -4
  122. package/dist/types.d.ts.map +1 -1
  123. package/dist/types.js +10 -0
  124. package/dist/types.js.map +1 -1
  125. package/dist/validateProfileVendorCoverage.d.ts +12 -0
  126. package/dist/validateProfileVendorCoverage.d.ts.map +1 -0
  127. package/dist/validateProfileVendorCoverage.js +58 -0
  128. package/dist/validateProfileVendorCoverage.js.map +1 -0
  129. package/dist/validation/openRouterAlignment.d.ts +6 -15
  130. package/dist/validation/openRouterAlignment.d.ts.map +1 -1
  131. package/dist/validation/openRouterAlignment.js +9 -57
  132. package/dist/validation/openRouterAlignment.js.map +1 -1
  133. package/dist/validation/validateModelsCatalog.d.ts +3 -0
  134. package/dist/validation/validateModelsCatalog.d.ts.map +1 -0
  135. package/dist/validation/validateModelsCatalog.js +42 -0
  136. package/dist/validation/validateModelsCatalog.js.map +1 -0
  137. package/dist/validation/validateModelsProfilesJson.d.ts.map +1 -1
  138. package/dist/validation/validateModelsProfilesJson.js +38 -2
  139. package/dist/validation/validateModelsProfilesJson.js.map +1 -1
  140. package/dist/vendorPolicy.d.ts +20 -0
  141. package/dist/vendorPolicy.d.ts.map +1 -0
  142. package/dist/vendorPolicy.js +71 -0
  143. package/dist/vendorPolicy.js.map +1 -0
  144. package/package.json +12 -2
@@ -0,0 +1,72 @@
1
+ import { DEFAULT_CACHE_TTL_MS } from "../constants.js";
2
+ import { getCatalogMemoryCache, isCatalogCacheValid, setCatalogMemoryCache, } from "./catalogMemoryCache.js";
3
+ import { loadBundledModelsCatalog } from "./loadBundledModelsCatalog.js";
4
+ import { loadRemoteModelsCatalog } from "./loadRemoteModelsCatalog.js";
5
+ function cacheAndReturn(catalog, source) {
6
+ const now = Date.now();
7
+ const cache = {
8
+ catalog,
9
+ loadedAt: now,
10
+ expiresAt: now + DEFAULT_CACHE_TTL_MS,
11
+ source,
12
+ };
13
+ setCatalogMemoryCache(cache);
14
+ return catalog;
15
+ }
16
+ export async function loadModelsCatalog(options = {}) {
17
+ const result = await loadModelsCatalogWithWarnings(options);
18
+ return result.catalog;
19
+ }
20
+ export async function loadModelsCatalogWithWarnings(options = {}) {
21
+ const source = options.source ?? "auto";
22
+ const refresh = options.refresh ?? false;
23
+ const warnings = [];
24
+ const existingCache = getCatalogMemoryCache();
25
+ if (!refresh && isCatalogCacheValid(existingCache)) {
26
+ return {
27
+ catalog: existingCache.catalog,
28
+ warnings,
29
+ source: existingCache.source,
30
+ };
31
+ }
32
+ if (source === "bundled") {
33
+ const catalog = cacheAndReturn(loadBundledModelsCatalog(), "bundled");
34
+ return { catalog, warnings, source: "bundled" };
35
+ }
36
+ if (source === "remote") {
37
+ const catalog = cacheAndReturn(await loadRemoteModelsCatalog(), "remote");
38
+ return { catalog, warnings, source: "remote" };
39
+ }
40
+ const shouldAttemptRefresh = refresh || !existingCache || !isCatalogCacheValid(existingCache);
41
+ if (shouldAttemptRefresh) {
42
+ try {
43
+ const catalog = cacheAndReturn(await loadRemoteModelsCatalog(), "remote");
44
+ return { catalog, warnings, source: "remote" };
45
+ }
46
+ catch {
47
+ if (existingCache) {
48
+ warnings.push({
49
+ code: "REMOTE_REFRESH_FAILED_USING_CACHE",
50
+ message: "Remote models catalog refresh failed. Using previously cached catalog.",
51
+ });
52
+ return {
53
+ catalog: existingCache.catalog,
54
+ warnings,
55
+ source: existingCache.source,
56
+ };
57
+ }
58
+ warnings.push({
59
+ code: "USING_BUNDLED_FALLBACK",
60
+ message: "Remote models catalog could not be loaded. Using JSON bundled in this package.",
61
+ });
62
+ const catalog = cacheAndReturn(loadBundledModelsCatalog(), "bundled");
63
+ return { catalog, warnings, source: "bundled" };
64
+ }
65
+ }
66
+ return {
67
+ catalog: existingCache.catalog,
68
+ warnings,
69
+ source: existingCache.source,
70
+ };
71
+ }
72
+ //# sourceMappingURL=loadModelsCatalog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loadModelsCatalog.js","sourceRoot":"","sources":["../../src/loader/loadModelsCatalog.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { LoadRegistryOptions, ModelsProfilesJson } from "../types.js";
2
+ export declare function loadModelsProfilesJson(options?: LoadRegistryOptions): Promise<ModelsProfilesJson>;
3
+ //# sourceMappingURL=loadModelsProfilesJson.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loadModelsProfilesJson.d.ts","sourceRoot":"","sources":["../../src/loader/loadModelsProfilesJson.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAI3E,wBAAsB,sBAAsB,CAC1C,OAAO,GAAE,mBAAwB,GAChC,OAAO,CAAC,kBAAkB,CAAC,CAgB7B"}
@@ -0,0 +1,18 @@
1
+ import { loadBundledModelsProfiles } from "./loadBundledModelsProfiles.js";
2
+ import { loadRemoteModelsProfiles } from "./loadRemoteModelsProfiles.js";
3
+ export async function loadModelsProfilesJson(options = {}) {
4
+ const source = options.source ?? "auto";
5
+ if (source === "bundled") {
6
+ return loadBundledModelsProfiles();
7
+ }
8
+ if (source === "remote") {
9
+ return loadRemoteModelsProfiles();
10
+ }
11
+ try {
12
+ return await loadRemoteModelsProfiles();
13
+ }
14
+ catch {
15
+ return loadBundledModelsProfiles();
16
+ }
17
+ }
18
+ //# sourceMappingURL=loadModelsProfilesJson.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loadModelsProfilesJson.js","sourceRoot":"","sources":["../../src/loader/loadModelsProfilesJson.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAC;AAC3E,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AAEzE,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,UAA+B,EAAE;IAEjC,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,MAAM,CAAC;IAExC,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACzB,OAAO,yBAAyB,EAAE,CAAC;IACrC,CAAC;IAED,IAAI,MAAM,KAAK,QAAQ,EAAE,CAAC;QACxB,OAAO,wBAAwB,EAAE,CAAC;IACpC,CAAC;IAED,IAAI,CAAC;QACH,OAAO,MAAM,wBAAwB,EAAE,CAAC;IAC1C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,yBAAyB,EAAE,CAAC;IACrC,CAAC;AACH,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { ModelsCatalogJson } from "../types.js";
2
+ export declare function loadRemoteModelsCatalog(): Promise<ModelsCatalogJson>;
3
+ //# sourceMappingURL=loadRemoteModelsCatalog.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loadRemoteModelsCatalog.d.ts","sourceRoot":"","sources":["../../src/loader/loadRemoteModelsCatalog.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAIrD,wBAAsB,uBAAuB,IAAI,OAAO,CAAC,iBAAiB,CAAC,CAuB1E"}
@@ -0,0 +1,23 @@
1
+ import { REMOTE_MODELS_CATALOG_URL } from "../constants.js";
2
+ import { AIProfilesError } from "../errors.js";
3
+ import { normalizeModelsCatalog } from "../modelsCatalog.js";
4
+ import { validateModelsCatalogJson } from "../validation/validateModelsCatalog.js";
5
+ import { fetchJson } from "./fetchJson.js";
6
+ export async function loadRemoteModelsCatalog() {
7
+ try {
8
+ const raw = await fetchJson(REMOTE_MODELS_CATALOG_URL);
9
+ const normalized = normalizeModelsCatalog(raw);
10
+ return validateModelsCatalogJson(normalized);
11
+ }
12
+ catch (error) {
13
+ if (error instanceof AIProfilesError) {
14
+ if (error.code === "REGISTRY_SCHEMA_UNSUPPORTED" ||
15
+ error.code === "REGISTRY_VALIDATION_FAILED") {
16
+ throw new AIProfilesError("REMOTE_JSON_INVALID", error.message, error.details);
17
+ }
18
+ throw error;
19
+ }
20
+ throw error;
21
+ }
22
+ }
23
+ //# sourceMappingURL=loadRemoteModelsCatalog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loadRemoteModelsCatalog.js","sourceRoot":"","sources":["../../src/loader/loadRemoteModelsCatalog.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,yBAAyB,EAAE,MAAM,iBAAiB,CAAC;AAC5D,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAE7D,OAAO,EAAE,yBAAyB,EAAE,MAAM,wCAAwC,CAAC;AACnF,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAE3C,MAAM,CAAC,KAAK,UAAU,uBAAuB;IAC3C,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,SAAS,CAAC,yBAAyB,CAAC,CAAC;QACvD,MAAM,UAAU,GAAG,sBAAsB,CAAC,GAAG,CAAC,CAAC;QAC/C,OAAO,yBAAyB,CAAC,UAAU,CAAC,CAAC;IAC/C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,eAAe,EAAE,CAAC;YACrC,IACE,KAAK,CAAC,IAAI,KAAK,6BAA6B;gBAC5C,KAAK,CAAC,IAAI,KAAK,4BAA4B,EAC3C,CAAC;gBACD,MAAM,IAAI,eAAe,CACvB,qBAAqB,EACrB,KAAK,CAAC,OAAO,EACb,KAAK,CAAC,OAAO,CACd,CAAC;YACJ,CAAC;YAED,MAAM,KAAK,CAAC;QACd,CAAC;QAED,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { ModelsProfilesJson } from "../types.js";
2
+ export declare function loadRemoteModelsProfiles(): Promise<ModelsProfilesJson>;
3
+ //# sourceMappingURL=loadRemoteModelsProfiles.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loadRemoteModelsProfiles.d.ts","sourceRoot":"","sources":["../../src/loader/loadRemoteModelsProfiles.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAItD,wBAAsB,wBAAwB,IAAI,OAAO,CAAC,kBAAkB,CAAC,CAsB5E"}
@@ -0,0 +1,21 @@
1
+ import { REMOTE_MODELS_PROFILES_URL } from "../constants.js";
2
+ import { AIProfilesError } from "../errors.js";
3
+ import { validateModelsProfilesJson } from "../validation/validateModelsProfilesJson.js";
4
+ import { fetchJson } from "./fetchJson.js";
5
+ export async function loadRemoteModelsProfiles() {
6
+ try {
7
+ const raw = await fetchJson(REMOTE_MODELS_PROFILES_URL);
8
+ return validateModelsProfilesJson(raw);
9
+ }
10
+ catch (error) {
11
+ if (error instanceof AIProfilesError) {
12
+ if (error.code === "REGISTRY_SCHEMA_UNSUPPORTED" ||
13
+ error.code === "REGISTRY_VALIDATION_FAILED") {
14
+ throw new AIProfilesError("REMOTE_JSON_INVALID", error.message, error.details);
15
+ }
16
+ throw error;
17
+ }
18
+ throw error;
19
+ }
20
+ }
21
+ //# sourceMappingURL=loadRemoteModelsProfiles.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loadRemoteModelsProfiles.js","sourceRoot":"","sources":["../../src/loader/loadRemoteModelsProfiles.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,0BAA0B,EAAE,MAAM,iBAAiB,CAAC;AAC7D,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAE/C,OAAO,EAAE,0BAA0B,EAAE,MAAM,6CAA6C,CAAC;AACzF,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAE3C,MAAM,CAAC,KAAK,UAAU,wBAAwB;IAC5C,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,SAAS,CAAC,0BAA0B,CAAC,CAAC;QACxD,OAAO,0BAA0B,CAAC,GAAG,CAAC,CAAC;IACzC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,eAAe,EAAE,CAAC;YACrC,IACE,KAAK,CAAC,IAAI,KAAK,6BAA6B;gBAC5C,KAAK,CAAC,IAAI,KAAK,4BAA4B,EAC3C,CAAC;gBACD,MAAM,IAAI,eAAe,CACvB,qBAAqB,EACrB,KAAK,CAAC,OAAO,EACb,KAAK,CAAC,OAAO,CACd,CAAC;YACJ,CAAC;YAED,MAAM,KAAK,CAAC;QACd,CAAC;QAED,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"loadRemoteRegistry.d.ts","sourceRoot":"","sources":["../../src/loader/loadRemoteRegistry.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAQtD,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,kBAAkB,CAAC,CAgCtE"}
1
+ {"version":3,"file":"loadRemoteRegistry.d.ts","sourceRoot":"","sources":["../../src/loader/loadRemoteRegistry.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAStD,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,kBAAkB,CAAC,CAkCtE"}
@@ -1,6 +1,7 @@
1
1
  import { REMOTE_MODELS_PROFILES_URL, REMOTE_PROFILES_SHORTCUTS_URL, } from "../constants.js";
2
2
  import { AIProfilesError } from "../errors.js";
3
3
  import { validateModelsProfilesJson, validateProfilesShortcutsJson, } from "../validation/validateModelsProfilesJson.js";
4
+ import { normalizeModelsProfilesDocument } from "./loadBundledModelsProfiles.js";
4
5
  import { combineRegistry } from "./combineRegistry.js";
5
6
  import { fetchJson } from "./fetchJson.js";
6
7
  export async function loadRemoteRegistry() {
@@ -9,7 +10,7 @@ export async function loadRemoteRegistry() {
9
10
  fetchJson(REMOTE_MODELS_PROFILES_URL),
10
11
  fetchJson(REMOTE_PROFILES_SHORTCUTS_URL),
11
12
  ]);
12
- const modelsProfiles = validateModelsProfilesJson(modelsProfilesRaw);
13
+ const modelsProfiles = normalizeModelsProfilesDocument(validateModelsProfilesJson(modelsProfilesRaw));
13
14
  const shortcuts = validateProfilesShortcutsJson(shortcutsRaw, modelsProfiles.profiles);
14
15
  return combineRegistry(modelsProfiles, shortcuts, "remote");
15
16
  }
@@ -1 +1 @@
1
- {"version":3,"file":"loadRemoteRegistry.js","sourceRoot":"","sources":["../../src/loader/loadRemoteRegistry.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,0BAA0B,EAC1B,6BAA6B,GAC9B,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAE/C,OAAO,EACL,0BAA0B,EAC1B,6BAA6B,GAC9B,MAAM,6CAA6C,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAE3C,MAAM,CAAC,KAAK,UAAU,kBAAkB;IACtC,IAAI,CAAC;QACH,MAAM,CAAC,iBAAiB,EAAE,YAAY,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;YAC1D,SAAS,CAAC,0BAA0B,CAAC;YACrC,SAAS,CAAC,6BAA6B,CAAC;SACzC,CAAC,CAAC;QAEH,MAAM,cAAc,GAAG,0BAA0B,CAAC,iBAAiB,CAAC,CAAC;QACrE,MAAM,SAAS,GAAG,6BAA6B,CAC7C,YAAY,EACZ,cAAc,CAAC,QAAQ,CACxB,CAAC;QAEF,OAAO,eAAe,CAAC,cAAc,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;IAC9D,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,eAAe,EAAE,CAAC;YACrC,IACE,KAAK,CAAC,IAAI,KAAK,6BAA6B;gBAC5C,KAAK,CAAC,IAAI,KAAK,4BAA4B,EAC3C,CAAC;gBACD,MAAM,IAAI,eAAe,CACvB,qBAAqB,EACrB,KAAK,CAAC,OAAO,EACb,KAAK,CAAC,OAAO,CACd,CAAC;YACJ,CAAC;YAED,MAAM,KAAK,CAAC;QACd,CAAC;QAED,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"loadRemoteRegistry.js","sourceRoot":"","sources":["../../src/loader/loadRemoteRegistry.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,0BAA0B,EAC1B,6BAA6B,GAC9B,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAE/C,OAAO,EACL,0BAA0B,EAC1B,6BAA6B,GAC9B,MAAM,6CAA6C,CAAC;AACrD,OAAO,EAAE,+BAA+B,EAAE,MAAM,gCAAgC,CAAC;AACjF,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAE3C,MAAM,CAAC,KAAK,UAAU,kBAAkB;IACtC,IAAI,CAAC;QACH,MAAM,CAAC,iBAAiB,EAAE,YAAY,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;YAC1D,SAAS,CAAC,0BAA0B,CAAC;YACrC,SAAS,CAAC,6BAA6B,CAAC;SACzC,CAAC,CAAC;QAEH,MAAM,cAAc,GAAG,+BAA+B,CACpD,0BAA0B,CAAC,iBAAiB,CAAC,CAC9C,CAAC;QACF,MAAM,SAAS,GAAG,6BAA6B,CAC7C,YAAY,EACZ,cAAc,CAAC,QAAQ,CACxB,CAAC;QAEF,OAAO,eAAe,CAAC,cAAc,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;IAC9D,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,eAAe,EAAE,CAAC;YACrC,IACE,KAAK,CAAC,IAAI,KAAK,6BAA6B;gBAC5C,KAAK,CAAC,IAAI,KAAK,4BAA4B,EAC3C,CAAC;gBACD,MAAM,IAAI,eAAe,CACvB,qBAAqB,EACrB,KAAK,CAAC,OAAO,EACb,KAAK,CAAC,OAAO,CACd,CAAC;YACJ,CAAC;YAED,MAAM,KAAK,CAAC;QACd,CAAC;QAED,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { CatalogModelEntry, ModelsCatalogJson } from "./types.js";
2
+ /** Merge supplemental catalog rows without duplicating existing direct identities. */
3
+ export declare function mergeCatalogSupplement(catalog: ModelsCatalogJson, supplement: CatalogModelEntry[]): ModelsCatalogJson;
4
+ //# sourceMappingURL=mergeCatalogSupplement.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mergeCatalogSupplement.d.ts","sourceRoot":"","sources":["../src/mergeCatalogSupplement.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAWvE,sFAAsF;AACtF,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,iBAAiB,EAC1B,UAAU,EAAE,iBAAiB,EAAE,GAC9B,iBAAiB,CAkBnB"}
@@ -0,0 +1,26 @@
1
+ import { MODELS_CATALOG_SCHEMA } from "./modelsCatalog.js";
2
+ function normalizeKey(value) {
3
+ return value.trim().toLowerCase();
4
+ }
5
+ function entryKey(entry) {
6
+ return normalizeKey(`${entry.direct.provider}/${entry.direct.modelId}`);
7
+ }
8
+ /** Merge supplemental catalog rows without duplicating existing direct identities. */
9
+ export function mergeCatalogSupplement(catalog, supplement) {
10
+ const existing = new Set(catalog.models.map(entryKey));
11
+ const merged = [...catalog.models];
12
+ for (const entry of supplement) {
13
+ const key = entryKey(entry);
14
+ if (existing.has(key)) {
15
+ continue;
16
+ }
17
+ existing.add(key);
18
+ merged.push(entry);
19
+ }
20
+ return {
21
+ ...catalog,
22
+ schema: MODELS_CATALOG_SCHEMA,
23
+ models: merged,
24
+ };
25
+ }
26
+ //# sourceMappingURL=mergeCatalogSupplement.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mergeCatalogSupplement.js","sourceRoot":"","sources":["../src/mergeCatalogSupplement.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAE3D,SAAS,YAAY,CAAC,KAAa;IACjC,OAAO,KAAK,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;AACpC,CAAC;AAED,SAAS,QAAQ,CAAC,KAAwB;IACxC,OAAO,YAAY,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,QAAQ,IAAI,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;AAC1E,CAAC;AAED,sFAAsF;AACtF,MAAM,UAAU,sBAAsB,CACpC,OAA0B,EAC1B,UAA+B;IAE/B,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC;IACvD,MAAM,MAAM,GAAG,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAEnC,KAAK,MAAM,KAAK,IAAI,UAAU,EAAE,CAAC;QAC/B,MAAM,GAAG,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;QAC5B,IAAI,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YACtB,SAAS;QACX,CAAC;QACD,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAClB,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACrB,CAAC;IAED,OAAO;QACL,GAAG,OAAO;QACV,MAAM,EAAE,qBAAqB;QAC7B,MAAM,EAAE,MAAM;KACf,CAAC;AACJ,CAAC"}
@@ -0,0 +1,33 @@
1
+ import type { AIProfileChoice, AIProvider } from "./types.js";
2
+ export interface ModelInvocationEndpoint {
3
+ provider: AIProvider;
4
+ modelId: string;
5
+ }
6
+ export interface ModelInvocation {
7
+ direct: ModelInvocationEndpoint;
8
+ openrouter: ModelInvocationEndpoint | null;
9
+ }
10
+ export type CatalogMatchMethod = "exact" | "openRouterSlug" | "canonicalSlug" | "anthropicVersionNormalize" | "providerPrefixed";
11
+ export interface CatalogMatchResult {
12
+ matched: boolean;
13
+ openRouterModelId: string | null;
14
+ canonicalSlug?: string;
15
+ matchMethod?: CatalogMatchMethod;
16
+ candidates: string[];
17
+ }
18
+ /** Anthropic OpenRouter slugs use dotted minor versions (`4.6`), not dashed (`4-6`). */
19
+ export declare function normalizeAnthropicVersionSlug(slug: string): string;
20
+ export declare function openRouterResolutionCandidates(provider: string, modelId: string): string[];
21
+ export declare function buildRegistryKey(provider: string, modelId: string): string;
22
+ /**
23
+ * Vendor-direct endpoint from a profile choice.
24
+ * When modelId is already an OpenRouter slug (`vendor/model`), direct uses the slug prefix as provider hint.
25
+ */
26
+ export declare function buildDirectInvocation(provider: string, modelId: string): ModelInvocationEndpoint;
27
+ export declare function buildOpenRouterModelId(provider: string, modelId: string): string;
28
+ export declare function buildModelInvocation(provider: string, modelId: string): ModelInvocation;
29
+ export declare function matchOpenRouterCatalog(provider: string, modelId: string, catalogIndex: Map<string, import("./modelsCatalog.js").CatalogIndexRecord>): CatalogMatchResult;
30
+ export declare function isOpenRouterModelAvailable(provider: string, modelId: string, catalogIndex: Map<string, import("./modelsCatalog.js").CatalogIndexRecord> | Set<string>): boolean;
31
+ /** Skip local / vendor-direct choices that are not expected on OpenRouter. */
32
+ export declare function shouldCheckOpenRouterAlignment(choice: AIProfileChoice): boolean;
33
+ //# sourceMappingURL=modelIdentity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"modelIdentity.d.ts","sourceRoot":"","sources":["../src/modelIdentity.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE9D,MAAM,WAAW,uBAAuB;IACtC,QAAQ,EAAE,UAAU,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,uBAAuB,CAAC;IAChC,UAAU,EAAE,uBAAuB,GAAG,IAAI,CAAC;CAC5C;AAED,MAAM,MAAM,kBAAkB,GAC1B,OAAO,GACP,gBAAgB,GAChB,eAAe,GACf,2BAA2B,GAC3B,kBAAkB,CAAC;AAEvB,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,OAAO,CAAC;IACjB,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,WAAW,CAAC,EAAE,kBAAkB,CAAC;IACjC,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB;AAMD,wFAAwF;AACxF,wBAAgB,6BAA6B,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAElE;AAED,wBAAgB,8BAA8B,CAC5C,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,GACd,MAAM,EAAE,CA0BV;AAED,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAI1E;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,GACd,uBAAuB,CAiCzB;AAED,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAOhF;AAED,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,GACd,eAAe,CAsBjB;AAED,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,YAAY,EAAE,GAAG,CACf,MAAM,EACN,OAAO,oBAAoB,EAAE,kBAAkB,CAChD,GACA,kBAAkB,CA+BpB;AAED,wBAAgB,0BAA0B,CACxC,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,YAAY,EACR,GAAG,CAAC,MAAM,EAAE,OAAO,oBAAoB,EAAE,kBAAkB,CAAC,GAC5D,GAAG,CAAC,MAAM,CAAC,GACd,OAAO,CAYT;AAED,8EAA8E;AAC9E,wBAAgB,8BAA8B,CAAC,MAAM,EAAE,eAAe,GAAG,OAAO,CAa/E"}
@@ -0,0 +1,150 @@
1
+ function normalizeKey(value) {
2
+ return value.trim().toLowerCase();
3
+ }
4
+ /** Anthropic OpenRouter slugs use dotted minor versions (`4.6`), not dashed (`4-6`). */
5
+ export function normalizeAnthropicVersionSlug(slug) {
6
+ return slug.replace(/-(\d+)-(\d+)(?=$|[-/])/g, "-$1.$2");
7
+ }
8
+ export function openRouterResolutionCandidates(provider, modelId) {
9
+ const normalizedProvider = normalizeKey(provider);
10
+ const normalizedModel = normalizeKey(modelId);
11
+ const versionNormalized = normalizeAnthropicVersionSlug(normalizedModel);
12
+ const candidates = new Set([
13
+ normalizedModel,
14
+ versionNormalized,
15
+ `${normalizedProvider}/${normalizedModel}`,
16
+ `${normalizedProvider}/${versionNormalized}`,
17
+ ]);
18
+ if (normalizedModel.includes("/")) {
19
+ candidates.add(normalizedModel);
20
+ candidates.add(versionNormalized);
21
+ candidates.add(`${normalizedProvider}/${normalizedModel}`);
22
+ if (normalizedProvider !== "openrouter") {
23
+ candidates.add(normalizedModel);
24
+ }
25
+ }
26
+ else {
27
+ for (const prefix of ["openai", "anthropic", "google", "deepseek", "x-ai", "xai"]) {
28
+ candidates.add(`${prefix}/${normalizedModel}`);
29
+ candidates.add(`${prefix}/${versionNormalized}`);
30
+ }
31
+ }
32
+ return [...candidates];
33
+ }
34
+ export function buildRegistryKey(provider, modelId) {
35
+ const direct = buildDirectInvocation(provider, modelId);
36
+ const normalizedModel = normalizeKey(direct.modelId);
37
+ return `vendor:${direct.provider}:${normalizedModel}`;
38
+ }
39
+ /**
40
+ * Vendor-direct endpoint from a profile choice.
41
+ * When modelId is already an OpenRouter slug (`vendor/model`), direct uses the slug prefix as provider hint.
42
+ */
43
+ export function buildDirectInvocation(provider, modelId) {
44
+ if (modelId.includes("/")) {
45
+ const slashIndex = modelId.indexOf("/");
46
+ const prefix = modelId.slice(0, slashIndex).toLowerCase();
47
+ const bareModel = modelId.slice(slashIndex + 1);
48
+ if (prefix === "x-ai" || prefix === "xai") {
49
+ return { provider: "xai", modelId: bareModel };
50
+ }
51
+ const providerFromSlug = prefix;
52
+ if ([
53
+ "openai",
54
+ "anthropic",
55
+ "google",
56
+ "deepseek",
57
+ "together",
58
+ "mistral",
59
+ "groq",
60
+ "xai",
61
+ ].includes(providerFromSlug)) {
62
+ return { provider: providerFromSlug, modelId: bareModel };
63
+ }
64
+ return { provider: provider, modelId };
65
+ }
66
+ return {
67
+ provider: provider,
68
+ modelId: normalizeAnthropicVersionSlug(modelId),
69
+ };
70
+ }
71
+ export function buildOpenRouterModelId(provider, modelId) {
72
+ if (modelId.includes("/")) {
73
+ return modelId;
74
+ }
75
+ const normalizedModel = normalizeAnthropicVersionSlug(modelId);
76
+ return `${provider}/${normalizedModel}`;
77
+ }
78
+ export function buildModelInvocation(provider, modelId) {
79
+ const direct = buildDirectInvocation(provider, modelId);
80
+ if (provider === "local") {
81
+ return { direct, openrouter: null };
82
+ }
83
+ if (modelId.startsWith("funcx:") || modelId.startsWith("Xenova/")) {
84
+ return { direct, openrouter: null };
85
+ }
86
+ const openrouterModelId = modelId.includes("/")
87
+ ? modelId
88
+ : buildOpenRouterModelId(direct.provider, direct.modelId);
89
+ return {
90
+ direct,
91
+ openrouter: {
92
+ provider: "openrouter",
93
+ modelId: openrouterModelId,
94
+ },
95
+ };
96
+ }
97
+ export function matchOpenRouterCatalog(provider, modelId, catalogIndex) {
98
+ const candidates = openRouterResolutionCandidates(provider, modelId);
99
+ for (const candidate of candidates) {
100
+ const hit = catalogIndex.get(candidate);
101
+ if (hit) {
102
+ const matchMethod = candidate === normalizeKey(hit.openRouterModelId)
103
+ ? "exact"
104
+ : candidate.includes(".")
105
+ ? "anthropicVersionNormalize"
106
+ : candidate.includes("/")
107
+ ? "openRouterSlug"
108
+ : "providerPrefixed";
109
+ return {
110
+ matched: true,
111
+ openRouterModelId: hit.openRouterModelId,
112
+ canonicalSlug: hit.canonicalSlug,
113
+ matchMethod,
114
+ candidates,
115
+ };
116
+ }
117
+ }
118
+ const invocation = buildModelInvocation(provider, modelId);
119
+ return {
120
+ matched: false,
121
+ openRouterModelId: invocation.openrouter?.modelId ?? null,
122
+ candidates,
123
+ };
124
+ }
125
+ export function isOpenRouterModelAvailable(provider, modelId, catalogIndex) {
126
+ const map = catalogIndex instanceof Set
127
+ ? new Map([...catalogIndex].map((key) => [
128
+ key,
129
+ { openRouterModelId: key },
130
+ ]))
131
+ : catalogIndex;
132
+ return matchOpenRouterCatalog(provider, modelId, map).matched;
133
+ }
134
+ /** Skip local / vendor-direct choices that are not expected on OpenRouter. */
135
+ export function shouldCheckOpenRouterAlignment(choice) {
136
+ if (choice.provider === "local")
137
+ return false;
138
+ if (choice.modelId.startsWith("funcx:") || choice.modelId.startsWith("Xenova/")) {
139
+ return false;
140
+ }
141
+ const backend = choice.runtime?.backend;
142
+ if (backend && backend !== "openrouter")
143
+ return false;
144
+ if (choice.metadata?.openRouter === "vendor-direct")
145
+ return false;
146
+ if (choice.metadata?.skipOpenRouterAlignment === true)
147
+ return false;
148
+ return true;
149
+ }
150
+ //# sourceMappingURL=modelIdentity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"modelIdentity.js","sourceRoot":"","sources":["../src/modelIdentity.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import type { CatalogDirectSlice, ModelsCatalogJson } from "./types.js";
2
+ /** Canonical remote catalog asset (same host pattern as models-profiles.json). */
3
+ export declare const MODELS_CATALOG_REMOTE_URL = "https://open-assets.x12i.com/models-catalog.json";
4
+ /** @deprecated Legacy filename on open-assets; prefer {@link MODELS_CATALOG_REMOTE_URL}. */
5
+ export declare const LEGACY_OPENROUTER_CATALOG_REMOTE_URL = "https://open-assets.x12i.com/openrouter-models-catalog.json";
6
+ export declare const MODELS_CATALOG_FILENAME = "models-catalog.json";
7
+ export declare const MODELS_CATALOG_SCHEMA: "x12i.ai-profiles.models-catalog";
8
+ export type CatalogIndexRecord = {
9
+ openRouterModelId: string;
10
+ canonicalSlug?: string;
11
+ directProvider?: string;
12
+ directModelId?: string;
13
+ };
14
+ /** Derive vendor-direct identity from an OpenRouter slug (`qwen/qwen3.7-max` → custom + qwen3.7-max). */
15
+ export declare function parseDirectFromOpenRouterSlug(slug: string, family?: string): CatalogDirectSlice;
16
+ /** Normalize legacy OpenRouter-only catalog or pass through unified catalog. */
17
+ export declare function normalizeModelsCatalog(raw: unknown): ModelsCatalogJson;
18
+ export declare function buildModelsCatalogIndex(catalog: ModelsCatalogJson): Map<string, CatalogIndexRecord>;
19
+ /** @deprecated Use {@link buildModelsCatalogIndex} */
20
+ export declare const buildOpenRouterCatalogIndex: typeof buildModelsCatalogIndex;
21
+ //# sourceMappingURL=modelsCatalog.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"modelsCatalog.d.ts","sourceRoot":"","sources":["../src/modelsCatalog.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,kBAAkB,EAGlB,iBAAiB,EAClB,MAAM,YAAY,CAAC;AAIpB,kFAAkF;AAClF,eAAO,MAAM,yBAAyB,qDAA4B,CAAC;AAEnE,4FAA4F;AAC5F,eAAO,MAAM,oCAAoC,gEACc,CAAC;AAEhE,eAAO,MAAM,uBAAuB,wBAAwB,CAAC;AAE7D,eAAO,MAAM,qBAAqB,EAAG,iCAA0C,CAAC;AAehF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,CAAC;AAMF,yGAAyG;AACzG,wBAAgB,6BAA6B,CAC3C,IAAI,EAAE,MAAM,EACZ,MAAM,CAAC,EAAE,MAAM,GACd,kBAAkB,CAgCpB;AAgHD,gFAAgF;AAChF,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,OAAO,GAAG,iBAAiB,CAmDtE;AAED,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,iBAAiB,GACzB,GAAG,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAkCjC;AAED,sDAAsD;AACtD,eAAO,MAAM,2BAA2B,gCAA0B,CAAC"}