@sanity/agent-schema 0.3.1 → 0.4.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.
package/README.md CHANGED
@@ -166,12 +166,17 @@ fetchSchemaByDescriptorId() fetchDatasetStats()
166
166
 
167
167
  #### `fetchSchemaByDescriptorId(client, descriptorId, options?)`
168
168
 
169
- Fetches a schema from the Lexicon API and returns parsed `ManifestSchemaType[]`.
169
+ Fetches a schema from the Lexicon API and returns parsed `ManifestSchemaType[]` by default.
170
+ Pass `{ output: "summary" }` to return the raw `LexiconResponse` instead.
170
171
 
171
172
  The `client` should be a `@sanity/client` instance configured for the Lexicon API host. The `descriptorId` identifies a specific schema version — typically obtained from an application resource.
172
173
 
173
174
  ```ts
174
175
  const types = await fetchSchemaByDescriptorId(client, descriptorId);
176
+
177
+ const summary = await fetchSchemaByDescriptorId(client, descriptorId, {
178
+ output: "summary",
179
+ });
175
180
  ```
176
181
 
177
182
  **Caching:** Pass `{ cache: true }` for a built-in in-memory cache (5 min TTL), or provide a custom adapter:
@@ -189,10 +194,11 @@ const types = await fetchSchemaByDescriptorId(client, id, {
189
194
  });
190
195
  ```
191
196
 
192
- | Option | Type | Default | Description |
193
- | ------- | ------------------------ | -------- | --------------------------------------------------------- |
194
- | `cache` | `boolean \| SchemaCache` | | Enable caching. `true` for in-memory, or a custom adapter |
195
- | `ttlMs` | `number` | `300000` | Cache TTL in ms (only applies to built-in memory cache) |
197
+ | Option | Type | Default | Description |
198
+ | -------- | ------------------------ | --------- | --------------------------------------------------------- |
199
+ | `cache` | `boolean \| SchemaCache` | | Enable caching. `true` for in-memory, or a custom adapter |
200
+ | `ttlMs` | `number` | `300000` | Cache TTL in ms (only applies to built-in memory cache) |
201
+ | `output` | `"types" \| "summary"` | `"types"` | Return parsed types or the raw schema summary |
196
202
 
197
203
  #### `fetchDatasetStats(client, options)`
198
204
 
@@ -219,11 +225,11 @@ if (result.status === "ready") {
219
225
 
220
226
  Generates compressed text for agent consumption. Processes the schema, applies filters, and formats the output.
221
227
 
222
- | Option | Type | Description |
223
- | -------------- | --------------------------- | ----------------------------------------------------------------------------------- |
224
- | `filter` | `SchemaFilter` | GROQ filter `{ read?, write? }` or `string[]` |
225
- | `datasetStats` | `DatasetStats` | Document/reference counts to enrich output |
226
- | `fields` | `SchemaFieldDisplayOptions` | Control field display (see below) |
228
+ | Option | Type | Description |
229
+ | -------------- | --------------------------- | ---------------------------------------------------------------------------------------------------------------- |
230
+ | `filter` | `SchemaFilter` | GROQ filter `{ read?, write? }` or `string[]` |
231
+ | `datasetStats` | `DatasetStats` | Document/reference counts to enrich output |
232
+ | `fields` | `SchemaFieldDisplayOptions` | Control field display (see below) |
227
233
  | `includeEmpty` | `boolean` | When `true`, keep document types whose `documentCount` is explicitly `0`. Defaults to `false`, which drops them. |
228
234
 
229
235
  **Field display options:**
@@ -401,6 +407,8 @@ Internal constants used by the schema processor (skip patterns, title field cand
401
407
  | `FullSchemaOptions` | Options for `fullSchema()` |
402
408
  | `SchemaCache` | Cache adapter for `fetchSchemaByDescriptorId` |
403
409
  | `FetchSchemaOptions` | Options for `fetchSchemaByDescriptorId` |
410
+ | `FetchSchemaSummaryOptions` | Options that request a raw `LexiconResponse` |
411
+ | `LexiconResponse` | Raw response returned by the Lexicon schema descriptor API |
404
412
  | `ProcessedDocumentType` | A document type after processing (fields expanded, refs computed) |
405
413
  | `SchemaTypes` | Return type of `processSchema` (`documentTypes` + `objectTypes` Maps) |
406
414
  | `SchemaProcessorOptions` | Options for `processSchema()` |
package/dist/index.d.ts CHANGED
@@ -36,17 +36,23 @@ type FetchSchemaOptions = {
36
36
  * - A `SchemaCache` adapter delegates to any external store (Redis, etc.)
37
37
  */
38
38
  cache?: boolean | SchemaCache; /** Cache TTL in milliseconds (default 5 min). Only applies to the built-in memory cache. */
39
- ttlMs?: number;
39
+ ttlMs?: number; /** Return parsed schema types. This is the default. */
40
+ output?: 'types';
41
+ };
42
+ type FetchSchemaSummaryOptions = Omit<FetchSchemaOptions, 'output'> & {
43
+ /** Return the raw Lexicon response. Treat the result as read-only when caching is enabled. */output: 'summary';
40
44
  };
41
45
  /**
42
46
  * Fetches and parses a schema from the Lexicon descriptor API.
43
47
  *
44
48
  * Takes a configured `@sanity/client` instance (which handles auth, host, timeouts)
45
- * and a descriptor ID. Returns the fully parsed ManifestSchemaType array.
49
+ * and a descriptor ID. Returns the fully parsed ManifestSchemaType array by default.
50
+ * Pass `{ output: 'summary' }` to return the raw LexiconResponse instead.
46
51
  *
47
52
  * Pass `{ cache: true }` to enable in-memory caching (5 min TTL),
48
53
  * or provide a custom `SchemaCache` adapter for external stores.
49
54
  */
55
+ declare function fetchSchemaByDescriptorId(client: SanityClient, descriptorId: string, options: FetchSchemaSummaryOptions): Promise<LexiconResponse>;
50
56
  declare function fetchSchemaByDescriptorId(client: SanityClient, descriptorId: string, options?: FetchSchemaOptions): Promise<ManifestSchemaType[]>;
51
57
  /**
52
58
  * Processes a ManifestSchemaType[] into categorized document/object types
@@ -193,5 +199,5 @@ declare function shouldSkipType(typeName: string): boolean;
193
199
  * a pre-resolved `string[]` of document type names.
194
200
  */
195
201
  declare function compressedSchema(types: ManifestSchemaType[], options?: CompressedSchemaOptions): Promise<string>;
196
- export { ARRAY_ITEM_SYSTEM_FIELDS, BUILT_IN_TYPE_FIELDS, type CompressedSchemaOptions, DEFAULT_LINK_ANNOTATION, type DatasetStats, DatasetStatsSchema, type FetchSchemaOptions, type FieldSchemaLookupResult, type FullSchemaOptions, type InsertOperation, type LocalizationConfig, type ManifestField, type ManifestSchemaType, type PatchOperations, type ProcessedDocumentType, SCHEMA_CONSTANTS, type SchemaCache, type SchemaFieldDisplayOptions, type SchemaFilter, type SchemaTypes, type ValidateValueFn, type ValidationContext, type ValidationError, type ValidationErrorCode, type ValidationResult, type WalkVisitor, compressedSchema, fetchDatasetStats, fetchSchemaByDescriptorId, filterToPath, fullSchema, isBuiltInType, isGenericObject, isPrimitiveType, resolveFieldSchema as navigateToFieldSchema, resolveFieldSchema, resolveFieldSchemaAllUnions as navigateToFieldSchemaAllUnions, resolveFieldSchemaAllUnions, processSchema, shouldSkipType, toSchemaPath, walkSchemaTree };
202
+ export { ARRAY_ITEM_SYSTEM_FIELDS, BUILT_IN_TYPE_FIELDS, type CompressedSchemaOptions, DEFAULT_LINK_ANNOTATION, type DatasetStats, DatasetStatsSchema, type FetchSchemaOptions, type FetchSchemaSummaryOptions, type FieldSchemaLookupResult, type FullSchemaOptions, type InsertOperation, type LexiconResponse, type LocalizationConfig, type ManifestField, type ManifestSchemaType, type PatchOperations, type ProcessedDocumentType, SCHEMA_CONSTANTS, type SchemaCache, type SchemaFieldDisplayOptions, type SchemaFilter, type SchemaTypes, type ValidateValueFn, type ValidationContext, type ValidationError, type ValidationErrorCode, type ValidationResult, type WalkVisitor, compressedSchema, fetchDatasetStats, fetchSchemaByDescriptorId, filterToPath, fullSchema, isBuiltInType, isGenericObject, isPrimitiveType, resolveFieldSchema as navigateToFieldSchema, resolveFieldSchema, resolveFieldSchemaAllUnions as navigateToFieldSchemaAllUnions, resolveFieldSchemaAllUnions, processSchema, shouldSkipType, toSchemaPath, walkSchemaTree };
197
203
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","names":[],"sources":["../src/fetchDatasetStats.ts","../src/fetchSchemaByDescriptorId.ts","../src/processSchema.ts","../src/navigate/constants.ts","../src/navigate/filterToPath.ts","../src/navigate/navigateAllUnions.ts","../src/navigate/navigateToField.ts","../src/navigate/path.ts","../src/navigate/types.ts","../src/navigate/walkTree.ts","../src/fullSchema.ts","../src/constants.ts","../src/utils.ts","../src/index.ts"],"mappings":";;KAGK,kBAAA;EAAuB,MAAA;EAAiB,KAAA,EAAO,YAAA;AAAA;EAAmB,MAAA;AAAA;AAAA,KAElE,wBAAA;EACH,cAAA;EACA,SAAA;EACA,OAAA;AAAA;AAL2E;;;;;;;;;AAAA,iBAiBvD,iBAAA,CACpB,MAAA,EAAQ,YAAA,EACR,OAAA,EAAS,wBAAA,GACR,OAAA,CAAQ,kBAAA;;AAtBmC;;;KCelC,WAAA;EACV,GAAA,GAAM,YAAA,aAAyB,OAAA,CAAQ,eAAA;EACvC,GAAA,GAAM,YAAA,UAAsB,QAAA,EAAU,eAAA,KAAoB,OAAA;AAAA;AAAA,KAmBhD,kBAAA;EDlCiE;;AAAA;;;ECwC3E,KAAA,aAAkB,WAAA,EDrClB;ECuCA,KAAA;AAAA;;;ADzBF;;;;;;;iBCqCsB,yBAAA,CACpB,MAAA,EAAQ,YAAA,EACR,YAAA,UACA,OAAA,GAAU,kBAAA,GACT,OAAA,CAAQ,kBAAA;;;AD5DmC;;iBEqJ9B,aAAA,CACd,MAAA,EAAQ,kBAAA,IACR,OAAA,GAAU,sBAAA,GACT,WAAA;;;AFxJ2C;;cGKjC,oBAAA,EAAsB,MAAA,SAAe,MAAA,SAAe,kBAAA;;;;;cA2EpD,uBAAA,EAAyB,kBAAA;;;AH9EuC;cG0FhE,wBAAA,EAA0B,MAAA,SAAe,kBAAA;;;;;;;;;AH1FuB;;;;;;iBI+J7D,YAAA,CACd,IAAA,EAAM,kBAAA,EACN,IAAA,UACA,MAAA,EAAQ,kBAAA,KACP,kBAAA;;;AJrK2C;;;iBKQ9B,2BAAA,CACd,IAAA,UACA,UAAA,EAAY,kBAAA,EACZ,MAAA,EAAQ,kBAAA,KACP,kBAAA;;;ALZ2C;;;;;;iBMyK9B,kBAAA,CACd,IAAA,UACA,UAAA,EAAY,kBAAA,EACZ,MAAA,EAAQ,kBAAA,KACP,kBAAA;;;;AN7K2C;;;;;;;;;;iBOY9B,YAAA,CAAa,IAAA;;;;APZiB;;;;iBQU9B,eAAA,CACd,QAAA,sBACA,OAAA;EAAW,iBAAA;AAAA;;;;ARVgE;iBQuB7D,aAAA,CAAc,IAAA;;;;;;;iBA4Bd,eAAA,CAAgB,IAAA;AAAA,KClCpB,WAAA,IAAe,KAAA,EAAO,aAAA,EAAe,IAAA;;;;ATAjD;iBS0EgB,cAAA,CACd,YAAA,UACA,MAAA,EAAQ,kBAAA,IACR,KAAA,EAAO,WAAA;AAAA,KC5FG,iBAAA;wDAEV,IAAA,UVJqB;EUMrB,IAAA,WVN8D;EUQ9D,aAAA;AAAA;AAAA,KAGG,kBAAA;EACH,aAAA;EACA,IAAA;EACA,IAAA;EACA,QAAA,EAAU,KAAA;IAAQ,IAAA;IAAc,IAAA;EAAA;EAChC,IAAA;AAAA;;;;AVCF;;;;;;;;iBUagB,UAAA,CACd,MAAA,EAAQ,kBAAA,IACR,OAAA,EAAS,iBAAA,GACR,MAAA,oBAA0B,kBAAA;AAAA,cCpChB,gBAAA;EAAA,wBAkBH,MAAA;EAAA;;;;;;;;;;;;;;iBCdM,cAAA,CAAe,QAAA;;;;;AZgB/B;;;;;iBaqFsB,gBAAA,CACpB,KAAA,EAAO,kBAAA,IACP,OAAA,GAAS,uBAAA,GACR,OAAA"}
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../src/fetchDatasetStats.ts","../src/fetchSchemaByDescriptorId.ts","../src/processSchema.ts","../src/navigate/constants.ts","../src/navigate/filterToPath.ts","../src/navigate/navigateAllUnions.ts","../src/navigate/navigateToField.ts","../src/navigate/path.ts","../src/navigate/types.ts","../src/navigate/walkTree.ts","../src/fullSchema.ts","../src/constants.ts","../src/utils.ts","../src/index.ts"],"mappings":";;KAGK,kBAAA;EAAuB,MAAA;EAAiB,KAAA,EAAO,YAAA;AAAA;EAAmB,MAAA;AAAA;AAAA,KAElE,wBAAA;EACH,cAAA;EACA,SAAA;EACA,OAAA;AAAA;AAL2E;;;;;;;;;AAAA,iBAiBvD,iBAAA,CACpB,MAAA,EAAQ,YAAA,EACR,OAAA,EAAS,wBAAA,GACR,OAAA,CAAQ,kBAAA;;AAtBmC;;;KCelC,WAAA;EACV,GAAA,GAAM,YAAA,aAAyB,OAAA,CAAQ,eAAA;EACvC,GAAA,GAAM,YAAA,UAAsB,QAAA,EAAU,eAAA,KAAoB,OAAA;AAAA;AAAA,KAmBhD,kBAAA;EDlCiE;;AAAA;;;ECwC3E,KAAA,aAAkB,WAAA,EDrClB;ECuCA,KAAA,WDrCA;ECuCA,MAAA;AAAA;AAAA,KAGU,yBAAA,GAA4B,IAAA,CAAK,kBAAA;ED9BN,8FCgCrC,MAAA;AAAA;;;;;;;;;;;iBAac,yBAAA,CACd,MAAA,EAAQ,YAAA,EACR,YAAA,UACA,OAAA,EAAS,yBAAA,GACR,OAAA,CAAQ,eAAA;AAAA,iBACK,yBAAA,CACd,MAAA,EAAQ,YAAA,EACR,YAAA,UACA,OAAA,GAAU,kBAAA,GACT,OAAA,CAAQ,kBAAA;;;ADzEmC;;iBEqJ9B,aAAA,CACd,MAAA,EAAQ,kBAAA,IACR,OAAA,GAAU,sBAAA,GACT,WAAA;;;AFxJ2C;;cGKjC,oBAAA,EAAsB,MAAA,SAAe,MAAA,SAAe,kBAAA;;;;;cA2EpD,uBAAA,EAAyB,kBAAA;;;AH9EuC;cG0FhE,wBAAA,EAA0B,MAAA,SAAe,kBAAA;;;;;;;;;AH1FuB;;;;;;iBI+J7D,YAAA,CACd,IAAA,EAAM,kBAAA,EACN,IAAA,UACA,MAAA,EAAQ,kBAAA,KACP,kBAAA;;;AJrK2C;;;iBKQ9B,2BAAA,CACd,IAAA,UACA,UAAA,EAAY,kBAAA,EACZ,MAAA,EAAQ,kBAAA,KACP,kBAAA;;;ALZ2C;;;;;;iBMyK9B,kBAAA,CACd,IAAA,UACA,UAAA,EAAY,kBAAA,EACZ,MAAA,EAAQ,kBAAA,KACP,kBAAA;;;;AN7K2C;;;;;;;;;;iBOY9B,YAAA,CAAa,IAAA;;;;APZiB;;;;iBQU9B,eAAA,CACd,QAAA,sBACA,OAAA;EAAW,iBAAA;AAAA;;;;ARVgE;iBQuB7D,aAAA,CAAc,IAAA;;;;;;;iBA4Bd,eAAA,CAAgB,IAAA;AAAA,KClCpB,WAAA,IAAe,KAAA,EAAO,aAAA,EAAe,IAAA;;;;ATAjD;iBS0EgB,cAAA,CACd,YAAA,UACA,MAAA,EAAQ,kBAAA,IACR,KAAA,EAAO,WAAA;AAAA,KC5FG,iBAAA;wDAEV,IAAA,UVJqB;EUMrB,IAAA,WVN8D;EUQ9D,aAAA;AAAA;AAAA,KAGG,kBAAA;EACH,aAAA;EACA,IAAA;EACA,IAAA;EACA,QAAA,EAAU,KAAA;IAAQ,IAAA;IAAc,IAAA;EAAA;EAChC,IAAA;AAAA;;;;AVCF;;;;;;;;iBUagB,UAAA,CACd,MAAA,EAAQ,kBAAA,IACR,OAAA,EAAS,iBAAA,GACR,MAAA,oBAA0B,kBAAA;AAAA,cCpChB,gBAAA;EAAA,wBAkBH,MAAA;EAAA;;;;;;;;;;;;;;iBCdM,cAAA,CAAe,QAAA;;;;;AZgB/B;;;;;iBauFsB,gBAAA,CACpB,KAAA,EAAO,kBAAA,IACP,OAAA,GAAS,uBAAA,GACR,OAAA"}
package/dist/index.js CHANGED
@@ -26,19 +26,19 @@ function setInMemoryCache(descriptorId, response, ttl) {
26
26
  memoryCache.set(descriptorId, { response, expiresAt: Date.now() + ttl });
27
27
  }
28
28
  async function fetchSchemaByDescriptorId(client, descriptorId, options) {
29
- const { cache, ttlMs = DEFAULT_TTL_MS } = options ?? {};
29
+ const { cache, ttlMs = DEFAULT_TTL_MS, output = "types" } = options ?? {};
30
30
  if (cache === !0) {
31
31
  const hit = getFromMemoryCache(descriptorId);
32
- if (hit) return convert(hit);
32
+ if (hit) return output === "summary" ? hit : convert(hit);
33
33
  } else if (cache) {
34
34
  const hit = await cache.get(descriptorId);
35
- if (hit) return convert(hit);
35
+ if (hit) return output === "summary" ? hit : convert(hit);
36
36
  }
37
37
  const response = await client.request({
38
38
  uri: `/descriptors/schemas/${descriptorId}`
39
39
  });
40
40
  return cache === !0 ? setInMemoryCache(descriptorId, response, ttlMs) : cache && await cache.set(descriptorId, response).catch(() => {
41
- }), convert(response);
41
+ }), output === "summary" ? response : convert(response);
42
42
  }
43
43
  const SCHEMA_CONSTANTS = {
44
44
  SKIP_PATTERNS: /^(system\.|sanity\.|assist\.|media\.|mux\.)/,
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../src/fetchDatasetStats.ts","../src/fetchSchemaByDescriptorId.ts","../src/constants.ts","../src/processSchema.ts","../src/navigate/filterToPath.ts","../src/utils.ts","../src/fullSchema.ts","../src/types.ts","../src/filterDocumentTypes.ts","../src/formatFields.ts","../src/formatSchema.ts","../src/index.ts"],"sourcesContent":["import type { SanityClient } from '@sanity/client'\nimport type { DatasetStats } from './types.js'\n\ntype DatasetStatsResult = { status: 'ready'; stats: DatasetStats } | { status: 'processing' }\n\ntype FetchDatasetStatsOptions = {\n organizationId: string\n projectId: string\n dataset: string\n}\n\n/**\n * Fetches dataset stats (document counts, reference counts) from the agent API.\n *\n * Returns `{ status: 'processing' }` if stats are still being computed (HTTP 202).\n * The caller should retry after a short delay.\n *\n * The `client` should be configured to point at the agent API host\n * (e.g. `api.sanity.io`) with `useProjectHostname: false`.\n */\nexport async function fetchDatasetStats(\n client: SanityClient,\n options: FetchDatasetStatsOptions,\n): Promise<DatasetStatsResult> {\n const { organizationId, projectId, dataset } = options\n\n const response = await client.request<DatasetStats | { status: string }>({\n uri: `/agent/${organizationId}/dataset-stats/${projectId}/${dataset}`,\n })\n\n if ('status' in response && response.status === 'processing') {\n return { status: 'processing' }\n }\n\n return { status: 'ready', stats: response as DatasetStats }\n}\n","import type { SanityClient } from '@sanity/client'\nimport { convertToDefinition } from '@sanity/schema-descriptor-utils'\nimport type { LexiconResponse, ManifestSchemaType } from './types.js'\n\nfunction convert(input: LexiconResponse): ManifestSchemaType[] {\n return convertToDefinition(input).types as ManifestSchemaType[]\n}\n\nconst DEFAULT_TTL_MS = 5 * 60 * 1000 // 5 minutes\n\ntype CacheEntry = { response: LexiconResponse; expiresAt: number }\n\n/**\n * Cache adapter for raw Lexicon API responses.\n * Wire this to any backing store (Redis, in-memory Map, etc.).\n */\nexport type SchemaCache = {\n get: (descriptorId: string) => Promise<LexiconResponse | null | undefined>\n set: (descriptorId: string, response: LexiconResponse) => Promise<void>\n}\n\nconst memoryCache = new Map<string, CacheEntry>()\n\nfunction getFromMemoryCache(descriptorId: string): LexiconResponse | undefined {\n const entry = memoryCache.get(descriptorId)\n if (!entry) return undefined\n if (Date.now() > entry.expiresAt) {\n memoryCache.delete(descriptorId)\n return undefined\n }\n return entry.response\n}\n\nfunction setInMemoryCache(descriptorId: string, response: LexiconResponse, ttl: number): void {\n memoryCache.set(descriptorId, { response, expiresAt: Date.now() + ttl })\n}\n\nexport type FetchSchemaOptions = {\n /**\n * Enable caching of raw Lexicon responses.\n * - `true` uses a built-in in-memory cache with a 5-minute TTL\n * - A `SchemaCache` adapter delegates to any external store (Redis, etc.)\n */\n cache?: boolean | SchemaCache\n /** Cache TTL in milliseconds (default 5 min). Only applies to the built-in memory cache. */\n ttlMs?: number\n}\n\n/**\n * Fetches and parses a schema from the Lexicon descriptor API.\n *\n * Takes a configured `@sanity/client` instance (which handles auth, host, timeouts)\n * and a descriptor ID. Returns the fully parsed ManifestSchemaType array.\n *\n * Pass `{ cache: true }` to enable in-memory caching (5 min TTL),\n * or provide a custom `SchemaCache` adapter for external stores.\n */\nexport async function fetchSchemaByDescriptorId(\n client: SanityClient,\n descriptorId: string,\n options?: FetchSchemaOptions,\n): Promise<ManifestSchemaType[]> {\n const { cache, ttlMs = DEFAULT_TTL_MS } = options ?? {}\n\n // Check cache\n if (cache === true) {\n const hit = getFromMemoryCache(descriptorId)\n if (hit) return convert(hit)\n } else if (cache) {\n const hit = await cache.get(descriptorId)\n if (hit) return convert(hit)\n }\n\n const response = await client.request<LexiconResponse>({\n uri: `/descriptors/schemas/${descriptorId}`,\n })\n\n // Populate cache\n if (cache === true) {\n setInMemoryCache(descriptorId, response, ttlMs)\n } else if (cache) {\n await cache.set(descriptorId, response).catch(() => {})\n }\n\n return convert(response)\n}\n","export const SCHEMA_CONSTANTS = {\n SKIP_PATTERNS: /^(system\\.|sanity\\.|assist\\.|media\\.|mux\\.)/,\n\n TITLE_FIELD_CANDIDATES: ['title', 'name', 'heading', 'label'] as const,\n\n DEFAULT_OPTIONS: {\n trackPaths: true as boolean,\n maxExpansionDepth: 1 as number,\n },\n\n DEFAULTS: {\n titleField: 'title',\n fallbackTitleField: '_id',\n maxFieldsInSummary: 10 as number,\n maxEnumValues: 10 as number,\n maxDescriptionLength: 50 as number,\n maxDocDescriptionLength: 512 as number,\n },\n} as const\n","import { SCHEMA_CONSTANTS } from './constants.js'\nimport type {\n ManifestSchemaType,\n ProcessedDocumentType,\n ReferenceInfo,\n SchemaField,\n SchemaFilter,\n SchemaProcessorOptions,\n SchemaTypes,\n} from './types.js'\n\n/**\n * Synchronously resolves a SchemaFilter to a string array.\n * Only handles the string[] case — GROQ filter objects must be\n * pre-resolved via `resolveFilter()` before calling `processSchema`.\n */\nfunction resolveFilterSync(filter: SchemaFilter | undefined): string[] | undefined {\n if (!filter) return undefined\n if (Array.isArray(filter)) return filter.length > 0 ? filter : undefined\n // GROQ filter object — caller should have pre-resolved via resolveFilter()\n // Ignore silently to avoid breaking sync callers\n return undefined\n}\n\nconst TITLE_FIELD_CANDIDATES = SCHEMA_CONSTANTS.TITLE_FIELD_CANDIDATES\n\nfunction isTextLike(type: string): boolean {\n return type === 'string' || type === 'text'\n}\n\nfunction findTitleField(fields: SchemaField[]): string {\n for (const candidate of TITLE_FIELD_CANDIDATES) {\n if (fields.some((f) => f.name === candidate && isTextLike(f.type))) return candidate\n }\n\n if (fields.some((f) => f.name === 'title')) return 'title'\n\n const firstText = fields.find((f) => isTextLike(f.type))\n return firstText?.name ?? SCHEMA_CONSTANTS.DEFAULTS.fallbackTitleField\n}\n\nfunction expandFields(\n fields: SchemaField[],\n objectTypes: Map<string, ManifestSchemaType>,\n depth: number,\n): SchemaField[] {\n if (depth <= 0) return fields\n\n return fields.map((field) => {\n const expanded = { ...field }\n\n if (field.type && objectTypes.has(field.type)) {\n const obj = objectTypes.get(field.type)!\n expanded.type = 'object'\n expanded.fields = expandFields(obj.fields ?? [], objectTypes, depth - 1)\n }\n\n if (Array.isArray(field.of)) {\n expanded.of = field.of.map((item: Record<string, unknown>) => {\n const itemType = item?.type as string | undefined\n if (itemType && objectTypes.has(itemType)) {\n const obj = objectTypes.get(itemType)!\n return {\n ...item,\n type: 'object',\n fields: expandFields((obj.fields ?? []) as SchemaField[], objectTypes, depth - 1),\n }\n }\n return item\n })\n }\n\n return expanded\n })\n}\n\ntype RefTarget = { type?: string }\n\nfunction collectReferences(\n fields: SchemaField[],\n path: string,\n included: (name: string) => boolean,\n trackPaths: boolean,\n outgoing: Set<string>,\n outgoingPaths: ReferenceInfo[],\n addIncoming: (targetType: string, sourceType: string, fieldPath: string) => void,\n sourceType: string,\n): void {\n for (const field of fields) {\n const fieldPath = path ? `${path}.${field.name}` : field.name\n\n if (field.type === 'reference' && field.to) {\n for (const target of field.to as RefTarget[]) {\n const t = target.type\n if (!t || !included(t)) continue\n outgoing.add(t)\n if (trackPaths) {\n outgoingPaths.push({ type: t, path: fieldPath })\n addIncoming(t, sourceType, fieldPath)\n }\n }\n }\n\n if (field.fields?.length) {\n collectReferences(\n field.fields,\n fieldPath,\n included,\n trackPaths,\n outgoing,\n outgoingPaths,\n addIncoming,\n sourceType,\n )\n }\n\n if (Array.isArray(field.of)) {\n for (const item of field.of as Record<string, unknown>[]) {\n if (item?.type === 'reference' && Array.isArray(item.to)) {\n for (const target of item.to as RefTarget[]) {\n const t = target.type\n if (!t || !included(t)) continue\n outgoing.add(t)\n const arrayPath = `${fieldPath}[]`\n if (trackPaths) {\n outgoingPaths.push({ type: t, path: arrayPath })\n addIncoming(t, sourceType, arrayPath)\n }\n }\n } else if (Array.isArray(item?.fields)) {\n collectReferences(\n item.fields as SchemaField[],\n `${fieldPath}[]`,\n included,\n trackPaths,\n outgoing,\n outgoingPaths,\n addIncoming,\n sourceType,\n )\n }\n }\n }\n }\n}\n\n/**\n * Processes a ManifestSchemaType[] into categorized document/object types\n * with expanded fields, computed references, and identified title fields.\n */\nexport function processSchema(\n schema: ManifestSchemaType[],\n options?: SchemaProcessorOptions,\n): SchemaTypes {\n const trackPaths = SCHEMA_CONSTANTS.DEFAULT_OPTIONS.trackPaths\n const includeList = resolveFilterSync(options?.filter)\n const includeSet = includeList?.length ? new Set(includeList) : null\n const included = (name: string) => !includeSet || includeSet.has(name)\n\n const maxDepth = SCHEMA_CONSTANTS.DEFAULT_OPTIONS.maxExpansionDepth\n\n // 1. Categorize into document vs object types\n const documentTypes = new Map<string, ProcessedDocumentType>()\n const objectTypes = new Map<string, ManifestSchemaType>()\n\n for (const type of schema) {\n if (type.type === 'document') {\n if (!included(type.name)) continue\n documentTypes.set(type.name, {\n name: type.name,\n title: type.title,\n description: type.description,\n deprecated: type.deprecated,\n liveEdit: type.liveEdit === true ? true : undefined,\n titleField: SCHEMA_CONSTANTS.DEFAULTS.titleField,\n fields: type.fields ?? [],\n outgoingReferences: [],\n incomingReferences: [],\n })\n } else if (type.type === 'object') {\n objectTypes.set(type.name, type)\n }\n }\n\n // 2. Expand object type references in document fields\n for (const doc of documentTypes.values()) {\n doc.fields = expandFields(doc.fields, objectTypes, maxDepth)\n }\n\n // 3. Compute references (outgoing + incoming)\n // incoming tracker: targetType -> Map<sourceType, Set<path>>\n const incomingMap = new Map<string, Map<string, Set<string>>>()\n // simple incoming: targetType -> Set<sourceType>\n const incomingSimple = new Map<string, Set<string>>()\n\n const addIncoming = (targetType: string, sourceType: string, fieldPath: string) => {\n if (!incomingSimple.has(targetType)) incomingSimple.set(targetType, new Set())\n incomingSimple.get(targetType)!.add(sourceType)\n\n if (!incomingMap.has(targetType)) incomingMap.set(targetType, new Map())\n const sourceMap = incomingMap.get(targetType)!\n if (!sourceMap.has(sourceType)) sourceMap.set(sourceType, new Set())\n sourceMap.get(sourceType)!.add(fieldPath)\n }\n\n for (const [docName, doc] of documentTypes) {\n const outgoing = new Set<string>()\n const outgoingPaths: ReferenceInfo[] = []\n\n collectReferences(\n doc.fields,\n '',\n included,\n trackPaths,\n outgoing,\n outgoingPaths,\n addIncoming,\n docName,\n )\n\n // Also track simple incoming for non-trackPaths mode\n if (!trackPaths) {\n for (const targetType of outgoing) {\n if (!incomingSimple.has(targetType)) incomingSimple.set(targetType, new Set())\n incomingSimple.get(targetType)!.add(docName)\n }\n }\n\n doc.outgoingReferences = Array.from(outgoing)\n if (trackPaths) doc.outgoingReferencePaths = outgoingPaths\n }\n\n // Apply incoming references to target documents\n for (const [targetType, sources] of incomingSimple) {\n const target = documentTypes.get(targetType)\n if (!target) continue\n target.incomingReferences = Array.from(sources)\n\n if (trackPaths && incomingMap.has(targetType)) {\n const paths: ReferenceInfo[] = []\n for (const [sourceType, fieldPaths] of incomingMap.get(targetType)!) {\n for (const p of fieldPaths) {\n paths.push({ type: sourceType, path: p })\n }\n }\n target.incomingReferencePaths = paths\n }\n }\n\n // 4. Identify title fields\n for (const doc of documentTypes.values()) {\n doc.titleField = findTitleField(doc.fields)\n }\n\n return { documentTypes, objectTypes }\n}\n\n/**\n * Expands fields for a single type at a given depth.\n * Used by getTypeSignature to expand on-demand.\n */\nexport function expandFieldsForType(\n fields: SchemaField[],\n objectTypes: Map<string, ManifestSchemaType>,\n depth: number,\n): SchemaField[] {\n return expandFields(fields, objectTypes, depth)\n}\n","/**\n * Filter schema types to specific field paths.\n * Used for displaying filtered views of schema types.\n */\n\nimport type { ManifestField, ManifestSchemaType } from '../types.js'\n\n/**\n * Parse of[N] syntax from a path segment\n */\nfunction parseOfIndexSyntax(segment: string): number | null {\n const match = segment.match(/^of\\[(\\d+)\\]$/)\n if (!match) return null\n return parseInt(match[1], 10)\n}\n\n/**\n * Parse array notation from a path segment.\n * Handles both numeric indices [0] and _key selectors [_key==\"value\"].\n */\nfunction parseArrayNotation(segment: string): { fieldName: string; isArray: true } | null {\n // Match field name followed by any bracket notation: field[...] or field[_key==\"...\"]\n const match = segment.match(/^([^[]+)\\[.*\\]$/)\n if (!match) return null\n return { fieldName: match[1], isArray: true }\n}\n\n/**\n * Create a \"not found\" marker for path navigation errors\n */\nfunction createNotFoundMarker(): ManifestSchemaType {\n return { name: '', type: 'notfound', fields: [] } as ManifestSchemaType\n}\n\n/**\n * Navigate to an of[N] index in an array type\n */\nfunction navigateToOfIndex(node: ManifestSchemaType, index: number): ManifestSchemaType | null {\n if (!node.of || !Array.isArray(node.of)) return null\n if (index < 0 || index >= node.of.length) return null\n return node.of[index] as ManifestSchemaType\n}\n\n/**\n * Navigate to a property of a schema node (not a field, but a schema property like marks, styles, etc.)\n */\nfunction navigateToSchemaProperty(\n node: ManifestSchemaType,\n propertyName: string,\n isLastSegment: boolean,\n): { result: ManifestSchemaType | null; continueWith?: ManifestSchemaType } {\n if (!node || typeof node !== 'object' || !(propertyName in node)) {\n return { result: null }\n }\n\n const propertyValue = (node as Record<string, unknown>)[propertyName]\n\n // If this is the last segment, wrap and return the property\n if (isLastSegment) {\n // For arrays, preserve the array structure\n if (Array.isArray(propertyValue)) {\n return {\n result: {\n name: propertyName,\n type: 'array',\n of: propertyValue,\n } as ManifestSchemaType,\n }\n }\n\n // For objects, spread the properties\n return {\n result: {\n name: propertyName,\n type:\n typeof propertyValue === 'object' && propertyValue !== null\n ? 'object'\n : typeof propertyValue,\n ...(propertyValue as Record<string, unknown>),\n } as ManifestSchemaType,\n }\n }\n\n // Not last segment - try to navigate deeper\n if (typeof propertyValue === 'object' && propertyValue !== null) {\n // For arrays, wrap them so of[N] navigation works\n if (Array.isArray(propertyValue)) {\n return {\n result: null,\n continueWith: {\n type: 'array',\n of: propertyValue,\n } as ManifestSchemaType,\n }\n }\n\n // For objects, continue navigation\n return {\n result: null,\n continueWith: propertyValue as ManifestSchemaType,\n }\n }\n\n return { result: null }\n}\n\n/**\n * Resolve the 'of' array for an array field, looking up referenced types if needed\n */\nfunction resolveArrayFieldOf(\n field: ManifestField,\n schema: ManifestSchemaType[],\n): ManifestSchemaType[] | null {\n // First check if field has inline 'of'\n if (field.of) return field.of as ManifestSchemaType[]\n\n // Field references another type - look it up in schema\n if (field.type) {\n const referencedType = schema.find((t) => t.name === field.type)\n if (referencedType?.of) {\n return referencedType.of as ManifestSchemaType[]\n }\n }\n\n return null\n}\n\n/**\n * Create an array type node from a field (for navigation purposes)\n */\nfunction createArrayTypeFromField(\n field: ManifestField,\n schema: ManifestSchemaType[],\n): ManifestSchemaType {\n // Try to find the referenced array type\n if (field.type) {\n const arrayType = schema.find((t) => t.name === field.type)\n if (arrayType) return arrayType\n }\n\n // Create inline array type\n return {\n ...field,\n name: field.name,\n type: 'array',\n } as ManifestSchemaType\n}\n\n/**\n * Filter a schema type to a specific field path.\n * Supports complex path navigation including:\n * - Dot notation: \"author.person\"\n * - Array notation: \"content[]\"\n * - Array item navigation: \"content[].image\"\n * - of[N] indexed navigation: \"of[0]\", \"content.of[1]\"\n * - Property navigation: \"of[0].marks\", \"of[0].marks.annotations\"\n *\n * @param type - The schema type to filter\n * @param path - The path to filter to\n * @param schema - Full schema array to resolve type references\n * @returns A modified type containing only the specified field path, or a not-found marker\n */\nexport function filterToPath(\n type: ManifestSchemaType,\n path: string,\n schema: ManifestSchemaType[],\n): ManifestSchemaType {\n // Parse the path segments - split on dots that are NOT inside brackets\n const segments = path.split(/\\.(?![^[]*\\])/)\n\n // Handle direct of[N] access on array types (e.g., type=\"arrayType\", path=\"of[0]\")\n if (segments.length === 1 && segments[0].startsWith('of[')) {\n const index = parseOfIndexSyntax(segments[0])\n if (index !== null) {\n const item = navigateToOfIndex(type, index)\n if (item) return item\n // Index out of bounds\n return { ...type, fields: [], of: undefined }\n }\n }\n\n // Start with the type's fields or of array\n let currentNode: ManifestSchemaType = type\n let currentFields: ManifestField[] | undefined = type.fields\n\n // Navigate to the target field\n for (let i = 0; i < segments.length; i++) {\n const segment = segments[i]\n\n // Check for of[N] syntax for navigating array type definitions\n const ofIndex = parseOfIndexSyntax(segment)\n if (ofIndex !== null) {\n const item = navigateToOfIndex(currentNode, ofIndex)\n\n if (item) {\n // If this is the last segment, return this item\n if (i === segments.length - 1) {\n return item\n }\n\n // Otherwise, navigate into this item\n currentNode = item\n currentFields = currentNode.fields\n continue\n }\n\n // Index out of bounds or not an array type\n return { ...type, fields: [], of: undefined }\n }\n\n // Handle regular field access or array notation: \"field[]\" or \"field[index]\"\n const arrayNotation = parseArrayNotation(segment)\n const fieldName = arrayNotation ? arrayNotation.fieldName : segment\n\n // Try to find as a field first\n const field: ManifestField | undefined = currentFields?.find((f) => f.name === fieldName)\n\n if (!field) {\n // Not a field - check if it's a property of the current schema node\n // This allows navigation like of[0].marks or of[0].styles\n const isLastSegment = i === segments.length - 1\n const propertyNav = navigateToSchemaProperty(currentNode, fieldName, isLastSegment)\n\n if (propertyNav.result) {\n return propertyNav.result\n }\n\n if (propertyNav.continueWith) {\n currentNode = propertyNav.continueWith\n currentFields = currentNode.fields\n continue\n }\n\n // Field not found and not a property - return not found marker\n return createNotFoundMarker()\n }\n\n // If this is the last segment, we found our target\n if (i === segments.length - 1) {\n // Check if this is array notation (field[])\n if (arrayNotation) {\n const indexMatch = segment.match(/\\[(\\d+)\\]$/)\n if (indexMatch) {\n // This is field[N] syntax - not supported yet, treat as field[]\n }\n\n // For array notation (field[]), return the array type directly\n // This prevents path recursion in navigator (e.g., content[].content[])\n return createArrayTypeFromField(field, schema)\n }\n // Return a modified type with only this field\n return { ...type, fields: [field] }\n }\n\n // Navigate deeper\n if (arrayNotation) {\n // For arrays, look in the 'of' items using helper\n const fieldOf = resolveArrayFieldOf(field, schema)\n\n if (!fieldOf) {\n // No array items found\n return { ...type, fields: [] }\n }\n\n // Update currentNode to be the array field's type for of[N] navigation\n currentNode = createArrayTypeFromField(field, schema)\n\n const nextSegment = segments[i + 1]\n if (!nextSegment) {\n // Path ends with [] - can't navigate further in this loop\n continue\n }\n\n // CASE 0: Check if nextSegment is of[N] syntax - this allows content[].of[0] navigation\n const nextOfIndex = parseOfIndexSyntax(nextSegment)\n if (nextOfIndex !== null) {\n // Navigate to the of[N] item in the array type\n const item = navigateToOfIndex(currentNode, nextOfIndex)\n if (item) {\n // Check if this is the last segment\n if (i + 1 === segments.length - 1) {\n // Return the array item directly\n return item\n }\n // More segments after of[N] - continue navigation from this item\n currentNode = item\n currentFields = item.fields\n i++ // Consume the of[N] segment\n continue\n } else {\n // Index out of bounds\n return { ...type, fields: [], of: undefined }\n }\n }\n\n // CASE 1: Check if nextSegment matches an array item TYPE NAME\n const arrayItemByType = fieldOf.find(\n (item) => item.name === nextSegment || item.type === nextSegment,\n )\n\n if (arrayItemByType) {\n // Found a matching type!\n // Check if this is the LAST segment in the path\n if (i + 1 === segments.length - 1) {\n // This IS the final destination - return the matched type\n // Whether or not it has fields, we return it\n return { ...type, fields: [{ ...field, of: [arrayItemByType] }] }\n }\n\n // More segments after this - need to navigate into the type's fields\n if (arrayItemByType.fields) {\n currentFields = arrayItemByType.fields\n i++ // Consume the type name segment\n continue\n } else {\n // Type has no fields (primitive) but path continues - error\n return { ...type, fields: [] }\n }\n }\n\n // CASE 2: nextSegment is not a type name - try to find it as a FIELD NAME across all array item types\n const matchingFields: Array<{ typeName: string; field: ManifestField }> = []\n for (const item of fieldOf) {\n const itemAsType = item as ManifestSchemaType\n if (itemAsType.fields && Array.isArray(itemAsType.fields)) {\n const matchingField = itemAsType.fields.find((f: ManifestField) => f.name === nextSegment)\n if (matchingField) {\n matchingFields.push({\n typeName: (itemAsType.name || itemAsType.type) as string,\n field: matchingField,\n })\n }\n }\n }\n\n if (matchingFields.length === 0) {\n // Field not found in any array item type\n return { ...type, fields: [] }\n }\n\n // Found field(s) - if this is the last segment, return the matches\n if (i + 1 === segments.length - 1) {\n // This is the last segment - return the matching field(s)\n // If only one match, we can return it directly as nested under the array\n // If multiple matches from different array types, show all of them\n if (matchingFields.length === 1) {\n // Single match - create array field with nested fields showing the matched field\n const match = matchingFields[0]\n const syntheticArrayField: ManifestField = {\n ...field,\n of: [\n {\n name: match.typeName,\n type: 'object',\n fields: [match.field], // The matched field\n },\n ],\n }\n return { ...type, fields: [syntheticArrayField] }\n } else {\n // Multiple matches - show all matching fields from different types\n const syntheticArrayField: ManifestField = {\n ...field,\n of: matchingFields.map((m) => ({\n name: m.typeName,\n type: 'object',\n fields: [m.field],\n })),\n }\n return { ...type, fields: [syntheticArrayField] }\n }\n }\n\n // More segments after this - continue navigation from the first match\n // (In practice, multiple matches with further navigation is complex - we'll use first match)\n currentFields = matchingFields[0].field.fields\n i++ // Consume the field name segment\n } else if (field.fields) {\n // For objects, look in fields\n currentFields = field.fields\n } else {\n // Can't navigate deeper\n return { ...type, fields: [] }\n }\n }\n\n return { ...type, fields: [] }\n}\n","import { SCHEMA_CONSTANTS } from './constants.js'\n\nconst SKIP_ALLOWLIST = new Set(['sanity.agentContext', 'sanity.agentContextConversation'])\n\nexport function shouldSkipType(typeName: string): boolean {\n if (SKIP_ALLOWLIST.has(typeName)) return false\n return SCHEMA_CONSTANTS.SKIP_PATTERNS.test(typeName)\n}\n","import { filterToPath } from './navigate/filterToPath.js'\nimport { isGenericObject, isPrimitiveType } from './navigate/types.js'\nimport type { ManifestField, ManifestSchemaType } from './types.js'\nimport { shouldSkipType } from './utils.js'\n\nexport type FullSchemaOptions = {\n /** The document type name to return (e.g. \"post\"). */\n type: string\n /** Optional field path to scope the result (e.g. \"content\" or \"content[].codeBlock\"). */\n path?: string\n /** Size threshold in bytes before returning a navigator instead of the full JSON (default 200KB). */\n sizeThreshold?: number\n}\n\ntype LargeNodeNavigator = {\n _rawLargeNode: true\n name: string\n type: string\n children: Array<{ type: string; path: string }>\n hint: string\n}\n\n/**\n * Returns the complete JSON structure for a specific document type, optionally\n * scoped to a field path. Internal/system types are filtered out.\n *\n * When the JSON output exceeds `sizeThreshold`, a navigator object is returned\n * instead — listing child paths the caller can drill into.\n *\n * This is the counterpart to `compressedSchema`:\n * - `compressedSchema` → lossy text summary for LLM context windows\n * - `fullSchema` → complete JSON for schema explorer tools and mutation agents\n */\nexport function fullSchema(\n schema: ManifestSchemaType[],\n options: FullSchemaOptions,\n): Record<string, unknown> | LargeNodeNavigator {\n const { type: typeName, path, sizeThreshold = 200 * 1024 } = options\n\n const type = schema.find((t) => t.name === typeName)\n if (!type) {\n const documentTypes = schema\n .filter((t) => t.type === 'document' && !shouldSkipType(t.name))\n .map((t) => t.name)\n .sort()\n .slice(0, 10)\n\n return {\n _error: true,\n message: `Type \"${typeName}\" not found`,\n availableTypes: documentTypes,\n }\n }\n\n const targetNode = path ? filterToPath(type, path, schema) : type\n\n if (path) {\n if (targetNode.type === 'notfound') {\n return {\n _error: true,\n message: `Path \"${path}\" not found in type \"${typeName}\"`,\n type: typeName,\n path,\n }\n }\n\n const originalHadFields = type.fields && type.fields.length > 0\n const resultHasFields = targetNode.fields && targetNode.fields.length > 0\n const resultHasOf = targetNode.of && targetNode.of.length > 0\n const resultIsDifferent = targetNode !== type\n\n const hasJustTypeProperty = targetNode.type && Object.keys(targetNode).length <= 2\n const hasPropertyContent = resultIsDifferent && Object.keys(targetNode).length > 2\n const resultHasContent =\n resultHasFields ||\n resultHasOf ||\n targetNode.validation ||\n targetNode.options ||\n targetNode.to ||\n (resultIsDifferent && hasJustTypeProperty) ||\n hasPropertyContent\n\n const pathNotFound =\n (resultIsDifferent && !resultHasContent) ||\n (!resultIsDifferent && originalHadFields && !resultHasFields && !resultHasOf)\n\n if (pathNotFound) {\n return {\n _error: true,\n message: `Path \"${path}\" not found in type \"${typeName}\"`,\n type: typeName,\n path,\n }\n }\n }\n\n const rawSubtree = extractRawSubtree(targetNode)\n\n const jsonString = JSON.stringify(rawSubtree, null, 2)\n const sizeInBytes = new TextEncoder().encode(jsonString).length\n\n if (sizeInBytes <= sizeThreshold) {\n return rawSubtree\n }\n\n return generateLargeNodeNavigator(targetNode, path, typeName)\n}\n\nfunction extractRawSubtree(node: ManifestSchemaType): Record<string, unknown> {\n const cleaned = JSON.parse(JSON.stringify(node))\n\n if (cleaned.fields && Array.isArray(cleaned.fields)) {\n cleaned.fields = cleaned.fields.filter((field: ManifestField) => !shouldSkipType(field.name))\n }\n\n return cleaned\n}\n\nfunction generateLargeNodeNavigator(\n node: ManifestSchemaType,\n currentPath: string | undefined,\n rootTypeName: string,\n): LargeNodeNavigator {\n const children: Array<{ type: string; path: string }> = []\n\n if ((node.type === 'array' || node.of) && Array.isArray(node.of) && node.of.length > 0) {\n node.of.forEach((item: Record<string, unknown>, index: number) => {\n const itemType =\n item.name ||\n item.title ||\n (item.type && item.type !== 'object' ? item.type : null) ||\n item.type ||\n 'unknown'\n\n children.push({\n type: String(itemType),\n path: currentPath ? `${currentPath}.of[${index}]` : `of[${index}]`,\n })\n })\n } else if (node.fields && Array.isArray(node.fields)) {\n node.fields.forEach((field: ManifestField) => {\n if (shouldSkipType(field.name)) return\n\n const childPath = currentPath ? `${currentPath}.${field.name}` : field.name\n\n if (field.type === 'array' && field.of && Array.isArray(field.of)) {\n const arrayPath = `${childPath}[]`\n\n field.of.forEach((item: Record<string, unknown>) => {\n if (item.name || item.type) {\n const itemType = String(item.name || item.type)\n if (!isPrimitiveType(itemType, { includeBlockTypes: true })) {\n children.push({ type: itemType, path: `${arrayPath}.${itemType}` })\n }\n }\n })\n\n if (field.of.length > 0) {\n children.push({ type: 'array', path: arrayPath })\n }\n } else if (field.type === 'object' || field.fields) {\n children.push({ type: field.type || 'object', path: childPath })\n } else if (field.type && !isPrimitiveType(field.type, { includeBlockTypes: true })) {\n children.push({ type: field.type, path: childPath })\n }\n })\n } else if (isGenericObject(node)) {\n const nodeObj = node as Record<string, unknown>\n const skipKeys = new Set(['type', 'name', '_type', '_key'])\n\n for (const key of Object.keys(nodeObj)) {\n if (skipKeys.has(key)) continue\n\n const value = nodeObj[key]\n const childPath = currentPath ? `${currentPath}.${key}` : key\n\n let propertyType = 'unknown'\n if (Array.isArray(value)) propertyType = 'array'\n else if (typeof value === 'object' && value !== null) propertyType = 'object'\n else propertyType = typeof value\n\n children.push({ type: propertyType, path: childPath })\n }\n }\n\n return {\n _rawLargeNode: true,\n name: currentPath || rootTypeName,\n type: node.type || 'object',\n children,\n hint: 'This node is large. Fetch a specific child path to drill in.',\n }\n}\n","import { z } from 'zod'\n\nexport type {\n HoistedEntry,\n HoistedMarker,\n InlineOrHoisted,\n LexiconResponse,\n SchemaSummary,\n TypeDef,\n} from '@sanity/schema-descriptor-utils'\n\ntype ManifestSerializable =\n | string\n | number\n | boolean\n | { [k: string]: ManifestSerializable }\n | ManifestSerializable[]\n\nexport type ManifestSchemaType = {\n type: string\n name: string\n title?: string\n description?: string\n deprecated?: { reason: string }\n readOnly?: boolean | 'conditional'\n hidden?: boolean | 'conditional'\n validation?: ManifestValidationGroup[]\n fields?: ManifestField[]\n to?: ManifestReferenceMember[]\n of?: ManifestArrayMember[]\n preview?: { select: Record<string, string> }\n fieldsets?: ManifestFieldset[]\n options?: Record<string, ManifestSerializable>\n // Portable text\n marks?: {\n annotations?: ManifestArrayMember[]\n decorators?: ManifestTitledValue[]\n }\n lists?: ManifestTitledValue[]\n styles?: ManifestTitledValue[]\n // Userland (assignable to ManifestSerializable | undefined)\n [index: string]: unknown\n}\n\ntype ManifestFieldset = {\n name: string\n title?: string\n [index: string]: ManifestSerializable | undefined\n}\n\ntype ManifestTitledValue = {\n value: string\n title?: string\n}\n\nexport type ManifestField = ManifestSchemaType & { fieldset?: string }\n\ntype ManifestArrayMember = Omit<ManifestSchemaType, 'name'> & { name?: string }\n\ntype ManifestReferenceMember = Omit<ManifestSchemaType, 'name'> & { name?: string }\n\ntype ManifestValidationGroup = {\n rules: ManifestValidationRule[]\n message?: string\n level?: 'error' | 'warning' | 'info'\n}\n\ntype ManifestValidationRule = {\n flag: 'presence' | string\n constraint?: 'required' | ManifestSerializable\n [index: string]: ManifestSerializable | undefined\n}\n\nconst InOutCountsSchema = z.object({\n incoming: z.record(z.union([z.number(), z.literal('unknown')])),\n outgoing: z.record(z.union([z.number(), z.literal('unknown')])),\n})\n\nexport const DatasetStatsSchema = z.object({\n documentCount: z.record(z.number()).optional(),\n referenceCount: z.record(InOutCountsSchema).optional(),\n})\n\nexport type DatasetStats = z.infer<typeof DatasetStatsSchema>\nexport type InOutCounts = z.infer<typeof InOutCountsSchema>\n\nexport type SchemaField = ManifestField\n\nexport type ReferenceInfo = {\n type: string\n path: string\n}\n\nexport type ProcessedDocumentType = {\n name: string\n title?: string\n description?: string\n deprecated?: { reason: string }\n liveEdit?: boolean\n titleField: string\n fields: ManifestField[]\n outgoingReferences: string[]\n incomingReferences: string[]\n outgoingReferencePaths?: ReferenceInfo[]\n incomingReferencePaths?: ReferenceInfo[]\n}\n\nexport type SchemaTypes = {\n documentTypes: Map<string, ProcessedDocumentType>\n objectTypes: Map<string, ManifestSchemaType>\n}\n\n/**\n * Filter document types by GROQ expressions or an explicit list.\n * - `{ read?, write? }` — GROQ boolean expressions (requires groq-js peer dep).\n * Types matching either expression are included (union).\n * - `string[]` — explicit list of document type names to include.\n * - `undefined` / empty — include all document types.\n */\nexport type SchemaFilter = { read?: string; write?: string } | string[]\n\nexport type SchemaFieldDisplayOptions = {\n showAll?: boolean\n maxCount?: number\n includeDescription?: boolean\n includeHidden?: boolean\n includeDeprecated?: boolean\n maxEnumValues?: number\n maxDescriptionLength?: number\n}\n\nexport type CompressedSchemaOptions = {\n datasetStats?: DatasetStats\n filter?: SchemaFilter\n fields?: SchemaFieldDisplayOptions\n /**\n * When `true`, document types with `documentCount === 0` are still rendered\n * (and their references fall back to the count-less format, since all edges\n * would be zero anyway). Default `false` preserves the existing behavior of\n * dropping empty types when `datasetStats` is provided.\n */\n includeEmpty?: boolean\n}\n\nexport type SchemaProcessorOptions = {\n filter?: SchemaFilter\n fields?: SchemaFieldDisplayOptions\n}\n","import type { ExprNode } from 'groq-js'\n\nimport type { ManifestSchemaType, SchemaFilter } from './types.js'\n\ntype GroqFilter = { read?: string; write?: string }\n\n/**\n * Resolves a `SchemaFilter` into a string array of document type names.\n * - `string[]` is returned as-is\n * - `{ read?, write? }` GROQ expressions are evaluated against the schema\n * - `undefined` returns `undefined` (no filtering)\n *\n * An empty result means \"include everything\".\n */\nexport async function resolveFilter(\n schema: ManifestSchemaType[],\n filter: SchemaFilter | undefined,\n): Promise<string[] | undefined> {\n if (!filter) return undefined\n if (Array.isArray(filter)) return filter.length > 0 ? filter : undefined\n const result = await getFilteredDocumentTypes(schema, filter)\n return result.length > 0 ? result : undefined\n}\n\n/**\n * Extracts document type names to include based on read/write GROQ filter expressions.\n * Returns the union of types allowed by either filter.\n *\n * Returns an empty array when no filtering is needed (no filter, or filter matches all types).\n * Consumers should treat an empty result as \"include everything\".\n */\nexport async function getFilteredDocumentTypes(\n schema: ManifestSchemaType[],\n filter: GroqFilter | undefined,\n): Promise<string[]> {\n if (!filter || (!filter.read && !filter.write)) return []\n\n const allDocTypes = schema.filter((s) => s.type === 'document').map((s) => s.name)\n if (allDocTypes.length === 0) return []\n\n const combined = new Set<string>()\n\n if (filter.read) {\n for (const type of await filterTypesByExpression(filter.read, allDocTypes)) {\n combined.add(type)\n }\n }\n\n if (filter.write) {\n for (const type of await filterTypesByExpression(filter.write, allDocTypes)) {\n combined.add(type)\n }\n }\n\n // If the union covers all types, no filtering is needed\n if (combined.size === allDocTypes.length) return []\n\n return Array.from(combined)\n}\n\n/**\n * Filters document type names by evaluating a GROQ boolean expression.\n * Best-effort: returns all types when inference is not possible.\n *\n * Supports `_type == \"x\"`, `_type != \"x\"`, `_type in [...]`,\n * and boolean combinations (&&, ||, !).\n */\nexport async function filterTypesByExpression(\n filterExpr: string | undefined,\n allTypes: string[],\n): Promise<Set<string>> {\n if (!filterExpr?.trim() || allTypes.length === 0) {\n return new Set(allTypes)\n }\n\n try {\n const { parse } = await import('groq-js')\n const ast = parse(filterExpr)\n const matching = allTypes.filter((type) => evaluateForType(ast, type) !== false)\n return matching.length > 0 ? new Set(matching) : new Set(allTypes)\n } catch {\n return new Set(allTypes)\n }\n}\n\n// ---------------------------------------------------------------------------\n// AST evaluation — uses `unknown` accessors to avoid coupling to groq-js internals\n// ---------------------------------------------------------------------------\n\ntype Node = ExprNode | Record<string, unknown>\n\nfunction prop(node: Node, key: string): unknown {\n return (node as Record<string, unknown>)[key]\n}\n\nfunction child(node: Node, key: string): Node {\n return prop(node, key) as Node\n}\n\nfunction evaluateForType(node: Node, type: string): boolean | null {\n if (!node || typeof node !== 'object') return null\n const kind = (node as { type?: string }).type\n\n switch (kind) {\n case 'OpCall':\n return evaluateOpCall(node, type)\n\n case 'And': {\n const left = evaluateForType(child(node, 'left'), type)\n const right = evaluateForType(child(node, 'right'), type)\n if (left === false || right === false) return false\n if (left === true && right === true) return true\n return null\n }\n\n case 'Or': {\n const left = evaluateForType(child(node, 'left'), type)\n const right = evaluateForType(child(node, 'right'), type)\n if (left === true || right === true) return true\n if (left === false && right === false) return false\n return null\n }\n\n case 'Not': {\n const inner = evaluateForType(child(node, 'base'), type)\n return inner === null ? null : !inner\n }\n\n case 'Group':\n return evaluateForType(child(node, 'base'), type)\n\n default:\n return null\n }\n}\n\nfunction evaluateOpCall(node: Node, type: string): boolean | null {\n const op = prop(node, 'op') as string\n const left = child(node, 'left')\n const right = child(node, 'right')\n\n if (!isTypeAttribute(left)) return null\n\n const rightType = (right as { type?: string }).type\n\n if (op === '==' && rightType === 'Value') {\n const val = prop(right, 'value')\n return typeof val === 'string' ? type === val : null\n }\n\n if (op === '!=' && rightType === 'Value') {\n const val = prop(right, 'value')\n return typeof val === 'string' ? type !== val : null\n }\n\n if (op === 'in' && rightType === 'Array') {\n const values = extractStringValues(right)\n return values ? values.includes(type) : null\n }\n\n return null\n}\n\nfunction isTypeAttribute(node: Node): boolean {\n return (node as { type?: string })?.type === 'AccessAttribute' && prop(node, 'name') === '_type'\n}\n\nfunction extractStringValues(arrayNode: Node): string[] | null {\n const elements = prop(arrayNode, 'elements') as\n | Array<{ type: string; value?: Node; isSplat?: boolean }>\n | undefined\n if (!elements) return null\n const values: string[] = []\n for (const el of elements) {\n if (el.type !== 'ArrayElement' || el.isSplat) return null\n const val = el.value as Node | undefined\n if ((val as { type?: string })?.type !== 'Value') return null\n const v = prop(val!, 'value')\n if (typeof v !== 'string') return null\n values.push(v)\n }\n return values\n}\n","import { SCHEMA_CONSTANTS } from './constants.js'\nimport type { SchemaField, SchemaFieldDisplayOptions } from './types.js'\n\nconst SIMPLE_TYPE_MAP: Record<string, string> = {\n document: 'object',\n crossDatasetReference: 'reference',\n}\n\nconst KNOWN_TYPES = new Set([\n 'string',\n 'text',\n 'number',\n 'boolean',\n 'date',\n 'datetime',\n 'image',\n 'file',\n 'array',\n 'object',\n 'reference',\n 'block',\n 'slug',\n 'geopoint',\n 'span',\n 'url',\n 'email',\n 'color',\n])\n\nfunction getSimpleFieldType(field: SchemaField): string {\n return SIMPLE_TYPE_MAP[field.type] ?? (KNOWN_TYPES.has(field.type) ? field.type : 'object')\n}\n\nfunction normalize(s: string): string {\n return s.toLowerCase().replace(/[^a-z0-9]/g, '')\n}\n\nfunction getEnumValues(field: SchemaField): string[] | null {\n const list = (field.options as Record<string, unknown> | undefined)?.list\n if (!Array.isArray(list) || list.length === 0) return null\n return list\n .map((item: unknown) =>\n typeof item === 'string' ? item : (item as Record<string, string>).value,\n )\n .filter(Boolean)\n}\n\nfunction formatTypeString(field: SchemaField, maxEnumValues: number): string {\n const enumValues = getEnumValues(field)\n if (!enumValues) return getSimpleFieldType(field)\n\n const shown = enumValues.slice(0, maxEnumValues)\n const overflow = enumValues.length - maxEnumValues\n return shown.join('|') + (overflow > 0 ? `|...${overflow} more` : '')\n}\n\nfunction formatDescription(\n field: SchemaField,\n includeDescription: boolean,\n maxLen: number,\n): string {\n if (!includeDescription || !field.title) return ''\n if (normalize(field.title) === normalize(field.name)) return ''\n const desc = field.title.length > maxLen ? `${field.title.slice(0, maxLen)}...` : field.title\n return `: ${desc}`\n}\n\nexport function formatFieldNamesWithTypes(\n fields: SchemaField[],\n options?: SchemaFieldDisplayOptions,\n): string {\n const {\n showAll,\n maxCount,\n includeDescription = false,\n includeHidden = false,\n includeDeprecated = false,\n maxEnumValues = SCHEMA_CONSTANTS.DEFAULTS.maxEnumValues,\n maxDescriptionLength = SCHEMA_CONSTANTS.DEFAULTS.maxDescriptionLength,\n } = options ?? {}\n\n const filtered = fields.filter((f) => {\n if (!includeDeprecated && f.deprecated) return false\n if (!includeHidden && f.hidden) return false\n return true\n })\n\n const limit = showAll\n ? filtered.length\n : (maxCount ?? SCHEMA_CONSTANTS.DEFAULTS.maxFieldsInSummary)\n\n const shown = filtered.slice(0, limit)\n const overflow = filtered.length - limit\n\n const fieldList = shown\n .map((f) => {\n const typeStr = formatTypeString(f, maxEnumValues)\n const desc = formatDescription(f, includeDescription, maxDescriptionLength)\n return `${f.name}<${typeStr}>${desc}`\n })\n .join(', ')\n\n if (overflow <= 0) return fieldList\n const fieldWord = overflow === 1 ? 'field' : 'fields'\n return `${fieldList}, +${overflow} more ${fieldWord}`\n}\n","import { SCHEMA_CONSTANTS } from './constants.js'\nimport { formatFieldNamesWithTypes } from './formatFields.js'\nimport type {\n DatasetStats,\n ManifestSchemaType,\n ProcessedDocumentType,\n SchemaField,\n SchemaFieldDisplayOptions,\n} from './types.js'\nimport { shouldSkipType } from './utils.js'\n\nfunction formatReferenceCount(count: number | 'unknown'): string {\n return typeof count === 'number' && count > 0 ? `×${count}` : ''\n}\n\nfunction formatDocumentCount(count: number | undefined, hasDocumentCounts: boolean): string {\n return hasDocumentCounts ? String(count ?? 0) : 'unknown'\n}\n\nfunction calculateMaxDepth(\n fields: SchemaField[],\n objectTypes: Map<string, ManifestSchemaType>,\n currentDepth: number = 1,\n visited: Set<string> = new Set(),\n): number {\n let max = currentDepth\n\n for (const field of fields) {\n if (field.fields?.length) {\n max = Math.max(max, calculateMaxDepth(field.fields, objectTypes, currentDepth + 1, visited))\n }\n\n const checkObjectType = (typeName: string | undefined) => {\n if (!typeName || visited.has(typeName)) return\n const obj = objectTypes.get(typeName)\n if (!obj?.fields?.length) return\n visited.add(typeName)\n max = Math.max(max, calculateMaxDepth(obj.fields, objectTypes, currentDepth + 1, visited))\n }\n\n checkObjectType(field.type)\n\n if (Array.isArray(field.of)) {\n for (const item of field.of) {\n checkObjectType((item as Record<string, unknown>)?.type as string | undefined)\n }\n }\n }\n\n return max\n}\n\ntype RefInfo = { outgoing: string; incoming: string }\n\nfunction formatRefsWithCounts(\n doc: ProcessedDocumentType,\n referenceCount: DatasetStats['referenceCount'],\n): RefInfo {\n const counts = referenceCount ?? {}\n\n const outgoing =\n [...(doc.outgoingReferencePaths ?? [])]\n .sort((a, b) => `${a.path}->${a.type}`.localeCompare(`${b.path}->${b.type}`))\n .map((r) => {\n const pathKey = `${r.path}->${r.type}`\n const refCount = counts[doc.name]?.outgoing?.[pathKey]\n if (typeof refCount !== 'number' || refCount <= 0) return null\n return `${pathKey}${formatReferenceCount(refCount)}`\n })\n .filter(Boolean)\n .join(', ') || ''\n\n if (doc.incomingReferences.length === 0) return { outgoing, incoming: '' }\n\n const incomingParts: string[] = []\n for (const sourceType of [...doc.incomingReferences].sort()) {\n const sourceCounts = counts[sourceType]\n let total = 0\n if (sourceCounts?.outgoing) {\n const suffix = `->${doc.name}`\n for (const [pathKey, pathCount] of Object.entries(sourceCounts.outgoing)) {\n if (pathKey.endsWith(suffix) && typeof pathCount === 'number' && pathCount > 0) {\n total += pathCount\n }\n }\n }\n if (total > 0) incomingParts.push(`${sourceType}${formatReferenceCount(total)}`)\n }\n\n return { outgoing, incoming: incomingParts.join(', ') }\n}\n\nfunction formatRefsSimple(doc: ProcessedDocumentType): RefInfo {\n return {\n outgoing:\n doc.outgoingReferences.length > 0 ? [...doc.outgoingReferences].sort().join(', ') : '',\n incoming:\n doc.incomingReferences.length > 0 ? [...doc.incomingReferences].sort().join(', ') : '',\n }\n}\n\nfunction formatDocEntry(\n name: string,\n doc: ProcessedDocumentType,\n objectTypes: Map<string, ManifestSchemaType>,\n fieldOptions: SchemaFieldDisplayOptions,\n datasetStats?: DatasetStats,\n includeEmpty = false,\n): string | null {\n if (shouldSkipType(name)) return null\n\n const { documentCount, referenceCount } = datasetStats ?? {}\n const hasDocumentCounts = !!documentCount\n const count = documentCount?.[name] ?? 0\n const isExplicitZero = !!documentCount && documentCount[name] === 0\n\n // Skip types with zero documents when we have counts, unless opted-in\n if (isExplicitZero && !includeEmpty) return null\n\n const useCount = formatDocumentCount(count, hasDocumentCounts)\n\n // Deprecated types get a condensed single-line entry\n if (doc.deprecated) {\n return `- ${name} (DEPRECATED: \"${doc.deprecated.reason}\", count: ${useCount})`\n }\n\n // For explicitly-empty types, fall back to the simple (count-less) reference\n // format — the with-counts path would produce nothing since all edges are zero.\n const refs =\n referenceCount && !isExplicitZero\n ? formatRefsWithCounts(doc, referenceCount)\n : formatRefsSimple(doc)\n\n const depth = calculateMaxDepth(doc.fields, objectTypes)\n const fieldNames = formatFieldNamesWithTypes(doc.fields, fieldOptions)\n const indent = ' '\n\n const liveEditFlag = doc.liveEdit ? 'liveEdit, ' : ''\n const parts = [\n `- ${name} (${liveEditFlag}title: ${doc.titleField}, depth: ${depth}, count: ${useCount})`,\n ]\n\n if (doc.description) {\n const maxLen = SCHEMA_CONSTANTS.DEFAULTS.maxDocDescriptionLength\n const desc =\n doc.description.length > maxLen ? `${doc.description.slice(0, maxLen)}...` : doc.description\n parts.push(`${indent}- description: ${desc}`)\n }\n\n parts.push(`${indent}- fields: ${fieldNames}`)\n\n if (refs.outgoing) parts.push(`${indent}- references: ${refs.outgoing}`)\n if (refs.incoming) parts.push(`${indent}- referenced by: ${refs.incoming}`)\n\n return parts.join('\\n')\n}\n\n/**\n * Generates a compressed text representation of processed schema types.\n * Document types are sorted alphabetically, filtered by dataset stats,\n * and formatted with field summaries and reference information.\n */\nexport function formatCompressedSchema(\n documentTypes: Map<string, ProcessedDocumentType>,\n objectTypes: Map<string, ManifestSchemaType>,\n fieldOptions: SchemaFieldDisplayOptions,\n datasetStats?: DatasetStats,\n includeEmpty?: boolean,\n): string {\n return [...documentTypes.entries()]\n .sort(([a], [b]) => a.localeCompare(b))\n .map(([name, doc]) =>\n formatDocEntry(name, doc, objectTypes, fieldOptions, datasetStats, includeEmpty),\n )\n .filter(Boolean)\n .join('\\n')\n}\n","// ---------------------------------------------------------------------------\n// Fetch\n// ---------------------------------------------------------------------------\n\nexport { fetchDatasetStats } from './fetchDatasetStats.js'\nexport {\n type FetchSchemaOptions,\n fetchSchemaByDescriptorId,\n type SchemaCache,\n} from './fetchSchemaByDescriptorId.js'\n\n// ---------------------------------------------------------------------------\n// Process\n// ---------------------------------------------------------------------------\n\nexport { processSchema } from './processSchema.js'\n\n// ---------------------------------------------------------------------------\n// Navigate\n// ---------------------------------------------------------------------------\n\nexport {\n ARRAY_ITEM_SYSTEM_FIELDS,\n BUILT_IN_TYPE_FIELDS,\n DEFAULT_LINK_ANNOTATION,\n} from './navigate/constants.js'\nexport { filterToPath } from './navigate/filterToPath.js'\nexport {\n resolveFieldSchemaAllUnions,\n resolveFieldSchemaAllUnions as navigateToFieldSchemaAllUnions,\n} from './navigate/navigateAllUnions.js'\n// Deprecated aliases — remove in next minor\nexport {\n resolveFieldSchema,\n resolveFieldSchema as navigateToFieldSchema,\n} from './navigate/navigateToField.js'\nexport { toSchemaPath } from './navigate/path.js'\nexport { isBuiltInType, isGenericObject, isPrimitiveType } from './navigate/types.js'\nexport type { WalkVisitor } from './navigate/walkTree.js'\nexport { walkSchemaTree } from './navigate/walkTree.js'\n\n// ---------------------------------------------------------------------------\n// Format\n// ---------------------------------------------------------------------------\n\nexport { type FullSchemaOptions, fullSchema } from './fullSchema.js'\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport type {\n CompressedSchemaOptions,\n DatasetStats,\n ManifestField,\n ManifestSchemaType,\n ProcessedDocumentType,\n SchemaFieldDisplayOptions,\n SchemaFilter,\n SchemaTypes,\n} from './types.js'\nexport { DatasetStatsSchema } from './types.js'\n\n// ---------------------------------------------------------------------------\n// Utilities\n// ---------------------------------------------------------------------------\n\nexport { SCHEMA_CONSTANTS } from './constants.js'\nexport { shouldSkipType } from './utils.js'\n\n// ---------------------------------------------------------------------------\n// Validation — types re-exported for convenience, functions via subpath\n// ---------------------------------------------------------------------------\n// Import functions from '@sanity/agent-schema/validation'\n\nexport type {\n FieldSchemaLookupResult,\n InsertOperation,\n LocalizationConfig,\n PatchOperations,\n ValidateValueFn,\n ValidationContext,\n ValidationError,\n ValidationErrorCode,\n ValidationResult,\n} from './validation/types.js'\n\n// ---------------------------------------------------------------------------\n// Convenience\n// ---------------------------------------------------------------------------\n\nimport { resolveFilter } from './filterDocumentTypes.js'\nimport { formatCompressedSchema } from './formatSchema.js'\nimport { processSchema } from './processSchema.js'\nimport type { CompressedSchemaOptions, ManifestSchemaType } from './types.js'\n\n/**\n * Generates a compressed text representation of a schema for agent consumption.\n *\n * Takes parsed schema types and returns compact text summarizing document types,\n * fields, references, and optionally document/reference counts.\n *\n * The `filter` option accepts either a GROQ filter `{ read?, write? }` or\n * a pre-resolved `string[]` of document type names.\n */\nexport async function compressedSchema(\n types: ManifestSchemaType[],\n options: CompressedSchemaOptions = {},\n): Promise<string> {\n const includeTypes = await resolveFilter(types, options.filter)\n\n const { documentTypes, objectTypes } = processSchema(types, {\n filter: includeTypes,\n fields: options.fields,\n })\n\n return formatCompressedSchema(\n documentTypes,\n objectTypes,\n options.fields ?? {},\n options.datasetStats,\n options.includeEmpty,\n )\n}\n"],"names":["processSchema"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../src/fetchDatasetStats.ts","../src/fetchSchemaByDescriptorId.ts","../src/constants.ts","../src/processSchema.ts","../src/navigate/filterToPath.ts","../src/utils.ts","../src/fullSchema.ts","../src/types.ts","../src/filterDocumentTypes.ts","../src/formatFields.ts","../src/formatSchema.ts","../src/index.ts"],"sourcesContent":["import type { SanityClient } from '@sanity/client'\nimport type { DatasetStats } from './types.js'\n\ntype DatasetStatsResult = { status: 'ready'; stats: DatasetStats } | { status: 'processing' }\n\ntype FetchDatasetStatsOptions = {\n organizationId: string\n projectId: string\n dataset: string\n}\n\n/**\n * Fetches dataset stats (document counts, reference counts) from the agent API.\n *\n * Returns `{ status: 'processing' }` if stats are still being computed (HTTP 202).\n * The caller should retry after a short delay.\n *\n * The `client` should be configured to point at the agent API host\n * (e.g. `api.sanity.io`) with `useProjectHostname: false`.\n */\nexport async function fetchDatasetStats(\n client: SanityClient,\n options: FetchDatasetStatsOptions,\n): Promise<DatasetStatsResult> {\n const { organizationId, projectId, dataset } = options\n\n const response = await client.request<DatasetStats | { status: string }>({\n uri: `/agent/${organizationId}/dataset-stats/${projectId}/${dataset}`,\n })\n\n if ('status' in response && response.status === 'processing') {\n return { status: 'processing' }\n }\n\n return { status: 'ready', stats: response as DatasetStats }\n}\n","import type { SanityClient } from '@sanity/client'\nimport { convertToDefinition } from '@sanity/schema-descriptor-utils'\nimport type { LexiconResponse, ManifestSchemaType } from './types.js'\n\nfunction convert(input: LexiconResponse): ManifestSchemaType[] {\n return convertToDefinition(input).types as ManifestSchemaType[]\n}\n\nconst DEFAULT_TTL_MS = 5 * 60 * 1000 // 5 minutes\n\ntype CacheEntry = { response: LexiconResponse; expiresAt: number }\n\n/**\n * Cache adapter for raw Lexicon API responses.\n * Wire this to any backing store (Redis, in-memory Map, etc.).\n */\nexport type SchemaCache = {\n get: (descriptorId: string) => Promise<LexiconResponse | null | undefined>\n set: (descriptorId: string, response: LexiconResponse) => Promise<void>\n}\n\nconst memoryCache = new Map<string, CacheEntry>()\n\nfunction getFromMemoryCache(descriptorId: string): LexiconResponse | undefined {\n const entry = memoryCache.get(descriptorId)\n if (!entry) return undefined\n if (Date.now() > entry.expiresAt) {\n memoryCache.delete(descriptorId)\n return undefined\n }\n return entry.response\n}\n\nfunction setInMemoryCache(descriptorId: string, response: LexiconResponse, ttl: number): void {\n memoryCache.set(descriptorId, { response, expiresAt: Date.now() + ttl })\n}\n\nexport type FetchSchemaOptions = {\n /**\n * Enable caching of raw Lexicon responses.\n * - `true` uses a built-in in-memory cache with a 5-minute TTL\n * - A `SchemaCache` adapter delegates to any external store (Redis, etc.)\n */\n cache?: boolean | SchemaCache\n /** Cache TTL in milliseconds (default 5 min). Only applies to the built-in memory cache. */\n ttlMs?: number\n /** Return parsed schema types. This is the default. */\n output?: 'types'\n}\n\nexport type FetchSchemaSummaryOptions = Omit<FetchSchemaOptions, 'output'> & {\n /** Return the raw Lexicon response. Treat the result as read-only when caching is enabled. */\n output: 'summary'\n}\n\n/**\n * Fetches and parses a schema from the Lexicon descriptor API.\n *\n * Takes a configured `@sanity/client` instance (which handles auth, host, timeouts)\n * and a descriptor ID. Returns the fully parsed ManifestSchemaType array by default.\n * Pass `{ output: 'summary' }` to return the raw LexiconResponse instead.\n *\n * Pass `{ cache: true }` to enable in-memory caching (5 min TTL),\n * or provide a custom `SchemaCache` adapter for external stores.\n */\nexport function fetchSchemaByDescriptorId(\n client: SanityClient,\n descriptorId: string,\n options: FetchSchemaSummaryOptions,\n): Promise<LexiconResponse>\nexport function fetchSchemaByDescriptorId(\n client: SanityClient,\n descriptorId: string,\n options?: FetchSchemaOptions,\n): Promise<ManifestSchemaType[]>\nexport async function fetchSchemaByDescriptorId(\n client: SanityClient,\n descriptorId: string,\n options?: FetchSchemaOptions | FetchSchemaSummaryOptions,\n): Promise<ManifestSchemaType[] | LexiconResponse> {\n const { cache, ttlMs = DEFAULT_TTL_MS, output = 'types' } = options ?? {}\n\n // Check cache\n if (cache === true) {\n const hit = getFromMemoryCache(descriptorId)\n if (hit) return output === 'summary' ? hit : convert(hit)\n } else if (cache) {\n const hit = await cache.get(descriptorId)\n if (hit) return output === 'summary' ? hit : convert(hit)\n }\n\n const response = await client.request<LexiconResponse>({\n uri: `/descriptors/schemas/${descriptorId}`,\n })\n\n // Populate cache\n if (cache === true) {\n setInMemoryCache(descriptorId, response, ttlMs)\n } else if (cache) {\n await cache.set(descriptorId, response).catch(() => {})\n }\n\n return output === 'summary' ? response : convert(response)\n}\n","export const SCHEMA_CONSTANTS = {\n SKIP_PATTERNS: /^(system\\.|sanity\\.|assist\\.|media\\.|mux\\.)/,\n\n TITLE_FIELD_CANDIDATES: ['title', 'name', 'heading', 'label'] as const,\n\n DEFAULT_OPTIONS: {\n trackPaths: true as boolean,\n maxExpansionDepth: 1 as number,\n },\n\n DEFAULTS: {\n titleField: 'title',\n fallbackTitleField: '_id',\n maxFieldsInSummary: 10 as number,\n maxEnumValues: 10 as number,\n maxDescriptionLength: 50 as number,\n maxDocDescriptionLength: 512 as number,\n },\n} as const\n","import { SCHEMA_CONSTANTS } from './constants.js'\nimport type {\n ManifestSchemaType,\n ProcessedDocumentType,\n ReferenceInfo,\n SchemaField,\n SchemaFilter,\n SchemaProcessorOptions,\n SchemaTypes,\n} from './types.js'\n\n/**\n * Synchronously resolves a SchemaFilter to a string array.\n * Only handles the string[] case — GROQ filter objects must be\n * pre-resolved via `resolveFilter()` before calling `processSchema`.\n */\nfunction resolveFilterSync(filter: SchemaFilter | undefined): string[] | undefined {\n if (!filter) return undefined\n if (Array.isArray(filter)) return filter.length > 0 ? filter : undefined\n // GROQ filter object — caller should have pre-resolved via resolveFilter()\n // Ignore silently to avoid breaking sync callers\n return undefined\n}\n\nconst TITLE_FIELD_CANDIDATES = SCHEMA_CONSTANTS.TITLE_FIELD_CANDIDATES\n\nfunction isTextLike(type: string): boolean {\n return type === 'string' || type === 'text'\n}\n\nfunction findTitleField(fields: SchemaField[]): string {\n for (const candidate of TITLE_FIELD_CANDIDATES) {\n if (fields.some((f) => f.name === candidate && isTextLike(f.type))) return candidate\n }\n\n if (fields.some((f) => f.name === 'title')) return 'title'\n\n const firstText = fields.find((f) => isTextLike(f.type))\n return firstText?.name ?? SCHEMA_CONSTANTS.DEFAULTS.fallbackTitleField\n}\n\nfunction expandFields(\n fields: SchemaField[],\n objectTypes: Map<string, ManifestSchemaType>,\n depth: number,\n): SchemaField[] {\n if (depth <= 0) return fields\n\n return fields.map((field) => {\n const expanded = { ...field }\n\n if (field.type && objectTypes.has(field.type)) {\n const obj = objectTypes.get(field.type)!\n expanded.type = 'object'\n expanded.fields = expandFields(obj.fields ?? [], objectTypes, depth - 1)\n }\n\n if (Array.isArray(field.of)) {\n expanded.of = field.of.map((item: Record<string, unknown>) => {\n const itemType = item?.type as string | undefined\n if (itemType && objectTypes.has(itemType)) {\n const obj = objectTypes.get(itemType)!\n return {\n ...item,\n type: 'object',\n fields: expandFields((obj.fields ?? []) as SchemaField[], objectTypes, depth - 1),\n }\n }\n return item\n })\n }\n\n return expanded\n })\n}\n\ntype RefTarget = { type?: string }\n\nfunction collectReferences(\n fields: SchemaField[],\n path: string,\n included: (name: string) => boolean,\n trackPaths: boolean,\n outgoing: Set<string>,\n outgoingPaths: ReferenceInfo[],\n addIncoming: (targetType: string, sourceType: string, fieldPath: string) => void,\n sourceType: string,\n): void {\n for (const field of fields) {\n const fieldPath = path ? `${path}.${field.name}` : field.name\n\n if (field.type === 'reference' && field.to) {\n for (const target of field.to as RefTarget[]) {\n const t = target.type\n if (!t || !included(t)) continue\n outgoing.add(t)\n if (trackPaths) {\n outgoingPaths.push({ type: t, path: fieldPath })\n addIncoming(t, sourceType, fieldPath)\n }\n }\n }\n\n if (field.fields?.length) {\n collectReferences(\n field.fields,\n fieldPath,\n included,\n trackPaths,\n outgoing,\n outgoingPaths,\n addIncoming,\n sourceType,\n )\n }\n\n if (Array.isArray(field.of)) {\n for (const item of field.of as Record<string, unknown>[]) {\n if (item?.type === 'reference' && Array.isArray(item.to)) {\n for (const target of item.to as RefTarget[]) {\n const t = target.type\n if (!t || !included(t)) continue\n outgoing.add(t)\n const arrayPath = `${fieldPath}[]`\n if (trackPaths) {\n outgoingPaths.push({ type: t, path: arrayPath })\n addIncoming(t, sourceType, arrayPath)\n }\n }\n } else if (Array.isArray(item?.fields)) {\n collectReferences(\n item.fields as SchemaField[],\n `${fieldPath}[]`,\n included,\n trackPaths,\n outgoing,\n outgoingPaths,\n addIncoming,\n sourceType,\n )\n }\n }\n }\n }\n}\n\n/**\n * Processes a ManifestSchemaType[] into categorized document/object types\n * with expanded fields, computed references, and identified title fields.\n */\nexport function processSchema(\n schema: ManifestSchemaType[],\n options?: SchemaProcessorOptions,\n): SchemaTypes {\n const trackPaths = SCHEMA_CONSTANTS.DEFAULT_OPTIONS.trackPaths\n const includeList = resolveFilterSync(options?.filter)\n const includeSet = includeList?.length ? new Set(includeList) : null\n const included = (name: string) => !includeSet || includeSet.has(name)\n\n const maxDepth = SCHEMA_CONSTANTS.DEFAULT_OPTIONS.maxExpansionDepth\n\n // 1. Categorize into document vs object types\n const documentTypes = new Map<string, ProcessedDocumentType>()\n const objectTypes = new Map<string, ManifestSchemaType>()\n\n for (const type of schema) {\n if (type.type === 'document') {\n if (!included(type.name)) continue\n documentTypes.set(type.name, {\n name: type.name,\n title: type.title,\n description: type.description,\n deprecated: type.deprecated,\n liveEdit: type.liveEdit === true ? true : undefined,\n titleField: SCHEMA_CONSTANTS.DEFAULTS.titleField,\n fields: type.fields ?? [],\n outgoingReferences: [],\n incomingReferences: [],\n })\n } else if (type.type === 'object') {\n objectTypes.set(type.name, type)\n }\n }\n\n // 2. Expand object type references in document fields\n for (const doc of documentTypes.values()) {\n doc.fields = expandFields(doc.fields, objectTypes, maxDepth)\n }\n\n // 3. Compute references (outgoing + incoming)\n // incoming tracker: targetType -> Map<sourceType, Set<path>>\n const incomingMap = new Map<string, Map<string, Set<string>>>()\n // simple incoming: targetType -> Set<sourceType>\n const incomingSimple = new Map<string, Set<string>>()\n\n const addIncoming = (targetType: string, sourceType: string, fieldPath: string) => {\n if (!incomingSimple.has(targetType)) incomingSimple.set(targetType, new Set())\n incomingSimple.get(targetType)!.add(sourceType)\n\n if (!incomingMap.has(targetType)) incomingMap.set(targetType, new Map())\n const sourceMap = incomingMap.get(targetType)!\n if (!sourceMap.has(sourceType)) sourceMap.set(sourceType, new Set())\n sourceMap.get(sourceType)!.add(fieldPath)\n }\n\n for (const [docName, doc] of documentTypes) {\n const outgoing = new Set<string>()\n const outgoingPaths: ReferenceInfo[] = []\n\n collectReferences(\n doc.fields,\n '',\n included,\n trackPaths,\n outgoing,\n outgoingPaths,\n addIncoming,\n docName,\n )\n\n // Also track simple incoming for non-trackPaths mode\n if (!trackPaths) {\n for (const targetType of outgoing) {\n if (!incomingSimple.has(targetType)) incomingSimple.set(targetType, new Set())\n incomingSimple.get(targetType)!.add(docName)\n }\n }\n\n doc.outgoingReferences = Array.from(outgoing)\n if (trackPaths) doc.outgoingReferencePaths = outgoingPaths\n }\n\n // Apply incoming references to target documents\n for (const [targetType, sources] of incomingSimple) {\n const target = documentTypes.get(targetType)\n if (!target) continue\n target.incomingReferences = Array.from(sources)\n\n if (trackPaths && incomingMap.has(targetType)) {\n const paths: ReferenceInfo[] = []\n for (const [sourceType, fieldPaths] of incomingMap.get(targetType)!) {\n for (const p of fieldPaths) {\n paths.push({ type: sourceType, path: p })\n }\n }\n target.incomingReferencePaths = paths\n }\n }\n\n // 4. Identify title fields\n for (const doc of documentTypes.values()) {\n doc.titleField = findTitleField(doc.fields)\n }\n\n return { documentTypes, objectTypes }\n}\n\n/**\n * Expands fields for a single type at a given depth.\n * Used by getTypeSignature to expand on-demand.\n */\nexport function expandFieldsForType(\n fields: SchemaField[],\n objectTypes: Map<string, ManifestSchemaType>,\n depth: number,\n): SchemaField[] {\n return expandFields(fields, objectTypes, depth)\n}\n","/**\n * Filter schema types to specific field paths.\n * Used for displaying filtered views of schema types.\n */\n\nimport type { ManifestField, ManifestSchemaType } from '../types.js'\n\n/**\n * Parse of[N] syntax from a path segment\n */\nfunction parseOfIndexSyntax(segment: string): number | null {\n const match = segment.match(/^of\\[(\\d+)\\]$/)\n if (!match) return null\n return parseInt(match[1], 10)\n}\n\n/**\n * Parse array notation from a path segment.\n * Handles both numeric indices [0] and _key selectors [_key==\"value\"].\n */\nfunction parseArrayNotation(segment: string): { fieldName: string; isArray: true } | null {\n // Match field name followed by any bracket notation: field[...] or field[_key==\"...\"]\n const match = segment.match(/^([^[]+)\\[.*\\]$/)\n if (!match) return null\n return { fieldName: match[1], isArray: true }\n}\n\n/**\n * Create a \"not found\" marker for path navigation errors\n */\nfunction createNotFoundMarker(): ManifestSchemaType {\n return { name: '', type: 'notfound', fields: [] } as ManifestSchemaType\n}\n\n/**\n * Navigate to an of[N] index in an array type\n */\nfunction navigateToOfIndex(node: ManifestSchemaType, index: number): ManifestSchemaType | null {\n if (!node.of || !Array.isArray(node.of)) return null\n if (index < 0 || index >= node.of.length) return null\n return node.of[index] as ManifestSchemaType\n}\n\n/**\n * Navigate to a property of a schema node (not a field, but a schema property like marks, styles, etc.)\n */\nfunction navigateToSchemaProperty(\n node: ManifestSchemaType,\n propertyName: string,\n isLastSegment: boolean,\n): { result: ManifestSchemaType | null; continueWith?: ManifestSchemaType } {\n if (!node || typeof node !== 'object' || !(propertyName in node)) {\n return { result: null }\n }\n\n const propertyValue = (node as Record<string, unknown>)[propertyName]\n\n // If this is the last segment, wrap and return the property\n if (isLastSegment) {\n // For arrays, preserve the array structure\n if (Array.isArray(propertyValue)) {\n return {\n result: {\n name: propertyName,\n type: 'array',\n of: propertyValue,\n } as ManifestSchemaType,\n }\n }\n\n // For objects, spread the properties\n return {\n result: {\n name: propertyName,\n type:\n typeof propertyValue === 'object' && propertyValue !== null\n ? 'object'\n : typeof propertyValue,\n ...(propertyValue as Record<string, unknown>),\n } as ManifestSchemaType,\n }\n }\n\n // Not last segment - try to navigate deeper\n if (typeof propertyValue === 'object' && propertyValue !== null) {\n // For arrays, wrap them so of[N] navigation works\n if (Array.isArray(propertyValue)) {\n return {\n result: null,\n continueWith: {\n type: 'array',\n of: propertyValue,\n } as ManifestSchemaType,\n }\n }\n\n // For objects, continue navigation\n return {\n result: null,\n continueWith: propertyValue as ManifestSchemaType,\n }\n }\n\n return { result: null }\n}\n\n/**\n * Resolve the 'of' array for an array field, looking up referenced types if needed\n */\nfunction resolveArrayFieldOf(\n field: ManifestField,\n schema: ManifestSchemaType[],\n): ManifestSchemaType[] | null {\n // First check if field has inline 'of'\n if (field.of) return field.of as ManifestSchemaType[]\n\n // Field references another type - look it up in schema\n if (field.type) {\n const referencedType = schema.find((t) => t.name === field.type)\n if (referencedType?.of) {\n return referencedType.of as ManifestSchemaType[]\n }\n }\n\n return null\n}\n\n/**\n * Create an array type node from a field (for navigation purposes)\n */\nfunction createArrayTypeFromField(\n field: ManifestField,\n schema: ManifestSchemaType[],\n): ManifestSchemaType {\n // Try to find the referenced array type\n if (field.type) {\n const arrayType = schema.find((t) => t.name === field.type)\n if (arrayType) return arrayType\n }\n\n // Create inline array type\n return {\n ...field,\n name: field.name,\n type: 'array',\n } as ManifestSchemaType\n}\n\n/**\n * Filter a schema type to a specific field path.\n * Supports complex path navigation including:\n * - Dot notation: \"author.person\"\n * - Array notation: \"content[]\"\n * - Array item navigation: \"content[].image\"\n * - of[N] indexed navigation: \"of[0]\", \"content.of[1]\"\n * - Property navigation: \"of[0].marks\", \"of[0].marks.annotations\"\n *\n * @param type - The schema type to filter\n * @param path - The path to filter to\n * @param schema - Full schema array to resolve type references\n * @returns A modified type containing only the specified field path, or a not-found marker\n */\nexport function filterToPath(\n type: ManifestSchemaType,\n path: string,\n schema: ManifestSchemaType[],\n): ManifestSchemaType {\n // Parse the path segments - split on dots that are NOT inside brackets\n const segments = path.split(/\\.(?![^[]*\\])/)\n\n // Handle direct of[N] access on array types (e.g., type=\"arrayType\", path=\"of[0]\")\n if (segments.length === 1 && segments[0].startsWith('of[')) {\n const index = parseOfIndexSyntax(segments[0])\n if (index !== null) {\n const item = navigateToOfIndex(type, index)\n if (item) return item\n // Index out of bounds\n return { ...type, fields: [], of: undefined }\n }\n }\n\n // Start with the type's fields or of array\n let currentNode: ManifestSchemaType = type\n let currentFields: ManifestField[] | undefined = type.fields\n\n // Navigate to the target field\n for (let i = 0; i < segments.length; i++) {\n const segment = segments[i]\n\n // Check for of[N] syntax for navigating array type definitions\n const ofIndex = parseOfIndexSyntax(segment)\n if (ofIndex !== null) {\n const item = navigateToOfIndex(currentNode, ofIndex)\n\n if (item) {\n // If this is the last segment, return this item\n if (i === segments.length - 1) {\n return item\n }\n\n // Otherwise, navigate into this item\n currentNode = item\n currentFields = currentNode.fields\n continue\n }\n\n // Index out of bounds or not an array type\n return { ...type, fields: [], of: undefined }\n }\n\n // Handle regular field access or array notation: \"field[]\" or \"field[index]\"\n const arrayNotation = parseArrayNotation(segment)\n const fieldName = arrayNotation ? arrayNotation.fieldName : segment\n\n // Try to find as a field first\n const field: ManifestField | undefined = currentFields?.find((f) => f.name === fieldName)\n\n if (!field) {\n // Not a field - check if it's a property of the current schema node\n // This allows navigation like of[0].marks or of[0].styles\n const isLastSegment = i === segments.length - 1\n const propertyNav = navigateToSchemaProperty(currentNode, fieldName, isLastSegment)\n\n if (propertyNav.result) {\n return propertyNav.result\n }\n\n if (propertyNav.continueWith) {\n currentNode = propertyNav.continueWith\n currentFields = currentNode.fields\n continue\n }\n\n // Field not found and not a property - return not found marker\n return createNotFoundMarker()\n }\n\n // If this is the last segment, we found our target\n if (i === segments.length - 1) {\n // Check if this is array notation (field[])\n if (arrayNotation) {\n const indexMatch = segment.match(/\\[(\\d+)\\]$/)\n if (indexMatch) {\n // This is field[N] syntax - not supported yet, treat as field[]\n }\n\n // For array notation (field[]), return the array type directly\n // This prevents path recursion in navigator (e.g., content[].content[])\n return createArrayTypeFromField(field, schema)\n }\n // Return a modified type with only this field\n return { ...type, fields: [field] }\n }\n\n // Navigate deeper\n if (arrayNotation) {\n // For arrays, look in the 'of' items using helper\n const fieldOf = resolveArrayFieldOf(field, schema)\n\n if (!fieldOf) {\n // No array items found\n return { ...type, fields: [] }\n }\n\n // Update currentNode to be the array field's type for of[N] navigation\n currentNode = createArrayTypeFromField(field, schema)\n\n const nextSegment = segments[i + 1]\n if (!nextSegment) {\n // Path ends with [] - can't navigate further in this loop\n continue\n }\n\n // CASE 0: Check if nextSegment is of[N] syntax - this allows content[].of[0] navigation\n const nextOfIndex = parseOfIndexSyntax(nextSegment)\n if (nextOfIndex !== null) {\n // Navigate to the of[N] item in the array type\n const item = navigateToOfIndex(currentNode, nextOfIndex)\n if (item) {\n // Check if this is the last segment\n if (i + 1 === segments.length - 1) {\n // Return the array item directly\n return item\n }\n // More segments after of[N] - continue navigation from this item\n currentNode = item\n currentFields = item.fields\n i++ // Consume the of[N] segment\n continue\n } else {\n // Index out of bounds\n return { ...type, fields: [], of: undefined }\n }\n }\n\n // CASE 1: Check if nextSegment matches an array item TYPE NAME\n const arrayItemByType = fieldOf.find(\n (item) => item.name === nextSegment || item.type === nextSegment,\n )\n\n if (arrayItemByType) {\n // Found a matching type!\n // Check if this is the LAST segment in the path\n if (i + 1 === segments.length - 1) {\n // This IS the final destination - return the matched type\n // Whether or not it has fields, we return it\n return { ...type, fields: [{ ...field, of: [arrayItemByType] }] }\n }\n\n // More segments after this - need to navigate into the type's fields\n if (arrayItemByType.fields) {\n currentFields = arrayItemByType.fields\n i++ // Consume the type name segment\n continue\n } else {\n // Type has no fields (primitive) but path continues - error\n return { ...type, fields: [] }\n }\n }\n\n // CASE 2: nextSegment is not a type name - try to find it as a FIELD NAME across all array item types\n const matchingFields: Array<{ typeName: string; field: ManifestField }> = []\n for (const item of fieldOf) {\n const itemAsType = item as ManifestSchemaType\n if (itemAsType.fields && Array.isArray(itemAsType.fields)) {\n const matchingField = itemAsType.fields.find((f: ManifestField) => f.name === nextSegment)\n if (matchingField) {\n matchingFields.push({\n typeName: (itemAsType.name || itemAsType.type) as string,\n field: matchingField,\n })\n }\n }\n }\n\n if (matchingFields.length === 0) {\n // Field not found in any array item type\n return { ...type, fields: [] }\n }\n\n // Found field(s) - if this is the last segment, return the matches\n if (i + 1 === segments.length - 1) {\n // This is the last segment - return the matching field(s)\n // If only one match, we can return it directly as nested under the array\n // If multiple matches from different array types, show all of them\n if (matchingFields.length === 1) {\n // Single match - create array field with nested fields showing the matched field\n const match = matchingFields[0]\n const syntheticArrayField: ManifestField = {\n ...field,\n of: [\n {\n name: match.typeName,\n type: 'object',\n fields: [match.field], // The matched field\n },\n ],\n }\n return { ...type, fields: [syntheticArrayField] }\n } else {\n // Multiple matches - show all matching fields from different types\n const syntheticArrayField: ManifestField = {\n ...field,\n of: matchingFields.map((m) => ({\n name: m.typeName,\n type: 'object',\n fields: [m.field],\n })),\n }\n return { ...type, fields: [syntheticArrayField] }\n }\n }\n\n // More segments after this - continue navigation from the first match\n // (In practice, multiple matches with further navigation is complex - we'll use first match)\n currentFields = matchingFields[0].field.fields\n i++ // Consume the field name segment\n } else if (field.fields) {\n // For objects, look in fields\n currentFields = field.fields\n } else {\n // Can't navigate deeper\n return { ...type, fields: [] }\n }\n }\n\n return { ...type, fields: [] }\n}\n","import { SCHEMA_CONSTANTS } from './constants.js'\n\nconst SKIP_ALLOWLIST = new Set(['sanity.agentContext', 'sanity.agentContextConversation'])\n\nexport function shouldSkipType(typeName: string): boolean {\n if (SKIP_ALLOWLIST.has(typeName)) return false\n return SCHEMA_CONSTANTS.SKIP_PATTERNS.test(typeName)\n}\n","import { filterToPath } from './navigate/filterToPath.js'\nimport { isGenericObject, isPrimitiveType } from './navigate/types.js'\nimport type { ManifestField, ManifestSchemaType } from './types.js'\nimport { shouldSkipType } from './utils.js'\n\nexport type FullSchemaOptions = {\n /** The document type name to return (e.g. \"post\"). */\n type: string\n /** Optional field path to scope the result (e.g. \"content\" or \"content[].codeBlock\"). */\n path?: string\n /** Size threshold in bytes before returning a navigator instead of the full JSON (default 200KB). */\n sizeThreshold?: number\n}\n\ntype LargeNodeNavigator = {\n _rawLargeNode: true\n name: string\n type: string\n children: Array<{ type: string; path: string }>\n hint: string\n}\n\n/**\n * Returns the complete JSON structure for a specific document type, optionally\n * scoped to a field path. Internal/system types are filtered out.\n *\n * When the JSON output exceeds `sizeThreshold`, a navigator object is returned\n * instead — listing child paths the caller can drill into.\n *\n * This is the counterpart to `compressedSchema`:\n * - `compressedSchema` → lossy text summary for LLM context windows\n * - `fullSchema` → complete JSON for schema explorer tools and mutation agents\n */\nexport function fullSchema(\n schema: ManifestSchemaType[],\n options: FullSchemaOptions,\n): Record<string, unknown> | LargeNodeNavigator {\n const { type: typeName, path, sizeThreshold = 200 * 1024 } = options\n\n const type = schema.find((t) => t.name === typeName)\n if (!type) {\n const documentTypes = schema\n .filter((t) => t.type === 'document' && !shouldSkipType(t.name))\n .map((t) => t.name)\n .sort()\n .slice(0, 10)\n\n return {\n _error: true,\n message: `Type \"${typeName}\" not found`,\n availableTypes: documentTypes,\n }\n }\n\n const targetNode = path ? filterToPath(type, path, schema) : type\n\n if (path) {\n if (targetNode.type === 'notfound') {\n return {\n _error: true,\n message: `Path \"${path}\" not found in type \"${typeName}\"`,\n type: typeName,\n path,\n }\n }\n\n const originalHadFields = type.fields && type.fields.length > 0\n const resultHasFields = targetNode.fields && targetNode.fields.length > 0\n const resultHasOf = targetNode.of && targetNode.of.length > 0\n const resultIsDifferent = targetNode !== type\n\n const hasJustTypeProperty = targetNode.type && Object.keys(targetNode).length <= 2\n const hasPropertyContent = resultIsDifferent && Object.keys(targetNode).length > 2\n const resultHasContent =\n resultHasFields ||\n resultHasOf ||\n targetNode.validation ||\n targetNode.options ||\n targetNode.to ||\n (resultIsDifferent && hasJustTypeProperty) ||\n hasPropertyContent\n\n const pathNotFound =\n (resultIsDifferent && !resultHasContent) ||\n (!resultIsDifferent && originalHadFields && !resultHasFields && !resultHasOf)\n\n if (pathNotFound) {\n return {\n _error: true,\n message: `Path \"${path}\" not found in type \"${typeName}\"`,\n type: typeName,\n path,\n }\n }\n }\n\n const rawSubtree = extractRawSubtree(targetNode)\n\n const jsonString = JSON.stringify(rawSubtree, null, 2)\n const sizeInBytes = new TextEncoder().encode(jsonString).length\n\n if (sizeInBytes <= sizeThreshold) {\n return rawSubtree\n }\n\n return generateLargeNodeNavigator(targetNode, path, typeName)\n}\n\nfunction extractRawSubtree(node: ManifestSchemaType): Record<string, unknown> {\n const cleaned = JSON.parse(JSON.stringify(node))\n\n if (cleaned.fields && Array.isArray(cleaned.fields)) {\n cleaned.fields = cleaned.fields.filter((field: ManifestField) => !shouldSkipType(field.name))\n }\n\n return cleaned\n}\n\nfunction generateLargeNodeNavigator(\n node: ManifestSchemaType,\n currentPath: string | undefined,\n rootTypeName: string,\n): LargeNodeNavigator {\n const children: Array<{ type: string; path: string }> = []\n\n if ((node.type === 'array' || node.of) && Array.isArray(node.of) && node.of.length > 0) {\n node.of.forEach((item: Record<string, unknown>, index: number) => {\n const itemType =\n item.name ||\n item.title ||\n (item.type && item.type !== 'object' ? item.type : null) ||\n item.type ||\n 'unknown'\n\n children.push({\n type: String(itemType),\n path: currentPath ? `${currentPath}.of[${index}]` : `of[${index}]`,\n })\n })\n } else if (node.fields && Array.isArray(node.fields)) {\n node.fields.forEach((field: ManifestField) => {\n if (shouldSkipType(field.name)) return\n\n const childPath = currentPath ? `${currentPath}.${field.name}` : field.name\n\n if (field.type === 'array' && field.of && Array.isArray(field.of)) {\n const arrayPath = `${childPath}[]`\n\n field.of.forEach((item: Record<string, unknown>) => {\n if (item.name || item.type) {\n const itemType = String(item.name || item.type)\n if (!isPrimitiveType(itemType, { includeBlockTypes: true })) {\n children.push({ type: itemType, path: `${arrayPath}.${itemType}` })\n }\n }\n })\n\n if (field.of.length > 0) {\n children.push({ type: 'array', path: arrayPath })\n }\n } else if (field.type === 'object' || field.fields) {\n children.push({ type: field.type || 'object', path: childPath })\n } else if (field.type && !isPrimitiveType(field.type, { includeBlockTypes: true })) {\n children.push({ type: field.type, path: childPath })\n }\n })\n } else if (isGenericObject(node)) {\n const nodeObj = node as Record<string, unknown>\n const skipKeys = new Set(['type', 'name', '_type', '_key'])\n\n for (const key of Object.keys(nodeObj)) {\n if (skipKeys.has(key)) continue\n\n const value = nodeObj[key]\n const childPath = currentPath ? `${currentPath}.${key}` : key\n\n let propertyType = 'unknown'\n if (Array.isArray(value)) propertyType = 'array'\n else if (typeof value === 'object' && value !== null) propertyType = 'object'\n else propertyType = typeof value\n\n children.push({ type: propertyType, path: childPath })\n }\n }\n\n return {\n _rawLargeNode: true,\n name: currentPath || rootTypeName,\n type: node.type || 'object',\n children,\n hint: 'This node is large. Fetch a specific child path to drill in.',\n }\n}\n","import { z } from 'zod'\n\nexport type {\n HoistedEntry,\n HoistedMarker,\n InlineOrHoisted,\n LexiconResponse,\n SchemaSummary,\n TypeDef,\n} from '@sanity/schema-descriptor-utils'\n\ntype ManifestSerializable =\n | string\n | number\n | boolean\n | { [k: string]: ManifestSerializable }\n | ManifestSerializable[]\n\nexport type ManifestSchemaType = {\n type: string\n name: string\n title?: string\n description?: string\n deprecated?: { reason: string }\n readOnly?: boolean | 'conditional'\n hidden?: boolean | 'conditional'\n validation?: ManifestValidationGroup[]\n fields?: ManifestField[]\n to?: ManifestReferenceMember[]\n of?: ManifestArrayMember[]\n preview?: { select: Record<string, string> }\n fieldsets?: ManifestFieldset[]\n options?: Record<string, ManifestSerializable>\n // Portable text\n marks?: {\n annotations?: ManifestArrayMember[]\n decorators?: ManifestTitledValue[]\n }\n lists?: ManifestTitledValue[]\n styles?: ManifestTitledValue[]\n // Userland (assignable to ManifestSerializable | undefined)\n [index: string]: unknown\n}\n\ntype ManifestFieldset = {\n name: string\n title?: string\n [index: string]: ManifestSerializable | undefined\n}\n\ntype ManifestTitledValue = {\n value: string\n title?: string\n}\n\nexport type ManifestField = ManifestSchemaType & { fieldset?: string }\n\ntype ManifestArrayMember = Omit<ManifestSchemaType, 'name'> & { name?: string }\n\ntype ManifestReferenceMember = Omit<ManifestSchemaType, 'name'> & { name?: string }\n\ntype ManifestValidationGroup = {\n rules: ManifestValidationRule[]\n message?: string\n level?: 'error' | 'warning' | 'info'\n}\n\ntype ManifestValidationRule = {\n flag: 'presence' | string\n constraint?: 'required' | ManifestSerializable\n [index: string]: ManifestSerializable | undefined\n}\n\nconst InOutCountsSchema = z.object({\n incoming: z.record(z.union([z.number(), z.literal('unknown')])),\n outgoing: z.record(z.union([z.number(), z.literal('unknown')])),\n})\n\nexport const DatasetStatsSchema = z.object({\n documentCount: z.record(z.number()).optional(),\n referenceCount: z.record(InOutCountsSchema).optional(),\n})\n\nexport type DatasetStats = z.infer<typeof DatasetStatsSchema>\nexport type InOutCounts = z.infer<typeof InOutCountsSchema>\n\nexport type SchemaField = ManifestField\n\nexport type ReferenceInfo = {\n type: string\n path: string\n}\n\nexport type ProcessedDocumentType = {\n name: string\n title?: string\n description?: string\n deprecated?: { reason: string }\n liveEdit?: boolean\n titleField: string\n fields: ManifestField[]\n outgoingReferences: string[]\n incomingReferences: string[]\n outgoingReferencePaths?: ReferenceInfo[]\n incomingReferencePaths?: ReferenceInfo[]\n}\n\nexport type SchemaTypes = {\n documentTypes: Map<string, ProcessedDocumentType>\n objectTypes: Map<string, ManifestSchemaType>\n}\n\n/**\n * Filter document types by GROQ expressions or an explicit list.\n * - `{ read?, write? }` — GROQ boolean expressions (requires groq-js peer dep).\n * Types matching either expression are included (union).\n * - `string[]` — explicit list of document type names to include.\n * - `undefined` / empty — include all document types.\n */\nexport type SchemaFilter = { read?: string; write?: string } | string[]\n\nexport type SchemaFieldDisplayOptions = {\n showAll?: boolean\n maxCount?: number\n includeDescription?: boolean\n includeHidden?: boolean\n includeDeprecated?: boolean\n maxEnumValues?: number\n maxDescriptionLength?: number\n}\n\nexport type CompressedSchemaOptions = {\n datasetStats?: DatasetStats\n filter?: SchemaFilter\n fields?: SchemaFieldDisplayOptions\n /**\n * When `true`, document types with `documentCount === 0` are still rendered\n * (and their references fall back to the count-less format, since all edges\n * would be zero anyway). Default `false` preserves the existing behavior of\n * dropping empty types when `datasetStats` is provided.\n */\n includeEmpty?: boolean\n}\n\nexport type SchemaProcessorOptions = {\n filter?: SchemaFilter\n fields?: SchemaFieldDisplayOptions\n}\n","import type { ExprNode } from 'groq-js'\n\nimport type { ManifestSchemaType, SchemaFilter } from './types.js'\n\ntype GroqFilter = { read?: string; write?: string }\n\n/**\n * Resolves a `SchemaFilter` into a string array of document type names.\n * - `string[]` is returned as-is\n * - `{ read?, write? }` GROQ expressions are evaluated against the schema\n * - `undefined` returns `undefined` (no filtering)\n *\n * An empty result means \"include everything\".\n */\nexport async function resolveFilter(\n schema: ManifestSchemaType[],\n filter: SchemaFilter | undefined,\n): Promise<string[] | undefined> {\n if (!filter) return undefined\n if (Array.isArray(filter)) return filter.length > 0 ? filter : undefined\n const result = await getFilteredDocumentTypes(schema, filter)\n return result.length > 0 ? result : undefined\n}\n\n/**\n * Extracts document type names to include based on read/write GROQ filter expressions.\n * Returns the union of types allowed by either filter.\n *\n * Returns an empty array when no filtering is needed (no filter, or filter matches all types).\n * Consumers should treat an empty result as \"include everything\".\n */\nexport async function getFilteredDocumentTypes(\n schema: ManifestSchemaType[],\n filter: GroqFilter | undefined,\n): Promise<string[]> {\n if (!filter || (!filter.read && !filter.write)) return []\n\n const allDocTypes = schema.filter((s) => s.type === 'document').map((s) => s.name)\n if (allDocTypes.length === 0) return []\n\n const combined = new Set<string>()\n\n if (filter.read) {\n for (const type of await filterTypesByExpression(filter.read, allDocTypes)) {\n combined.add(type)\n }\n }\n\n if (filter.write) {\n for (const type of await filterTypesByExpression(filter.write, allDocTypes)) {\n combined.add(type)\n }\n }\n\n // If the union covers all types, no filtering is needed\n if (combined.size === allDocTypes.length) return []\n\n return Array.from(combined)\n}\n\n/**\n * Filters document type names by evaluating a GROQ boolean expression.\n * Best-effort: returns all types when inference is not possible.\n *\n * Supports `_type == \"x\"`, `_type != \"x\"`, `_type in [...]`,\n * and boolean combinations (&&, ||, !).\n */\nexport async function filterTypesByExpression(\n filterExpr: string | undefined,\n allTypes: string[],\n): Promise<Set<string>> {\n if (!filterExpr?.trim() || allTypes.length === 0) {\n return new Set(allTypes)\n }\n\n try {\n const { parse } = await import('groq-js')\n const ast = parse(filterExpr)\n const matching = allTypes.filter((type) => evaluateForType(ast, type) !== false)\n return matching.length > 0 ? new Set(matching) : new Set(allTypes)\n } catch {\n return new Set(allTypes)\n }\n}\n\n// ---------------------------------------------------------------------------\n// AST evaluation — uses `unknown` accessors to avoid coupling to groq-js internals\n// ---------------------------------------------------------------------------\n\ntype Node = ExprNode | Record<string, unknown>\n\nfunction prop(node: Node, key: string): unknown {\n return (node as Record<string, unknown>)[key]\n}\n\nfunction child(node: Node, key: string): Node {\n return prop(node, key) as Node\n}\n\nfunction evaluateForType(node: Node, type: string): boolean | null {\n if (!node || typeof node !== 'object') return null\n const kind = (node as { type?: string }).type\n\n switch (kind) {\n case 'OpCall':\n return evaluateOpCall(node, type)\n\n case 'And': {\n const left = evaluateForType(child(node, 'left'), type)\n const right = evaluateForType(child(node, 'right'), type)\n if (left === false || right === false) return false\n if (left === true && right === true) return true\n return null\n }\n\n case 'Or': {\n const left = evaluateForType(child(node, 'left'), type)\n const right = evaluateForType(child(node, 'right'), type)\n if (left === true || right === true) return true\n if (left === false && right === false) return false\n return null\n }\n\n case 'Not': {\n const inner = evaluateForType(child(node, 'base'), type)\n return inner === null ? null : !inner\n }\n\n case 'Group':\n return evaluateForType(child(node, 'base'), type)\n\n default:\n return null\n }\n}\n\nfunction evaluateOpCall(node: Node, type: string): boolean | null {\n const op = prop(node, 'op') as string\n const left = child(node, 'left')\n const right = child(node, 'right')\n\n if (!isTypeAttribute(left)) return null\n\n const rightType = (right as { type?: string }).type\n\n if (op === '==' && rightType === 'Value') {\n const val = prop(right, 'value')\n return typeof val === 'string' ? type === val : null\n }\n\n if (op === '!=' && rightType === 'Value') {\n const val = prop(right, 'value')\n return typeof val === 'string' ? type !== val : null\n }\n\n if (op === 'in' && rightType === 'Array') {\n const values = extractStringValues(right)\n return values ? values.includes(type) : null\n }\n\n return null\n}\n\nfunction isTypeAttribute(node: Node): boolean {\n return (node as { type?: string })?.type === 'AccessAttribute' && prop(node, 'name') === '_type'\n}\n\nfunction extractStringValues(arrayNode: Node): string[] | null {\n const elements = prop(arrayNode, 'elements') as\n | Array<{ type: string; value?: Node; isSplat?: boolean }>\n | undefined\n if (!elements) return null\n const values: string[] = []\n for (const el of elements) {\n if (el.type !== 'ArrayElement' || el.isSplat) return null\n const val = el.value as Node | undefined\n if ((val as { type?: string })?.type !== 'Value') return null\n const v = prop(val!, 'value')\n if (typeof v !== 'string') return null\n values.push(v)\n }\n return values\n}\n","import { SCHEMA_CONSTANTS } from './constants.js'\nimport type { SchemaField, SchemaFieldDisplayOptions } from './types.js'\n\nconst SIMPLE_TYPE_MAP: Record<string, string> = {\n document: 'object',\n crossDatasetReference: 'reference',\n}\n\nconst KNOWN_TYPES = new Set([\n 'string',\n 'text',\n 'number',\n 'boolean',\n 'date',\n 'datetime',\n 'image',\n 'file',\n 'array',\n 'object',\n 'reference',\n 'block',\n 'slug',\n 'geopoint',\n 'span',\n 'url',\n 'email',\n 'color',\n])\n\nfunction getSimpleFieldType(field: SchemaField): string {\n return SIMPLE_TYPE_MAP[field.type] ?? (KNOWN_TYPES.has(field.type) ? field.type : 'object')\n}\n\nfunction normalize(s: string): string {\n return s.toLowerCase().replace(/[^a-z0-9]/g, '')\n}\n\nfunction getEnumValues(field: SchemaField): string[] | null {\n const list = (field.options as Record<string, unknown> | undefined)?.list\n if (!Array.isArray(list) || list.length === 0) return null\n return list\n .map((item: unknown) =>\n typeof item === 'string' ? item : (item as Record<string, string>).value,\n )\n .filter(Boolean)\n}\n\nfunction formatTypeString(field: SchemaField, maxEnumValues: number): string {\n const enumValues = getEnumValues(field)\n if (!enumValues) return getSimpleFieldType(field)\n\n const shown = enumValues.slice(0, maxEnumValues)\n const overflow = enumValues.length - maxEnumValues\n return shown.join('|') + (overflow > 0 ? `|...${overflow} more` : '')\n}\n\nfunction formatDescription(\n field: SchemaField,\n includeDescription: boolean,\n maxLen: number,\n): string {\n if (!includeDescription || !field.title) return ''\n if (normalize(field.title) === normalize(field.name)) return ''\n const desc = field.title.length > maxLen ? `${field.title.slice(0, maxLen)}...` : field.title\n return `: ${desc}`\n}\n\nexport function formatFieldNamesWithTypes(\n fields: SchemaField[],\n options?: SchemaFieldDisplayOptions,\n): string {\n const {\n showAll,\n maxCount,\n includeDescription = false,\n includeHidden = false,\n includeDeprecated = false,\n maxEnumValues = SCHEMA_CONSTANTS.DEFAULTS.maxEnumValues,\n maxDescriptionLength = SCHEMA_CONSTANTS.DEFAULTS.maxDescriptionLength,\n } = options ?? {}\n\n const filtered = fields.filter((f) => {\n if (!includeDeprecated && f.deprecated) return false\n if (!includeHidden && f.hidden) return false\n return true\n })\n\n const limit = showAll\n ? filtered.length\n : (maxCount ?? SCHEMA_CONSTANTS.DEFAULTS.maxFieldsInSummary)\n\n const shown = filtered.slice(0, limit)\n const overflow = filtered.length - limit\n\n const fieldList = shown\n .map((f) => {\n const typeStr = formatTypeString(f, maxEnumValues)\n const desc = formatDescription(f, includeDescription, maxDescriptionLength)\n return `${f.name}<${typeStr}>${desc}`\n })\n .join(', ')\n\n if (overflow <= 0) return fieldList\n const fieldWord = overflow === 1 ? 'field' : 'fields'\n return `${fieldList}, +${overflow} more ${fieldWord}`\n}\n","import { SCHEMA_CONSTANTS } from './constants.js'\nimport { formatFieldNamesWithTypes } from './formatFields.js'\nimport type {\n DatasetStats,\n ManifestSchemaType,\n ProcessedDocumentType,\n SchemaField,\n SchemaFieldDisplayOptions,\n} from './types.js'\nimport { shouldSkipType } from './utils.js'\n\nfunction formatReferenceCount(count: number | 'unknown'): string {\n return typeof count === 'number' && count > 0 ? `×${count}` : ''\n}\n\nfunction formatDocumentCount(count: number | undefined, hasDocumentCounts: boolean): string {\n return hasDocumentCounts ? String(count ?? 0) : 'unknown'\n}\n\nfunction calculateMaxDepth(\n fields: SchemaField[],\n objectTypes: Map<string, ManifestSchemaType>,\n currentDepth: number = 1,\n visited: Set<string> = new Set(),\n): number {\n let max = currentDepth\n\n for (const field of fields) {\n if (field.fields?.length) {\n max = Math.max(max, calculateMaxDepth(field.fields, objectTypes, currentDepth + 1, visited))\n }\n\n const checkObjectType = (typeName: string | undefined) => {\n if (!typeName || visited.has(typeName)) return\n const obj = objectTypes.get(typeName)\n if (!obj?.fields?.length) return\n visited.add(typeName)\n max = Math.max(max, calculateMaxDepth(obj.fields, objectTypes, currentDepth + 1, visited))\n }\n\n checkObjectType(field.type)\n\n if (Array.isArray(field.of)) {\n for (const item of field.of) {\n checkObjectType((item as Record<string, unknown>)?.type as string | undefined)\n }\n }\n }\n\n return max\n}\n\ntype RefInfo = { outgoing: string; incoming: string }\n\nfunction formatRefsWithCounts(\n doc: ProcessedDocumentType,\n referenceCount: DatasetStats['referenceCount'],\n): RefInfo {\n const counts = referenceCount ?? {}\n\n const outgoing =\n [...(doc.outgoingReferencePaths ?? [])]\n .sort((a, b) => `${a.path}->${a.type}`.localeCompare(`${b.path}->${b.type}`))\n .map((r) => {\n const pathKey = `${r.path}->${r.type}`\n const refCount = counts[doc.name]?.outgoing?.[pathKey]\n if (typeof refCount !== 'number' || refCount <= 0) return null\n return `${pathKey}${formatReferenceCount(refCount)}`\n })\n .filter(Boolean)\n .join(', ') || ''\n\n if (doc.incomingReferences.length === 0) return { outgoing, incoming: '' }\n\n const incomingParts: string[] = []\n for (const sourceType of [...doc.incomingReferences].sort()) {\n const sourceCounts = counts[sourceType]\n let total = 0\n if (sourceCounts?.outgoing) {\n const suffix = `->${doc.name}`\n for (const [pathKey, pathCount] of Object.entries(sourceCounts.outgoing)) {\n if (pathKey.endsWith(suffix) && typeof pathCount === 'number' && pathCount > 0) {\n total += pathCount\n }\n }\n }\n if (total > 0) incomingParts.push(`${sourceType}${formatReferenceCount(total)}`)\n }\n\n return { outgoing, incoming: incomingParts.join(', ') }\n}\n\nfunction formatRefsSimple(doc: ProcessedDocumentType): RefInfo {\n return {\n outgoing:\n doc.outgoingReferences.length > 0 ? [...doc.outgoingReferences].sort().join(', ') : '',\n incoming:\n doc.incomingReferences.length > 0 ? [...doc.incomingReferences].sort().join(', ') : '',\n }\n}\n\nfunction formatDocEntry(\n name: string,\n doc: ProcessedDocumentType,\n objectTypes: Map<string, ManifestSchemaType>,\n fieldOptions: SchemaFieldDisplayOptions,\n datasetStats?: DatasetStats,\n includeEmpty = false,\n): string | null {\n if (shouldSkipType(name)) return null\n\n const { documentCount, referenceCount } = datasetStats ?? {}\n const hasDocumentCounts = !!documentCount\n const count = documentCount?.[name] ?? 0\n const isExplicitZero = !!documentCount && documentCount[name] === 0\n\n // Skip types with zero documents when we have counts, unless opted-in\n if (isExplicitZero && !includeEmpty) return null\n\n const useCount = formatDocumentCount(count, hasDocumentCounts)\n\n // Deprecated types get a condensed single-line entry\n if (doc.deprecated) {\n return `- ${name} (DEPRECATED: \"${doc.deprecated.reason}\", count: ${useCount})`\n }\n\n // For explicitly-empty types, fall back to the simple (count-less) reference\n // format — the with-counts path would produce nothing since all edges are zero.\n const refs =\n referenceCount && !isExplicitZero\n ? formatRefsWithCounts(doc, referenceCount)\n : formatRefsSimple(doc)\n\n const depth = calculateMaxDepth(doc.fields, objectTypes)\n const fieldNames = formatFieldNamesWithTypes(doc.fields, fieldOptions)\n const indent = ' '\n\n const liveEditFlag = doc.liveEdit ? 'liveEdit, ' : ''\n const parts = [\n `- ${name} (${liveEditFlag}title: ${doc.titleField}, depth: ${depth}, count: ${useCount})`,\n ]\n\n if (doc.description) {\n const maxLen = SCHEMA_CONSTANTS.DEFAULTS.maxDocDescriptionLength\n const desc =\n doc.description.length > maxLen ? `${doc.description.slice(0, maxLen)}...` : doc.description\n parts.push(`${indent}- description: ${desc}`)\n }\n\n parts.push(`${indent}- fields: ${fieldNames}`)\n\n if (refs.outgoing) parts.push(`${indent}- references: ${refs.outgoing}`)\n if (refs.incoming) parts.push(`${indent}- referenced by: ${refs.incoming}`)\n\n return parts.join('\\n')\n}\n\n/**\n * Generates a compressed text representation of processed schema types.\n * Document types are sorted alphabetically, filtered by dataset stats,\n * and formatted with field summaries and reference information.\n */\nexport function formatCompressedSchema(\n documentTypes: Map<string, ProcessedDocumentType>,\n objectTypes: Map<string, ManifestSchemaType>,\n fieldOptions: SchemaFieldDisplayOptions,\n datasetStats?: DatasetStats,\n includeEmpty?: boolean,\n): string {\n return [...documentTypes.entries()]\n .sort(([a], [b]) => a.localeCompare(b))\n .map(([name, doc]) =>\n formatDocEntry(name, doc, objectTypes, fieldOptions, datasetStats, includeEmpty),\n )\n .filter(Boolean)\n .join('\\n')\n}\n","// ---------------------------------------------------------------------------\n// Fetch\n// ---------------------------------------------------------------------------\n\nexport { fetchDatasetStats } from './fetchDatasetStats.js'\nexport {\n type FetchSchemaOptions,\n type FetchSchemaSummaryOptions,\n fetchSchemaByDescriptorId,\n type SchemaCache,\n} from './fetchSchemaByDescriptorId.js'\n\n// ---------------------------------------------------------------------------\n// Process\n// ---------------------------------------------------------------------------\n\nexport { processSchema } from './processSchema.js'\n\n// ---------------------------------------------------------------------------\n// Navigate\n// ---------------------------------------------------------------------------\n\nexport {\n ARRAY_ITEM_SYSTEM_FIELDS,\n BUILT_IN_TYPE_FIELDS,\n DEFAULT_LINK_ANNOTATION,\n} from './navigate/constants.js'\nexport { filterToPath } from './navigate/filterToPath.js'\nexport {\n resolveFieldSchemaAllUnions,\n resolveFieldSchemaAllUnions as navigateToFieldSchemaAllUnions,\n} from './navigate/navigateAllUnions.js'\n// Deprecated aliases — remove in next minor\nexport {\n resolveFieldSchema,\n resolveFieldSchema as navigateToFieldSchema,\n} from './navigate/navigateToField.js'\nexport { toSchemaPath } from './navigate/path.js'\nexport { isBuiltInType, isGenericObject, isPrimitiveType } from './navigate/types.js'\nexport type { WalkVisitor } from './navigate/walkTree.js'\nexport { walkSchemaTree } from './navigate/walkTree.js'\n\n// ---------------------------------------------------------------------------\n// Format\n// ---------------------------------------------------------------------------\n\nexport { type FullSchemaOptions, fullSchema } from './fullSchema.js'\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport type {\n CompressedSchemaOptions,\n DatasetStats,\n LexiconResponse,\n ManifestField,\n ManifestSchemaType,\n ProcessedDocumentType,\n SchemaFieldDisplayOptions,\n SchemaFilter,\n SchemaTypes,\n} from './types.js'\nexport { DatasetStatsSchema } from './types.js'\n\n// ---------------------------------------------------------------------------\n// Utilities\n// ---------------------------------------------------------------------------\n\nexport { SCHEMA_CONSTANTS } from './constants.js'\nexport { shouldSkipType } from './utils.js'\n\n// ---------------------------------------------------------------------------\n// Validation — types re-exported for convenience, functions via subpath\n// ---------------------------------------------------------------------------\n// Import functions from '@sanity/agent-schema/validation'\n\nexport type {\n FieldSchemaLookupResult,\n InsertOperation,\n LocalizationConfig,\n PatchOperations,\n ValidateValueFn,\n ValidationContext,\n ValidationError,\n ValidationErrorCode,\n ValidationResult,\n} from './validation/types.js'\n\n// ---------------------------------------------------------------------------\n// Convenience\n// ---------------------------------------------------------------------------\n\nimport { resolveFilter } from './filterDocumentTypes.js'\nimport { formatCompressedSchema } from './formatSchema.js'\nimport { processSchema } from './processSchema.js'\nimport type { CompressedSchemaOptions, ManifestSchemaType } from './types.js'\n\n/**\n * Generates a compressed text representation of a schema for agent consumption.\n *\n * Takes parsed schema types and returns compact text summarizing document types,\n * fields, references, and optionally document/reference counts.\n *\n * The `filter` option accepts either a GROQ filter `{ read?, write? }` or\n * a pre-resolved `string[]` of document type names.\n */\nexport async function compressedSchema(\n types: ManifestSchemaType[],\n options: CompressedSchemaOptions = {},\n): Promise<string> {\n const includeTypes = await resolveFilter(types, options.filter)\n\n const { documentTypes, objectTypes } = processSchema(types, {\n filter: includeTypes,\n fields: options.fields,\n })\n\n return formatCompressedSchema(\n documentTypes,\n objectTypes,\n options.fields ?? {},\n options.datasetStats,\n options.includeEmpty,\n )\n}\n"],"names":["processSchema"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sanity/agent-schema",
3
- "version": "0.3.1",
3
+ "version": "0.4.0",
4
4
  "description": "Schema processing utilities for Sanity Agent",
5
5
  "keywords": [
6
6
  "sanity",