@sanity/assist 4.2.0 → 4.3.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.
@@ -1 +1 @@
1
- {"version":3,"file":"index.esm.js","sources":["../src/_lib/connector/helpers.ts","../src/_lib/connector/useRegionRects.ts","../src/_lib/connector/ConnectorRegion.tsx","../src/_lib/connector/ConnectorsStoreContext.ts","../src/_lib/connector/useConnectorsStore.ts","../src/_lib/connector/ConnectFromRegion.tsx","../src/_lib/connector/ConnectorsStore.ts","../src/_lib/connector/ConnectorsProvider.tsx","../src/_lib/connector/mapConnectorToLine.ts","../src/_lib/form/constants.ts","../src/types.ts","../src/helpers/misc.ts","../src/helpers/typeUtils.ts","../src/helpers/assistSupported.ts","../src/onboarding/FirstAssistedPathProvider.tsx","../src/constants.ts","../src/helpers/ids.ts","../src/assistDocument/hooks/useDocumentState.ts","../src/assistDocument/hooks/useStudioAssistDocument.ts","../src/assistDocument/hooks/useInstructionToaster.tsx","../src/assistDocument/AssistDocumentInput.tsx","../src/assistDocument/AssistDocumentContext.tsx","../src/assistDocument/components/SelectedFieldContext.tsx","../src/assistInspector/helpers.ts","../src/assistLayout/AiAssistanceConfigContext.tsx","../src/schemas/serialize/schemaUtils.ts","../src/schemas/serialize/serializeSchema.ts","../src/useApiClient.ts","../src/assistLayout/RunInstructionProvider.tsx","../src/assistDocument/RequestRunInstructionProvider.tsx","../src/assistDocument/hooks/useAssistDocumentContextValue.tsx","../src/assistDocument/AssistDocumentContextProvider.tsx","../src/assistDocument/AssistDocumentLayout.tsx","../src/components/AssistFeatureBadge.tsx","../src/onboarding/FieldActionsOnboarding.tsx","../src/onboarding/onboardingStore.ts","../src/components/FadeInContent.tsx","../../node_modules/@sanity/color/dist/index.js","../src/presence/AssistAvatar.tsx","../src/presence/AiFieldPresence.tsx","../src/presence/useAssistPresence.ts","../src/assistFormComponents/AssistField.tsx","../src/components/SafeValueInput.tsx","../src/assistFormComponents/AssistFormBlock.tsx","../src/assistFormComponents/AssistInlineFormBlock.tsx","../src/assistFormComponents/AssistItem.tsx","../src/_lib/form/DocumentForm.tsx","../src/assistDocument/components/AssistTypeContext.tsx","../src/helpers/conditionalMembers.ts","../src/onboarding/InspectorOnboarding.tsx","../src/assistInspector/FieldAutocomplete.tsx","../src/components/TimeAgo.tsx","../src/assistInspector/InstructionTaskHistoryButton.tsx","../src/assistInspector/AssistInspector.tsx","../src/assistInspector/constants.ts","../src/assistInspector/index.ts","../src/assistConnectors/draw/arrowPath.ts","../src/assistConnectors/draw/connectorPath.ts","../src/assistConnectors/ConnectorPath.tsx","../src/assistConnectors/AssistConnectorsOverlay.tsx","../src/helpers/styleguide.ts","../src/translate/getLanguageParams.ts","../src/translate/languageStore.ts","../src/translate/paths.ts","../src/translate/FieldTranslationProvider.tsx","../src/assistLayout/AssistLayout.tsx","../src/components/ImageContext.tsx","../src/assistDocument/components/instruction/appearance/IconInput.tsx","../src/helpers/useAssistSupported.ts","../src/translate/translateActions.tsx","../src/fieldActions/generateCaptionActions.tsx","../src/fieldActions/generateImageActions.tsx","../src/fieldActions/PrivateIcon.tsx","../src/fieldActions/assistFieldActions.tsx","../src/presence/AssistDocumentPresence.tsx","../src/assistDocument/components/instruction/BackToInstructionsLink.tsx","../src/assistDocument/components/AssistDocumentForm.tsx","../src/assistDocument/components/FieldRefPreview.tsx","../src/assistDocument/components/generic/HiddenFieldTitle.tsx","../src/assistDocument/components/instruction/appearance/InstructionVisibility.tsx","../src/assistDocument/components/instruction/FieldRefInput.tsx","../src/assistDocument/components/helpers.ts","../src/assistDocument/components/instruction/InstructionInput.tsx","../src/assistDocument/components/instruction/InstructionOutputField.tsx","../src/assistDocument/components/instruction/InstructionOutputInput.tsx","../../node_modules/get-random-values-esm/index.mjs","../src/_lib/randomKey.ts","../src/assistDocument/components/instruction/PromptInput.tsx","../src/assistDocument/components/InstructionsArrayField.tsx","../src/assistDocument/components/InstructionsArrayInput.tsx","../src/components/HideReferenceChangedBannerInput.tsx","../src/schemas/contextDocumentSchema.tsx","../src/schemas/assistDocumentSchema.tsx","../src/schemas/index.ts","../src/plugin.tsx","../src/_lib/fixedListenQuery.ts","../src/_lib/useListeningQuery.ts","../src/schemas/serialize/SchemTypeTool.tsx"],"sourcesContent":["export function hasOverflowScroll(el: HTMLElement): boolean {\n const overflow = getComputedStyle(el).overflow\n\n return overflow.includes('auto') || overflow.includes('hidden') || overflow.includes('scroll')\n}\n","import {useEffect, useMemo, useRef, useState} from 'react'\n\nimport {hasOverflowScroll} from './helpers'\nimport {Rect, Scroll} from './types'\n\nexport function useRegionRects() {\n const ref = useRef<HTMLDivElement>(null)\n\n const [relativeBoundsRect, setRelativeBoundsRect] = useState<Rect | null>(null)\n const [relativeElementRect, setRelativeElementRect] = useState<Rect | null>(null)\n const [boundsScroll, setBoundsScroll] = useState<Scroll>({x: 0, y: 0})\n const [scroll, setScroll] = useState<Scroll>({x: 0, y: 0})\n\n const boundsScrollXRef = useRef(0)\n const boundsScrollYRef = useRef(0)\n\n const elementScrollXRef = useRef(0)\n const elementScrollYRef = useRef(0)\n\n useEffect(() => {\n const el = ref.current\n\n if (!el) return undefined\n\n const scrollParents: HTMLElement[] = []\n let parent = el.parentElement\n\n while (parent && parent !== document.body) {\n if (\n hasOverflowScroll(parent)\n // || parent.scrollHeight > parent.clientHeight\n ) {\n scrollParents.push(parent)\n }\n\n parent = parent.parentElement\n }\n\n function handleResize() {\n const scrollParent = scrollParents[0]\n\n const boundsRect = scrollParent?.getBoundingClientRect() || {\n x: 0,\n y: 0,\n width: window.innerWidth,\n height: window.innerHeight,\n }\n\n const domRect = el!.getBoundingClientRect()\n\n setRelativeBoundsRect({\n x: boundsRect.x + boundsScrollXRef.current,\n y: boundsRect.y + boundsScrollYRef.current,\n w: boundsRect.width,\n h: boundsRect.height,\n })\n\n setRelativeElementRect({\n x: domRect.x + elementScrollXRef.current,\n y: domRect.y + elementScrollYRef.current,\n w: domRect.width,\n h: domRect.height,\n })\n }\n\n function handleScroll() {\n let scrollX = window.scrollX\n let scrollY = window.scrollY\n\n for (const scrollParent of scrollParents) {\n scrollX += scrollParent.scrollLeft\n scrollY += scrollParent.scrollTop\n }\n\n const scrollParent = scrollParents[0]\n\n boundsScrollXRef.current = scrollX - (scrollParent?.scrollLeft || window.scrollX)\n\n boundsScrollYRef.current = scrollY - (scrollParent?.scrollTop || window.scrollY)\n\n setBoundsScroll({\n x: boundsScrollXRef.current,\n y: boundsScrollYRef.current,\n })\n\n elementScrollXRef.current = scrollX\n elementScrollYRef.current = scrollY\n\n setScroll({x: scrollX, y: scrollY})\n }\n\n window.addEventListener('scroll', handleScroll, {passive: true})\n\n const ro = new ResizeObserver(handleResize)\n\n ro.observe(el)\n\n for (const scrollParent of scrollParents) {\n scrollParent.addEventListener('scroll', handleScroll, {passive: true})\n ro.observe(scrollParent)\n }\n\n handleScroll()\n\n return () => {\n ro.unobserve(el)\n\n for (const scrollParent of scrollParents) {\n ro.unobserve(scrollParent)\n scrollParent.removeEventListener('scroll', handleScroll)\n }\n\n ro.disconnect()\n\n window.removeEventListener('scroll', handleScroll)\n }\n }, [])\n\n const bounds: Rect | null = useMemo(\n () =>\n relativeBoundsRect && {\n x: relativeBoundsRect.x - boundsScroll.x,\n y: relativeBoundsRect.y - boundsScroll.y,\n w: relativeBoundsRect.w,\n h: relativeBoundsRect.h,\n },\n [relativeBoundsRect, boundsScroll],\n )\n\n const element: Rect | null = useMemo(\n () =>\n relativeElementRect && {\n x: relativeElementRect.x - scroll.x,\n y: relativeElementRect.y - scroll.y,\n w: relativeElementRect.w,\n h: relativeElementRect.h,\n },\n [relativeElementRect, scroll],\n )\n\n return {bounds, element, ref}\n}\n","import {HTMLProps, useEffect} from 'react'\n\nimport {ConnectorRegionRects} from './types'\nimport {useRegionRects} from './useRegionRects'\n\nexport function ConnectorRegion(\n props: {\n onRectsChange?: (rects: ConnectorRegionRects | null) => void\n } & HTMLProps<HTMLDivElement>,\n) {\n const {children, onRectsChange, ...restProps} = props\n\n const {bounds, element, ref} = useRegionRects()\n\n useEffect(() => {\n onRectsChange?.(bounds && element ? {bounds, element} : null)\n }, [bounds, element, onRectsChange])\n\n return (\n <div {...restProps} ref={ref}>\n {children}\n </div>\n )\n}\n","import {createContext} from 'react'\n\nimport {ConnectorsStore} from './ConnectorsStore'\n\nexport const ConnectorsStoreContext = createContext<ConnectorsStore | null>(null)\n","import {useContext} from 'react'\n\nimport {ConnectorsStore} from './ConnectorsStore'\nimport {ConnectorsStoreContext} from './ConnectorsStoreContext'\n\nexport function useConnectorsStore(): ConnectorsStore {\n const store = useContext(ConnectorsStoreContext)\n\n if (!store) {\n throw new Error('Missing connectors store context')\n }\n\n return store\n}\n","import {HTMLProps, useEffect, useState} from 'react'\n\nimport {ConnectorRegion} from './ConnectorRegion'\nimport {ConnectorRegionRects} from './types'\nimport {useConnectorsStore} from './useConnectorsStore'\n\nexport function ConnectFromRegion(\n props: {_key: string; zIndex: number} & HTMLProps<HTMLDivElement>,\n) {\n const {children, _key: key, zIndex, ...restProps} = props\n const store = useConnectorsStore()\n const [rects, setRects] = useState<ConnectorRegionRects | null>(null)\n\n useEffect(() => store.from.subscribe(key, {zIndex}), [key, store, zIndex])\n\n useEffect(() => {\n if (rects) store.from.next(key, rects)\n }, [key, rects, store])\n\n return (\n <ConnectorRegion {...restProps} onRectsChange={setRects}>\n {children}\n </ConnectorRegion>\n )\n}\n","import {Connector, ConnectorRegionRects} from './types'\n\nexport interface ConnectorsStore {\n connectors: {\n subscribe: (observer: (connectors: Connector[]) => void) => () => void\n }\n\n from: {\n subscribe: (key: string, payload?: Record<string, unknown>) => () => void\n next: (key: string, rects: ConnectorRegionRects) => void\n }\n\n to: {\n subscribe: (key: string, payload?: Record<string, unknown>) => () => void\n next: (key: string, rects: ConnectorRegionRects) => void\n }\n}\n\nexport function createConnectorsStore(): ConnectorsStore {\n const configKeys: string[] = []\n const fieldKeys: string[] = []\n\n const channels = {\n from: new Map<string, ConnectorRegionRects | null>(),\n to: new Map<string, ConnectorRegionRects | null>(),\n }\n\n const payloads = {\n from: new Map<string, Record<string, unknown> | undefined>(),\n to: new Map<string, Record<string, unknown> | undefined>(),\n }\n\n const observers: ((connectors: Connector[]) => void)[] = []\n\n function notifyObservers() {\n const connectors: Connector[] = []\n\n for (const key of configKeys) {\n const toRects = channels.to.get(key)\n const toPayload = payloads.from.get(key)\n\n const fromRects = channels.from.get(key)\n const fromPayload = payloads.from.get(key)\n\n if (toRects && fromRects) {\n connectors.push({\n key,\n from: {...fromRects, payload: fromPayload},\n to: {...toRects, payload: toPayload},\n })\n }\n }\n\n for (const observer of observers) {\n observer(connectors)\n }\n }\n\n return {\n to: {\n subscribe(key, payload) {\n channels.to.set(key, null)\n payloads.to.set(key, payload)\n\n configKeys.push(key)\n\n return () => {\n channels.to.delete(key)\n payloads.to.delete(key)\n\n const idx = configKeys.indexOf(key)\n\n if (idx > -1) configKeys.splice(idx, 1)\n\n notifyObservers()\n }\n },\n next(key, rects) {\n channels.to.set(key, rects)\n\n if (fieldKeys.includes(key)) notifyObservers()\n },\n },\n\n connectors: {\n subscribe(observer) {\n observers.push(observer)\n\n return () => {\n const idx = observers.indexOf(observer)\n\n if (idx > -1) observers.splice(idx, 1)\n }\n },\n },\n\n from: {\n subscribe(key, payload) {\n channels.from.set(key, null)\n payloads.from.set(key, payload)\n\n fieldKeys.push(key)\n\n return () => {\n channels.from.delete(key)\n payloads.from.delete(key)\n\n const idx = fieldKeys.indexOf(key)\n\n if (idx > -1) fieldKeys.splice(idx, 1)\n\n notifyObservers()\n }\n },\n next(key, rects) {\n channels.from.set(key, rects)\n\n if (configKeys.includes(key)) notifyObservers()\n },\n },\n }\n}\n","import {ReactNode, useEffect, useMemo} from 'react'\n\nimport {ConnectorsStore, createConnectorsStore} from './ConnectorsStore'\nimport {ConnectorsStoreContext} from './ConnectorsStoreContext'\nimport {Connector} from './types'\n\nexport function ConnectorsProvider(props: {\n children?: ReactNode\n onConnectorsChange?: (connectors: Connector[]) => void\n}) {\n const {children, onConnectorsChange} = props\n const store: ConnectorsStore = useMemo(() => createConnectorsStore(), [])\n\n useEffect(\n () => onConnectorsChange && store.connectors.subscribe(onConnectorsChange),\n [onConnectorsChange, store],\n )\n\n return <ConnectorsStoreContext.Provider value={store}>{children}</ConnectorsStoreContext.Provider>\n}\n","import {\n ConnectorLine,\n ConnectorLinePoint,\n ConnectorOptions,\n ConnectorRegionRects,\n Rect,\n} from './types'\n\nfunction getConnectorLinePoint(\n options: ConnectorOptions,\n rect: Rect,\n bounds: Rect,\n): ConnectorLinePoint {\n const centerY = rect.y + rect.h / 2\n const isAbove = rect.y + rect.h < bounds.y + options.arrow.marginY\n const isBelow = rect.y > bounds.y + bounds.h - options.arrow.marginY\n\n return {\n bounds,\n x: rect.x,\n y: centerY,\n centerY,\n startY: rect.y + options.path.marginY,\n endY: rect.y + rect.h - options.path.marginY,\n isAbove,\n isBelow,\n outOfBounds: isAbove || isBelow,\n }\n}\n\nexport function mapConnectorToLine(\n options: ConnectorOptions,\n connector: {from: ConnectorRegionRects; to: ConnectorRegionRects},\n): ConnectorLine {\n const fromBounds: Rect = {\n y: connector.from.bounds.y + options.arrow.threshold,\n // bottom: connector.from.bounds.y + connector.from.bounds.h - options.arrow.threshold,\n x: connector.from.bounds.x,\n // right: connector.from.bounds.x + connector.from.bounds.w,\n w: connector.from.bounds.w,\n h: connector.from.bounds.h - options.arrow.threshold * 2,\n }\n\n const from = getConnectorLinePoint(options, connector.from.element, fromBounds)\n from.x = connector.from.element.x + connector.from.element.w // + 1\n\n const fromBottom = fromBounds.y + fromBounds.h\n\n const toBounds: Rect = {\n y: connector.to.bounds.y + options.arrow.threshold,\n // bottom: connector.to.bounds.y + connector.to.bounds.h - options.arrow.threshold,\n x: connector.to.bounds.x,\n // right: connector.to.bounds.x + connector.to.bounds.w,\n w: connector.to.bounds.w,\n h: connector.to.bounds.h - options.arrow.threshold * 2,\n }\n\n const toBottom = toBounds.y + toBounds.h\n\n const to = getConnectorLinePoint(options, connector.to.element, toBounds)\n\n const maxStartY = Math.max(to.startY, from.startY)\n\n // Align from <-> to vertically\n from.y = Math.min(maxStartY, from.endY)\n if (from.y < toBounds.y) {\n from.y = Math.min(toBounds.y, from.endY)\n } else if (from.y > toBottom) {\n from.y = Math.max(toBottom, from.startY)\n }\n to.y = Math.min(maxStartY, to.endY)\n if (to.y < fromBounds.y) {\n to.y = Math.min(fromBounds.y, to.endY)\n } else if (to.y > fromBottom) {\n to.y = Math.max(fromBottom, to.startY)\n }\n\n // Keep within bounds\n from.y = Math.min(Math.max(from.y, fromBounds.y), fromBottom)\n to.y = Math.min(Math.max(to.y, toBounds.y), toBottom)\n\n return {from, to}\n}\n","export const assistFormId = 'assist'\n","import {PortableTextBlock, PortableTextMarkDefinition, PortableTextSpan} from '@portabletext/types'\nimport {SanityDocument} from 'sanity'\n\n//id prefixes\nexport const assistDocumentIdPrefix = 'sanity.assist.schemaType.'\nexport const assistDocumentStatusIdPrefix = 'sanity.assist.status.'\nexport const assistSchemaIdPrefix = 'sanity.assist.schema.'\n\n// type names\nexport const assistDocumentTypeName = 'sanity.assist.schemaType.annotations' as const\nexport const assistFieldTypeName = 'sanity.assist.schemaType.field' as const\nexport const instructionTypeName = 'sanity.assist.instruction' as const\nexport const promptTypeName = 'sanity.assist.instruction.prompt' as const\n\nexport const userInputTypeName = 'sanity.assist.instruction.userInput' as const\nexport const instructionContextTypeName = 'sanity.assist.instruction.context' as const\nexport const fieldReferenceTypeName = 'sanity.assist.instruction.fieldRef' as const\n\n// user-facing type. Intentionally does not have sanity. prefix\nexport const contextDocumentTypeName = 'assist.instruction.context' as const\n\nexport const assistTasksStatusTypeName = 'sanity.assist.task.status' as const\nexport const instructionTaskTypeName = 'sanity.assist.instructionTask' as const\nexport const fieldPresenceTypeName = 'sanity.assist.instructionTask.presence' as const\n\nexport const assistSerializedTypeName = 'sanity.assist.serialized.type' as const\nexport const assistSerializedFieldTypeName = 'sanity.assist.serialized.field' as const\n\nexport const outputFieldTypeName = 'sanity.assist.output.field' as const\nexport const outputTypeTypeName = 'sanity.assist.output.type' as const\n\n//url params\nexport const inspectParam = 'inspect' as const\nexport const fieldPathParam = 'pathKey' as const\nexport const instructionParam = 'instruction' as const\n\n// other constants\nexport const documentRootKey = '<document>'\n\nexport type SerializedSchemaMember = Omit<SerializedSchemaType, 'name' | '_type'> & {\n _type?: typeof assistSerializedFieldTypeName\n name?: string\n}\n\nexport interface SerializedSchemaType {\n _type?: typeof assistSerializedTypeName\n _id?: string\n type: string\n name: string\n title?: string\n fields?: SerializedSchemaMember[]\n of?: SerializedSchemaMember[]\n to?: SerializedSchemaMember[]\n annotations?: SerializedSchemaMember[]\n inlineOf?: SerializedSchemaMember[]\n values?: string[] | {value: string; title?: string}[]\n hidden?: boolean | 'function'\n readOnly?: boolean | 'function'\n options?: {\n /** equivalent to options.aiAssist.imageDescriptionField - not renamed in the api for backwards compatability */\n imagePromptField?: string\n embeddingsIndex?: string\n }\n}\n\nexport interface AssistDocument extends SanityDocument {\n fields?: AssistField[]\n instructions?: StudioInstruction[]\n}\n\nexport interface PresetInstruction {\n _key: string\n prompt?: PromptTextBlock[]\n\n title?: string\n /**\n * String key from @sanity/icons IconMap\n */\n icon?: string\n\n /**\n * Type/field filter\n */\n output?: (OutputFieldItem | OutputTypeItem)[]\n}\n\nexport interface PresetField {\n path?: string\n instructions?: PresetInstruction[]\n}\n\nexport interface AssistPreset {\n fields?: PresetField[]\n}\n\nexport interface SanityAssistDocument {\n _id: string\n _type: typeof assistDocumentTypeName\n fields?: StudioAssistField[]\n}\n\nexport interface StudioAssistDocument extends SanityAssistDocument {\n // added after loading\n tasks?: InstructionTask[]\n}\n\nexport interface AssistField {\n _key: string\n _type: typeof assistFieldTypeName\n path?: string\n instructions?: StudioInstruction[]\n}\n\nexport interface StudioAssistField {\n _key: string\n path?: string\n instructions?: StudioInstruction[]\n\n // added\n tasks?: InstructionTask[]\n}\n\nexport interface FieldRef extends PortableTextMarkDefinition {\n _type: typeof fieldReferenceTypeName\n path?: string\n}\n\nexport interface ContextBlock {\n _type: typeof instructionContextTypeName\n reference?: {\n _type: 'reference'\n _ref?: string\n }\n}\n\nexport interface UserInputBlock {\n _type: typeof userInputTypeName\n _key: string\n message?: string\n description?: string\n}\n\nexport type InlinePromptBlock = PortableTextSpan | FieldRef | UserInputBlock | ContextBlock\nexport type PromptTextBlock = Omit<\n PortableTextBlock<never, InlinePromptBlock, 'normal', never>,\n '_type'\n> & {_type: 'block'}\n\nexport type PromptBlock = PromptTextBlock | FieldRef | ContextBlock | UserInputBlock\n\nexport interface AiPresence {\n _key: string\n _type: typeof fieldPresenceTypeName\n path?: string\n started?: string\n}\n\nexport type TaskEndedReason = 'success' | 'error' | 'aborted' | 'timeout'\n\nexport interface InstructionTask {\n _key: string\n _type: typeof instructionTaskTypeName\n instructionKey?: string\n title?: string\n path?: string\n started?: string\n updated?: string\n ended?: string\n message?: string\n reason?: TaskEndedReason\n presence?: AiPresence[]\n startedByUserId?: string\n\n //added by studio\n // eslint-disable-next-line no-use-before-define\n instruction?: StudioInstruction\n}\n\nexport interface StudioInstruction {\n _key: string\n _type: typeof instructionTypeName\n prompt?: PromptBlock[]\n\n icon?: string\n userId?: string\n title?: string\n placeholder?: string\n output?: (OutputFieldItem | OutputTypeItem)[]\n\n //added after query / synthetic fields\n tasks?: InstructionTask[]\n}\n\nexport interface AssistTasksStatus {\n _id: string\n _type: typeof assistTasksStatusTypeName\n tasks?: InstructionTask[]\n}\n\nexport interface AssistInspectorRouteParams {\n [inspectParam]?: string\n [fieldPathParam]?: string\n [instructionParam]?: string\n}\n\nexport interface OutputFieldItem {\n _type: typeof outputFieldTypeName\n _key: string\n //path relative to the field the instruction is for (same as _key)\n relativePath?: string\n}\n\nexport interface OutputTypeItem {\n _type: typeof outputTypeTypeName\n _key: string\n /* array item type name */\n type?: string\n //path relative to the array-field the instruction is for, can be empty string (the array itself, same as _key)\n relativePath?: string\n}\n","import {useMemo} from 'react'\nimport {Path, pathToString} from 'sanity'\n\nimport {documentRootKey, StudioInstruction} from '../types'\n\nexport function usePathKey(path: Path | string) {\n return useMemo(() => {\n return getPathKey(path)\n }, [path])\n}\n\nexport function getPathKey(path: Path | string) {\n if (path.length) {\n return Array.isArray(path) ? pathToString(path) : path\n }\n return documentRootKey\n}\n\nexport function getInstructionTitle(instruction?: StudioInstruction) {\n return instruction?.title ?? 'Untitled'\n}\n","import {ArraySchemaType, ImageOptions, SchemaType} from 'sanity'\n\nexport function isPortableTextArray(type: ArraySchemaType) {\n return type.of.find((t) => isType(t, 'block'))\n}\n\nexport function isType(schemaType: SchemaType, typeName: string): boolean {\n if (schemaType.name === typeName) {\n return true\n }\n if (!schemaType.type) {\n return false\n }\n return isType(schemaType.type, typeName)\n}\n\nexport function isImage(schemaType: SchemaType) {\n return isType(schemaType, 'image')\n}\n\nexport function getDescriptionFieldOption(\n schemaType: SchemaType | undefined,\n): {path: string; updateOnImageChange: boolean} | undefined {\n if (!schemaType) {\n return undefined\n }\n const descriptionField = (schemaType.options as ImageOptions)?.aiAssist?.imageDescriptionField\n if (typeof descriptionField === 'string') {\n return {\n path: descriptionField,\n updateOnImageChange: true,\n }\n } else if (descriptionField) {\n return {\n path: descriptionField.path,\n updateOnImageChange: descriptionField.updateOnImageChange ?? true,\n }\n }\n return getDescriptionFieldOption(schemaType.type)\n}\n\nexport function getImageInstructionFieldOption(\n schemaType: SchemaType | undefined,\n): string | undefined {\n if (!schemaType) {\n return undefined\n }\n const imageInstructionField = (schemaType.options as ImageOptions)?.aiAssist\n ?.imageInstructionField\n if (imageInstructionField) {\n return imageInstructionField\n }\n return getImageInstructionFieldOption(schemaType.type)\n}\n","import {ReferenceOptions, SchemaType} from 'sanity'\n\nimport {AssistOptions} from '../schemas/typeDefExtensions'\nimport {isType} from './typeUtils'\n\nexport function isSchemaAssistEnabled(type: SchemaType) {\n return !(type.options as AssistOptions | undefined)?.aiAssist?.exclude\n}\n\nexport function isAssistSupported(type: SchemaType) {\n if (!isSchemaAssistEnabled(type)) {\n return false\n }\n\n if (isDisabled(type)) {\n return false\n }\n\n if (type.jsonType === 'array') {\n const unsupportedArray = type.of.every((t) => isDisabled(t))\n return !unsupportedArray\n }\n\n if (type.jsonType === 'object') {\n const unsupportedObject = type.fields.every((field) => isDisabled(field.type))\n return !unsupportedObject\n }\n return true\n}\n\nfunction isDisabled(type: SchemaType) {\n return !isSchemaAssistEnabled(type) || isUnsupportedType(type)\n}\n\nfunction isUnsupportedType(type: SchemaType) {\n return (\n type.name === 'sanity.imageCrop' ||\n type.name === 'sanity.imageHotspot' ||\n isType(type, 'globalDocumentReference') ||\n (isType(type, 'reference') &&\n !(type?.options as ReferenceOptions)?.aiAssist?.embeddingsIndex) ||\n isType(type, 'crossDatasetReference') ||\n isType(type, 'file')\n )\n}\n","import {createContext, PropsWithChildren, useMemo} from 'react'\nimport {FieldMember, ObjectInputProps, pathToString} from 'sanity'\n\nimport {isAssistSupported} from '../helpers/assistSupported'\n\nexport const FirstAssistedPathContext = createContext<string | undefined>(undefined)\n\nexport interface FirstAssistedPathProviderProps {\n members: ObjectInputProps['members']\n}\n\nexport function FirstAssistedPathProvider(\n props: PropsWithChildren<FirstAssistedPathProviderProps>,\n) {\n const {members} = props\n\n const firstAssistedPath = useMemo(() => {\n const firstAssisted = members.find(\n (member): member is FieldMember =>\n member.kind === 'field' && isAssistSupported(member.field.schemaType),\n )\n return firstAssisted?.field.path ? pathToString(firstAssisted?.field.path) : undefined\n }, [members])\n\n return (\n <FirstAssistedPathContext.Provider value={firstAssistedPath}>\n {props.children}\n </FirstAssistedPathContext.Provider>\n )\n}\n","import {minutesToMilliseconds} from 'date-fns'\n\nexport const releaseAnnouncementUrl =\n 'https://www.sanity.io/blog/sanity-ai-assist-announcement?utm_source=sanity-assist-plugin&utm_medium=organic_social&utm_campaign=ai-assist&utm_content='\n\nexport const instructionGuideUrl =\n 'https://sanity.io/guides/getting-started-with-ai-assist-instructions?utm_source=sanity-assist-plugin&utm_medium=organic_social&utm_campaign=ai-assist&utm_content='\n\nexport const giveFeedbackUrl = 'https://forms.gle/Kwz7CThxGeA2GiEU8'\n\nexport const salesUrl =\n 'https://www.sanity.io/contact/sales?utm_source=sanity-assist-plugin&utm_medium=organic_social&utm_campaign=ai-assist&utm_content='\n\nexport const packageName = '@sanity/assist'\n\nexport const pluginTitle = 'Sanity AI Assist'\n\nexport const pluginTitleShort = 'AI Assist'\n\nexport const maxHistoryVisibilityMs = minutesToMilliseconds(30)\n","import {getPublishedId, getVersionFromId, isVersionId} from 'sanity'\n\nimport {assistDocumentIdPrefix, assistDocumentStatusIdPrefix} from '../types'\n\nconst illegalIdChars = /[^a-zA-Z0-9._-]/g\n\nexport function publicId(id: string) {\n return id.replace('drafts.', '')\n}\n\nexport function assistDocumentId(documentType: string) {\n return `${assistDocumentIdPrefix}${documentType}`.replace(illegalIdChars, '_')\n}\n\nexport function assistTasksStatusId(documentId: string) {\n if (isVersionId(documentId)) {\n // Creates an id: sanity.assist.status.<versionName>.<documentId>\n return `${assistDocumentStatusIdPrefix}${getVersionFromId(documentId)}.${getPublishedId(documentId)}`\n }\n\n // Creates an id: sanity.assist.status<documentId>\n return `${assistDocumentStatusIdPrefix}${getPublishedId(documentId)}`\n}\n","import {useEditState} from 'sanity'\n\nexport function useDocumentState<T>(id: string, docType: string): T | undefined {\n const state = useEditState(id, docType)\n return (state.draft || state.published) as T | undefined\n}\n","import {useEffect, useMemo} from 'react'\nimport {type ObjectSchemaType, typed, useClient, useCurrentUser} from 'sanity'\n\nimport {maxHistoryVisibilityMs} from '../../constants'\nimport {assistDocumentId, assistTasksStatusId} from '../../helpers/ids'\nimport {\n assistDocumentTypeName,\n type AssistTasksStatus,\n assistTasksStatusTypeName,\n type InstructionTask,\n type StudioAssistDocument,\n type StudioAssistField,\n type StudioInstruction,\n} from '../../types'\nimport {useDocumentState} from './useDocumentState'\n\ninterface UseAssistDocumentProps {\n documentId: string\n schemaType: ObjectSchemaType\n initDoc?: boolean\n}\n\nexport function useStudioAssistDocument({\n documentId,\n schemaType,\n initDoc,\n}: UseAssistDocumentProps): StudioAssistDocument | undefined {\n const documentTypeName = schemaType.name\n const currentUser = useCurrentUser()\n\n const assistDocument = useDocumentState<StudioAssistDocument>(\n assistDocumentId(documentTypeName),\n assistDocumentTypeName,\n )\n const assistTasksStatus = useDocumentState<AssistTasksStatus>(\n assistTasksStatusId(documentId ?? ''),\n assistTasksStatusTypeName,\n )\n\n const client = useClient({apiVersion: '2023-01-01'})\n\n useEffect(() => {\n if (!assistDocument && initDoc) {\n client\n .createIfNotExists({\n _id: assistDocumentId(documentTypeName),\n _type: assistDocumentTypeName,\n })\n .catch(() => {\n // best effort\n })\n }\n }, [client, assistDocument, documentTypeName, initDoc])\n\n return useMemo(() => {\n if (!assistDocument) {\n return undefined\n }\n const tasks = assistTasksStatus?.tasks ?? []\n const fields = (assistDocument?.fields ?? []).map((assistField): StudioAssistField => {\n return {\n ...assistField,\n tasks: tasks.filter((task) => task.path === assistField.path),\n instructions: assistField.instructions\n ?.filter((p) => !p.userId || p.userId === currentUser?.id)\n .map((instruction) => asStudioInstruction(instruction, tasks)),\n }\n })\n return typed<StudioAssistDocument>({\n ...assistDocument,\n tasks: tasks?.map((task) => {\n const instruction = fields\n .find((f) => f.path === task.path)\n ?.instructions?.find((i) => i._key === task.instructionKey)\n return {\n ...task,\n instruction,\n }\n }),\n fields: fields,\n })\n }, [assistDocument, assistTasksStatus, currentUser])\n}\n\nfunction asStudioInstruction(\n instruction: StudioInstruction,\n run: InstructionTask[],\n): StudioInstruction {\n return {\n ...instruction,\n tasks: run\n .filter((task) => task.instructionKey === instruction._key)\n .filter(\n (task) =>\n task.started &&\n new Date().getTime() - new Date(task.started).getTime() < maxHistoryVisibilityMs,\n ),\n }\n}\n","import {useToast} from '@sanity/ui'\nimport {addSeconds, isAfter} from 'date-fns'\nimport {useEffect, useRef} from 'react'\nimport {ObjectSchemaType, useCurrentUser} from 'sanity'\n\nimport {getInstructionTitle} from '../../helpers/misc'\nimport {InstructionTask} from '../../types'\nimport {useStudioAssistDocument} from './useStudioAssistDocument'\n\nconst NO_TASKS: InstructionTask[] = []\n\nexport function useInstructionToaster(documentId: string, documentSchemaType: ObjectSchemaType) {\n const assistDocument = useStudioAssistDocument({documentId, schemaType: documentSchemaType})\n\n const assistDocLoaded = !!assistDocument\n const currentUser = useCurrentUser()\n const toast = useToast()\n const tasks = assistDocument?.tasks\n const previousTasks = useRef<InstructionTask[] | undefined | 'initial'>('initial')\n\n useEffect(() => {\n if (!assistDocLoaded) {\n return\n }\n\n if (previousTasks.current !== 'initial') {\n const prevTaskByKey = Object.fromEntries(\n (previousTasks.current ?? NO_TASKS).map((run) => [run._key, run]),\n )\n const endedTasks = tasks\n ?.filter((task) => task.startedByUserId === currentUser?.id)\n .filter((task) => {\n const prevTask = prevTaskByKey[task._key]\n return (!prevTask && task.ended) || (!prevTask?.ended && task.ended)\n })\n // filter out old stuff\n .filter((task) => task.ended && isAfter(addSeconds(new Date(task.ended), 30), new Date()))\n\n endedTasks?.forEach((task) => {\n const title = task.title ?? getInstructionTitle(task.instruction)\n if (task.reason === 'error') {\n toast.push({\n title: `Failed: ${title}`,\n status: 'error',\n description: `Instruction failed. ${task.message ?? ''}`,\n closable: true,\n duration: 10000,\n })\n } else if (task.reason === 'timeout') {\n toast.push({\n title: `Timeout: ${title}`,\n status: 'error',\n description: `Instruction timed out.`,\n closable: true,\n })\n } else if (task.reason === 'success') {\n toast.push({\n title: `Success: ${title}`,\n status: 'success',\n description: `Instruction completed.`,\n closable: true,\n })\n } else if (task.reason === 'aborted') {\n toast.push({\n title: `Canceled: ${title}`,\n status: 'warning',\n description: `Instruction canceled.`,\n closable: true,\n })\n }\n })\n }\n previousTasks.current = tasks\n }, [tasks, previousTasks, toast, currentUser, assistDocLoaded])\n}\n","import {useLayer} from '@sanity/ui'\nimport {useMemo} from 'react'\nimport type {InputProps, ObjectInputProps, ObjectSchemaType} from 'sanity'\nimport {useDocumentPane} from 'sanity/structure'\n\nimport {ConnectFromRegion} from '../_lib/connector'\nimport {assistFormId} from '../_lib/form/constants'\nimport {usePathKey} from '../helpers/misc'\nimport {isType} from '../helpers/typeUtils'\nimport {FirstAssistedPathProvider} from '../onboarding/FirstAssistedPathProvider'\nimport {assistDocumentTypeName} from '../types'\nimport {useInstructionToaster} from './hooks/useInstructionToaster'\n\nexport function AssistDocumentInputWrapper(props: InputProps) {\n if (!isType(props.schemaType, 'document') && props.id !== 'root' && props.id !== assistFormId) {\n return <AssistInput {...props} />\n }\n\n const documentId = (props.value as any)?._id as string | undefined\n if (!documentId) {\n return props.renderDefault(props)\n }\n\n return <AssistDocumentInput {...(props as ObjectInputProps)} documentId={documentId} />\n}\n\nfunction AssistDocumentInput({documentId, ...props}: ObjectInputProps & {documentId: string}) {\n useInstructionToaster(documentId, props.schemaType)\n\n const schemaType = useMemo(() => {\n if (props.schemaType.name !== assistDocumentTypeName) {\n return props.schemaType\n }\n return {\n ...props.schemaType,\n type: {\n ...props.schemaType.type,\n // compatability with i18nArrays plugin that requires this to be document\n name: 'document',\n },\n } as ObjectSchemaType\n }, [props.schemaType])\n\n return (\n <FirstAssistedPathProvider members={props.members}>\n {props.renderDefault({...props, schemaType})}\n </FirstAssistedPathProvider>\n )\n}\n\nfunction AssistInput(props: InputProps) {\n const {zIndex} = useLayer()\n const {paneKey} = useDocumentPane()\n const pathKey = usePathKey(props.path)\n\n return (\n <ConnectFromRegion _key={`${paneKey}_${pathKey}`} zIndex={zIndex} style={{minWidth: 0}}>\n {props.renderDefault(props)}\n </ConnectFromRegion>\n )\n}\n","import {createContext, useContext} from 'react'\nimport {DocumentInspector, ObjectSchemaType, PatchEvent} from 'sanity'\n\nimport {StudioAssistDocument} from '../types'\n\nexport type AssistDocumentContextValue = (\n | {assistDocument: StudioAssistDocument; loading: false}\n | {assistDocument: undefined; loading: true}\n) & {\n documentIsNew: boolean\n /**\n * This is the _actual_ id of the current document (ie the document loaded in the pane); it contains draft. versions. prefix ect depending on context\n */\n assistableDocumentId: string\n documentIsAssistable: boolean\n documentSchemaType: ObjectSchemaType\n openInspector: (inspectorName: string, paneParams?: Record<string, string>) => void\n closeInspector: (inspectorName?: string) => void\n inspector: DocumentInspector | null\n selectedPath?: string\n documentOnChange: (event: PatchEvent) => void\n}\n\nexport const AssistDocumentContext = createContext<AssistDocumentContextValue | undefined>(\n undefined,\n)\n\nexport function useAssistDocumentContext(): AssistDocumentContextValue {\n const context = useContext(AssistDocumentContext)\n if (!context) {\n throw new Error('AssistDocumentContext value is missing')\n }\n return context\n}\n","import {createContext} from 'react'\nimport {ObjectSchemaType, SchemaType} from 'sanity'\n\nexport interface SelectedFieldContextValue {\n documentSchema?: ObjectSchemaType\n fieldSchema?: SchemaType\n}\n\nexport const SelectedFieldContext = createContext<SelectedFieldContextValue | undefined>(undefined)\nexport const SelectedFieldContextProvider = SelectedFieldContext.Provider\n","import {\n BlockContentIcon,\n BlockquoteIcon,\n DocumentIcon,\n ImageIcon,\n LinkIcon,\n OlistIcon,\n StringIcon,\n} from '@sanity/icons'\nimport {extractWithPath} from '@sanity/mutator'\nimport {type ComponentType, useContext, useMemo} from 'react'\nimport {\n type ArraySchemaType,\n isKeySegment,\n isObjectSchemaType,\n type ObjectSchemaType,\n type Path,\n pathToString,\n type SanityDocumentLike,\n type SchemaType,\n stringToPath,\n} from 'sanity'\nimport {type PaneRouterContextValue, usePaneRouter} from 'sanity/structure'\n\nimport {SelectedFieldContext} from '../assistDocument/components/SelectedFieldContext'\nimport {isAssistSupported} from '../helpers/assistSupported'\nimport {isPortableTextArray, isType} from '../helpers/typeUtils'\nimport {type AssistInspectorRouteParams, documentRootKey, fieldPathParam} from '../types'\n\nexport interface FieldRef {\n key: string\n path: Path\n title: string\n schemaType: SchemaType\n icon: ComponentType\n synthetic?: boolean\n}\n\nconst maxDepth = 6\n\nexport function getTypeIcon(schemaType: SchemaType) {\n let t: SchemaType | undefined = schemaType\n\n while (t) {\n if (t.icon) return t.icon\n t = t.type\n }\n\n if (isType(schemaType, 'slug')) return LinkIcon\n if (isType(schemaType, 'image')) return ImageIcon\n if (schemaType.jsonType === 'array' && isPortableTextArray(schemaType)) return BlockContentIcon\n\n if (schemaType.jsonType === 'array') return OlistIcon\n if (schemaType.jsonType === 'object') return BlockquoteIcon\n if (schemaType.jsonType === 'string') return StringIcon\n\n return DocumentIcon\n}\n\nexport function getFieldRefsWithDocument(schemaType: ObjectSchemaType): FieldRef[] {\n const fields = getFieldRefs(schemaType)\n return [\n {\n key: documentRootKey,\n icon: schemaType.icon ?? DocumentIcon,\n title: `The entire document`,\n path: [],\n schemaType: schemaType,\n },\n\n ...fields,\n ]\n}\n\nexport function getFieldRefs(\n schemaType: ObjectSchemaType,\n parent?: FieldRef,\n depth = 0,\n): FieldRef[] {\n if (depth >= maxDepth) {\n return []\n }\n return schemaType.fields\n .filter((f) => !f.name.startsWith('_'))\n .flatMap((field) => {\n const path: Path = parent ? [...parent.path, field.name] : [field.name]\n const title = field.type.title ?? field.name\n const fieldRef: FieldRef = {\n key: patchableKey(pathToString(path)),\n path,\n title: parent ? [parent.title, title].join(' / ') : title,\n schemaType: field.type,\n icon: getTypeIcon(field.type),\n }\n const fields =\n field.type.jsonType === 'object' ? getFieldRefs(field.type, fieldRef, depth + 1) : []\n\n const syntheticFields =\n field.type.jsonType === 'array' ? getSyntheticFields(field.type, fieldRef, depth + 1) : []\n if (!isAssistSupported(field.type)) {\n return [...fields, ...syntheticFields]\n }\n return [fieldRef, ...fields, ...syntheticFields]\n })\n}\n\nfunction getSyntheticFields(schemaType: ArraySchemaType, parent?: FieldRef, depth = 0) {\n if (depth >= maxDepth) {\n return []\n }\n\n return schemaType.of\n .filter((itemType) => !isType(itemType, 'block'))\n .flatMap((itemType) => {\n const segment = {_key: itemType.name}\n const title = itemType.title ?? itemType.name\n const path: Path = parent ? [...parent.path, segment] : [segment]\n const fieldRef: FieldRef = {\n key: patchableKey(pathToString(path)),\n path,\n title: parent ? [parent.title, title].join(' / ') : title,\n schemaType: itemType,\n icon: getTypeIcon(itemType),\n synthetic: true,\n }\n const fields =\n itemType.jsonType === 'object' ? getFieldRefs(itemType, fieldRef, depth + 1) : []\n\n if (!isAssistSupported(itemType)) {\n return fields\n }\n return [fieldRef, ...fields]\n })\n}\n\nexport function getTypePath(doc: SanityDocumentLike, pathString: string) {\n if (!pathString) {\n return undefined\n }\n\n const path = stringToPath(pathString)\n const currentPath: Path = []\n let valid = true\n const syntheticPath = path.map((segment) => {\n currentPath.push(segment)\n\n if (isKeySegment(segment)) {\n const match = extractWithPath(pathToString(currentPath), doc)[0]\n const value = match?.value\n if (match && value && typeof value === 'object' && '_type' in value) {\n return {_key: value._type as string}\n }\n valid = false\n }\n return segment\n })\n\n return valid ? patchableKey(pathToString(syntheticPath)) : undefined\n}\n\n/**\n * mutator crashes if path contains certain letters\n * @param pathKey\n */\nfunction patchableKey(pathKey: string) {\n return pathKey.replace(/[=]=/g, ':').replace(/[[\\]]/g, '|').replace(/\"/g, '')\n}\n\nexport function useTypePath(doc: SanityDocumentLike, pathString: string) {\n return useMemo(() => getTypePath(doc, pathString), [doc, pathString])\n}\n\nexport function useSelectedField(\n documentSchemaType?: SchemaType,\n path?: string,\n): FieldRef | undefined {\n const selectableFields = useMemo(\n () =>\n documentSchemaType && isObjectSchemaType(documentSchemaType)\n ? getFieldRefsWithDocument(documentSchemaType)\n : [],\n [documentSchemaType],\n )\n\n return useMemo(() => {\n return path ? selectableFields?.find((f) => f.key === path) : undefined\n }, [selectableFields, path])\n}\n\nexport function useSelectedFieldTitle() {\n const {params} = useAiPaneRouter()\n const {documentSchema} = useContext(SelectedFieldContext) ?? {}\n const selectedField = useSelectedField(documentSchema, params[fieldPathParam])\n return getFieldTitle(selectedField)\n}\n\nexport function getFieldTitle(field?: FieldRef) {\n const schemaType = field?.schemaType\n return field?.title ?? schemaType?.title ?? schemaType?.name ?? 'Untitled'\n}\n\nexport type AiPaneRouter = Omit<PaneRouterContextValue, 'setParams' | 'params'> & {\n params: AssistInspectorRouteParams\n setParams: (p: Record<keyof AssistInspectorRouteParams, string | undefined>) => void\n}\n\nexport function useAiPaneRouter() {\n const paneRouter = usePaneRouter()\n\n return useMemo(\n () => ({...paneRouter, params: paneRouter.params ?? {}}) as AiPaneRouter,\n [paneRouter],\n )\n}\n","import {\n createContext,\n ReactNode,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useState,\n} from 'react'\n\nimport {AssistPluginConfig} from '../plugin'\nimport {InstructStatus, useApiClient, useGetInstructStatus, useInitInstruct} from '../useApiClient'\n\nexport interface AiAssistanceConfigContextValue {\n config: AssistPluginConfig\n status?: InstructStatus\n statusLoading: boolean\n initLoading: boolean\n init: () => void\n error?: Error\n}\n\nexport const AiAssistanceConfigContext = createContext<AiAssistanceConfigContextValue>({} as any)\n\nexport function useAiAssistanceConfig() {\n const context = useContext(AiAssistanceConfigContext)\n if (!context) {\n throw new Error('Missing AiAssistanceConfigContext')\n }\n return context\n}\n\nexport function AiAssistanceConfigProvider(props: {\n children?: ReactNode\n config: AssistPluginConfig\n}) {\n const [status, setStatus] = useState<InstructStatus | undefined>()\n const [error, setError] = useState<Error | undefined>()\n\n const apiClient = useApiClient(props.config?.__customApiClient)\n const {getInstructStatus, loading: statusLoading} = useGetInstructStatus(apiClient)\n const {initInstruct, loading: initLoading} = useInitInstruct(apiClient)\n\n useEffect(() => {\n getInstructStatus()\n .then((s) => setStatus(s))\n .catch((e) => {\n console.error(e)\n setError(e as Error)\n })\n }, [getInstructStatus])\n\n const init = useCallback(async () => {\n setError(undefined)\n try {\n await initInstruct()\n const status = await getInstructStatus()\n setStatus(status)\n } catch (e) {\n console.error('Failed to init ai assistance', e)\n setError(e as Error)\n }\n }, [initInstruct, getInstructStatus, setStatus])\n\n const {config, children} = props\n const context = useMemo<AiAssistanceConfigContextValue>(() => {\n return {\n config,\n status,\n statusLoading,\n init,\n initLoading,\n error,\n }\n }, [config, status, init, statusLoading, initLoading, error])\n\n return (\n <AiAssistanceConfigContext.Provider value={context}>\n {children}\n </AiAssistanceConfigContext.Provider>\n )\n}\n","import {assistSerializedFieldTypeName, assistSerializedTypeName} from '../../types'\n\nexport const hiddenTypes = [\n 'any',\n 'array',\n 'block',\n 'boolean',\n 'crossDatasetReference',\n 'date',\n 'datetime',\n 'document',\n 'email',\n 'file',\n 'globalDocumentReference',\n 'image',\n 'number',\n 'object',\n 'reference',\n 'span',\n 'string',\n 'text',\n 'url',\n 'slug',\n 'geopoint',\n 'sanity.assetSourceData',\n 'sanity.imageAsset',\n 'sanity.fileAsset',\n 'sanity.imageCrop',\n 'sanity.imageHotspot',\n 'sanity.imageMetadata',\n 'sanity.imageDimensions',\n 'sanity.imagePalette',\n 'sanity.imagePaletteSwatch',\n\n assistSerializedTypeName,\n assistSerializedFieldTypeName,\n 'sanity-agent.job.document',\n]\n","import {\n ArraySchemaType,\n ImageOptions,\n isArraySchemaType,\n ObjectSchemaType,\n ReferenceOptions,\n ReferenceSchemaType,\n Schema,\n SchemaType,\n typed,\n} from 'sanity'\n\nimport {isAssistSupported} from '../../helpers/assistSupported'\nimport {isType} from '../../helpers/typeUtils'\nimport {\n assistSchemaIdPrefix,\n assistSerializedFieldTypeName,\n assistSerializedTypeName,\n SerializedSchemaMember,\n SerializedSchemaType,\n} from '../../types'\nimport {hiddenTypes} from './schemaUtils'\n\ninterface Options {\n leanFormat?: boolean\n}\n\nconst inlineTypes = ['document', 'object', 'image', 'file']\n\nexport function serializeSchema(schema: Schema, options?: Options): SerializedSchemaType[] {\n const list = schema\n .getTypeNames()\n .filter((t) => !(hiddenTypes.includes(t) || t.startsWith('sanity.')))\n .map((t) => schema.get(t))\n .filter((t): t is SchemaType => !!t)\n // because a field can override exclude at the type level, we have to also serialize excluded types\n // so don't do this: .filter((t) => isAssistSupported(t))\n .map((t) => getSchemaStub(t, schema, options))\n .filter((t) => {\n if ('to' in t && t.to && !t.to.length) {\n return false\n }\n if ('of' in t && t.of && !t.of.length) {\n return false\n }\n if ('fields' in t && t.fields && !t.fields.length) {\n return false\n }\n return true\n })\n list.sort((a, b) => (a?.name ?? '').localeCompare(b?.name ?? ''))\n return list\n}\n\nfunction getSchemaStub(\n schemaType: SchemaType,\n schema: Schema,\n options?: Options,\n): SerializedSchemaType {\n if (!schemaType.type?.name) {\n // eslint-disable-next-line no-console -- log error\n console.error('Missing type name', schemaType.type)\n throw new Error('Type is missing name!')\n }\n const baseSchema: SerializedSchemaType = {\n // we dont need type or id when we send using POST, so leave these out to save bandwidth\n ...(options?.leanFormat\n ? {}\n : {_id: `${assistSchemaIdPrefix}${schemaType.name}`, _type: assistSerializedTypeName}),\n name: schemaType.name,\n title: schemaType.title,\n type: schemaType.type.name,\n ...getBaseFields(schema, schemaType, schemaType.type.name, options),\n }\n\n return removeUndef(baseSchema)\n}\n\nfunction getBaseFields(\n schema: Schema,\n type: SchemaType,\n typeName: string,\n options: Options | undefined,\n) {\n const schemaOptions: SerializedSchemaType['options'] = removeUndef({\n imagePromptField: (type.options as ImageOptions)?.aiAssist?.imageInstructionField,\n embeddingsIndex: (type.options as ReferenceOptions)?.aiAssist?.embeddingsIndex,\n })\n return removeUndef({\n options: Object.keys(schemaOptions).length ? schemaOptions : undefined,\n values: Array.isArray(type?.options?.list)\n ? type?.options?.list.map((v: string | {value: string; title: string}) =>\n typeof v === 'string' ? v : (v.value ?? `${v.title}`),\n )\n : undefined,\n of: 'of' in type && typeName === 'array' ? arrayOf(type, schema, options) : undefined,\n to:\n 'to' in type && typeName === 'reference'\n ? refToTypeNames(type as ReferenceSchemaType)\n : undefined,\n fields:\n 'fields' in type && inlineTypes.includes(typeName)\n ? serializeFields(schema, type, options)\n : undefined,\n annotations:\n typeName === 'block' && 'fields' in type\n ? serializeAnnotations(type, schema, options)\n : undefined,\n inlineOf:\n typeName === 'block' && 'fields' in type\n ? serializeInlineOf(type, schema, options)\n : undefined,\n hidden:\n typeof type.hidden === 'function' ? ('function' as const) : type.hidden ? true : undefined,\n readOnly:\n typeof type.readOnly === 'function'\n ? ('function' as const)\n : type.readOnly\n ? true\n : undefined,\n })\n}\n\nfunction serializeFields(\n schema: Schema,\n schemaType: ObjectSchemaType,\n options: Options | undefined,\n) {\n const fields = schemaType.fieldsets\n ? schemaType.fieldsets.flatMap((fs) =>\n fs.single\n ? fs.field\n : fs.fields.map((f) => ({\n ...f,\n type: {\n ...f.type,\n // if fieldset is (conditionally) hidden, the field must be considered the same way\n // ie, if the field does not show up in conditionalMembers, it is hidden\n // regardless of weather or not it is the field function or the fieldset function that hides it\n hidden:\n typeof fs.hidden === 'function' ? fs.hidden : fs.hidden ? true : f.type.hidden,\n },\n })),\n )\n : schemaType.fields\n\n return fields\n .filter((f) => !['sanity.imageHotspot', 'sanity.imageCrop'].includes(f.type?.name ?? ''))\n .filter((f) => isAssistSupported(f.type))\n .map((field) => serializeMember(schema, field.type, field.name, options))\n}\n\nfunction serializeMember(\n schema: Schema,\n type: SchemaType,\n name: string,\n options: Options | undefined,\n): SerializedSchemaMember {\n const typeNameExists = !!schema.get(type?.name)\n const typeName = typeNameExists ? type.name : (type.type?.name ?? '')\n return removeUndef({\n ...(options?.leanFormat ? {} : {_type: assistSerializedFieldTypeName}),\n name: name,\n type: typeName,\n title: type.title,\n ...getBaseFields(schema, type, typeName, options),\n })\n}\n\nfunction serializeInlineOf(\n blockSchemaType: ObjectSchemaType,\n schema: Schema,\n options: Options | undefined,\n): SerializedSchemaMember[] | undefined {\n const childrenField = blockSchemaType.fields.find((f) => f.name === 'children')\n const childrenType = childrenField?.type\n if (!childrenType || !isArraySchemaType(childrenType)) {\n return undefined\n }\n return arrayOf(\n {\n ...childrenType,\n of: childrenType.of.filter((t) => !isType(t, 'span')),\n },\n schema,\n options,\n )\n}\n\nfunction serializeAnnotations(\n blockSchemaType: ObjectSchemaType,\n schema: Schema,\n options: Options | undefined,\n): SerializedSchemaMember[] | undefined {\n const markDefs = blockSchemaType.fields.find((f) => f.name === 'markDefs')\n const marksType = markDefs?.type\n if (!marksType || !isArraySchemaType(marksType)) {\n return undefined\n }\n return arrayOf(marksType, schema, options)\n}\n\nfunction arrayOf(\n arrayType: ArraySchemaType,\n schema: Schema,\n options: Options | undefined,\n): SerializedSchemaMember[] {\n return arrayType.of\n .filter((type) => isAssistSupported(type))\n .map((t) => {\n return serializeMember(schema, t, t.name, options)\n })\n}\n\nfunction refToTypeNames(type: ReferenceSchemaType) {\n return type.to.map((t) => ({\n type: typed<string>(t.name),\n }))\n}\n\nfunction removeUndef<T extends Record<string, any>>(obj: T): T {\n Object.keys(obj).forEach((key) => (obj[key] === undefined ? delete obj[key] : {}))\n return obj\n}\n","import type {SanityClient} from '@sanity/client'\nimport {useToast} from '@sanity/ui'\nimport {useCallback, useMemo, useState} from 'react'\nimport {Path, pathToString, useClient, useCurrentUser, useSchema} from 'sanity'\n\nimport {useAiAssistanceConfig} from './assistLayout/AiAssistanceConfigContext'\nimport {ConditionalMemberState} from './helpers/conditionalMembers'\nimport {serializeSchema} from './schemas/serialize/serializeSchema'\nimport {FieldLanguageMap} from './translate/paths'\nimport {documentRootKey} from './types'\n\nexport interface UserTextInstance {\n blockKey: string\n userInput: string\n}\n\nexport interface RunInstructionRequest {\n documentId: string\n assistDocumentId: string\n path: string\n typePath?: string\n instructionKey: string\n userId?: string\n userTexts?: UserTextInstance[]\n conditionalMembers?: ConditionalMemberState[]\n}\n\nexport interface InstructStatus {\n enabled: boolean\n initialized: boolean\n validToken: boolean\n}\n\nexport interface TranslateRequest {\n documentId: string\n translatePath: Path\n languagePath?: string\n styleguide: () => Promise<string | undefined>\n fieldLanguageMap?: FieldLanguageMap[]\n conditionalMembers?: ConditionalMemberState[]\n}\n\nconst basePath = '/assist/tasks/instruction'\nexport const API_VERSION_WITH_EXTENDED_TYPES = '2025-04-01'\n\nexport function canUseAssist(status: InstructStatus | undefined) {\n return status?.enabled && status.initialized && status.validToken\n}\n\nexport function useApiClient(customApiClient?: (defaultClient: SanityClient) => SanityClient) {\n const client = useClient({apiVersion: API_VERSION_WITH_EXTENDED_TYPES})\n return useMemo(\n () => (customApiClient ? customApiClient(client) : client),\n [client, customApiClient],\n )\n}\n\nexport function useTranslate(apiClient: SanityClient) {\n const [loading, setLoading] = useState(false)\n const user = useCurrentUser()\n const schema = useSchema()\n const types = useMemo(() => serializeSchema(schema, {leanFormat: true}), [schema])\n const toast = useToast()\n\n const translate = useCallback(\n ({\n documentId,\n languagePath,\n styleguide,\n translatePath,\n fieldLanguageMap,\n conditionalMembers,\n }: TranslateRequest) => {\n setLoading(true)\n\n async function run() {\n return apiClient.request({\n method: 'POST',\n url: `/assist/tasks/translate/${apiClient.config().dataset}?projectId=${\n apiClient.config().projectId\n }`,\n body: {\n documentId,\n types,\n languagePath,\n userStyleguide: await styleguide(),\n fieldLanguageMap,\n conditionalMembers,\n translatePath:\n translatePath.length === 0 ? documentRootKey : pathToString(translatePath),\n userId: user?.id,\n },\n })\n }\n\n return run()\n .catch((e) => {\n toast.push({\n status: 'error',\n title: 'Translate failed',\n description: e.message,\n })\n setLoading(false)\n throw e\n })\n .finally(() => {\n // adding some artificial delay here\n // server responds with 201 then proceeds; we dont need to allow spamming the button\n setTimeout(() => {\n setLoading(false)\n }, 2000)\n })\n },\n [setLoading, apiClient, toast, user, types],\n )\n\n return useMemo(\n () => ({\n translate,\n loading,\n }),\n [translate, loading],\n )\n}\n\nexport function useGenerateCaption(apiClient: SanityClient) {\n const [loading, setLoading] = useState(false)\n const user = useCurrentUser()\n const schema = useSchema()\n const types = useMemo(() => serializeSchema(schema, {leanFormat: true}), [schema])\n const toast = useToast()\n\n const generateCaption = useCallback(\n ({path, documentId}: {path: string; documentId: string}) => {\n setLoading(true)\n\n return apiClient\n .request({\n method: 'POST',\n url: `/assist/tasks/generate-caption/${apiClient.config().dataset}?projectId=${\n apiClient.config().projectId\n }`,\n body: {\n path,\n documentId,\n types,\n userId: user?.id,\n },\n })\n .catch((e) => {\n toast.push({\n status: 'error',\n title: 'Generate image description failed',\n description: e.message,\n })\n setLoading(false)\n throw e\n })\n .finally(() => {\n // adding some artificial delay here\n // server responds with 201 then proceeds; we dont need to allow spamming the button\n setTimeout(() => {\n setLoading(false)\n }, 2000)\n })\n },\n [setLoading, apiClient, toast, user, types],\n )\n\n return useMemo(\n () => ({\n generateCaption,\n loading,\n }),\n [generateCaption, loading],\n )\n}\n\nexport function useGenerateImage(apiClient: SanityClient) {\n const [loading, setLoading] = useState(false)\n const user = useCurrentUser()\n const schema = useSchema()\n const types = useMemo(() => serializeSchema(schema, {leanFormat: true}), [schema])\n const toast = useToast()\n\n const generateImage = useCallback(\n ({path, documentId}: {path: string; documentId: string}) => {\n setLoading(true)\n\n return apiClient\n .request({\n method: 'POST',\n url: `/assist/tasks/generate-image/${apiClient.config().dataset}?projectId=${\n apiClient.config().projectId\n }`,\n body: {\n path,\n documentId,\n types,\n userId: user?.id,\n },\n })\n .catch((e) => {\n toast.push({\n status: 'error',\n title: 'Generate image from prompt failed',\n description: e.message,\n })\n setLoading(false)\n throw e\n })\n .finally(() => {\n // adding some artificial delay here\n // server responds with 201 then proceeds; we dont need to allow spamming the button\n setTimeout(() => {\n setLoading(false)\n }, 2000)\n })\n },\n [setLoading, apiClient, toast, user, types],\n )\n\n return useMemo(\n () => ({\n generateImage,\n loading,\n }),\n [generateImage, loading],\n )\n}\n\nexport function useGetInstructStatus(apiClient: SanityClient) {\n const [loading, setLoading] = useState(true)\n\n const getInstructStatus = useCallback(async () => {\n setLoading(true)\n\n const projectId = apiClient.config().projectId\n try {\n const status = await apiClient.request<InstructStatus>({\n method: 'GET',\n url: `${basePath}/${apiClient.config().dataset}/status?projectId=${projectId}`,\n })\n\n return status\n } finally {\n setLoading(false)\n }\n }, [setLoading, apiClient])\n\n return {\n loading,\n getInstructStatus,\n }\n}\n\nexport function useInitInstruct(apiClient: SanityClient) {\n const [loading, setLoading] = useState(false)\n const initInstruct = useCallback(() => {\n setLoading(true)\n return apiClient\n .request({\n method: 'GET',\n url: `${basePath}/${apiClient.config().dataset}/init?projectId=${\n apiClient.config().projectId\n }`,\n })\n .finally(() => {\n setLoading(false)\n })\n }, [setLoading, apiClient])\n\n return {\n loading,\n initInstruct,\n }\n}\n\nexport function useRunInstructionApi(apiClient: SanityClient) {\n const toast = useToast()\n const [loading, setLoading] = useState(false)\n const user = useCurrentUser()\n const schema = useSchema()\n const types = useMemo(() => serializeSchema(schema, {leanFormat: true}), [schema])\n\n const {\n config: {assist: assistConfig},\n } = useAiAssistanceConfig()\n\n const runInstruction = useCallback(\n (request: RunInstructionRequest) => {\n if (!user) {\n toast.push({\n status: 'error',\n title: 'Unable to get user for instruction.',\n })\n return undefined\n }\n setLoading(true)\n\n const {timeZone, locale} = Intl.DateTimeFormat().resolvedOptions()\n const defaultLocaleSettings = {timeZone, locale}\n const localeSettings =\n assistConfig?.localeSettings?.({user, defaultSettings: defaultLocaleSettings}) ??\n defaultLocaleSettings\n\n return apiClient\n .request({\n method: 'POST',\n url: `${basePath}/${apiClient.config().dataset}?projectId=${\n apiClient.config().projectId\n }`,\n body: {\n ...request,\n types,\n userId: user?.id,\n localeSettings,\n maxPathDepth: assistConfig?.maxPathDepth,\n },\n })\n .catch((e) => {\n toast.push({\n status: 'error',\n title: 'Instruction failed',\n description: e.message,\n })\n throw e\n })\n .finally(() => {\n setLoading(false)\n })\n },\n [apiClient, types, user, toast, assistConfig],\n )\n\n return useMemo(\n () => ({\n runInstruction,\n loading,\n }),\n [runInstruction, loading],\n )\n}\n","import {PlayIcon} from '@sanity/icons'\nimport {Button, Dialog, Flex, Stack, Text, TextArea, Tooltip} from '@sanity/ui'\nimport {\n createContext,\n type Dispatch,\n type FormEvent,\n type PropsWithChildren,\n type SetStateAction,\n useCallback,\n useContext,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n} from 'react'\nimport {FormFieldHeaderText} from 'sanity'\n\nimport {getInstructionTitle} from '../helpers/misc'\nimport {type UserInputBlock, userInputTypeName} from '../types'\nimport {useApiClient, useRunInstructionApi} from '../useApiClient'\nimport {useAiAssistanceConfig} from './AiAssistanceConfigContext'\nimport type {RunInstructionArgs} from './AssistLayout'\n\ntype BlockInputs = Record<string, string>\nconst NO_INPUT: BlockInputs = {}\n\nexport interface RunInstructionContextValue {\n runInstruction: (req: RunInstructionArgs) => void\n instructionLoading: boolean\n}\n\nexport const RunInstructionContext = createContext<RunInstructionContextValue>({\n runInstruction: () => {},\n instructionLoading: false,\n})\n\nexport function useRunInstruction() {\n return useContext(RunInstructionContext)\n}\n\nfunction isUserInputBlock(block: {_type: string}): block is UserInputBlock {\n return block._type === userInputTypeName\n}\n\n// eslint-disable-next-line @typescript-eslint/ban-types\nexport function RunInstructionProvider(props: PropsWithChildren<{}>) {\n const {config} = useAiAssistanceConfig()\n const apiClient = useApiClient(config?.__customApiClient)\n const {runInstruction: runInstructionRequest, loading} = useRunInstructionApi(apiClient)\n\n const id = useId()\n\n const [inputs, setInputs] = useState(NO_INPUT)\n const [runRequest, setRunRequest] = useState<\n (RunInstructionArgs & {userInputBlocks: UserInputBlock[]}) | undefined\n >()\n\n const runInstruction = useCallback(\n (req: RunInstructionArgs) => {\n if (loading) {\n return\n }\n const {instruction, ...request} = req\n const instructionKey = instruction._key\n const userInputBlocks = instruction?.prompt\n ?.flatMap((block) =>\n block._type === 'block' ? block.children.filter(isUserInputBlock) : [block],\n )\n .filter(isUserInputBlock)\n\n if (!userInputBlocks?.length) {\n runInstructionRequest({\n ...request,\n instructionKey,\n userTexts: undefined,\n })\n return\n }\n\n setRunRequest({\n ...req,\n userInputBlocks,\n })\n },\n [runInstructionRequest, loading],\n )\n\n const close = useCallback(() => {\n setRunRequest(undefined)\n setInputs(NO_INPUT)\n }, [])\n\n const runWithInput = useCallback(() => {\n if (runRequest) {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const {instruction, userTexts, ...request} = runRequest\n runInstructionRequest({\n ...request,\n instructionKey: instruction._key,\n userTexts: Object.entries(inputs).map(([key, value]) => ({\n blockKey: key,\n userInput: value,\n })),\n })\n }\n close()\n }, [close, runInstructionRequest, runRequest, inputs])\n\n const open = !!runRequest\n\n const runDisabled = useMemo(\n () =>\n (runRequest?.userInputBlocks?.length ?? 0) >\n Object.entries(inputs).filter(([, value]) => !!value).length,\n [runRequest?.userInputBlocks, inputs],\n )\n\n const runButton = (\n <Button\n text=\"Run instruction\"\n onClick={runWithInput}\n tone=\"primary\"\n icon={PlayIcon}\n style={{width: '100%'}}\n disabled={runDisabled}\n />\n )\n\n const contextValue: RunInstructionContextValue = useMemo(\n () => ({runInstruction, instructionLoading: loading}),\n [runInstruction, loading],\n )\n\n return (\n <RunInstructionContext.Provider value={contextValue}>\n {open ? (\n <Dialog\n id={id}\n open={open}\n onClose={close}\n width={1}\n header={getInstructionTitle(runRequest?.instruction)}\n footer={\n <Flex justify=\"space-between\" padding={2} flex={1}>\n {runDisabled ? (\n <Tooltip\n content={\n <Flex padding={2}>\n <Text>Unable to run instruction. All fields must have a value.</Text>\n </Flex>\n }\n placement=\"top\"\n >\n <Flex flex={1}>{runButton}</Flex>\n </Tooltip>\n ) : (\n runButton\n )}\n </Flex>\n }\n >\n <Stack padding={4} space={2}>\n {runRequest?.userInputBlocks?.map((block, i) => (\n <UserInput\n key={block._key}\n block={block}\n autoFocus={i === 0}\n inputs={inputs}\n setInputs={setInputs}\n />\n ))}\n </Stack>\n </Dialog>\n ) : null}\n {props.children}\n </RunInstructionContext.Provider>\n )\n}\n\nfunction UserInput(props: {\n block: UserInputBlock\n inputs: BlockInputs\n setInputs: Dispatch<SetStateAction<BlockInputs>>\n autoFocus?: boolean\n}) {\n const {block, autoFocus, setInputs, inputs} = props\n const key = block._key\n const textAreaRef = useRef<HTMLTextAreaElement>(null)\n\n const onChange = useCallback(\n (e: FormEvent<HTMLTextAreaElement>) => {\n setInputs((current) => ({\n ...current,\n [key]: (e.currentTarget ?? e.target).value,\n }))\n },\n [key, setInputs],\n )\n\n const value = useMemo(() => inputs[key], [inputs, key])\n\n useEffect(() => {\n if (!autoFocus) {\n return\n }\n setTimeout(() => textAreaRef.current?.focus(), 0)\n }, [autoFocus])\n\n return (\n <Stack padding={2} space={3}>\n <FormFieldHeaderText\n title={block?.message ?? 'Provide more context'}\n description={block.description}\n />\n <TextArea\n ref={textAreaRef}\n rows={4}\n value={value}\n onChange={onChange}\n style={{resize: 'vertical'}}\n />\n </Stack>\n )\n}\n","import {useCallback, useEffect, useState} from 'react'\nimport {ObjectSchemaType, PatchEvent, SanityDocument, unset} from 'sanity'\n\nimport {useRunInstruction} from '../assistLayout/RunInstructionProvider'\n\nexport interface DraftDelayedTaskArgs<T> {\n documentOnChange: (event: PatchEvent) => void\n // indicates if the document is a draft or liveEditable currently\n isDocAssistable: boolean\n task: (args: T) => void\n}\n\nexport function isDocAssistable(\n documentSchemaType: ObjectSchemaType,\n published?: SanityDocument | null,\n draft?: SanityDocument | null,\n) {\n return !!(documentSchemaType.liveEdit ? published : draft)\n}\n\nexport function useRequestRunInstruction(args: {\n documentOnChange: (event: PatchEvent) => void\n // indicates if the document is a draft or liveEditable currently\n isDocAssistable: boolean\n}) {\n const {runInstruction, instructionLoading} = useRunInstruction()\n const requestRunInstruction = useDraftDelayedTask({\n ...args,\n task: runInstruction,\n })\n\n return {\n instructionLoading,\n requestRunInstruction,\n }\n}\n\n/**\n * Ensures that the current document is a draft before running task\n */\nexport function useDraftDelayedTask<T>(args: DraftDelayedTaskArgs<T>) {\n const {documentOnChange, isDocAssistable, task} = args\n\n const [queuedArgs, setQueuedArgs] = useState<T | undefined>(undefined)\n\n useEffect(() => {\n if (queuedArgs && isDocAssistable) {\n task(queuedArgs)\n setQueuedArgs(undefined)\n }\n }, [queuedArgs, isDocAssistable, task])\n\n return useCallback(\n (taskArgs: T) => {\n // make a dummy edit: this will trigger the document/draft to be created\n documentOnChange(PatchEvent.from([unset(['_force_document_creation'])]))\n setQueuedArgs(taskArgs)\n },\n [setQueuedArgs, documentOnChange],\n )\n}\n","import {useMemo} from 'react'\nimport {getDraftId, getVersionId, type ObjectSchemaType, useSchema} from 'sanity'\nimport {useDocumentPane} from 'sanity/structure'\n\nimport {useAiPaneRouter} from '../../assistInspector/helpers'\nimport {fieldPathParam} from '../../types'\nimport type {AssistDocumentContextValue} from '../AssistDocumentContext'\nimport {isDocAssistable} from '../RequestRunInstructionProvider'\nimport {useStudioAssistDocument} from './useStudioAssistDocument'\n\nexport function useAssistDocumentContextValue(documentId: string, documentType: string) {\n const schema = useSchema()\n\n const documentSchemaType = useMemo(() => {\n const schemaType = schema.get(documentType) as ObjectSchemaType | undefined\n if (!schemaType) {\n throw new Error(`Schema type \"${documentType}\" not found`)\n }\n return schemaType\n }, [documentType, schema])\n\n const {\n openInspector,\n closeInspector,\n inspector,\n onChange: documentOnChange,\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore this is a valid option available in `corel` - Remove after corel is merged to next\n selectedReleaseId,\n editState,\n } = useDocumentPane()\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore this is a valid option available in `corel` - Remove after corel is merged to next\n const {draft, published, version} = editState || {}\n\n const assistableDocumentId = selectedReleaseId\n ? getVersionId(documentId, selectedReleaseId)\n : documentSchemaType.liveEdit\n ? documentId\n : getDraftId(documentId)\n\n const documentIsNew = selectedReleaseId ? !version?._id : !draft?._id && !published?._id\n const documentIsAssistable = selectedReleaseId\n ? !!version\n : isDocAssistable(documentSchemaType, published, draft)\n\n const {params} = useAiPaneRouter()\n const selectedPath = params[fieldPathParam]\n\n const assistDocument = useStudioAssistDocument({\n documentId: assistableDocumentId,\n schemaType: documentSchemaType,\n })\n\n const value: AssistDocumentContextValue = useMemo(() => {\n const base = {\n assistableDocumentId,\n documentSchemaType,\n documentIsNew,\n documentIsAssistable,\n openInspector,\n closeInspector,\n inspector,\n documentOnChange,\n selectedPath,\n }\n if (!assistDocument) {\n return {...base, loading: true, assistDocument: undefined}\n }\n return {\n ...base,\n loading: false,\n assistDocument: assistDocument,\n }\n }, [\n assistDocument,\n documentIsAssistable,\n assistableDocumentId,\n documentSchemaType,\n documentIsNew,\n openInspector,\n closeInspector,\n inspector,\n documentOnChange,\n selectedPath,\n ])\n\n return value\n}\n","import {PropsWithChildren} from 'react'\n\nimport {AssistDocumentContext} from './AssistDocumentContext'\nimport {useAssistDocumentContextValue} from './hooks/useAssistDocumentContextValue'\n\nexport interface AIDocumentInputProps {\n documentId: string\n documentType: string\n}\n\nexport function AssistDocumentContextProvider(props: PropsWithChildren<AIDocumentInputProps>) {\n const {documentId, documentType} = props\n const value = useAssistDocumentContextValue(documentId, documentType)\n return (\n <AssistDocumentContext.Provider value={value}>{props.children}</AssistDocumentContext.Provider>\n )\n}\n","import {DocumentLayoutProps} from 'sanity'\n\nimport {AssistDocumentContextProvider} from './AssistDocumentContextProvider'\n\nexport function AssistDocumentLayout(props: DocumentLayoutProps) {\n const {documentId, documentType} = props\n return (\n <AssistDocumentContextProvider documentType={documentType} documentId={documentId}>\n {props.renderDefault(props)}\n </AssistDocumentContextProvider>\n )\n}\n","import {Badge} from '@sanity/ui'\n\nexport function AssistFeatureBadge() {\n return (\n <Badge fontSize={0} style={{margin: '-2px 0'}} tone=\"primary\">\n Beta\n </Badge>\n )\n}\n","import {ArrowRightIcon, CheckmarkIcon, SparklesIcon} from '@sanity/icons'\nimport {Button, Card, Flex, Popover, Stack, Text} from '@sanity/ui'\nimport {useRef} from 'react'\n\nimport {AssistFeatureBadge} from '../components/AssistFeatureBadge'\nimport {pluginTitle, releaseAnnouncementUrl} from '../constants'\n\nexport interface FieldActionsOnboardingProps {\n dismiss: () => void\n}\n\nexport function AssistOnboardingPopover(props: FieldActionsOnboardingProps) {\n const {dismiss} = props\n\n return (\n <Popover\n content={<AssistIntroCard dismiss={dismiss} />}\n open\n portal\n placeholder=\"bottom\"\n tone=\"default\"\n width={0}\n >\n <Card radius={2} shadow={2} style={{padding: 2, lineHeight: 0}}>\n <Button disabled fontSize={1} icon={SparklesIcon} mode=\"bleed\" padding={2} />\n </Card>\n </Popover>\n )\n}\n\nfunction AssistIntroCard(props: {dismiss: () => void}) {\n const buttonRef = useRef<HTMLButtonElement>(null)\n\n return (\n <Stack as=\"section\" padding={3} space={3}>\n <Stack padding={2} space={4}>\n <Flex gap={2} align=\"center\">\n <Text as=\"h1\" size={1} weight=\"semibold\">\n {pluginTitle}\n </Text>\n <div aria-hidden style={{margin: '-3px 0', lineHeight: 0}}>\n <AssistFeatureBadge />\n </div>\n </Flex>\n\n <Stack space={3}>\n <Text as=\"p\" muted size={1}>\n Manage reusable AI instructions to boost your content creation and reduce amount of\n repetitive chores.{' '}\n <a href={releaseAnnouncementUrl} target=\"_blank\" rel=\"noreferrer\">\n Learn more <ArrowRightIcon />\n </a>\n </Text>\n </Stack>\n </Stack>\n\n <Button\n fontSize={1}\n icon={CheckmarkIcon}\n onClick={props.dismiss}\n padding={3}\n ref={buttonRef}\n text=\"Ok, good to know!\"\n tone=\"primary\"\n />\n </Stack>\n )\n}\n","import {useCallback, useState} from 'react'\n\nexport const inspectorOnboardingKey = 'sanityStudio:assist:inspector:onboarding:dismissed'\nexport const fieldOnboardingKey = 'sanityStudio:assist:field:onboarding:dismissed'\n\nexport function isFeatureOnboardingDismissed(featureKey: string): boolean {\n if (typeof localStorage === 'undefined') {\n return false\n }\n\n const value = localStorage.getItem(featureKey)\n return value === 'true'\n}\n\nexport function dismissFeatureOnboarding(featureKey: string) {\n if (typeof localStorage === 'undefined') {\n return\n }\n\n localStorage.setItem(featureKey, 'true')\n}\n\nexport function useOnboardingFeature(featureKey: string) {\n const [showOnboarding, setShowOnboarding] = useState(\n () => !isFeatureOnboardingDismissed(featureKey),\n )\n const dismissOnboarding = useCallback(() => {\n setShowOnboarding(false)\n dismissFeatureOnboarding(featureKey)\n }, [setShowOnboarding, featureKey])\n\n return {showOnboarding, dismissOnboarding}\n}\n","import {forwardRef, type ReactElement, type ReactNode} from 'react'\nimport {keyframes, styled} from 'styled-components'\n\nconst fadeIn = keyframes`\n 0% {\n opacity: 0;\n transform: scale(0.75);\n }\n 40% {\n opacity: 0;\n transform: scale(0.75);\n }\n 100% {\n opacity: 1;\n transform: scale(1);\n }\n`\n\nconst FadeInDiv = styled.div`\n animation-name: ${fadeIn};\n animation-timing-function: ease-in-out;\n`\n\nexport const FadeInContent = forwardRef(function FadeInContent(\n {\n children,\n durationMs = 250,\n }: {\n children?: ReactNode\n ms?: number\n durationMs?: number\n },\n ref: any,\n): ReactElement {\n return (\n <FadeInDiv ref={ref} style={{animationDuration: `${durationMs}ms`}}>\n {children}\n </FadeInDiv>\n )\n})\n","const COLOR_HUES = [\n \"gray\",\n \"blue\",\n \"purple\",\n \"magenta\",\n \"red\",\n \"orange\",\n \"yellow\",\n \"green\",\n \"cyan\"\n], COLOR_TINTS = [\n \"50\",\n \"100\",\n \"200\",\n \"300\",\n \"400\",\n \"500\",\n \"600\",\n \"700\",\n \"800\",\n \"900\",\n \"950\"\n];\nfunction hslToRgb(hsl) {\n const h = hsl[0], s = hsl[1] / 100, l = hsl[2] / 100, k = (n) => (n + h / 30) % 12, a = s * Math.min(l, 1 - l), f = (n) => l - a * Math.max(-1, Math.min(k(n) - 3, Math.min(9 - k(n), 1)));\n return [255 * f(0), 255 * f(8), 255 * f(4)];\n}\nfunction rgbToHex([r, g, b]) {\n const _r = Math.round(r), _g = Math.round(g), _b = Math.round(b);\n return \"#\" + ((1 << 24) + (_r << 16) + (_g << 8) + _b).toString(16).slice(1);\n}\nfunction buildTints(options) {\n const { hueKey, color: color2 } = options;\n return COLOR_TINTS.reduce((acc, tintKey) => {\n const tint = Number(tintKey), rgb = hslToRgb(color2.tints[tintKey].hsl), hex = rgbToHex([Math.round(rgb[0]), Math.round(rgb[1]), Math.round(rgb[2])]);\n return acc[tintKey] = {\n title: `${hueKey.slice(0, 1).toUpperCase()}${hueKey.slice(1)} ${tint}`,\n hex\n }, acc;\n }, {});\n}\nconst black = {\n title: \"Black\",\n hex: \"#0d0e12\"\n}, white = {\n title: \"White\",\n hex: \"#ffffff\"\n}, gray = {\n 50: {\n title: \"Gray 50\",\n hex: \"#f6f6f8\"\n },\n 100: {\n title: \"Gray 100\",\n hex: \"#eeeef1\"\n },\n 200: {\n title: \"Gray 200\",\n hex: \"#e3e4e8\"\n },\n 300: {\n title: \"Gray 300\",\n hex: \"#bbbdc9\"\n },\n 400: {\n title: \"Gray 400\",\n hex: \"#9499ad\"\n },\n 500: {\n title: \"Gray 500\",\n hex: \"#727892\"\n },\n 600: {\n title: \"Gray 600\",\n hex: \"#515870\"\n },\n 700: {\n title: \"Gray 700\",\n hex: \"#383d51\"\n },\n 800: {\n title: \"Gray 800\",\n hex: \"#252837\"\n },\n 900: {\n title: \"Gray 900\",\n hex: \"#1b1d27\"\n },\n 950: {\n title: \"Gray 950\",\n hex: \"#13141b\"\n }\n}, blue = {\n 50: {\n title: \"Blue 50\",\n hex: \"#f5f8ff\"\n },\n 100: {\n title: \"Blue 100\",\n hex: \"#e5edff\"\n },\n 200: {\n title: \"Blue 200\",\n hex: \"#dbe5ff\"\n },\n 300: {\n title: \"Blue 300\",\n hex: \"#a8bfff\"\n },\n 400: {\n title: \"Blue 400\",\n hex: \"#7595ff\"\n },\n 500: {\n title: \"Blue 500\",\n hex: \"#556bfc\"\n },\n 600: {\n title: \"Blue 600\",\n hex: \"#4043e7\"\n },\n 700: {\n title: \"Blue 700\",\n hex: \"#2927aa\"\n },\n 800: {\n title: \"Blue 800\",\n hex: \"#192457\"\n },\n 900: {\n title: \"Blue 900\",\n hex: \"#161a41\"\n },\n 950: {\n title: \"Blue 950\",\n hex: \"#101228\"\n }\n}, purple = {\n 50: {\n title: \"Purple 50\",\n hex: \"#f8f5ff\"\n },\n 100: {\n title: \"Purple 100\",\n hex: \"#f1ebff\"\n },\n 200: {\n title: \"Purple 200\",\n hex: \"#ece1fe\"\n },\n 300: {\n title: \"Purple 300\",\n hex: \"#ccb1fc\"\n },\n 400: {\n title: \"Purple 400\",\n hex: \"#b087f7\"\n },\n 500: {\n title: \"Purple 500\",\n hex: \"#8f57ef\"\n },\n 600: {\n title: \"Purple 600\",\n hex: \"#721fe5\"\n },\n 700: {\n title: \"Purple 700\",\n hex: \"#4c1a9e\"\n },\n 800: {\n title: \"Purple 800\",\n hex: \"#2f1862\"\n },\n 900: {\n title: \"Purple 900\",\n hex: \"#23173f\"\n },\n 950: {\n title: \"Purple 950\",\n hex: \"#181128\"\n }\n}, magenta = {\n 50: {\n title: \"Magenta 50\",\n hex: \"#fef6f9\"\n },\n 100: {\n title: \"Magenta 100\",\n hex: \"#fde8ef\"\n },\n 200: {\n title: \"Magenta 200\",\n hex: \"#fcdee9\"\n },\n 300: {\n title: \"Magenta 300\",\n hex: \"#f7abc5\"\n },\n 400: {\n title: \"Magenta 400\",\n hex: \"#f0709b\"\n },\n 500: {\n title: \"Magenta 500\",\n hex: \"#e72767\"\n },\n 600: {\n title: \"Magenta 600\",\n hex: \"#b11651\"\n },\n 700: {\n title: \"Magenta 700\",\n hex: \"#7c1342\"\n },\n 800: {\n title: \"Magenta 800\",\n hex: \"#4b1130\"\n },\n 900: {\n title: \"Magenta 900\",\n hex: \"#341325\"\n },\n 950: {\n title: \"Magenta 950\",\n hex: \"#1f0f14\"\n }\n}, red = {\n 50: {\n title: \"Red 50\",\n hex: \"#fff6f5\"\n },\n 100: {\n title: \"Red 100\",\n hex: \"#ffe7e5\"\n },\n 200: {\n title: \"Red 200\",\n hex: \"#ffdedc\"\n },\n 300: {\n title: \"Red 300\",\n hex: \"#fdada5\"\n },\n 400: {\n title: \"Red 400\",\n hex: \"#f77769\"\n },\n 500: {\n title: \"Red 500\",\n hex: \"#ef4434\"\n },\n 600: {\n title: \"Red 600\",\n hex: \"#cc2819\"\n },\n 700: {\n title: \"Red 700\",\n hex: \"#8b2018\"\n },\n 800: {\n title: \"Red 800\",\n hex: \"#4d1714\"\n },\n 900: {\n title: \"Red 900\",\n hex: \"#321615\"\n },\n 950: {\n title: \"Red 950\",\n hex: \"#1e1011\"\n }\n}, orange = {\n 50: {\n title: \"Orange 50\",\n hex: \"#fff7f0\"\n },\n 100: {\n title: \"Orange 100\",\n hex: \"#ffeadb\"\n },\n 200: {\n title: \"Orange 200\",\n hex: \"#ffddc7\"\n },\n 300: {\n title: \"Orange 300\",\n hex: \"#ffb685\"\n },\n 400: {\n title: \"Orange 400\",\n hex: \"#ff8e42\"\n },\n 500: {\n title: \"Orange 500\",\n hex: \"#fa6400\"\n },\n 600: {\n title: \"Orange 600\",\n hex: \"#b14802\"\n },\n 700: {\n title: \"Orange 700\",\n hex: \"#7c3404\"\n },\n 800: {\n title: \"Orange 800\",\n hex: \"#461e07\"\n },\n 900: {\n title: \"Orange 900\",\n hex: \"#32160b\"\n },\n 950: {\n title: \"Orange 950\",\n hex: \"#21120d\"\n }\n}, yellow = {\n 50: {\n title: \"Yellow 50\",\n hex: \"#fefae1\"\n },\n 100: {\n title: \"Yellow 100\",\n hex: \"#fcf3bb\"\n },\n 200: {\n title: \"Yellow 200\",\n hex: \"#f9e994\"\n },\n 300: {\n title: \"Yellow 300\",\n hex: \"#f7d455\"\n },\n 400: {\n title: \"Yellow 400\",\n hex: \"#f9bc15\"\n },\n 500: {\n title: \"Yellow 500\",\n hex: \"#d28a04\"\n },\n 600: {\n title: \"Yellow 600\",\n hex: \"#965908\"\n },\n 700: {\n title: \"Yellow 700\",\n hex: \"#653a0b\"\n },\n 800: {\n title: \"Yellow 800\",\n hex: \"#3b220c\"\n },\n 900: {\n title: \"Yellow 900\",\n hex: \"#271a11\"\n },\n 950: {\n title: \"Yellow 950\",\n hex: \"#181410\"\n }\n}, green = {\n 50: {\n title: \"Green 50\",\n hex: \"#e7fef5\"\n },\n 100: {\n title: \"Green 100\",\n hex: \"#c5fce8\"\n },\n 200: {\n title: \"Green 200\",\n hex: \"#a9f9dc\"\n },\n 300: {\n title: \"Green 300\",\n hex: \"#59f3ba\"\n },\n 400: {\n title: \"Green 400\",\n hex: \"#0ff0a1\"\n },\n 500: {\n title: \"Green 500\",\n hex: \"#04b97a\"\n },\n 600: {\n title: \"Green 600\",\n hex: \"#01794f\"\n },\n 700: {\n title: \"Green 700\",\n hex: \"#015133\"\n },\n 800: {\n title: \"Green 800\",\n hex: \"#023120\"\n },\n 900: {\n title: \"Green 900\",\n hex: \"#06231a\"\n },\n 950: {\n title: \"Green 950\",\n hex: \"#071715\"\n }\n}, cyan = {\n 50: {\n title: \"Cyan 50\",\n hex: \"#e7fefe\"\n },\n 100: {\n title: \"Cyan 100\",\n hex: \"#c5fcfc\"\n },\n 200: {\n title: \"Cyan 200\",\n hex: \"#96f8f8\"\n },\n 300: {\n title: \"Cyan 300\",\n hex: \"#62efef\"\n },\n 400: {\n title: \"Cyan 400\",\n hex: \"#18e2e2\"\n },\n 500: {\n title: \"Cyan 500\",\n hex: \"#04b8be\"\n },\n 600: {\n title: \"Cyan 600\",\n hex: \"#037782\"\n },\n 700: {\n title: \"Cyan 700\",\n hex: \"#024950\"\n },\n 800: {\n title: \"Cyan 800\",\n hex: \"#042f34\"\n },\n 900: {\n title: \"Cyan 900\",\n hex: \"#072227\"\n },\n 950: {\n title: \"Cyan 950\",\n hex: \"#0d181c\"\n }\n}, hues = { gray, blue, purple, magenta, red, orange, yellow, green, cyan }, color = { black, white, ...hues }, config = {\n black: {\n title: \"Black\",\n hsl: [225, 16, 6]\n },\n white: {\n title: \"White\",\n hsl: [0, 0, 100]\n },\n gray: {\n title: \"Gray\",\n tints: {\n 50: {\n title: \"Gray 50\",\n hsl: [240, 12, 97]\n },\n 100: {\n title: \"Gray 100\",\n hsl: [240, 10, 94]\n },\n 200: {\n title: \"Gray 200\",\n hsl: [231, 10, 90]\n },\n 300: {\n title: \"Gray 300\",\n hsl: [232, 11, 76]\n },\n 400: {\n title: \"Gray 400\",\n hsl: [228, 13, 63]\n },\n 500: {\n title: \"Gray 500\",\n hsl: [229, 13, 51]\n },\n 600: {\n title: \"Gray 600\",\n hsl: [228, 16, 38]\n },\n 700: {\n title: \"Gray 700\",\n hsl: [229, 18, 27]\n },\n 800: {\n title: \"Gray 800\",\n hsl: [229, 19, 18]\n },\n 900: {\n title: \"Gray 900\",\n hsl: [228, 19, 13]\n },\n 950: {\n title: \"Gray 950\",\n hsl: [233, 17, 9]\n }\n }\n },\n blue: {\n title: \"Blue\",\n tints: {\n 50: {\n title: \"Blue 50\",\n hsl: [222, 100, 98]\n },\n 100: {\n title: \"Blue 100\",\n hsl: [222, 100, 95]\n },\n 200: {\n title: \"Blue 200\",\n hsl: [223, 100, 93]\n },\n 300: {\n title: \"Blue 300\",\n hsl: [224, 100, 83]\n },\n 400: {\n title: \"Blue 400\",\n hsl: [226, 100, 73]\n },\n 500: {\n title: \"Blue 500\",\n hsl: [232, 96, 66]\n },\n 600: {\n title: \"Blue 600\",\n hsl: [239, 78, 58]\n },\n 700: {\n title: \"Blue 700\",\n hsl: [241, 63, 41]\n },\n 800: {\n title: \"Blue 800\",\n hsl: [230, 55, 22]\n },\n 900: {\n title: \"Blue 900\",\n hsl: [234, 49, 17]\n },\n 950: {\n title: \"Blue 950\",\n hsl: [235, 43, 11]\n }\n }\n },\n purple: {\n title: \"Purple\",\n tints: {\n 50: {\n title: \"Purple 50\",\n hsl: [260, 95, 98]\n },\n 100: {\n title: \"Purple 100\",\n hsl: [260, 98, 96]\n },\n 200: {\n title: \"Purple 200\",\n hsl: [263, 96, 94]\n },\n 300: {\n title: \"Purple 300\",\n hsl: [262, 92, 84]\n },\n 400: {\n title: \"Purple 400\",\n hsl: [262, 88, 75]\n },\n 500: {\n title: \"Purple 500\",\n hsl: [262, 83, 64]\n },\n 600: {\n title: \"Purple 600\",\n hsl: [265, 79, 51]\n },\n 700: {\n title: \"Purple 700\",\n hsl: [263, 72, 36]\n },\n 800: {\n title: \"Purple 800\",\n hsl: [258, 60, 24]\n },\n 900: {\n title: \"Purple 900\",\n hsl: [257, 46, 17]\n },\n 950: {\n title: \"Purple 950\",\n hsl: [260, 41, 11]\n }\n }\n },\n magenta: {\n title: \"Magenta\",\n tints: {\n 50: {\n title: \"Magenta 50\",\n hsl: [340, 82, 98]\n },\n 100: {\n title: \"Magenta 100\",\n hsl: [339, 83, 95]\n },\n 200: {\n title: \"Magenta 200\",\n hsl: [339, 83, 93]\n },\n 300: {\n title: \"Magenta 300\",\n hsl: [340, 82, 82]\n },\n 400: {\n title: \"Magenta 400\",\n hsl: [340, 81, 69]\n },\n 500: {\n title: \"Magenta 500\",\n hsl: [340, 80, 53]\n },\n 600: {\n title: \"Magenta 600\",\n hsl: [337, 78, 39]\n },\n 700: {\n title: \"Magenta 700\",\n hsl: [333, 73, 28]\n },\n 800: {\n title: \"Magenta 800\",\n hsl: [328, 63, 18]\n },\n 900: {\n title: \"Magenta 900\",\n hsl: [327, 46, 14]\n },\n 950: {\n title: \"Magenta 950\",\n hsl: [341, 35, 9]\n }\n }\n },\n red: {\n title: \"Red\",\n tints: {\n 50: {\n title: \"Red 50\",\n hsl: [5, 100, 98]\n },\n 100: {\n title: \"Red 100\",\n hsl: [4, 100, 95]\n },\n 200: {\n title: \"Red 200\",\n hsl: [4, 98, 93]\n },\n 300: {\n title: \"Red 300\",\n hsl: [5, 95, 82]\n },\n 400: {\n title: \"Red 400\",\n hsl: [6, 90, 69]\n },\n 500: {\n title: \"Red 500\",\n hsl: [5, 85, 57]\n },\n 600: {\n title: \"Red 600\",\n hsl: [5, 78, 45]\n },\n 700: {\n title: \"Red 700\",\n hsl: [4, 70, 32]\n },\n 800: {\n title: \"Red 800\",\n hsl: [3, 58, 19]\n },\n 900: {\n title: \"Red 900\",\n hsl: [2, 41, 14]\n },\n 950: {\n title: \"Red 950\",\n hsl: [356, 30, 9]\n }\n }\n },\n orange: {\n title: \"Orange\",\n tints: {\n 50: {\n title: \"Orange 50\",\n hsl: [28, 100, 97]\n },\n 100: {\n title: \"Orange 100\",\n hsl: [25, 100, 93]\n },\n 200: {\n title: \"Orange 200\",\n hsl: [24, 100, 89]\n },\n 300: {\n title: \"Orange 300\",\n hsl: [24, 100, 76]\n },\n 400: {\n title: \"Orange 400\",\n hsl: [24, 100, 63]\n },\n 500: {\n title: \"Orange 500\",\n hsl: [24, 100, 49]\n },\n 600: {\n title: \"Orange 600\",\n hsl: [24, 98, 35]\n },\n 700: {\n title: \"Orange 700\",\n hsl: [24, 94, 25]\n },\n 800: {\n title: \"Orange 800\",\n hsl: [22, 82, 15]\n },\n 900: {\n title: \"Orange 900\",\n hsl: [17, 65, 12]\n },\n 950: {\n title: \"Orange 950\",\n hsl: [14, 43, 9]\n }\n }\n },\n yellow: {\n title: \"Yellow\",\n tints: {\n 50: {\n title: \"Yellow 50\",\n hsl: [51, 94, 94]\n },\n 100: {\n title: \"Yellow 100\",\n hsl: [52, 91, 86]\n },\n 200: {\n title: \"Yellow 200\",\n hsl: [50, 90, 78]\n },\n 300: {\n title: \"Yellow 300\",\n hsl: [47, 91, 65]\n },\n 400: {\n title: \"Yellow 400\",\n hsl: [44, 95, 53]\n },\n 500: {\n title: \"Yellow 500\",\n hsl: [39, 96, 42]\n },\n 600: {\n title: \"Yellow 600\",\n hsl: [34, 90, 31]\n },\n 700: {\n title: \"Yellow 700\",\n hsl: [31, 80, 22]\n },\n 800: {\n title: \"Yellow 800\",\n hsl: [28, 66, 14]\n },\n 900: {\n title: \"Yellow 900\",\n hsl: [24, 40, 11]\n },\n 950: {\n title: \"Yellow 950\",\n hsl: [24, 20, 8]\n }\n }\n },\n green: {\n title: \"Green\",\n tints: {\n 50: {\n title: \"Green 50\",\n hsl: [157, 89, 95]\n },\n 100: {\n title: \"Green 100\",\n hsl: [158, 89, 88]\n },\n 200: {\n title: \"Green 200\",\n hsl: [158, 87, 82]\n },\n 300: {\n title: \"Green 300\",\n hsl: [158, 86, 65]\n },\n 400: {\n title: \"Green 400\",\n hsl: [159, 88, 50]\n },\n 500: {\n title: \"Green 500\",\n hsl: [159, 96, 37]\n },\n 600: {\n title: \"Green 600\",\n hsl: [159, 98, 24]\n },\n 700: {\n title: \"Green 700\",\n hsl: [158, 98, 16]\n },\n 800: {\n title: \"Green 800\",\n hsl: [158, 91, 10]\n },\n 900: {\n title: \"Green 900\",\n hsl: [162, 72, 8]\n },\n 950: {\n title: \"Green 950\",\n hsl: [172, 51, 6]\n }\n }\n },\n cyan: {\n title: \"Cyan\",\n tints: {\n 50: {\n title: \"Cyan 50\",\n hsl: [180, 92, 95]\n },\n 100: {\n title: \"Cyan 100\",\n hsl: [180, 91, 88]\n },\n 200: {\n title: \"Cyan 200\",\n hsl: [180, 87, 78]\n },\n 300: {\n title: \"Cyan 300\",\n hsl: [180, 81, 66]\n },\n 400: {\n title: \"Cyan 400\",\n hsl: [180, 81, 49]\n },\n 500: {\n title: \"Cyan 500\",\n hsl: [182, 96, 38]\n },\n 600: {\n title: \"Cyan 600\",\n hsl: [185, 96, 26]\n },\n 700: {\n title: \"Cyan 700\",\n hsl: [185, 95, 16]\n },\n 800: {\n title: \"Cyan 800\",\n hsl: [187, 86, 11]\n },\n 900: {\n title: \"Cyan 900\",\n hsl: [188, 68, 9]\n },\n 950: {\n title: \"Cyan 950\",\n hsl: [196, 37, 8]\n }\n }\n }\n};\nfunction hexToRgb(hex) {\n const result = /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i.exec(hex);\n if (!result)\n throw new Error(\"input is not valid hex\");\n return [parseInt(result[1], 16), parseInt(result[2], 16), parseInt(result[3], 16)];\n}\nfunction rgbToHsl([r, g, b]) {\n r /= 255, g /= 255, b /= 255;\n const cmin = Math.min(r, g, b), cmax = Math.max(r, g, b), delta = cmax - cmin;\n let h = 0, s = 0, l = 0;\n return delta == 0 ? h = 0 : cmax == r ? h = (g - b) / delta % 6 : cmax == g ? h = (b - r) / delta + 2 : h = (r - g) / delta + 4, h = Math.round(h * 60), h < 0 && (h += 360), l = (cmax + cmin) / 2, s = delta == 0 ? 0 : delta / (1 - Math.abs(2 * l - 1)), s = +(s * 100).toFixed(0), l = +(l * 100).toFixed(0), [h, s, l];\n}\nfunction clamp(num) {\n return Math.max(Math.min(num, 255), 0);\n}\nfunction darkenChannel(backdrop, source) {\n return Math.min(backdrop, source);\n}\nfunction darken(b, s) {\n return [\n Math.round(clamp(darkenChannel(b[0] / 255, s[0] / 255) * 255)),\n Math.round(clamp(darkenChannel(b[1] / 255, s[1] / 255) * 255)),\n Math.round(clamp(darkenChannel(b[2] / 255, s[2] / 255) * 255))\n ];\n}\nfunction interpolate(min, max, val) {\n const size = max - min;\n return min + size * val;\n}\nfunction limit(darkest, lightest, source) {\n const r = Math.round(interpolate(darkest[0], lightest[0], source[0] / 255)), g = Math.round(interpolate(darkest[1], lightest[1], source[1] / 255)), b = Math.round(interpolate(darkest[2], lightest[2], source[2] / 255));\n return [r, g, b];\n}\nfunction screenChannel(backdrop, source) {\n return backdrop + source - backdrop * source;\n}\nfunction screen(b, s) {\n return [\n Math.round(clamp(screenChannel(b[0] / 255, s[0] / 255) * 255)),\n Math.round(clamp(screenChannel(b[1] / 255, s[1] / 255) * 255)),\n Math.round(clamp(screenChannel(b[2] / 255, s[2] / 255) * 255))\n ];\n}\nexport {\n COLOR_HUES,\n COLOR_TINTS,\n black,\n blue,\n buildTints,\n color,\n config,\n cyan,\n darken,\n gray,\n green,\n hexToRgb,\n hslToRgb,\n hues,\n limit,\n magenta,\n orange,\n purple,\n red,\n rgbToHex,\n rgbToHsl,\n screen,\n white,\n yellow\n};\n//# sourceMappingURL=index.js.map\n","import {purple} from '@sanity/color'\nimport {SparklesIcon} from '@sanity/icons'\nimport {Text} from '@sanity/ui'\nimport {type CSSProperties, useMemo} from 'react'\nimport {useColorSchemeValue} from 'sanity'\nimport {keyframes, styled} from 'styled-components'\n\nconst Root = styled.span`\n display: block;\n width: 25px;\n height: 25px;\n position: relative;\n`\n\nconst dash = keyframes`\n 0% {\n transform: rotate(0);\n }\n 100% {\n transform: rotate(43deg);\n }\n`\n\nconst Outline = styled.svg`\n display: block;\n position: absolute;\n top: 0;\n left: 0;\n\n & > circle {\n stroke: var(--ai-avatar-stroke-color);\n stroke-width: 1.5px;\n stroke-linecap: round;\n transform-origin: center;\n animation: ${dash} 500ms ease-in-out infinite;\n transition: stroke-dasharray 200ms ease-in-out;\n\n stroke-dasharray: 2.34px 0;\n\n [data-state='active'] > & {\n stroke-dasharray: 2px 2.34px;\n }\n }\n`\n\nconst IconDisc = styled.span`\n background: var(--ai-avatar-disc-color);\n color: white;\n width: 21px;\n height: 21px;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 10.5px;\n position: absolute;\n top: 2px;\n left: 2px;\n`\n\nexport function AssistAvatar(props: {state?: 'present' | 'active'}) {\n const {state = 'present'} = props\n const scheme = useColorSchemeValue()\n\n const style = useMemo(() => {\n if (scheme === 'dark') {\n return {\n [`--ai-avatar-stroke-color`]: purple[400].hex,\n [`--ai-avatar-disc-color`]: purple[600].hex,\n } as CSSProperties\n }\n\n return {\n [`--ai-avatar-stroke-color`]: purple[500].hex,\n [`--ai-avatar-disc-color`]: purple[600].hex,\n } as CSSProperties\n }, [scheme])\n\n return (\n <Root data-state={state} style={style}>\n <Outline\n width=\"25\"\n height=\"25\"\n viewBox=\"0 0 25 25\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <circle cx=\"12.5\" cy=\"12.5\" r=\"11.75\" />\n </Outline>\n <IconDisc>\n <Text as=\"span\" size={0} style={{color: 'inherit'}}>\n <SparklesIcon style={{color: 'inherit'}} />\n </Text>\n </IconDisc>\n </Root>\n )\n}\n","// eslint-disable-next-line react/no-unused-prop-types\nimport {Card, Flex, Text, Tooltip} from '@sanity/ui'\nimport type {FormNodePresence} from 'sanity'\n\nimport {FadeInContent} from '../components/FadeInContent'\nimport {AssistAvatar} from './AssistAvatar'\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nexport function AiFieldPresence(props: {presence: FormNodePresence}) {\n return (\n <Card style={{position: 'relative', background: 'transparent'}} contentEditable={false}>\n <Tooltip\n placement=\"left\"\n content={\n <Card padding={3} border>\n <Flex align=\"center\">\n <Text size={1}>Running instruction...</Text>\n </Flex>\n </Card>\n }\n >\n <FadeInContent durationMs={300}>\n <AssistAvatar state=\"active\" />\n </FadeInContent>\n </Tooltip>\n </Card>\n )\n}\n","import {useMemo} from 'react'\nimport {type FormNodePresence, isKeySegment, type Path, stringToPath} from 'sanity'\n\nimport {useAssistDocumentContext} from '../assistDocument/AssistDocumentContext'\nimport {maxHistoryVisibilityMs, pluginTitle} from '../constants'\nimport type {AiPresence} from '../types'\n\nconst NO_PRESENCE: FormNodePresence[] = []\n\nexport function useAssistPresence(path: Path, showFocusWithin?: boolean): FormNodePresence[] {\n const context = useAssistDocumentContext()\n const assistDocument = context && 'assistDocument' in context ? context.assistDocument : undefined\n const tasks = assistDocument?.tasks\n\n return useMemo(() => {\n const activePresence = tasks\n ?.filter((task) => !task.ended)\n ?.flatMap((task) => task.presence ?? [])\n ?.filter(\n (p) =>\n p.started &&\n new Date().getTime() - new Date(p.started).getTime() < maxHistoryVisibilityMs,\n )\n .filter((presence) => {\n if (!presence.path || !path.length) {\n return false\n }\n const statusPath = stringToPath(presence.path)\n\n if (!showFocusWithin && statusPath.length !== path.length) {\n return false\n }\n\n return path.every((pathSegment, i) => {\n const statusSegment = statusPath[i]\n if (typeof pathSegment === 'string') {\n return pathSegment === statusSegment\n }\n if (isKeySegment(pathSegment) && isKeySegment(statusSegment)) {\n return pathSegment._key === statusSegment._key\n }\n return false\n })\n })\n if (!activePresence?.length) {\n return NO_PRESENCE\n }\n\n return activePresence.map((status) => aiPresence(status, path))\n }, [showFocusWithin, tasks, path])\n}\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nexport function aiPresence(presence: AiPresence, path: Path, title?: string): FormNodePresence {\n return {\n user: {\n id: `sanity-assistant_${presence._key}`,\n displayName: pluginTitle,\n },\n path: path,\n sessionId: 'not-available',\n lastActiveAt: presence?.started ?? new Date().toISOString(),\n }\n}\n","import {Box, Flex} from '@sanity/ui'\nimport {useContext, useMemo} from 'react'\nimport {FieldProps, isArraySchemaType, pathToString} from 'sanity'\n\nimport {assistFormId} from '../_lib/form/constants'\nimport {isAssistSupported} from '../helpers/assistSupported'\nimport {isPortableTextArray, isType} from '../helpers/typeUtils'\nimport {AssistOnboardingPopover} from '../onboarding/FieldActionsOnboarding'\nimport {FirstAssistedPathContext} from '../onboarding/FirstAssistedPathProvider'\nimport {fieldOnboardingKey, useOnboardingFeature} from '../onboarding/onboardingStore'\nimport {AiFieldPresence} from '../presence/AiFieldPresence'\nimport {useAssistPresence} from '../presence/useAssistPresence'\nimport {contextDocumentTypeName} from '../types'\n\nexport function AssistFieldWrapper(props: FieldProps) {\n const {schemaType} = props\n\n const isSupported = useMemo(() => isAssistSupported(schemaType), [schemaType])\n\n if (\n !isSupported ||\n schemaType.name.startsWith('sanity.') ||\n schemaType.name === contextDocumentTypeName\n ) {\n return props.renderDefault(props)\n }\n if (\n !isType(props.schemaType, 'document') &&\n props.inputId !== 'root' &&\n props.inputId !== assistFormId\n ) {\n return <AssistField {...props}>{props.children}</AssistField>\n }\n\n return props.renderDefault(props)\n}\n\nexport function AssistField(props: FieldProps) {\n const {path} = props\n\n const isPortableText = useMemo(\n () => !!(isArraySchemaType(props.schemaType) && isPortableTextArray(props.schemaType)),\n [props.schemaType],\n )\n\n const presence = useAssistPresence(props.path, isPortableText)\n\n const firstAssistedPath = useContext(FirstAssistedPathContext)\n const isFirstAssisted = useMemo(\n () => pathToString(path) === firstAssistedPath,\n [path, firstAssistedPath],\n )\n\n const {showOnboarding, dismissOnboarding} = useOnboardingFeature(fieldOnboardingKey)\n const singlePresence = presence[0]\n\n const actions = (\n <Flex gap={2} align=\"center\" justify=\"space-between\">\n {singlePresence && (\n <Box>\n <AiFieldPresence presence={singlePresence} />\n </Box>\n )}\n\n {isFirstAssisted && showOnboarding && <AssistOnboardingPopover dismiss={dismissOnboarding} />}\n </Flex>\n )\n\n return props.renderDefault({\n ...props,\n\n // When showing the onboarding, prevent default field actions from being rendered\n actions: isFirstAssisted && showOnboarding ? [] : props.actions,\n\n // Render presence (and possibly onboarding) in the internal slot (between presence and the field actions)\n // eslint-disable-next-line camelcase\n __internal_slot: actions,\n })\n}\n","import {Box, Button, Card, ErrorBoundary, Flex, Stack, Text} from '@sanity/ui'\nimport {type ErrorInfo, type PropsWithChildren, useCallback, useMemo, useState} from 'react'\nimport {type InputProps, isArraySchemaType, PatchEvent, unset} from 'sanity'\nimport {styled} from 'styled-components'\n\nimport {isPortableTextArray} from '../helpers/typeUtils'\n\nconst WrapPreCard = styled(Card)`\n & pre {\n white-space: pre-wrap !important;\n }\n`\n\nexport function SafeValueInput(props: InputProps) {\n return (\n <ErrorWrapper onChange={props.onChange}>\n <PteValueFixer {...props} />\n </ErrorWrapper>\n )\n}\n\nexport function ErrorWrapper(\n props: PropsWithChildren<{onChange: (patchEvent: PatchEvent) => void}>,\n) {\n const {onChange} = props\n const [error, setError] = useState<Error | undefined>()\n\n const catchError = useCallback((params: {error: Error; info: ErrorInfo}) => {\n setError(params.error)\n }, [])\n\n const unsetValue = useCallback(() => {\n onChange(PatchEvent.from(unset()))\n setError(undefined)\n }, [onChange])\n const dismiss = useCallback(() => setError(undefined), [])\n const catcher = <ErrorBoundary onCatch={catchError}>{props.children}</ErrorBoundary>\n\n return error ? (\n <Card border tone=\"critical\" padding={2} contentEditable={false}>\n <Stack space={3}>\n <Text muted weight=\"semibold\">\n An error occurred.\n </Text>\n\n <WrapPreCard flex={1} padding={2} tone=\"critical\" border>\n {catcher}\n </WrapPreCard>\n\n <Flex width=\"fill\" flex={1} gap={3}>\n <Box flex={1}>\n <Button text=\"Dismiss\" onClick={dismiss} tone=\"primary\" />\n </Box>\n <Button text=\"Unset value\" onClick={unsetValue} tone=\"critical\" />\n </Flex>\n </Stack>\n </Card>\n ) : (\n catcher\n )\n}\n\nfunction PteValueFixer(props: InputProps) {\n const isPortableText = useMemo(\n () => isArraySchemaType(props.schemaType) && isPortableTextArray(props.schemaType),\n [props.schemaType],\n )\n const value = props.value\n if (isPortableText && value && !(value as any[]).length) {\n return props.renderDefault({...props, value: undefined})\n }\n\n return props.renderDefault(props)\n}\n","import {Box, Flex} from '@sanity/ui'\nimport {useCallback} from 'react'\nimport {BlockProps, PatchEvent, useFormCallbacks} from 'sanity'\n\nimport {ErrorWrapper} from '../components/SafeValueInput'\nimport {AiFieldPresence} from '../presence/AiFieldPresence'\nimport {useAssistPresence} from '../presence/useAssistPresence'\n\nexport function AssistFormBlock(props: BlockProps) {\n const presence = useAssistPresence(props.path, true)\n const {onChange} = useFormCallbacks()\n const key = props.value._key\n const localOnChange = useCallback(\n (patchEvent: PatchEvent) => {\n if (!key) {\n return\n }\n onChange(PatchEvent.from(patchEvent).prefixAll({_key: key}))\n },\n [onChange, key],\n )\n const singlePresence = presence[0]\n return (\n <ErrorWrapper onChange={localOnChange}>\n <Flex align=\"center\" justify=\"space-between\">\n <Box flex={1}>{props.renderDefault(props)}</Box>\n {singlePresence && <AiFieldPresence presence={singlePresence} />}\n </Flex>\n </ErrorWrapper>\n )\n}\n","import {createContext} from 'react'\nimport {BlockProps} from 'sanity'\n\n// workaround for preview value sometimes lagging behind\nexport const InlineBlockValueContext = createContext<unknown>(undefined)\n\nexport function AssistInlineFormBlock(props: BlockProps) {\n return (\n <InlineBlockValueContext.Provider value={props.value}>\n <>{props.renderDefault(props)}</>\n </InlineBlockValueContext.Provider>\n )\n}\n","import {Box, Flex} from '@sanity/ui'\nimport {ItemProps} from 'sanity'\n\nimport {AiFieldPresence} from '../presence/AiFieldPresence'\nimport {useAssistPresence} from '../presence/useAssistPresence'\n\nexport function AssistItem(props: ItemProps) {\n const {path} = props\n const presence = useAssistPresence(path, true)\n\n return (\n <Flex align=\"center\" width=\"fill\" style={{position: 'relative'}}>\n <Box flex={1}>{props.renderDefault({...props})}</Box>\n {presence.map((pre) => (\n <Box key={pre.user.id} style={{position: 'absolute', right: 35}}>\n <AiFieldPresence presence={pre} />\n </Box>\n ))}\n </Flex>\n )\n}\n","import {Box, type BoxProps, Flex, focusFirstDescendant, Spinner, Text} from '@sanity/ui'\nimport type React from 'react'\nimport {type HTMLProps, useEffect, useMemo, useRef} from 'react'\nimport {tap} from 'rxjs/operators'\nimport {\n createPatchChannel,\n type DocumentMutationEvent,\n type DocumentRebaseEvent,\n FormBuilder,\n fromMutationPatches,\n type PatchMsg,\n useDocumentPresence,\n useDocumentStore,\n} from 'sanity'\nimport {useDocumentPane} from 'sanity/structure'\n\nimport {assistFormId} from './constants'\n\nconst preventDefault = (ev: React.FormEvent) => ev.preventDefault()\n\nexport function DocumentForm(\n props: Omit<BoxProps, 'as'> & Omit<HTMLProps<HTMLDivElement>, 'as' | 'onSubmit' | 'ref'>,\n) {\n const {\n collapsedFieldSets,\n collapsedPaths,\n displayed: value,\n documentId,\n documentType,\n editState,\n formState,\n onBlur,\n onChange,\n onFocus,\n onPathOpen,\n onSetActiveFieldGroup,\n onSetCollapsedFieldSet,\n onSetCollapsedPath,\n ready,\n validation,\n } = useDocumentPane()\n\n const documentStore = useDocumentStore()\n const presence = useDocumentPresence(documentId)\n\n // The `patchChannel` is an INTERNAL publish/subscribe channel that we use to notify form-builder\n // nodes about both remote and local patches.\n // - Used by the Portable Text input to modify selections.\n // - Used by `withDocument` to reset value.\n const patchChannel = useMemo(() => createPatchChannel(), [])\n\n const isLocked = editState?.transactionSyncLock?.enabled\n\n useEffect(() => {\n const sub = documentStore.pair\n .documentEvents(documentId, documentType)\n .pipe(\n tap((event) => {\n if (event.type === 'mutation') {\n patchChannel.publish(prepareMutationEvent(event))\n }\n\n if (event.type === 'rebase') {\n patchChannel.publish(prepareRebaseEvent(event))\n }\n }),\n )\n .subscribe()\n\n return () => {\n sub.unsubscribe()\n }\n }, [documentId, documentStore, documentType, patchChannel])\n\n const hasRev = Boolean(value?._rev)\n useEffect(() => {\n if (hasRev) {\n // this is a workaround for an issue that caused the document pushed to withDocument to get\n // stuck at the first initial value.\n // This effect is triggered only when the document goes from not having a revision, to getting one\n // so it will kick in as soon as the document is received from the backend\n patchChannel.publish({\n type: 'mutation',\n patches: [],\n snapshot: value,\n })\n }\n // React to changes in hasRev only\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [hasRev])\n\n const formRef = useRef<null | HTMLDivElement>(null)\n\n useEffect(() => {\n focusFirstDescendant(formRef.current!)\n }, [])\n\n if (isLocked) {\n return (\n <Box as=\"form\" {...props} ref={formRef}>\n <Flex\n align=\"center\"\n direction=\"column\"\n height=\"fill\"\n justify=\"center\"\n padding={3}\n sizing=\"border\"\n >\n <Text size={1}>\n Please hold tight while the document is synced. This usually happens right after the\n document has been published, and it shouldn’t take more than a few seconds\n </Text>\n </Flex>\n </Box>\n )\n }\n\n return (\n <Box as=\"form\" {...props} onSubmit={preventDefault} ref={formRef}>\n {ready ? (\n formState === null ? (\n <Flex\n align=\"center\"\n direction=\"column\"\n height=\"fill\"\n justify=\"center\"\n padding={3}\n sizing=\"border\"\n >\n <Text size={1}>This form is hidden</Text>\n </Flex>\n ) : (\n <FormBuilder\n __internal_patchChannel={patchChannel}\n collapsedFieldSets={collapsedFieldSets}\n collapsedPaths={collapsedPaths}\n focusPath={formState.focusPath}\n changed={formState.changed}\n focused={formState.focused}\n groups={formState.groups}\n id={assistFormId}\n members={formState.members}\n onChange={onChange}\n onFieldGroupSelect={onSetActiveFieldGroup}\n onPathBlur={onBlur}\n onPathFocus={onFocus}\n onPathOpen={onPathOpen}\n onSetFieldSetCollapsed={onSetCollapsedFieldSet}\n onSetPathCollapsed={onSetCollapsedPath}\n presence={presence}\n readOnly={formState.readOnly}\n schemaType={formState.schemaType}\n validation={validation}\n value={formState.value as any}\n />\n )\n ) : (\n <Flex\n align=\"center\"\n direction=\"column\"\n height=\"fill\"\n justify=\"center\"\n padding={3}\n sizing=\"border\"\n >\n <Spinner muted />\n\n <Box marginTop={3}>\n <Text align=\"center\" muted size={1}>\n Loading document\n </Text>\n </Box>\n </Flex>\n )}\n </Box>\n )\n}\n\nfunction prepareMutationEvent(event: DocumentMutationEvent): PatchMsg {\n const patches = event.mutations.map((mut) => mut.patch).filter(Boolean)\n\n return {\n type: 'mutation',\n snapshot: event.document,\n patches: fromMutationPatches(event.origin, patches),\n }\n}\n\nfunction prepareRebaseEvent(event: DocumentRebaseEvent): PatchMsg {\n const remotePatches = event.remoteMutations.map((mut) => mut.patch).filter(Boolean)\n const localPatches = event.localMutations.map((mut) => mut.patch).filter(Boolean)\n\n return {\n type: 'rebase',\n snapshot: event.document,\n patches: fromMutationPatches('remote', remotePatches).concat(\n fromMutationPatches('local', localPatches),\n ),\n }\n}\n","import {createContext} from 'react'\n\nexport interface AssistTypeContextValue {\n typePath?: string\n documentType?: string\n}\nexport const AssistTypeContext = createContext<AssistTypeContextValue>({})\n","/* eslint-disable max-depth */\nimport {\n type ArrayOfObjectsFormNode,\n type ArrayOfObjectsItemMember,\n type ArrayOfPrimitivesFormNode,\n type DocumentFormNode,\n type FieldsetState,\n isObjectSchemaType,\n type ObjectFormNode,\n type Path,\n pathToString,\n type SchemaType,\n} from 'sanity'\n\nconst DEFAULT_MAX_DEPTH = 8\nconst ABSOLUTE_MAX_DEPTH = 50\n\nexport interface ConditionalMemberState {\n path: string\n hidden: boolean\n readOnly: boolean\n}\n\ninterface ConditionalMemberInnerState extends ConditionalMemberState {\n conditional: boolean\n}\n\n/**\n * This is used to statically determine the state of the functions on the server-side.\n * Paths which has a schema with conditional config should be considered hidden: true and/or readOnly: true\n * Only conditional paths are included, as static props can be determined from schema.\n *\n * Returns paths that has conditional hidden or readOnly schema config (function) and that.\n * Form-state does not contain hidden members.\n *\n * Note:\n * * If a parent path is hidden, no child paths are included\n * * If a parent path is readOnly, no child paths are included\n * * If a path is hidden, it is not included; only conditionally visible paths will be returned, with hidden: false\n */\nexport function getConditionalMembers(\n docState: DocumentFormNode,\n maxDepth = DEFAULT_MAX_DEPTH,\n): ConditionalMemberState[] {\n const doc: ConditionalMemberInnerState = {\n path: '',\n hidden: false,\n readOnly: !!docState.readOnly,\n conditional: isConditional(docState.schemaType),\n }\n return (\n [doc, ...extractConditionalPaths(docState, Math.min(maxDepth, ABSOLUTE_MAX_DEPTH))]\n .filter((v) => v.conditional)\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n .map(({conditional, ...state}) => ({...state}))\n )\n}\n\nfunction isConditional(schemaType: SchemaType) {\n return typeof schemaType.hidden === 'function' || typeof schemaType.readOnly === 'function'\n}\n\nfunction conditionalState(memberState: {\n path: Path\n schemaType: SchemaType\n readOnly?: boolean\n}): ConditionalMemberInnerState {\n return {\n path: pathToString(memberState.path),\n readOnly: !!memberState.readOnly,\n hidden: false, // if its in members, its not hidden\n conditional: isConditional(memberState.schemaType),\n }\n}\n\nfunction extractConditionalPaths(\n node: ObjectFormNode | FieldsetState,\n maxDepth: number,\n): ConditionalMemberInnerState[] {\n if (node.path.length >= maxDepth) {\n return []\n }\n\n return node.members.reduce<ConditionalMemberInnerState[]>((acc, member) => {\n if (member.kind === 'error') {\n return acc\n }\n if (member.kind === 'field') {\n const schemaType = member.field.schemaType\n if (schemaType.jsonType === 'object') {\n const innerFields = member.field.readOnly\n ? []\n : extractConditionalPaths(member.field as ObjectFormNode, maxDepth)\n return [...acc, conditionalState(member.field), ...innerFields]\n } else if (schemaType.jsonType === 'array') {\n const array = member.field as ArrayOfObjectsFormNode | ArrayOfPrimitivesFormNode\n\n let arrayPaths: ConditionalMemberInnerState[] = []\n const isObjectsArray = array.members.some(\n (m) => m.kind === 'item' && isObjectSchemaType(m.item.schemaType),\n )\n if (!array.readOnly) {\n for (const arrayMember of array.members) {\n if (arrayMember.kind === 'error') {\n continue\n }\n\n const innerFields =\n isObjectsArray && !arrayMember.item.readOnly\n ? extractConditionalPaths((arrayMember as ArrayOfObjectsItemMember).item, maxDepth)\n : []\n\n arrayPaths = [...arrayPaths, conditionalState(arrayMember.item), ...innerFields]\n }\n }\n return [...acc, conditionalState(array), ...arrayPaths]\n }\n\n return [...acc, conditionalState(member.field)]\n } else if (member.kind === 'fieldSet') {\n const conditionalFieldset = !!(node as ObjectFormNode).schemaType?.fieldsets?.some(\n (f) => !f.single && f.name === member.fieldSet.name && typeof f.hidden === 'function',\n )\n const innerFields = extractConditionalPaths(member.fieldSet, maxDepth).map((f) => ({\n ...f,\n // if fieldset is conditional, visible fields must also be considered conditional\n conditional: conditionalFieldset ?? f.conditional,\n }))\n return [...acc, ...innerFields]\n }\n\n return acc\n }, [])\n}\n","import {SparklesIcon} from '@sanity/icons'\nimport {Box, Button, Container, Flex, Stack, Text} from '@sanity/ui'\nimport {styled} from 'styled-components'\n\nimport {releaseAnnouncementUrl} from '../constants'\n\nconst SparklesIllustration = styled(SparklesIcon)({\n fontSize: '3.125em',\n '& path': {\n strokeWidth: `0.6px !important`,\n },\n})\n\nexport function InspectorOnboarding(props: {onDismiss: () => void}) {\n const {onDismiss} = props\n return (\n <Box padding={4}>\n <Container width={0}>\n <Stack space={4}>\n <div style={{textAlign: 'center'}}>\n <SparklesIllustration />\n </div>\n <Text align=\"center\" size={1}>\n Create reusable AI instructions that can be applied across all documents of a certain\n type.\n </Text>\n\n <Flex align=\"center\" gap={2} justify=\"center\">\n <Button\n as=\"a\"\n href={releaseAnnouncementUrl}\n rel=\"noreferrer\"\n target=\"_blank\"\n fontSize={1}\n mode=\"default\"\n onClick={onDismiss}\n padding={2}\n text=\"Learn more\"\n tone=\"primary\"\n />\n <Button fontSize={1} mode=\"bleed\" onClick={onDismiss} padding={2} text=\"Dismiss\" />\n </Flex>\n </Stack>\n </Container>\n </Box>\n )\n}\n","import {SearchIcon} from '@sanity/icons'\nimport {Autocomplete, Box, Breadcrumbs, Card, Flex, Text} from '@sanity/ui'\nimport {createElement, useCallback, useMemo} from 'react'\nimport {ObjectSchemaType} from 'sanity'\n\nimport {isType} from '../helpers/typeUtils'\nimport {FieldRef, getFieldRefs, getFieldRefsWithDocument} from './helpers'\n\ninterface FieldSelectorProps {\n id: string\n schemaType: ObjectSchemaType\n fieldPath?: string\n onSelect: (path: string) => void\n includeDocument?: boolean\n filter?: (field: FieldRef) => boolean\n}\n\nexport function FieldAutocomplete(props: FieldSelectorProps) {\n const {id, schemaType, fieldPath, onSelect, includeDocument, filter} = props\n\n const fieldRefs = useMemo(() => {\n if (includeDocument) {\n return getFieldRefsWithDocument(schemaType)\n }\n return getFieldRefs(schemaType)\n }, [schemaType, includeDocument])\n const currentField = useMemo(\n () => fieldRefs.find((f) => f.key === fieldPath),\n [fieldPath, fieldRefs],\n )\n\n const autocompleteOptions = useMemo(\n () =>\n fieldRefs\n .filter((field) => (filter ? filter(field) : true))\n .filter((f) => !isType(f.schemaType, 'reference'))\n .map((field) => ({value: field.key, field})),\n [fieldRefs, filter],\n )\n\n const renderOption = useCallback((option: {value: string; field: FieldRef}) => {\n const {value, field} = option\n\n if (!value) {\n return (\n <Card as=\"button\" padding={3} radius={1}>\n <Text accent size={1}>\n {option.value}\n </Text>\n </Card>\n )\n }\n\n if (isType(field.schemaType, 'document')) {\n return (\n <Card as=\"button\" padding={3} radius={1}>\n <Text size={1} weight=\"semibold\">\n The entire document\n </Text>\n </Card>\n )\n }\n\n return (\n <Card as=\"button\" padding={3} radius={1}>\n <Flex gap={3}>\n <Text size={1}>{createElement(field.icon)}</Text>\n\n <FieldTitle field={field} />\n </Flex>\n </Card>\n )\n }, [])\n\n const renderValue = useCallback((value: string, option?: {value: string; field: FieldRef}) => {\n return option?.field.title ?? value\n }, [])\n\n const filterOption = useCallback((query: string, option: {value: string; field: FieldRef}) => {\n const lQuery = query.toLowerCase()\n return (\n option?.value?.toLowerCase().includes(lQuery) ||\n option?.field?.title?.toLowerCase().includes(lQuery)\n )\n }, [])\n\n return (\n <Autocomplete\n fontSize={1}\n icon={currentField ? currentField.icon : SearchIcon}\n onChange={onSelect}\n openButton\n id={id}\n options={autocompleteOptions}\n placeholder=\"Search for a field\"\n radius={2}\n renderOption={renderOption}\n renderValue={renderValue}\n value={currentField?.key}\n filterOption={filterOption}\n />\n )\n}\n\nexport function FieldTitle(props: {field: FieldRef}) {\n const splitTitle = props.field.title.split('/')\n return (\n <Box flex=\"none\">\n <Breadcrumbs\n style={{\n display: 'flex',\n flexWrap: 'wrap',\n alignItems: 'center',\n marginTop: '-4px',\n }}\n separator={\n <Box marginTop={1}>\n <Text muted size={1}>\n /\n </Text>\n </Box>\n }\n space={1}\n >\n {splitTitle.slice(0, splitTitle.length - 1).map((pt, i) => (\n // eslint-disable-next-line react/no-array-index-key\n <Box key={i} marginTop={1}>\n <Text muted size={1}>\n {pt.trim()}\n </Text>\n </Box>\n ))}\n <Box marginTop={1}>\n <Text size={1} weight=\"medium\">\n {splitTitle[splitTitle.length - 1]}\n </Text>\n </Box>\n </Breadcrumbs>\n </Box>\n )\n}\n","import {formatDistanceToNow} from 'date-fns'\nimport {useEffect, useReducer} from 'react'\n\nfunction useInterval(ms: number) {\n const [tick, update] = useReducer((n) => n + 1, 0)\n\n useEffect(() => {\n const i = setInterval(update, ms)\n return () => clearInterval(i)\n }, [ms])\n return tick\n}\n\nexport function TimeAgo({date}: {date?: string}) {\n useInterval(1000)\n const timeSince = formatDistanceToNow(date ? new Date(date) : new Date())\n return <span title={timeSince}>{timeSince} ago</span>\n}\n","import {\n CheckmarkCircleIcon,\n ClockIcon,\n CloseCircleIcon,\n ErrorOutlineIcon,\n SyncIcon,\n} from '@sanity/icons'\nimport {\n Box,\n Button,\n Card,\n Flex,\n Popover,\n Spinner,\n Stack,\n Text,\n useClickOutside,\n useGlobalKeyDown,\n useLayer,\n} from '@sanity/ui'\nimport {createElement, type ForwardedRef, forwardRef, useCallback, useMemo, useState} from 'react'\nimport {StatusButton, type StatusButtonProps, typed, useClient} from 'sanity'\nimport {keyframes, styled} from 'styled-components'\n\nimport {TimeAgo} from '../components/TimeAgo'\nimport {maxHistoryVisibilityMs, pluginTitle} from '../constants'\nimport {assistTasksStatusId} from '../helpers/ids'\nimport {getInstructionTitle} from '../helpers/misc'\nimport type {AssistTasksStatus, InstructionTask, StudioInstruction, TaskEndedReason} from '../types'\n\nexport interface InstructionTaskHistoryButtonProps {\n documentId?: string\n tasks: InstructionTask[] | undefined\n instructions: StudioInstruction[] | undefined\n showTitles: boolean\n}\n\ninterface CancelableInstructionTask extends InstructionTask {\n cancel: () => void\n title?: string\n}\n\nconst rotate = keyframes`\n 0% {\n transform: rotate(0);\n }\n 100% {\n transform: rotate(360deg);\n }\n`\n\nconst SyncSpinningIcon = styled(SyncIcon)`\n animation: ${rotate} 1s linear infinite;\n`\n\nconst TASK_CONFIG = {\n aborted: {\n title: 'Canceled',\n icon: CloseCircleIcon,\n tone: 'transparent',\n },\n error: {\n title: 'Error',\n icon: ErrorOutlineIcon,\n tone: 'critical',\n },\n success: {\n title: 'Completed',\n icon: CheckmarkCircleIcon,\n tone: 'positive',\n },\n timeout: {\n title: 'Timeout',\n icon: ClockIcon,\n tone: 'caution',\n },\n} as const\n\nexport function InstructionTaskHistoryButton(props: InstructionTaskHistoryButtonProps) {\n const {tasks, instructions, documentId, showTitles} = props\n\n const client = useClient({apiVersion: '2023-01-01'})\n const cancelRun = useCallback(\n (taskKey: string) => {\n if (!documentId) {\n return\n }\n const statusDocId = assistTasksStatusId(documentId)\n const basePath = `${typed<keyof AssistTasksStatus>('tasks')}[_key==\"${taskKey}\"]`\n client\n .patch(statusDocId)\n .set({\n [`${basePath}.${typed<keyof InstructionTask>('ended')}`]: new Date().toISOString(),\n [`${basePath}.${typed<keyof InstructionTask>('reason')}`]:\n typed<TaskEndedReason>('aborted'),\n })\n .commit()\n .catch(console.error)\n },\n [client, documentId],\n )\n\n const titledTasks = useMemo(() => {\n const t =\n tasks\n ?.filter(\n (task) =>\n task.started &&\n new Date().getTime() - new Date(task.started).getTime() < maxHistoryVisibilityMs,\n )\n .map((task): CancelableInstructionTask => {\n const instruction = instructions?.find((i) => i._key === task.instructionKey)\n return {\n ...task,\n title: showTitles ? (task.title ?? getInstructionTitle(instruction)) : undefined,\n cancel: () => cancelRun(task._key),\n }\n }) ?? []\n t.sort((a, b) => new Date(b.started ?? '').getTime() - new Date(a.started ?? '').getTime())\n return t\n }, [tasks, instructions, cancelRun, showTitles])\n\n // const id = useId()\n\n const isRunning = useMemo(() => titledTasks.some((r) => !r.ended), [titledTasks])\n const hasErrors = useMemo(\n () => titledTasks.some((r) => r.reason === 'error' || r.reason === 'timeout'),\n [titledTasks],\n )\n\n const [open, setOpen] = useState(false)\n\n const toggleOpen = useCallback(() => setOpen((v) => !v), [])\n\n const [button, setButton] = useState<HTMLButtonElement | null>(null)\n const [popover, setPopover] = useState<HTMLDivElement | null>(null)\n\n const handleClickOutside = useCallback(() => {\n setOpen(false)\n }, [])\n\n useClickOutside(handleClickOutside, [button, popover])\n\n const handleEscape = useCallback(() => {\n setOpen(false)\n button?.focus()\n }, [button])\n\n return (\n <Popover\n constrainSize\n content={<TaskList onEscape={handleEscape} tasks={titledTasks} />}\n open={open && !!titledTasks?.length}\n placement=\"top\"\n portal\n ref={setPopover}\n width={0}\n >\n <TaskStatusButton\n disabled={!titledTasks?.length}\n hasErrors={hasErrors}\n isRunning={isRunning}\n onClick={toggleOpen}\n ref={setButton}\n selected={open}\n />\n </Popover>\n )\n}\n\nconst TASK_STATUS_BUTTON_TOOLTIP_PROPS: StatusButtonProps['tooltipProps'] = {\n placement: 'top',\n}\n\nconst TaskStatusButton = forwardRef(function TaskStatusButton(\n props: {\n disabled: boolean\n hasErrors: boolean\n isRunning: boolean\n onClick: () => void\n selected: boolean\n },\n ref: ForwardedRef<HTMLButtonElement>,\n) {\n const {disabled, hasErrors, isRunning, onClick, selected} = props\n\n return (\n <StatusButton\n label={`${pluginTitle} status`}\n aria-label={`${pluginTitle} status`}\n icon={isRunning ? SyncSpinningIcon : hasErrors ? ErrorOutlineIcon : CheckmarkCircleIcon}\n mode=\"bleed\"\n onClick={onClick}\n tone={hasErrors ? 'critical' : undefined}\n disabled={disabled}\n ref={ref}\n selected={selected}\n tooltipProps={TASK_STATUS_BUTTON_TOOLTIP_PROPS}\n />\n )\n})\n\nfunction TaskList(props: {onEscape: () => void; tasks: CancelableInstructionTask[]}) {\n const {onEscape, tasks} = props\n\n const {isTopLayer} = useLayer()\n\n useGlobalKeyDown(\n useCallback(\n (event) => {\n if (isTopLayer && event.key === 'Escape') {\n onEscape()\n }\n },\n [isTopLayer, onEscape],\n ),\n )\n\n return (\n <Stack padding={1} space={1}>\n {tasks.map((task) => (\n <TaskItem key={task._key} task={task} />\n ))}\n </Stack>\n )\n}\n\nfunction TaskItem(props: {task: CancelableInstructionTask}) {\n const {task} = props\n\n const taskType = task.reason && TASK_CONFIG[task.reason]\n return (\n <Card radius={2} tone={taskType && taskType?.tone}>\n <Flex align=\"center\" gap={1}>\n <Flex align=\"flex-start\" flex={1} gap={3} padding={3}>\n <Box flex=\"none\">\n <Text size={1}>\n {taskType && createElement(taskType.icon)}\n {!task.reason && <Spinner />}\n </Text>\n </Box>\n <Stack flex={1} space={2}>\n <Text size={1} weight=\"medium\">\n {taskType ? taskType.title : 'Running'}\n {task.title && <>: {task.title}</>}\n </Text>\n {task.message ? <Text size={1}>{task.message}</Text> : null}\n <Text muted size={1}>\n <TimeAgo date={task.ended ?? task.started} />\n </Text>\n </Stack>\n </Flex>\n\n {!task.ended && (\n <Box flex=\"none\" padding={1}>\n <Button fontSize={1} mode=\"bleed\" onClick={task.cancel} text=\"Cancel\" />\n </Box>\n )}\n </Flex>\n </Card>\n )\n}\n","import {ArrowRightIcon, CloseIcon, PlayIcon, RetryIcon} from '@sanity/icons'\nimport {Box, Button, Card, Flex, Spinner, Stack, Text} from '@sanity/ui'\nimport {useCallback, useMemo, useRef} from 'react'\nimport {\n type DocumentInspectorProps,\n PresenceOverlay,\n VirtualizerScrollInstanceProvider,\n} from 'sanity'\nimport {\n DocumentInspectorHeader,\n type DocumentPaneNode,\n DocumentPaneProvider,\n useDocumentPane,\n} from 'sanity/structure'\nimport {styled} from 'styled-components'\n\nimport {DocumentForm} from '../_lib/form'\nimport {useAssistDocumentContext} from '../assistDocument/AssistDocumentContext'\nimport {AssistTypeContext} from '../assistDocument/components/AssistTypeContext'\nimport {useStudioAssistDocument} from '../assistDocument/hooks/useStudioAssistDocument'\nimport {useRequestRunInstruction} from '../assistDocument/RequestRunInstructionProvider'\nimport {useAiAssistanceConfig} from '../assistLayout/AiAssistanceConfigContext'\nimport {giveFeedbackUrl, pluginTitle, releaseAnnouncementUrl, salesUrl} from '../constants'\nimport {getConditionalMembers} from '../helpers/conditionalMembers'\nimport {assistDocumentId} from '../helpers/ids'\nimport {InspectorOnboarding} from '../onboarding/InspectorOnboarding'\nimport {inspectorOnboardingKey, useOnboardingFeature} from '../onboarding/onboardingStore'\nimport {assistDocumentTypeName, fieldPathParam, instructionParam} from '../types'\nimport {FieldTitle} from './FieldAutocomplete'\nimport {\n type FieldRef,\n getFieldTitle,\n useAiPaneRouter,\n useSelectedField,\n useTypePath,\n} from './helpers'\nimport {InstructionTaskHistoryButton} from './InstructionTaskHistoryButton'\n\nconst CardWithShadowBelow = styled(Card)`\n position: relative;\n\n &:after {\n content: '';\n display: block;\n position: absolute;\n left: 0;\n right: 0;\n bottom: -1px;\n border-bottom: 1px solid var(--card-border-color);\n opacity: 0.5;\n z-index: 100;\n }\n`\n\nconst CardWithShadowAbove = styled(Card)`\n position: relative;\n\n &:after {\n content: '';\n display: block;\n position: absolute;\n left: 0;\n right: 0;\n top: -1px;\n border-top: 1px solid var(--card-border-color);\n opacity: 0.5;\n z-index: 100;\n }\n`\n\nexport function AssistInspectorWrapper(props: DocumentInspectorProps) {\n const context = useAiAssistanceConfig()\n\n if (context.statusLoading) {\n return (\n <Flex align=\"center\" height=\"fill\" justify=\"center\" padding={4} sizing=\"border\">\n <Stack space={3} style={{textAlign: 'center'}}>\n <Spinner muted />\n <Text muted size={1}>\n Loading {pluginTitle}...\n </Text>\n </Stack>\n </Flex>\n )\n }\n\n const status = context.status\n\n if (!status?.enabled) {\n return (\n <Flex direction=\"column\" height=\"fill\">\n <DocumentInspectorHeader\n closeButtonLabel=\"Close\"\n onClose={props.onClose}\n title={pluginTitle}\n />\n\n <Stack flex={1} overflow=\"auto\" padding={4} space={3}>\n <Text as=\"p\" size={1} weight=\"semibold\">\n {pluginTitle} is not available\n </Text>\n\n <Text as=\"p\" muted size={1}>\n Please get in touch with a Sanity account manager or{' '}\n <a href={salesUrl} target=\"_blank\" rel=\"noreferrer\">\n contact our sales team\n </a>{' '}\n to get started with {pluginTitle}.{' '}\n <a href={releaseAnnouncementUrl} target=\"_blank\" rel=\"noreferrer\">\n Learn more &rarr;\n </a>\n </Text>\n </Stack>\n </Flex>\n )\n }\n\n if (!status?.initialized || !status.validToken) {\n return (\n <Flex direction=\"column\" height=\"fill\">\n <DocumentInspectorHeader\n closeButtonLabel=\"Close\"\n onClose={props.onClose}\n title={pluginTitle}\n />\n\n <Stack padding={4} space={3}>\n {context.error ? (\n <Text size={1} weight=\"semibold\">\n Failed to start {pluginTitle}\n </Text>\n ) : null}\n\n {!context.error && !status?.initialized ? (\n <Text size={1} weight=\"semibold\">\n {pluginTitle} is not enabled\n </Text>\n ) : null}\n\n {!context.error && status?.initialized && !status.validToken ? (\n <>\n <Text size={1} weight=\"semibold\">\n Invalid token\n </Text>\n <Text muted size={1}>\n The token used by the AI Assistant is not valid and has to be regenerated.\n </Text>\n </>\n ) : null}\n\n {context.error && (\n <Text muted size={1}>\n Something went wrong. See console for details.\n </Text>\n )}\n\n {!context.error && !status?.initialized && (\n <Text size={1} muted>\n Please enable {pluginTitle}.\n </Text>\n )}\n\n <Button\n fontSize={1}\n icon={\n context.initLoading ? (\n <Box marginTop={1}>\n <Spinner />\n </Box>\n ) : context.error ? (\n RetryIcon\n ) : undefined\n }\n text={\n context.error\n ? 'Retry'\n : status?.initialized && !status.validToken\n ? `Restore ${pluginTitle}`\n : `Enable ${pluginTitle} now`\n }\n tone=\"primary\"\n onClick={context.init}\n disabled={context.initLoading}\n />\n </Stack>\n </Flex>\n )\n }\n\n return <AssistInspector {...props} />\n}\n\nexport function AssistInspector(props: DocumentInspectorProps) {\n const {params} = useAiPaneRouter()\n\n const boundary = useRef<HTMLDivElement | null>(null)\n const pathKey = params?.[fieldPathParam]\n const instructionKey = params?.[instructionParam]\n const documentPane = useDocumentPane()\n const {\n documentId,\n documentType,\n value: docValue,\n schemaType,\n onChange: documentOnChange,\n formState,\n } = documentPane\n\n const {assistableDocumentId, documentIsAssistable} = useAssistDocumentContext()\n\n const formStateRef = useRef(formState)\n formStateRef.current = formState\n\n const {instructionLoading, requestRunInstruction} = useRequestRunInstruction({\n documentOnChange,\n isDocAssistable: documentIsAssistable,\n })\n\n const typePath = useTypePath(docValue, pathKey ?? '')\n const selectedField = useSelectedField(schemaType, typePath)\n\n const aiDocId = assistDocumentId(documentType)\n\n const assistDocument = useStudioAssistDocument({documentId, schemaType, initDoc: true})\n const assistField = assistDocument?.fields?.find((f) => f.path === typePath)\n const instruction = assistField?.instructions?.find((i) => i._key === instructionKey)\n const tasks = useMemo(\n () =>\n assistDocument?.tasks?.filter((i) => !instructionKey || i.instructionKey === instructionKey),\n [assistDocument?.tasks, instructionKey],\n )\n const instructions = useMemo(\n () => assistDocument?.fields?.flatMap((f) => f.instructions ?? []),\n [assistDocument?.fields],\n )\n\n const promptValue = instruction?.prompt\n const isEmptyPrompt = useMemo(() => {\n if (!promptValue?.length) {\n return true\n }\n const firstBlock = promptValue[0] as any\n const children = firstBlock?.children\n\n return promptValue.length == 1 && children?.length === 1 && !children?.[0]?.text?.length\n }, [promptValue])\n\n const paneNode: DocumentPaneNode = useMemo(\n () => ({\n type: 'document',\n id: aiDocId,\n title: pluginTitle,\n options: {\n id: aiDocId,\n type: assistDocumentTypeName,\n },\n }),\n [aiDocId],\n )\n\n const runCurrentInstruction = useCallback(\n () =>\n instruction &&\n pathKey &&\n typePath &&\n requestRunInstruction({\n documentId: assistableDocumentId,\n path: pathKey,\n typePath,\n assistDocumentId: assistDocumentId(documentType),\n instruction,\n conditionalMembers: formStateRef.current ? getConditionalMembers(formStateRef.current) : [],\n }),\n [pathKey, instruction, typePath, documentType, assistableDocumentId, requestRunInstruction],\n )\n\n const Region = useCallback((_props: any) => {\n // disabled for now\n /* return (\n <ConnectToRegion\n {..._props}\n _key={`${paneKey}_${selectedField?.key || '_field'}`}\n style={{height: '100%', flex: 1, overflow: 'auto'}}\n />\n )*/\n return <div {..._props} style={{height: '100%', flex: 1, overflow: 'auto'}} />\n }, [])\n\n const assistTypeContext = useMemo(() => ({typePath, documentType}), [typePath, documentType])\n\n if (!documentId || !schemaType || schemaType.jsonType !== 'object') {\n return (\n <Card flex={1} padding={4}>\n <Text>Document not ready yet.</Text>\n </Card>\n )\n }\n\n return (\n <Flex\n ref={boundary}\n direction=\"column\"\n height=\"fill\"\n overflow=\"hidden\"\n sizing=\"border\"\n style={{lineHeight: 0}}\n >\n <AiInspectorHeader\n onClose={props.onClose}\n field={selectedField}\n fieldTitle={getFieldTitle(selectedField)}\n />\n\n <Card as={Region} flex={1} overflow=\"auto\">\n <Flex direction=\"column\" style={{minHeight: '100%'}}>\n <Box flex={1}>\n <PresenceOverlay>\n <Box padding={4}>\n {selectedField && (\n <AssistTypeContext.Provider value={assistTypeContext}>\n <VirtualizerScrollInstanceProvider\n scrollElement={boundary.current}\n containerElement={boundary}\n >\n <DocumentPaneProvider\n paneKey={documentPane.paneKey}\n index={documentPane.index}\n itemId=\"ai\"\n pane={paneNode}\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n //@ts-ignore this is a valid option available in `corel` - Remove after corel is merged to next\n forcedVersion={{\n isReleaseLocked: false,\n selectedPerspectiveName: 'published',\n selectedReleaseId: undefined,\n }}\n >\n <DocumentForm />\n </DocumentPaneProvider>\n </VirtualizerScrollInstanceProvider>\n </AssistTypeContext.Provider>\n )}\n </Box>\n </PresenceOverlay>\n </Box>\n\n <Box flex=\"none\" padding={4}>\n <Text muted size={1}>\n How is Sanity AI Assist working for you?{' '}\n <a\n href={giveFeedbackUrl}\n target=\"_blank\"\n rel=\"noreferrer\"\n style={{whiteSpace: 'nowrap'}}\n >\n Let us know <ArrowRightIcon />\n </a>\n </Text>\n </Box>\n </Flex>\n </Card>\n <CardWithShadowAbove flex=\"none\" paddingX={4} paddingY={3} style={{justifySelf: 'flex-end'}}>\n <Flex gap={2} flex={1} justify=\"flex-end\">\n {schemaType?.name && pathKey && instructionKey && (\n <Stack flex={1}>\n <Button\n mode=\"ghost\"\n disabled={isEmptyPrompt || instructionLoading}\n fontSize={1}\n icon={instructionLoading ? <Spinner style={{marginTop: 3}} /> : PlayIcon}\n onClick={runCurrentInstruction}\n padding={3}\n text={'Run instruction'}\n />\n </Stack>\n )}\n\n <InstructionTaskHistoryButton\n documentId={assistableDocumentId}\n tasks={tasks}\n instructions={instructions}\n showTitles={!instructionKey}\n />\n </Flex>\n </CardWithShadowAbove>\n </Flex>\n )\n}\n\nfunction AiInspectorHeader(props: {fieldTitle: string; field?: FieldRef; onClose: () => void}) {\n const {onClose, field, fieldTitle} = props\n const {showOnboarding, dismissOnboarding} = useOnboardingFeature(inspectorOnboardingKey)\n\n return (\n <CardWithShadowBelow flex=\"none\" padding={2}>\n <Flex flex={1} align=\"center\">\n <Flex flex={1} padding={3} gap={2} align=\"center\">\n <Flex gap={1} align=\"center\" wrap=\"wrap\" style={{marginTop: '-4px'}}>\n <Box marginTop={1}>\n <Text size={1} weight=\"semibold\">\n AI instructions for\n </Text>\n </Box>\n <Card radius={2} border padding={1} marginTop={1}>\n {field ? (\n <FieldTitle field={field} />\n ) : (\n <Text size={1} weight=\"semibold\">\n {fieldTitle}\n </Text>\n )}\n </Card>\n </Flex>\n </Flex>\n <Box flex=\"none\">\n <Button fontSize={1} icon={CloseIcon} mode=\"bleed\" onClick={onClose} />\n </Box>\n </Flex>\n\n {showOnboarding && <InspectorOnboarding onDismiss={dismissOnboarding} />}\n </CardWithShadowBelow>\n )\n}\n","export const aiInspectorId = 'ai-assistance'\n","import {SparklesIcon} from '@sanity/icons'\nimport {DocumentInspector, typed} from 'sanity'\n\nimport {pluginTitle} from '../constants'\nimport {AssistInspectorRouteParams, fieldPathParam, instructionParam} from '../types'\nimport {AssistInspectorWrapper} from './AssistInspector'\nimport {aiInspectorId} from './constants'\n\nexport const assistInspector: DocumentInspector = {\n name: aiInspectorId,\n useMenuItem: () => ({\n icon: SparklesIcon,\n title: pluginTitle,\n hidden: true,\n showAsAction: false,\n }),\n component: AssistInspectorWrapper,\n onClose({params}) {\n return {\n params: typed<AssistInspectorRouteParams>({\n ...params,\n [fieldPathParam]: undefined,\n [instructionParam]: undefined,\n }) as typeof params,\n }\n },\n}\n","import {ConnectorOptions} from '../../_lib/connector'\n\nexport function arrowPath(options: ConnectorOptions, x: number, y: number, dir: 1 | -1): string {\n return [\n `M ${x - options.arrow.size} ${y - options.arrow.size * dir} `,\n `L ${x} ${y}`,\n `L ${x + options.arrow.size} ${y - options.arrow.size * dir}`,\n ].join('')\n}\n","import {ConnectorLine, ConnectorOptions} from '../../_lib/connector'\n\nexport function drawArrowPath(\n options: ConnectorOptions,\n x: number,\n y: number,\n dir: number,\n): string {\n return [\n `M ${x - options.arrow.size} ${y - options.arrow.size * dir} `,\n `L ${x} ${y}`,\n `L ${x + options.arrow.size} ${y - options.arrow.size * dir}`,\n ].join('')\n}\n\nfunction moveTo(x: number, y: number) {\n return `M${x} ${y}`\n}\n\nfunction lineTo(x: number, y: number) {\n return `L${x} ${y}`\n}\n\nfunction join(strings: string[], delim = '') {\n return strings.join(delim)\n}\n\nfunction quadCurve(x1: number, y1: number, x: number, y: number) {\n return `Q${x1} ${y1} ${x} ${y}`\n}\n\nexport function drawConnectorPath(options: ConnectorOptions, line: ConnectorLine): string {\n const {cornerRadius} = options.path\n const {from, to} = line\n const {x: fromX, y: fromY} = from\n const {x: _toX, y: toY} = to\n\n const toX = _toX - 1\n\n // Calculate divider position\n const dividerX = to.bounds.x + options.divider.offsetX\n\n // Calculate connector FROM path X position\n const fromPathX = from.isAbove || from.isBelow ? fromX + options.arrow.marginX : fromX\n\n // Calculate maximum corner radius\n const r0 = Math.min(cornerRadius, Math.abs(fromPathX - dividerX) / 2)\n const r1 = Math.min(cornerRadius, Math.abs(fromY - toY) / 2)\n\n const cmds: string[] = []\n\n // FROM\n if (from.isAbove) {\n cmds.push(\n moveTo(\n fromX + options.arrow.marginX,\n fromY - options.arrow.threshold + options.arrow.marginY,\n ),\n lineTo(fromX + options.arrow.marginX, fromY - r0),\n quadCurve(fromX + options.arrow.marginX, fromY, fromX + options.arrow.marginX + r0, fromY),\n )\n } else if (from.isBelow) {\n cmds.push(\n moveTo(\n fromX + options.arrow.marginX,\n fromY + options.arrow.threshold - options.arrow.marginY,\n ),\n lineTo(fromX + options.arrow.marginX, fromY + r0),\n quadCurve(fromX + options.arrow.marginX, fromY, fromX + options.arrow.marginX + r0, fromY),\n )\n } else {\n cmds.push(moveTo(fromX, fromY))\n }\n\n // TO\n if (to.isAbove) {\n if (fromY < to.bounds.y) {\n cmds.push(\n lineTo(dividerX - r1, fromY),\n quadCurve(dividerX, fromY, dividerX, fromY + r1),\n lineTo(dividerX, toY - r1),\n quadCurve(dividerX, toY, dividerX + r1, toY),\n lineTo(dividerX - cornerRadius, toY),\n quadCurve(dividerX, toY, dividerX, toY - cornerRadius),\n lineTo(dividerX, toY - options.arrow.threshold + options.arrow.marginY),\n )\n } else {\n cmds.push(\n lineTo(dividerX - cornerRadius, fromY),\n quadCurve(dividerX, fromY, dividerX, fromY - cornerRadius),\n lineTo(dividerX, toY - options.arrow.threshold + options.arrow.marginY),\n )\n }\n } else if (to.isBelow) {\n if (fromY > to.bounds.y + to.bounds.h) {\n // curl around\n cmds.push(\n lineTo(dividerX - options.arrow.marginX - r1, fromY),\n quadCurve(\n dividerX - options.arrow.marginX,\n fromY,\n dividerX - options.arrow.marginX,\n fromY - r1,\n ),\n lineTo(dividerX - options.arrow.marginX, toY + r1),\n quadCurve(\n dividerX - options.arrow.marginX,\n toY,\n dividerX - options.arrow.marginX + r1,\n toY,\n ),\n lineTo(dividerX - cornerRadius, toY),\n quadCurve(dividerX, toY, dividerX, toY + cornerRadius),\n lineTo(dividerX, toY + options.arrow.threshold - options.arrow.marginY),\n )\n } else {\n cmds.push(\n lineTo(dividerX - cornerRadius, fromY),\n quadCurve(dividerX, fromY, dividerX, fromY + cornerRadius),\n lineTo(dividerX, toY + options.arrow.threshold - options.arrow.marginY),\n )\n }\n } else if (fromY < toY) {\n cmds.push(\n lineTo(dividerX - r0, fromY),\n quadCurve(dividerX, fromY, dividerX, fromY + r1),\n lineTo(dividerX, toY - r1),\n quadCurve(dividerX, toY, dividerX + r1, toY),\n lineTo(toX, toY),\n )\n } else {\n cmds.push(\n lineTo(dividerX - Math.min(r0, r1), fromY),\n quadCurve(dividerX, fromY, dividerX, fromY - Math.min(r0, r1)),\n lineTo(dividerX, toY + r1),\n quadCurve(dividerX, toY, dividerX + r1, toY),\n lineTo(toX, toY),\n )\n }\n\n return join(cmds)\n}\n","import {rgba, useTheme} from '@sanity/ui'\nimport {useMemo} from 'react'\n\nimport {ConnectorOptions, mapConnectorToLine, Rect} from '../_lib/connector'\nimport {arrowPath} from './draw/arrowPath'\nimport {drawConnectorPath} from './draw/connectorPath'\n\nexport function ConnectorPath(props: {\n from: {bounds: Rect; element: Rect}\n to: {bounds: Rect; element: Rect}\n options: ConnectorOptions\n}) {\n const {from, options, to} = props\n const {strokeWidth} = options.path\n const theme = useTheme()\n\n const line = useMemo(() => mapConnectorToLine(options, {from, to}), [from, options, to])\n\n return (\n <>\n <path\n d={drawConnectorPath(options, line)}\n stroke={theme.sanity.color.base.bg}\n strokeWidth={strokeWidth + 4}\n />\n\n <path\n d={drawConnectorPath(options, line)}\n stroke={rgba(theme.sanity.color.base.border, 0.5)}\n strokeWidth={strokeWidth}\n />\n\n {line.from.isAbove && (\n <path\n d={arrowPath(\n options,\n line.from.x + options.arrow.marginX,\n line.from.bounds.y - options.arrow.threshold + options.arrow.marginY,\n -1,\n )}\n stroke={theme.sanity.color.base.border}\n strokeWidth={strokeWidth}\n />\n )}\n\n {line.from.isBelow && (\n <path\n d={arrowPath(\n options,\n line.from.x + options.arrow.marginX,\n line.from.bounds.y +\n line.from.bounds.h +\n options.arrow.threshold -\n options.arrow.marginY,\n 1,\n )}\n stroke={theme.sanity.color.base.border}\n strokeWidth={strokeWidth}\n />\n )}\n </>\n )\n}\n","import {Fragment, useEffect, useState} from 'react'\n\nimport {Connector, ConnectorOptions} from '../_lib/connector'\nimport {ConnectorPath} from './ConnectorPath'\n\nconst DEBUG = false\n\nconst options: ConnectorOptions = {\n arrow: {\n marginX: 10.5,\n marginY: 5,\n size: 4,\n threshold: 16.5,\n },\n divider: {\n offsetX: -10.5,\n },\n path: {\n cornerRadius: 3,\n marginY: 10.5,\n strokeWidth: 1,\n },\n}\n\nexport function AssistConnectorsOverlay(props: {connectors: Connector[]}) {\n const {connectors} = props\n // const zIndexes = connectors.map((connector) => {\n // const zIndex = connector.from.payload?.zIndex\n\n // if (typeof zIndex === 'number') {\n // return zIndex\n // }\n\n // return 1\n // })\n const [, setRedraw] = useState(false)\n useEffect(() => {\n // hacky workaround to force redraw for connectors on initial render\n // this seem to improve initial measurements of elements\n setRedraw(true)\n }, [])\n\n // const zIndex = zIndexes.length ? Math.max(...zIndexes) : 1\n\n return (\n <>\n <svg\n fill=\"none\"\n width={window.innerWidth}\n height={window.innerHeight}\n style={{\n position: 'absolute',\n top: 0,\n left: 0,\n width: '100%',\n height: '100%',\n pointerEvents: 'none',\n zIndex: 150,\n // zIndex,\n }}\n >\n {connectors.map((connector) => (\n <ConnectorPath\n from={connector.from}\n key={connector.key}\n options={options}\n to={connector.to}\n />\n ))}\n </svg>\n {DEBUG &&\n connectors.map(({key, from, to}) => {\n return (\n <Fragment key={key}>\n <div\n style={{\n position: 'fixed',\n top: from.bounds.y,\n left: from.bounds.x,\n width: from.bounds.w,\n height: from.bounds.h,\n pointerEvents: 'none',\n overflow: 'hidden',\n outline: '1px dotted red',\n outlineOffset: -1,\n zIndex: 10000000 - 1,\n }}\n >\n <div\n style={{\n position: 'absolute',\n top: from.element.y - from.bounds.y,\n left: from.element.x - from.bounds.x,\n width: from.element.w,\n height: from.element.h,\n border: '1px solid red',\n boxSizing: 'border-box',\n }}\n />\n </div>\n\n <div\n style={{\n position: 'fixed',\n top: to.bounds.y,\n left: to.bounds.x,\n width: to.bounds.w,\n height: to.bounds.h,\n pointerEvents: 'none',\n overflow: 'hidden',\n outline: '1px dotted teal',\n outlineOffset: -1,\n zIndex: 10000000 - 1,\n }}\n >\n <div\n style={{\n position: 'absolute',\n top: to.element.y - to.bounds.y,\n left: to.element.x - to.bounds.x,\n width: to.element.w,\n height: to.element.h,\n border: '1px solid teal',\n boxSizing: 'border-box',\n }}\n />\n </div>\n </Fragment>\n )\n })}\n </>\n )\n}\n","import {packageName} from '../constants'\nimport {TranslateStyleguide, TranslateStyleguideContext} from '../translate/types'\n\nexport function validateStyleguide(styleguide: string | undefined) {\n if (styleguide && styleguide.length > 2000) {\n throw new Error(\n `[${packageName}]: \\`translate.styleguide\\` value is too long. It must be 2000 characters or less, but was ${styleguide.length} characters`,\n )\n }\n return styleguide\n}\n\nexport function createStyleGuideResolver(\n styleguide: TranslateStyleguide | undefined,\n context: TranslateStyleguideContext,\n) {\n return async () => {\n if (typeof styleguide !== 'function') {\n return styleguide\n }\n const styleguideResult = await styleguide(context)\n return validateStyleguide(styleguideResult)\n }\n}\n","import {get} from 'lodash'\nimport type {SanityDocumentLike} from 'sanity'\n\nexport const getLanguageParams = (\n select: Record<string, string> | undefined,\n document: SanityDocumentLike | undefined,\n): Record<string, unknown> => {\n if (!select || !document) {\n return {}\n }\n\n const selection: Record<string, string> = select || {}\n const selectedValue: Record<string, unknown> = {}\n for (const [key, path] of Object.entries(selection)) {\n let value = get(document, path)\n if (Array.isArray(value)) {\n // If there are references in the array, ensure they have `_ref` set, otherwise they are considered empty and can safely be ignored\n value = value.filter((item) =>\n typeof item === 'object' ? item?._type !== 'reference' || '_ref' in item : true,\n )\n }\n selectedValue[key] = value\n }\n\n return selectedValue\n}\n","export const toFieldLanguagesKeyPrefix = 'sanityStudio:assist:field-languages:from:'\n\nexport function getPreferredToFieldLanguages(fromLanguageId: string): string[] {\n if (typeof localStorage === 'undefined') {\n return []\n }\n\n const value = localStorage.getItem(`${toFieldLanguagesKeyPrefix}${fromLanguageId}`)\n return value ? (JSON.parse(value) as string[]) : []\n}\n\nexport function setPreferredToFieldLanguages(fromLanguageId: string, languageIds: string[]) {\n if (typeof localStorage === 'undefined') {\n return\n }\n\n localStorage.setItem(`${toFieldLanguagesKeyPrefix}${fromLanguageId}`, JSON.stringify(languageIds))\n}\n","import {extractWithPath} from '@sanity/mutator'\nimport {\n isDocumentSchemaType,\n isKeySegment,\n type ObjectSchemaType,\n type Path,\n pathToString,\n type SanityDocumentLike,\n} from 'sanity'\n\nimport type {DocumentMember, TranslationOutput, TranslationOutputsFunction} from './types'\n\nexport interface FieldLanguageMap {\n inputLanguageId: string\n inputPath: Path\n outputs: TranslationOutput[]\n}\n\nconst DEFAULT_MAX_DEPTH = 6\nconst ABSOLUTE_MAX_DEPTH = 50\n\nexport function getDocumentMembersFlat(\n doc: SanityDocumentLike,\n schemaType: ObjectSchemaType,\n maxDepth = DEFAULT_MAX_DEPTH,\n) {\n if (!isDocumentSchemaType(schemaType)) {\n console.error(`Schema type is not a document`)\n return []\n }\n\n return extractPaths(doc, schemaType, [], Math.min(maxDepth, ABSOLUTE_MAX_DEPTH))\n}\n\nfunction extractPaths(\n doc: SanityDocumentLike,\n schemaType: ObjectSchemaType,\n path: Path,\n maxDepth: number,\n): DocumentMember[] {\n if (path.length >= maxDepth) {\n return []\n }\n\n return schemaType.fields.reduce<DocumentMember[]>((acc, field) => {\n const fieldPath = [...path, field.name]\n const fieldSchema = field.type\n const {value} = extractWithPath(pathToString(fieldPath), doc)[0] ?? {}\n if (!value) {\n return acc\n }\n\n const thisFieldWithPath: DocumentMember = {\n path: fieldPath,\n name: field.name,\n schemaType: fieldSchema,\n value,\n }\n\n if (fieldSchema.jsonType === 'object') {\n const innerFields = extractPaths(doc, fieldSchema, fieldPath, maxDepth)\n\n return [...acc, thisFieldWithPath, ...innerFields]\n } else if (\n fieldSchema.jsonType === 'array' &&\n fieldSchema.of.length &&\n fieldSchema.of.some((item) => 'fields' in item) &&\n // no reason to drill into arrays if the item fields will be culled by maxDepth, ie we need 1 extra path headroom\n path.length + 1 < maxDepth\n ) {\n const {value: arrayValue} = extractWithPath(pathToString(fieldPath), doc)[0] ?? {}\n\n let arrayPaths: DocumentMember[] = []\n if ((arrayValue as any)?.length) {\n for (const item of arrayValue as any[]) {\n const itemPath = [...fieldPath, {_key: item._key}]\n let itemSchema = fieldSchema.of.find((t) => t.name === item._type)\n if (!item._type) {\n itemSchema = fieldSchema.of[0]\n console.warn(\n 'Array item is missing _type - using the first defined type in the array.of schema',\n {\n itemPath,\n item,\n itemSchema,\n },\n )\n }\n if (item._key && itemSchema) {\n const innerFields = extractPaths(\n doc,\n itemSchema as ObjectSchemaType,\n itemPath,\n maxDepth,\n )\n const arrayMember = {\n path: itemPath,\n name: item._key,\n schemaType: itemSchema,\n value: item,\n }\n arrayPaths = [...arrayPaths, arrayMember, ...innerFields]\n }\n }\n }\n\n return [...acc, thisFieldWithPath, ...arrayPaths]\n }\n\n return [...acc, thisFieldWithPath]\n }, [])\n}\n\n/**\n * Default implementation for plugin config `translate.field.translationOutputs`\n *\n * @see FieldTranslationConfig#translationOutputs\n */\nexport const defaultLanguageOutputs: TranslationOutputsFunction = function (\n member,\n enclosingType,\n translateFromLanguageId,\n translateToLanguageIds,\n) {\n if (\n member.schemaType.jsonType === 'object' &&\n member.schemaType.name.startsWith('internationalizedArray')\n ) {\n const pathEnd = member.path.slice(-1)\n\n const language = isKeySegment(pathEnd[0]) ? pathEnd[0]._key : null\n return language === translateFromLanguageId\n ? translateToLanguageIds.map((translateToId) => ({\n id: translateToId,\n outputPath: [...member.path.slice(0, -1), {_key: translateToId}],\n }))\n : undefined\n }\n\n if (enclosingType.jsonType === 'object' && enclosingType.name.startsWith('locale')) {\n return translateFromLanguageId === member.name\n ? translateToLanguageIds.map((translateToId) => ({\n id: translateToId,\n outputPath: [...member.path.slice(0, -1), translateToId],\n }))\n : undefined\n }\n\n return undefined\n}\n\nexport function getFieldLanguageMap(\n documentSchema: ObjectSchemaType,\n documentMembers: DocumentMember[],\n translateFromLanguageId: string,\n outputLanguageIds: string[],\n langFn: TranslationOutputsFunction,\n): FieldLanguageMap[] {\n const translationMaps: FieldLanguageMap[] = []\n for (const member of documentMembers) {\n const parentPath = member.path.slice(0, -1)\n const enclosingType =\n documentMembers.find((m) => pathToString(m.path) === pathToString(parentPath))?.schemaType ??\n documentSchema\n\n const translations = langFn(\n member,\n enclosingType,\n translateFromLanguageId,\n outputLanguageIds,\n )?.filter((translation) => translation.id !== translateFromLanguageId)\n\n if (translations) {\n translationMaps.push({\n inputLanguageId: translateFromLanguageId,\n inputPath: member.path,\n outputs: translations,\n })\n }\n }\n\n return translationMaps\n}\n","import {PlayIcon} from '@sanity/icons'\nimport {Box, Button, Checkbox, Dialog, Flex, Radio, Spinner, Stack, Text, Tooltip} from '@sanity/ui'\nimport {\n createContext,\n type PropsWithChildren,\n useCallback,\n useContext,\n useId,\n useMemo,\n useState,\n} from 'react'\nimport {\n type ObjectSchemaType,\n type Path,\n pathToString,\n type SanityDocumentLike,\n useClient,\n} from 'sanity'\n\nimport {useAiAssistanceConfig} from '../assistLayout/AiAssistanceConfigContext'\nimport type {ConditionalMemberState} from '../helpers/conditionalMembers'\nimport {createStyleGuideResolver} from '../helpers/styleguide'\nimport {API_VERSION_WITH_EXTENDED_TYPES, useApiClient, useTranslate} from '../useApiClient'\nimport {getLanguageParams} from './getLanguageParams'\nimport {getPreferredToFieldLanguages, setPreferredToFieldLanguages} from './languageStore'\nimport {\n defaultLanguageOutputs,\n type FieldLanguageMap,\n getDocumentMembersFlat,\n getFieldLanguageMap,\n} from './paths'\nimport type {Language} from './types'\n\ninterface FieldTranslationParams {\n document: SanityDocumentLike\n documentSchema: ObjectSchemaType\n translatePath: Path\n conditionalMembers: ConditionalMemberState[]\n}\n\nexport interface FieldTranslationContextValue {\n openFieldTranslation: (args: FieldTranslationParams) => void\n translationLoading: boolean\n}\n\nexport const FieldTranslationContext = createContext<FieldTranslationContextValue>({\n openFieldTranslation: () => {},\n translationLoading: false,\n})\n\nexport function useFieldTranslation() {\n return useContext(FieldTranslationContext)\n}\n\nfunction hasValuesToTranslate(\n fieldLanguageMaps: FieldLanguageMap[] | undefined,\n fromLanguage: Language | undefined,\n basePath: Path,\n) {\n return fieldLanguageMaps?.some(\n (map) =>\n map.inputLanguageId === fromLanguage?.id &&\n map.inputPath &&\n pathToString(map.inputPath).startsWith(pathToString(basePath)),\n )\n}\n\n// eslint-disable-next-line @typescript-eslint/ban-types\nexport function FieldTranslationProvider(props: PropsWithChildren<{}>) {\n const {config: assistConfig} = useAiAssistanceConfig()\n\n const apiClient = useApiClient(assistConfig.__customApiClient)\n const styleguide = assistConfig.translate?.styleguide\n const config = assistConfig.translate?.field\n const {translate: runTranslate} = useTranslate(apiClient)\n\n const [dialogOpen, setDialogOpen] = useState(false)\n\n const [fieldTranslationParams, setFieldTranslationParams] = useState<\n FieldTranslationParams | undefined\n >()\n const [languages, setLanguages] = useState<Language[] | undefined>()\n const [fromLanguage, setFromLanguage] = useState<Language | undefined>(undefined)\n const [toLanguages, setToLanguages] = useState<Language[] | undefined>(undefined)\n const [fieldLanguageMaps, setFieldLanguageMaps] = useState<FieldLanguageMap[] | undefined>()\n\n const close = useCallback(() => {\n setDialogOpen(false)\n setLanguages(undefined)\n setFieldTranslationParams(undefined)\n }, [])\n const languageClient = useClient({\n apiVersion: config?.apiVersion ?? API_VERSION_WITH_EXTENDED_TYPES,\n })\n const documentId = fieldTranslationParams?.document?._id\n const id = useId()\n\n const selectFromLanguage = useCallback(\n (\n from: Language,\n languages: Language[] | undefined,\n params: FieldTranslationParams | undefined,\n ) => {\n const {document, documentSchema} = params ?? {}\n setFromLanguage(from)\n if (!document || !documentSchema || !params || !languages) {\n setFieldLanguageMaps(undefined)\n return\n }\n\n const preferred = getPreferredToFieldLanguages(from.id)\n const allToLanguages = languages.filter((l) => l.id !== from?.id)\n const filteredToLanguages = allToLanguages.filter(\n (l) => !preferred.length || preferred.includes(l.id),\n )\n\n setToLanguages(filteredToLanguages)\n const fromId = from?.id\n const allToIds = allToLanguages?.map((l) => l.id) ?? []\n const docMembers = getDocumentMembersFlat(document, documentSchema, config?.maxPathDepth)\n if (fromId && allToIds?.length) {\n const transMap = getFieldLanguageMap(\n documentSchema,\n docMembers,\n fromId,\n allToIds.filter((toId) => fromId !== toId),\n config?.translationOutputs ?? defaultLanguageOutputs,\n )\n setFieldLanguageMaps(transMap)\n } else {\n setFieldLanguageMaps(undefined)\n }\n },\n [config],\n )\n\n const toggleToLanguage = useCallback(\n (\n toggledLang: Language,\n toLanguages: Language[] | undefined,\n languages: Language[] | undefined,\n ) => {\n if (!languages || !fromLanguage) {\n return\n }\n const wasSelected = !!toLanguages?.find((l) => l.id === toggledLang.id)\n const newToLangs = languages.filter(\n (anyLang) =>\n !!toLanguages?.find(\n (selectedLang) => toggledLang.id !== selectedLang.id && selectedLang.id === anyLang.id,\n ) ||\n (toggledLang.id === anyLang.id && !wasSelected),\n )\n setToLanguages(newToLangs)\n setPreferredToFieldLanguages(\n fromLanguage.id,\n newToLangs.map((l) => l.id),\n )\n },\n [fromLanguage],\n )\n\n const openFieldTranslation = useCallback(\n async (params: FieldTranslationParams) => {\n setDialogOpen(true)\n const languageParams = getLanguageParams(config?.selectLanguageParams, params.document)\n const languages: Language[] | undefined = await (typeof config?.languages === 'function'\n ? config?.languages(languageClient, languageParams)\n : Promise.resolve(config?.languages))\n setLanguages(languages)\n setFieldTranslationParams(params)\n const fromLanguage = languages?.[0]\n if (fromLanguage) {\n selectFromLanguage(fromLanguage, languages, params)\n } else {\n console.error('No languages available for selected language params', languageParams)\n }\n },\n [selectFromLanguage, config, languageClient],\n )\n\n const contextValue: FieldTranslationContextValue = useMemo(() => {\n return {\n openFieldTranslation,\n translationLoading: false,\n }\n }, [openFieldTranslation])\n\n const runDisabled =\n !fromLanguage ||\n !toLanguages?.length ||\n !fieldLanguageMaps?.length ||\n !documentId ||\n !hasValuesToTranslate(fieldLanguageMaps, fromLanguage, fieldTranslationParams.translatePath)\n\n const onRunTranslation = useCallback(() => {\n const translatePath = fieldTranslationParams?.translatePath\n if (fieldLanguageMaps && documentId && translatePath) {\n runTranslate({\n documentId,\n translatePath,\n styleguide: createStyleGuideResolver(styleguide, {\n client: languageClient,\n documentId,\n schemaType: fieldTranslationParams?.documentSchema,\n translatePath,\n }),\n fieldLanguageMap: fieldLanguageMaps.map((map) => ({\n ...map,\n // eslint-disable-next-line max-nested-callbacks\n outputs: map.outputs.filter((out) => !!toLanguages?.find((l) => l.id === out.id)),\n })),\n conditionalMembers: fieldTranslationParams?.conditionalMembers,\n })\n }\n close()\n }, [\n fieldLanguageMaps,\n documentId,\n runTranslate,\n styleguide,\n close,\n toLanguages,\n fieldTranslationParams?.translatePath,\n fieldTranslationParams?.conditionalMembers,\n fieldTranslationParams?.documentSchema,\n languageClient,\n ])\n\n const runButton = (\n <Button\n text={`Translate`}\n tone=\"primary\"\n icon={PlayIcon}\n style={{width: '100%'}}\n disabled={runDisabled}\n onClick={onRunTranslation}\n />\n )\n\n return (\n <FieldTranslationContext.Provider value={contextValue}>\n {dialogOpen ? (\n <Dialog\n id={id}\n width={1}\n open={dialogOpen}\n onClose={close}\n header=\"Translate fields\"\n footer={\n <Flex justify=\"space-between\" padding={2} flex={1}>\n {runDisabled ? (\n <Tooltip\n content={\n <Flex padding={2}>\n <Text>There is nothing to translate in the selected from-language.</Text>\n </Flex>\n }\n placement=\"top\"\n >\n <Flex flex={1}>{runButton}</Flex>\n </Tooltip>\n ) : (\n runButton\n )}\n </Flex>\n }\n >\n {languages ? (\n <Flex padding={4} gap={5} align=\"flex-start\" justify=\"center\">\n <Stack space={2}>\n <Box marginBottom={2}>\n <Text weight=\"semibold\">From</Text>\n </Box>\n {languages?.map((radioLanguage) => (\n <FromLanguageRadio\n key={radioLanguage.id}\n {...{\n radioLanguage,\n fromLanguage,\n selectFromLanguage,\n languages,\n fieldTranslationParams,\n }}\n />\n ))}\n </Stack>\n\n <Stack space={2}>\n <Box marginBottom={2}>\n <Text weight=\"semibold\">To</Text>\n </Box>\n {languages.map((checkboxLanguage) => (\n <ToLanguageCheckbox\n key={checkboxLanguage.id}\n {...{checkboxLanguage, fromLanguage, toLanguages, toggleToLanguage, languages}}\n />\n ))}\n </Stack>\n </Flex>\n ) : (\n <Flex padding={4} gap={2} align=\"flex-start\" justify=\"center\">\n <Box>\n <Spinner />\n </Box>\n <Text>Loading languages...</Text>\n </Flex>\n )}\n </Dialog>\n ) : null}\n {props.children}\n </FieldTranslationContext.Provider>\n )\n}\n\nfunction ToLanguageCheckbox(props: {\n checkboxLanguage: Language\n fromLanguage: Language | undefined\n toLanguages: Language[] | undefined\n toggleToLanguage: (\n toggledLang: Language,\n toLanguages: Language[] | undefined,\n languages: Language[] | undefined,\n ) => void\n languages: Language[]\n}) {\n const {checkboxLanguage, fromLanguage, toLanguages, toggleToLanguage, languages} = props\n const langId = checkboxLanguage.id\n const onChange = useCallback(\n () => toggleToLanguage(checkboxLanguage, toLanguages, languages),\n [toggleToLanguage, checkboxLanguage, toLanguages, languages],\n )\n return (\n <Flex\n key={langId}\n gap={3}\n align=\"center\"\n as={'label'}\n style={langId === fromLanguage?.id ? {opacity: 0.5} : undefined}\n >\n <Checkbox\n name=\"toLang\"\n value={langId}\n checked={langId !== fromLanguage?.id && !!toLanguages?.find((tl) => tl.id === langId)}\n onChange={onChange}\n disabled={langId === fromLanguage?.id}\n />\n <Text muted={langId === fromLanguage?.id}>{checkboxLanguage.title ?? langId}</Text>\n </Flex>\n )\n}\n\nfunction FromLanguageRadio(props: {\n radioLanguage: Language\n fromLanguage: Language | undefined\n selectFromLanguage: (\n from: Language,\n languages: Language[] | undefined,\n params: FieldTranslationParams | undefined,\n ) => void\n languages: Language[] | undefined\n fieldTranslationParams: FieldTranslationParams | undefined\n}) {\n const {languages, radioLanguage, selectFromLanguage, fromLanguage, fieldTranslationParams} = props\n const langId = radioLanguage.id\n\n const onChange = useCallback(\n () => selectFromLanguage(radioLanguage, languages, fieldTranslationParams),\n [selectFromLanguage, radioLanguage, languages, fieldTranslationParams],\n )\n return (\n <Flex key={langId} gap={3} align=\"center\" as={'label'}>\n <Radio\n name=\"fromLang\"\n value={langId}\n checked={langId === fromLanguage?.id}\n onChange={onChange}\n />\n <Text>{radioLanguage.title ?? radioLanguage.id}</Text>\n </Flex>\n )\n}\n","import {ThemeProvider} from '@sanity/ui'\nimport {useState} from 'react'\nimport {LayoutProps} from 'sanity'\n\nimport {Connector, ConnectorsProvider} from '../_lib/connector'\nimport {AssistConnectorsOverlay} from '../assistConnectors'\nimport {AssistPluginConfig} from '../plugin'\nimport {FieldTranslationProvider} from '../translate/FieldTranslationProvider'\nimport {StudioInstruction} from '../types'\nimport {RunInstructionRequest} from '../useApiClient'\nimport {AiAssistanceConfigProvider} from './AiAssistanceConfigContext'\nimport {RunInstructionProvider} from './RunInstructionProvider'\n\nexport interface AIStudioLayoutProps extends LayoutProps {\n config: AssistPluginConfig\n}\n\nexport type RunInstructionArgs = Omit<RunInstructionRequest, 'instructionKey' | 'userText'> & {\n instruction: StudioInstruction\n}\n\nexport function AssistLayout(props: AIStudioLayoutProps) {\n const [connectors, setConnectors] = useState<Connector[]>([])\n\n return (\n <AiAssistanceConfigProvider config={props.config}>\n <RunInstructionProvider>\n <FieldTranslationProvider>\n <ConnectorsProvider onConnectorsChange={setConnectors}>\n {props.renderDefault(props)}\n <ThemeProvider tone=\"default\">\n <AssistConnectorsOverlay connectors={connectors} />\n </ThemeProvider>\n </ConnectorsProvider>\n </FieldTranslationProvider>\n </RunInstructionProvider>\n </AiAssistanceConfigProvider>\n )\n}\n","import {createContext, useEffect, useMemo, useState} from 'react'\nimport {getPublishedId, type InputProps, pathToString, useSyncState} from 'sanity'\nimport {useDocumentPane, usePaneRouter} from 'sanity/structure'\n\nimport {useAssistDocumentContext} from '../assistDocument/AssistDocumentContext'\nimport {useAiAssistanceConfig} from '../assistLayout/AiAssistanceConfigContext'\nimport {getDescriptionFieldOption, getImageInstructionFieldOption} from '../helpers/typeUtils'\nimport {canUseAssist, useApiClient, useGenerateCaption} from '../useApiClient'\n\nexport interface ImageContextValue {\n imageDescriptionPath?: string\n imageInstructionPath?: string\n assetRef?: string\n}\n\nexport const ImageContext = createContext<ImageContextValue>({})\n\nexport function ImageContextProvider(props: InputProps) {\n const {schemaType, path, value, readOnly} = props\n const assetRef = (value as any)?.asset?._ref\n const {selectedReleaseId} = useDocumentPane()\n const [assetRefState, setAssetRefState] = useState<string | undefined>(assetRef)\n\n const {assistableDocumentId, documentSchemaType} = useAssistDocumentContext()\n const {config, status} = useAiAssistanceConfig()\n const apiClient = useApiClient(config?.__customApiClient)\n const {generateCaption} = useGenerateCaption(apiClient)\n\n const {isSyncing} = useSyncState(\n getPublishedId(assistableDocumentId),\n documentSchemaType.name,\n selectedReleaseId,\n )\n\n const router = usePaneRouter()\n const isShowingOlderRevision = !!router.params?.rev\n\n useEffect(() => {\n const descriptionField = getDescriptionFieldOption(schemaType)\n if (\n assetRef &&\n assistableDocumentId &&\n descriptionField?.updateOnImageChange &&\n assetRef !== assetRefState &&\n !isSyncing &&\n !isShowingOlderRevision &&\n !readOnly\n ) {\n setAssetRefState(assetRef)\n if (canUseAssist(status)) {\n generateCaption({\n path: pathToString([...path, descriptionField.path]),\n documentId: assistableDocumentId,\n })\n }\n }\n }, [\n schemaType,\n path,\n assetRef,\n assetRefState,\n assistableDocumentId,\n generateCaption,\n isSyncing,\n status,\n readOnly,\n isShowingOlderRevision,\n ])\n\n const context: ImageContextValue = useMemo(() => {\n const descriptionField = getDescriptionFieldOption(schemaType)\n const imageInstructionField = getImageInstructionFieldOption(schemaType)\n return {\n imageDescriptionPath: descriptionField?.path\n ? pathToString([...path, descriptionField.path])\n : undefined,\n imageInstructionPath: imageInstructionField\n ? pathToString([...path, imageInstructionField])\n : undefined,\n assetRef,\n }\n }, [schemaType, path, assetRef])\n\n return <ImageContext.Provider value={context}>{props.renderDefault(props)}</ImageContext.Provider>\n}\n","import {icons} from '@sanity/icons'\nimport {Button, Menu, MenuButton, MenuItem} from '@sanity/ui'\nimport {ElementType, ReactNode, useCallback, useId, useMemo} from 'react'\nimport {set, StringInputProps} from 'sanity'\n\nexport function IconInput(props: StringInputProps) {\n const {value, onChange} = props\n const id = useId()\n const items = useMemo(\n () =>\n Object.entries(icons).map(([key, icon]) => (\n <IconItem key={key} iconKey={key} icon={icon} onChange={onChange} />\n )),\n [onChange],\n )\n\n const selectedIcon = useMemo(() => getIcon(value), [value])\n\n return (\n <MenuButton\n button={\n <Button icon={selectedIcon} title=\"Select icon\" padding={3} mode=\"ghost\" radius={1} />\n }\n id={id}\n menu={<Menu style={{maxHeight: 300}}>{items}</Menu>}\n popover={{portal: true}}\n />\n )\n}\n\nfunction IconItem({\n icon,\n iconKey: key,\n onChange,\n}: {\n iconKey: string\n icon: ElementType | ReactNode\n onChange: StringInputProps['onChange']\n}) {\n const onClick = useCallback(() => onChange(set(key)), [onChange, key])\n return <MenuItem icon={icon} title={key} text={key} onClick={onClick} />\n}\n\nexport function getIcon(iconName?: string) {\n return Object.entries(icons).find(([key]) => key === iconName)?.[1] ?? icons.sparkles\n}\n","import {useMemo} from 'react'\nimport {Path, SchemaType} from 'sanity'\n\nimport {isAssistSupported} from './assistSupported'\n\nexport function useAssistSupported(path: Path, schemaType: SchemaType) {\n return useMemo(() => isAssistSupported(schemaType), [schemaType])\n}\n","/* eslint-disable react-hooks/rules-of-hooks */\nimport {TranslateIcon} from '@sanity/icons'\nimport {Box, Spinner} from '@sanity/ui'\nimport {useMemo, useRef} from 'react'\nimport {\n DocumentFieldAction,\n DocumentFieldActionGroup,\n DocumentFieldActionItem,\n DocumentFieldActionProps,\n ObjectSchemaType,\n useClient,\n} from 'sanity'\nimport {useDocumentPane} from 'sanity/structure'\n\nimport {useDraftDelayedTask} from '../assistDocument/RequestRunInstructionProvider'\nimport {useAiAssistanceConfig} from '../assistLayout/AiAssistanceConfigContext'\nimport {isAssistSupported} from '../helpers/assistSupported'\nimport {getConditionalMembers} from '../helpers/conditionalMembers'\nimport {createStyleGuideResolver} from '../helpers/styleguide'\nimport type {AssistOptions} from '../schemas/typeDefExtensions'\nimport {API_VERSION_WITH_EXTENDED_TYPES, useApiClient, useTranslate} from '../useApiClient'\nimport {useFieldTranslation} from './FieldTranslationProvider'\n\nfunction node(node: DocumentFieldActionItem | DocumentFieldActionGroup) {\n return node\n}\n\nexport type TranslateProps = DocumentFieldActionProps & {\n documentIsAssistable?: boolean\n documentSchemaType?: ObjectSchemaType\n}\nexport const translateActions: DocumentFieldAction = {\n name: 'sanity-assist-translate',\n useAction(props: TranslateProps) {\n const {config, status} = useAiAssistanceConfig()\n const apiClient = useApiClient(config?.__customApiClient)\n const client = useClient({apiVersion: API_VERSION_WITH_EXTENDED_TYPES})\n const {\n schemaType: fieldSchemaType,\n path,\n documentId,\n documentSchemaType,\n documentIsAssistable,\n } = props\n const isDocumentLevel = path.length === 0\n const readOnly = fieldSchemaType.readOnly === true\n\n const docTransTypes = config.translate?.document?.documentTypes\n const options = fieldSchemaType?.options as AssistOptions | undefined\n const addFieldAction = isDocumentLevel || options?.aiAssist?.translateAction\n\n //All props used here MUST have the same value always, or we break the rules of hooks (conditional hook usage)\n const fieldTransEnabled =\n addFieldAction &&\n documentSchemaType &&\n config.translate?.field?.documentTypes?.includes(documentSchemaType.name)\n const documentTranslationEnabled =\n addFieldAction &&\n documentSchemaType &&\n ((!docTransTypes && isAssistSupported(fieldSchemaType)) ||\n docTransTypes?.includes(documentSchemaType.name))\n\n // these checks are stable (ie, does not change after mount), so not breaking rules of hooks\n if (documentSchemaType && (documentTranslationEnabled || fieldTransEnabled)) {\n const {value: documentValue, onChange: documentOnChange, formState} = useDocumentPane()\n const docRef = useRef(documentValue)\n docRef.current = documentValue\n const formStateRef = useRef(formState)\n formStateRef.current = formState\n\n const translationApi = useTranslate(apiClient)\n const translate = useDraftDelayedTask({\n documentOnChange,\n isDocAssistable: documentIsAssistable ?? false,\n task: translationApi.translate,\n })\n\n const styleguide = config.translate?.styleguide\n const languagePath = config.translate?.document?.languageField\n\n // if this is true, it is stable, and not breaking rules of hooks\n const translateDocumentAction = useMemo(() => {\n if (!languagePath || !documentTranslationEnabled) {\n return undefined\n }\n const title = path.length ? `Translate` : `Translate document`\n return node({\n type: 'action',\n icon: translationApi.loading\n ? () => (\n <Box style={{height: 17}}>\n <Spinner style={{transform: 'translateY(6px)'}} />\n </Box>\n )\n : TranslateIcon,\n title,\n onAction: () => {\n if (translationApi.loading || !languagePath || !documentId) {\n return\n }\n translate({\n languagePath,\n translatePath: path,\n styleguide: createStyleGuideResolver(styleguide, {\n client,\n documentId,\n schemaType: documentSchemaType,\n }),\n documentId: documentId ?? '',\n conditionalMembers: formStateRef.current\n ? getConditionalMembers(formStateRef.current)\n : [],\n })\n },\n renderAsButton: true,\n disabled: translationApi.loading || readOnly,\n })\n }, [\n languagePath,\n translate,\n styleguide,\n documentId,\n translationApi.loading,\n documentTranslationEnabled,\n path,\n readOnly,\n client,\n documentSchemaType,\n ])\n const fieldTranslate = useFieldTranslation()\n const openFieldTranslation = useDraftDelayedTask({\n documentOnChange,\n isDocAssistable: documentIsAssistable ?? false,\n task: fieldTranslate.openFieldTranslation,\n })\n\n const maxDepth = config.translate?.field?.maxPathDepth\n const translateFieldsAction = useMemo(\n () =>\n fieldTransEnabled\n ? node({\n type: 'action',\n icon: fieldTranslate.translationLoading\n ? () => (\n <Box style={{height: 17}}>\n <Spinner style={{transform: 'translateY(6px)'}} />\n </Box>\n )\n : TranslateIcon,\n title: `Translate fields...`,\n onAction: () => {\n if (fieldTranslate.translationLoading || !documentId) {\n return\n }\n if (formStateRef.current) {\n getConditionalMembers(formStateRef.current)\n }\n openFieldTranslation({\n document: {\n ...docRef.current,\n _id: documentId,\n },\n documentSchema: documentSchemaType,\n translatePath: path,\n conditionalMembers: formStateRef.current\n ? getConditionalMembers(formStateRef.current, maxDepth)\n : [],\n })\n },\n renderAsButton: true,\n disabled: fieldTranslate.translationLoading || readOnly,\n })\n : undefined,\n [\n openFieldTranslation,\n documentSchemaType,\n documentId,\n fieldTranslate.translationLoading,\n fieldTransEnabled,\n path,\n readOnly,\n maxDepth,\n ],\n )\n\n // eslint-disable-next-line react-hooks/rules-of-hooks\n return useMemo(() => {\n if (!status?.initialized) {\n return undefined as unknown as DocumentFieldActionItem\n }\n return node({\n type: 'group',\n icon: () => null,\n title: 'Translation',\n children: [translateDocumentAction, translateFieldsAction].filter(\n (c): c is DocumentFieldActionItem => !!c,\n ),\n expanded: true,\n })\n }, [translateDocumentAction, translateFieldsAction, status])\n }\n // works but not supported by types\n return undefined as unknown as DocumentFieldActionItem\n },\n}\n","import {ImageIcon} from '@sanity/icons'\nimport {Box, Spinner} from '@sanity/ui'\nimport {useContext, useMemo} from 'react'\nimport type {DocumentFieldAction, DocumentFieldActionGroup, DocumentFieldActionItem} from 'sanity'\nimport {useDocumentPane} from 'sanity/structure'\n\nimport {useAssistDocumentContext} from '../assistDocument/AssistDocumentContext'\nimport {aiInspectorId} from '../assistInspector/constants'\nimport {useAiAssistanceConfig} from '../assistLayout/AiAssistanceConfigContext'\nimport {ImageContext} from '../components/ImageContext'\nimport {usePathKey} from '../helpers/misc'\nimport {fieldPathParam, instructionParam} from '../types'\nimport {canUseAssist, useApiClient, useGenerateCaption} from '../useApiClient'\n\nfunction node(node: DocumentFieldActionItem | DocumentFieldActionGroup) {\n return node\n}\n\nexport const generateCaptionsActions: DocumentFieldAction = {\n name: 'sanity-assist-generate-captions',\n useAction(props) {\n const pathKey = usePathKey(props.path)\n const {openInspector} = useDocumentPane()\n\n const {config, status} = useAiAssistanceConfig()\n const apiClient = useApiClient(config?.__customApiClient)\n const {generateCaption, loading} = useGenerateCaption(apiClient)\n const imageContext = useContext(ImageContext)\n\n if (imageContext && pathKey === imageContext?.imageDescriptionPath) {\n //if this is true, it is stable, and not breaking rules of hooks\n // eslint-disable-next-line react-hooks/rules-of-hooks\n const {assistableDocumentId} = useAssistDocumentContext()\n // eslint-disable-next-line react-hooks/rules-of-hooks\n return useMemo(() => {\n return node({\n type: 'action',\n icon: loading\n ? () => (\n <Box style={{height: 17}}>\n <Spinner style={{transform: 'translateY(6px)'}} />\n </Box>\n )\n : ImageIcon,\n title: 'Generate image description',\n onAction: () => {\n if (loading) {\n return\n }\n if (!canUseAssist(status)) {\n openInspector(aiInspectorId, {\n [fieldPathParam]: pathKey,\n [instructionParam]: undefined as any,\n })\n return\n }\n generateCaption({path: pathKey, documentId: assistableDocumentId})\n },\n renderAsButton: true,\n disabled: loading,\n hidden: !imageContext.assetRef,\n })\n }, [\n generateCaption,\n pathKey,\n assistableDocumentId,\n loading,\n imageContext,\n status,\n openInspector,\n ])\n }\n\n // works but not supported by types\n return undefined as unknown as DocumentFieldActionItem\n },\n}\n","import {ImageIcon} from '@sanity/icons'\nimport {Box, Spinner} from '@sanity/ui'\nimport {useContext, useMemo} from 'react'\nimport {DocumentFieldAction, DocumentFieldActionGroup, DocumentFieldActionItem} from 'sanity'\n\nimport {useAssistDocumentContext} from '../assistDocument/AssistDocumentContext'\nimport {useAiAssistanceConfig} from '../assistLayout/AiAssistanceConfigContext'\nimport {ImageContext} from '../components/ImageContext'\nimport {usePathKey} from '../helpers/misc'\nimport {useApiClient, useGenerateImage} from '../useApiClient'\n\nfunction node(node: DocumentFieldActionItem | DocumentFieldActionGroup) {\n return node\n}\n\nexport const generateImagActions: DocumentFieldAction = {\n name: 'sanity-assist-generate-image',\n useAction(props) {\n const pathKey = usePathKey(props.path)\n\n const {config} = useAiAssistanceConfig()\n const apiClient = useApiClient(config?.__customApiClient)\n const {generateImage, loading} = useGenerateImage(apiClient)\n\n const imageContext = useContext(ImageContext)\n\n if (imageContext && pathKey === imageContext?.imageInstructionPath) {\n //if this is true, it is stable, and not breaking rules of hooks\n // eslint-disable-next-line react-hooks/rules-of-hooks\n const {assistableDocumentId} = useAssistDocumentContext()\n // eslint-disable-next-line react-hooks/rules-of-hooks\n return useMemo(() => {\n return node({\n type: 'action',\n icon: loading\n ? () => (\n <Box style={{height: 17}}>\n <Spinner style={{transform: 'translateY(6px)'}} />\n </Box>\n )\n : ImageIcon,\n title: 'Generate image from prompt',\n onAction: () => {\n if (loading) {\n return\n }\n generateImage({path: pathKey, documentId: assistableDocumentId})\n },\n renderAsButton: true,\n disabled: loading,\n })\n }, [generateImage, pathKey, assistableDocumentId, loading])\n }\n\n // works but not supported by types\n return undefined as unknown as DocumentFieldActionItem\n },\n}\n","import {LockIcon} from '@sanity/icons'\nimport {Text, Tooltip} from '@sanity/ui'\n\nexport function PrivateIcon() {\n return (\n <Tooltip\n content={\n <Text size={1} style={{whiteSpace: 'nowrap'}}>\n Only visible to you\n </Text>\n }\n fallbackPlacements={['bottom']}\n padding={2}\n placement=\"top\"\n portal\n >\n <LockIcon />\n </Tooltip>\n )\n}\n","import {ControlsIcon, SparklesIcon} from '@sanity/icons'\nimport {useCallback, useMemo, useRef} from 'react'\nimport {\n type DocumentFieldAction,\n type DocumentFieldActionGroup,\n type DocumentFieldActionItem,\n typed,\n useCurrentUser,\n} from 'sanity'\nimport {useDocumentPane} from 'sanity/structure'\n\nimport {useAssistDocumentContext} from '../assistDocument/AssistDocumentContext'\nimport {getIcon} from '../assistDocument/components/instruction/appearance/IconInput'\nimport {useRequestRunInstruction} from '../assistDocument/RequestRunInstructionProvider'\nimport {aiInspectorId} from '../assistInspector/constants'\nimport {useSelectedField, useTypePath} from '../assistInspector/helpers'\nimport {pluginTitleShort} from '../constants'\nimport {isSchemaAssistEnabled} from '../helpers/assistSupported'\nimport {getConditionalMembers} from '../helpers/conditionalMembers'\nimport {getInstructionTitle, usePathKey} from '../helpers/misc'\nimport {useAssistSupported} from '../helpers/useAssistSupported'\nimport {translateActions, type TranslateProps} from '../translate/translateActions'\nimport {documentRootKey, fieldPathParam, instructionParam, type StudioInstruction} from '../types'\nimport {generateCaptionsActions} from './generateCaptionActions'\nimport {generateImagActions} from './generateImageActions'\nimport {PrivateIcon} from './PrivateIcon'\n\nfunction node(node: DocumentFieldActionItem | DocumentFieldActionGroup) {\n return node\n}\n\nexport const assistFieldActions: DocumentFieldAction = {\n name: 'sanity-assist-actions',\n useAction(props) {\n const {schemaType} = props\n\n const {\n assistDocument,\n documentIsNew,\n documentIsAssistable,\n openInspector,\n closeInspector,\n inspector,\n documentOnChange,\n documentSchemaType,\n selectedPath,\n assistableDocumentId,\n } = useAssistDocumentContext()\n\n const {value: docValue, formState} = useDocumentPane()\n const formStateRef = useRef(formState)\n formStateRef.current = formState\n\n const currentUser = useCurrentUser()\n const isHidden = !assistDocument\n const pathKey = usePathKey(props.path)\n const typePath = useTypePath(docValue, pathKey)\n const assistDocumentId = assistDocument?._id\n\n const {requestRunInstruction} = useRequestRunInstruction({\n documentOnChange,\n isDocAssistable: documentIsAssistable ?? false,\n })\n\n const isSelectable = !!useSelectedField(documentSchemaType, typePath)\n const assistSupported =\n useAssistSupported(props.path, schemaType) &&\n isSelectable &&\n isSchemaAssistEnabled(documentSchemaType) &&\n schemaType.readOnly !== true\n\n const fieldAssist = useMemo(\n () =>\n (assistDocument?.fields ?? []).find(\n (f) => f.path === typePath || (pathKey === documentRootKey && f.path === pathKey),\n ),\n [assistDocument?.fields, pathKey, typePath],\n )\n\n const fieldAssistKey = fieldAssist?._key\n const isInspectorOpen = inspector?.name === aiInspectorId\n const isPathSelected = pathKey === selectedPath\n const isSelected = isInspectorOpen && isPathSelected\n\n const imageCaptionAction = generateCaptionsActions.useAction(props)\n const imageGenAction = generateImagActions.useAction(props)\n const translateAction = translateActions.useAction(\n typed<TranslateProps>({\n ...props,\n documentId: assistableDocumentId,\n documentIsAssistable,\n documentSchemaType,\n }),\n )\n const manageInstructions = useCallback(\n () =>\n isSelected\n ? closeInspector(aiInspectorId)\n : openInspector(aiInspectorId, {\n [fieldPathParam]: pathKey,\n [instructionParam]: undefined as any,\n }),\n [openInspector, closeInspector, isSelected, pathKey],\n )\n\n const onInstructionAction = useCallback(\n (instruction: StudioInstruction) => {\n if (!pathKey || !fieldAssistKey || !assistDocumentId || !assistableDocumentId) {\n return\n }\n requestRunInstruction({\n documentId: assistableDocumentId,\n assistDocumentId,\n path: pathKey,\n typePath,\n instruction,\n conditionalMembers: formStateRef.current\n ? getConditionalMembers(formStateRef.current)\n : [],\n })\n },\n [\n requestRunInstruction,\n assistableDocumentId,\n pathKey,\n typePath,\n assistDocumentId,\n fieldAssistKey,\n ],\n )\n\n const privateInstructions = useMemo(\n () =>\n fieldAssist?.instructions?.filter((i) => i.userId && i.userId === currentUser?.id) || [],\n [fieldAssist?.instructions, currentUser],\n )\n\n const sharedInstructions = useMemo(\n () => fieldAssist?.instructions?.filter((i) => !i.userId) || [],\n [fieldAssist?.instructions],\n )\n\n const instructions = useMemo(\n () => [...privateInstructions, ...sharedInstructions],\n [privateInstructions, sharedInstructions],\n )\n\n const runInstructionsGroup = useMemo(() => {\n return instructions?.length || imageCaptionAction || translateAction || imageGenAction\n ? node({\n type: 'group',\n icon: () => null,\n title: 'Run instructions',\n children: [\n ...(instructions?.map((instruction) =>\n instructionItem({\n instruction,\n isPrivate: Boolean(instruction.userId && instruction.userId === currentUser?.id),\n onInstructionAction,\n hidden: isHidden,\n documentIsNew: !!documentIsNew,\n assistSupported,\n }),\n ) || []),\n imageCaptionAction,\n imageGenAction,\n ].filter((a): a is DocumentFieldActionItem => !!a),\n expanded: true,\n })\n : undefined\n }, [\n instructions,\n currentUser?.id,\n onInstructionAction,\n isHidden,\n documentIsNew,\n assistSupported,\n imageCaptionAction,\n translateAction,\n imageGenAction,\n ])\n\n const instructionsLength = instructions?.length || 0\n\n const manageInstructionsItem = useMemo(\n () =>\n node({\n type: 'action',\n icon: ControlsIcon,\n title: 'Manage instructions',\n onAction: manageInstructions,\n selected: isSelected,\n }),\n [manageInstructions, isSelected],\n )\n\n const group = useMemo(\n () =>\n node({\n type: 'group',\n icon: SparklesIcon,\n title: pluginTitleShort,\n children: [\n runInstructionsGroup,\n translateAction,\n assistSupported && manageInstructionsItem,\n ]\n .filter((c): c is DocumentFieldActionItem | DocumentFieldActionGroup => !!c)\n .filter((c) => (c.type === 'group' ? c.children.length : true)),\n expanded: false,\n renderAsButton: true,\n hidden: !assistSupported && !imageCaptionAction && !translateAction && !imageGenAction,\n }),\n [\n //documentIsNew,\n runInstructionsGroup,\n manageInstructionsItem,\n assistSupported,\n imageCaptionAction,\n translateAction,\n imageGenAction,\n ],\n )\n\n const emptyAction = useMemo(\n () =>\n node({\n type: 'action',\n hidden: !assistSupported,\n icon: SparklesIcon,\n onAction: manageInstructions,\n renderAsButton: true,\n title: pluginTitleShort,\n selected: isSelected,\n }),\n [assistSupported, manageInstructions, isSelected],\n )\n\n // If there are no instructions, we don't want to render the group\n if (instructionsLength === 0 && !imageCaptionAction && !translateAction && !imageGenAction) {\n return emptyAction\n }\n\n return group\n },\n}\n\nfunction instructionItem(props: {\n instruction: StudioInstruction\n isPrivate: boolean\n onInstructionAction: (ins: StudioInstruction) => void\n assistSupported: boolean\n documentIsNew: boolean\n hidden: boolean\n}) {\n const {hidden, isPrivate, onInstructionAction, assistSupported, instruction} = props\n return node({\n type: 'action',\n icon: getIcon(instruction.icon),\n iconRight: isPrivate ? PrivateIcon : undefined,\n title: getInstructionTitle(instruction),\n onAction: () => onInstructionAction(instruction),\n disabled: !assistSupported,\n hidden,\n })\n}\n","import {Card, Flex} from '@sanity/ui'\nimport {useMemo} from 'react'\n\nimport {useAssistDocumentContext} from '../assistDocument/AssistDocumentContext'\nimport {documentRootKey, fieldPresenceTypeName} from '../types'\nimport {AiFieldPresence} from './AiFieldPresence'\nimport {aiPresence} from './useAssistPresence'\n\nexport function createAssistDocumentPresence(documentId: string | undefined) {\n return function AssistDocumentPresenceWrapper() {\n return documentId ? <AssistDocumentPresence /> : null\n }\n}\n\nfunction AssistDocumentPresence() {\n const {assistDocument} = useAssistDocumentContext()\n const anyPresence = useMemo(() => {\n const anyPresence = assistDocument?.tasks\n ?.filter((run) => !run.ended && !run.reason)\n ?.flatMap((run) => run.presence ?? [])\n .find((f) => f.started && new Date().getTime() - new Date(f.started).getTime() < 30000)\n if (anyPresence) {\n return aiPresence(anyPresence, [])\n }\n const anyRun = assistDocument?.tasks\n ?.filter((run) => !run.ended && !run.reason)\n ?.find((f) => f.started && new Date().getTime() - new Date(f.started).getTime() < 30000)\n return anyRun\n ? aiPresence(\n {\n started: anyRun.started,\n path: documentRootKey,\n _key: anyRun._key,\n _type: fieldPresenceTypeName,\n },\n [],\n )\n : undefined\n }, [assistDocument?.tasks])\n\n return (\n <Card>\n <Flex flex={1} justify=\"flex-end\">\n <Flex gap={2} align={'center'}>\n {anyPresence && <AiFieldPresence presence={anyPresence} />}\n </Flex>\n </Flex>\n </Card>\n )\n}\n","import {ArrowLeftIcon} from '@sanity/icons'\nimport {Button} from '@sanity/ui'\nimport {useCallback} from 'react'\nimport {useDocumentPane} from 'sanity/structure'\n\nimport {aiInspectorId} from '../../../assistInspector/constants'\nimport {instructionParam} from '../../../types'\n\nexport function BackToInstructionListLink() {\n const {openInspector} = useDocumentPane()\n\n const goBack = useCallback(\n () => openInspector(aiInspectorId, {[instructionParam]: undefined as any}),\n [openInspector],\n )\n\n return (\n <div>\n <Button\n as=\"a\"\n fontSize={1}\n icon={ArrowLeftIcon}\n mode=\"bleed\"\n padding={1}\n space={2}\n onClick={goBack}\n text=\" Instructions\"\n textAlign=\"left\"\n />\n </div>\n )\n}\n","import {Card, Stack, Text} from '@sanity/ui'\nimport {useContext, useEffect, useMemo, useRef} from 'react'\nimport {\n FormCallbacksProvider,\n FormCallbacksValue,\n FormInput,\n insert,\n KeyedSegment,\n ObjectInputProps,\n ObjectSchemaType,\n PatchEvent,\n Path,\n SchemaType,\n set,\n setIfMissing,\n stringToPath,\n typed,\n useFormCallbacks,\n useSchema,\n} from 'sanity'\n\nimport {useAiPaneRouter} from '../../assistInspector/helpers'\nimport {useAiAssistanceConfig} from '../../assistLayout/AiAssistanceConfigContext'\nimport {\n AssistDocument,\n AssistField,\n assistFieldTypeName,\n AssistInspectorRouteParams,\n documentRootKey,\n fieldPathParam,\n instructionParam,\n StudioInstruction,\n} from '../../types'\nimport {AssistTypeContext} from './AssistTypeContext'\nimport {BackToInstructionListLink} from './instruction/BackToInstructionsLink'\nimport {SelectedFieldContextProvider, SelectedFieldContextValue} from './SelectedFieldContext'\n\nconst EMPTY_FIELDS: AssistField[] = []\n\nexport function AssistDocumentForm(props: ObjectInputProps) {\n if (props.readOnly) {\n return (\n <Card border tone=\"caution\" padding={2}>\n <Text size={1}> You do not have sufficient permissions to manage instructions.</Text>\n </Card>\n )\n }\n return <AssistDocumentFormEditable {...props} />\n}\nfunction AssistDocumentFormEditable(props: ObjectInputProps) {\n const {onChange} = props\n const value = props.value as AssistDocument | undefined\n const id = value?._id\n const fields = value?.fields\n\n const {params, setParams} = useAiPaneRouter()\n const pathKey = params[fieldPathParam]\n const {typePath, documentType: targetDocumentType} = useContext(AssistTypeContext)\n const instruction = params[instructionParam]\n\n const activeKey = useMemo(() => {\n if (!typePath) {\n return undefined\n }\n return (fields ?? EMPTY_FIELDS).find((f) => f.path === typePath)?._key\n }, [fields, typePath])\n\n const activePath: Path | undefined = useMemo(() => {\n if (!activeKey) {\n return undefined\n }\n const base = ['fields', {_key: activeKey}]\n return instruction ? [...base, 'instructions', {_key: instruction}] : base\n }, [activeKey, instruction])\n\n const schema = useSchema()\n const documentSchema: ObjectSchemaType | undefined = useMemo(() => {\n if (!targetDocumentType) {\n return undefined\n }\n return schema.get(targetDocumentType) as ObjectSchemaType\n }, [schema, targetDocumentType])\n\n const fieldSchema = useSelectedSchema(pathKey, documentSchema)\n\n const context: SelectedFieldContextValue = useMemo(\n () => ({\n documentSchema,\n fieldSchema: fieldSchema ?? documentSchema,\n }),\n [fieldSchema, documentSchema],\n )\n\n const title = value?.title\n\n useEffect(() => {\n if (!title && documentSchema && !id?.startsWith('drafts.')) {\n onChange(set(documentSchema.title ?? documentSchema.name, ['title']))\n }\n }, [title, documentSchema, onChange, id])\n\n const {onPathOpen, ...formCallbacks} = useFormCallbacks()\n\n const newCallbacks: FormCallbacksValue = useMemo(\n () => ({\n ...formCallbacks,\n onPathOpen: (path) => {\n if (!instruction && path.length === 4 && path[2] === 'instructions') {\n setParams(\n typed<AssistInspectorRouteParams>({\n ...params,\n [instructionParam]: (path[3] as KeyedSegment)?._key,\n }) as Record<keyof AssistInspectorRouteParams, string | undefined>,\n )\n onPathOpen([])\n } else {\n setTimeout(() => onPathOpen(path), 0)\n }\n },\n }),\n [formCallbacks, onPathOpen, params, setParams, instruction],\n )\n\n useEffect(() => {\n if (activePath && !instruction) {\n onPathOpen([])\n }\n }, [activePath, instruction, onPathOpen])\n\n return (\n <SelectedFieldContextProvider value={context}>\n <Stack space={5}>\n <FieldsInitializer\n key={typePath}\n pathKey={typePath}\n activePath={activePath}\n fields={fields}\n documentSchema={documentSchema}\n onChange={onChange}\n />\n {instruction && <BackToInstructionListLink />}\n\n {activePath && (\n <FormCallbacksProvider {...newCallbacks}>\n <div style={{lineHeight: '1.25em'}}>\n <FormInput {...props} absolutePath={activePath} />\n </div>\n </FormCallbacksProvider>\n )}\n\n {!activePath && props.renderDefault(props)}\n </Stack>\n </SelectedFieldContextProvider>\n )\n}\n\nfunction useSelectedSchema(\n fieldPath: string | undefined,\n documentSchema: ObjectSchemaType | undefined,\n): SchemaType | undefined {\n return useMemo(() => {\n if (!fieldPath) {\n return undefined\n }\n if (fieldPath === documentRootKey) {\n return documentSchema\n }\n\n const path = stringToPath(fieldPath)\n let currentSchema: ObjectSchemaType | undefined = documentSchema\n for (let i = 0; i < path.length; i++) {\n const segment = path[i]\n const field = currentSchema?.fields.find((f) => f.name === segment)\n if (!field) {\n return undefined\n }\n if (i === path.length - 1) {\n return field.type\n }\n if (field.type.jsonType !== 'object') {\n return undefined\n }\n currentSchema = field.type\n }\n return currentSchema\n }, [documentSchema, fieldPath])\n}\n\nfunction FieldsInitializer({\n pathKey,\n activePath,\n fields,\n documentSchema,\n onChange,\n}: {\n pathKey?: string\n activePath?: Path\n fields: AssistField[] | undefined\n documentSchema: ObjectSchemaType | undefined\n onChange: ObjectInputProps['onChange']\n}) {\n const {\n config: {__presets: presets},\n } = useAiAssistanceConfig()\n\n const existingField = fields?.find((f) => f._key === pathKey)\n const documentPresets = !!documentSchema?.name && presets?.[documentSchema?.name]\n\n const missingPresetInstructions = useMemo(() => {\n if (!documentPresets || !pathKey) {\n return undefined\n }\n const existingInstructions = existingField?.instructions\n const presetField = documentPresets.fields?.find((f) => f.path === pathKey)\n return presetField?.instructions?.filter(\n (i) => !existingInstructions?.some((ei) => ei._key === i._key),\n )\n }, [documentPresets, pathKey, existingField])\n\n // need this to not fire onChange twice in React strict mode\n const initialized = useRef(false)\n useEffect(() => {\n if (initialized.current || !pathKey) {\n return\n }\n if (existingField && !missingPresetInstructions?.length) {\n return\n }\n\n let event = PatchEvent.from([setIfMissing([], ['fields'])])\n if (!existingField) {\n event = event.append(\n insert(\n [\n typed<AssistField>({\n _key: pathKey,\n _type: assistFieldTypeName,\n path: pathKey,\n instructions: [],\n }),\n ],\n 'after',\n ['fields', -1],\n ),\n )\n }\n\n if (!existingField?.instructions?.length) {\n event = event.append([setIfMissing([], ['fields', {_key: pathKey}, 'instructions'])])\n }\n\n if (missingPresetInstructions?.length) {\n event = event.append(\n insert(\n missingPresetInstructions.map(\n (preset): StudioInstruction => ({\n ...preset,\n _type: 'sanity.assist.instruction',\n prompt: preset.prompt?.map((p) => ({markDefs: [], ...p})),\n }),\n ),\n 'after',\n ['fields', {_key: pathKey}, 'instructions', -1],\n ),\n )\n }\n onChange(event)\n initialized.current = true\n }, [activePath, onChange, pathKey, existingField, missingPresetInstructions])\n\n return null\n}\n","import {Box, Flex, Text} from '@sanity/ui'\nimport {useContext} from 'react'\nimport {PreviewProps} from 'sanity'\n\nimport {InlineBlockValueContext} from '../../assistFormComponents/AssistInlineFormBlock'\nimport {useSelectedField} from '../../assistInspector/helpers'\nimport {SelectedFieldContext} from './SelectedFieldContext'\n\nexport function FieldRefPreview(props: PreviewProps & {path?: string}) {\n const {actions} = props\n const documentSchema = useContext(SelectedFieldContext)?.documentSchema\n const path = (useContext(InlineBlockValueContext) as {path?: string})?.path ?? props.path\n const selectedField = useSelectedField(documentSchema, path)\n return (\n <Flex gap={2} align=\"center\" style={{width: '100%'}}>\n <Flex flex={1} gap={2} align=\"center\" paddingY={3} paddingX={1}>\n <Box>\n <Text size={1} textOverflow=\"ellipsis\">\n {selectedField?.title ?? 'Select field'}\n </Text>\n </Box>\n </Flex>\n {actions as any}\n </Flex>\n )\n}\n","import {FieldProps} from 'sanity'\n\nexport function HiddenFieldTitle(props: FieldProps) {\n return props.renderDefault({...props, title: '', level: props.level - 2, changed: false})\n}\n","import {Card, Flex, Switch, Text} from '@sanity/ui'\nimport {useCallback, useId} from 'react'\nimport {set, StringInputProps, unset, useCurrentUser} from 'sanity'\n\nexport function InstructionVisibility(props: StringInputProps) {\n const {value, onChange} = props\n\n const user = useCurrentUser()\n\n const handleChange = useCallback(() => {\n const newValue = value ? '' : (user?.id ?? '')\n onChange(newValue ? set(newValue) : unset())\n }, [onChange, user, value])\n\n const id = useId()\n\n return (\n <Card>\n <Flex gap={2} align=\"flex-start\">\n <div style={{margin: '-3px 0'}}>\n <Switch\n {...props.elementProps}\n id={id}\n value={`${!value}`}\n checked={!value}\n onChange={handleChange}\n disabled={props.elementProps.readOnly}\n />\n </div>\n\n <Text muted size={1} weight=\"medium\">\n <label htmlFor={id}>Make visible to all Studio members</label>\n </Text>\n </Flex>\n </Card>\n )\n}\n","import {Box} from '@sanity/ui'\nimport {useCallback, useContext, useEffect, useId, useRef} from 'react'\nimport {set, StringInputProps} from 'sanity'\n\nimport {FieldAutocomplete} from '../../../assistInspector/FieldAutocomplete'\nimport {FieldRef} from '../../../assistInspector/helpers'\nimport {AssistTypeContext} from '../AssistTypeContext'\nimport {SelectedFieldContext} from '../SelectedFieldContext'\n\nexport function FieldRefPathInput(props: StringInputProps) {\n const documentSchema = useContext(SelectedFieldContext)?.documentSchema\n const {typePath} = useContext(AssistTypeContext)\n const ref = useRef<HTMLDivElement>(null)\n const id = useId()\n const {onChange} = props\n\n useEffect(() => {\n ref.current?.querySelector('input')?.focus()\n }, [])\n\n const onSelect = useCallback((path: string) => onChange(set(path)), [onChange])\n\n const filter = useCallback(\n (field: FieldRef) => {\n if (!field.key.includes('|') || !typePath) {\n return true\n }\n if (field.key.includes('|') && !typePath.includes('|')) {\n return false\n }\n\n const fieldSegments = field.key.split('.')\n const lastArrayItemIndex = fieldSegments.findLastIndex((s) => s.includes('|'))\n const mustStartWith = fieldSegments.slice(0, lastArrayItemIndex + 1).join('.')\n return typePath.startsWith(mustStartWith)\n },\n [typePath],\n )\n if (!documentSchema) {\n return props.renderDefault(props)\n }\n\n return (\n <Box flex={1} style={{minWidth: 300}} ref={ref}>\n <FieldAutocomplete\n id={id}\n schemaType={documentSchema}\n onSelect={onSelect}\n fieldPath={props.value}\n filter={filter}\n />\n </Box>\n )\n}\n","import {FieldError, FieldMember, FieldSetMember, ObjectMember} from 'sanity'\n\nexport function findFieldMember(\n members: ObjectMember[],\n fieldName: string,\n): FieldMember | FieldError | undefined {\n return members.find(\n (m): m is FieldMember | FieldError =>\n (m.kind === 'field' && m.name === fieldName) ||\n (m.kind === 'error' && m.fieldName === fieldName),\n )\n}\n\nexport function findFieldsetMember(\n members: ObjectMember[],\n fieldsetName: string,\n): FieldSetMember | undefined {\n return members.find(\n (m): m is FieldSetMember => m.kind === 'fieldSet' && m.fieldSet.name === fieldsetName,\n )\n}\n","import {Box, Flex, Stack, Text} from '@sanity/ui'\nimport {useId, useMemo} from 'react'\nimport {FieldError, FieldMember, ObjectInputMember, ObjectInputProps} from 'sanity'\n\nimport {findFieldMember, findFieldsetMember} from '../helpers'\n\nexport function InstructionInput(props: ObjectInputProps) {\n return (\n <Stack space={[4, 4, 4, 5]}>\n <NameField {...props} />\n <ShareField {...props} />\n <ObjectMember fieldName={'prompt'} {...props} />\n <ObjectMember fieldName={'output'} {...props} />\n </Stack>\n )\n}\n\nfunction ObjectMember({fieldName, ...props}: ObjectInputProps & {fieldName: string}) {\n const member = findFieldMember(props.members, fieldName)\n return member ? <ObjectInputMember {...props} member={member} /> : null\n}\n\nconst NONE: (FieldMember | FieldError)[] = []\n\nfunction NameField(props: ObjectInputProps) {\n const fieldsetMember = findFieldsetMember(props.members, 'appearance')\n const titleId = useId()\n\n const members = fieldsetMember?.fieldSet.members ?? NONE\n const iconMember = findFieldMember(members, 'icon')\n const titleMember = findFieldMember(members, 'title')\n\n const titlePlaceholder = 'Untitled'\n const moddedTitleMember = useMemo(() => {\n if (!titleMember) {\n return undefined\n }\n if (titleMember.kind === 'error') {\n return titleMember\n }\n return {\n ...titleMember,\n field: {\n ...titleMember?.field,\n schemaType: {\n ...titleMember?.field.schemaType,\n placeholder: titlePlaceholder,\n },\n },\n }\n }, [titleMember, titlePlaceholder])\n\n return (\n <Stack space={5}>\n <Stack space={2}>\n <Flex gap={1}>\n <Text as=\"label\" weight=\"semibold\" size={1} htmlFor={titleId}>\n Name\n </Text>\n </Flex>\n\n <Text muted size={1}>\n How this instruction appears in menus\n </Text>\n\n <Flex align=\"center\">\n {iconMember && (\n <Box flex=\"none\">\n <ObjectInputMember {...props} member={iconMember} />\n </Box>\n )}\n {moddedTitleMember && (\n <Box flex={1} style={{marginLeft: -1}}>\n <ObjectInputMember {...props} member={moddedTitleMember} />\n </Box>\n )}\n </Flex>\n </Stack>\n </Stack>\n )\n}\n\nfunction ShareField(props: ObjectInputProps) {\n const fieldsetMember = findFieldsetMember(props.members, 'appearance')\n const members = fieldsetMember?.fieldSet.members ?? NONE\n const visibilityMember = findFieldMember(members, 'userId')\n\n return <>{visibilityMember && <ObjectInputMember {...props} member={visibilityMember} />}</>\n}\n","import {useCallback, useContext, useState} from 'react'\nimport {\n ArrayFieldProps,\n ArraySchemaType,\n isArrayOfObjectsSchemaType,\n isObjectSchemaType,\n ObjectSchemaType,\n} from 'sanity'\n\nimport {SelectedFieldContext} from '../SelectedFieldContext'\n\nexport function InstructionOutputField(props: ArrayFieldProps) {\n const {fieldSchema} = useContext(SelectedFieldContext) ?? {}\n\n if (\n !fieldSchema ||\n !(isObjectSchemaType(fieldSchema) || isArrayOfObjectsSchemaType(fieldSchema))\n ) {\n return null\n }\n\n return (\n <EnabledOutputField {...props} fieldSchema={fieldSchema}>\n {props.children}\n </EnabledOutputField>\n )\n}\n\nfunction EnabledOutputField({\n fieldSchema,\n ...props\n}: ArrayFieldProps & {fieldSchema: ObjectSchemaType | ArraySchemaType<ObjectSchemaType>}) {\n const [open, setOpen] = useState(!!props.value?.length)\n const onExpand = useCallback(() => setOpen(true), [])\n const onCollapse = useCallback(() => setOpen(false), [])\n\n return props.renderDefault({\n ...props,\n collapsible: true,\n onExpand,\n onCollapse,\n collapsed: !open,\n level: 1,\n title: isObjectSchemaType(fieldSchema) ? 'Allowed fields' : 'Allowed types',\n })\n}\n","import {Card, Checkbox, Flex, Stack, Text} from '@sanity/ui'\nimport {useCallback, useContext, useEffect, useMemo} from 'react'\nimport {\n ArrayOfObjectsInputProps,\n ArraySchemaType,\n FormPatch,\n insert,\n isArrayOfObjectsSchemaType,\n isObjectSchemaType,\n ObjectSchemaType,\n PatchEvent,\n setIfMissing,\n typed,\n unset,\n} from 'sanity'\n\nimport {isAssistSupported} from '../../../helpers/assistSupported'\nimport {isType} from '../../../helpers/typeUtils'\nimport {OutputFieldItem, outputFieldTypeName, OutputTypeItem} from '../../../types'\nimport {SelectedFieldContext} from '../SelectedFieldContext'\n\nexport function InstructionOutputInput(props: ArrayOfObjectsInputProps) {\n const {fieldSchema} = useContext(SelectedFieldContext) ?? {}\n\n if (!fieldSchema) {\n return null\n }\n\n if (isObjectSchemaType(fieldSchema)) {\n return <ObjectOutputInput {...props} fieldSchema={fieldSchema} />\n }\n\n if (isArrayOfObjectsSchemaType(fieldSchema)) {\n return <ArrayOutputInput {...props} fieldSchema={fieldSchema} />\n }\n return null\n}\n\nfunction useEmptySelectAllValue(\n value: (OutputTypeItem | OutputFieldItem)[],\n allowedValues: {name: string}[],\n onChange: (patch: FormPatch | FormPatch[] | PatchEvent) => void,\n) {\n useEffect(() => {\n const validValues = value?.filter((v) =>\n allowedValues.find(\n (f) => f.name === (v._type === outputFieldTypeName ? v.relativePath : v.type),\n ),\n )\n const valueLength = value?.length ?? 0\n const validLength = validValues?.length ?? 0\n if ((!validLength && valueLength) || validLength >= allowedValues.length) {\n // if we end up here, we consider this a \"no selected fields/types\" selections. This should render and behave as all values selected.\n // we need this behaviour to accommodate new fields/types being added to the model, so they get visited by instructions without having to update the filter\n // when things have been explicitly selected, we let the selection remain as is\n onChange(PatchEvent.from([unset()]))\n }\n }, [allowedValues, value, onChange])\n}\n\nfunction ObjectOutputInput({\n fieldSchema,\n ...props\n}: ArrayOfObjectsInputProps & {fieldSchema: ObjectSchemaType}) {\n const {value, onChange} = props\n\n const fields = useMemo(\n () => fieldSchema.fields.filter((field) => isAssistSupported(field.type)),\n [fieldSchema.fields],\n )\n\n useEmptySelectAllValue(value as OutputTypeItem[], fields, onChange)\n\n const onSelectChange = useCallback(\n (checked: boolean, selectedValue: string) => {\n if (checked) {\n if (value?.length) {\n onChange(PatchEvent.from(unset([{_key: selectedValue}])))\n } else {\n // we went from empty array to everything selected but one\n const items = fields\n .filter((f) => f.name !== selectedValue)\n .map((field) =>\n typed<OutputFieldItem>({\n _key: field.name,\n _type: 'sanity.assist.output.field',\n relativePath: field.name,\n }),\n )\n onChange(PatchEvent.from([setIfMissing([]), insert(items, 'after', [-1])]))\n }\n } else {\n const patchValue: OutputFieldItem = {\n _key: selectedValue,\n _type: 'sanity.assist.output.field',\n relativePath: selectedValue,\n }\n onChange(PatchEvent.from([setIfMissing([]), insert([patchValue], 'after', [-1])]))\n }\n },\n [onChange, value, fields],\n )\n\n return (\n <Stack space={2}>\n {fields.map((field) => {\n return (\n <Flex key={field.name} align=\"center\" gap={2}>\n <Selectable\n value={field.name}\n title={field.type.title ?? field.name}\n arrayValue={value as OutputFieldItem[]}\n onChange={onSelectChange}\n />\n </Flex>\n )\n })}\n </Stack>\n )\n}\n\nfunction ArrayOutputInput({\n fieldSchema,\n ...props\n}: ArrayOfObjectsInputProps & {fieldSchema: ArraySchemaType}) {\n const {value, onChange} = props\n\n const ofItems = useMemo(\n () => fieldSchema.of.filter((itemType) => isAssistSupported(itemType)),\n [fieldSchema.of],\n )\n\n useEmptySelectAllValue(value as OutputTypeItem[], ofItems, onChange)\n\n const onSelectChange = useCallback(\n (checked: boolean, selectedValue: string) => {\n if (checked) {\n if (value?.length) {\n onChange(PatchEvent.from(unset([{_key: selectedValue}])))\n } else {\n // we went from empty array to everything selected but one\n const items = ofItems\n .filter((f) => f.name !== selectedValue)\n .map((field) =>\n typed<OutputTypeItem>({\n _key: field.name,\n _type: 'sanity.assist.output.type',\n type: field.name,\n }),\n )\n onChange(PatchEvent.from([setIfMissing([]), insert(items, 'after', [-1])]))\n }\n } else {\n const patchValue: OutputTypeItem = {\n _key: selectedValue,\n _type: 'sanity.assist.output.type',\n type: selectedValue,\n }\n onChange(PatchEvent.from([setIfMissing([]), insert([patchValue], 'after', [-1])]))\n }\n },\n [onChange, value, ofItems],\n )\n return (\n <Stack space={2}>\n {ofItems.map((itemType) => {\n return (\n <Flex key={itemType.name}>\n <Selectable\n value={itemType.name}\n title={isType(itemType, 'block') ? 'Text' : (itemType.title ?? itemType.name)}\n arrayValue={value as OutputTypeItem[] | undefined}\n onChange={onSelectChange}\n />\n </Flex>\n )\n })}\n </Stack>\n )\n}\n\nfunction Selectable({\n title,\n arrayValue,\n value,\n onChange,\n}: {\n title: string\n value: string\n arrayValue?: {_key: string}[]\n onChange: (checked: boolean, value: string) => void\n}) {\n const checked = !arrayValue?.length || !!arrayValue?.find((v) => v._key === value)\n const handleChange = useCallback(() => onChange(checked, value), [onChange, checked, value])\n\n return (\n <Flex gap={2} align=\"flex-start\">\n <Checkbox checked={checked} onChange={handleChange} />\n <Card marginTop={1} onClick={handleChange}>\n <Text style={{cursor: 'default'}} size={1}>\n {title}\n </Text>\n </Card>\n </Flex>\n )\n}\n","// Strict ESM env, designed to run outside Node.js in envs that provide WebCrypto (deno, browsers, etc)\n\nexport default function getRandomValues(typedArray) {\n const crypto =\n typeof window !== 'undefined' && 'crypto' in window\n ? window.crypto\n : globalThis.crypto\n\n if (!crypto || !crypto.getRandomValues) {\n throw new Error('WebCrypto not available in this environment')\n }\n\n return crypto.getRandomValues(typedArray)\n}\n","import getRandomValues from 'get-random-values-esm'\n\n// WHATWG crypto RNG - https://w3c.github.io/webcrypto/Overview.html\nfunction whatwgRNG(length = 16) {\n const rnds8 = new Uint8Array(length)\n getRandomValues(rnds8)\n return rnds8\n}\n\nconst getByteHexTable = (() => {\n let table: string[]\n return () => {\n if (table) {\n return table\n }\n table = []\n for (let i = 0; i < 256; ++i) {\n table[i] = (i + 0x100).toString(16).substring(1)\n }\n return table\n }\n})()\n\nexport function randomKey(length?: number) {\n const table = getByteHexTable()\n return whatwgRNG(length)\n .reduce((str, n) => str + table[n], '')\n .slice(0, length)\n}\n","import {Box} from '@sanity/ui'\nimport {useEffect} from 'react'\nimport {type ArrayOfObjectsInputProps, set, typed} from 'sanity'\nimport {styled} from 'styled-components'\n\nimport {randomKey} from '../../../_lib/randomKey'\nimport type {\n ContextBlock,\n FieldRef,\n PromptBlock,\n PromptTextBlock,\n UserInputBlock,\n} from '../../../types'\n\nconst PteMods = styled(Box)`\n & [data-testid='pt-editor__toolbar-card'] > div > div:last-child {\n display: none;\n }\n & [data-testid='pt-editor'] {\n min-height: 300px;\n }\n & [data-testid='pt-editor'] .pt-inline-object * {\n max-width: 400px;\n }\n`\n\nexport function PromptInput(props: ArrayOfObjectsInputProps) {\n // quickfixes the model (converts blocks to inline blocks for alpha customers)\n // backend supports both types, but this prevents \"missing block\" schema errors\n useOnlyInlineBlocks(props)\n return <PteMods>{props.renderDefault(props)}</PteMods>\n}\n\nfunction useOnlyInlineBlocks(props: ArrayOfObjectsInputProps) {\n useEffect(() => {\n let needsFix = false\n const val = ((props.value as PromptBlock[]) ?? []).map((block) => {\n if (block._type === 'block') {\n return block\n }\n\n needsFix = true\n return typed<PromptTextBlock>({\n _key: randomKey(12),\n _type: 'block',\n level: 0,\n markDefs: [],\n style: 'normal',\n children: [block as FieldRef | ContextBlock | UserInputBlock],\n })\n })\n\n if (needsFix) {\n props.onChange(set(val))\n }\n // only run this once when loading the field\n // eslint-disable-next-line\n }, [])\n}\n","import {ArrayFieldProps} from 'sanity'\n\nexport function InstructionsArrayField(props: ArrayFieldProps) {\n return props.renderDefault({\n ...props,\n title: ' ',\n })\n}\n","import {useMemo} from 'react'\nimport {ArrayOfObjectsInputProps, useCurrentUser} from 'sanity'\n\nimport {StudioInstruction} from '../../types'\n\nexport function InstructionsArrayInput(props: ArrayOfObjectsInputProps) {\n const user = useCurrentUser()\n\n const originalValue = props.value as StudioInstruction[] | undefined\n const originalMembers = props.members\n const value = useMemo(\n () => (originalValue ?? []).filter((v) => !v.userId || v.userId === user?.id),\n [originalValue, user],\n )\n const members = useMemo(\n () =>\n (originalMembers ?? []).filter((v) => {\n if (v.kind === 'error') {\n return true\n }\n const value = v?.item?.value as any\n return !value.userId || value.userId === user?.id\n }),\n [originalMembers, user],\n )\n return props.renderDefault({...props, value, members})\n}\n","import {Box} from '@sanity/ui'\nimport {useEffect, useRef} from 'react'\nimport {ObjectInputProps} from 'sanity'\n\nexport function HideReferenceChangedBannerInput(props: ObjectInputProps) {\n const ref = useRef<HTMLDivElement>(null)\n\n // hides \"reference was changed\" banner (it is incorrectly flashing because the pane handler does not support the way wie use the assist pane)\n useEffect(() => {\n const parent = ref.current?.closest('[data-testid=\"pane-content\"]')\n if (!parent) {\n return\n }\n const style = document.createElement('style')\n const parentId = `id-${Math.random()}`.replace('.', '-')\n parent.id = parentId\n\n style.innerText = `\n #${parentId} [data-testid=\"reference-changed-banner\"] { display: none; }\n `\n parent.prepend(style)\n }, [ref])\n\n return <Box ref={ref}>{props.renderDefault(props)}</Box>\n}\n","import {DocumentTextIcon, TokenIcon} from '@sanity/icons'\nimport {defineArrayMember, defineField, defineType} from 'sanity'\n\nimport {HideReferenceChangedBannerInput} from '../components/HideReferenceChangedBannerInput'\nimport {contextDocumentTypeName} from '../types'\n\nexport const contextDocumentSchema = defineType({\n type: 'document',\n name: contextDocumentTypeName,\n title: 'AI context',\n liveEdit: true,\n icon: TokenIcon,\n components: {\n input: HideReferenceChangedBannerInput,\n },\n fields: [\n defineField({\n type: 'string',\n name: 'title',\n title: 'Title',\n }),\n defineField({\n name: 'context',\n type: 'array',\n title: 'Context',\n of: [\n defineArrayMember({\n type: 'block',\n styles: [{title: 'Normal', value: 'normal'}],\n lists: [],\n marks: {\n decorators: [],\n annotations: [],\n },\n }),\n ],\n }),\n ],\n preview: {\n select: {\n title: 'title',\n context: 'context',\n },\n prepare({title, context}) {\n const text = context\n ?.flatMap((block: any) => block?.children)\n .flatMap((child: any) => child?.text?.split(' '))\n .filter(Boolean)\n const words = text?.length ?? 0\n return {\n title,\n subtitle: `Words: ${words}`,\n media: DocumentTextIcon,\n }\n },\n },\n})\n","import {\n ArrowRightIcon,\n CodeIcon,\n ComposeIcon,\n icons,\n IconSymbol,\n LockIcon,\n SparklesIcon,\n ThListIcon,\n} from '@sanity/icons'\nimport {Box, Flex, Stack, Text, Tooltip} from '@sanity/ui'\nimport {createElement} from 'react'\nimport {defineArrayMember, defineField, defineType, ObjectSchemaType} from 'sanity'\n\nimport {AssistDocumentForm} from '../assistDocument/components/AssistDocumentForm'\nimport {FieldRefPreview} from '../assistDocument/components/FieldRefPreview'\nimport {HiddenFieldTitle} from '../assistDocument/components/generic/HiddenFieldTitle'\nimport {IconInput} from '../assistDocument/components/instruction/appearance/IconInput'\nimport {InstructionVisibility} from '../assistDocument/components/instruction/appearance/InstructionVisibility'\nimport {FieldRefPathInput} from '../assistDocument/components/instruction/FieldRefInput'\nimport {InstructionInput} from '../assistDocument/components/instruction/InstructionInput'\nimport {InstructionOutputField} from '../assistDocument/components/instruction/InstructionOutputField'\nimport {InstructionOutputInput} from '../assistDocument/components/instruction/InstructionOutputInput'\nimport {PromptInput} from '../assistDocument/components/instruction/PromptInput'\nimport {InstructionsArrayField} from '../assistDocument/components/InstructionsArrayField'\nimport {InstructionsArrayInput} from '../assistDocument/components/InstructionsArrayInput'\nimport {getFieldRefsWithDocument} from '../assistInspector/helpers'\nimport {instructionGuideUrl} from '../constants'\nimport {getInstructionTitle} from '../helpers/misc'\nimport {\n assistDocumentIdPrefix,\n assistDocumentTypeName,\n assistFieldTypeName,\n assistTasksStatusTypeName,\n fieldReferenceTypeName,\n instructionContextTypeName,\n instructionTaskTypeName,\n instructionTypeName,\n outputFieldTypeName,\n outputTypeTypeName,\n promptTypeName,\n userInputTypeName,\n} from '../types'\nimport {contextDocumentSchema} from './contextDocumentSchema'\n\nexport const fieldReference = defineType({\n type: 'object',\n name: fieldReferenceTypeName,\n title: 'Field',\n icon: ThListIcon,\n\n fields: [\n defineField({\n type: 'string',\n name: 'path',\n title: 'Field',\n components: {\n input: FieldRefPathInput,\n },\n validation: (rule) =>\n rule.custom((value, context) => {\n if (!value) {\n return 'Please select a field'\n }\n try {\n const docId = context.document?._id\n if (!docId) {\n return `Field reference cannot be used outside document inspector context. Could not resolve document id.`\n }\n const targetDocType = docId.replace(new RegExp(`^${assistDocumentIdPrefix}`), '')\n const schema = context.schema.get(targetDocType)\n if (!schema) {\n return `Field reference cannot be used outside document inspector context. Could not resolve schema: ${targetDocType}`\n }\n const refs = getFieldRefsWithDocument(schema as ObjectSchemaType)\n const fieldRef = refs.find((r) => r.key === value)\n if (!fieldRef) {\n return `Field with path \"${value}\" does not exist in the schema.`\n }\n return true\n } catch (e) {\n console.error('Failed to resolve field reference', e)\n return 'Invalid field reference.'\n }\n }),\n }),\n ],\n preview: {\n select: {\n path: 'path',\n },\n prepare({path}) {\n return {\n title: path,\n path,\n icon: CodeIcon,\n }\n },\n },\n components: {\n preview: FieldRefPreview,\n },\n options: {\n modal: {\n type: 'popover',\n },\n },\n})\n\nexport const userInput = defineType({\n type: 'object',\n name: userInputTypeName,\n title: 'User input',\n icon: ComposeIcon,\n fields: [\n defineField({\n type: 'string',\n name: 'message',\n title: 'User input title',\n placeholder: 'Provide instruction text',\n description: 'The header above the user input text field',\n validation: (rule) => rule.required(),\n }),\n defineField({\n type: 'text',\n rows: 3,\n name: 'description',\n title: 'User input description',\n description: 'The description above the user input text field',\n }),\n ],\n preview: {\n select: {\n title: 'message',\n },\n },\n options: {\n modal: {\n type: 'popover',\n width: 1,\n },\n },\n})\n\nexport const promptContext = defineType({\n type: 'object',\n name: instructionContextTypeName,\n title: contextDocumentSchema.title,\n icon: contextDocumentSchema.icon,\n fields: [\n defineField({\n type: 'reference',\n name: 'reference',\n to: [{type: contextDocumentSchema.name}],\n title: 'Context',\n description: 'The referenced context will be inserted into the instruction',\n validation: (rule) => rule.required(),\n components: {\n input: function Fix(props) {\n return <Box style={{maxWidth: 300}}>{props.renderDefault(props)}</Box>\n },\n },\n }),\n ],\n preview: {\n select: {\n ref: 'reference._ref',\n title: 'reference.title',\n context: 'reference.context',\n },\n prepare(select) {\n return select.ref\n ? (contextDocumentSchema?.preview?.prepare?.(select) ?? select)\n : {title: 'No reference selected', media: contextDocumentSchema.icon}\n },\n },\n options: {\n modal: {\n type: 'popover',\n width: 'auto',\n },\n },\n})\n\nexport const prompt = defineType({\n type: 'array',\n name: promptTypeName,\n title: 'Prompt',\n of: [\n defineArrayMember({\n type: 'block',\n styles: [{title: 'Normal', value: 'normal'}],\n lists: [],\n marks: {\n decorators: [],\n annotations: [],\n },\n of: [\n defineArrayMember({\n type: fieldReference.name,\n }),\n defineArrayMember({\n type: promptContext.name,\n }),\n defineArrayMember({\n type: userInput.name,\n }),\n ],\n }),\n /* defineArrayMember({\n type: fieldReference.name,\n }),\n defineArrayMember({\n type: promptContext.name,\n }),\n defineArrayMember({\n type: userInput.name,\n }),*/\n ],\n})\n\nexport const outputFieldType = defineType({\n type: 'object',\n name: outputFieldTypeName,\n title: 'Output field',\n fields: [\n defineField({\n type: 'string',\n name: 'path',\n title: 'Path',\n }),\n ],\n})\n\nexport const outputTypeType = defineType({\n type: 'object',\n name: outputTypeTypeName,\n title: 'Output type',\n fields: [\n defineField({\n type: 'string',\n name: 'type',\n title: 'Type',\n }),\n ],\n})\n\nexport const instruction = defineType({\n type: 'object',\n name: instructionTypeName,\n title: 'Instruction',\n fieldsets: [\n {name: 'appearance', title: 'Appearance', options: {collapsible: true, collapsed: true}},\n ],\n preview: {\n select: {\n icon: 'icon',\n title: 'title',\n userId: 'userId',\n },\n prepare: ({icon, title, userId}) => {\n return {\n title,\n icon: icon ? icons[icon as IconSymbol] : SparklesIcon,\n userId,\n }\n },\n },\n components: {\n input: InstructionInput,\n preview: (props: any) => {\n return (\n <Flex gap={3} align=\"center\" padding={2}>\n {props.icon && (\n <Box flex=\"none\">\n <Text size={1}>{createElement(props.icon)}</Text>\n </Box>\n )}\n\n <Stack flex={1} space={2}>\n <Text size={1} textOverflow=\"ellipsis\" weight=\"medium\">\n {getInstructionTitle(props)}\n </Text>\n </Stack>\n\n {props.userId && (\n <Text size={1}>\n <Tooltip\n content={<Text size={1}>Only visible to you</Text>}\n padding={2}\n placement=\"top\"\n portal\n >\n <LockIcon />\n </Tooltip>\n </Text>\n )}\n </Flex>\n )\n },\n },\n fields: [\n defineField({\n type: prompt.name,\n name: 'prompt',\n title: 'Instruction',\n description: (\n <>\n Learn from{' '}\n <a href={instructionGuideUrl} target=\"_blank\" rel=\"noreferrer\">\n our instruction guide <ArrowRightIcon />\n </a>\n </>\n ),\n components: {\n input: PromptInput,\n },\n }),\n defineField({\n type: 'string',\n name: 'icon',\n title: 'Icon',\n fieldset: 'appearance',\n components: {\n field: HiddenFieldTitle,\n input: IconInput,\n },\n }),\n defineField({\n type: 'string',\n name: 'title',\n title: 'Title',\n fieldset: 'appearance',\n components: {\n field: HiddenFieldTitle,\n },\n }),\n defineField({\n type: 'string',\n name: 'userId',\n title: 'Visibility',\n fieldset: 'appearance',\n components: {\n field: HiddenFieldTitle,\n input: InstructionVisibility,\n },\n initialValue: (params, context) => context.currentUser?.id ?? '',\n readOnly: (context) =>\n Boolean(\n context.parent?.createdById && context.parent?.createdById !== context.currentUser?.id,\n ),\n }),\n defineField({\n type: 'string',\n name: 'createdById',\n title: 'Created by',\n hidden: true,\n fieldset: 'appearance',\n initialValue: (params, context) => {\n return context.currentUser?.id ?? ''\n },\n }),\n defineField({\n type: 'array',\n name: 'output',\n title: 'Output filter',\n components: {\n input: InstructionOutputInput,\n field: InstructionOutputField,\n },\n of: [\n defineArrayMember({type: outputFieldType.name}),\n defineArrayMember({type: outputTypeType.name}),\n ],\n }),\n ],\n})\n\nexport const fieldInstructions = defineType({\n type: 'object',\n name: assistFieldTypeName,\n title: 'Field prompt',\n /* components: {\n input: FieldPromptInput,\n },*/\n fields: [\n defineField({\n type: 'string',\n name: 'path',\n title: 'Path',\n readOnly: true,\n hidden: true,\n }),\n defineField({\n type: 'array',\n name: 'instructions',\n title: 'Instructions',\n of: [{type: instruction.name}],\n components: {\n field: InstructionsArrayField,\n input: InstructionsArrayInput,\n },\n }),\n ],\n preview: {\n select: {\n title: 'path',\n },\n },\n})\n\nexport const assistDocumentSchema = defineType({\n //NOTE: this is a document type. Using object here ensures it does not appear in structure menus\n type: 'object',\n //workaround for using object and not document\n ...({liveEdit: true} as any),\n name: assistDocumentTypeName,\n title: 'AI Document',\n\n components: {\n input: AssistDocumentForm,\n field: (props: any) => {\n return props.renderDefault({...props, title: ''})\n },\n },\n fields: [\n defineField({\n type: 'string',\n name: 'title',\n title: 'Title',\n }),\n defineField({\n type: 'array',\n name: 'fields',\n title: 'Fields',\n of: [{type: fieldInstructions.name}],\n }),\n ],\n preview: {\n select: {\n title: 'title',\n },\n },\n})\n\nexport const instructionTask = defineType({\n type: 'object',\n name: instructionTaskTypeName,\n title: 'Instruction task',\n fields: [\n defineField({\n type: 'string',\n name: 'path',\n title: 'Path',\n }),\n defineField({\n type: 'string',\n name: 'instructionKey',\n title: 'Instruction key',\n }),\n defineField({\n type: 'datetime',\n name: 'started',\n title: 'Started',\n }),\n defineField({\n type: 'datetime',\n name: 'updated',\n title: 'Updated',\n }),\n defineField({\n type: 'string',\n name: 'info',\n title: 'Info',\n }),\n ],\n})\n\nexport const documentInstructionStatus = defineType({\n //NOTE: this is a document type. Using object here ensures it does not appear in structure menus\n type: 'object',\n //workaround for using object and not document\n ...({liveEdit: true} as any),\n name: assistTasksStatusTypeName,\n title: 'Document instruction status',\n fields: [\n defineField({\n type: 'array',\n name: 'tasks',\n title: 'Tasks',\n of: [{type: instructionTask.name}],\n }),\n ],\n})\n","/* eslint-disable camelcase */\nimport {ArrayOfType, FieldProps, SchemaTypeDefinition} from 'sanity'\n\nimport {\n assistDocumentSchema,\n documentInstructionStatus,\n fieldInstructions,\n fieldReference,\n instruction,\n instructionTask,\n outputFieldType,\n outputTypeType,\n prompt,\n promptContext,\n userInput,\n} from './assistDocumentSchema'\nimport {contextDocumentSchema} from './contextDocumentSchema'\n\nfunction excludeComments<T extends SchemaTypeDefinition | ArrayOfType>(type: T): T {\n const existingRender = (type as any)?.components?.field\n return {\n ...type,\n ...('components' in type\n ? {\n components: {\n ...type.components,\n field: (props: FieldProps) => {\n const newProps = {...props, ...{__internal_comments: undefined}}\n if (typeof existingRender === 'function') {\n return existingRender(newProps)\n }\n return props.renderDefault(newProps)\n },\n },\n }\n : {}),\n ...('fields' in type\n ? {\n // recursively disable comments in fields\n fields: type.fields?.map((field) => excludeComments(field)),\n }\n : {}),\n ...('of' in type\n ? {\n // recursively disable comments in array items\n of: type.of?.map((arrayItemType) => excludeComments(arrayItemType)),\n }\n : {}),\n }\n}\n\nconst instructionForm = [\n fieldInstructions,\n instruction,\n fieldReference,\n prompt,\n userInput,\n promptContext,\n].map(excludeComments)\n\nexport const schemaTypes = [\n ...instructionForm,\n outputFieldType,\n outputTypeType,\n assistDocumentSchema,\n documentInstructionStatus,\n instructionTask,\n contextDocumentSchema,\n]\n","import type {SanityClient} from '@sanity/client'\nimport {definePlugin, isObjectSchemaType} from 'sanity'\n\nimport {AssistDocumentInputWrapper} from './assistDocument/AssistDocumentInput'\nimport {AssistDocumentLayout} from './assistDocument/AssistDocumentLayout'\nimport {AssistFieldWrapper} from './assistFormComponents/AssistField'\nimport {AssistFormBlock} from './assistFormComponents/AssistFormBlock'\nimport {AssistInlineFormBlock} from './assistFormComponents/AssistInlineFormBlock'\nimport {AssistItem} from './assistFormComponents/AssistItem'\nimport {assistInspector} from './assistInspector'\nimport {AssistLayout} from './assistLayout/AssistLayout'\nimport {AssistConfig} from './assistTypes'\nimport {ImageContextProvider} from './components/ImageContext'\nimport {SafeValueInput} from './components/SafeValueInput'\nimport {packageName} from './constants'\nimport {assistFieldActions} from './fieldActions/assistFieldActions'\nimport {isSchemaAssistEnabled} from './helpers/assistSupported'\nimport {validateStyleguide} from './helpers/styleguide'\nimport {isImage} from './helpers/typeUtils'\nimport {createAssistDocumentPresence} from './presence/AssistDocumentPresence'\nimport {schemaTypes} from './schemas'\nimport {TranslationConfig} from './translate/types'\nimport {assistDocumentTypeName, AssistPreset} from './types'\n\nexport interface AssistPluginConfig {\n translate?: TranslationConfig\n\n /**\n * Config that affects all instructions\n */\n assist?: AssistConfig\n\n /**\n * @internal\n */\n __customApiClient?: (defaultClient: SanityClient) => SanityClient\n\n /**\n * @internal\n */\n __presets?: Record<string, AssistPreset>\n}\n\nexport const assist = definePlugin<AssistPluginConfig | void>((config) => {\n const configWithDefaults = config ?? {}\n const styleguide = configWithDefaults.translate?.styleguide || ''\n const maxPathDepth = configWithDefaults.assist?.maxPathDepth\n const temperature = configWithDefaults.assist?.temperature\n\n if (typeof styleguide === 'string') {\n validateStyleguide(styleguide)\n }\n\n if (maxPathDepth !== undefined && (maxPathDepth < 1 || maxPathDepth > 12)) {\n throw new Error(\n `[${packageName}]: \\`assist.maxPathDepth\\` must be be in the range [1,12] inclusive, but was ${maxPathDepth}`,\n )\n }\n\n if (temperature !== undefined && (temperature < 0 || temperature > 1)) {\n throw new Error(\n `[${packageName}]: \\`assist.maxPathDepth\\` must be be in the range [0,1] inclusive, but was ${temperature}`,\n )\n }\n\n return {\n name: packageName,\n // the addition of global references broke auto updating studios\n // new versions of studio know to look for this prop on assist plugin, and filter + console.warn if it is missing\n ...({handlesGDR: true} as any),\n schema: {\n types: schemaTypes,\n },\n i18n: {\n bundles: [{}],\n },\n\n document: {\n inspectors: (prev, context) => {\n const documentType = context.documentType\n const docSchema = context.schema.get(documentType)\n if (docSchema && isSchemaAssistEnabled(docSchema)) {\n return [...prev, assistInspector]\n }\n return prev\n },\n unstable_fieldActions: (prev, {documentType, schema}) => {\n if (documentType === assistDocumentTypeName) {\n return []\n }\n const docSchema = schema.get(documentType)\n if (docSchema && isSchemaAssistEnabled(docSchema)) {\n return [...prev, assistFieldActions]\n }\n return prev\n },\n unstable_languageFilter: (prev, {documentId, schema, schemaType}) => {\n if (schemaType === assistDocumentTypeName) {\n return []\n }\n const docSchema = schema.get(schemaType)\n if (docSchema && isObjectSchemaType(docSchema) && isSchemaAssistEnabled(docSchema)) {\n return [...prev, createAssistDocumentPresence(documentId)]\n }\n return prev\n },\n components: {\n unstable_layout: AssistDocumentLayout,\n },\n },\n\n studio: {\n components: {\n layout: function Layout(props) {\n return <AssistLayout {...props} config={configWithDefaults} />\n },\n },\n },\n\n form: {\n components: {\n input: AssistDocumentInputWrapper,\n field: AssistFieldWrapper,\n item: AssistItem,\n block: AssistFormBlock,\n inlineBlock: AssistInlineFormBlock,\n },\n },\n\n plugins: [\n definePlugin({\n name: `${packageName}/safe-value-input`,\n form: {components: {input: SafeValueInput}},\n })(),\n\n definePlugin({\n name: `${packageName}/generate-caption`,\n form: {\n components: {\n input: (props) => {\n const {schemaType} = props\n\n if (isImage(schemaType)) {\n return <ImageContextProvider {...props} />\n }\n return props.renderDefault(props)\n },\n },\n },\n })(),\n ],\n }\n})\n","import type {SanityClient} from '@sanity/client'\nimport {defer, delay, merge, Observable, of, partition, switchMap, throwError} from 'rxjs'\nimport {filter, mergeMap, share, take} from 'rxjs/operators'\nimport {exhaustMapToWithTrailing} from 'rxjs-exhaustmap-with-trailing'\nimport {MutationEvent, ReconnectEvent, WelcomeEvent} from 'sanity'\n\n/** @internal */\nexport type ListenQueryParams = Record<string, string | number | boolean | string[]>\n\n/** @beta */\nexport interface ListenQueryOptions {\n tag?: string\n apiVersion?: string\n throttleTime?: number\n transitions?: ('update' | 'appear' | 'disappear')[]\n}\n\nconst fetch = (\n client: SanityClient,\n query: string,\n params: ListenQueryParams,\n options: ListenQueryOptions,\n) =>\n defer(() =>\n // getVersionedClient(options.apiVersion)\n client.observable.fetch(query, params, {\n tag: options.tag,\n filterResponse: true,\n }),\n )\n\nconst listen = (\n client: SanityClient,\n query: string,\n params: ListenQueryParams,\n options: ListenQueryOptions,\n) =>\n defer(() =>\n // getVersionedClient(options.apiVersion)\n client.listen(query, params, {\n events: ['welcome', 'mutation', 'reconnect'],\n includeResult: false,\n visibility: 'query',\n tag: options.tag,\n }),\n ) as Observable<ReconnectEvent | WelcomeEvent | MutationEvent>\n\nfunction isWelcomeEvent(\n event: MutationEvent | ReconnectEvent | WelcomeEvent,\n): event is WelcomeEvent {\n return event.type === 'welcome'\n}\n\n/** @internal */\nexport const listenQuery = (\n client: SanityClient,\n query: string | {fetch: string; listen: string},\n params: ListenQueryParams = {},\n options: ListenQueryOptions = {},\n) => {\n const fetchQuery = typeof query === 'string' ? query : query.fetch\n const listenerQuery = typeof query === 'string' ? query : query.listen\n\n const fetchOnce$ = fetch(client, fetchQuery, params, options)\n\n const events$ = listen(client, listenerQuery, params, options).pipe(\n mergeMap((ev, i) => {\n const isFirst = i === 0\n if (isFirst && !isWelcomeEvent(ev)) {\n // if the first event is not welcome, it is most likely a reconnect and\n // if it's not a reconnect something is very wrong\n return throwError(\n new Error(\n ev.type === 'reconnect'\n ? 'Could not establish EventSource connection'\n : `Received unexpected type of first event \"${ev.type}\"`,\n ),\n )\n }\n return of(ev)\n }),\n share(),\n )\n\n const [welcome$, mutationAndReconnect$] = partition(events$, isWelcomeEvent)\n const isRelevantEvent = (event: MutationEvent | ReconnectEvent | WelcomeEvent): boolean => {\n if (!options.transitions || event.type !== 'mutation') {\n return true\n }\n\n return options.transitions.includes(event.transition)\n }\n\n return merge(\n welcome$.pipe(take(1)),\n mutationAndReconnect$.pipe(\n filter(isRelevantEvent),\n switchMap((event) => merge(of(event), of(event).pipe(delay(options.throttleTime || 1000)))),\n ),\n ).pipe(exhaustMapToWithTrailing(fetchOnce$))\n}\n","import {useEffect, useRef, useState} from 'react'\nimport isEqual from 'react-fast-compare'\nimport {catchError, distinctUntilChanged} from 'rxjs/operators'\nimport {ListenQueryOptions, useClient} from 'sanity'\n\nimport {listenQuery} from './fixedListenQuery'\n\ntype Params = Record<string, string | number | boolean | string[]>\n\ntype ReturnShape<T> = {\n loading: boolean\n error: boolean\n data: T | null\n}\n\ntype Observable = {\n unsubscribe: () => void\n}\n\nconst DEFAULT_PARAMS = {}\nconst DEFAULT_OPTIONS: ListenQueryOptions = {apiVersion: `v2022-05-09`}\n\nexport function useListeningQuery<T>(\n query: string,\n params: Params = DEFAULT_PARAMS,\n options: ListenQueryOptions = DEFAULT_OPTIONS,\n): ReturnShape<T> {\n const [loading, setLoading] = useState(true)\n const [error, setError] = useState(false)\n const [data, setData] = useState<T | null>(null)\n const subscription = useRef<null | Observable>(null)\n\n const client = useClient({apiVersion: `v2022-05-09`})\n\n useEffect(() => {\n if (query) {\n subscription.current = listenQuery(client, query, params, options)\n .pipe(\n distinctUntilChanged(isEqual),\n catchError((err) => {\n console.error(err)\n setError(err)\n setLoading(false)\n setData(null)\n\n return err\n }),\n )\n .subscribe((documents) => {\n setData((current) => (isEqual(current, documents) ? current : documents))\n setLoading(false)\n setError(false)\n })\n }\n\n return () => {\n return subscription.current ? subscription.current.unsubscribe() : undefined\n }\n }, [query, params, options, client])\n\n return {loading, error, data}\n}\n","import {SyncIcon} from '@sanity/icons'\nimport {Box, Button, Card, Flex, Label, Spinner, Stack} from '@sanity/ui'\nimport {useCallback, useMemo, useState} from 'react'\nimport {useClient, useSchema} from 'sanity'\n\nimport {useListeningQuery} from '../../_lib/useListeningQuery'\nimport {assistSerializedTypeName, SerializedSchemaType} from '../../types'\nimport {serializeSchema} from './serializeSchema'\n\nconst NO_DATA: SerializedSchemaType[] = []\n\nconst defaultTitle = 'Sync schema'\n\nexport function SchemaTypeTool() {\n const schema = useSchema()\n const client = useClient({apiVersion: '2023-01-01'})\n const [saving, setSaving] = useState(false)\n const [syncTitle, setSyncTitle] = useState(defaultTitle)\n\n const {data} = useListeningQuery<SerializedSchemaType[]>('*[_type==$type] | order(_type)', {\n type: assistSerializedTypeName,\n })\n\n const types = useMemo(() => {\n return serializeSchema(schema)\n }, [schema])\n\n const storeTypes = useCallback(() => {\n setSaving(true)\n let canSave = true\n async function store() {\n setSyncTitle(`Syncing 0/${types.length}`)\n const transaction = client.transaction()\n for (let i = 0; i < types.length; i++) {\n if (!canSave) {\n break\n }\n const type = types[i]\n await transaction.createOrReplace(type as Required<typeof type>)\n if (i > 0 && i % 50 === 0) {\n await transaction.commit()\n transaction.reset()\n setSyncTitle(`Syncing ${i}/${types.length}`)\n }\n }\n await transaction.commit()\n }\n store()\n .catch(console.error)\n .finally(() => {\n setSaving(false)\n setSyncTitle(defaultTitle)\n })\n return () => {\n canSave = false\n setSaving(false)\n setSyncTitle(defaultTitle)\n }\n }, [types, client, setSaving, setSyncTitle])\n\n return (\n <Card padding={4} overflow=\"auto\" style={{height: 'calc(100vh - 81px)'}}>\n <Stack space={4}>\n <Box>\n <Button\n icon={saving ? <Spinner style={{marginTop: 5}} /> : SyncIcon}\n text={syncTitle}\n disabled={saving}\n onClick={storeTypes}\n />\n </Box>\n <Flex gap={2}>\n <Stack space={2}>\n <Label>Studio schema</Label>\n <ul>\n {types.map((type) => (\n <li key={type.name}>\n <SchemaEntry schemaStub={type} />\n </li>\n ))}\n </ul>\n </Stack>\n\n <Stack space={2}>\n <Label>Stored schema</Label>\n <ul>\n {(data ?? NO_DATA).map((type) => (\n <li key={type.name}>\n <SchemaEntry schemaStub={type} />\n </li>\n ))}\n </ul>\n </Stack>\n </Flex>\n </Stack>\n </Card>\n )\n}\n\nfunction SchemaEntry({schemaStub}: {schemaStub: SerializedSchemaType}) {\n const out = useMemo(() => JSON.stringify(schemaStub, null, 2), [schemaStub])\n return <pre>{out}</pre>\n}\n"],"names":["scrollParent","options","instruction","status","isDocAssistable","catchError","DEFAULT_MAX_DEPTH","ABSOLUTE_MAX_DEPTH","maxDepth","filter","basePath","document","languages","toLanguages","fromLanguage","assistDocumentId","anyPresence","value"],"mappings":"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","x_google_ignoreList":[37,85]}
1
+ {"version":3,"file":"index.esm.js","sources":["../src/_lib/connector/helpers.ts","../src/_lib/connector/useRegionRects.ts","../src/_lib/connector/ConnectorRegion.tsx","../src/_lib/connector/ConnectorsStoreContext.ts","../src/_lib/connector/useConnectorsStore.ts","../src/_lib/connector/ConnectFromRegion.tsx","../src/_lib/connector/ConnectorsStore.ts","../src/_lib/connector/ConnectorsProvider.tsx","../src/_lib/connector/mapConnectorToLine.ts","../src/_lib/form/constants.ts","../src/types.ts","../src/helpers/misc.ts","../src/helpers/typeUtils.ts","../src/helpers/assistSupported.ts","../src/onboarding/FirstAssistedPathProvider.tsx","../src/constants.ts","../src/helpers/ids.ts","../src/assistDocument/hooks/useDocumentState.ts","../src/assistDocument/hooks/useStudioAssistDocument.ts","../src/assistDocument/hooks/useInstructionToaster.tsx","../src/assistDocument/AssistDocumentInput.tsx","../src/assistDocument/AssistDocumentContext.tsx","../src/assistDocument/components/SelectedFieldContext.tsx","../src/assistInspector/helpers.ts","../src/assistLayout/AiAssistanceConfigContext.tsx","../src/schemas/serialize/schemaUtils.ts","../src/schemas/serialize/serializeSchema.ts","../src/useApiClient.ts","../src/assistLayout/RunInstructionProvider.tsx","../src/assistDocument/RequestRunInstructionProvider.tsx","../src/assistDocument/hooks/useAssistDocumentContextValue.tsx","../src/assistDocument/AssistDocumentContextProvider.tsx","../src/assistDocument/AssistDocumentLayout.tsx","../src/components/AssistFeatureBadge.tsx","../src/onboarding/FieldActionsOnboarding.tsx","../src/onboarding/onboardingStore.ts","../src/components/FadeInContent.tsx","../../node_modules/@sanity/color/dist/index.js","../src/presence/AssistAvatar.tsx","../src/presence/AiFieldPresence.tsx","../src/presence/useAssistPresence.ts","../src/assistFormComponents/AssistField.tsx","../src/components/SafeValueInput.tsx","../src/assistFormComponents/AssistFormBlock.tsx","../src/assistFormComponents/AssistInlineFormBlock.tsx","../src/assistFormComponents/AssistItem.tsx","../src/_lib/form/DocumentForm.tsx","../src/assistDocument/components/AssistTypeContext.tsx","../src/helpers/conditionalMembers.ts","../src/onboarding/InspectorOnboarding.tsx","../src/assistInspector/FieldAutocomplete.tsx","../src/components/TimeAgo.tsx","../src/assistInspector/InstructionTaskHistoryButton.tsx","../src/assistInspector/AssistInspector.tsx","../src/assistInspector/constants.ts","../src/assistInspector/index.ts","../src/assistConnectors/draw/arrowPath.ts","../src/assistConnectors/draw/connectorPath.ts","../src/assistConnectors/ConnectorPath.tsx","../src/assistConnectors/AssistConnectorsOverlay.tsx","../src/helpers/styleguide.ts","../src/translate/getLanguageParams.ts","../src/translate/languageStore.ts","../src/translate/paths.ts","../src/translate/FieldTranslationProvider.tsx","../src/assistLayout/AssistLayout.tsx","../src/components/ImageContext.tsx","../src/assistDocument/components/instruction/appearance/IconInput.tsx","../src/helpers/useAssistSupported.ts","../src/translate/translateActions.tsx","../src/fieldActions/generateCaptionActions.tsx","../src/fieldActions/generateImageActions.tsx","../src/fieldActions/PrivateIcon.tsx","../../node_modules/get-random-values-esm/index.mjs","../src/_lib/randomKey.ts","../src/fieldActions/customFieldActions.tsx","../src/fieldActions/assistFieldActions.tsx","../src/presence/AssistDocumentPresence.tsx","../src/assistDocument/components/instruction/BackToInstructionsLink.tsx","../src/assistDocument/components/AssistDocumentForm.tsx","../src/assistDocument/components/FieldRefPreview.tsx","../src/assistDocument/components/generic/HiddenFieldTitle.tsx","../src/assistDocument/components/instruction/appearance/InstructionVisibility.tsx","../src/assistDocument/components/instruction/FieldRefInput.tsx","../src/assistDocument/components/helpers.ts","../src/assistDocument/components/instruction/InstructionInput.tsx","../src/assistDocument/components/instruction/InstructionOutputField.tsx","../src/assistDocument/components/instruction/InstructionOutputInput.tsx","../src/assistDocument/components/instruction/PromptInput.tsx","../src/assistDocument/components/InstructionsArrayField.tsx","../src/assistDocument/components/InstructionsArrayInput.tsx","../src/components/HideReferenceChangedBannerInput.tsx","../src/schemas/contextDocumentSchema.tsx","../src/schemas/assistDocumentSchema.tsx","../src/schemas/index.ts","../src/plugin.tsx","../src/_lib/fixedListenQuery.ts","../src/_lib/useListeningQuery.ts","../src/schemas/serialize/SchemTypeTool.tsx","../src/fieldActions/useUserInput.ts"],"sourcesContent":["export function hasOverflowScroll(el: HTMLElement): boolean {\n const overflow = getComputedStyle(el).overflow\n\n return overflow.includes('auto') || overflow.includes('hidden') || overflow.includes('scroll')\n}\n","import {useEffect, useMemo, useRef, useState} from 'react'\n\nimport {hasOverflowScroll} from './helpers'\nimport {Rect, Scroll} from './types'\n\nexport function useRegionRects() {\n const ref = useRef<HTMLDivElement>(null)\n\n const [relativeBoundsRect, setRelativeBoundsRect] = useState<Rect | null>(null)\n const [relativeElementRect, setRelativeElementRect] = useState<Rect | null>(null)\n const [boundsScroll, setBoundsScroll] = useState<Scroll>({x: 0, y: 0})\n const [scroll, setScroll] = useState<Scroll>({x: 0, y: 0})\n\n const boundsScrollXRef = useRef(0)\n const boundsScrollYRef = useRef(0)\n\n const elementScrollXRef = useRef(0)\n const elementScrollYRef = useRef(0)\n\n useEffect(() => {\n const el = ref.current\n\n if (!el) return undefined\n\n const scrollParents: HTMLElement[] = []\n let parent = el.parentElement\n\n while (parent && parent !== document.body) {\n if (\n hasOverflowScroll(parent)\n // || parent.scrollHeight > parent.clientHeight\n ) {\n scrollParents.push(parent)\n }\n\n parent = parent.parentElement\n }\n\n function handleResize() {\n const scrollParent = scrollParents[0]\n\n const boundsRect = scrollParent?.getBoundingClientRect() || {\n x: 0,\n y: 0,\n width: window.innerWidth,\n height: window.innerHeight,\n }\n\n const domRect = el!.getBoundingClientRect()\n\n setRelativeBoundsRect({\n x: boundsRect.x + boundsScrollXRef.current,\n y: boundsRect.y + boundsScrollYRef.current,\n w: boundsRect.width,\n h: boundsRect.height,\n })\n\n setRelativeElementRect({\n x: domRect.x + elementScrollXRef.current,\n y: domRect.y + elementScrollYRef.current,\n w: domRect.width,\n h: domRect.height,\n })\n }\n\n function handleScroll() {\n let scrollX = window.scrollX\n let scrollY = window.scrollY\n\n for (const scrollParent of scrollParents) {\n scrollX += scrollParent.scrollLeft\n scrollY += scrollParent.scrollTop\n }\n\n const scrollParent = scrollParents[0]\n\n boundsScrollXRef.current = scrollX - (scrollParent?.scrollLeft || window.scrollX)\n\n boundsScrollYRef.current = scrollY - (scrollParent?.scrollTop || window.scrollY)\n\n setBoundsScroll({\n x: boundsScrollXRef.current,\n y: boundsScrollYRef.current,\n })\n\n elementScrollXRef.current = scrollX\n elementScrollYRef.current = scrollY\n\n setScroll({x: scrollX, y: scrollY})\n }\n\n window.addEventListener('scroll', handleScroll, {passive: true})\n\n const ro = new ResizeObserver(handleResize)\n\n ro.observe(el)\n\n for (const scrollParent of scrollParents) {\n scrollParent.addEventListener('scroll', handleScroll, {passive: true})\n ro.observe(scrollParent)\n }\n\n handleScroll()\n\n return () => {\n ro.unobserve(el)\n\n for (const scrollParent of scrollParents) {\n ro.unobserve(scrollParent)\n scrollParent.removeEventListener('scroll', handleScroll)\n }\n\n ro.disconnect()\n\n window.removeEventListener('scroll', handleScroll)\n }\n }, [])\n\n const bounds: Rect | null = useMemo(\n () =>\n relativeBoundsRect && {\n x: relativeBoundsRect.x - boundsScroll.x,\n y: relativeBoundsRect.y - boundsScroll.y,\n w: relativeBoundsRect.w,\n h: relativeBoundsRect.h,\n },\n [relativeBoundsRect, boundsScroll],\n )\n\n const element: Rect | null = useMemo(\n () =>\n relativeElementRect && {\n x: relativeElementRect.x - scroll.x,\n y: relativeElementRect.y - scroll.y,\n w: relativeElementRect.w,\n h: relativeElementRect.h,\n },\n [relativeElementRect, scroll],\n )\n\n return {bounds, element, ref}\n}\n","import {HTMLProps, useEffect} from 'react'\n\nimport {ConnectorRegionRects} from './types'\nimport {useRegionRects} from './useRegionRects'\n\nexport function ConnectorRegion(\n props: {\n onRectsChange?: (rects: ConnectorRegionRects | null) => void\n } & HTMLProps<HTMLDivElement>,\n) {\n const {children, onRectsChange, ...restProps} = props\n\n const {bounds, element, ref} = useRegionRects()\n\n useEffect(() => {\n onRectsChange?.(bounds && element ? {bounds, element} : null)\n }, [bounds, element, onRectsChange])\n\n return (\n <div {...restProps} ref={ref}>\n {children}\n </div>\n )\n}\n","import {createContext} from 'react'\n\nimport {ConnectorsStore} from './ConnectorsStore'\n\nexport const ConnectorsStoreContext = createContext<ConnectorsStore | null>(null)\n","import {useContext} from 'react'\n\nimport {ConnectorsStore} from './ConnectorsStore'\nimport {ConnectorsStoreContext} from './ConnectorsStoreContext'\n\nexport function useConnectorsStore(): ConnectorsStore {\n const store = useContext(ConnectorsStoreContext)\n\n if (!store) {\n throw new Error('Missing connectors store context')\n }\n\n return store\n}\n","import {HTMLProps, useEffect, useState} from 'react'\n\nimport {ConnectorRegion} from './ConnectorRegion'\nimport {ConnectorRegionRects} from './types'\nimport {useConnectorsStore} from './useConnectorsStore'\n\nexport function ConnectFromRegion(\n props: {_key: string; zIndex: number} & HTMLProps<HTMLDivElement>,\n) {\n const {children, _key: key, zIndex, ...restProps} = props\n const store = useConnectorsStore()\n const [rects, setRects] = useState<ConnectorRegionRects | null>(null)\n\n useEffect(() => store.from.subscribe(key, {zIndex}), [key, store, zIndex])\n\n useEffect(() => {\n if (rects) store.from.next(key, rects)\n }, [key, rects, store])\n\n return (\n <ConnectorRegion {...restProps} onRectsChange={setRects}>\n {children}\n </ConnectorRegion>\n )\n}\n","import {Connector, ConnectorRegionRects} from './types'\n\nexport interface ConnectorsStore {\n connectors: {\n subscribe: (observer: (connectors: Connector[]) => void) => () => void\n }\n\n from: {\n subscribe: (key: string, payload?: Record<string, unknown>) => () => void\n next: (key: string, rects: ConnectorRegionRects) => void\n }\n\n to: {\n subscribe: (key: string, payload?: Record<string, unknown>) => () => void\n next: (key: string, rects: ConnectorRegionRects) => void\n }\n}\n\nexport function createConnectorsStore(): ConnectorsStore {\n const configKeys: string[] = []\n const fieldKeys: string[] = []\n\n const channels = {\n from: new Map<string, ConnectorRegionRects | null>(),\n to: new Map<string, ConnectorRegionRects | null>(),\n }\n\n const payloads = {\n from: new Map<string, Record<string, unknown> | undefined>(),\n to: new Map<string, Record<string, unknown> | undefined>(),\n }\n\n const observers: ((connectors: Connector[]) => void)[] = []\n\n function notifyObservers() {\n const connectors: Connector[] = []\n\n for (const key of configKeys) {\n const toRects = channels.to.get(key)\n const toPayload = payloads.from.get(key)\n\n const fromRects = channels.from.get(key)\n const fromPayload = payloads.from.get(key)\n\n if (toRects && fromRects) {\n connectors.push({\n key,\n from: {...fromRects, payload: fromPayload},\n to: {...toRects, payload: toPayload},\n })\n }\n }\n\n for (const observer of observers) {\n observer(connectors)\n }\n }\n\n return {\n to: {\n subscribe(key, payload) {\n channels.to.set(key, null)\n payloads.to.set(key, payload)\n\n configKeys.push(key)\n\n return () => {\n channels.to.delete(key)\n payloads.to.delete(key)\n\n const idx = configKeys.indexOf(key)\n\n if (idx > -1) configKeys.splice(idx, 1)\n\n notifyObservers()\n }\n },\n next(key, rects) {\n channels.to.set(key, rects)\n\n if (fieldKeys.includes(key)) notifyObservers()\n },\n },\n\n connectors: {\n subscribe(observer) {\n observers.push(observer)\n\n return () => {\n const idx = observers.indexOf(observer)\n\n if (idx > -1) observers.splice(idx, 1)\n }\n },\n },\n\n from: {\n subscribe(key, payload) {\n channels.from.set(key, null)\n payloads.from.set(key, payload)\n\n fieldKeys.push(key)\n\n return () => {\n channels.from.delete(key)\n payloads.from.delete(key)\n\n const idx = fieldKeys.indexOf(key)\n\n if (idx > -1) fieldKeys.splice(idx, 1)\n\n notifyObservers()\n }\n },\n next(key, rects) {\n channels.from.set(key, rects)\n\n if (configKeys.includes(key)) notifyObservers()\n },\n },\n }\n}\n","import {ReactNode, useEffect, useMemo} from 'react'\n\nimport {ConnectorsStore, createConnectorsStore} from './ConnectorsStore'\nimport {ConnectorsStoreContext} from './ConnectorsStoreContext'\nimport {Connector} from './types'\n\nexport function ConnectorsProvider(props: {\n children?: ReactNode\n onConnectorsChange?: (connectors: Connector[]) => void\n}) {\n const {children, onConnectorsChange} = props\n const store: ConnectorsStore = useMemo(() => createConnectorsStore(), [])\n\n useEffect(\n () => onConnectorsChange && store.connectors.subscribe(onConnectorsChange),\n [onConnectorsChange, store],\n )\n\n return <ConnectorsStoreContext.Provider value={store}>{children}</ConnectorsStoreContext.Provider>\n}\n","import {\n ConnectorLine,\n ConnectorLinePoint,\n ConnectorOptions,\n ConnectorRegionRects,\n Rect,\n} from './types'\n\nfunction getConnectorLinePoint(\n options: ConnectorOptions,\n rect: Rect,\n bounds: Rect,\n): ConnectorLinePoint {\n const centerY = rect.y + rect.h / 2\n const isAbove = rect.y + rect.h < bounds.y + options.arrow.marginY\n const isBelow = rect.y > bounds.y + bounds.h - options.arrow.marginY\n\n return {\n bounds,\n x: rect.x,\n y: centerY,\n centerY,\n startY: rect.y + options.path.marginY,\n endY: rect.y + rect.h - options.path.marginY,\n isAbove,\n isBelow,\n outOfBounds: isAbove || isBelow,\n }\n}\n\nexport function mapConnectorToLine(\n options: ConnectorOptions,\n connector: {from: ConnectorRegionRects; to: ConnectorRegionRects},\n): ConnectorLine {\n const fromBounds: Rect = {\n y: connector.from.bounds.y + options.arrow.threshold,\n // bottom: connector.from.bounds.y + connector.from.bounds.h - options.arrow.threshold,\n x: connector.from.bounds.x,\n // right: connector.from.bounds.x + connector.from.bounds.w,\n w: connector.from.bounds.w,\n h: connector.from.bounds.h - options.arrow.threshold * 2,\n }\n\n const from = getConnectorLinePoint(options, connector.from.element, fromBounds)\n from.x = connector.from.element.x + connector.from.element.w // + 1\n\n const fromBottom = fromBounds.y + fromBounds.h\n\n const toBounds: Rect = {\n y: connector.to.bounds.y + options.arrow.threshold,\n // bottom: connector.to.bounds.y + connector.to.bounds.h - options.arrow.threshold,\n x: connector.to.bounds.x,\n // right: connector.to.bounds.x + connector.to.bounds.w,\n w: connector.to.bounds.w,\n h: connector.to.bounds.h - options.arrow.threshold * 2,\n }\n\n const toBottom = toBounds.y + toBounds.h\n\n const to = getConnectorLinePoint(options, connector.to.element, toBounds)\n\n const maxStartY = Math.max(to.startY, from.startY)\n\n // Align from <-> to vertically\n from.y = Math.min(maxStartY, from.endY)\n if (from.y < toBounds.y) {\n from.y = Math.min(toBounds.y, from.endY)\n } else if (from.y > toBottom) {\n from.y = Math.max(toBottom, from.startY)\n }\n to.y = Math.min(maxStartY, to.endY)\n if (to.y < fromBounds.y) {\n to.y = Math.min(fromBounds.y, to.endY)\n } else if (to.y > fromBottom) {\n to.y = Math.max(fromBottom, to.startY)\n }\n\n // Keep within bounds\n from.y = Math.min(Math.max(from.y, fromBounds.y), fromBottom)\n to.y = Math.min(Math.max(to.y, toBounds.y), toBottom)\n\n return {from, to}\n}\n","export const assistFormId = 'assist'\n","import {PortableTextBlock, PortableTextMarkDefinition, PortableTextSpan} from '@portabletext/types'\nimport {SanityDocument} from 'sanity'\n\n//id prefixes\nexport const assistDocumentIdPrefix = 'sanity.assist.schemaType.'\nexport const assistDocumentStatusIdPrefix = 'sanity.assist.status.'\nexport const assistSchemaIdPrefix = 'sanity.assist.schema.'\n\n// type names\nexport const assistDocumentTypeName = 'sanity.assist.schemaType.annotations' as const\nexport const assistFieldTypeName = 'sanity.assist.schemaType.field' as const\nexport const instructionTypeName = 'sanity.assist.instruction' as const\nexport const promptTypeName = 'sanity.assist.instruction.prompt' as const\n\nexport const userInputTypeName = 'sanity.assist.instruction.userInput' as const\nexport const instructionContextTypeName = 'sanity.assist.instruction.context' as const\nexport const fieldReferenceTypeName = 'sanity.assist.instruction.fieldRef' as const\n\n// user-facing type. Intentionally does not have sanity. prefix\nexport const contextDocumentTypeName = 'assist.instruction.context' as const\n\nexport const assistTasksStatusTypeName = 'sanity.assist.task.status' as const\nexport const instructionTaskTypeName = 'sanity.assist.instructionTask' as const\nexport const fieldPresenceTypeName = 'sanity.assist.instructionTask.presence' as const\n\nexport const assistSerializedTypeName = 'sanity.assist.serialized.type' as const\nexport const assistSerializedFieldTypeName = 'sanity.assist.serialized.field' as const\n\nexport const outputFieldTypeName = 'sanity.assist.output.field' as const\nexport const outputTypeTypeName = 'sanity.assist.output.type' as const\n\n//url params\nexport const inspectParam = 'inspect' as const\nexport const fieldPathParam = 'pathKey' as const\nexport const instructionParam = 'instruction' as const\n\n// other constants\nexport const documentRootKey = '<document>'\n\nexport type SerializedSchemaMember = Omit<SerializedSchemaType, 'name' | '_type'> & {\n _type?: typeof assistSerializedFieldTypeName\n name?: string\n}\n\nexport interface SerializedSchemaType {\n _type?: typeof assistSerializedTypeName\n _id?: string\n type: string\n name: string\n title?: string\n fields?: SerializedSchemaMember[]\n of?: SerializedSchemaMember[]\n to?: SerializedSchemaMember[]\n annotations?: SerializedSchemaMember[]\n inlineOf?: SerializedSchemaMember[]\n values?: string[] | {value: string; title?: string}[]\n hidden?: boolean | 'function'\n readOnly?: boolean | 'function'\n options?: {\n /** equivalent to options.aiAssist.imageDescriptionField - not renamed in the api for backwards compatability */\n imagePromptField?: string\n embeddingsIndex?: string\n }\n}\n\nexport interface AssistDocument extends SanityDocument {\n fields?: AssistField[]\n instructions?: StudioInstruction[]\n}\n\nexport interface PresetInstruction {\n _key: string\n prompt?: PromptTextBlock[]\n\n title?: string\n /**\n * String key from @sanity/icons IconMap\n */\n icon?: string\n\n /**\n * Type/field filter\n */\n output?: (OutputFieldItem | OutputTypeItem)[]\n}\n\nexport interface PresetField {\n path?: string\n instructions?: PresetInstruction[]\n}\n\nexport interface AssistPreset {\n fields?: PresetField[]\n}\n\nexport interface SanityAssistDocument {\n _id: string\n _type: typeof assistDocumentTypeName\n fields?: StudioAssistField[]\n}\n\nexport interface StudioAssistDocument extends SanityAssistDocument {\n // added after loading\n tasks?: InstructionTask[]\n}\n\nexport interface AssistField {\n _key: string\n _type: typeof assistFieldTypeName\n path?: string\n instructions?: StudioInstruction[]\n}\n\nexport interface StudioAssistField {\n _key: string\n path?: string\n instructions?: StudioInstruction[]\n\n // added\n tasks?: InstructionTask[]\n}\n\nexport interface FieldRef extends PortableTextMarkDefinition {\n _type: typeof fieldReferenceTypeName\n path?: string\n}\n\nexport interface ContextBlock {\n _type: typeof instructionContextTypeName\n reference?: {\n _type: 'reference'\n _ref?: string\n }\n}\n\nexport interface UserInputBlock {\n _type: typeof userInputTypeName\n _key: string\n message?: string\n description?: string\n}\n\nexport type InlinePromptBlock = PortableTextSpan | FieldRef | UserInputBlock | ContextBlock\nexport type PromptTextBlock = Omit<\n PortableTextBlock<never, InlinePromptBlock, 'normal', never>,\n '_type'\n> & {_type: 'block'}\n\nexport type PromptBlock = PromptTextBlock | FieldRef | ContextBlock | UserInputBlock\n\nexport interface AiPresence {\n _key: string\n _type: typeof fieldPresenceTypeName\n path?: string\n started?: string\n}\n\nexport type TaskEndedReason = 'success' | 'error' | 'aborted' | 'timeout'\n\nexport interface InstructionTask {\n _key: string\n _type: typeof instructionTaskTypeName\n instructionKey?: string\n title?: string\n path?: string\n started?: string\n updated?: string\n ended?: string\n message?: string\n reason?: TaskEndedReason\n presence?: AiPresence[]\n startedByUserId?: string\n\n //added by studio\n // eslint-disable-next-line no-use-before-define\n instruction?: StudioInstruction\n}\n\nexport interface StudioInstruction {\n _key: string\n _type: typeof instructionTypeName\n prompt?: PromptBlock[]\n\n icon?: string\n userId?: string\n title?: string\n placeholder?: string\n output?: (OutputFieldItem | OutputTypeItem)[]\n\n //added after query / synthetic fields\n tasks?: InstructionTask[]\n}\n\nexport interface AssistTasksStatus {\n _id: string\n _type: typeof assistTasksStatusTypeName\n tasks?: InstructionTask[]\n}\n\nexport interface AssistInspectorRouteParams {\n [inspectParam]?: string\n [fieldPathParam]?: string\n [instructionParam]?: string\n}\n\nexport interface OutputFieldItem {\n _type: typeof outputFieldTypeName\n _key: string\n //path relative to the field the instruction is for (same as _key)\n relativePath?: string\n}\n\nexport interface OutputTypeItem {\n _type: typeof outputTypeTypeName\n _key: string\n /* array item type name */\n type?: string\n //path relative to the array-field the instruction is for, can be empty string (the array itself, same as _key)\n relativePath?: string\n}\n","import {useMemo} from 'react'\nimport {Path, pathToString} from 'sanity'\n\nimport {documentRootKey, StudioInstruction} from '../types'\n\nexport function usePathKey(path: Path | string) {\n return useMemo(() => {\n return getPathKey(path)\n }, [path])\n}\n\nexport function getPathKey(path: Path | string) {\n if (path.length) {\n return Array.isArray(path) ? pathToString(path) : path\n }\n return documentRootKey\n}\n\nexport function getInstructionTitle(instruction?: StudioInstruction) {\n return instruction?.title ?? 'Untitled'\n}\n","import {ArraySchemaType, ImageOptions, SchemaType} from 'sanity'\n\nexport function isPortableTextArray(type: ArraySchemaType) {\n return type.of.find((t) => isType(t, 'block'))\n}\n\nexport function isType(schemaType: SchemaType, typeName: string): boolean {\n if (schemaType.name === typeName) {\n return true\n }\n if (!schemaType.type) {\n return false\n }\n return isType(schemaType.type, typeName)\n}\n\nexport function isImage(schemaType: SchemaType) {\n return isType(schemaType, 'image')\n}\n\nexport function getDescriptionFieldOption(\n schemaType: SchemaType | undefined,\n): {path: string; updateOnImageChange: boolean} | undefined {\n if (!schemaType) {\n return undefined\n }\n const descriptionField = (schemaType.options as ImageOptions)?.aiAssist?.imageDescriptionField\n if (typeof descriptionField === 'string') {\n return {\n path: descriptionField,\n updateOnImageChange: true,\n }\n } else if (descriptionField) {\n return {\n path: descriptionField.path,\n updateOnImageChange: descriptionField.updateOnImageChange ?? true,\n }\n }\n return getDescriptionFieldOption(schemaType.type)\n}\n\nexport function getImageInstructionFieldOption(\n schemaType: SchemaType | undefined,\n): string | undefined {\n if (!schemaType) {\n return undefined\n }\n const imageInstructionField = (schemaType.options as ImageOptions)?.aiAssist\n ?.imageInstructionField\n if (imageInstructionField) {\n return imageInstructionField\n }\n return getImageInstructionFieldOption(schemaType.type)\n}\n","import {ReferenceOptions, SchemaType} from 'sanity'\n\nimport {AssistOptions} from '../schemas/typeDefExtensions'\nimport {isType} from './typeUtils'\n\nexport function isSchemaAssistEnabled(type: SchemaType) {\n return !(type.options as AssistOptions | undefined)?.aiAssist?.exclude\n}\n\nexport function isAssistSupported(type: SchemaType) {\n if (!isSchemaAssistEnabled(type)) {\n return false\n }\n\n if (isDisabled(type)) {\n return false\n }\n\n if (type.jsonType === 'array') {\n const unsupportedArray = type.of.every((t) => isDisabled(t))\n return !unsupportedArray\n }\n\n if (type.jsonType === 'object') {\n const unsupportedObject = type.fields.every((field) => isDisabled(field.type))\n return !unsupportedObject\n }\n return true\n}\n\nfunction isDisabled(type: SchemaType) {\n return !isSchemaAssistEnabled(type) || isUnsupportedType(type)\n}\n\nfunction isUnsupportedType(type: SchemaType) {\n return (\n type.name === 'sanity.imageCrop' ||\n type.name === 'sanity.imageHotspot' ||\n isType(type, 'globalDocumentReference') ||\n (isType(type, 'reference') &&\n !(type?.options as ReferenceOptions)?.aiAssist?.embeddingsIndex) ||\n isType(type, 'crossDatasetReference') ||\n isType(type, 'file')\n )\n}\n","import {createContext, PropsWithChildren, useMemo} from 'react'\nimport {FieldMember, ObjectInputProps, pathToString} from 'sanity'\n\nimport {isAssistSupported} from '../helpers/assistSupported'\n\nexport const FirstAssistedPathContext = createContext<string | undefined>(undefined)\n\nexport interface FirstAssistedPathProviderProps {\n members: ObjectInputProps['members']\n}\n\nexport function FirstAssistedPathProvider(\n props: PropsWithChildren<FirstAssistedPathProviderProps>,\n) {\n const {members} = props\n\n const firstAssistedPath = useMemo(() => {\n const firstAssisted = members.find(\n (member): member is FieldMember =>\n member.kind === 'field' && isAssistSupported(member.field.schemaType),\n )\n return firstAssisted?.field.path ? pathToString(firstAssisted?.field.path) : undefined\n }, [members])\n\n return (\n <FirstAssistedPathContext.Provider value={firstAssistedPath}>\n {props.children}\n </FirstAssistedPathContext.Provider>\n )\n}\n","import {minutesToMilliseconds} from 'date-fns'\n\nexport const releaseAnnouncementUrl =\n 'https://www.sanity.io/blog/sanity-ai-assist-announcement?utm_source=sanity-assist-plugin&utm_medium=organic_social&utm_campaign=ai-assist&utm_content='\n\nexport const instructionGuideUrl =\n 'https://sanity.io/guides/getting-started-with-ai-assist-instructions?utm_source=sanity-assist-plugin&utm_medium=organic_social&utm_campaign=ai-assist&utm_content='\n\nexport const giveFeedbackUrl = 'https://forms.gle/Kwz7CThxGeA2GiEU8'\n\nexport const salesUrl =\n 'https://www.sanity.io/contact/sales?utm_source=sanity-assist-plugin&utm_medium=organic_social&utm_campaign=ai-assist&utm_content='\n\nexport const packageName = '@sanity/assist'\n\nexport const pluginTitle = 'Sanity AI Assist'\n\nexport const pluginTitleShort = 'AI Assist'\n\nexport const maxHistoryVisibilityMs = minutesToMilliseconds(30)\n","import {getPublishedId, getVersionFromId, isVersionId} from 'sanity'\n\nimport {assistDocumentIdPrefix, assistDocumentStatusIdPrefix} from '../types'\n\nconst illegalIdChars = /[^a-zA-Z0-9._-]/g\n\nexport function publicId(id: string) {\n return id.replace('drafts.', '')\n}\n\nexport function assistDocumentId(documentType: string) {\n return `${assistDocumentIdPrefix}${documentType}`.replace(illegalIdChars, '_')\n}\n\nexport function assistTasksStatusId(documentId: string) {\n if (isVersionId(documentId)) {\n // Creates an id: sanity.assist.status.<versionName>.<documentId>\n return `${assistDocumentStatusIdPrefix}${getVersionFromId(documentId)}.${getPublishedId(documentId)}`\n }\n\n // Creates an id: sanity.assist.status<documentId>\n return `${assistDocumentStatusIdPrefix}${getPublishedId(documentId)}`\n}\n","import {useEditState} from 'sanity'\n\nexport function useDocumentState<T>(id: string, docType: string): T | undefined {\n const state = useEditState(id, docType)\n return (state.draft || state.published) as T | undefined\n}\n","import {useEffect, useMemo} from 'react'\nimport {type ObjectSchemaType, typed, useClient, useCurrentUser} from 'sanity'\n\nimport {maxHistoryVisibilityMs} from '../../constants'\nimport {assistDocumentId, assistTasksStatusId} from '../../helpers/ids'\nimport {\n assistDocumentTypeName,\n type AssistTasksStatus,\n assistTasksStatusTypeName,\n type InstructionTask,\n type StudioAssistDocument,\n type StudioAssistField,\n type StudioInstruction,\n} from '../../types'\nimport {useDocumentState} from './useDocumentState'\n\ninterface UseAssistDocumentProps {\n documentId: string\n schemaType: ObjectSchemaType\n initDoc?: boolean\n}\n\nexport function useStudioAssistDocument({\n documentId,\n schemaType,\n initDoc,\n}: UseAssistDocumentProps): StudioAssistDocument | undefined {\n const documentTypeName = schemaType.name\n const currentUser = useCurrentUser()\n\n const assistDocument = useDocumentState<StudioAssistDocument>(\n assistDocumentId(documentTypeName),\n assistDocumentTypeName,\n )\n const assistTasksStatus = useDocumentState<AssistTasksStatus>(\n assistTasksStatusId(documentId ?? ''),\n assistTasksStatusTypeName,\n )\n\n const client = useClient({apiVersion: '2023-01-01'})\n\n useEffect(() => {\n if (!assistDocument && initDoc) {\n client\n .createIfNotExists({\n _id: assistDocumentId(documentTypeName),\n _type: assistDocumentTypeName,\n })\n .catch(() => {\n // best effort\n })\n }\n }, [client, assistDocument, documentTypeName, initDoc])\n\n return useMemo(() => {\n if (!assistDocument) {\n return undefined\n }\n const tasks = assistTasksStatus?.tasks ?? []\n const fields = (assistDocument?.fields ?? []).map((assistField): StudioAssistField => {\n return {\n ...assistField,\n tasks: tasks.filter((task) => task.path === assistField.path),\n instructions: assistField.instructions\n ?.filter((p) => !p.userId || p.userId === currentUser?.id)\n .map((instruction) => asStudioInstruction(instruction, tasks)),\n }\n })\n return typed<StudioAssistDocument>({\n ...assistDocument,\n tasks: tasks?.map((task) => {\n const instruction = fields\n .find((f) => f.path === task.path)\n ?.instructions?.find((i) => i._key === task.instructionKey)\n return {\n ...task,\n instruction,\n }\n }),\n fields: fields,\n })\n }, [assistDocument, assistTasksStatus, currentUser])\n}\n\nfunction asStudioInstruction(\n instruction: StudioInstruction,\n run: InstructionTask[],\n): StudioInstruction {\n return {\n ...instruction,\n tasks: run\n .filter((task) => task.instructionKey === instruction._key)\n .filter(\n (task) =>\n task.started &&\n new Date().getTime() - new Date(task.started).getTime() < maxHistoryVisibilityMs,\n ),\n }\n}\n","import {useToast} from '@sanity/ui'\nimport {addSeconds, isAfter} from 'date-fns'\nimport {useEffect, useRef} from 'react'\nimport {ObjectSchemaType, useCurrentUser} from 'sanity'\n\nimport {getInstructionTitle} from '../../helpers/misc'\nimport {InstructionTask} from '../../types'\nimport {useStudioAssistDocument} from './useStudioAssistDocument'\n\nconst NO_TASKS: InstructionTask[] = []\n\nexport function useInstructionToaster(documentId: string, documentSchemaType: ObjectSchemaType) {\n const assistDocument = useStudioAssistDocument({documentId, schemaType: documentSchemaType})\n\n const assistDocLoaded = !!assistDocument\n const currentUser = useCurrentUser()\n const toast = useToast()\n const tasks = assistDocument?.tasks\n const previousTasks = useRef<InstructionTask[] | undefined | 'initial'>('initial')\n\n useEffect(() => {\n if (!assistDocLoaded) {\n return\n }\n\n if (previousTasks.current !== 'initial') {\n const prevTaskByKey = Object.fromEntries(\n (previousTasks.current ?? NO_TASKS).map((run) => [run._key, run]),\n )\n const endedTasks = tasks\n ?.filter((task) => task.startedByUserId === currentUser?.id)\n .filter((task) => {\n const prevTask = prevTaskByKey[task._key]\n return (!prevTask && task.ended) || (!prevTask?.ended && task.ended)\n })\n // filter out old stuff\n .filter((task) => task.ended && isAfter(addSeconds(new Date(task.ended), 30), new Date()))\n\n endedTasks?.forEach((task) => {\n const title = task.title ?? getInstructionTitle(task.instruction)\n if (task.reason === 'error') {\n toast.push({\n title: `Failed: ${title}`,\n status: 'error',\n description: `Instruction failed. ${task.message ?? ''}`,\n closable: true,\n duration: 10000,\n })\n } else if (task.reason === 'timeout') {\n toast.push({\n title: `Timeout: ${title}`,\n status: 'error',\n description: `Instruction timed out.`,\n closable: true,\n })\n } else if (task.reason === 'success') {\n toast.push({\n title: `Success: ${title}`,\n status: 'success',\n description: `Instruction completed.`,\n closable: true,\n })\n } else if (task.reason === 'aborted') {\n toast.push({\n title: `Canceled: ${title}`,\n status: 'warning',\n description: `Instruction canceled.`,\n closable: true,\n })\n }\n })\n }\n previousTasks.current = tasks\n }, [tasks, previousTasks, toast, currentUser, assistDocLoaded])\n}\n","import {useLayer} from '@sanity/ui'\nimport {useMemo} from 'react'\nimport type {InputProps, ObjectInputProps, ObjectSchemaType} from 'sanity'\nimport {useDocumentPane} from 'sanity/structure'\n\nimport {ConnectFromRegion} from '../_lib/connector'\nimport {assistFormId} from '../_lib/form/constants'\nimport {usePathKey} from '../helpers/misc'\nimport {isType} from '../helpers/typeUtils'\nimport {FirstAssistedPathProvider} from '../onboarding/FirstAssistedPathProvider'\nimport {assistDocumentTypeName} from '../types'\nimport {useInstructionToaster} from './hooks/useInstructionToaster'\n\nexport function AssistDocumentInputWrapper(props: InputProps) {\n if (!isType(props.schemaType, 'document') && props.id !== 'root' && props.id !== assistFormId) {\n return <AssistInput {...props} />\n }\n\n const documentId = (props.value as any)?._id as string | undefined\n if (!documentId) {\n return props.renderDefault(props)\n }\n\n return <AssistDocumentInput {...(props as ObjectInputProps)} documentId={documentId} />\n}\n\nfunction AssistDocumentInput({documentId, ...props}: ObjectInputProps & {documentId: string}) {\n useInstructionToaster(documentId, props.schemaType)\n\n const schemaType = useMemo(() => {\n if (props.schemaType.name !== assistDocumentTypeName) {\n return props.schemaType\n }\n return {\n ...props.schemaType,\n type: {\n ...props.schemaType.type,\n // compatability with i18nArrays plugin that requires this to be document\n name: 'document',\n },\n } as ObjectSchemaType\n }, [props.schemaType])\n\n return (\n <FirstAssistedPathProvider members={props.members}>\n {props.renderDefault({...props, schemaType})}\n </FirstAssistedPathProvider>\n )\n}\n\nfunction AssistInput(props: InputProps) {\n const {zIndex} = useLayer()\n const {paneKey} = useDocumentPane()\n const pathKey = usePathKey(props.path)\n\n return (\n <ConnectFromRegion _key={`${paneKey}_${pathKey}`} zIndex={zIndex} style={{minWidth: 0}}>\n {props.renderDefault(props)}\n </ConnectFromRegion>\n )\n}\n","import {createContext, useContext} from 'react'\nimport {DocumentInspector, ObjectSchemaType, PatchEvent} from 'sanity'\n\nimport {InstructionTask, StudioAssistDocument} from '../types'\n\nexport type AssistDocumentContextValue = (\n | {assistDocument: StudioAssistDocument; loading: false}\n | {assistDocument: undefined; loading: true}\n) & {\n documentIsNew: boolean\n /**\n * This is the _actual_ id of the current document (ie the document loaded in the pane); it contains draft. versions. prefix ect depending on context\n */\n assistableDocumentId: string\n documentIsAssistable: boolean\n documentSchemaType: ObjectSchemaType\n openInspector: (inspectorName: string, paneParams?: Record<string, string>) => void\n closeInspector: (inspectorName?: string) => void\n inspector: DocumentInspector | null\n selectedPath?: string\n documentOnChange: (event: PatchEvent) => void\n\n /**\n * Synthetic task is used to display AI presence at the document level for the user who started the action.\n * These are not persisted, so other users will not see them.\n * It is mostly a helper to give _some_ visual feedback to the user while a custom action is running.\n * This also means that reloading the page will remove the icon.\n *\n * Agent Actions add their own \"real\" tasks, so if a custom action calls an Agent action, _those_ tasks\n * are visible across sessions.\n */\n syntheticTasks?: InstructionTask[]\n addSyntheticTask: (syntheticTask: InstructionTask) => void\n removeSyntheticTask: (syntheticTask: InstructionTask) => void\n}\n\nexport const AssistDocumentContext = createContext<AssistDocumentContextValue | undefined>(\n undefined,\n)\n\nexport function useAssistDocumentContext(): AssistDocumentContextValue {\n const context = useContext(AssistDocumentContext)\n if (!context) {\n throw new Error('AssistDocumentContext value is missing')\n }\n return context\n}\n","import {createContext} from 'react'\nimport {ObjectSchemaType, SchemaType} from 'sanity'\n\nexport interface SelectedFieldContextValue {\n documentSchema?: ObjectSchemaType\n fieldSchema?: SchemaType\n}\n\nexport const SelectedFieldContext = createContext<SelectedFieldContextValue | undefined>(undefined)\nexport const SelectedFieldContextProvider = SelectedFieldContext.Provider\n","import {\n BlockContentIcon,\n BlockquoteIcon,\n DocumentIcon,\n ImageIcon,\n LinkIcon,\n OlistIcon,\n StringIcon,\n} from '@sanity/icons'\nimport {extractWithPath} from '@sanity/mutator'\nimport {type ComponentType, useContext, useMemo} from 'react'\nimport {\n type ArraySchemaType,\n isKeySegment,\n isObjectSchemaType,\n type ObjectSchemaType,\n type Path,\n pathToString,\n type SanityDocumentLike,\n type SchemaType,\n stringToPath,\n} from 'sanity'\nimport {type PaneRouterContextValue, usePaneRouter} from 'sanity/structure'\n\nimport {SelectedFieldContext} from '../assistDocument/components/SelectedFieldContext'\nimport {isAssistSupported} from '../helpers/assistSupported'\nimport {isPortableTextArray, isType} from '../helpers/typeUtils'\nimport {type AssistInspectorRouteParams, documentRootKey, fieldPathParam} from '../types'\n\nexport interface FieldRef {\n key: string\n path: Path\n title: string\n schemaType: SchemaType\n icon: ComponentType\n synthetic?: boolean\n}\n\nconst maxDepth = 6\n\nexport function getTypeIcon(schemaType: SchemaType) {\n let t: SchemaType | undefined = schemaType\n\n while (t) {\n if (t.icon) return t.icon\n t = t.type\n }\n\n if (isType(schemaType, 'slug')) return LinkIcon\n if (isType(schemaType, 'image')) return ImageIcon\n if (schemaType.jsonType === 'array' && isPortableTextArray(schemaType)) return BlockContentIcon\n\n if (schemaType.jsonType === 'array') return OlistIcon\n if (schemaType.jsonType === 'object') return BlockquoteIcon\n if (schemaType.jsonType === 'string') return StringIcon\n\n return DocumentIcon\n}\n\nexport function getFieldRefsWithDocument(schemaType: ObjectSchemaType): FieldRef[] {\n const fields = getFieldRefs(schemaType)\n return [\n {\n key: documentRootKey,\n icon: schemaType.icon ?? DocumentIcon,\n title: `The entire document`,\n path: [],\n schemaType: schemaType,\n },\n\n ...fields,\n ]\n}\n\nexport function getFieldRefs(\n schemaType: ObjectSchemaType,\n parent?: FieldRef,\n depth = 0,\n): FieldRef[] {\n if (depth >= maxDepth) {\n return []\n }\n return schemaType.fields\n .filter((f) => !f.name.startsWith('_'))\n .flatMap((field) => {\n const path: Path = parent ? [...parent.path, field.name] : [field.name]\n const title = field.type.title ?? field.name\n const fieldRef: FieldRef = {\n key: patchableKey(pathToString(path)),\n path,\n title: parent ? [parent.title, title].join(' / ') : title,\n schemaType: field.type,\n icon: getTypeIcon(field.type),\n }\n const fields =\n field.type.jsonType === 'object' ? getFieldRefs(field.type, fieldRef, depth + 1) : []\n\n const syntheticFields =\n field.type.jsonType === 'array' ? getSyntheticFields(field.type, fieldRef, depth + 1) : []\n if (!isAssistSupported(field.type)) {\n return [...fields, ...syntheticFields]\n }\n return [fieldRef, ...fields, ...syntheticFields]\n })\n}\n\nfunction getSyntheticFields(schemaType: ArraySchemaType, parent?: FieldRef, depth = 0) {\n if (depth >= maxDepth) {\n return []\n }\n\n return schemaType.of\n .filter((itemType) => !isType(itemType, 'block'))\n .flatMap((itemType) => {\n const segment = {_key: itemType.name}\n const title = itemType.title ?? itemType.name\n const path: Path = parent ? [...parent.path, segment] : [segment]\n const fieldRef: FieldRef = {\n key: patchableKey(pathToString(path)),\n path,\n title: parent ? [parent.title, title].join(' / ') : title,\n schemaType: itemType,\n icon: getTypeIcon(itemType),\n synthetic: true,\n }\n const fields =\n itemType.jsonType === 'object' ? getFieldRefs(itemType, fieldRef, depth + 1) : []\n\n if (!isAssistSupported(itemType)) {\n return fields\n }\n return [fieldRef, ...fields]\n })\n}\n\nexport function getTypePath(doc: SanityDocumentLike, pathString: string) {\n if (!pathString) {\n return undefined\n }\n\n const path = stringToPath(pathString)\n const currentPath: Path = []\n let valid = true\n const syntheticPath = path.map((segment) => {\n currentPath.push(segment)\n\n if (isKeySegment(segment)) {\n const match = extractWithPath(pathToString(currentPath), doc)[0]\n const value = match?.value\n if (match && value && typeof value === 'object' && '_type' in value) {\n return {_key: value._type as string}\n }\n valid = false\n }\n return segment\n })\n\n return valid ? patchableKey(pathToString(syntheticPath)) : undefined\n}\n\n/**\n * mutator crashes if path contains certain letters\n * @param pathKey\n */\nfunction patchableKey(pathKey: string) {\n return pathKey.replace(/[=]=/g, ':').replace(/[[\\]]/g, '|').replace(/\"/g, '')\n}\n\nexport function useTypePath(doc: SanityDocumentLike, pathString: string) {\n return useMemo(() => getTypePath(doc, pathString), [doc, pathString])\n}\n\nexport function useSelectedField(\n documentSchemaType?: SchemaType,\n path?: string,\n): FieldRef | undefined {\n const selectableFields = useMemo(\n () =>\n documentSchemaType && isObjectSchemaType(documentSchemaType)\n ? getFieldRefsWithDocument(documentSchemaType)\n : [],\n [documentSchemaType],\n )\n\n return useMemo(() => {\n return path ? selectableFields?.find((f) => f.key === path) : undefined\n }, [selectableFields, path])\n}\n\nexport function useSelectedFieldTitle() {\n const {params} = useAiPaneRouter()\n const {documentSchema} = useContext(SelectedFieldContext) ?? {}\n const selectedField = useSelectedField(documentSchema, params[fieldPathParam])\n return getFieldTitle(selectedField)\n}\n\nexport function getFieldTitle(field?: FieldRef) {\n const schemaType = field?.schemaType\n return field?.title ?? schemaType?.title ?? schemaType?.name ?? 'Untitled'\n}\n\nexport type AiPaneRouter = Omit<PaneRouterContextValue, 'setParams' | 'params'> & {\n params: AssistInspectorRouteParams\n setParams: (p: Record<keyof AssistInspectorRouteParams, string | undefined>) => void\n}\n\nexport function useAiPaneRouter() {\n const paneRouter = usePaneRouter()\n\n return useMemo(\n () => ({...paneRouter, params: paneRouter.params ?? {}}) as AiPaneRouter,\n [paneRouter],\n )\n}\n","import {\n createContext,\n ReactNode,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useState,\n} from 'react'\n\nimport {AssistPluginConfig} from '../plugin'\nimport {InstructStatus, useApiClient, useGetInstructStatus, useInitInstruct} from '../useApiClient'\n\nexport interface AiAssistanceConfigContextValue {\n config: AssistPluginConfig\n status?: InstructStatus\n statusLoading: boolean\n initLoading: boolean\n init: () => void\n error?: Error\n}\n\nexport const AiAssistanceConfigContext = createContext<AiAssistanceConfigContextValue>({} as any)\n\nexport function useAiAssistanceConfig() {\n const context = useContext(AiAssistanceConfigContext)\n if (!context) {\n throw new Error('Missing AiAssistanceConfigContext')\n }\n return context\n}\n\nexport function AiAssistanceConfigProvider(props: {\n children?: ReactNode\n config: AssistPluginConfig\n}) {\n const [status, setStatus] = useState<InstructStatus | undefined>()\n const [error, setError] = useState<Error | undefined>()\n\n const apiClient = useApiClient(props.config?.__customApiClient)\n const {getInstructStatus, loading: statusLoading} = useGetInstructStatus(apiClient)\n const {initInstruct, loading: initLoading} = useInitInstruct(apiClient)\n\n useEffect(() => {\n getInstructStatus()\n .then((s) => setStatus(s))\n .catch((e) => {\n console.error(e)\n setError(e as Error)\n })\n }, [getInstructStatus])\n\n const init = useCallback(async () => {\n setError(undefined)\n try {\n await initInstruct()\n const status = await getInstructStatus()\n setStatus(status)\n } catch (e) {\n console.error('Failed to init ai assistance', e)\n setError(e as Error)\n }\n }, [initInstruct, getInstructStatus, setStatus])\n\n const {config, children} = props\n const context = useMemo<AiAssistanceConfigContextValue>(() => {\n return {\n config,\n status,\n statusLoading,\n init,\n initLoading,\n error,\n }\n }, [config, status, init, statusLoading, initLoading, error])\n\n return (\n <AiAssistanceConfigContext.Provider value={context}>\n {children}\n </AiAssistanceConfigContext.Provider>\n )\n}\n","import {assistSerializedFieldTypeName, assistSerializedTypeName} from '../../types'\n\nexport const hiddenTypes = [\n 'any',\n 'array',\n 'block',\n 'boolean',\n 'crossDatasetReference',\n 'date',\n 'datetime',\n 'document',\n 'email',\n 'file',\n 'globalDocumentReference',\n 'image',\n 'number',\n 'object',\n 'reference',\n 'span',\n 'string',\n 'text',\n 'url',\n 'slug',\n 'geopoint',\n 'sanity.assetSourceData',\n 'sanity.imageAsset',\n 'sanity.fileAsset',\n 'sanity.imageCrop',\n 'sanity.imageHotspot',\n 'sanity.imageMetadata',\n 'sanity.imageDimensions',\n 'sanity.imagePalette',\n 'sanity.imagePaletteSwatch',\n\n assistSerializedTypeName,\n assistSerializedFieldTypeName,\n 'sanity-agent.job.document',\n]\n","import {\n ArraySchemaType,\n ImageOptions,\n isArraySchemaType,\n ObjectSchemaType,\n ReferenceOptions,\n ReferenceSchemaType,\n Schema,\n SchemaType,\n typed,\n} from 'sanity'\n\nimport {isAssistSupported} from '../../helpers/assistSupported'\nimport {isType} from '../../helpers/typeUtils'\nimport {\n assistSchemaIdPrefix,\n assistSerializedFieldTypeName,\n assistSerializedTypeName,\n SerializedSchemaMember,\n SerializedSchemaType,\n} from '../../types'\nimport {hiddenTypes} from './schemaUtils'\n\ninterface Options {\n leanFormat?: boolean\n}\n\nconst inlineTypes = ['document', 'object', 'image', 'file']\n\nexport function serializeSchema(schema: Schema, options?: Options): SerializedSchemaType[] {\n const list = schema\n .getTypeNames()\n .filter((t) => !(hiddenTypes.includes(t) || t.startsWith('sanity.')))\n .map((t) => schema.get(t))\n .filter((t): t is SchemaType => !!t)\n // because a field can override exclude at the type level, we have to also serialize excluded types\n // so don't do this: .filter((t) => isAssistSupported(t))\n .map((t) => getSchemaStub(t, schema, options))\n .filter((t) => {\n if ('to' in t && t.to && !t.to.length) {\n return false\n }\n if ('of' in t && t.of && !t.of.length) {\n return false\n }\n if ('fields' in t && t.fields && !t.fields.length) {\n return false\n }\n return true\n })\n list.sort((a, b) => (a?.name ?? '').localeCompare(b?.name ?? ''))\n return list\n}\n\nfunction getSchemaStub(\n schemaType: SchemaType,\n schema: Schema,\n options?: Options,\n): SerializedSchemaType {\n if (!schemaType.type?.name) {\n // eslint-disable-next-line no-console -- log error\n console.error('Missing type name', schemaType.type)\n throw new Error('Type is missing name!')\n }\n const baseSchema: SerializedSchemaType = {\n // we dont need type or id when we send using POST, so leave these out to save bandwidth\n ...(options?.leanFormat\n ? {}\n : {_id: `${assistSchemaIdPrefix}${schemaType.name}`, _type: assistSerializedTypeName}),\n name: schemaType.name,\n title: schemaType.title,\n type: schemaType.type.name,\n ...getBaseFields(schema, schemaType, schemaType.type.name, options),\n }\n\n return removeUndef(baseSchema)\n}\n\nfunction getBaseFields(\n schema: Schema,\n type: SchemaType,\n typeName: string,\n options: Options | undefined,\n) {\n const schemaOptions: SerializedSchemaType['options'] = removeUndef({\n imagePromptField: (type.options as ImageOptions)?.aiAssist?.imageInstructionField,\n embeddingsIndex: (type.options as ReferenceOptions)?.aiAssist?.embeddingsIndex,\n })\n return removeUndef({\n options: Object.keys(schemaOptions).length ? schemaOptions : undefined,\n values: Array.isArray(type?.options?.list)\n ? type?.options?.list.map((v: string | {value: string; title: string}) =>\n typeof v === 'string' ? v : (v.value ?? `${v.title}`),\n )\n : undefined,\n of: 'of' in type && typeName === 'array' ? arrayOf(type, schema, options) : undefined,\n to:\n 'to' in type && typeName === 'reference'\n ? refToTypeNames(type as ReferenceSchemaType)\n : undefined,\n fields:\n 'fields' in type && inlineTypes.includes(typeName)\n ? serializeFields(schema, type, options)\n : undefined,\n annotations:\n typeName === 'block' && 'fields' in type\n ? serializeAnnotations(type, schema, options)\n : undefined,\n inlineOf:\n typeName === 'block' && 'fields' in type\n ? serializeInlineOf(type, schema, options)\n : undefined,\n hidden:\n typeof type.hidden === 'function' ? ('function' as const) : type.hidden ? true : undefined,\n readOnly:\n typeof type.readOnly === 'function'\n ? ('function' as const)\n : type.readOnly\n ? true\n : undefined,\n })\n}\n\nfunction serializeFields(\n schema: Schema,\n schemaType: ObjectSchemaType,\n options: Options | undefined,\n) {\n const fields = schemaType.fieldsets\n ? schemaType.fieldsets.flatMap((fs) =>\n fs.single\n ? fs.field\n : fs.fields.map((f) => ({\n ...f,\n type: {\n ...f.type,\n // if fieldset is (conditionally) hidden, the field must be considered the same way\n // ie, if the field does not show up in conditionalMembers, it is hidden\n // regardless of weather or not it is the field function or the fieldset function that hides it\n hidden:\n typeof fs.hidden === 'function' ? fs.hidden : fs.hidden ? true : f.type.hidden,\n },\n })),\n )\n : schemaType.fields\n\n return fields\n .filter((f) => !['sanity.imageHotspot', 'sanity.imageCrop'].includes(f.type?.name ?? ''))\n .filter((f) => isAssistSupported(f.type))\n .map((field) => serializeMember(schema, field.type, field.name, options))\n}\n\nfunction serializeMember(\n schema: Schema,\n type: SchemaType,\n name: string,\n options: Options | undefined,\n): SerializedSchemaMember {\n const typeNameExists = !!schema.get(type?.name)\n const typeName = typeNameExists ? type.name : (type.type?.name ?? '')\n return removeUndef({\n ...(options?.leanFormat ? {} : {_type: assistSerializedFieldTypeName}),\n name: name,\n type: typeName,\n title: type.title,\n ...getBaseFields(schema, type, typeName, options),\n })\n}\n\nfunction serializeInlineOf(\n blockSchemaType: ObjectSchemaType,\n schema: Schema,\n options: Options | undefined,\n): SerializedSchemaMember[] | undefined {\n const childrenField = blockSchemaType.fields.find((f) => f.name === 'children')\n const childrenType = childrenField?.type\n if (!childrenType || !isArraySchemaType(childrenType)) {\n return undefined\n }\n return arrayOf(\n {\n ...childrenType,\n of: childrenType.of.filter((t) => !isType(t, 'span')),\n },\n schema,\n options,\n )\n}\n\nfunction serializeAnnotations(\n blockSchemaType: ObjectSchemaType,\n schema: Schema,\n options: Options | undefined,\n): SerializedSchemaMember[] | undefined {\n const markDefs = blockSchemaType.fields.find((f) => f.name === 'markDefs')\n const marksType = markDefs?.type\n if (!marksType || !isArraySchemaType(marksType)) {\n return undefined\n }\n return arrayOf(marksType, schema, options)\n}\n\nfunction arrayOf(\n arrayType: ArraySchemaType,\n schema: Schema,\n options: Options | undefined,\n): SerializedSchemaMember[] {\n return arrayType.of\n .filter((type) => isAssistSupported(type))\n .map((t) => {\n return serializeMember(schema, t, t.name, options)\n })\n}\n\nfunction refToTypeNames(type: ReferenceSchemaType) {\n return type.to.map((t) => ({\n type: typed<string>(t.name),\n }))\n}\n\nfunction removeUndef<T extends Record<string, any>>(obj: T): T {\n Object.keys(obj).forEach((key) => (obj[key] === undefined ? delete obj[key] : {}))\n return obj\n}\n","import type {SanityClient} from '@sanity/client'\nimport {useToast} from '@sanity/ui'\nimport {useCallback, useMemo, useState} from 'react'\nimport {Path, pathToString, useClient, useCurrentUser, useSchema} from 'sanity'\n\nimport {useAiAssistanceConfig} from './assistLayout/AiAssistanceConfigContext'\nimport {ConditionalMemberState} from './helpers/conditionalMembers'\nimport {serializeSchema} from './schemas/serialize/serializeSchema'\nimport {FieldLanguageMap} from './translate/paths'\nimport {documentRootKey} from './types'\n\nexport interface UserTextInstance {\n blockKey: string\n userInput: string\n}\n\nexport interface RunInstructionRequest {\n documentId: string\n assistDocumentId: string\n path: string\n typePath?: string\n instructionKey: string\n userId?: string\n userTexts?: UserTextInstance[]\n conditionalMembers?: ConditionalMemberState[]\n}\n\nexport interface InstructStatus {\n enabled: boolean\n initialized: boolean\n validToken: boolean\n}\n\nexport interface TranslateRequest {\n documentId: string\n translatePath: Path\n languagePath?: string\n styleguide: () => Promise<string | undefined>\n fieldLanguageMap?: FieldLanguageMap[]\n conditionalMembers?: ConditionalMemberState[]\n}\n\nconst basePath = '/assist/tasks/instruction'\nexport const API_VERSION_WITH_EXTENDED_TYPES = '2025-04-01'\n\nexport function canUseAssist(status: InstructStatus | undefined) {\n return status?.enabled && status.initialized && status.validToken\n}\n\nexport function useApiClient(customApiClient?: (defaultClient: SanityClient) => SanityClient) {\n const client = useClient({apiVersion: API_VERSION_WITH_EXTENDED_TYPES})\n return useMemo(\n () => (customApiClient ? customApiClient(client) : client),\n [client, customApiClient],\n )\n}\n\nexport function useTranslate(apiClient: SanityClient) {\n const [loading, setLoading] = useState(false)\n const user = useCurrentUser()\n const schema = useSchema()\n const types = useMemo(() => serializeSchema(schema, {leanFormat: true}), [schema])\n const toast = useToast()\n\n const translate = useCallback(\n ({\n documentId,\n languagePath,\n styleguide,\n translatePath,\n fieldLanguageMap,\n conditionalMembers,\n }: TranslateRequest) => {\n setLoading(true)\n\n async function run() {\n return apiClient.request({\n method: 'POST',\n url: `/assist/tasks/translate/${apiClient.config().dataset}?projectId=${\n apiClient.config().projectId\n }`,\n body: {\n documentId,\n types,\n languagePath,\n userStyleguide: await styleguide(),\n fieldLanguageMap,\n conditionalMembers,\n translatePath:\n translatePath.length === 0 ? documentRootKey : pathToString(translatePath),\n userId: user?.id,\n },\n })\n }\n\n return run()\n .catch((e) => {\n toast.push({\n status: 'error',\n title: 'Translate failed',\n description: e.message,\n })\n setLoading(false)\n throw e\n })\n .finally(() => {\n // adding some artificial delay here\n // server responds with 201 then proceeds; we dont need to allow spamming the button\n setTimeout(() => {\n setLoading(false)\n }, 2000)\n })\n },\n [setLoading, apiClient, toast, user, types],\n )\n\n return useMemo(\n () => ({\n translate,\n loading,\n }),\n [translate, loading],\n )\n}\n\nexport function useGenerateCaption(apiClient: SanityClient) {\n const [loading, setLoading] = useState(false)\n const user = useCurrentUser()\n const schema = useSchema()\n const types = useMemo(() => serializeSchema(schema, {leanFormat: true}), [schema])\n const toast = useToast()\n\n const generateCaption = useCallback(\n ({path, documentId}: {path: string; documentId: string}) => {\n setLoading(true)\n\n return apiClient\n .request({\n method: 'POST',\n url: `/assist/tasks/generate-caption/${apiClient.config().dataset}?projectId=${\n apiClient.config().projectId\n }`,\n body: {\n path,\n documentId,\n types,\n userId: user?.id,\n },\n })\n .catch((e) => {\n toast.push({\n status: 'error',\n title: 'Generate image description failed',\n description: e.message,\n })\n setLoading(false)\n throw e\n })\n .finally(() => {\n // adding some artificial delay here\n // server responds with 201 then proceeds; we dont need to allow spamming the button\n setTimeout(() => {\n setLoading(false)\n }, 2000)\n })\n },\n [setLoading, apiClient, toast, user, types],\n )\n\n return useMemo(\n () => ({\n generateCaption,\n loading,\n }),\n [generateCaption, loading],\n )\n}\n\nexport function useGenerateImage(apiClient: SanityClient) {\n const [loading, setLoading] = useState(false)\n const user = useCurrentUser()\n const schema = useSchema()\n const types = useMemo(() => serializeSchema(schema, {leanFormat: true}), [schema])\n const toast = useToast()\n\n const generateImage = useCallback(\n ({path, documentId}: {path: string; documentId: string}) => {\n setLoading(true)\n\n return apiClient\n .request({\n method: 'POST',\n url: `/assist/tasks/generate-image/${apiClient.config().dataset}?projectId=${\n apiClient.config().projectId\n }`,\n body: {\n path,\n documentId,\n types,\n userId: user?.id,\n },\n })\n .catch((e) => {\n toast.push({\n status: 'error',\n title: 'Generate image from prompt failed',\n description: e.message,\n })\n setLoading(false)\n throw e\n })\n .finally(() => {\n // adding some artificial delay here\n // server responds with 201 then proceeds; we dont need to allow spamming the button\n setTimeout(() => {\n setLoading(false)\n }, 2000)\n })\n },\n [setLoading, apiClient, toast, user, types],\n )\n\n return useMemo(\n () => ({\n generateImage,\n loading,\n }),\n [generateImage, loading],\n )\n}\n\nexport function useGetInstructStatus(apiClient: SanityClient) {\n const [loading, setLoading] = useState(true)\n\n const getInstructStatus = useCallback(async () => {\n setLoading(true)\n\n const projectId = apiClient.config().projectId\n try {\n const status = await apiClient.request<InstructStatus>({\n method: 'GET',\n url: `${basePath}/${apiClient.config().dataset}/status?projectId=${projectId}`,\n })\n\n return status\n } finally {\n setLoading(false)\n }\n }, [setLoading, apiClient])\n\n return {\n loading,\n getInstructStatus,\n }\n}\n\nexport function useInitInstruct(apiClient: SanityClient) {\n const [loading, setLoading] = useState(false)\n const initInstruct = useCallback(() => {\n setLoading(true)\n return apiClient\n .request({\n method: 'GET',\n url: `${basePath}/${apiClient.config().dataset}/init?projectId=${\n apiClient.config().projectId\n }`,\n })\n .finally(() => {\n setLoading(false)\n })\n }, [setLoading, apiClient])\n\n return {\n loading,\n initInstruct,\n }\n}\n\nexport function useRunInstructionApi(apiClient: SanityClient) {\n const toast = useToast()\n const [loading, setLoading] = useState(false)\n const user = useCurrentUser()\n const schema = useSchema()\n const types = useMemo(() => serializeSchema(schema, {leanFormat: true}), [schema])\n\n const {\n config: {assist: assistConfig},\n } = useAiAssistanceConfig()\n\n const runInstruction = useCallback(\n (request: RunInstructionRequest) => {\n if (!user) {\n toast.push({\n status: 'error',\n title: 'Unable to get user for instruction.',\n })\n return undefined\n }\n setLoading(true)\n\n const {timeZone, locale} = Intl.DateTimeFormat().resolvedOptions()\n const defaultLocaleSettings = {timeZone, locale}\n const localeSettings =\n assistConfig?.localeSettings?.({user, defaultSettings: defaultLocaleSettings}) ??\n defaultLocaleSettings\n\n return apiClient\n .request({\n method: 'POST',\n url: `${basePath}/${apiClient.config().dataset}?projectId=${\n apiClient.config().projectId\n }`,\n body: {\n ...request,\n types,\n userId: user?.id,\n localeSettings,\n maxPathDepth: assistConfig?.maxPathDepth,\n },\n })\n .catch((e) => {\n toast.push({\n status: 'error',\n title: 'Instruction failed',\n description: e.message,\n })\n throw e\n })\n .finally(() => {\n setLoading(false)\n })\n },\n [apiClient, types, user, toast, assistConfig],\n )\n\n return useMemo(\n () => ({\n runInstruction,\n loading,\n }),\n [runInstruction, loading],\n )\n}\n","import {PlayIcon} from '@sanity/icons'\nimport {Button, Dialog, Flex, Stack, Text, TextArea, Tooltip} from '@sanity/ui'\nimport {FormFieldHeaderText} from 'sanity'\n\nimport {getInstructionTitle} from '../helpers/misc'\nimport {type UserInputBlock, userInputTypeName} from '../types'\nimport {useApiClient, useRunInstructionApi} from '../useApiClient'\nimport {useAiAssistanceConfig} from './AiAssistanceConfigContext'\nimport type {RunInstructionArgs} from './AssistLayout'\nimport {CustomInputResult, GetUserInput} from '../fieldActions/useUserInput'\nimport {\n createContext,\n type Dispatch,\n type FormEvent,\n type PropsWithChildren,\n type SetStateAction,\n useCallback,\n useContext,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n} from 'react'\n\ntype BlockInputs = Record<string, string>\nconst NO_INPUT: BlockInputs = {}\n\nexport interface RunInstructionContextValue {\n runInstruction: (req: RunInstructionArgs) => void\n getUserInput: GetUserInput\n instructionLoading: boolean\n}\n\nexport const RunInstructionContext = createContext<RunInstructionContextValue>({\n runInstruction: () => {},\n getUserInput: async () => undefined,\n instructionLoading: false,\n})\n\nexport function useRunInstruction() {\n return useContext(RunInstructionContext)\n}\n\nfunction isUserInputBlock(block: {_type: string}): block is UserInputBlock {\n return block._type === userInputTypeName\n}\n\n// eslint-disable-next-line @typescript-eslint/ban-types\nexport function RunInstructionProvider(props: PropsWithChildren<{}>) {\n const {config} = useAiAssistanceConfig()\n const apiClient = useApiClient(config?.__customApiClient)\n const {runInstruction: runInstructionRequest, loading} = useRunInstructionApi(apiClient)\n\n const id = useId()\n\n const [inputs, setInputs] = useState(NO_INPUT)\n const [runRequest, setRunRequest] = useState<\n | (RunInstructionArgs & {userInputBlocks: UserInputBlock[]})\n | {dialogTitle: string; userInputBlocks: UserInputBlock[]}\n | undefined\n >()\n\n const [resolveUserInput, setResolveUserInput] =\n useState<\n (\n value: CustomInputResult[] | PromiseLike<CustomInputResult[] | undefined> | undefined,\n ) => void\n >()\n\n const getUserInput: GetUserInput = useCallback(async ({title, inputs}) => {\n const userInputBlocks: UserInputBlock[] = inputs.map((input, i) => ({\n _type: userInputTypeName,\n _key: input.id ?? `${i}`,\n message: input.title,\n description: input.description,\n }))\n if (!userInputBlocks.length) {\n return undefined\n }\n setRunRequest({dialogTitle: title, userInputBlocks})\n return new Promise<CustomInputResult[] | undefined>((resolve) => {\n setResolveUserInput(() => resolve)\n })\n }, [])\n\n const runInstruction = useCallback(\n (req: RunInstructionArgs) => {\n if (loading) {\n return\n }\n const {instruction, ...request} = req\n const instructionKey = instruction._key\n const userInputBlocks = instruction?.prompt\n ?.flatMap((block) =>\n block._type === 'block' ? block.children.filter(isUserInputBlock) : [block],\n )\n .filter(isUserInputBlock)\n\n if (!userInputBlocks?.length) {\n runInstructionRequest({\n ...request,\n instructionKey,\n userTexts: undefined,\n })\n return\n }\n\n setRunRequest({\n ...req,\n userInputBlocks,\n })\n },\n [runInstructionRequest, loading],\n )\n\n const close = useCallback(() => {\n setRunRequest(undefined)\n setInputs(NO_INPUT)\n if (resolveUserInput) {\n resolveUserInput(undefined)\n }\n setResolveUserInput(undefined)\n }, [resolveUserInput])\n\n const runWithInput = useCallback(() => {\n if (runRequest) {\n if ('instruction' in runRequest) {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const {instruction, userTexts, ...request} = runRequest\n runInstructionRequest({\n ...request,\n instructionKey: instruction._key,\n userTexts: Object.entries(inputs).map(([key, value]) => ({\n blockKey: key,\n userInput: value,\n })),\n })\n } else {\n const userInputs = Object.values(inputs).map((input, i) => {\n const userInputBlock = runRequest.userInputBlocks[i]\n return {\n input: {\n id: userInputBlock._key,\n title: userInputBlock.message ?? '',\n description: userInputBlock.description,\n },\n result: input,\n }\n })\n resolveUserInput?.(userInputs)\n setResolveUserInput(undefined)\n }\n }\n close()\n }, [close, runInstructionRequest, runRequest, inputs, resolveUserInput])\n\n const open = !!runRequest\n\n const runDisabled = useMemo(\n () =>\n (runRequest?.userInputBlocks?.length ?? 0) >\n Object.entries(inputs).filter(([, value]) => !!value).length,\n [runRequest?.userInputBlocks, inputs],\n )\n\n const runButton = (\n <Button\n text=\"Run instruction\"\n onClick={runWithInput}\n tone=\"primary\"\n icon={PlayIcon}\n style={{width: '100%'}}\n disabled={runDisabled}\n />\n )\n\n const contextValue: RunInstructionContextValue = useMemo(\n () => ({runInstruction, getUserInput, instructionLoading: loading}),\n [runInstruction, loading],\n )\n\n return (\n <RunInstructionContext.Provider value={contextValue}>\n {open ? (\n <Dialog\n id={id}\n open={open}\n onClose={close}\n width={1}\n header={\n 'dialogTitle' in runRequest\n ? runRequest.dialogTitle\n : getInstructionTitle(runRequest?.instruction)\n }\n footer={\n <Flex justify=\"space-between\" padding={2} flex={1}>\n {runDisabled ? (\n <Tooltip\n content={\n <Flex padding={2}>\n <Text>Unable to run instruction. All fields must have a value.</Text>\n </Flex>\n }\n placement=\"top\"\n >\n <Flex flex={1}>{runButton}</Flex>\n </Tooltip>\n ) : (\n runButton\n )}\n </Flex>\n }\n >\n <Stack padding={4} space={2}>\n {runRequest?.userInputBlocks?.map((block, i) => (\n <UserInput\n key={block._key}\n block={block}\n autoFocus={i === 0}\n inputs={inputs}\n setInputs={setInputs}\n />\n ))}\n </Stack>\n </Dialog>\n ) : null}\n {props.children}\n </RunInstructionContext.Provider>\n )\n}\n\nexport function UserInput(props: {\n block: UserInputBlock\n inputs: BlockInputs\n setInputs: Dispatch<SetStateAction<BlockInputs>>\n autoFocus?: boolean\n}) {\n const {block, autoFocus, setInputs, inputs} = props\n const key = block._key\n const textAreaRef = useRef<HTMLTextAreaElement>(null)\n\n const onChange = useCallback(\n (e: FormEvent<HTMLTextAreaElement>) => {\n setInputs((current) => ({\n ...current,\n [key]: (e.currentTarget ?? e.target).value,\n }))\n },\n [key, setInputs],\n )\n\n const value = useMemo(() => inputs[key], [inputs, key])\n\n useEffect(() => {\n if (!autoFocus) {\n return\n }\n setTimeout(() => textAreaRef.current?.focus(), 0)\n }, [autoFocus])\n\n return (\n <Stack padding={2} space={3}>\n <FormFieldHeaderText\n title={block?.message ?? 'Provide more context'}\n description={block.description}\n />\n <TextArea\n ref={textAreaRef}\n rows={4}\n value={value}\n onChange={onChange}\n style={{resize: 'vertical'}}\n />\n </Stack>\n )\n}\n","import {useCallback, useEffect, useState} from 'react'\nimport {ObjectSchemaType, PatchEvent, SanityDocument, unset} from 'sanity'\n\nimport {useRunInstruction} from '../assistLayout/RunInstructionProvider'\n\nexport interface DraftDelayedTaskArgs<T> {\n documentOnChange: (event: PatchEvent) => void\n // indicates if the document is a draft or liveEditable currently\n isDocAssistable: boolean\n task: (args: T) => void\n}\n\nexport function isDocAssistable(\n documentSchemaType: ObjectSchemaType,\n published?: SanityDocument | null,\n draft?: SanityDocument | null,\n) {\n return !!(documentSchemaType.liveEdit ? published : draft)\n}\n\nexport function useRequestRunInstruction(args: {\n documentOnChange: (event: PatchEvent) => void\n // indicates if the document is a draft or liveEditable currently\n isDocAssistable: boolean\n}) {\n const {runInstruction, instructionLoading} = useRunInstruction()\n const requestRunInstruction = useDraftDelayedTask({\n ...args,\n task: runInstruction,\n })\n\n return {\n instructionLoading,\n requestRunInstruction,\n }\n}\n\n/**\n * Ensures that the current document is a draft before running task\n */\nexport function useDraftDelayedTask<T>(args: DraftDelayedTaskArgs<T>) {\n const {documentOnChange, isDocAssistable, task} = args\n\n const [queuedArgs, setQueuedArgs] = useState<T | undefined>(undefined)\n\n useEffect(() => {\n if (queuedArgs && isDocAssistable) {\n task(queuedArgs)\n setQueuedArgs(undefined)\n }\n }, [queuedArgs, isDocAssistable, task])\n\n return useCallback(\n (taskArgs: T) => {\n // make a dummy edit: this will trigger the document/draft to be created\n documentOnChange(PatchEvent.from([unset(['_force_document_creation'])]))\n setQueuedArgs(taskArgs)\n },\n [setQueuedArgs, documentOnChange],\n )\n}\n","import {useCallback, useEffect, useMemo, useState} from 'react'\nimport {getDraftId, getVersionId, type ObjectSchemaType, useSchema} from 'sanity'\nimport {useDocumentPane} from 'sanity/structure'\n\nimport {useAiPaneRouter} from '../../assistInspector/helpers'\nimport {fieldPathParam, InstructionTask} from '../../types'\nimport type {AssistDocumentContextValue} from '../AssistDocumentContext'\nimport {isDocAssistable} from '../RequestRunInstructionProvider'\nimport {useStudioAssistDocument} from './useStudioAssistDocument'\n\nexport function useAssistDocumentContextValue(documentId: string, documentType: string) {\n const schema = useSchema()\n\n const documentSchemaType = useMemo(() => {\n const schemaType = schema.get(documentType) as ObjectSchemaType | undefined\n if (!schemaType) {\n throw new Error(`Schema type \"${documentType}\" not found`)\n }\n return schemaType\n }, [documentType, schema])\n\n const {\n openInspector,\n closeInspector,\n inspector,\n onChange: documentOnChange,\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore this is a valid option available in `corel` - Remove after corel is merged to next\n selectedReleaseId,\n editState,\n } = useDocumentPane()\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore this is a valid option available in `corel` - Remove after corel is merged to next\n const {draft, published, version} = editState || {}\n\n const assistableDocumentId = selectedReleaseId\n ? getVersionId(documentId, selectedReleaseId)\n : documentSchemaType.liveEdit\n ? documentId\n : getDraftId(documentId)\n\n const documentIsNew = selectedReleaseId ? !version?._id : !draft?._id && !published?._id\n const documentIsAssistable = selectedReleaseId\n ? !!version\n : isDocAssistable(documentSchemaType, published, draft)\n\n const {params} = useAiPaneRouter()\n const selectedPath = params[fieldPathParam]\n\n const assistDocument = useStudioAssistDocument({\n documentId: assistableDocumentId,\n schemaType: documentSchemaType,\n })\n const {syntheticTasks, addSyntheticTask, removeSyntheticTask} =\n useSyntheticTasks(assistableDocumentId)\n const value: AssistDocumentContextValue = useMemo(() => {\n const base = {\n assistableDocumentId,\n documentSchemaType,\n documentIsNew,\n documentIsAssistable,\n openInspector,\n closeInspector,\n inspector,\n documentOnChange,\n selectedPath,\n syntheticTasks,\n addSyntheticTask,\n removeSyntheticTask,\n }\n if (!assistDocument) {\n return {...base, loading: true, assistDocument: undefined}\n }\n return {\n ...base,\n loading: false,\n assistDocument: assistDocument,\n }\n }, [\n assistDocument,\n documentIsAssistable,\n assistableDocumentId,\n documentSchemaType,\n documentIsNew,\n openInspector,\n closeInspector,\n inspector,\n documentOnChange,\n selectedPath,\n syntheticTasks,\n addSyntheticTask,\n removeSyntheticTask,\n ])\n\n return value\n}\n\nfunction useSyntheticTasks(assistableDocumentId: string) {\n const [syntheticTasks, setSyntheticTasks] = useState<InstructionTask[]>(() => [])\n const addSyntheticTask = useCallback((task: InstructionTask) => {\n setSyntheticTasks((current) => [...current, task])\n }, [])\n const removeSyntheticTask = useCallback((task: InstructionTask) => {\n setSyntheticTasks((current) => current.filter((t) => task._key !== t._key))\n }, [])\n\n useEffect(() => {\n setSyntheticTasks([])\n }, [assistableDocumentId])\n\n return {\n syntheticTasks,\n addSyntheticTask,\n removeSyntheticTask,\n }\n}\n","import {PropsWithChildren} from 'react'\n\nimport {AssistDocumentContext} from './AssistDocumentContext'\nimport {useAssistDocumentContextValue} from './hooks/useAssistDocumentContextValue'\n\nexport interface AIDocumentInputProps {\n documentId: string\n documentType: string\n}\n\nexport function AssistDocumentContextProvider(props: PropsWithChildren<AIDocumentInputProps>) {\n const {documentId, documentType} = props\n const value = useAssistDocumentContextValue(documentId, documentType)\n return (\n <AssistDocumentContext.Provider value={value}>{props.children}</AssistDocumentContext.Provider>\n )\n}\n","import {DocumentLayoutProps} from 'sanity'\n\nimport {AssistDocumentContextProvider} from './AssistDocumentContextProvider'\n\nexport function AssistDocumentLayout(props: DocumentLayoutProps) {\n const {documentId, documentType} = props\n return (\n <AssistDocumentContextProvider documentType={documentType} documentId={documentId}>\n {props.renderDefault(props)}\n </AssistDocumentContextProvider>\n )\n}\n","import {Badge} from '@sanity/ui'\n\nexport function AssistFeatureBadge() {\n return (\n <Badge fontSize={0} style={{margin: '-2px 0'}} tone=\"primary\">\n Beta\n </Badge>\n )\n}\n","import {ArrowRightIcon, CheckmarkIcon, SparklesIcon} from '@sanity/icons'\nimport {Button, Card, Flex, Popover, Stack, Text} from '@sanity/ui'\nimport {useRef} from 'react'\n\nimport {AssistFeatureBadge} from '../components/AssistFeatureBadge'\nimport {pluginTitle, releaseAnnouncementUrl} from '../constants'\n\nexport interface FieldActionsOnboardingProps {\n dismiss: () => void\n}\n\nexport function AssistOnboardingPopover(props: FieldActionsOnboardingProps) {\n const {dismiss} = props\n\n return (\n <Popover\n content={<AssistIntroCard dismiss={dismiss} />}\n open\n portal\n placeholder=\"bottom\"\n tone=\"default\"\n width={0}\n >\n <Card radius={2} shadow={2} style={{padding: 2, lineHeight: 0}}>\n <Button disabled fontSize={1} icon={SparklesIcon} mode=\"bleed\" padding={2} />\n </Card>\n </Popover>\n )\n}\n\nfunction AssistIntroCard(props: {dismiss: () => void}) {\n const buttonRef = useRef<HTMLButtonElement>(null)\n\n return (\n <Stack as=\"section\" padding={3} space={3}>\n <Stack padding={2} space={4}>\n <Flex gap={2} align=\"center\">\n <Text as=\"h1\" size={1} weight=\"semibold\">\n {pluginTitle}\n </Text>\n <div aria-hidden style={{margin: '-3px 0', lineHeight: 0}}>\n <AssistFeatureBadge />\n </div>\n </Flex>\n\n <Stack space={3}>\n <Text as=\"p\" muted size={1}>\n Manage reusable AI instructions to boost your content creation and reduce amount of\n repetitive chores.{' '}\n <a href={releaseAnnouncementUrl} target=\"_blank\" rel=\"noreferrer\">\n Learn more <ArrowRightIcon />\n </a>\n </Text>\n </Stack>\n </Stack>\n\n <Button\n fontSize={1}\n icon={CheckmarkIcon}\n onClick={props.dismiss}\n padding={3}\n ref={buttonRef}\n text=\"Ok, good to know!\"\n tone=\"primary\"\n />\n </Stack>\n )\n}\n","import {useCallback, useState} from 'react'\n\nexport const inspectorOnboardingKey = 'sanityStudio:assist:inspector:onboarding:dismissed'\nexport const fieldOnboardingKey = 'sanityStudio:assist:field:onboarding:dismissed'\n\nexport function isFeatureOnboardingDismissed(featureKey: string): boolean {\n if (typeof localStorage === 'undefined') {\n return false\n }\n\n const value = localStorage.getItem(featureKey)\n return value === 'true'\n}\n\nexport function dismissFeatureOnboarding(featureKey: string) {\n if (typeof localStorage === 'undefined') {\n return\n }\n\n localStorage.setItem(featureKey, 'true')\n}\n\nexport function useOnboardingFeature(featureKey: string) {\n const [showOnboarding, setShowOnboarding] = useState(\n () => !isFeatureOnboardingDismissed(featureKey),\n )\n const dismissOnboarding = useCallback(() => {\n setShowOnboarding(false)\n dismissFeatureOnboarding(featureKey)\n }, [setShowOnboarding, featureKey])\n\n return {showOnboarding, dismissOnboarding}\n}\n","import {forwardRef, type ReactElement, type ReactNode} from 'react'\nimport {keyframes, styled} from 'styled-components'\n\nconst fadeIn = keyframes`\n 0% {\n opacity: 0;\n transform: scale(0.75);\n }\n 40% {\n opacity: 0;\n transform: scale(0.75);\n }\n 100% {\n opacity: 1;\n transform: scale(1);\n }\n`\n\nconst FadeInDiv = styled.div`\n animation-name: ${fadeIn};\n animation-timing-function: ease-in-out;\n`\n\nexport const FadeInContent = forwardRef(function FadeInContent(\n {\n children,\n durationMs = 250,\n }: {\n children?: ReactNode\n ms?: number\n durationMs?: number\n },\n ref: any,\n): ReactElement {\n return (\n <FadeInDiv ref={ref} style={{animationDuration: `${durationMs}ms`}}>\n {children}\n </FadeInDiv>\n )\n})\n","const COLOR_HUES = [\n \"gray\",\n \"blue\",\n \"purple\",\n \"magenta\",\n \"red\",\n \"orange\",\n \"yellow\",\n \"green\",\n \"cyan\"\n], COLOR_TINTS = [\n \"50\",\n \"100\",\n \"200\",\n \"300\",\n \"400\",\n \"500\",\n \"600\",\n \"700\",\n \"800\",\n \"900\",\n \"950\"\n];\nfunction hslToRgb(hsl) {\n const h = hsl[0], s = hsl[1] / 100, l = hsl[2] / 100, k = (n) => (n + h / 30) % 12, a = s * Math.min(l, 1 - l), f = (n) => l - a * Math.max(-1, Math.min(k(n) - 3, Math.min(9 - k(n), 1)));\n return [255 * f(0), 255 * f(8), 255 * f(4)];\n}\nfunction rgbToHex([r, g, b]) {\n const _r = Math.round(r), _g = Math.round(g), _b = Math.round(b);\n return \"#\" + ((1 << 24) + (_r << 16) + (_g << 8) + _b).toString(16).slice(1);\n}\nfunction buildTints(options) {\n const { hueKey, color: color2 } = options;\n return COLOR_TINTS.reduce((acc, tintKey) => {\n const tint = Number(tintKey), rgb = hslToRgb(color2.tints[tintKey].hsl), hex = rgbToHex([Math.round(rgb[0]), Math.round(rgb[1]), Math.round(rgb[2])]);\n return acc[tintKey] = {\n title: `${hueKey.slice(0, 1).toUpperCase()}${hueKey.slice(1)} ${tint}`,\n hex\n }, acc;\n }, {});\n}\nconst black = {\n title: \"Black\",\n hex: \"#0d0e12\"\n}, white = {\n title: \"White\",\n hex: \"#ffffff\"\n}, gray = {\n 50: {\n title: \"Gray 50\",\n hex: \"#f6f6f8\"\n },\n 100: {\n title: \"Gray 100\",\n hex: \"#eeeef1\"\n },\n 200: {\n title: \"Gray 200\",\n hex: \"#e3e4e8\"\n },\n 300: {\n title: \"Gray 300\",\n hex: \"#bbbdc9\"\n },\n 400: {\n title: \"Gray 400\",\n hex: \"#9499ad\"\n },\n 500: {\n title: \"Gray 500\",\n hex: \"#727892\"\n },\n 600: {\n title: \"Gray 600\",\n hex: \"#515870\"\n },\n 700: {\n title: \"Gray 700\",\n hex: \"#383d51\"\n },\n 800: {\n title: \"Gray 800\",\n hex: \"#252837\"\n },\n 900: {\n title: \"Gray 900\",\n hex: \"#1b1d27\"\n },\n 950: {\n title: \"Gray 950\",\n hex: \"#13141b\"\n }\n}, blue = {\n 50: {\n title: \"Blue 50\",\n hex: \"#f5f8ff\"\n },\n 100: {\n title: \"Blue 100\",\n hex: \"#e5edff\"\n },\n 200: {\n title: \"Blue 200\",\n hex: \"#dbe5ff\"\n },\n 300: {\n title: \"Blue 300\",\n hex: \"#a8bfff\"\n },\n 400: {\n title: \"Blue 400\",\n hex: \"#7595ff\"\n },\n 500: {\n title: \"Blue 500\",\n hex: \"#556bfc\"\n },\n 600: {\n title: \"Blue 600\",\n hex: \"#4043e7\"\n },\n 700: {\n title: \"Blue 700\",\n hex: \"#2927aa\"\n },\n 800: {\n title: \"Blue 800\",\n hex: \"#192457\"\n },\n 900: {\n title: \"Blue 900\",\n hex: \"#161a41\"\n },\n 950: {\n title: \"Blue 950\",\n hex: \"#101228\"\n }\n}, purple = {\n 50: {\n title: \"Purple 50\",\n hex: \"#f8f5ff\"\n },\n 100: {\n title: \"Purple 100\",\n hex: \"#f1ebff\"\n },\n 200: {\n title: \"Purple 200\",\n hex: \"#ece1fe\"\n },\n 300: {\n title: \"Purple 300\",\n hex: \"#ccb1fc\"\n },\n 400: {\n title: \"Purple 400\",\n hex: \"#b087f7\"\n },\n 500: {\n title: \"Purple 500\",\n hex: \"#8f57ef\"\n },\n 600: {\n title: \"Purple 600\",\n hex: \"#721fe5\"\n },\n 700: {\n title: \"Purple 700\",\n hex: \"#4c1a9e\"\n },\n 800: {\n title: \"Purple 800\",\n hex: \"#2f1862\"\n },\n 900: {\n title: \"Purple 900\",\n hex: \"#23173f\"\n },\n 950: {\n title: \"Purple 950\",\n hex: \"#181128\"\n }\n}, magenta = {\n 50: {\n title: \"Magenta 50\",\n hex: \"#fef6f9\"\n },\n 100: {\n title: \"Magenta 100\",\n hex: \"#fde8ef\"\n },\n 200: {\n title: \"Magenta 200\",\n hex: \"#fcdee9\"\n },\n 300: {\n title: \"Magenta 300\",\n hex: \"#f7abc5\"\n },\n 400: {\n title: \"Magenta 400\",\n hex: \"#f0709b\"\n },\n 500: {\n title: \"Magenta 500\",\n hex: \"#e72767\"\n },\n 600: {\n title: \"Magenta 600\",\n hex: \"#b11651\"\n },\n 700: {\n title: \"Magenta 700\",\n hex: \"#7c1342\"\n },\n 800: {\n title: \"Magenta 800\",\n hex: \"#4b1130\"\n },\n 900: {\n title: \"Magenta 900\",\n hex: \"#341325\"\n },\n 950: {\n title: \"Magenta 950\",\n hex: \"#1f0f14\"\n }\n}, red = {\n 50: {\n title: \"Red 50\",\n hex: \"#fff6f5\"\n },\n 100: {\n title: \"Red 100\",\n hex: \"#ffe7e5\"\n },\n 200: {\n title: \"Red 200\",\n hex: \"#ffdedc\"\n },\n 300: {\n title: \"Red 300\",\n hex: \"#fdada5\"\n },\n 400: {\n title: \"Red 400\",\n hex: \"#f77769\"\n },\n 500: {\n title: \"Red 500\",\n hex: \"#ef4434\"\n },\n 600: {\n title: \"Red 600\",\n hex: \"#cc2819\"\n },\n 700: {\n title: \"Red 700\",\n hex: \"#8b2018\"\n },\n 800: {\n title: \"Red 800\",\n hex: \"#4d1714\"\n },\n 900: {\n title: \"Red 900\",\n hex: \"#321615\"\n },\n 950: {\n title: \"Red 950\",\n hex: \"#1e1011\"\n }\n}, orange = {\n 50: {\n title: \"Orange 50\",\n hex: \"#fff7f0\"\n },\n 100: {\n title: \"Orange 100\",\n hex: \"#ffeadb\"\n },\n 200: {\n title: \"Orange 200\",\n hex: \"#ffddc7\"\n },\n 300: {\n title: \"Orange 300\",\n hex: \"#ffb685\"\n },\n 400: {\n title: \"Orange 400\",\n hex: \"#ff8e42\"\n },\n 500: {\n title: \"Orange 500\",\n hex: \"#fa6400\"\n },\n 600: {\n title: \"Orange 600\",\n hex: \"#b14802\"\n },\n 700: {\n title: \"Orange 700\",\n hex: \"#7c3404\"\n },\n 800: {\n title: \"Orange 800\",\n hex: \"#461e07\"\n },\n 900: {\n title: \"Orange 900\",\n hex: \"#32160b\"\n },\n 950: {\n title: \"Orange 950\",\n hex: \"#21120d\"\n }\n}, yellow = {\n 50: {\n title: \"Yellow 50\",\n hex: \"#fefae1\"\n },\n 100: {\n title: \"Yellow 100\",\n hex: \"#fcf3bb\"\n },\n 200: {\n title: \"Yellow 200\",\n hex: \"#f9e994\"\n },\n 300: {\n title: \"Yellow 300\",\n hex: \"#f7d455\"\n },\n 400: {\n title: \"Yellow 400\",\n hex: \"#f9bc15\"\n },\n 500: {\n title: \"Yellow 500\",\n hex: \"#d28a04\"\n },\n 600: {\n title: \"Yellow 600\",\n hex: \"#965908\"\n },\n 700: {\n title: \"Yellow 700\",\n hex: \"#653a0b\"\n },\n 800: {\n title: \"Yellow 800\",\n hex: \"#3b220c\"\n },\n 900: {\n title: \"Yellow 900\",\n hex: \"#271a11\"\n },\n 950: {\n title: \"Yellow 950\",\n hex: \"#181410\"\n }\n}, green = {\n 50: {\n title: \"Green 50\",\n hex: \"#e7fef5\"\n },\n 100: {\n title: \"Green 100\",\n hex: \"#c5fce8\"\n },\n 200: {\n title: \"Green 200\",\n hex: \"#a9f9dc\"\n },\n 300: {\n title: \"Green 300\",\n hex: \"#59f3ba\"\n },\n 400: {\n title: \"Green 400\",\n hex: \"#0ff0a1\"\n },\n 500: {\n title: \"Green 500\",\n hex: \"#04b97a\"\n },\n 600: {\n title: \"Green 600\",\n hex: \"#01794f\"\n },\n 700: {\n title: \"Green 700\",\n hex: \"#015133\"\n },\n 800: {\n title: \"Green 800\",\n hex: \"#023120\"\n },\n 900: {\n title: \"Green 900\",\n hex: \"#06231a\"\n },\n 950: {\n title: \"Green 950\",\n hex: \"#071715\"\n }\n}, cyan = {\n 50: {\n title: \"Cyan 50\",\n hex: \"#e7fefe\"\n },\n 100: {\n title: \"Cyan 100\",\n hex: \"#c5fcfc\"\n },\n 200: {\n title: \"Cyan 200\",\n hex: \"#96f8f8\"\n },\n 300: {\n title: \"Cyan 300\",\n hex: \"#62efef\"\n },\n 400: {\n title: \"Cyan 400\",\n hex: \"#18e2e2\"\n },\n 500: {\n title: \"Cyan 500\",\n hex: \"#04b8be\"\n },\n 600: {\n title: \"Cyan 600\",\n hex: \"#037782\"\n },\n 700: {\n title: \"Cyan 700\",\n hex: \"#024950\"\n },\n 800: {\n title: \"Cyan 800\",\n hex: \"#042f34\"\n },\n 900: {\n title: \"Cyan 900\",\n hex: \"#072227\"\n },\n 950: {\n title: \"Cyan 950\",\n hex: \"#0d181c\"\n }\n}, hues = { gray, blue, purple, magenta, red, orange, yellow, green, cyan }, color = { black, white, ...hues }, config = {\n black: {\n title: \"Black\",\n hsl: [225, 16, 6]\n },\n white: {\n title: \"White\",\n hsl: [0, 0, 100]\n },\n gray: {\n title: \"Gray\",\n tints: {\n 50: {\n title: \"Gray 50\",\n hsl: [240, 12, 97]\n },\n 100: {\n title: \"Gray 100\",\n hsl: [240, 10, 94]\n },\n 200: {\n title: \"Gray 200\",\n hsl: [231, 10, 90]\n },\n 300: {\n title: \"Gray 300\",\n hsl: [232, 11, 76]\n },\n 400: {\n title: \"Gray 400\",\n hsl: [228, 13, 63]\n },\n 500: {\n title: \"Gray 500\",\n hsl: [229, 13, 51]\n },\n 600: {\n title: \"Gray 600\",\n hsl: [228, 16, 38]\n },\n 700: {\n title: \"Gray 700\",\n hsl: [229, 18, 27]\n },\n 800: {\n title: \"Gray 800\",\n hsl: [229, 19, 18]\n },\n 900: {\n title: \"Gray 900\",\n hsl: [228, 19, 13]\n },\n 950: {\n title: \"Gray 950\",\n hsl: [233, 17, 9]\n }\n }\n },\n blue: {\n title: \"Blue\",\n tints: {\n 50: {\n title: \"Blue 50\",\n hsl: [222, 100, 98]\n },\n 100: {\n title: \"Blue 100\",\n hsl: [222, 100, 95]\n },\n 200: {\n title: \"Blue 200\",\n hsl: [223, 100, 93]\n },\n 300: {\n title: \"Blue 300\",\n hsl: [224, 100, 83]\n },\n 400: {\n title: \"Blue 400\",\n hsl: [226, 100, 73]\n },\n 500: {\n title: \"Blue 500\",\n hsl: [232, 96, 66]\n },\n 600: {\n title: \"Blue 600\",\n hsl: [239, 78, 58]\n },\n 700: {\n title: \"Blue 700\",\n hsl: [241, 63, 41]\n },\n 800: {\n title: \"Blue 800\",\n hsl: [230, 55, 22]\n },\n 900: {\n title: \"Blue 900\",\n hsl: [234, 49, 17]\n },\n 950: {\n title: \"Blue 950\",\n hsl: [235, 43, 11]\n }\n }\n },\n purple: {\n title: \"Purple\",\n tints: {\n 50: {\n title: \"Purple 50\",\n hsl: [260, 95, 98]\n },\n 100: {\n title: \"Purple 100\",\n hsl: [260, 98, 96]\n },\n 200: {\n title: \"Purple 200\",\n hsl: [263, 96, 94]\n },\n 300: {\n title: \"Purple 300\",\n hsl: [262, 92, 84]\n },\n 400: {\n title: \"Purple 400\",\n hsl: [262, 88, 75]\n },\n 500: {\n title: \"Purple 500\",\n hsl: [262, 83, 64]\n },\n 600: {\n title: \"Purple 600\",\n hsl: [265, 79, 51]\n },\n 700: {\n title: \"Purple 700\",\n hsl: [263, 72, 36]\n },\n 800: {\n title: \"Purple 800\",\n hsl: [258, 60, 24]\n },\n 900: {\n title: \"Purple 900\",\n hsl: [257, 46, 17]\n },\n 950: {\n title: \"Purple 950\",\n hsl: [260, 41, 11]\n }\n }\n },\n magenta: {\n title: \"Magenta\",\n tints: {\n 50: {\n title: \"Magenta 50\",\n hsl: [340, 82, 98]\n },\n 100: {\n title: \"Magenta 100\",\n hsl: [339, 83, 95]\n },\n 200: {\n title: \"Magenta 200\",\n hsl: [339, 83, 93]\n },\n 300: {\n title: \"Magenta 300\",\n hsl: [340, 82, 82]\n },\n 400: {\n title: \"Magenta 400\",\n hsl: [340, 81, 69]\n },\n 500: {\n title: \"Magenta 500\",\n hsl: [340, 80, 53]\n },\n 600: {\n title: \"Magenta 600\",\n hsl: [337, 78, 39]\n },\n 700: {\n title: \"Magenta 700\",\n hsl: [333, 73, 28]\n },\n 800: {\n title: \"Magenta 800\",\n hsl: [328, 63, 18]\n },\n 900: {\n title: \"Magenta 900\",\n hsl: [327, 46, 14]\n },\n 950: {\n title: \"Magenta 950\",\n hsl: [341, 35, 9]\n }\n }\n },\n red: {\n title: \"Red\",\n tints: {\n 50: {\n title: \"Red 50\",\n hsl: [5, 100, 98]\n },\n 100: {\n title: \"Red 100\",\n hsl: [4, 100, 95]\n },\n 200: {\n title: \"Red 200\",\n hsl: [4, 98, 93]\n },\n 300: {\n title: \"Red 300\",\n hsl: [5, 95, 82]\n },\n 400: {\n title: \"Red 400\",\n hsl: [6, 90, 69]\n },\n 500: {\n title: \"Red 500\",\n hsl: [5, 85, 57]\n },\n 600: {\n title: \"Red 600\",\n hsl: [5, 78, 45]\n },\n 700: {\n title: \"Red 700\",\n hsl: [4, 70, 32]\n },\n 800: {\n title: \"Red 800\",\n hsl: [3, 58, 19]\n },\n 900: {\n title: \"Red 900\",\n hsl: [2, 41, 14]\n },\n 950: {\n title: \"Red 950\",\n hsl: [356, 30, 9]\n }\n }\n },\n orange: {\n title: \"Orange\",\n tints: {\n 50: {\n title: \"Orange 50\",\n hsl: [28, 100, 97]\n },\n 100: {\n title: \"Orange 100\",\n hsl: [25, 100, 93]\n },\n 200: {\n title: \"Orange 200\",\n hsl: [24, 100, 89]\n },\n 300: {\n title: \"Orange 300\",\n hsl: [24, 100, 76]\n },\n 400: {\n title: \"Orange 400\",\n hsl: [24, 100, 63]\n },\n 500: {\n title: \"Orange 500\",\n hsl: [24, 100, 49]\n },\n 600: {\n title: \"Orange 600\",\n hsl: [24, 98, 35]\n },\n 700: {\n title: \"Orange 700\",\n hsl: [24, 94, 25]\n },\n 800: {\n title: \"Orange 800\",\n hsl: [22, 82, 15]\n },\n 900: {\n title: \"Orange 900\",\n hsl: [17, 65, 12]\n },\n 950: {\n title: \"Orange 950\",\n hsl: [14, 43, 9]\n }\n }\n },\n yellow: {\n title: \"Yellow\",\n tints: {\n 50: {\n title: \"Yellow 50\",\n hsl: [51, 94, 94]\n },\n 100: {\n title: \"Yellow 100\",\n hsl: [52, 91, 86]\n },\n 200: {\n title: \"Yellow 200\",\n hsl: [50, 90, 78]\n },\n 300: {\n title: \"Yellow 300\",\n hsl: [47, 91, 65]\n },\n 400: {\n title: \"Yellow 400\",\n hsl: [44, 95, 53]\n },\n 500: {\n title: \"Yellow 500\",\n hsl: [39, 96, 42]\n },\n 600: {\n title: \"Yellow 600\",\n hsl: [34, 90, 31]\n },\n 700: {\n title: \"Yellow 700\",\n hsl: [31, 80, 22]\n },\n 800: {\n title: \"Yellow 800\",\n hsl: [28, 66, 14]\n },\n 900: {\n title: \"Yellow 900\",\n hsl: [24, 40, 11]\n },\n 950: {\n title: \"Yellow 950\",\n hsl: [24, 20, 8]\n }\n }\n },\n green: {\n title: \"Green\",\n tints: {\n 50: {\n title: \"Green 50\",\n hsl: [157, 89, 95]\n },\n 100: {\n title: \"Green 100\",\n hsl: [158, 89, 88]\n },\n 200: {\n title: \"Green 200\",\n hsl: [158, 87, 82]\n },\n 300: {\n title: \"Green 300\",\n hsl: [158, 86, 65]\n },\n 400: {\n title: \"Green 400\",\n hsl: [159, 88, 50]\n },\n 500: {\n title: \"Green 500\",\n hsl: [159, 96, 37]\n },\n 600: {\n title: \"Green 600\",\n hsl: [159, 98, 24]\n },\n 700: {\n title: \"Green 700\",\n hsl: [158, 98, 16]\n },\n 800: {\n title: \"Green 800\",\n hsl: [158, 91, 10]\n },\n 900: {\n title: \"Green 900\",\n hsl: [162, 72, 8]\n },\n 950: {\n title: \"Green 950\",\n hsl: [172, 51, 6]\n }\n }\n },\n cyan: {\n title: \"Cyan\",\n tints: {\n 50: {\n title: \"Cyan 50\",\n hsl: [180, 92, 95]\n },\n 100: {\n title: \"Cyan 100\",\n hsl: [180, 91, 88]\n },\n 200: {\n title: \"Cyan 200\",\n hsl: [180, 87, 78]\n },\n 300: {\n title: \"Cyan 300\",\n hsl: [180, 81, 66]\n },\n 400: {\n title: \"Cyan 400\",\n hsl: [180, 81, 49]\n },\n 500: {\n title: \"Cyan 500\",\n hsl: [182, 96, 38]\n },\n 600: {\n title: \"Cyan 600\",\n hsl: [185, 96, 26]\n },\n 700: {\n title: \"Cyan 700\",\n hsl: [185, 95, 16]\n },\n 800: {\n title: \"Cyan 800\",\n hsl: [187, 86, 11]\n },\n 900: {\n title: \"Cyan 900\",\n hsl: [188, 68, 9]\n },\n 950: {\n title: \"Cyan 950\",\n hsl: [196, 37, 8]\n }\n }\n }\n};\nfunction hexToRgb(hex) {\n const result = /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i.exec(hex);\n if (!result)\n throw new Error(\"input is not valid hex\");\n return [parseInt(result[1], 16), parseInt(result[2], 16), parseInt(result[3], 16)];\n}\nfunction rgbToHsl([r, g, b]) {\n r /= 255, g /= 255, b /= 255;\n const cmin = Math.min(r, g, b), cmax = Math.max(r, g, b), delta = cmax - cmin;\n let h = 0, s = 0, l = 0;\n return delta == 0 ? h = 0 : cmax == r ? h = (g - b) / delta % 6 : cmax == g ? h = (b - r) / delta + 2 : h = (r - g) / delta + 4, h = Math.round(h * 60), h < 0 && (h += 360), l = (cmax + cmin) / 2, s = delta == 0 ? 0 : delta / (1 - Math.abs(2 * l - 1)), s = +(s * 100).toFixed(0), l = +(l * 100).toFixed(0), [h, s, l];\n}\nfunction clamp(num) {\n return Math.max(Math.min(num, 255), 0);\n}\nfunction darkenChannel(backdrop, source) {\n return Math.min(backdrop, source);\n}\nfunction darken(b, s) {\n return [\n Math.round(clamp(darkenChannel(b[0] / 255, s[0] / 255) * 255)),\n Math.round(clamp(darkenChannel(b[1] / 255, s[1] / 255) * 255)),\n Math.round(clamp(darkenChannel(b[2] / 255, s[2] / 255) * 255))\n ];\n}\nfunction interpolate(min, max, val) {\n const size = max - min;\n return min + size * val;\n}\nfunction limit(darkest, lightest, source) {\n const r = Math.round(interpolate(darkest[0], lightest[0], source[0] / 255)), g = Math.round(interpolate(darkest[1], lightest[1], source[1] / 255)), b = Math.round(interpolate(darkest[2], lightest[2], source[2] / 255));\n return [r, g, b];\n}\nfunction screenChannel(backdrop, source) {\n return backdrop + source - backdrop * source;\n}\nfunction screen(b, s) {\n return [\n Math.round(clamp(screenChannel(b[0] / 255, s[0] / 255) * 255)),\n Math.round(clamp(screenChannel(b[1] / 255, s[1] / 255) * 255)),\n Math.round(clamp(screenChannel(b[2] / 255, s[2] / 255) * 255))\n ];\n}\nexport {\n COLOR_HUES,\n COLOR_TINTS,\n black,\n blue,\n buildTints,\n color,\n config,\n cyan,\n darken,\n gray,\n green,\n hexToRgb,\n hslToRgb,\n hues,\n limit,\n magenta,\n orange,\n purple,\n red,\n rgbToHex,\n rgbToHsl,\n screen,\n white,\n yellow\n};\n//# sourceMappingURL=index.js.map\n","import {purple} from '@sanity/color'\nimport {SparklesIcon} from '@sanity/icons'\nimport {Text} from '@sanity/ui'\nimport {type CSSProperties, useMemo} from 'react'\nimport {useColorSchemeValue} from 'sanity'\nimport {keyframes, styled} from 'styled-components'\n\nconst Root = styled.span`\n display: block;\n width: 25px;\n height: 25px;\n position: relative;\n`\n\nconst dash = keyframes`\n 0% {\n transform: rotate(0);\n }\n 100% {\n transform: rotate(43deg);\n }\n`\n\nconst Outline = styled.svg`\n display: block;\n position: absolute;\n top: 0;\n left: 0;\n\n & > circle {\n stroke: var(--ai-avatar-stroke-color);\n stroke-width: 1.5px;\n stroke-linecap: round;\n transform-origin: center;\n animation: ${dash} 500ms ease-in-out infinite;\n transition: stroke-dasharray 200ms ease-in-out;\n\n stroke-dasharray: 2.34px 0;\n\n [data-state='active'] > & {\n stroke-dasharray: 2px 2.34px;\n }\n }\n`\n\nconst IconDisc = styled.span`\n background: var(--ai-avatar-disc-color);\n color: white;\n width: 21px;\n height: 21px;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 10.5px;\n position: absolute;\n top: 2px;\n left: 2px;\n`\n\nexport function AssistAvatar(props: {state?: 'present' | 'active'}) {\n const {state = 'present'} = props\n const scheme = useColorSchemeValue()\n\n const style = useMemo(() => {\n if (scheme === 'dark') {\n return {\n [`--ai-avatar-stroke-color`]: purple[400].hex,\n [`--ai-avatar-disc-color`]: purple[600].hex,\n } as CSSProperties\n }\n\n return {\n [`--ai-avatar-stroke-color`]: purple[500].hex,\n [`--ai-avatar-disc-color`]: purple[600].hex,\n } as CSSProperties\n }, [scheme])\n\n return (\n <Root data-state={state} style={style}>\n <Outline\n width=\"25\"\n height=\"25\"\n viewBox=\"0 0 25 25\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <circle cx=\"12.5\" cy=\"12.5\" r=\"11.75\" />\n </Outline>\n <IconDisc>\n <Text as=\"span\" size={0} style={{color: 'inherit'}}>\n <SparklesIcon style={{color: 'inherit'}} />\n </Text>\n </IconDisc>\n </Root>\n )\n}\n","// eslint-disable-next-line react/no-unused-prop-types\nimport {Card, Flex, Text, Tooltip} from '@sanity/ui'\nimport type {FormNodePresence} from 'sanity'\n\nimport {FadeInContent} from '../components/FadeInContent'\nimport {AssistAvatar} from './AssistAvatar'\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nexport function AiFieldPresence(props: {presence: FormNodePresence}) {\n return (\n <Card style={{position: 'relative', background: 'transparent'}} contentEditable={false}>\n <Tooltip\n placement=\"left\"\n content={\n <Card padding={3} border>\n <Flex align=\"center\">\n <Text size={1}>Running instruction...</Text>\n </Flex>\n </Card>\n }\n >\n <FadeInContent durationMs={300}>\n <AssistAvatar state=\"active\" />\n </FadeInContent>\n </Tooltip>\n </Card>\n )\n}\n","import {useMemo} from 'react'\nimport {type FormNodePresence, isKeySegment, type Path, stringToPath} from 'sanity'\n\nimport {useAssistDocumentContext} from '../assistDocument/AssistDocumentContext'\nimport {maxHistoryVisibilityMs, pluginTitle} from '../constants'\nimport type {AiPresence} from '../types'\n\nconst NO_PRESENCE: FormNodePresence[] = []\n\nexport function useAssistPresence(path: Path, showFocusWithin?: boolean): FormNodePresence[] {\n const context = useAssistDocumentContext()\n const assistDocument = context && 'assistDocument' in context ? context.assistDocument : undefined\n const tasks = assistDocument?.tasks\n\n return useMemo(() => {\n const activePresence = tasks\n ?.filter((task) => !task.ended)\n ?.flatMap((task) => task.presence ?? [])\n ?.filter(\n (p) =>\n p.started &&\n new Date().getTime() - new Date(p.started).getTime() < maxHistoryVisibilityMs,\n )\n .filter((presence) => {\n if (!presence.path || !path.length) {\n return false\n }\n const statusPath = stringToPath(presence.path)\n\n if (!showFocusWithin && statusPath.length !== path.length) {\n return false\n }\n\n return path.every((pathSegment, i) => {\n const statusSegment = statusPath[i]\n if (typeof pathSegment === 'string') {\n return pathSegment === statusSegment\n }\n if (isKeySegment(pathSegment) && isKeySegment(statusSegment)) {\n return pathSegment._key === statusSegment._key\n }\n return false\n })\n })\n if (!activePresence?.length) {\n return NO_PRESENCE\n }\n\n return activePresence.map((status) => aiPresence(status, path))\n }, [showFocusWithin, tasks, path])\n}\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nexport function aiPresence(presence: AiPresence, path: Path, title?: string): FormNodePresence {\n return {\n user: {\n id: `sanity-assistant_${presence._key}`,\n displayName: pluginTitle,\n },\n path: path,\n sessionId: 'not-available',\n lastActiveAt: presence?.started ?? new Date().toISOString(),\n }\n}\n","import {Box, Flex} from '@sanity/ui'\nimport {useContext, useMemo} from 'react'\nimport {FieldProps, isArraySchemaType, pathToString} from 'sanity'\n\nimport {assistFormId} from '../_lib/form/constants'\nimport {isAssistSupported} from '../helpers/assistSupported'\nimport {isPortableTextArray, isType} from '../helpers/typeUtils'\nimport {AssistOnboardingPopover} from '../onboarding/FieldActionsOnboarding'\nimport {FirstAssistedPathContext} from '../onboarding/FirstAssistedPathProvider'\nimport {fieldOnboardingKey, useOnboardingFeature} from '../onboarding/onboardingStore'\nimport {AiFieldPresence} from '../presence/AiFieldPresence'\nimport {useAssistPresence} from '../presence/useAssistPresence'\nimport {contextDocumentTypeName} from '../types'\n\nexport function AssistFieldWrapper(props: FieldProps) {\n const {schemaType} = props\n\n const isSupported = useMemo(() => isAssistSupported(schemaType), [schemaType])\n\n if (\n !isSupported ||\n schemaType.name.startsWith('sanity.') ||\n schemaType.name === contextDocumentTypeName\n ) {\n return props.renderDefault(props)\n }\n if (\n !isType(props.schemaType, 'document') &&\n props.inputId !== 'root' &&\n props.inputId !== assistFormId\n ) {\n return <AssistField {...props}>{props.children}</AssistField>\n }\n\n return props.renderDefault(props)\n}\n\nexport function AssistField(props: FieldProps) {\n const {path} = props\n\n const isPortableText = useMemo(\n () => !!(isArraySchemaType(props.schemaType) && isPortableTextArray(props.schemaType)),\n [props.schemaType],\n )\n\n const presence = useAssistPresence(props.path, isPortableText)\n\n const firstAssistedPath = useContext(FirstAssistedPathContext)\n const isFirstAssisted = useMemo(\n () => pathToString(path) === firstAssistedPath,\n [path, firstAssistedPath],\n )\n\n const {showOnboarding, dismissOnboarding} = useOnboardingFeature(fieldOnboardingKey)\n const singlePresence = presence[0]\n\n const actions = (\n <Flex gap={2} align=\"center\" justify=\"space-between\">\n {singlePresence && (\n <Box>\n <AiFieldPresence presence={singlePresence} />\n </Box>\n )}\n\n {isFirstAssisted && showOnboarding && <AssistOnboardingPopover dismiss={dismissOnboarding} />}\n </Flex>\n )\n\n return props.renderDefault({\n ...props,\n\n // When showing the onboarding, prevent default field actions from being rendered\n actions: isFirstAssisted && showOnboarding ? [] : props.actions,\n\n // Render presence (and possibly onboarding) in the internal slot (between presence and the field actions)\n // eslint-disable-next-line camelcase\n __internal_slot: actions,\n })\n}\n","import {Box, Button, Card, ErrorBoundary, Flex, Stack, Text} from '@sanity/ui'\nimport {type ErrorInfo, type PropsWithChildren, useCallback, useMemo, useState} from 'react'\nimport {type InputProps, isArraySchemaType, PatchEvent, unset} from 'sanity'\nimport {styled} from 'styled-components'\n\nimport {isPortableTextArray} from '../helpers/typeUtils'\n\nconst WrapPreCard = styled(Card)`\n & pre {\n white-space: pre-wrap !important;\n }\n`\n\nexport function SafeValueInput(props: InputProps) {\n return (\n <ErrorWrapper onChange={props.onChange}>\n <PteValueFixer {...props} />\n </ErrorWrapper>\n )\n}\n\nexport function ErrorWrapper(\n props: PropsWithChildren<{onChange: (patchEvent: PatchEvent) => void}>,\n) {\n const {onChange} = props\n const [error, setError] = useState<Error | undefined>()\n\n const catchError = useCallback((params: {error: Error; info: ErrorInfo}) => {\n setError(params.error)\n }, [])\n\n const unsetValue = useCallback(() => {\n onChange(PatchEvent.from(unset()))\n setError(undefined)\n }, [onChange])\n const dismiss = useCallback(() => setError(undefined), [])\n const catcher = <ErrorBoundary onCatch={catchError}>{props.children}</ErrorBoundary>\n\n return error ? (\n <Card border tone=\"critical\" padding={2} contentEditable={false}>\n <Stack space={3}>\n <Text muted weight=\"semibold\">\n An error occurred.\n </Text>\n\n <WrapPreCard flex={1} padding={2} tone=\"critical\" border>\n {catcher}\n </WrapPreCard>\n\n <Flex width=\"fill\" flex={1} gap={3}>\n <Box flex={1}>\n <Button text=\"Dismiss\" onClick={dismiss} tone=\"primary\" />\n </Box>\n <Button text=\"Unset value\" onClick={unsetValue} tone=\"critical\" />\n </Flex>\n </Stack>\n </Card>\n ) : (\n catcher\n )\n}\n\nfunction PteValueFixer(props: InputProps) {\n const isPortableText = useMemo(\n () => isArraySchemaType(props.schemaType) && isPortableTextArray(props.schemaType),\n [props.schemaType],\n )\n const value = props.value\n if (isPortableText && value && !(value as any[]).length) {\n return props.renderDefault({...props, value: undefined})\n }\n\n return props.renderDefault(props)\n}\n","import {Box, Flex} from '@sanity/ui'\nimport {useCallback} from 'react'\nimport {BlockProps, PatchEvent, useFormCallbacks} from 'sanity'\n\nimport {ErrorWrapper} from '../components/SafeValueInput'\nimport {AiFieldPresence} from '../presence/AiFieldPresence'\nimport {useAssistPresence} from '../presence/useAssistPresence'\n\nexport function AssistFormBlock(props: BlockProps) {\n const presence = useAssistPresence(props.path, true)\n const {onChange} = useFormCallbacks()\n const key = props.value._key\n const localOnChange = useCallback(\n (patchEvent: PatchEvent) => {\n if (!key) {\n return\n }\n onChange(PatchEvent.from(patchEvent).prefixAll({_key: key}))\n },\n [onChange, key],\n )\n const singlePresence = presence[0]\n return (\n <ErrorWrapper onChange={localOnChange}>\n <Flex align=\"center\" justify=\"space-between\">\n <Box flex={1}>{props.renderDefault(props)}</Box>\n {singlePresence && <AiFieldPresence presence={singlePresence} />}\n </Flex>\n </ErrorWrapper>\n )\n}\n","import {createContext} from 'react'\nimport {BlockProps} from 'sanity'\n\n// workaround for preview value sometimes lagging behind\nexport const InlineBlockValueContext = createContext<unknown>(undefined)\n\nexport function AssistInlineFormBlock(props: BlockProps) {\n return (\n <InlineBlockValueContext.Provider value={props.value}>\n <>{props.renderDefault(props)}</>\n </InlineBlockValueContext.Provider>\n )\n}\n","import {Box, Flex} from '@sanity/ui'\nimport {ItemProps} from 'sanity'\n\nimport {AiFieldPresence} from '../presence/AiFieldPresence'\nimport {useAssistPresence} from '../presence/useAssistPresence'\n\nexport function AssistItem(props: ItemProps) {\n const {path} = props\n const presence = useAssistPresence(path, true)\n\n return (\n <Flex align=\"center\" width=\"fill\" style={{position: 'relative'}}>\n <Box flex={1}>{props.renderDefault({...props})}</Box>\n {presence.map((pre) => (\n <Box key={pre.user.id} style={{position: 'absolute', right: 35}}>\n <AiFieldPresence presence={pre} />\n </Box>\n ))}\n </Flex>\n )\n}\n","import {Box, type BoxProps, Flex, focusFirstDescendant, Spinner, Text} from '@sanity/ui'\nimport type React from 'react'\nimport {type HTMLProps, useEffect, useMemo, useRef} from 'react'\nimport {tap} from 'rxjs/operators'\nimport {\n createPatchChannel,\n type DocumentMutationEvent,\n type DocumentRebaseEvent,\n FormBuilder,\n fromMutationPatches,\n type PatchMsg,\n useDocumentPresence,\n useDocumentStore,\n} from 'sanity'\nimport {useDocumentPane} from 'sanity/structure'\n\nimport {assistFormId} from './constants'\n\nconst preventDefault = (ev: React.FormEvent) => ev.preventDefault()\n\nexport function DocumentForm(\n props: Omit<BoxProps, 'as'> & Omit<HTMLProps<HTMLDivElement>, 'as' | 'onSubmit' | 'ref'>,\n) {\n const {\n collapsedFieldSets,\n collapsedPaths,\n displayed: value,\n documentId,\n documentType,\n editState,\n formState,\n onBlur,\n onChange,\n onFocus,\n onPathOpen,\n onSetActiveFieldGroup,\n onSetCollapsedFieldSet,\n onSetCollapsedPath,\n ready,\n validation,\n } = useDocumentPane()\n\n const documentStore = useDocumentStore()\n const presence = useDocumentPresence(documentId)\n\n // The `patchChannel` is an INTERNAL publish/subscribe channel that we use to notify form-builder\n // nodes about both remote and local patches.\n // - Used by the Portable Text input to modify selections.\n // - Used by `withDocument` to reset value.\n const patchChannel = useMemo(() => createPatchChannel(), [])\n\n const isLocked = editState?.transactionSyncLock?.enabled\n\n useEffect(() => {\n const sub = documentStore.pair\n .documentEvents(documentId, documentType)\n .pipe(\n tap((event) => {\n if (event.type === 'mutation') {\n patchChannel.publish(prepareMutationEvent(event))\n }\n\n if (event.type === 'rebase') {\n patchChannel.publish(prepareRebaseEvent(event))\n }\n }),\n )\n .subscribe()\n\n return () => {\n sub.unsubscribe()\n }\n }, [documentId, documentStore, documentType, patchChannel])\n\n const hasRev = Boolean(value?._rev)\n useEffect(() => {\n if (hasRev) {\n // this is a workaround for an issue that caused the document pushed to withDocument to get\n // stuck at the first initial value.\n // This effect is triggered only when the document goes from not having a revision, to getting one\n // so it will kick in as soon as the document is received from the backend\n patchChannel.publish({\n type: 'mutation',\n patches: [],\n snapshot: value,\n })\n }\n // React to changes in hasRev only\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [hasRev])\n\n const formRef = useRef<null | HTMLDivElement>(null)\n\n useEffect(() => {\n focusFirstDescendant(formRef.current!)\n }, [])\n\n if (isLocked) {\n return (\n <Box as=\"form\" {...props} ref={formRef}>\n <Flex\n align=\"center\"\n direction=\"column\"\n height=\"fill\"\n justify=\"center\"\n padding={3}\n sizing=\"border\"\n >\n <Text size={1}>\n Please hold tight while the document is synced. This usually happens right after the\n document has been published, and it shouldn’t take more than a few seconds\n </Text>\n </Flex>\n </Box>\n )\n }\n\n return (\n <Box as=\"form\" {...props} onSubmit={preventDefault} ref={formRef}>\n {ready ? (\n formState === null ? (\n <Flex\n align=\"center\"\n direction=\"column\"\n height=\"fill\"\n justify=\"center\"\n padding={3}\n sizing=\"border\"\n >\n <Text size={1}>This form is hidden</Text>\n </Flex>\n ) : (\n <FormBuilder\n __internal_patchChannel={patchChannel}\n collapsedFieldSets={collapsedFieldSets}\n collapsedPaths={collapsedPaths}\n focusPath={formState.focusPath}\n changed={formState.changed}\n focused={formState.focused}\n groups={formState.groups}\n id={assistFormId}\n members={formState.members}\n onChange={onChange}\n onFieldGroupSelect={onSetActiveFieldGroup}\n onPathBlur={onBlur}\n onPathFocus={onFocus}\n onPathOpen={onPathOpen}\n onSetFieldSetCollapsed={onSetCollapsedFieldSet}\n onSetPathCollapsed={onSetCollapsedPath}\n presence={presence}\n readOnly={formState.readOnly}\n schemaType={formState.schemaType}\n validation={validation}\n value={formState.value as any}\n />\n )\n ) : (\n <Flex\n align=\"center\"\n direction=\"column\"\n height=\"fill\"\n justify=\"center\"\n padding={3}\n sizing=\"border\"\n >\n <Spinner muted />\n\n <Box marginTop={3}>\n <Text align=\"center\" muted size={1}>\n Loading document\n </Text>\n </Box>\n </Flex>\n )}\n </Box>\n )\n}\n\nfunction prepareMutationEvent(event: DocumentMutationEvent): PatchMsg {\n const patches = event.mutations.map((mut) => mut.patch).filter(Boolean)\n\n return {\n type: 'mutation',\n snapshot: event.document,\n patches: fromMutationPatches(event.origin, patches),\n }\n}\n\nfunction prepareRebaseEvent(event: DocumentRebaseEvent): PatchMsg {\n const remotePatches = event.remoteMutations.map((mut) => mut.patch).filter(Boolean)\n const localPatches = event.localMutations.map((mut) => mut.patch).filter(Boolean)\n\n return {\n type: 'rebase',\n snapshot: event.document,\n patches: fromMutationPatches('remote', remotePatches).concat(\n fromMutationPatches('local', localPatches),\n ),\n }\n}\n","import {createContext} from 'react'\n\nexport interface AssistTypeContextValue {\n typePath?: string\n documentType?: string\n}\nexport const AssistTypeContext = createContext<AssistTypeContextValue>({})\n","/* eslint-disable max-depth */\nimport {\n type ArrayOfObjectsFormNode,\n type ArrayOfObjectsItemMember,\n type ArrayOfPrimitivesFormNode,\n type DocumentFormNode,\n type FieldsetState,\n isObjectSchemaType,\n type ObjectFormNode,\n type Path,\n pathToString,\n type SchemaType,\n} from 'sanity'\n\nconst DEFAULT_MAX_DEPTH = 8\nconst ABSOLUTE_MAX_DEPTH = 50\n\nexport interface ConditionalMemberState {\n path: string\n hidden: boolean\n readOnly: boolean\n}\n\ninterface ConditionalMemberInnerState extends ConditionalMemberState {\n conditional: boolean\n}\n\n/**\n * This is used to statically determine the state of the functions on the server-side.\n * Paths which has a schema with conditional config should be considered hidden: true and/or readOnly: true\n * Only conditional paths are included, as static props can be determined from schema.\n *\n * Returns paths that has conditional hidden or readOnly schema config (function) and that.\n * Form-state does not contain hidden members.\n *\n * Note:\n * * If a parent path is hidden, no child paths are included\n * * If a parent path is readOnly, no child paths are included\n * * If a path is hidden, it is not included; only conditionally visible paths will be returned, with hidden: false\n */\nexport function getConditionalMembers(\n docState: DocumentFormNode,\n maxDepth = DEFAULT_MAX_DEPTH,\n): ConditionalMemberState[] {\n const doc: ConditionalMemberInnerState = {\n path: '',\n hidden: false,\n readOnly: !!docState.readOnly,\n conditional: isConditional(docState.schemaType),\n }\n return (\n [doc, ...extractConditionalPaths(docState, Math.min(maxDepth, ABSOLUTE_MAX_DEPTH))]\n .filter((v) => v.conditional)\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n .map(({conditional, ...state}) => ({...state}))\n )\n}\n\nfunction isConditional(schemaType: SchemaType) {\n return typeof schemaType.hidden === 'function' || typeof schemaType.readOnly === 'function'\n}\n\nfunction conditionalState(memberState: {\n path: Path\n schemaType: SchemaType\n readOnly?: boolean\n}): ConditionalMemberInnerState {\n return {\n path: pathToString(memberState.path),\n readOnly: !!memberState.readOnly,\n hidden: false, // if its in members, its not hidden\n conditional: isConditional(memberState.schemaType),\n }\n}\n\nfunction extractConditionalPaths(\n node: ObjectFormNode | FieldsetState,\n maxDepth: number,\n): ConditionalMemberInnerState[] {\n if (node.path.length >= maxDepth) {\n return []\n }\n\n return node.members.reduce<ConditionalMemberInnerState[]>((acc, member) => {\n if (member.kind === 'error') {\n return acc\n }\n if (member.kind === 'field') {\n const schemaType = member.field.schemaType\n if (schemaType.jsonType === 'object') {\n const innerFields = member.field.readOnly\n ? []\n : extractConditionalPaths(member.field as ObjectFormNode, maxDepth)\n return [...acc, conditionalState(member.field), ...innerFields]\n } else if (schemaType.jsonType === 'array') {\n const array = member.field as ArrayOfObjectsFormNode | ArrayOfPrimitivesFormNode\n\n let arrayPaths: ConditionalMemberInnerState[] = []\n const isObjectsArray = array.members.some(\n (m) => m.kind === 'item' && isObjectSchemaType(m.item.schemaType),\n )\n if (!array.readOnly) {\n for (const arrayMember of array.members) {\n if (arrayMember.kind === 'error') {\n continue\n }\n\n const innerFields =\n isObjectsArray && !arrayMember.item.readOnly\n ? extractConditionalPaths((arrayMember as ArrayOfObjectsItemMember).item, maxDepth)\n : []\n\n arrayPaths = [...arrayPaths, conditionalState(arrayMember.item), ...innerFields]\n }\n }\n return [...acc, conditionalState(array), ...arrayPaths]\n }\n\n return [...acc, conditionalState(member.field)]\n } else if (member.kind === 'fieldSet') {\n const conditionalFieldset = !!(node as ObjectFormNode).schemaType?.fieldsets?.some(\n (f) => !f.single && f.name === member.fieldSet.name && typeof f.hidden === 'function',\n )\n const innerFields = extractConditionalPaths(member.fieldSet, maxDepth).map((f) => ({\n ...f,\n // if fieldset is conditional, visible fields must also be considered conditional\n conditional: conditionalFieldset ?? f.conditional,\n }))\n return [...acc, ...innerFields]\n }\n\n return acc\n }, [])\n}\n","import {SparklesIcon} from '@sanity/icons'\nimport {Box, Button, Container, Flex, Stack, Text} from '@sanity/ui'\nimport {styled} from 'styled-components'\n\nimport {releaseAnnouncementUrl} from '../constants'\n\nconst SparklesIllustration = styled(SparklesIcon)({\n fontSize: '3.125em',\n '& path': {\n strokeWidth: `0.6px !important`,\n },\n})\n\nexport function InspectorOnboarding(props: {onDismiss: () => void}) {\n const {onDismiss} = props\n return (\n <Box padding={4}>\n <Container width={0}>\n <Stack space={4}>\n <div style={{textAlign: 'center'}}>\n <SparklesIllustration />\n </div>\n <Text align=\"center\" size={1}>\n Create reusable AI instructions that can be applied across all documents of a certain\n type.\n </Text>\n\n <Flex align=\"center\" gap={2} justify=\"center\">\n <Button\n as=\"a\"\n href={releaseAnnouncementUrl}\n rel=\"noreferrer\"\n target=\"_blank\"\n fontSize={1}\n mode=\"default\"\n onClick={onDismiss}\n padding={2}\n text=\"Learn more\"\n tone=\"primary\"\n />\n <Button fontSize={1} mode=\"bleed\" onClick={onDismiss} padding={2} text=\"Dismiss\" />\n </Flex>\n </Stack>\n </Container>\n </Box>\n )\n}\n","import {SearchIcon} from '@sanity/icons'\nimport {Autocomplete, Box, Breadcrumbs, Card, Flex, Text} from '@sanity/ui'\nimport {createElement, useCallback, useMemo} from 'react'\nimport {ObjectSchemaType} from 'sanity'\n\nimport {isType} from '../helpers/typeUtils'\nimport {FieldRef, getFieldRefs, getFieldRefsWithDocument} from './helpers'\n\ninterface FieldSelectorProps {\n id: string\n schemaType: ObjectSchemaType\n fieldPath?: string\n onSelect: (path: string) => void\n includeDocument?: boolean\n filter?: (field: FieldRef) => boolean\n}\n\nexport function FieldAutocomplete(props: FieldSelectorProps) {\n const {id, schemaType, fieldPath, onSelect, includeDocument, filter} = props\n\n const fieldRefs = useMemo(() => {\n if (includeDocument) {\n return getFieldRefsWithDocument(schemaType)\n }\n return getFieldRefs(schemaType)\n }, [schemaType, includeDocument])\n const currentField = useMemo(\n () => fieldRefs.find((f) => f.key === fieldPath),\n [fieldPath, fieldRefs],\n )\n\n const autocompleteOptions = useMemo(\n () =>\n fieldRefs\n .filter((field) => (filter ? filter(field) : true))\n .filter((f) => !isType(f.schemaType, 'reference'))\n .map((field) => ({value: field.key, field})),\n [fieldRefs, filter],\n )\n\n const renderOption = useCallback((option: {value: string; field: FieldRef}) => {\n const {value, field} = option\n\n if (!value) {\n return (\n <Card as=\"button\" padding={3} radius={1}>\n <Text accent size={1}>\n {option.value}\n </Text>\n </Card>\n )\n }\n\n if (isType(field.schemaType, 'document')) {\n return (\n <Card as=\"button\" padding={3} radius={1}>\n <Text size={1} weight=\"semibold\">\n The entire document\n </Text>\n </Card>\n )\n }\n\n return (\n <Card as=\"button\" padding={3} radius={1}>\n <Flex gap={3}>\n <Text size={1}>{createElement(field.icon)}</Text>\n\n <FieldTitle field={field} />\n </Flex>\n </Card>\n )\n }, [])\n\n const renderValue = useCallback((value: string, option?: {value: string; field: FieldRef}) => {\n return option?.field.title ?? value\n }, [])\n\n const filterOption = useCallback((query: string, option: {value: string; field: FieldRef}) => {\n const lQuery = query.toLowerCase()\n return (\n option?.value?.toLowerCase().includes(lQuery) ||\n option?.field?.title?.toLowerCase().includes(lQuery)\n )\n }, [])\n\n return (\n <Autocomplete\n fontSize={1}\n icon={currentField ? currentField.icon : SearchIcon}\n onChange={onSelect}\n openButton\n id={id}\n options={autocompleteOptions}\n placeholder=\"Search for a field\"\n radius={2}\n renderOption={renderOption}\n renderValue={renderValue}\n value={currentField?.key}\n filterOption={filterOption}\n />\n )\n}\n\nexport function FieldTitle(props: {field: FieldRef}) {\n const splitTitle = props.field.title.split('/')\n return (\n <Box flex=\"none\">\n <Breadcrumbs\n style={{\n display: 'flex',\n flexWrap: 'wrap',\n alignItems: 'center',\n marginTop: '-4px',\n }}\n separator={\n <Box marginTop={1}>\n <Text muted size={1}>\n /\n </Text>\n </Box>\n }\n space={1}\n >\n {splitTitle.slice(0, splitTitle.length - 1).map((pt, i) => (\n // eslint-disable-next-line react/no-array-index-key\n <Box key={i} marginTop={1}>\n <Text muted size={1}>\n {pt.trim()}\n </Text>\n </Box>\n ))}\n <Box marginTop={1}>\n <Text size={1} weight=\"medium\">\n {splitTitle[splitTitle.length - 1]}\n </Text>\n </Box>\n </Breadcrumbs>\n </Box>\n )\n}\n","import {formatDistanceToNow} from 'date-fns'\nimport {useEffect, useReducer} from 'react'\n\nfunction useInterval(ms: number) {\n const [tick, update] = useReducer((n) => n + 1, 0)\n\n useEffect(() => {\n const i = setInterval(update, ms)\n return () => clearInterval(i)\n }, [ms])\n return tick\n}\n\nexport function TimeAgo({date}: {date?: string}) {\n useInterval(1000)\n const timeSince = formatDistanceToNow(date ? new Date(date) : new Date())\n return <span title={timeSince}>{timeSince} ago</span>\n}\n","import {\n CheckmarkCircleIcon,\n ClockIcon,\n CloseCircleIcon,\n ErrorOutlineIcon,\n SyncIcon,\n} from '@sanity/icons'\nimport {\n Box,\n Button,\n Card,\n Flex,\n Popover,\n Spinner,\n Stack,\n Text,\n useClickOutside,\n useGlobalKeyDown,\n useLayer,\n} from '@sanity/ui'\nimport {createElement, type ForwardedRef, forwardRef, useCallback, useMemo, useState} from 'react'\nimport {StatusButton, type StatusButtonProps, typed, useClient} from 'sanity'\nimport {keyframes, styled} from 'styled-components'\n\nimport {TimeAgo} from '../components/TimeAgo'\nimport {maxHistoryVisibilityMs, pluginTitle} from '../constants'\nimport {assistTasksStatusId} from '../helpers/ids'\nimport {getInstructionTitle} from '../helpers/misc'\nimport type {AssistTasksStatus, InstructionTask, StudioInstruction, TaskEndedReason} from '../types'\n\nexport interface InstructionTaskHistoryButtonProps {\n documentId?: string\n tasks: InstructionTask[] | undefined\n instructions: StudioInstruction[] | undefined\n showTitles: boolean\n}\n\ninterface CancelableInstructionTask extends InstructionTask {\n cancel: () => void\n title?: string\n}\n\nconst rotate = keyframes`\n 0% {\n transform: rotate(0);\n }\n 100% {\n transform: rotate(360deg);\n }\n`\n\nconst SyncSpinningIcon = styled(SyncIcon)`\n animation: ${rotate} 1s linear infinite;\n`\n\nconst TASK_CONFIG = {\n aborted: {\n title: 'Canceled',\n icon: CloseCircleIcon,\n tone: 'transparent',\n },\n error: {\n title: 'Error',\n icon: ErrorOutlineIcon,\n tone: 'critical',\n },\n success: {\n title: 'Completed',\n icon: CheckmarkCircleIcon,\n tone: 'positive',\n },\n timeout: {\n title: 'Timeout',\n icon: ClockIcon,\n tone: 'caution',\n },\n} as const\n\nexport function InstructionTaskHistoryButton(props: InstructionTaskHistoryButtonProps) {\n const {tasks, instructions, documentId, showTitles} = props\n\n const client = useClient({apiVersion: '2023-01-01'})\n const cancelRun = useCallback(\n (taskKey: string) => {\n if (!documentId) {\n return\n }\n const statusDocId = assistTasksStatusId(documentId)\n const basePath = `${typed<keyof AssistTasksStatus>('tasks')}[_key==\"${taskKey}\"]`\n client\n .patch(statusDocId)\n .set({\n [`${basePath}.${typed<keyof InstructionTask>('ended')}`]: new Date().toISOString(),\n [`${basePath}.${typed<keyof InstructionTask>('reason')}`]:\n typed<TaskEndedReason>('aborted'),\n })\n .commit()\n .catch(console.error)\n },\n [client, documentId],\n )\n\n const titledTasks = useMemo(() => {\n const t =\n tasks\n ?.filter(\n (task) =>\n task.started &&\n new Date().getTime() - new Date(task.started).getTime() < maxHistoryVisibilityMs,\n )\n .map((task): CancelableInstructionTask => {\n const instruction = instructions?.find((i) => i._key === task.instructionKey)\n return {\n ...task,\n title: showTitles ? (task.title ?? getInstructionTitle(instruction)) : undefined,\n cancel: () => cancelRun(task._key),\n }\n }) ?? []\n t.sort((a, b) => new Date(b.started ?? '').getTime() - new Date(a.started ?? '').getTime())\n return t\n }, [tasks, instructions, cancelRun, showTitles])\n\n // const id = useId()\n\n const isRunning = useMemo(() => titledTasks.some((r) => !r.ended), [titledTasks])\n const hasErrors = useMemo(\n () => titledTasks.some((r) => r.reason === 'error' || r.reason === 'timeout'),\n [titledTasks],\n )\n\n const [open, setOpen] = useState(false)\n\n const toggleOpen = useCallback(() => setOpen((v) => !v), [])\n\n const [button, setButton] = useState<HTMLButtonElement | null>(null)\n const [popover, setPopover] = useState<HTMLDivElement | null>(null)\n\n const handleClickOutside = useCallback(() => {\n setOpen(false)\n }, [])\n\n useClickOutside(handleClickOutside, [button, popover])\n\n const handleEscape = useCallback(() => {\n setOpen(false)\n button?.focus()\n }, [button])\n\n return (\n <Popover\n constrainSize\n content={<TaskList onEscape={handleEscape} tasks={titledTasks} />}\n open={open && !!titledTasks?.length}\n placement=\"top\"\n portal\n ref={setPopover}\n width={0}\n >\n <TaskStatusButton\n disabled={!titledTasks?.length}\n hasErrors={hasErrors}\n isRunning={isRunning}\n onClick={toggleOpen}\n ref={setButton}\n selected={open}\n />\n </Popover>\n )\n}\n\nconst TASK_STATUS_BUTTON_TOOLTIP_PROPS: StatusButtonProps['tooltipProps'] = {\n placement: 'top',\n}\n\nconst TaskStatusButton = forwardRef(function TaskStatusButton(\n props: {\n disabled: boolean\n hasErrors: boolean\n isRunning: boolean\n onClick: () => void\n selected: boolean\n },\n ref: ForwardedRef<HTMLButtonElement>,\n) {\n const {disabled, hasErrors, isRunning, onClick, selected} = props\n\n return (\n <StatusButton\n label={`${pluginTitle} status`}\n aria-label={`${pluginTitle} status`}\n icon={isRunning ? SyncSpinningIcon : hasErrors ? ErrorOutlineIcon : CheckmarkCircleIcon}\n mode=\"bleed\"\n onClick={onClick}\n tone={hasErrors ? 'critical' : undefined}\n disabled={disabled}\n ref={ref}\n selected={selected}\n tooltipProps={TASK_STATUS_BUTTON_TOOLTIP_PROPS}\n />\n )\n})\n\nfunction TaskList(props: {onEscape: () => void; tasks: CancelableInstructionTask[]}) {\n const {onEscape, tasks} = props\n\n const {isTopLayer} = useLayer()\n\n useGlobalKeyDown(\n useCallback(\n (event) => {\n if (isTopLayer && event.key === 'Escape') {\n onEscape()\n }\n },\n [isTopLayer, onEscape],\n ),\n )\n\n return (\n <Stack padding={1} space={1}>\n {tasks.map((task) => (\n <TaskItem key={task._key} task={task} />\n ))}\n </Stack>\n )\n}\n\nfunction TaskItem(props: {task: CancelableInstructionTask}) {\n const {task} = props\n\n const taskType = task.reason && TASK_CONFIG[task.reason]\n return (\n <Card radius={2} tone={taskType && taskType?.tone}>\n <Flex align=\"center\" gap={1}>\n <Flex align=\"flex-start\" flex={1} gap={3} padding={3}>\n <Box flex=\"none\">\n <Text size={1}>\n {taskType && createElement(taskType.icon)}\n {!task.reason && <Spinner />}\n </Text>\n </Box>\n <Stack flex={1} space={2}>\n <Text size={1} weight=\"medium\">\n {taskType ? taskType.title : 'Running'}\n {task.title && <>: {task.title}</>}\n </Text>\n {task.message ? <Text size={1}>{task.message}</Text> : null}\n <Text muted size={1}>\n <TimeAgo date={task.ended ?? task.started} />\n </Text>\n </Stack>\n </Flex>\n\n {!task.ended && (\n <Box flex=\"none\" padding={1}>\n <Button fontSize={1} mode=\"bleed\" onClick={task.cancel} text=\"Cancel\" />\n </Box>\n )}\n </Flex>\n </Card>\n )\n}\n","import {ArrowRightIcon, CloseIcon, PlayIcon, RetryIcon} from '@sanity/icons'\nimport {Box, Button, Card, Flex, Spinner, Stack, Text} from '@sanity/ui'\nimport {useCallback, useMemo, useRef} from 'react'\nimport {\n type DocumentInspectorProps,\n PresenceOverlay,\n VirtualizerScrollInstanceProvider,\n} from 'sanity'\nimport {\n DocumentInspectorHeader,\n type DocumentPaneNode,\n DocumentPaneProvider,\n useDocumentPane,\n} from 'sanity/structure'\nimport {styled} from 'styled-components'\n\nimport {DocumentForm} from '../_lib/form'\nimport {useAssistDocumentContext} from '../assistDocument/AssistDocumentContext'\nimport {AssistTypeContext} from '../assistDocument/components/AssistTypeContext'\nimport {useStudioAssistDocument} from '../assistDocument/hooks/useStudioAssistDocument'\nimport {useRequestRunInstruction} from '../assistDocument/RequestRunInstructionProvider'\nimport {useAiAssistanceConfig} from '../assistLayout/AiAssistanceConfigContext'\nimport {giveFeedbackUrl, pluginTitle, releaseAnnouncementUrl, salesUrl} from '../constants'\nimport {getConditionalMembers} from '../helpers/conditionalMembers'\nimport {assistDocumentId} from '../helpers/ids'\nimport {InspectorOnboarding} from '../onboarding/InspectorOnboarding'\nimport {inspectorOnboardingKey, useOnboardingFeature} from '../onboarding/onboardingStore'\nimport {assistDocumentTypeName, fieldPathParam, instructionParam} from '../types'\nimport {FieldTitle} from './FieldAutocomplete'\nimport {\n type FieldRef,\n getFieldTitle,\n useAiPaneRouter,\n useSelectedField,\n useTypePath,\n} from './helpers'\nimport {InstructionTaskHistoryButton} from './InstructionTaskHistoryButton'\n\nconst CardWithShadowBelow = styled(Card)`\n position: relative;\n\n &:after {\n content: '';\n display: block;\n position: absolute;\n left: 0;\n right: 0;\n bottom: -1px;\n border-bottom: 1px solid var(--card-border-color);\n opacity: 0.5;\n z-index: 100;\n }\n`\n\nconst CardWithShadowAbove = styled(Card)`\n position: relative;\n\n &:after {\n content: '';\n display: block;\n position: absolute;\n left: 0;\n right: 0;\n top: -1px;\n border-top: 1px solid var(--card-border-color);\n opacity: 0.5;\n z-index: 100;\n }\n`\n\nexport function AssistInspectorWrapper(props: DocumentInspectorProps) {\n const context = useAiAssistanceConfig()\n\n if (context.statusLoading) {\n return (\n <Flex align=\"center\" height=\"fill\" justify=\"center\" padding={4} sizing=\"border\">\n <Stack space={3} style={{textAlign: 'center'}}>\n <Spinner muted />\n <Text muted size={1}>\n Loading {pluginTitle}...\n </Text>\n </Stack>\n </Flex>\n )\n }\n\n const status = context.status\n\n if (!status?.enabled) {\n return (\n <Flex direction=\"column\" height=\"fill\">\n <DocumentInspectorHeader\n closeButtonLabel=\"Close\"\n onClose={props.onClose}\n title={pluginTitle}\n />\n\n <Stack flex={1} overflow=\"auto\" padding={4} space={3}>\n <Text as=\"p\" size={1} weight=\"semibold\">\n {pluginTitle} is not available\n </Text>\n\n <Text as=\"p\" muted size={1}>\n Please get in touch with a Sanity account manager or{' '}\n <a href={salesUrl} target=\"_blank\" rel=\"noreferrer\">\n contact our sales team\n </a>{' '}\n to get started with {pluginTitle}.{' '}\n <a href={releaseAnnouncementUrl} target=\"_blank\" rel=\"noreferrer\">\n Learn more &rarr;\n </a>\n </Text>\n </Stack>\n </Flex>\n )\n }\n\n if (!status?.initialized || !status.validToken) {\n return (\n <Flex direction=\"column\" height=\"fill\">\n <DocumentInspectorHeader\n closeButtonLabel=\"Close\"\n onClose={props.onClose}\n title={pluginTitle}\n />\n\n <Stack padding={4} space={3}>\n {context.error ? (\n <Text size={1} weight=\"semibold\">\n Failed to start {pluginTitle}\n </Text>\n ) : null}\n\n {!context.error && !status?.initialized ? (\n <Text size={1} weight=\"semibold\">\n {pluginTitle} is not enabled\n </Text>\n ) : null}\n\n {!context.error && status?.initialized && !status.validToken ? (\n <>\n <Text size={1} weight=\"semibold\">\n Invalid token\n </Text>\n <Text muted size={1}>\n The token used by the AI Assistant is not valid and has to be regenerated.\n </Text>\n </>\n ) : null}\n\n {context.error && (\n <Text muted size={1}>\n Something went wrong. See console for details.\n </Text>\n )}\n\n {!context.error && !status?.initialized && (\n <Text size={1} muted>\n Please enable {pluginTitle}.\n </Text>\n )}\n\n <Button\n fontSize={1}\n icon={\n context.initLoading ? (\n <Box marginTop={1}>\n <Spinner />\n </Box>\n ) : context.error ? (\n RetryIcon\n ) : undefined\n }\n text={\n context.error\n ? 'Retry'\n : status?.initialized && !status.validToken\n ? `Restore ${pluginTitle}`\n : `Enable ${pluginTitle} now`\n }\n tone=\"primary\"\n onClick={context.init}\n disabled={context.initLoading}\n />\n </Stack>\n </Flex>\n )\n }\n\n return <AssistInspector {...props} />\n}\n\nexport function AssistInspector(props: DocumentInspectorProps) {\n const {params} = useAiPaneRouter()\n\n const boundary = useRef<HTMLDivElement | null>(null)\n const pathKey = params?.[fieldPathParam]\n const instructionKey = params?.[instructionParam]\n const documentPane = useDocumentPane()\n const {\n documentId,\n documentType,\n value: docValue,\n schemaType,\n onChange: documentOnChange,\n formState,\n } = documentPane\n\n const {assistableDocumentId, documentIsAssistable} = useAssistDocumentContext()\n\n const formStateRef = useRef(formState)\n formStateRef.current = formState\n\n const {instructionLoading, requestRunInstruction} = useRequestRunInstruction({\n documentOnChange,\n isDocAssistable: documentIsAssistable,\n })\n\n const typePath = useTypePath(docValue, pathKey ?? '')\n const selectedField = useSelectedField(schemaType, typePath)\n\n const aiDocId = assistDocumentId(documentType)\n\n const assistDocument = useStudioAssistDocument({documentId, schemaType, initDoc: true})\n const assistField = assistDocument?.fields?.find((f) => f.path === typePath)\n const instruction = assistField?.instructions?.find((i) => i._key === instructionKey)\n const tasks = useMemo(\n () =>\n assistDocument?.tasks?.filter((i) => !instructionKey || i.instructionKey === instructionKey),\n [assistDocument?.tasks, instructionKey],\n )\n const instructions = useMemo(\n () => assistDocument?.fields?.flatMap((f) => f.instructions ?? []),\n [assistDocument?.fields],\n )\n\n const promptValue = instruction?.prompt\n const isEmptyPrompt = useMemo(() => {\n if (!promptValue?.length) {\n return true\n }\n const firstBlock = promptValue[0] as any\n const children = firstBlock?.children\n\n return promptValue.length == 1 && children?.length === 1 && !children?.[0]?.text?.length\n }, [promptValue])\n\n const paneNode: DocumentPaneNode = useMemo(\n () => ({\n type: 'document',\n id: aiDocId,\n title: pluginTitle,\n options: {\n id: aiDocId,\n type: assistDocumentTypeName,\n },\n }),\n [aiDocId],\n )\n\n const runCurrentInstruction = useCallback(\n () =>\n instruction &&\n pathKey &&\n typePath &&\n requestRunInstruction({\n documentId: assistableDocumentId,\n path: pathKey,\n typePath,\n assistDocumentId: assistDocumentId(documentType),\n instruction,\n conditionalMembers: formStateRef.current ? getConditionalMembers(formStateRef.current) : [],\n }),\n [pathKey, instruction, typePath, documentType, assistableDocumentId, requestRunInstruction],\n )\n\n const Region = useCallback((_props: any) => {\n // disabled for now\n /* return (\n <ConnectToRegion\n {..._props}\n _key={`${paneKey}_${selectedField?.key || '_field'}`}\n style={{height: '100%', flex: 1, overflow: 'auto'}}\n />\n )*/\n return <div {..._props} style={{height: '100%', flex: 1, overflow: 'auto'}} />\n }, [])\n\n const assistTypeContext = useMemo(() => ({typePath, documentType}), [typePath, documentType])\n\n if (!documentId || !schemaType || schemaType.jsonType !== 'object') {\n return (\n <Card flex={1} padding={4}>\n <Text>Document not ready yet.</Text>\n </Card>\n )\n }\n\n return (\n <Flex\n ref={boundary}\n direction=\"column\"\n height=\"fill\"\n overflow=\"hidden\"\n sizing=\"border\"\n style={{lineHeight: 0}}\n >\n <AiInspectorHeader\n onClose={props.onClose}\n field={selectedField}\n fieldTitle={getFieldTitle(selectedField)}\n />\n\n <Card as={Region} flex={1} overflow=\"auto\">\n <Flex direction=\"column\" style={{minHeight: '100%'}}>\n <Box flex={1}>\n <PresenceOverlay>\n <Box padding={4}>\n {selectedField && (\n <AssistTypeContext.Provider value={assistTypeContext}>\n <VirtualizerScrollInstanceProvider\n scrollElement={boundary.current}\n containerElement={boundary}\n >\n <DocumentPaneProvider\n paneKey={documentPane.paneKey}\n index={documentPane.index}\n itemId=\"ai\"\n pane={paneNode}\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n //@ts-ignore this is a valid option available in `corel` - Remove after corel is merged to next\n forcedVersion={{\n isReleaseLocked: false,\n selectedPerspectiveName: 'published',\n selectedReleaseId: undefined,\n }}\n >\n <DocumentForm />\n </DocumentPaneProvider>\n </VirtualizerScrollInstanceProvider>\n </AssistTypeContext.Provider>\n )}\n </Box>\n </PresenceOverlay>\n </Box>\n\n <Box flex=\"none\" padding={4}>\n <Text muted size={1}>\n How is Sanity AI Assist working for you?{' '}\n <a\n href={giveFeedbackUrl}\n target=\"_blank\"\n rel=\"noreferrer\"\n style={{whiteSpace: 'nowrap'}}\n >\n Let us know <ArrowRightIcon />\n </a>\n </Text>\n </Box>\n </Flex>\n </Card>\n <CardWithShadowAbove flex=\"none\" paddingX={4} paddingY={3} style={{justifySelf: 'flex-end'}}>\n <Flex gap={2} flex={1} justify=\"flex-end\">\n {schemaType?.name && pathKey && instructionKey && (\n <Stack flex={1}>\n <Button\n mode=\"ghost\"\n disabled={isEmptyPrompt || instructionLoading}\n fontSize={1}\n icon={instructionLoading ? <Spinner style={{marginTop: 3}} /> : PlayIcon}\n onClick={runCurrentInstruction}\n padding={3}\n text={'Run instruction'}\n />\n </Stack>\n )}\n\n <InstructionTaskHistoryButton\n documentId={assistableDocumentId}\n tasks={tasks}\n instructions={instructions}\n showTitles={!instructionKey}\n />\n </Flex>\n </CardWithShadowAbove>\n </Flex>\n )\n}\n\nfunction AiInspectorHeader(props: {fieldTitle: string; field?: FieldRef; onClose: () => void}) {\n const {onClose, field, fieldTitle} = props\n const {showOnboarding, dismissOnboarding} = useOnboardingFeature(inspectorOnboardingKey)\n\n return (\n <CardWithShadowBelow flex=\"none\" padding={2}>\n <Flex flex={1} align=\"center\">\n <Flex flex={1} padding={3} gap={2} align=\"center\">\n <Flex gap={1} align=\"center\" wrap=\"wrap\" style={{marginTop: '-4px'}}>\n <Box marginTop={1}>\n <Text size={1} weight=\"semibold\">\n AI instructions for\n </Text>\n </Box>\n <Card radius={2} border padding={1} marginTop={1}>\n {field ? (\n <FieldTitle field={field} />\n ) : (\n <Text size={1} weight=\"semibold\">\n {fieldTitle}\n </Text>\n )}\n </Card>\n </Flex>\n </Flex>\n <Box flex=\"none\">\n <Button fontSize={1} icon={CloseIcon} mode=\"bleed\" onClick={onClose} />\n </Box>\n </Flex>\n\n {showOnboarding && <InspectorOnboarding onDismiss={dismissOnboarding} />}\n </CardWithShadowBelow>\n )\n}\n","export const aiInspectorId = 'ai-assistance'\n","import {SparklesIcon} from '@sanity/icons'\nimport {DocumentInspector, typed} from 'sanity'\n\nimport {pluginTitle} from '../constants'\nimport {AssistInspectorRouteParams, fieldPathParam, instructionParam} from '../types'\nimport {AssistInspectorWrapper} from './AssistInspector'\nimport {aiInspectorId} from './constants'\n\nexport const assistInspector: DocumentInspector = {\n name: aiInspectorId,\n useMenuItem: () => ({\n icon: SparklesIcon,\n title: pluginTitle,\n hidden: true,\n showAsAction: false,\n }),\n component: AssistInspectorWrapper,\n onClose({params}) {\n return {\n params: typed<AssistInspectorRouteParams>({\n ...params,\n [fieldPathParam]: undefined,\n [instructionParam]: undefined,\n }) as typeof params,\n }\n },\n}\n","import {ConnectorOptions} from '../../_lib/connector'\n\nexport function arrowPath(options: ConnectorOptions, x: number, y: number, dir: 1 | -1): string {\n return [\n `M ${x - options.arrow.size} ${y - options.arrow.size * dir} `,\n `L ${x} ${y}`,\n `L ${x + options.arrow.size} ${y - options.arrow.size * dir}`,\n ].join('')\n}\n","import {ConnectorLine, ConnectorOptions} from '../../_lib/connector'\n\nexport function drawArrowPath(\n options: ConnectorOptions,\n x: number,\n y: number,\n dir: number,\n): string {\n return [\n `M ${x - options.arrow.size} ${y - options.arrow.size * dir} `,\n `L ${x} ${y}`,\n `L ${x + options.arrow.size} ${y - options.arrow.size * dir}`,\n ].join('')\n}\n\nfunction moveTo(x: number, y: number) {\n return `M${x} ${y}`\n}\n\nfunction lineTo(x: number, y: number) {\n return `L${x} ${y}`\n}\n\nfunction join(strings: string[], delim = '') {\n return strings.join(delim)\n}\n\nfunction quadCurve(x1: number, y1: number, x: number, y: number) {\n return `Q${x1} ${y1} ${x} ${y}`\n}\n\nexport function drawConnectorPath(options: ConnectorOptions, line: ConnectorLine): string {\n const {cornerRadius} = options.path\n const {from, to} = line\n const {x: fromX, y: fromY} = from\n const {x: _toX, y: toY} = to\n\n const toX = _toX - 1\n\n // Calculate divider position\n const dividerX = to.bounds.x + options.divider.offsetX\n\n // Calculate connector FROM path X position\n const fromPathX = from.isAbove || from.isBelow ? fromX + options.arrow.marginX : fromX\n\n // Calculate maximum corner radius\n const r0 = Math.min(cornerRadius, Math.abs(fromPathX - dividerX) / 2)\n const r1 = Math.min(cornerRadius, Math.abs(fromY - toY) / 2)\n\n const cmds: string[] = []\n\n // FROM\n if (from.isAbove) {\n cmds.push(\n moveTo(\n fromX + options.arrow.marginX,\n fromY - options.arrow.threshold + options.arrow.marginY,\n ),\n lineTo(fromX + options.arrow.marginX, fromY - r0),\n quadCurve(fromX + options.arrow.marginX, fromY, fromX + options.arrow.marginX + r0, fromY),\n )\n } else if (from.isBelow) {\n cmds.push(\n moveTo(\n fromX + options.arrow.marginX,\n fromY + options.arrow.threshold - options.arrow.marginY,\n ),\n lineTo(fromX + options.arrow.marginX, fromY + r0),\n quadCurve(fromX + options.arrow.marginX, fromY, fromX + options.arrow.marginX + r0, fromY),\n )\n } else {\n cmds.push(moveTo(fromX, fromY))\n }\n\n // TO\n if (to.isAbove) {\n if (fromY < to.bounds.y) {\n cmds.push(\n lineTo(dividerX - r1, fromY),\n quadCurve(dividerX, fromY, dividerX, fromY + r1),\n lineTo(dividerX, toY - r1),\n quadCurve(dividerX, toY, dividerX + r1, toY),\n lineTo(dividerX - cornerRadius, toY),\n quadCurve(dividerX, toY, dividerX, toY - cornerRadius),\n lineTo(dividerX, toY - options.arrow.threshold + options.arrow.marginY),\n )\n } else {\n cmds.push(\n lineTo(dividerX - cornerRadius, fromY),\n quadCurve(dividerX, fromY, dividerX, fromY - cornerRadius),\n lineTo(dividerX, toY - options.arrow.threshold + options.arrow.marginY),\n )\n }\n } else if (to.isBelow) {\n if (fromY > to.bounds.y + to.bounds.h) {\n // curl around\n cmds.push(\n lineTo(dividerX - options.arrow.marginX - r1, fromY),\n quadCurve(\n dividerX - options.arrow.marginX,\n fromY,\n dividerX - options.arrow.marginX,\n fromY - r1,\n ),\n lineTo(dividerX - options.arrow.marginX, toY + r1),\n quadCurve(\n dividerX - options.arrow.marginX,\n toY,\n dividerX - options.arrow.marginX + r1,\n toY,\n ),\n lineTo(dividerX - cornerRadius, toY),\n quadCurve(dividerX, toY, dividerX, toY + cornerRadius),\n lineTo(dividerX, toY + options.arrow.threshold - options.arrow.marginY),\n )\n } else {\n cmds.push(\n lineTo(dividerX - cornerRadius, fromY),\n quadCurve(dividerX, fromY, dividerX, fromY + cornerRadius),\n lineTo(dividerX, toY + options.arrow.threshold - options.arrow.marginY),\n )\n }\n } else if (fromY < toY) {\n cmds.push(\n lineTo(dividerX - r0, fromY),\n quadCurve(dividerX, fromY, dividerX, fromY + r1),\n lineTo(dividerX, toY - r1),\n quadCurve(dividerX, toY, dividerX + r1, toY),\n lineTo(toX, toY),\n )\n } else {\n cmds.push(\n lineTo(dividerX - Math.min(r0, r1), fromY),\n quadCurve(dividerX, fromY, dividerX, fromY - Math.min(r0, r1)),\n lineTo(dividerX, toY + r1),\n quadCurve(dividerX, toY, dividerX + r1, toY),\n lineTo(toX, toY),\n )\n }\n\n return join(cmds)\n}\n","import {rgba, useTheme} from '@sanity/ui'\nimport {useMemo} from 'react'\n\nimport {ConnectorOptions, mapConnectorToLine, Rect} from '../_lib/connector'\nimport {arrowPath} from './draw/arrowPath'\nimport {drawConnectorPath} from './draw/connectorPath'\n\nexport function ConnectorPath(props: {\n from: {bounds: Rect; element: Rect}\n to: {bounds: Rect; element: Rect}\n options: ConnectorOptions\n}) {\n const {from, options, to} = props\n const {strokeWidth} = options.path\n const theme = useTheme()\n\n const line = useMemo(() => mapConnectorToLine(options, {from, to}), [from, options, to])\n\n return (\n <>\n <path\n d={drawConnectorPath(options, line)}\n stroke={theme.sanity.color.base.bg}\n strokeWidth={strokeWidth + 4}\n />\n\n <path\n d={drawConnectorPath(options, line)}\n stroke={rgba(theme.sanity.color.base.border, 0.5)}\n strokeWidth={strokeWidth}\n />\n\n {line.from.isAbove && (\n <path\n d={arrowPath(\n options,\n line.from.x + options.arrow.marginX,\n line.from.bounds.y - options.arrow.threshold + options.arrow.marginY,\n -1,\n )}\n stroke={theme.sanity.color.base.border}\n strokeWidth={strokeWidth}\n />\n )}\n\n {line.from.isBelow && (\n <path\n d={arrowPath(\n options,\n line.from.x + options.arrow.marginX,\n line.from.bounds.y +\n line.from.bounds.h +\n options.arrow.threshold -\n options.arrow.marginY,\n 1,\n )}\n stroke={theme.sanity.color.base.border}\n strokeWidth={strokeWidth}\n />\n )}\n </>\n )\n}\n","import {Fragment, useEffect, useState} from 'react'\n\nimport {Connector, ConnectorOptions} from '../_lib/connector'\nimport {ConnectorPath} from './ConnectorPath'\n\nconst DEBUG = false\n\nconst options: ConnectorOptions = {\n arrow: {\n marginX: 10.5,\n marginY: 5,\n size: 4,\n threshold: 16.5,\n },\n divider: {\n offsetX: -10.5,\n },\n path: {\n cornerRadius: 3,\n marginY: 10.5,\n strokeWidth: 1,\n },\n}\n\nexport function AssistConnectorsOverlay(props: {connectors: Connector[]}) {\n const {connectors} = props\n // const zIndexes = connectors.map((connector) => {\n // const zIndex = connector.from.payload?.zIndex\n\n // if (typeof zIndex === 'number') {\n // return zIndex\n // }\n\n // return 1\n // })\n const [, setRedraw] = useState(false)\n useEffect(() => {\n // hacky workaround to force redraw for connectors on initial render\n // this seem to improve initial measurements of elements\n setRedraw(true)\n }, [])\n\n // const zIndex = zIndexes.length ? Math.max(...zIndexes) : 1\n\n return (\n <>\n <svg\n fill=\"none\"\n width={window.innerWidth}\n height={window.innerHeight}\n style={{\n position: 'absolute',\n top: 0,\n left: 0,\n width: '100%',\n height: '100%',\n pointerEvents: 'none',\n zIndex: 150,\n // zIndex,\n }}\n >\n {connectors.map((connector) => (\n <ConnectorPath\n from={connector.from}\n key={connector.key}\n options={options}\n to={connector.to}\n />\n ))}\n </svg>\n {DEBUG &&\n connectors.map(({key, from, to}) => {\n return (\n <Fragment key={key}>\n <div\n style={{\n position: 'fixed',\n top: from.bounds.y,\n left: from.bounds.x,\n width: from.bounds.w,\n height: from.bounds.h,\n pointerEvents: 'none',\n overflow: 'hidden',\n outline: '1px dotted red',\n outlineOffset: -1,\n zIndex: 10000000 - 1,\n }}\n >\n <div\n style={{\n position: 'absolute',\n top: from.element.y - from.bounds.y,\n left: from.element.x - from.bounds.x,\n width: from.element.w,\n height: from.element.h,\n border: '1px solid red',\n boxSizing: 'border-box',\n }}\n />\n </div>\n\n <div\n style={{\n position: 'fixed',\n top: to.bounds.y,\n left: to.bounds.x,\n width: to.bounds.w,\n height: to.bounds.h,\n pointerEvents: 'none',\n overflow: 'hidden',\n outline: '1px dotted teal',\n outlineOffset: -1,\n zIndex: 10000000 - 1,\n }}\n >\n <div\n style={{\n position: 'absolute',\n top: to.element.y - to.bounds.y,\n left: to.element.x - to.bounds.x,\n width: to.element.w,\n height: to.element.h,\n border: '1px solid teal',\n boxSizing: 'border-box',\n }}\n />\n </div>\n </Fragment>\n )\n })}\n </>\n )\n}\n","import {packageName} from '../constants'\nimport {TranslateStyleguide, TranslateStyleguideContext} from '../translate/types'\n\nexport function validateStyleguide(styleguide: string | undefined) {\n if (styleguide && styleguide.length > 2000) {\n throw new Error(\n `[${packageName}]: \\`translate.styleguide\\` value is too long. It must be 2000 characters or less, but was ${styleguide.length} characters`,\n )\n }\n return styleguide\n}\n\nexport function createStyleGuideResolver(\n styleguide: TranslateStyleguide | undefined,\n context: TranslateStyleguideContext,\n) {\n return async () => {\n if (typeof styleguide !== 'function') {\n return styleguide\n }\n const styleguideResult = await styleguide(context)\n return validateStyleguide(styleguideResult)\n }\n}\n","import {get} from 'lodash'\nimport type {SanityDocumentLike} from 'sanity'\n\nexport const getLanguageParams = (\n select: Record<string, string> | undefined,\n document: SanityDocumentLike | undefined,\n): Record<string, unknown> => {\n if (!select || !document) {\n return {}\n }\n\n const selection: Record<string, string> = select || {}\n const selectedValue: Record<string, unknown> = {}\n for (const [key, path] of Object.entries(selection)) {\n let value = get(document, path)\n if (Array.isArray(value)) {\n // If there are references in the array, ensure they have `_ref` set, otherwise they are considered empty and can safely be ignored\n value = value.filter((item) =>\n typeof item === 'object' ? item?._type !== 'reference' || '_ref' in item : true,\n )\n }\n selectedValue[key] = value\n }\n\n return selectedValue\n}\n","export const toFieldLanguagesKeyPrefix = 'sanityStudio:assist:field-languages:from:'\n\nexport function getPreferredToFieldLanguages(fromLanguageId: string): string[] {\n if (typeof localStorage === 'undefined') {\n return []\n }\n\n const value = localStorage.getItem(`${toFieldLanguagesKeyPrefix}${fromLanguageId}`)\n return value ? (JSON.parse(value) as string[]) : []\n}\n\nexport function setPreferredToFieldLanguages(fromLanguageId: string, languageIds: string[]) {\n if (typeof localStorage === 'undefined') {\n return\n }\n\n localStorage.setItem(`${toFieldLanguagesKeyPrefix}${fromLanguageId}`, JSON.stringify(languageIds))\n}\n","import {extractWithPath} from '@sanity/mutator'\nimport {\n isDocumentSchemaType,\n isKeySegment,\n type ObjectSchemaType,\n type Path,\n pathToString,\n type SanityDocumentLike,\n} from 'sanity'\n\nimport type {DocumentMember, TranslationOutput, TranslationOutputsFunction} from './types'\n\nexport interface FieldLanguageMap {\n inputLanguageId: string\n inputPath: Path\n outputs: TranslationOutput[]\n}\n\nconst DEFAULT_MAX_DEPTH = 6\nconst ABSOLUTE_MAX_DEPTH = 50\n\nexport function getDocumentMembersFlat(\n doc: SanityDocumentLike,\n schemaType: ObjectSchemaType,\n maxDepth = DEFAULT_MAX_DEPTH,\n) {\n if (!isDocumentSchemaType(schemaType)) {\n console.error(`Schema type is not a document`)\n return []\n }\n\n return extractPaths(doc, schemaType, [], Math.min(maxDepth, ABSOLUTE_MAX_DEPTH))\n}\n\nfunction extractPaths(\n doc: SanityDocumentLike,\n schemaType: ObjectSchemaType,\n path: Path,\n maxDepth: number,\n): DocumentMember[] {\n if (path.length >= maxDepth) {\n return []\n }\n\n return schemaType.fields.reduce<DocumentMember[]>((acc, field) => {\n const fieldPath = [...path, field.name]\n const fieldSchema = field.type\n const {value} = extractWithPath(pathToString(fieldPath), doc)[0] ?? {}\n if (!value) {\n return acc\n }\n\n const thisFieldWithPath: DocumentMember = {\n path: fieldPath,\n name: field.name,\n schemaType: fieldSchema,\n value,\n }\n\n if (fieldSchema.jsonType === 'object') {\n const innerFields = extractPaths(doc, fieldSchema, fieldPath, maxDepth)\n\n return [...acc, thisFieldWithPath, ...innerFields]\n } else if (\n fieldSchema.jsonType === 'array' &&\n fieldSchema.of.length &&\n fieldSchema.of.some((item) => 'fields' in item) &&\n // no reason to drill into arrays if the item fields will be culled by maxDepth, ie we need 1 extra path headroom\n path.length + 1 < maxDepth\n ) {\n const {value: arrayValue} = extractWithPath(pathToString(fieldPath), doc)[0] ?? {}\n\n let arrayPaths: DocumentMember[] = []\n if ((arrayValue as any)?.length) {\n for (const item of arrayValue as any[]) {\n const itemPath = [...fieldPath, {_key: item._key}]\n let itemSchema = fieldSchema.of.find((t) => t.name === item._type)\n if (!item._type) {\n itemSchema = fieldSchema.of[0]\n console.warn(\n 'Array item is missing _type - using the first defined type in the array.of schema',\n {\n itemPath,\n item,\n itemSchema,\n },\n )\n }\n if (item._key && itemSchema) {\n const innerFields = extractPaths(\n doc,\n itemSchema as ObjectSchemaType,\n itemPath,\n maxDepth,\n )\n const arrayMember = {\n path: itemPath,\n name: item._key,\n schemaType: itemSchema,\n value: item,\n }\n arrayPaths = [...arrayPaths, arrayMember, ...innerFields]\n }\n }\n }\n\n return [...acc, thisFieldWithPath, ...arrayPaths]\n }\n\n return [...acc, thisFieldWithPath]\n }, [])\n}\n\n/**\n * Default implementation for plugin config `translate.field.translationOutputs`\n *\n * @see FieldTranslationConfig#translationOutputs\n */\nexport const defaultLanguageOutputs: TranslationOutputsFunction = function (\n member,\n enclosingType,\n translateFromLanguageId,\n translateToLanguageIds,\n) {\n if (\n member.schemaType.jsonType === 'object' &&\n member.schemaType.name.startsWith('internationalizedArray')\n ) {\n const pathEnd = member.path.slice(-1)\n\n const language = isKeySegment(pathEnd[0]) ? pathEnd[0]._key : null\n return language === translateFromLanguageId\n ? translateToLanguageIds.map((translateToId) => ({\n id: translateToId,\n outputPath: [...member.path.slice(0, -1), {_key: translateToId}],\n }))\n : undefined\n }\n\n if (enclosingType.jsonType === 'object' && enclosingType.name.startsWith('locale')) {\n return translateFromLanguageId === member.name\n ? translateToLanguageIds.map((translateToId) => ({\n id: translateToId,\n outputPath: [...member.path.slice(0, -1), translateToId],\n }))\n : undefined\n }\n\n return undefined\n}\n\nexport function getFieldLanguageMap(\n documentSchema: ObjectSchemaType,\n documentMembers: DocumentMember[],\n translateFromLanguageId: string,\n outputLanguageIds: string[],\n langFn: TranslationOutputsFunction,\n): FieldLanguageMap[] {\n const translationMaps: FieldLanguageMap[] = []\n for (const member of documentMembers) {\n const parentPath = member.path.slice(0, -1)\n const enclosingType =\n documentMembers.find((m) => pathToString(m.path) === pathToString(parentPath))?.schemaType ??\n documentSchema\n\n const translations = langFn(\n member,\n enclosingType,\n translateFromLanguageId,\n outputLanguageIds,\n )?.filter((translation) => translation.id !== translateFromLanguageId)\n\n if (translations) {\n translationMaps.push({\n inputLanguageId: translateFromLanguageId,\n inputPath: member.path,\n outputs: translations,\n })\n }\n }\n\n return translationMaps\n}\n","import {PlayIcon} from '@sanity/icons'\nimport {Box, Button, Checkbox, Dialog, Flex, Radio, Spinner, Stack, Text, Tooltip} from '@sanity/ui'\nimport {\n createContext,\n type PropsWithChildren,\n useCallback,\n useContext,\n useId,\n useMemo,\n useState,\n} from 'react'\nimport {\n type ObjectSchemaType,\n type Path,\n pathToString,\n type SanityDocumentLike,\n useClient,\n} from 'sanity'\n\nimport {useAiAssistanceConfig} from '../assistLayout/AiAssistanceConfigContext'\nimport type {ConditionalMemberState} from '../helpers/conditionalMembers'\nimport {createStyleGuideResolver} from '../helpers/styleguide'\nimport {API_VERSION_WITH_EXTENDED_TYPES, useApiClient, useTranslate} from '../useApiClient'\nimport {getLanguageParams} from './getLanguageParams'\nimport {getPreferredToFieldLanguages, setPreferredToFieldLanguages} from './languageStore'\nimport {\n defaultLanguageOutputs,\n type FieldLanguageMap,\n getDocumentMembersFlat,\n getFieldLanguageMap,\n} from './paths'\nimport type {Language} from './types'\n\ninterface FieldTranslationParams {\n document: SanityDocumentLike\n documentSchema: ObjectSchemaType\n translatePath: Path\n conditionalMembers: ConditionalMemberState[]\n}\n\nexport interface FieldTranslationContextValue {\n openFieldTranslation: (args: FieldTranslationParams) => void\n translationLoading: boolean\n}\n\nexport const FieldTranslationContext = createContext<FieldTranslationContextValue>({\n openFieldTranslation: () => {},\n translationLoading: false,\n})\n\nexport function useFieldTranslation() {\n return useContext(FieldTranslationContext)\n}\n\nfunction hasValuesToTranslate(\n fieldLanguageMaps: FieldLanguageMap[] | undefined,\n fromLanguage: Language | undefined,\n basePath: Path,\n) {\n return fieldLanguageMaps?.some(\n (map) =>\n map.inputLanguageId === fromLanguage?.id &&\n map.inputPath &&\n pathToString(map.inputPath).startsWith(pathToString(basePath)),\n )\n}\n\n// eslint-disable-next-line @typescript-eslint/ban-types\nexport function FieldTranslationProvider(props: PropsWithChildren<{}>) {\n const {config: assistConfig} = useAiAssistanceConfig()\n\n const apiClient = useApiClient(assistConfig.__customApiClient)\n const styleguide = assistConfig.translate?.styleguide\n const config = assistConfig.translate?.field\n const {translate: runTranslate} = useTranslate(apiClient)\n\n const [dialogOpen, setDialogOpen] = useState(false)\n\n const [fieldTranslationParams, setFieldTranslationParams] = useState<\n FieldTranslationParams | undefined\n >()\n const [languages, setLanguages] = useState<Language[] | undefined>()\n const [fromLanguage, setFromLanguage] = useState<Language | undefined>(undefined)\n const [toLanguages, setToLanguages] = useState<Language[] | undefined>(undefined)\n const [fieldLanguageMaps, setFieldLanguageMaps] = useState<FieldLanguageMap[] | undefined>()\n\n const close = useCallback(() => {\n setDialogOpen(false)\n setLanguages(undefined)\n setFieldTranslationParams(undefined)\n }, [])\n const languageClient = useClient({\n apiVersion: config?.apiVersion ?? API_VERSION_WITH_EXTENDED_TYPES,\n })\n const documentId = fieldTranslationParams?.document?._id\n const id = useId()\n\n const selectFromLanguage = useCallback(\n (\n from: Language,\n languages: Language[] | undefined,\n params: FieldTranslationParams | undefined,\n ) => {\n const {document, documentSchema} = params ?? {}\n setFromLanguage(from)\n if (!document || !documentSchema || !params || !languages) {\n setFieldLanguageMaps(undefined)\n return\n }\n\n const preferred = getPreferredToFieldLanguages(from.id)\n const allToLanguages = languages.filter((l) => l.id !== from?.id)\n const filteredToLanguages = allToLanguages.filter(\n (l) => !preferred.length || preferred.includes(l.id),\n )\n\n setToLanguages(filteredToLanguages)\n const fromId = from?.id\n const allToIds = allToLanguages?.map((l) => l.id) ?? []\n const docMembers = getDocumentMembersFlat(document, documentSchema, config?.maxPathDepth)\n if (fromId && allToIds?.length) {\n const transMap = getFieldLanguageMap(\n documentSchema,\n docMembers,\n fromId,\n allToIds.filter((toId) => fromId !== toId),\n config?.translationOutputs ?? defaultLanguageOutputs,\n )\n setFieldLanguageMaps(transMap)\n } else {\n setFieldLanguageMaps(undefined)\n }\n },\n [config],\n )\n\n const toggleToLanguage = useCallback(\n (\n toggledLang: Language,\n toLanguages: Language[] | undefined,\n languages: Language[] | undefined,\n ) => {\n if (!languages || !fromLanguage) {\n return\n }\n const wasSelected = !!toLanguages?.find((l) => l.id === toggledLang.id)\n const newToLangs = languages.filter(\n (anyLang) =>\n !!toLanguages?.find(\n (selectedLang) => toggledLang.id !== selectedLang.id && selectedLang.id === anyLang.id,\n ) ||\n (toggledLang.id === anyLang.id && !wasSelected),\n )\n setToLanguages(newToLangs)\n setPreferredToFieldLanguages(\n fromLanguage.id,\n newToLangs.map((l) => l.id),\n )\n },\n [fromLanguage],\n )\n\n const openFieldTranslation = useCallback(\n async (params: FieldTranslationParams) => {\n setDialogOpen(true)\n const languageParams = getLanguageParams(config?.selectLanguageParams, params.document)\n const languages: Language[] | undefined = await (typeof config?.languages === 'function'\n ? config?.languages(languageClient, languageParams)\n : Promise.resolve(config?.languages))\n setLanguages(languages)\n setFieldTranslationParams(params)\n const fromLanguage = languages?.[0]\n if (fromLanguage) {\n selectFromLanguage(fromLanguage, languages, params)\n } else {\n console.error('No languages available for selected language params', languageParams)\n }\n },\n [selectFromLanguage, config, languageClient],\n )\n\n const contextValue: FieldTranslationContextValue = useMemo(() => {\n return {\n openFieldTranslation,\n translationLoading: false,\n }\n }, [openFieldTranslation])\n\n const runDisabled =\n !fromLanguage ||\n !toLanguages?.length ||\n !fieldLanguageMaps?.length ||\n !documentId ||\n !hasValuesToTranslate(fieldLanguageMaps, fromLanguage, fieldTranslationParams.translatePath)\n\n const onRunTranslation = useCallback(() => {\n const translatePath = fieldTranslationParams?.translatePath\n if (fieldLanguageMaps && documentId && translatePath) {\n runTranslate({\n documentId,\n translatePath,\n styleguide: createStyleGuideResolver(styleguide, {\n client: languageClient,\n documentId,\n schemaType: fieldTranslationParams?.documentSchema,\n translatePath,\n }),\n fieldLanguageMap: fieldLanguageMaps.map((map) => ({\n ...map,\n // eslint-disable-next-line max-nested-callbacks\n outputs: map.outputs.filter((out) => !!toLanguages?.find((l) => l.id === out.id)),\n })),\n conditionalMembers: fieldTranslationParams?.conditionalMembers,\n })\n }\n close()\n }, [\n fieldLanguageMaps,\n documentId,\n runTranslate,\n styleguide,\n close,\n toLanguages,\n fieldTranslationParams?.translatePath,\n fieldTranslationParams?.conditionalMembers,\n fieldTranslationParams?.documentSchema,\n languageClient,\n ])\n\n const runButton = (\n <Button\n text={`Translate`}\n tone=\"primary\"\n icon={PlayIcon}\n style={{width: '100%'}}\n disabled={runDisabled}\n onClick={onRunTranslation}\n />\n )\n\n return (\n <FieldTranslationContext.Provider value={contextValue}>\n {dialogOpen ? (\n <Dialog\n id={id}\n width={1}\n open={dialogOpen}\n onClose={close}\n header=\"Translate fields\"\n footer={\n <Flex justify=\"space-between\" padding={2} flex={1}>\n {runDisabled ? (\n <Tooltip\n content={\n <Flex padding={2}>\n <Text>There is nothing to translate in the selected from-language.</Text>\n </Flex>\n }\n placement=\"top\"\n >\n <Flex flex={1}>{runButton}</Flex>\n </Tooltip>\n ) : (\n runButton\n )}\n </Flex>\n }\n >\n {languages ? (\n <Flex padding={4} gap={5} align=\"flex-start\" justify=\"center\">\n <Stack space={2}>\n <Box marginBottom={2}>\n <Text weight=\"semibold\">From</Text>\n </Box>\n {languages?.map((radioLanguage) => (\n <FromLanguageRadio\n key={radioLanguage.id}\n {...{\n radioLanguage,\n fromLanguage,\n selectFromLanguage,\n languages,\n fieldTranslationParams,\n }}\n />\n ))}\n </Stack>\n\n <Stack space={2}>\n <Box marginBottom={2}>\n <Text weight=\"semibold\">To</Text>\n </Box>\n {languages.map((checkboxLanguage) => (\n <ToLanguageCheckbox\n key={checkboxLanguage.id}\n {...{checkboxLanguage, fromLanguage, toLanguages, toggleToLanguage, languages}}\n />\n ))}\n </Stack>\n </Flex>\n ) : (\n <Flex padding={4} gap={2} align=\"flex-start\" justify=\"center\">\n <Box>\n <Spinner />\n </Box>\n <Text>Loading languages...</Text>\n </Flex>\n )}\n </Dialog>\n ) : null}\n {props.children}\n </FieldTranslationContext.Provider>\n )\n}\n\nfunction ToLanguageCheckbox(props: {\n checkboxLanguage: Language\n fromLanguage: Language | undefined\n toLanguages: Language[] | undefined\n toggleToLanguage: (\n toggledLang: Language,\n toLanguages: Language[] | undefined,\n languages: Language[] | undefined,\n ) => void\n languages: Language[]\n}) {\n const {checkboxLanguage, fromLanguage, toLanguages, toggleToLanguage, languages} = props\n const langId = checkboxLanguage.id\n const onChange = useCallback(\n () => toggleToLanguage(checkboxLanguage, toLanguages, languages),\n [toggleToLanguage, checkboxLanguage, toLanguages, languages],\n )\n return (\n <Flex\n key={langId}\n gap={3}\n align=\"center\"\n as={'label'}\n style={langId === fromLanguage?.id ? {opacity: 0.5} : undefined}\n >\n <Checkbox\n name=\"toLang\"\n value={langId}\n checked={langId !== fromLanguage?.id && !!toLanguages?.find((tl) => tl.id === langId)}\n onChange={onChange}\n disabled={langId === fromLanguage?.id}\n />\n <Text muted={langId === fromLanguage?.id}>{checkboxLanguage.title ?? langId}</Text>\n </Flex>\n )\n}\n\nfunction FromLanguageRadio(props: {\n radioLanguage: Language\n fromLanguage: Language | undefined\n selectFromLanguage: (\n from: Language,\n languages: Language[] | undefined,\n params: FieldTranslationParams | undefined,\n ) => void\n languages: Language[] | undefined\n fieldTranslationParams: FieldTranslationParams | undefined\n}) {\n const {languages, radioLanguage, selectFromLanguage, fromLanguage, fieldTranslationParams} = props\n const langId = radioLanguage.id\n\n const onChange = useCallback(\n () => selectFromLanguage(radioLanguage, languages, fieldTranslationParams),\n [selectFromLanguage, radioLanguage, languages, fieldTranslationParams],\n )\n return (\n <Flex key={langId} gap={3} align=\"center\" as={'label'}>\n <Radio\n name=\"fromLang\"\n value={langId}\n checked={langId === fromLanguage?.id}\n onChange={onChange}\n />\n <Text>{radioLanguage.title ?? radioLanguage.id}</Text>\n </Flex>\n )\n}\n","import {ThemeProvider} from '@sanity/ui'\nimport {useState} from 'react'\nimport {LayoutProps} from 'sanity'\n\nimport {Connector, ConnectorsProvider} from '../_lib/connector'\nimport {AssistConnectorsOverlay} from '../assistConnectors'\nimport {AssistPluginConfig} from '../plugin'\nimport {FieldTranslationProvider} from '../translate/FieldTranslationProvider'\nimport {StudioInstruction} from '../types'\nimport {RunInstructionRequest} from '../useApiClient'\nimport {AiAssistanceConfigProvider} from './AiAssistanceConfigContext'\nimport {RunInstructionProvider} from './RunInstructionProvider'\n\nexport interface AIStudioLayoutProps extends LayoutProps {\n config: AssistPluginConfig\n}\n\nexport type RunInstructionArgs = Omit<RunInstructionRequest, 'instructionKey' | 'userText'> & {\n instruction: StudioInstruction\n}\n\nexport function AssistLayout(props: AIStudioLayoutProps) {\n const [connectors, setConnectors] = useState<Connector[]>([])\n\n return (\n <AiAssistanceConfigProvider config={props.config}>\n <RunInstructionProvider>\n <FieldTranslationProvider>\n <ConnectorsProvider onConnectorsChange={setConnectors}>\n {props.renderDefault(props)}\n <ThemeProvider tone=\"default\">\n <AssistConnectorsOverlay connectors={connectors} />\n </ThemeProvider>\n </ConnectorsProvider>\n </FieldTranslationProvider>\n </RunInstructionProvider>\n </AiAssistanceConfigProvider>\n )\n}\n","import {createContext, useEffect, useMemo, useState} from 'react'\nimport {getPublishedId, type InputProps, pathToString, useSyncState} from 'sanity'\nimport {useDocumentPane, usePaneRouter} from 'sanity/structure'\n\nimport {useAssistDocumentContext} from '../assistDocument/AssistDocumentContext'\nimport {useAiAssistanceConfig} from '../assistLayout/AiAssistanceConfigContext'\nimport {getDescriptionFieldOption, getImageInstructionFieldOption} from '../helpers/typeUtils'\nimport {canUseAssist, useApiClient, useGenerateCaption} from '../useApiClient'\n\nexport interface ImageContextValue {\n imageDescriptionPath?: string\n imageInstructionPath?: string\n assetRef?: string\n}\n\nexport const ImageContext = createContext<ImageContextValue>({})\n\nexport function ImageContextProvider(props: InputProps) {\n const {schemaType, path, value, readOnly} = props\n const assetRef = (value as any)?.asset?._ref\n const {selectedReleaseId} = useDocumentPane()\n const [assetRefState, setAssetRefState] = useState<string | undefined>(assetRef)\n\n const {assistableDocumentId, documentSchemaType} = useAssistDocumentContext()\n const {config, status} = useAiAssistanceConfig()\n const apiClient = useApiClient(config?.__customApiClient)\n const {generateCaption} = useGenerateCaption(apiClient)\n\n const {isSyncing} = useSyncState(\n getPublishedId(assistableDocumentId),\n documentSchemaType.name,\n selectedReleaseId,\n )\n\n const router = usePaneRouter()\n const isShowingOlderRevision = !!router.params?.rev\n\n useEffect(() => {\n const descriptionField = getDescriptionFieldOption(schemaType)\n if (\n assetRef &&\n assistableDocumentId &&\n descriptionField?.updateOnImageChange &&\n assetRef !== assetRefState &&\n !isSyncing &&\n !isShowingOlderRevision &&\n !readOnly\n ) {\n setAssetRefState(assetRef)\n if (canUseAssist(status)) {\n generateCaption({\n path: pathToString([...path, descriptionField.path]),\n documentId: assistableDocumentId,\n })\n }\n }\n }, [\n schemaType,\n path,\n assetRef,\n assetRefState,\n assistableDocumentId,\n generateCaption,\n isSyncing,\n status,\n readOnly,\n isShowingOlderRevision,\n ])\n\n const context: ImageContextValue = useMemo(() => {\n const descriptionField = getDescriptionFieldOption(schemaType)\n const imageInstructionField = getImageInstructionFieldOption(schemaType)\n return {\n imageDescriptionPath: descriptionField?.path\n ? pathToString([...path, descriptionField.path])\n : undefined,\n imageInstructionPath: imageInstructionField\n ? pathToString([...path, imageInstructionField])\n : undefined,\n assetRef,\n }\n }, [schemaType, path, assetRef])\n\n return <ImageContext.Provider value={context}>{props.renderDefault(props)}</ImageContext.Provider>\n}\n","import {icons} from '@sanity/icons'\nimport {Button, Menu, MenuButton, MenuItem} from '@sanity/ui'\nimport {ElementType, ReactNode, useCallback, useId, useMemo} from 'react'\nimport {set, StringInputProps} from 'sanity'\n\nexport function IconInput(props: StringInputProps) {\n const {value, onChange} = props\n const id = useId()\n const items = useMemo(\n () =>\n Object.entries(icons).map(([key, icon]) => (\n <IconItem key={key} iconKey={key} icon={icon} onChange={onChange} />\n )),\n [onChange],\n )\n\n const selectedIcon = useMemo(() => getIcon(value), [value])\n\n return (\n <MenuButton\n button={\n <Button icon={selectedIcon} title=\"Select icon\" padding={3} mode=\"ghost\" radius={1} />\n }\n id={id}\n menu={<Menu style={{maxHeight: 300}}>{items}</Menu>}\n popover={{portal: true}}\n />\n )\n}\n\nfunction IconItem({\n icon,\n iconKey: key,\n onChange,\n}: {\n iconKey: string\n icon: ElementType | ReactNode\n onChange: StringInputProps['onChange']\n}) {\n const onClick = useCallback(() => onChange(set(key)), [onChange, key])\n return <MenuItem icon={icon} title={key} text={key} onClick={onClick} />\n}\n\nexport function getIcon(iconName?: string) {\n return Object.entries(icons).find(([key]) => key === iconName)?.[1] ?? icons.sparkles\n}\n","import {useMemo} from 'react'\nimport {Path, SchemaType} from 'sanity'\n\nimport {isAssistSupported} from './assistSupported'\n\nexport function useAssistSupported(path: Path, schemaType: SchemaType) {\n return useMemo(() => isAssistSupported(schemaType), [schemaType])\n}\n","/* eslint-disable react-hooks/rules-of-hooks */\nimport {TranslateIcon} from '@sanity/icons'\nimport {Box, Spinner} from '@sanity/ui'\nimport {useMemo, useRef} from 'react'\nimport {\n DocumentFieldAction,\n DocumentFieldActionGroup,\n DocumentFieldActionItem,\n DocumentFieldActionProps,\n ObjectSchemaType,\n useClient,\n} from 'sanity'\nimport {useDocumentPane} from 'sanity/structure'\n\nimport {useDraftDelayedTask} from '../assistDocument/RequestRunInstructionProvider'\nimport {useAiAssistanceConfig} from '../assistLayout/AiAssistanceConfigContext'\nimport {isAssistSupported} from '../helpers/assistSupported'\nimport {getConditionalMembers} from '../helpers/conditionalMembers'\nimport {createStyleGuideResolver} from '../helpers/styleguide'\nimport type {AssistOptions} from '../schemas/typeDefExtensions'\nimport {API_VERSION_WITH_EXTENDED_TYPES, useApiClient, useTranslate} from '../useApiClient'\nimport {useFieldTranslation} from './FieldTranslationProvider'\n\nfunction node(node: DocumentFieldActionItem | DocumentFieldActionGroup) {\n return node\n}\n\nexport type TranslateProps = DocumentFieldActionProps & {\n documentIsAssistable?: boolean\n documentSchemaType?: ObjectSchemaType\n}\nexport const translateActions: DocumentFieldAction = {\n name: 'sanity-assist-translate',\n useAction(props: TranslateProps) {\n const {config, status} = useAiAssistanceConfig()\n const apiClient = useApiClient(config?.__customApiClient)\n const client = useClient({apiVersion: API_VERSION_WITH_EXTENDED_TYPES})\n const {\n schemaType: fieldSchemaType,\n path,\n documentId,\n documentSchemaType,\n documentIsAssistable,\n } = props\n const isDocumentLevel = path.length === 0\n const readOnly = fieldSchemaType.readOnly === true\n\n const docTransTypes = config.translate?.document?.documentTypes\n const options = fieldSchemaType?.options as AssistOptions | undefined\n const addFieldAction = isDocumentLevel || options?.aiAssist?.translateAction\n\n //All props used here MUST have the same value always, or we break the rules of hooks (conditional hook usage)\n const fieldTransEnabled =\n addFieldAction &&\n documentSchemaType &&\n config.translate?.field?.documentTypes?.includes(documentSchemaType.name)\n const documentTranslationEnabled =\n addFieldAction &&\n documentSchemaType &&\n ((!docTransTypes && isAssistSupported(fieldSchemaType)) ||\n docTransTypes?.includes(documentSchemaType.name))\n\n // these checks are stable (ie, does not change after mount), so not breaking rules of hooks\n if (documentSchemaType && (documentTranslationEnabled || fieldTransEnabled)) {\n const {value: documentValue, onChange: documentOnChange, formState} = useDocumentPane()\n const docRef = useRef(documentValue)\n docRef.current = documentValue\n const formStateRef = useRef(formState)\n formStateRef.current = formState\n\n const translationApi = useTranslate(apiClient)\n const translate = useDraftDelayedTask({\n documentOnChange,\n isDocAssistable: documentIsAssistable ?? false,\n task: translationApi.translate,\n })\n\n const styleguide = config.translate?.styleguide\n const languagePath = config.translate?.document?.languageField\n\n // if this is true, it is stable, and not breaking rules of hooks\n const translateDocumentAction = useMemo(() => {\n if (!languagePath || !documentTranslationEnabled) {\n return undefined\n }\n const title = path.length ? `Translate` : `Translate document`\n return node({\n type: 'action',\n icon: translationApi.loading\n ? () => (\n <Box style={{height: 17}}>\n <Spinner style={{transform: 'translateY(6px)'}} />\n </Box>\n )\n : TranslateIcon,\n title,\n onAction: () => {\n if (translationApi.loading || !languagePath || !documentId) {\n return\n }\n translate({\n languagePath,\n translatePath: path,\n styleguide: createStyleGuideResolver(styleguide, {\n client,\n documentId,\n schemaType: documentSchemaType,\n }),\n documentId: documentId ?? '',\n conditionalMembers: formStateRef.current\n ? getConditionalMembers(formStateRef.current)\n : [],\n })\n },\n renderAsButton: true,\n disabled: translationApi.loading || readOnly,\n })\n }, [\n languagePath,\n translate,\n styleguide,\n documentId,\n translationApi.loading,\n documentTranslationEnabled,\n path,\n readOnly,\n client,\n documentSchemaType,\n ])\n const fieldTranslate = useFieldTranslation()\n const openFieldTranslation = useDraftDelayedTask({\n documentOnChange,\n isDocAssistable: documentIsAssistable ?? false,\n task: fieldTranslate.openFieldTranslation,\n })\n\n const maxDepth = config.translate?.field?.maxPathDepth\n const translateFieldsAction = useMemo(\n () =>\n fieldTransEnabled\n ? node({\n type: 'action',\n icon: fieldTranslate.translationLoading\n ? () => (\n <Box style={{height: 17}}>\n <Spinner style={{transform: 'translateY(6px)'}} />\n </Box>\n )\n : TranslateIcon,\n title: `Translate fields...`,\n onAction: () => {\n if (fieldTranslate.translationLoading || !documentId) {\n return\n }\n if (formStateRef.current) {\n getConditionalMembers(formStateRef.current)\n }\n openFieldTranslation({\n document: {\n ...docRef.current,\n _id: documentId,\n },\n documentSchema: documentSchemaType,\n translatePath: path,\n conditionalMembers: formStateRef.current\n ? getConditionalMembers(formStateRef.current, maxDepth)\n : [],\n })\n },\n renderAsButton: true,\n disabled: fieldTranslate.translationLoading || readOnly,\n })\n : undefined,\n [\n openFieldTranslation,\n documentSchemaType,\n documentId,\n fieldTranslate.translationLoading,\n fieldTransEnabled,\n path,\n readOnly,\n maxDepth,\n ],\n )\n\n // eslint-disable-next-line react-hooks/rules-of-hooks\n return useMemo(() => {\n if (!status?.initialized) {\n return undefined as unknown as DocumentFieldActionItem\n }\n return node({\n type: 'group',\n icon: () => null,\n title: 'Translation',\n children: [translateDocumentAction, translateFieldsAction].filter(\n (c): c is DocumentFieldActionItem => !!c,\n ),\n expanded: true,\n })\n }, [translateDocumentAction, translateFieldsAction, status])\n }\n // works but not supported by types\n return undefined as unknown as DocumentFieldActionItem\n },\n}\n","import {ImageIcon} from '@sanity/icons'\nimport {Box, Spinner} from '@sanity/ui'\nimport {useContext, useMemo} from 'react'\nimport type {DocumentFieldAction, DocumentFieldActionGroup, DocumentFieldActionItem} from 'sanity'\nimport {useDocumentPane} from 'sanity/structure'\n\nimport {useAssistDocumentContext} from '../assistDocument/AssistDocumentContext'\nimport {aiInspectorId} from '../assistInspector/constants'\nimport {useAiAssistanceConfig} from '../assistLayout/AiAssistanceConfigContext'\nimport {ImageContext} from '../components/ImageContext'\nimport {usePathKey} from '../helpers/misc'\nimport {fieldPathParam, instructionParam} from '../types'\nimport {canUseAssist, useApiClient, useGenerateCaption} from '../useApiClient'\n\nfunction node(node: DocumentFieldActionItem | DocumentFieldActionGroup) {\n return node\n}\n\nexport const generateCaptionsActions: DocumentFieldAction = {\n name: 'sanity-assist-generate-captions',\n useAction(props) {\n const pathKey = usePathKey(props.path)\n const {openInspector} = useDocumentPane()\n\n const {config, status} = useAiAssistanceConfig()\n const apiClient = useApiClient(config?.__customApiClient)\n const {generateCaption, loading} = useGenerateCaption(apiClient)\n const imageContext = useContext(ImageContext)\n\n if (imageContext && pathKey === imageContext?.imageDescriptionPath) {\n //if this is true, it is stable, and not breaking rules of hooks\n // eslint-disable-next-line react-hooks/rules-of-hooks\n const {assistableDocumentId} = useAssistDocumentContext()\n // eslint-disable-next-line react-hooks/rules-of-hooks\n return useMemo(() => {\n return node({\n type: 'action',\n icon: loading\n ? () => (\n <Box style={{height: 17}}>\n <Spinner style={{transform: 'translateY(6px)'}} />\n </Box>\n )\n : ImageIcon,\n title: 'Generate image description',\n onAction: () => {\n if (loading) {\n return\n }\n if (!canUseAssist(status)) {\n openInspector(aiInspectorId, {\n [fieldPathParam]: pathKey,\n [instructionParam]: undefined as any,\n })\n return\n }\n generateCaption({path: pathKey, documentId: assistableDocumentId})\n },\n renderAsButton: true,\n disabled: loading,\n hidden: !imageContext.assetRef,\n })\n }, [\n generateCaption,\n pathKey,\n assistableDocumentId,\n loading,\n imageContext,\n status,\n openInspector,\n ])\n }\n\n // works but not supported by types\n return undefined as unknown as DocumentFieldActionItem\n },\n}\n","import {ImageIcon} from '@sanity/icons'\nimport {Box, Spinner} from '@sanity/ui'\nimport {useContext, useMemo} from 'react'\nimport {DocumentFieldAction, DocumentFieldActionGroup, DocumentFieldActionItem} from 'sanity'\n\nimport {useAssistDocumentContext} from '../assistDocument/AssistDocumentContext'\nimport {useAiAssistanceConfig} from '../assistLayout/AiAssistanceConfigContext'\nimport {ImageContext} from '../components/ImageContext'\nimport {usePathKey} from '../helpers/misc'\nimport {useApiClient, useGenerateImage} from '../useApiClient'\n\nfunction node(node: DocumentFieldActionItem | DocumentFieldActionGroup) {\n return node\n}\n\nexport const generateImagActions: DocumentFieldAction = {\n name: 'sanity-assist-generate-image',\n useAction(props) {\n const pathKey = usePathKey(props.path)\n\n const {config} = useAiAssistanceConfig()\n const apiClient = useApiClient(config?.__customApiClient)\n const {generateImage, loading} = useGenerateImage(apiClient)\n\n const imageContext = useContext(ImageContext)\n\n if (imageContext && pathKey === imageContext?.imageInstructionPath) {\n //if this is true, it is stable, and not breaking rules of hooks\n // eslint-disable-next-line react-hooks/rules-of-hooks\n const {assistableDocumentId} = useAssistDocumentContext()\n // eslint-disable-next-line react-hooks/rules-of-hooks\n return useMemo(() => {\n return node({\n type: 'action',\n icon: loading\n ? () => (\n <Box style={{height: 17}}>\n <Spinner style={{transform: 'translateY(6px)'}} />\n </Box>\n )\n : ImageIcon,\n title: 'Generate image from prompt',\n onAction: () => {\n if (loading) {\n return\n }\n generateImage({path: pathKey, documentId: assistableDocumentId})\n },\n renderAsButton: true,\n disabled: loading,\n })\n }, [generateImage, pathKey, assistableDocumentId, loading])\n }\n\n // works but not supported by types\n return undefined as unknown as DocumentFieldActionItem\n },\n}\n","import {LockIcon} from '@sanity/icons'\nimport {Text, Tooltip} from '@sanity/ui'\n\nexport function PrivateIcon() {\n return (\n <Tooltip\n content={\n <Text size={1} style={{whiteSpace: 'nowrap'}}>\n Only visible to you\n </Text>\n }\n fallbackPlacements={['bottom']}\n padding={2}\n placement=\"top\"\n portal\n >\n <LockIcon />\n </Tooltip>\n )\n}\n","// Strict ESM env, designed to run outside Node.js in envs that provide WebCrypto (deno, browsers, etc)\n\nexport default function getRandomValues(typedArray) {\n const crypto =\n typeof window !== 'undefined' && 'crypto' in window\n ? window.crypto\n : globalThis.crypto\n\n if (!crypto || !crypto.getRandomValues) {\n throw new Error('WebCrypto not available in this environment')\n }\n\n return crypto.getRandomValues(typedArray)\n}\n","import getRandomValues from 'get-random-values-esm'\n\n// WHATWG crypto RNG - https://w3c.github.io/webcrypto/Overview.html\nfunction whatwgRNG(length = 16) {\n const rnds8 = new Uint8Array(length)\n getRandomValues(rnds8)\n return rnds8\n}\n\nconst getByteHexTable = (() => {\n let table: string[]\n return () => {\n if (table) {\n return table\n }\n table = []\n for (let i = 0; i < 256; ++i) {\n table[i] = (i + 0x100).toString(16).substring(1)\n }\n return table\n }\n})()\n\nexport function randomKey(length?: number) {\n const table = getByteHexTable()\n return whatwgRNG(length)\n .reduce((str, n) => str + table[n], '')\n .slice(0, length)\n}\n","import {\n DocumentFieldActionDivider,\n DocumentFieldActionGroup,\n DocumentFieldActionItem,\n DocumentFieldActionNode,\n ObjectSchemaType,\n SanityDocumentLike,\n useWorkspaceSchemaId,\n} from 'sanity'\nimport {Path, SchemaType} from '@sanity/types'\nimport {useMemo} from 'react'\nimport {useAiAssistanceConfig} from '../assistLayout/AiAssistanceConfigContext'\nimport {ToastParams, useToast} from '@sanity/ui'\nimport {AgentActionPath} from '@sanity/client/stega'\nimport {useAssistDocumentContext} from '../assistDocument/AssistDocumentContext'\nimport {\n documentRootKey,\n fieldPresenceTypeName,\n InstructionTask,\n instructionTaskTypeName,\n} from '../types'\nimport {randomKey} from '../_lib/randomKey'\n\nexport interface AgentActionConditionalPath {\n path: AgentActionPath\n readOnly: boolean\n hidden: boolean\n}\n\nexport interface AssistFieldActionProps {\n /**\n * `actionType` will be `document` for action invoked from the top right document action menu, and\n * `field` when invoked from a field action menu.\n */\n actionType: 'document' | 'field'\n /**\n * This is the id of the current document pane; it contains `drafts.`or `versions. prefix` ect depending on context.\n * Use this for `documentId` when calling any `client.agent.action`.\n *\n * It is generally recommended to call actions from the studio like this:\n * ```ts\n * await client.agent.action.generate({\n * targetDocument: {\n * operation: 'createIfNotExists',\n * _id: props.documentIdForAction,\n * _type: props.documentSchemaType.name,\n * initialValues: props.getDocumentValue()\n * },\n * //...\n * })\n * ```\n */\n documentIdForAction: string\n\n /**\n * Schema type of the current document.\n * @see documentIdForAction\n */\n documentSchemaType: ObjectSchemaType\n\n /**\n * Returns the current document value.\n *\n * Prefer passing this function to your hooks instead of passing the document value directly to avoid unnecessary re-renders.\n * @see documentIdForAction\n */\n getDocumentValue: () => SanityDocumentLike\n\n /**\n * Returns the current readOnly and hidden state of all conditional members in the current document form.\n *\n * Intended to be passed to agent actions `conditionalPaths.paths`.\n */\n getConditionalPaths: () => AgentActionConditionalPath[]\n\n /**\n * `schemaId` for the current workspace.\n *\n * Note: the workspace schema has to be deployed using `sanity schema deploy` or `sanity deploy`.\n *\n * Use this for `schemaId` when calling any `client.agent.action`.\n *\n * It is generally recommended to call actions from the studio like this:\n * ```ts\n * await client.agent.action.generate({\n * targetDocument: {\n * operation: 'createIfNotExists',\n * _id: props.documentIdForAction,\n * _type: props.documentSchemaType.name,\n * initialValues: props.getDocumentValue()\n * },\n * //...\n * })\n */\n schemaId: string\n\n /**\n * This is the schema type of the field the actions will be attached to (ie, schemaType for `path`)\n *\n * It can be used with agent actions using `target.path`, to scope the action to a specific field.\n *\n * It is generally recommended to call actions from the studio like this:\n * ```ts\n * await client.agent.action.generate({\n * targetDocument: {\n * operation: 'createIfNotExists',\n * _id: props.documentIdForAction,\n * _type: props.documentSchemaType.name,\n * initialValues: props.getDocumentValue()\n * },\n * target: {\n * path: props.path\n * },\n * })\n * ```\n */\n path: AgentActionPath\n\n /**\n * This is the schema type of the field the actions will be attached to (ie, schemaType for `path`).\n *\n * Typically useful to dynamically return different actions based on the schema type of the field.\n *\n * ```ts\n * if(isObjectSchemaType(schemaType)) {\n * return [\n * defineAssistFieldAction({\n * title: 'Fill the object fields',\n * icon: RobotIcon,\n * onAction: () => {\n * //...\n * }\n * })\n * ]\n * }\n * return useMemo(() => {\n *\n *\n * }, [])\n *\n * ```\n */\n schemaType: SchemaType\n}\n\nexport type AssistFieldActionNode =\n | AssistFieldActionItem\n | AssistFieldActionGroup\n | DocumentFieldActionDivider\n\nexport type AssistFieldActionItem = Omit<\n DocumentFieldActionItem,\n 'renderAsButton' | 'selected' | 'onAction'\n> & {\n onAction: () => void | Promise<void>\n}\n\nexport type AssistFieldActionGroup = Omit<\n DocumentFieldActionGroup,\n 'renderAsButton' | 'expanded' | 'children'\n> & {\n children: AssistFieldActionNode[]\n}\n\ntype PushToast = (params: ToastParams) => string\n\nexport function defineAssistFieldAction(\n action: Omit<AssistFieldActionItem, 'type'>,\n): AssistFieldActionItem {\n return {\n ...action,\n type: 'action',\n }\n}\n\nexport function defineFieldActionDivider(): DocumentFieldActionDivider {\n return {\n type: 'divider',\n }\n}\n\nexport function defineAssistFieldActionGroup(\n group: Omit<AssistFieldActionGroup, 'type'>,\n): AssistFieldActionGroup {\n return {\n ...group,\n type: 'group',\n }\n}\n\nexport function useCustomFieldActions(\n props: Omit<AssistFieldActionProps, 'schemaId' | 'path'> & {path: Path},\n) {\n const {\n config: {fieldActions},\n } = useAiAssistanceConfig()\n const {addSyntheticTask, removeSyntheticTask} = useAssistDocumentContext()\n\n const schemaId = useWorkspaceSchemaId()\n const {push: pushToast} = useToast()\n const configActions = fieldActions?.useFieldActions?.({\n ...props,\n schemaId,\n path: props.path as AgentActionPath,\n })\n\n return useMemo(() => {\n const title = fieldActions?.title\n const customActions = configActions?.map((node) => {\n return createSafeNode({\n node,\n pushToast,\n addSyntheticTask,\n removeSyntheticTask,\n })\n })\n const onlyGroups =\n customActions?.length && customActions?.every((node) => node.type === 'group')\n const groups = customActions?.length\n ? onlyGroups\n ? customActions\n : [\n {\n type: 'group',\n title: title || 'Custom actions',\n children: customActions,\n expanded: true,\n } satisfies DocumentFieldActionGroup,\n ]\n : []\n return groups ?? []\n }, [configActions, fieldActions, pushToast])\n}\n\nfunction createSafeNode(args: {\n node: AssistFieldActionNode\n pushToast: PushToast\n addSyntheticTask: (task: InstructionTask) => void\n removeSyntheticTask: (task: InstructionTask) => void\n}): DocumentFieldActionNode {\n const {node} = args\n switch (node.type) {\n case 'action':\n return createSafeAction({...args, action: node})\n case 'group':\n return {\n ...node,\n renderAsButton: false,\n expanded: true,\n children: node.children?.map((child) => createSafeNode({...args, node: child})),\n }\n case 'divider':\n default:\n return node\n }\n}\n\nfunction createSafeAction(args: {\n action: AssistFieldActionItem\n pushToast: PushToast\n addSyntheticTask: (task: InstructionTask) => void\n removeSyntheticTask: (task: InstructionTask) => void\n}) {\n const {action, pushToast, addSyntheticTask, removeSyntheticTask} = args\n return {\n ...action,\n onAction: () => {\n async function runAction() {\n const task: InstructionTask = {\n _type: instructionTaskTypeName,\n _key: randomKey(12),\n started: new Date().toISOString(),\n presence: [\n {\n _type: fieldPresenceTypeName,\n _key: randomKey(12),\n path: documentRootKey,\n started: new Date().toISOString(),\n },\n ],\n }\n try {\n addSyntheticTask(task)\n const actionResult = action.onAction?.()\n if (actionResult instanceof Promise) {\n await actionResult\n }\n } catch (err: any) {\n console.error('Failed to execute action', action, err)\n pushToast({\n title: 'Failed to execute action',\n description: err?.message,\n status: 'error',\n })\n } finally {\n removeSyntheticTask(task)\n }\n }\n runAction()\n },\n renderAsButton: false,\n selected: false,\n }\n}\n","import {ControlsIcon, SparklesIcon} from '@sanity/icons'\nimport {useCallback, useMemo, useRef} from 'react'\nimport {\n type DocumentFieldAction,\n type DocumentFieldActionGroup,\n type DocumentFieldActionItem,\n stringToPath,\n typed,\n useCurrentUser,\n} from 'sanity'\nimport {useDocumentPane} from 'sanity/structure'\n\nimport {useAssistDocumentContext} from '../assistDocument/AssistDocumentContext'\nimport {getIcon} from '../assistDocument/components/instruction/appearance/IconInput'\nimport {useRequestRunInstruction} from '../assistDocument/RequestRunInstructionProvider'\nimport {aiInspectorId} from '../assistInspector/constants'\nimport {useSelectedField, useTypePath} from '../assistInspector/helpers'\nimport {pluginTitleShort} from '../constants'\nimport {isSchemaAssistEnabled} from '../helpers/assistSupported'\nimport {getConditionalMembers} from '../helpers/conditionalMembers'\nimport {getInstructionTitle, usePathKey} from '../helpers/misc'\nimport {useAssistSupported} from '../helpers/useAssistSupported'\nimport {translateActions, type TranslateProps} from '../translate/translateActions'\nimport {documentRootKey, fieldPathParam, instructionParam, type StudioInstruction} from '../types'\nimport {generateCaptionsActions} from './generateCaptionActions'\nimport {generateImagActions} from './generateImageActions'\nimport {PrivateIcon} from './PrivateIcon'\nimport {AgentActionConditionalPath, useCustomFieldActions} from './customFieldActions'\nimport {AgentActionPath} from '@sanity/client/stega'\n\nfunction node(node: DocumentFieldActionItem | DocumentFieldActionGroup) {\n return node\n}\n\nexport const assistFieldActions: DocumentFieldAction = {\n name: 'sanity-assist-actions',\n useAction(props) {\n const {schemaType} = props\n\n const {\n assistDocument,\n documentIsNew,\n documentIsAssistable,\n openInspector,\n closeInspector,\n inspector,\n documentOnChange,\n documentSchemaType,\n selectedPath,\n assistableDocumentId,\n } = useAssistDocumentContext()\n\n const {value: docValue, formState} = useDocumentPane()\n const docValueRef = useRef(docValue)\n const formStateRef = useRef(formState)\n formStateRef.current = formState\n\n const currentUser = useCurrentUser()\n const isHidden = !assistDocument\n const pathKey = usePathKey(props.path)\n const typePath = useTypePath(docValue, pathKey)\n const assistDocumentId = assistDocument?._id\n\n const {requestRunInstruction} = useRequestRunInstruction({\n documentOnChange,\n isDocAssistable: documentIsAssistable ?? false,\n })\n\n const isSelectable = !!useSelectedField(documentSchemaType, typePath)\n const assistSupported =\n useAssistSupported(props.path, schemaType) &&\n isSelectable &&\n isSchemaAssistEnabled(documentSchemaType) &&\n schemaType.readOnly !== true\n\n const fieldAssist = useMemo(\n () =>\n (assistDocument?.fields ?? []).find(\n (f) => f.path === typePath || (pathKey === documentRootKey && f.path === pathKey),\n ),\n [assistDocument?.fields, pathKey, typePath],\n )\n\n const fieldAssistKey = fieldAssist?._key\n const isInspectorOpen = inspector?.name === aiInspectorId\n const isPathSelected = pathKey === selectedPath\n const isSelected = isInspectorOpen && isPathSelected\n\n const imageCaptionAction = generateCaptionsActions.useAction(props)\n const imageGenAction = generateImagActions.useAction(props)\n const translateAction = translateActions.useAction(\n typed<TranslateProps>({\n ...props,\n documentId: assistableDocumentId,\n documentIsAssistable,\n documentSchemaType,\n }),\n )\n const manageInstructions = useCallback(\n () =>\n isSelected\n ? closeInspector(aiInspectorId)\n : openInspector(aiInspectorId, {\n [fieldPathParam]: pathKey,\n [instructionParam]: undefined as any,\n }),\n [openInspector, closeInspector, isSelected, pathKey],\n )\n\n const onInstructionAction = useCallback(\n (instruction: StudioInstruction) => {\n if (!pathKey || !fieldAssistKey || !assistDocumentId || !assistableDocumentId) {\n return\n }\n requestRunInstruction({\n documentId: assistableDocumentId,\n assistDocumentId,\n path: pathKey,\n typePath,\n instruction,\n conditionalMembers: formStateRef.current\n ? getConditionalMembers(formStateRef.current)\n : [],\n })\n },\n [\n requestRunInstruction,\n assistableDocumentId,\n pathKey,\n typePath,\n assistDocumentId,\n fieldAssistKey,\n ],\n )\n\n const privateInstructions = useMemo(\n () =>\n fieldAssist?.instructions?.filter((i) => i.userId && i.userId === currentUser?.id) || [],\n [fieldAssist?.instructions, currentUser],\n )\n\n const sharedInstructions = useMemo(\n () => fieldAssist?.instructions?.filter((i) => !i.userId) || [],\n [fieldAssist?.instructions],\n )\n\n const instructions = useMemo(\n () => [...privateInstructions, ...sharedInstructions],\n [privateInstructions, sharedInstructions],\n )\n\n const runInstructionsGroup = useMemo(() => {\n return instructions?.length || imageCaptionAction || translateAction || imageGenAction\n ? node({\n type: 'group',\n icon: () => null,\n title: 'Run instructions',\n children: [\n ...(instructions?.map((instruction) =>\n instructionItem({\n instruction,\n isPrivate: Boolean(instruction.userId && instruction.userId === currentUser?.id),\n onInstructionAction,\n hidden: isHidden,\n documentIsNew: !!documentIsNew,\n assistSupported,\n }),\n ) || []),\n imageCaptionAction,\n imageGenAction,\n ].filter((a): a is DocumentFieldActionItem => !!a),\n expanded: true,\n })\n : undefined\n }, [\n instructions,\n currentUser?.id,\n onInstructionAction,\n isHidden,\n documentIsNew,\n assistSupported,\n imageCaptionAction,\n translateAction,\n imageGenAction,\n ])\n\n const getDocumentValue = useCallback(() => {\n return docValueRef.current\n }, [])\n\n const getConditionalPaths: () => AgentActionConditionalPath[] = useCallback(() => {\n return (formStateRef.current ? getConditionalMembers(formStateRef.current) : []).flatMap(\n (cm) => {\n const path = stringToPath(cm.path)\n if (path.some((s) => typeof s === 'number')) {\n //agent actions does not support indexed paths\n return []\n }\n return {\n ...cm,\n path: path as AgentActionPath,\n }\n },\n )\n }, [])\n\n const customActions = useCustomFieldActions({\n actionType: props.path.length ? 'field' : 'document',\n documentIdForAction: assistableDocumentId,\n schemaType,\n documentSchemaType,\n path: props.path,\n getDocumentValue,\n getConditionalPaths,\n })\n\n const manageInstructionsItem = useMemo(\n () =>\n node({\n type: 'action',\n icon: ControlsIcon,\n title: 'Manage instructions',\n onAction: manageInstructions,\n selected: isSelected,\n }),\n [manageInstructions, isSelected],\n )\n\n const group = useMemo(\n () =>\n node({\n type: 'group',\n icon: SparklesIcon,\n title: pluginTitleShort,\n children: [\n runInstructionsGroup,\n translateAction,\n ...customActions,\n assistSupported && manageInstructionsItem,\n ]\n .filter((c): c is DocumentFieldActionItem | DocumentFieldActionGroup => !!c)\n .filter((c) => (c.type === 'group' ? c.children.length : true)),\n expanded: false,\n renderAsButton: true,\n hidden: !assistSupported && !imageCaptionAction && !translateAction && !imageGenAction,\n }),\n [\n //documentIsNew,\n runInstructionsGroup,\n manageInstructionsItem,\n assistSupported,\n imageCaptionAction,\n translateAction,\n imageGenAction,\n customActions,\n ],\n )\n\n const emptyAction = useMemo(\n () =>\n node({\n type: 'action',\n hidden: !assistSupported,\n icon: SparklesIcon,\n onAction: manageInstructions,\n renderAsButton: true,\n title: pluginTitleShort,\n selected: isSelected,\n }),\n [assistSupported, manageInstructions, isSelected],\n )\n\n // If there are no instructions, we don't want to render the group\n if (\n !instructions?.length &&\n !imageCaptionAction &&\n !translateAction &&\n !imageGenAction &&\n !customActions.length\n ) {\n return emptyAction\n }\n\n return group\n },\n}\n\nfunction instructionItem(props: {\n instruction: StudioInstruction\n isPrivate: boolean\n onInstructionAction: (ins: StudioInstruction) => void\n assistSupported: boolean\n documentIsNew: boolean\n hidden: boolean\n}) {\n const {hidden, isPrivate, onInstructionAction, assistSupported, instruction} = props\n return node({\n type: 'action',\n icon: getIcon(instruction.icon),\n iconRight: isPrivate ? PrivateIcon : undefined,\n title: getInstructionTitle(instruction),\n onAction: () => onInstructionAction(instruction),\n disabled: !assistSupported,\n hidden,\n })\n}\n","import {Card, Flex} from '@sanity/ui'\nimport {useMemo} from 'react'\n\nimport {useAssistDocumentContext} from '../assistDocument/AssistDocumentContext'\nimport {documentRootKey, fieldPresenceTypeName} from '../types'\nimport {AiFieldPresence} from './AiFieldPresence'\nimport {aiPresence} from './useAssistPresence'\n\nexport function createAssistDocumentPresence(documentId: string | undefined) {\n return function AssistDocumentPresenceWrapper() {\n return documentId ? <AssistDocumentPresence /> : null\n }\n}\n\nfunction AssistDocumentPresence() {\n const {assistDocument, syntheticTasks} = useAssistDocumentContext()\n const anyPresence = useMemo(() => {\n const anyPresence = [...(assistDocument?.tasks ?? []), ...(syntheticTasks ?? [])]\n ?.filter((run) => !run.ended && !run.reason)\n ?.flatMap((run) => run.presence ?? [])\n .find((f) => f.started && new Date().getTime() - new Date(f.started).getTime() < 30000)\n if (anyPresence) {\n return aiPresence(anyPresence, [])\n }\n const anyRun = assistDocument?.tasks\n ?.filter((run) => !run.ended && !run.reason)\n ?.find((f) => f.started && new Date().getTime() - new Date(f.started).getTime() < 30000)\n return anyRun\n ? aiPresence(\n {\n started: anyRun.started,\n path: documentRootKey,\n _key: anyRun._key,\n _type: fieldPresenceTypeName,\n },\n [],\n )\n : undefined\n }, [assistDocument?.tasks, syntheticTasks])\n\n return (\n <Card>\n <Flex flex={1} justify=\"flex-end\">\n <Flex gap={2} align={'center'}>\n {anyPresence && <AiFieldPresence presence={anyPresence} />}\n </Flex>\n </Flex>\n </Card>\n )\n}\n","import {ArrowLeftIcon} from '@sanity/icons'\nimport {Button} from '@sanity/ui'\nimport {useCallback} from 'react'\nimport {useDocumentPane} from 'sanity/structure'\n\nimport {aiInspectorId} from '../../../assistInspector/constants'\nimport {instructionParam} from '../../../types'\n\nexport function BackToInstructionListLink() {\n const {openInspector} = useDocumentPane()\n\n const goBack = useCallback(\n () => openInspector(aiInspectorId, {[instructionParam]: undefined as any}),\n [openInspector],\n )\n\n return (\n <div>\n <Button\n as=\"a\"\n fontSize={1}\n icon={ArrowLeftIcon}\n mode=\"bleed\"\n padding={1}\n space={2}\n onClick={goBack}\n text=\" Instructions\"\n textAlign=\"left\"\n />\n </div>\n )\n}\n","import {Card, Stack, Text} from '@sanity/ui'\nimport {useContext, useEffect, useMemo, useRef} from 'react'\nimport {\n FormCallbacksProvider,\n FormCallbacksValue,\n FormInput,\n insert,\n KeyedSegment,\n ObjectInputProps,\n ObjectSchemaType,\n PatchEvent,\n Path,\n SchemaType,\n set,\n setIfMissing,\n stringToPath,\n typed,\n useFormCallbacks,\n useSchema,\n} from 'sanity'\n\nimport {useAiPaneRouter} from '../../assistInspector/helpers'\nimport {useAiAssistanceConfig} from '../../assistLayout/AiAssistanceConfigContext'\nimport {\n AssistDocument,\n AssistField,\n assistFieldTypeName,\n AssistInspectorRouteParams,\n documentRootKey,\n fieldPathParam,\n instructionParam,\n StudioInstruction,\n} from '../../types'\nimport {AssistTypeContext} from './AssistTypeContext'\nimport {BackToInstructionListLink} from './instruction/BackToInstructionsLink'\nimport {SelectedFieldContextProvider, SelectedFieldContextValue} from './SelectedFieldContext'\n\nconst EMPTY_FIELDS: AssistField[] = []\n\nexport function AssistDocumentForm(props: ObjectInputProps) {\n if (props.readOnly) {\n return (\n <Card border tone=\"caution\" padding={2}>\n <Text size={1}> You do not have sufficient permissions to manage instructions.</Text>\n </Card>\n )\n }\n return <AssistDocumentFormEditable {...props} />\n}\nfunction AssistDocumentFormEditable(props: ObjectInputProps) {\n const {onChange} = props\n const value = props.value as AssistDocument | undefined\n const id = value?._id\n const fields = value?.fields\n\n const {params, setParams} = useAiPaneRouter()\n const pathKey = params[fieldPathParam]\n const {typePath, documentType: targetDocumentType} = useContext(AssistTypeContext)\n const instruction = params[instructionParam]\n\n const activeKey = useMemo(() => {\n if (!typePath) {\n return undefined\n }\n return (fields ?? EMPTY_FIELDS).find((f) => f.path === typePath)?._key\n }, [fields, typePath])\n\n const activePath: Path | undefined = useMemo(() => {\n if (!activeKey) {\n return undefined\n }\n const base = ['fields', {_key: activeKey}]\n return instruction ? [...base, 'instructions', {_key: instruction}] : base\n }, [activeKey, instruction])\n\n const schema = useSchema()\n const documentSchema: ObjectSchemaType | undefined = useMemo(() => {\n if (!targetDocumentType) {\n return undefined\n }\n return schema.get(targetDocumentType) as ObjectSchemaType\n }, [schema, targetDocumentType])\n\n const fieldSchema = useSelectedSchema(pathKey, documentSchema)\n\n const context: SelectedFieldContextValue = useMemo(\n () => ({\n documentSchema,\n fieldSchema: fieldSchema ?? documentSchema,\n }),\n [fieldSchema, documentSchema],\n )\n\n const title = value?.title\n\n useEffect(() => {\n if (!title && documentSchema && !id?.startsWith('drafts.')) {\n onChange(set(documentSchema.title ?? documentSchema.name, ['title']))\n }\n }, [title, documentSchema, onChange, id])\n\n const {onPathOpen, ...formCallbacks} = useFormCallbacks()\n\n const newCallbacks: FormCallbacksValue = useMemo(\n () => ({\n ...formCallbacks,\n onPathOpen: (path) => {\n if (!instruction && path.length === 4 && path[2] === 'instructions') {\n setParams(\n typed<AssistInspectorRouteParams>({\n ...params,\n [instructionParam]: (path[3] as KeyedSegment)?._key,\n }) as Record<keyof AssistInspectorRouteParams, string | undefined>,\n )\n onPathOpen([])\n } else {\n setTimeout(() => onPathOpen(path), 0)\n }\n },\n }),\n [formCallbacks, onPathOpen, params, setParams, instruction],\n )\n\n useEffect(() => {\n if (activePath && !instruction) {\n onPathOpen([])\n }\n }, [activePath, instruction, onPathOpen])\n\n return (\n <SelectedFieldContextProvider value={context}>\n <Stack space={5}>\n <FieldsInitializer\n key={typePath}\n pathKey={typePath}\n activePath={activePath}\n fields={fields}\n documentSchema={documentSchema}\n onChange={onChange}\n />\n {instruction && <BackToInstructionListLink />}\n\n {activePath && (\n <FormCallbacksProvider {...newCallbacks}>\n <div style={{lineHeight: '1.25em'}}>\n <FormInput {...props} absolutePath={activePath} />\n </div>\n </FormCallbacksProvider>\n )}\n\n {!activePath && props.renderDefault(props)}\n </Stack>\n </SelectedFieldContextProvider>\n )\n}\n\nfunction useSelectedSchema(\n fieldPath: string | undefined,\n documentSchema: ObjectSchemaType | undefined,\n): SchemaType | undefined {\n return useMemo(() => {\n if (!fieldPath) {\n return undefined\n }\n if (fieldPath === documentRootKey) {\n return documentSchema\n }\n\n const path = stringToPath(fieldPath)\n let currentSchema: ObjectSchemaType | undefined = documentSchema\n for (let i = 0; i < path.length; i++) {\n const segment = path[i]\n const field = currentSchema?.fields.find((f) => f.name === segment)\n if (!field) {\n return undefined\n }\n if (i === path.length - 1) {\n return field.type\n }\n if (field.type.jsonType !== 'object') {\n return undefined\n }\n currentSchema = field.type\n }\n return currentSchema\n }, [documentSchema, fieldPath])\n}\n\nfunction FieldsInitializer({\n pathKey,\n activePath,\n fields,\n documentSchema,\n onChange,\n}: {\n pathKey?: string\n activePath?: Path\n fields: AssistField[] | undefined\n documentSchema: ObjectSchemaType | undefined\n onChange: ObjectInputProps['onChange']\n}) {\n const {\n config: {__presets: presets},\n } = useAiAssistanceConfig()\n\n const existingField = fields?.find((f) => f._key === pathKey)\n const documentPresets = !!documentSchema?.name && presets?.[documentSchema?.name]\n\n const missingPresetInstructions = useMemo(() => {\n if (!documentPresets || !pathKey) {\n return undefined\n }\n const existingInstructions = existingField?.instructions\n const presetField = documentPresets.fields?.find((f) => f.path === pathKey)\n return presetField?.instructions?.filter(\n (i) => !existingInstructions?.some((ei) => ei._key === i._key),\n )\n }, [documentPresets, pathKey, existingField])\n\n // need this to not fire onChange twice in React strict mode\n const initialized = useRef(false)\n useEffect(() => {\n if (initialized.current || !pathKey) {\n return\n }\n if (existingField && !missingPresetInstructions?.length) {\n return\n }\n\n let event = PatchEvent.from([setIfMissing([], ['fields'])])\n if (!existingField) {\n event = event.append(\n insert(\n [\n typed<AssistField>({\n _key: pathKey,\n _type: assistFieldTypeName,\n path: pathKey,\n instructions: [],\n }),\n ],\n 'after',\n ['fields', -1],\n ),\n )\n }\n\n if (!existingField?.instructions?.length) {\n event = event.append([setIfMissing([], ['fields', {_key: pathKey}, 'instructions'])])\n }\n\n if (missingPresetInstructions?.length) {\n event = event.append(\n insert(\n missingPresetInstructions.map(\n (preset): StudioInstruction => ({\n ...preset,\n _type: 'sanity.assist.instruction',\n prompt: preset.prompt?.map((p) => ({markDefs: [], ...p})),\n }),\n ),\n 'after',\n ['fields', {_key: pathKey}, 'instructions', -1],\n ),\n )\n }\n onChange(event)\n initialized.current = true\n }, [activePath, onChange, pathKey, existingField, missingPresetInstructions])\n\n return null\n}\n","import {Box, Flex, Text} from '@sanity/ui'\nimport {useContext} from 'react'\nimport {PreviewProps} from 'sanity'\n\nimport {InlineBlockValueContext} from '../../assistFormComponents/AssistInlineFormBlock'\nimport {useSelectedField} from '../../assistInspector/helpers'\nimport {SelectedFieldContext} from './SelectedFieldContext'\n\nexport function FieldRefPreview(props: PreviewProps & {path?: string}) {\n const {actions} = props\n const documentSchema = useContext(SelectedFieldContext)?.documentSchema\n const path = (useContext(InlineBlockValueContext) as {path?: string})?.path ?? props.path\n const selectedField = useSelectedField(documentSchema, path)\n return (\n <Flex gap={2} align=\"center\" style={{width: '100%'}}>\n <Flex flex={1} gap={2} align=\"center\" paddingY={3} paddingX={1}>\n <Box>\n <Text size={1} textOverflow=\"ellipsis\">\n {selectedField?.title ?? 'Select field'}\n </Text>\n </Box>\n </Flex>\n {actions as any}\n </Flex>\n )\n}\n","import {FieldProps} from 'sanity'\n\nexport function HiddenFieldTitle(props: FieldProps) {\n return props.renderDefault({...props, title: '', level: props.level - 2, changed: false})\n}\n","import {Card, Flex, Switch, Text} from '@sanity/ui'\nimport {useCallback, useId} from 'react'\nimport {set, StringInputProps, unset, useCurrentUser} from 'sanity'\n\nexport function InstructionVisibility(props: StringInputProps) {\n const {value, onChange} = props\n\n const user = useCurrentUser()\n\n const handleChange = useCallback(() => {\n const newValue = value ? '' : (user?.id ?? '')\n onChange(newValue ? set(newValue) : unset())\n }, [onChange, user, value])\n\n const id = useId()\n\n return (\n <Card>\n <Flex gap={2} align=\"flex-start\">\n <div style={{margin: '-3px 0'}}>\n <Switch\n {...props.elementProps}\n id={id}\n value={`${!value}`}\n checked={!value}\n onChange={handleChange}\n disabled={props.elementProps.readOnly}\n />\n </div>\n\n <Text muted size={1} weight=\"medium\">\n <label htmlFor={id}>Make visible to all Studio members</label>\n </Text>\n </Flex>\n </Card>\n )\n}\n","import {Box} from '@sanity/ui'\nimport {useCallback, useContext, useEffect, useId, useRef} from 'react'\nimport {set, StringInputProps} from 'sanity'\n\nimport {FieldAutocomplete} from '../../../assistInspector/FieldAutocomplete'\nimport {FieldRef} from '../../../assistInspector/helpers'\nimport {AssistTypeContext} from '../AssistTypeContext'\nimport {SelectedFieldContext} from '../SelectedFieldContext'\n\nexport function FieldRefPathInput(props: StringInputProps) {\n const documentSchema = useContext(SelectedFieldContext)?.documentSchema\n const {typePath} = useContext(AssistTypeContext)\n const ref = useRef<HTMLDivElement>(null)\n const id = useId()\n const {onChange} = props\n\n useEffect(() => {\n ref.current?.querySelector('input')?.focus()\n }, [])\n\n const onSelect = useCallback((path: string) => onChange(set(path)), [onChange])\n\n const filter = useCallback(\n (field: FieldRef) => {\n if (!field.key.includes('|') || !typePath) {\n return true\n }\n if (field.key.includes('|') && !typePath.includes('|')) {\n return false\n }\n\n const fieldSegments = field.key.split('.')\n const lastArrayItemIndex = fieldSegments.findLastIndex((s) => s.includes('|'))\n const mustStartWith = fieldSegments.slice(0, lastArrayItemIndex + 1).join('.')\n return typePath.startsWith(mustStartWith)\n },\n [typePath],\n )\n if (!documentSchema) {\n return props.renderDefault(props)\n }\n\n return (\n <Box flex={1} style={{minWidth: 300}} ref={ref}>\n <FieldAutocomplete\n id={id}\n schemaType={documentSchema}\n onSelect={onSelect}\n fieldPath={props.value}\n filter={filter}\n />\n </Box>\n )\n}\n","import {FieldError, FieldMember, FieldSetMember, ObjectMember} from 'sanity'\n\nexport function findFieldMember(\n members: ObjectMember[],\n fieldName: string,\n): FieldMember | FieldError | undefined {\n return members.find(\n (m): m is FieldMember | FieldError =>\n (m.kind === 'field' && m.name === fieldName) ||\n (m.kind === 'error' && m.fieldName === fieldName),\n )\n}\n\nexport function findFieldsetMember(\n members: ObjectMember[],\n fieldsetName: string,\n): FieldSetMember | undefined {\n return members.find(\n (m): m is FieldSetMember => m.kind === 'fieldSet' && m.fieldSet.name === fieldsetName,\n )\n}\n","import {Box, Flex, Stack, Text} from '@sanity/ui'\nimport {useId, useMemo} from 'react'\nimport {FieldError, FieldMember, ObjectInputMember, ObjectInputProps} from 'sanity'\n\nimport {findFieldMember, findFieldsetMember} from '../helpers'\n\nexport function InstructionInput(props: ObjectInputProps) {\n return (\n <Stack space={[4, 4, 4, 5]}>\n <NameField {...props} />\n <ShareField {...props} />\n <ObjectMember fieldName={'prompt'} {...props} />\n <ObjectMember fieldName={'output'} {...props} />\n </Stack>\n )\n}\n\nfunction ObjectMember({fieldName, ...props}: ObjectInputProps & {fieldName: string}) {\n const member = findFieldMember(props.members, fieldName)\n return member ? <ObjectInputMember {...props} member={member} /> : null\n}\n\nconst NONE: (FieldMember | FieldError)[] = []\n\nfunction NameField(props: ObjectInputProps) {\n const fieldsetMember = findFieldsetMember(props.members, 'appearance')\n const titleId = useId()\n\n const members = fieldsetMember?.fieldSet.members ?? NONE\n const iconMember = findFieldMember(members, 'icon')\n const titleMember = findFieldMember(members, 'title')\n\n const titlePlaceholder = 'Untitled'\n const moddedTitleMember = useMemo(() => {\n if (!titleMember) {\n return undefined\n }\n if (titleMember.kind === 'error') {\n return titleMember\n }\n return {\n ...titleMember,\n field: {\n ...titleMember?.field,\n schemaType: {\n ...titleMember?.field.schemaType,\n placeholder: titlePlaceholder,\n },\n },\n }\n }, [titleMember, titlePlaceholder])\n\n return (\n <Stack space={5}>\n <Stack space={2}>\n <Flex gap={1}>\n <Text as=\"label\" weight=\"semibold\" size={1} htmlFor={titleId}>\n Name\n </Text>\n </Flex>\n\n <Text muted size={1}>\n How this instruction appears in menus\n </Text>\n\n <Flex align=\"center\">\n {iconMember && (\n <Box flex=\"none\">\n <ObjectInputMember {...props} member={iconMember} />\n </Box>\n )}\n {moddedTitleMember && (\n <Box flex={1} style={{marginLeft: -1}}>\n <ObjectInputMember {...props} member={moddedTitleMember} />\n </Box>\n )}\n </Flex>\n </Stack>\n </Stack>\n )\n}\n\nfunction ShareField(props: ObjectInputProps) {\n const fieldsetMember = findFieldsetMember(props.members, 'appearance')\n const members = fieldsetMember?.fieldSet.members ?? NONE\n const visibilityMember = findFieldMember(members, 'userId')\n\n return <>{visibilityMember && <ObjectInputMember {...props} member={visibilityMember} />}</>\n}\n","import {useCallback, useContext, useState} from 'react'\nimport {\n ArrayFieldProps,\n ArraySchemaType,\n isArrayOfObjectsSchemaType,\n isObjectSchemaType,\n ObjectSchemaType,\n} from 'sanity'\n\nimport {SelectedFieldContext} from '../SelectedFieldContext'\n\nexport function InstructionOutputField(props: ArrayFieldProps) {\n const {fieldSchema} = useContext(SelectedFieldContext) ?? {}\n\n if (\n !fieldSchema ||\n !(isObjectSchemaType(fieldSchema) || isArrayOfObjectsSchemaType(fieldSchema))\n ) {\n return null\n }\n\n return (\n <EnabledOutputField {...props} fieldSchema={fieldSchema}>\n {props.children}\n </EnabledOutputField>\n )\n}\n\nfunction EnabledOutputField({\n fieldSchema,\n ...props\n}: ArrayFieldProps & {fieldSchema: ObjectSchemaType | ArraySchemaType<ObjectSchemaType>}) {\n const [open, setOpen] = useState(!!props.value?.length)\n const onExpand = useCallback(() => setOpen(true), [])\n const onCollapse = useCallback(() => setOpen(false), [])\n\n return props.renderDefault({\n ...props,\n collapsible: true,\n onExpand,\n onCollapse,\n collapsed: !open,\n level: 1,\n title: isObjectSchemaType(fieldSchema) ? 'Allowed fields' : 'Allowed types',\n })\n}\n","import {Card, Checkbox, Flex, Stack, Text} from '@sanity/ui'\nimport {useCallback, useContext, useEffect, useMemo} from 'react'\nimport {\n ArrayOfObjectsInputProps,\n ArraySchemaType,\n FormPatch,\n insert,\n isArrayOfObjectsSchemaType,\n isObjectSchemaType,\n ObjectSchemaType,\n PatchEvent,\n setIfMissing,\n typed,\n unset,\n} from 'sanity'\n\nimport {isAssistSupported} from '../../../helpers/assistSupported'\nimport {isType} from '../../../helpers/typeUtils'\nimport {OutputFieldItem, outputFieldTypeName, OutputTypeItem} from '../../../types'\nimport {SelectedFieldContext} from '../SelectedFieldContext'\n\nexport function InstructionOutputInput(props: ArrayOfObjectsInputProps) {\n const {fieldSchema} = useContext(SelectedFieldContext) ?? {}\n\n if (!fieldSchema) {\n return null\n }\n\n if (isObjectSchemaType(fieldSchema)) {\n return <ObjectOutputInput {...props} fieldSchema={fieldSchema} />\n }\n\n if (isArrayOfObjectsSchemaType(fieldSchema)) {\n return <ArrayOutputInput {...props} fieldSchema={fieldSchema} />\n }\n return null\n}\n\nfunction useEmptySelectAllValue(\n value: (OutputTypeItem | OutputFieldItem)[],\n allowedValues: {name: string}[],\n onChange: (patch: FormPatch | FormPatch[] | PatchEvent) => void,\n) {\n useEffect(() => {\n const validValues = value?.filter((v) =>\n allowedValues.find(\n (f) => f.name === (v._type === outputFieldTypeName ? v.relativePath : v.type),\n ),\n )\n const valueLength = value?.length ?? 0\n const validLength = validValues?.length ?? 0\n if ((!validLength && valueLength) || validLength >= allowedValues.length) {\n // if we end up here, we consider this a \"no selected fields/types\" selections. This should render and behave as all values selected.\n // we need this behaviour to accommodate new fields/types being added to the model, so they get visited by instructions without having to update the filter\n // when things have been explicitly selected, we let the selection remain as is\n onChange(PatchEvent.from([unset()]))\n }\n }, [allowedValues, value, onChange])\n}\n\nfunction ObjectOutputInput({\n fieldSchema,\n ...props\n}: ArrayOfObjectsInputProps & {fieldSchema: ObjectSchemaType}) {\n const {value, onChange} = props\n\n const fields = useMemo(\n () => fieldSchema.fields.filter((field) => isAssistSupported(field.type)),\n [fieldSchema.fields],\n )\n\n useEmptySelectAllValue(value as OutputTypeItem[], fields, onChange)\n\n const onSelectChange = useCallback(\n (checked: boolean, selectedValue: string) => {\n if (checked) {\n if (value?.length) {\n onChange(PatchEvent.from(unset([{_key: selectedValue}])))\n } else {\n // we went from empty array to everything selected but one\n const items = fields\n .filter((f) => f.name !== selectedValue)\n .map((field) =>\n typed<OutputFieldItem>({\n _key: field.name,\n _type: 'sanity.assist.output.field',\n relativePath: field.name,\n }),\n )\n onChange(PatchEvent.from([setIfMissing([]), insert(items, 'after', [-1])]))\n }\n } else {\n const patchValue: OutputFieldItem = {\n _key: selectedValue,\n _type: 'sanity.assist.output.field',\n relativePath: selectedValue,\n }\n onChange(PatchEvent.from([setIfMissing([]), insert([patchValue], 'after', [-1])]))\n }\n },\n [onChange, value, fields],\n )\n\n return (\n <Stack space={2}>\n {fields.map((field) => {\n return (\n <Flex key={field.name} align=\"center\" gap={2}>\n <Selectable\n value={field.name}\n title={field.type.title ?? field.name}\n arrayValue={value as OutputFieldItem[]}\n onChange={onSelectChange}\n />\n </Flex>\n )\n })}\n </Stack>\n )\n}\n\nfunction ArrayOutputInput({\n fieldSchema,\n ...props\n}: ArrayOfObjectsInputProps & {fieldSchema: ArraySchemaType}) {\n const {value, onChange} = props\n\n const ofItems = useMemo(\n () => fieldSchema.of.filter((itemType) => isAssistSupported(itemType)),\n [fieldSchema.of],\n )\n\n useEmptySelectAllValue(value as OutputTypeItem[], ofItems, onChange)\n\n const onSelectChange = useCallback(\n (checked: boolean, selectedValue: string) => {\n if (checked) {\n if (value?.length) {\n onChange(PatchEvent.from(unset([{_key: selectedValue}])))\n } else {\n // we went from empty array to everything selected but one\n const items = ofItems\n .filter((f) => f.name !== selectedValue)\n .map((field) =>\n typed<OutputTypeItem>({\n _key: field.name,\n _type: 'sanity.assist.output.type',\n type: field.name,\n }),\n )\n onChange(PatchEvent.from([setIfMissing([]), insert(items, 'after', [-1])]))\n }\n } else {\n const patchValue: OutputTypeItem = {\n _key: selectedValue,\n _type: 'sanity.assist.output.type',\n type: selectedValue,\n }\n onChange(PatchEvent.from([setIfMissing([]), insert([patchValue], 'after', [-1])]))\n }\n },\n [onChange, value, ofItems],\n )\n return (\n <Stack space={2}>\n {ofItems.map((itemType) => {\n return (\n <Flex key={itemType.name}>\n <Selectable\n value={itemType.name}\n title={isType(itemType, 'block') ? 'Text' : (itemType.title ?? itemType.name)}\n arrayValue={value as OutputTypeItem[] | undefined}\n onChange={onSelectChange}\n />\n </Flex>\n )\n })}\n </Stack>\n )\n}\n\nfunction Selectable({\n title,\n arrayValue,\n value,\n onChange,\n}: {\n title: string\n value: string\n arrayValue?: {_key: string}[]\n onChange: (checked: boolean, value: string) => void\n}) {\n const checked = !arrayValue?.length || !!arrayValue?.find((v) => v._key === value)\n const handleChange = useCallback(() => onChange(checked, value), [onChange, checked, value])\n\n return (\n <Flex gap={2} align=\"flex-start\">\n <Checkbox checked={checked} onChange={handleChange} />\n <Card marginTop={1} onClick={handleChange}>\n <Text style={{cursor: 'default'}} size={1}>\n {title}\n </Text>\n </Card>\n </Flex>\n )\n}\n","import {Box} from '@sanity/ui'\nimport {useEffect} from 'react'\nimport {type ArrayOfObjectsInputProps, set, typed} from 'sanity'\nimport {styled} from 'styled-components'\n\nimport {randomKey} from '../../../_lib/randomKey'\nimport type {\n ContextBlock,\n FieldRef,\n PromptBlock,\n PromptTextBlock,\n UserInputBlock,\n} from '../../../types'\n\nconst PteMods = styled(Box)`\n & [data-testid='pt-editor__toolbar-card'] > div > div:last-child {\n display: none;\n }\n & [data-testid='pt-editor'] {\n min-height: 300px;\n }\n & [data-testid='pt-editor'] .pt-inline-object * {\n max-width: 400px;\n }\n`\n\nexport function PromptInput(props: ArrayOfObjectsInputProps) {\n // quickfixes the model (converts blocks to inline blocks for alpha customers)\n // backend supports both types, but this prevents \"missing block\" schema errors\n useOnlyInlineBlocks(props)\n return <PteMods>{props.renderDefault(props)}</PteMods>\n}\n\nfunction useOnlyInlineBlocks(props: ArrayOfObjectsInputProps) {\n useEffect(() => {\n let needsFix = false\n const val = ((props.value as PromptBlock[]) ?? []).map((block) => {\n if (block._type === 'block') {\n return block\n }\n\n needsFix = true\n return typed<PromptTextBlock>({\n _key: randomKey(12),\n _type: 'block',\n level: 0,\n markDefs: [],\n style: 'normal',\n children: [block as FieldRef | ContextBlock | UserInputBlock],\n })\n })\n\n if (needsFix) {\n props.onChange(set(val))\n }\n // only run this once when loading the field\n // eslint-disable-next-line\n }, [])\n}\n","import {ArrayFieldProps} from 'sanity'\n\nexport function InstructionsArrayField(props: ArrayFieldProps) {\n return props.renderDefault({\n ...props,\n title: ' ',\n })\n}\n","import {useMemo} from 'react'\nimport {ArrayOfObjectsInputProps, useCurrentUser} from 'sanity'\n\nimport {StudioInstruction} from '../../types'\n\nexport function InstructionsArrayInput(props: ArrayOfObjectsInputProps) {\n const user = useCurrentUser()\n\n const originalValue = props.value as StudioInstruction[] | undefined\n const originalMembers = props.members\n const value = useMemo(\n () => (originalValue ?? []).filter((v) => !v.userId || v.userId === user?.id),\n [originalValue, user],\n )\n const members = useMemo(\n () =>\n (originalMembers ?? []).filter((v) => {\n if (v.kind === 'error') {\n return true\n }\n const value = v?.item?.value as any\n return !value.userId || value.userId === user?.id\n }),\n [originalMembers, user],\n )\n return props.renderDefault({...props, value, members})\n}\n","import {Box} from '@sanity/ui'\nimport {useEffect, useRef} from 'react'\nimport {ObjectInputProps} from 'sanity'\n\nexport function HideReferenceChangedBannerInput(props: ObjectInputProps) {\n const ref = useRef<HTMLDivElement>(null)\n\n // hides \"reference was changed\" banner (it is incorrectly flashing because the pane handler does not support the way wie use the assist pane)\n useEffect(() => {\n const parent = ref.current?.closest('[data-testid=\"pane-content\"]')\n if (!parent) {\n return\n }\n const style = document.createElement('style')\n const parentId = `id-${Math.random()}`.replace('.', '-')\n parent.id = parentId\n\n style.innerText = `\n #${parentId} [data-testid=\"reference-changed-banner\"] { display: none; }\n `\n parent.prepend(style)\n }, [ref])\n\n return <Box ref={ref}>{props.renderDefault(props)}</Box>\n}\n","import {DocumentTextIcon, TokenIcon} from '@sanity/icons'\nimport {defineArrayMember, defineField, defineType} from 'sanity'\n\nimport {HideReferenceChangedBannerInput} from '../components/HideReferenceChangedBannerInput'\nimport {contextDocumentTypeName} from '../types'\n\nexport const contextDocumentSchema = defineType({\n type: 'document',\n name: contextDocumentTypeName,\n title: 'AI context',\n liveEdit: true,\n icon: TokenIcon,\n components: {\n input: HideReferenceChangedBannerInput,\n },\n fields: [\n defineField({\n type: 'string',\n name: 'title',\n title: 'Title',\n }),\n defineField({\n name: 'context',\n type: 'array',\n title: 'Context',\n of: [\n defineArrayMember({\n type: 'block',\n styles: [{title: 'Normal', value: 'normal'}],\n lists: [],\n marks: {\n decorators: [],\n annotations: [],\n },\n }),\n ],\n }),\n ],\n preview: {\n select: {\n title: 'title',\n context: 'context',\n },\n prepare({title, context}) {\n const text = context\n ?.flatMap((block: any) => block?.children)\n .flatMap((child: any) => child?.text?.split(' '))\n .filter(Boolean)\n const words = text?.length ?? 0\n return {\n title,\n subtitle: `Words: ${words}`,\n media: DocumentTextIcon,\n }\n },\n },\n})\n","import {\n ArrowRightIcon,\n CodeIcon,\n ComposeIcon,\n icons,\n IconSymbol,\n LockIcon,\n SparklesIcon,\n ThListIcon,\n} from '@sanity/icons'\nimport {Box, Flex, Stack, Text, Tooltip} from '@sanity/ui'\nimport {createElement} from 'react'\nimport {defineArrayMember, defineField, defineType, ObjectSchemaType} from 'sanity'\n\nimport {AssistDocumentForm} from '../assistDocument/components/AssistDocumentForm'\nimport {FieldRefPreview} from '../assistDocument/components/FieldRefPreview'\nimport {HiddenFieldTitle} from '../assistDocument/components/generic/HiddenFieldTitle'\nimport {IconInput} from '../assistDocument/components/instruction/appearance/IconInput'\nimport {InstructionVisibility} from '../assistDocument/components/instruction/appearance/InstructionVisibility'\nimport {FieldRefPathInput} from '../assistDocument/components/instruction/FieldRefInput'\nimport {InstructionInput} from '../assistDocument/components/instruction/InstructionInput'\nimport {InstructionOutputField} from '../assistDocument/components/instruction/InstructionOutputField'\nimport {InstructionOutputInput} from '../assistDocument/components/instruction/InstructionOutputInput'\nimport {PromptInput} from '../assistDocument/components/instruction/PromptInput'\nimport {InstructionsArrayField} from '../assistDocument/components/InstructionsArrayField'\nimport {InstructionsArrayInput} from '../assistDocument/components/InstructionsArrayInput'\nimport {getFieldRefsWithDocument} from '../assistInspector/helpers'\nimport {instructionGuideUrl} from '../constants'\nimport {getInstructionTitle} from '../helpers/misc'\nimport {\n assistDocumentIdPrefix,\n assistDocumentTypeName,\n assistFieldTypeName,\n assistTasksStatusTypeName,\n fieldReferenceTypeName,\n instructionContextTypeName,\n instructionTaskTypeName,\n instructionTypeName,\n outputFieldTypeName,\n outputTypeTypeName,\n promptTypeName,\n userInputTypeName,\n} from '../types'\nimport {contextDocumentSchema} from './contextDocumentSchema'\n\nexport const fieldReference = defineType({\n type: 'object',\n name: fieldReferenceTypeName,\n title: 'Field',\n icon: ThListIcon,\n\n fields: [\n defineField({\n type: 'string',\n name: 'path',\n title: 'Field',\n components: {\n input: FieldRefPathInput,\n },\n validation: (rule) =>\n rule.custom((value, context) => {\n if (!value) {\n return 'Please select a field'\n }\n try {\n const docId = context.document?._id\n if (!docId) {\n return `Field reference cannot be used outside document inspector context. Could not resolve document id.`\n }\n const targetDocType = docId.replace(new RegExp(`^${assistDocumentIdPrefix}`), '')\n const schema = context.schema.get(targetDocType)\n if (!schema) {\n return `Field reference cannot be used outside document inspector context. Could not resolve schema: ${targetDocType}`\n }\n const refs = getFieldRefsWithDocument(schema as ObjectSchemaType)\n const fieldRef = refs.find((r) => r.key === value)\n if (!fieldRef) {\n return `Field with path \"${value}\" does not exist in the schema.`\n }\n return true\n } catch (e) {\n console.error('Failed to resolve field reference', e)\n return 'Invalid field reference.'\n }\n }),\n }),\n ],\n preview: {\n select: {\n path: 'path',\n },\n prepare({path}) {\n return {\n title: path,\n path,\n icon: CodeIcon,\n }\n },\n },\n components: {\n preview: FieldRefPreview,\n },\n options: {\n modal: {\n type: 'popover',\n },\n },\n})\n\nexport const userInput = defineType({\n type: 'object',\n name: userInputTypeName,\n title: 'User input',\n icon: ComposeIcon,\n fields: [\n defineField({\n type: 'string',\n name: 'message',\n title: 'User input title',\n placeholder: 'Provide instruction text',\n description: 'The header above the user input text field',\n validation: (rule) => rule.required(),\n }),\n defineField({\n type: 'text',\n rows: 3,\n name: 'description',\n title: 'User input description',\n description: 'The description above the user input text field',\n }),\n ],\n preview: {\n select: {\n title: 'message',\n },\n },\n options: {\n modal: {\n type: 'popover',\n width: 1,\n },\n },\n})\n\nexport const promptContext = defineType({\n type: 'object',\n name: instructionContextTypeName,\n title: contextDocumentSchema.title,\n icon: contextDocumentSchema.icon,\n fields: [\n defineField({\n type: 'reference',\n name: 'reference',\n to: [{type: contextDocumentSchema.name}],\n title: 'Context',\n description: 'The referenced context will be inserted into the instruction',\n validation: (rule) => rule.required(),\n components: {\n input: function Fix(props) {\n return <Box style={{maxWidth: 300}}>{props.renderDefault(props)}</Box>\n },\n },\n }),\n ],\n preview: {\n select: {\n ref: 'reference._ref',\n title: 'reference.title',\n context: 'reference.context',\n },\n prepare(select) {\n return select.ref\n ? (contextDocumentSchema?.preview?.prepare?.(select) ?? select)\n : {title: 'No reference selected', media: contextDocumentSchema.icon}\n },\n },\n options: {\n modal: {\n type: 'popover',\n width: 'auto',\n },\n },\n})\n\nexport const prompt = defineType({\n type: 'array',\n name: promptTypeName,\n title: 'Prompt',\n of: [\n defineArrayMember({\n type: 'block',\n styles: [{title: 'Normal', value: 'normal'}],\n lists: [],\n marks: {\n decorators: [],\n annotations: [],\n },\n of: [\n defineArrayMember({\n type: fieldReference.name,\n }),\n defineArrayMember({\n type: promptContext.name,\n }),\n defineArrayMember({\n type: userInput.name,\n }),\n ],\n }),\n /* defineArrayMember({\n type: fieldReference.name,\n }),\n defineArrayMember({\n type: promptContext.name,\n }),\n defineArrayMember({\n type: userInput.name,\n }),*/\n ],\n})\n\nexport const outputFieldType = defineType({\n type: 'object',\n name: outputFieldTypeName,\n title: 'Output field',\n fields: [\n defineField({\n type: 'string',\n name: 'path',\n title: 'Path',\n }),\n ],\n})\n\nexport const outputTypeType = defineType({\n type: 'object',\n name: outputTypeTypeName,\n title: 'Output type',\n fields: [\n defineField({\n type: 'string',\n name: 'type',\n title: 'Type',\n }),\n ],\n})\n\nexport const instruction = defineType({\n type: 'object',\n name: instructionTypeName,\n title: 'Instruction',\n fieldsets: [\n {name: 'appearance', title: 'Appearance', options: {collapsible: true, collapsed: true}},\n ],\n preview: {\n select: {\n icon: 'icon',\n title: 'title',\n userId: 'userId',\n },\n prepare: ({icon, title, userId}) => {\n return {\n title,\n icon: icon ? icons[icon as IconSymbol] : SparklesIcon,\n userId,\n }\n },\n },\n components: {\n input: InstructionInput,\n preview: (props: any) => {\n return (\n <Flex gap={3} align=\"center\" padding={2}>\n {props.icon && (\n <Box flex=\"none\">\n <Text size={1}>{createElement(props.icon)}</Text>\n </Box>\n )}\n\n <Stack flex={1} space={2}>\n <Text size={1} textOverflow=\"ellipsis\" weight=\"medium\">\n {getInstructionTitle(props)}\n </Text>\n </Stack>\n\n {props.userId && (\n <Text size={1}>\n <Tooltip\n content={<Text size={1}>Only visible to you</Text>}\n padding={2}\n placement=\"top\"\n portal\n >\n <LockIcon />\n </Tooltip>\n </Text>\n )}\n </Flex>\n )\n },\n },\n fields: [\n defineField({\n type: prompt.name,\n name: 'prompt',\n title: 'Instruction',\n description: (\n <>\n Learn from{' '}\n <a href={instructionGuideUrl} target=\"_blank\" rel=\"noreferrer\">\n our instruction guide <ArrowRightIcon />\n </a>\n </>\n ),\n components: {\n input: PromptInput,\n },\n }),\n defineField({\n type: 'string',\n name: 'icon',\n title: 'Icon',\n fieldset: 'appearance',\n components: {\n field: HiddenFieldTitle,\n input: IconInput,\n },\n }),\n defineField({\n type: 'string',\n name: 'title',\n title: 'Title',\n fieldset: 'appearance',\n components: {\n field: HiddenFieldTitle,\n },\n }),\n defineField({\n type: 'string',\n name: 'userId',\n title: 'Visibility',\n fieldset: 'appearance',\n components: {\n field: HiddenFieldTitle,\n input: InstructionVisibility,\n },\n initialValue: (params, context) => context.currentUser?.id ?? '',\n readOnly: (context) =>\n Boolean(\n context.parent?.createdById && context.parent?.createdById !== context.currentUser?.id,\n ),\n }),\n defineField({\n type: 'string',\n name: 'createdById',\n title: 'Created by',\n hidden: true,\n fieldset: 'appearance',\n initialValue: (params, context) => {\n return context.currentUser?.id ?? ''\n },\n }),\n defineField({\n type: 'array',\n name: 'output',\n title: 'Output filter',\n components: {\n input: InstructionOutputInput,\n field: InstructionOutputField,\n },\n of: [\n defineArrayMember({type: outputFieldType.name}),\n defineArrayMember({type: outputTypeType.name}),\n ],\n }),\n ],\n})\n\nexport const fieldInstructions = defineType({\n type: 'object',\n name: assistFieldTypeName,\n title: 'Field prompt',\n /* components: {\n input: FieldPromptInput,\n },*/\n fields: [\n defineField({\n type: 'string',\n name: 'path',\n title: 'Path',\n readOnly: true,\n hidden: true,\n }),\n defineField({\n type: 'array',\n name: 'instructions',\n title: 'Instructions',\n of: [{type: instruction.name}],\n components: {\n field: InstructionsArrayField,\n input: InstructionsArrayInput,\n },\n }),\n ],\n preview: {\n select: {\n title: 'path',\n },\n },\n})\n\nexport const assistDocumentSchema = defineType({\n //NOTE: this is a document type. Using object here ensures it does not appear in structure menus\n type: 'object',\n //workaround for using object and not document\n ...({liveEdit: true} as any),\n name: assistDocumentTypeName,\n title: 'AI Document',\n\n components: {\n input: AssistDocumentForm,\n field: (props: any) => {\n return props.renderDefault({...props, title: ''})\n },\n },\n fields: [\n defineField({\n type: 'string',\n name: 'title',\n title: 'Title',\n }),\n defineField({\n type: 'array',\n name: 'fields',\n title: 'Fields',\n of: [{type: fieldInstructions.name}],\n }),\n ],\n preview: {\n select: {\n title: 'title',\n },\n },\n})\n\nexport const instructionTask = defineType({\n type: 'object',\n name: instructionTaskTypeName,\n title: 'Instruction task',\n fields: [\n defineField({\n type: 'string',\n name: 'path',\n title: 'Path',\n }),\n defineField({\n type: 'string',\n name: 'instructionKey',\n title: 'Instruction key',\n }),\n defineField({\n type: 'datetime',\n name: 'started',\n title: 'Started',\n }),\n defineField({\n type: 'datetime',\n name: 'updated',\n title: 'Updated',\n }),\n defineField({\n type: 'string',\n name: 'info',\n title: 'Info',\n }),\n ],\n})\n\nexport const documentInstructionStatus = defineType({\n //NOTE: this is a document type. Using object here ensures it does not appear in structure menus\n type: 'object',\n //workaround for using object and not document\n ...({liveEdit: true} as any),\n name: assistTasksStatusTypeName,\n title: 'Document instruction status',\n fields: [\n defineField({\n type: 'array',\n name: 'tasks',\n title: 'Tasks',\n of: [{type: instructionTask.name}],\n }),\n ],\n})\n","/* eslint-disable camelcase */\nimport {ArrayOfType, FieldProps, SchemaTypeDefinition} from 'sanity'\n\nimport {\n assistDocumentSchema,\n documentInstructionStatus,\n fieldInstructions,\n fieldReference,\n instruction,\n instructionTask,\n outputFieldType,\n outputTypeType,\n prompt,\n promptContext,\n userInput,\n} from './assistDocumentSchema'\nimport {contextDocumentSchema} from './contextDocumentSchema'\n\nfunction excludeComments<T extends SchemaTypeDefinition | ArrayOfType>(type: T): T {\n const existingRender = (type as any)?.components?.field\n return {\n ...type,\n ...('components' in type\n ? {\n components: {\n ...type.components,\n field: (props: FieldProps) => {\n const newProps = {...props, ...{__internal_comments: undefined}}\n if (typeof existingRender === 'function') {\n return existingRender(newProps)\n }\n return props.renderDefault(newProps)\n },\n },\n }\n : {}),\n ...('fields' in type\n ? {\n // recursively disable comments in fields\n fields: type.fields?.map((field) => excludeComments(field)),\n }\n : {}),\n ...('of' in type\n ? {\n // recursively disable comments in array items\n of: type.of?.map((arrayItemType) => excludeComments(arrayItemType)),\n }\n : {}),\n }\n}\n\nconst instructionForm = [\n fieldInstructions,\n instruction,\n fieldReference,\n prompt,\n userInput,\n promptContext,\n].map(excludeComments)\n\nexport const schemaTypes = [\n ...instructionForm,\n outputFieldType,\n outputTypeType,\n assistDocumentSchema,\n documentInstructionStatus,\n instructionTask,\n contextDocumentSchema,\n]\n","import type {SanityClient} from '@sanity/client'\nimport {definePlugin, isObjectSchemaType} from 'sanity'\n\nimport {AssistDocumentInputWrapper} from './assistDocument/AssistDocumentInput'\nimport {AssistDocumentLayout} from './assistDocument/AssistDocumentLayout'\nimport {AssistFieldWrapper} from './assistFormComponents/AssistField'\nimport {AssistFormBlock} from './assistFormComponents/AssistFormBlock'\nimport {AssistInlineFormBlock} from './assistFormComponents/AssistInlineFormBlock'\nimport {AssistItem} from './assistFormComponents/AssistItem'\nimport {assistInspector} from './assistInspector'\nimport {AssistLayout} from './assistLayout/AssistLayout'\nimport {AssistConfig} from './assistTypes'\nimport {ImageContextProvider} from './components/ImageContext'\nimport {SafeValueInput} from './components/SafeValueInput'\nimport {packageName} from './constants'\nimport {assistFieldActions} from './fieldActions/assistFieldActions'\nimport {isSchemaAssistEnabled} from './helpers/assistSupported'\nimport {validateStyleguide} from './helpers/styleguide'\nimport {isImage} from './helpers/typeUtils'\nimport {createAssistDocumentPresence} from './presence/AssistDocumentPresence'\nimport {schemaTypes} from './schemas'\nimport {TranslationConfig} from './translate/types'\nimport {assistDocumentTypeName, AssistPreset} from './types'\nimport {AssistFieldActionNode, AssistFieldActionProps} from './fieldActions/customFieldActions'\n\nexport interface AssistPluginConfig {\n translate?: TranslationConfig\n\n /**\n * Config that affects all instructions\n */\n assist?: AssistConfig\n\n fieldActions?: {\n title?: string\n useFieldActions?: (props: AssistFieldActionProps) => AssistFieldActionNode[]\n }\n\n /**\n * @internal\n */\n __customApiClient?: (defaultClient: SanityClient) => SanityClient\n\n /**\n * @internal\n */\n __presets?: Record<string, AssistPreset>\n}\n\nexport const assist = definePlugin<AssistPluginConfig | void>((config) => {\n const configWithDefaults = config ?? {}\n const styleguide = configWithDefaults.translate?.styleguide || ''\n const maxPathDepth = configWithDefaults.assist?.maxPathDepth\n const temperature = configWithDefaults.assist?.temperature\n\n if (typeof styleguide === 'string') {\n validateStyleguide(styleguide)\n }\n\n if (maxPathDepth !== undefined && (maxPathDepth < 1 || maxPathDepth > 12)) {\n throw new Error(\n `[${packageName}]: \\`assist.maxPathDepth\\` must be be in the range [1,12] inclusive, but was ${maxPathDepth}`,\n )\n }\n\n if (temperature !== undefined && (temperature < 0 || temperature > 1)) {\n throw new Error(\n `[${packageName}]: \\`assist.maxPathDepth\\` must be be in the range [0,1] inclusive, but was ${temperature}`,\n )\n }\n\n return {\n name: packageName,\n // the addition of global references broke auto updating studios\n // new versions of studio know to look for this prop on assist plugin, and filter + console.warn if it is missing\n ...({handlesGDR: true} as any),\n schema: {\n types: schemaTypes,\n },\n i18n: {\n bundles: [{}],\n },\n\n document: {\n inspectors: (prev, context) => {\n const documentType = context.documentType\n const docSchema = context.schema.get(documentType)\n if (docSchema && isSchemaAssistEnabled(docSchema)) {\n return [...prev, assistInspector]\n }\n return prev\n },\n unstable_fieldActions: (prev, {documentType, schema}) => {\n if (documentType === assistDocumentTypeName) {\n return []\n }\n const docSchema = schema.get(documentType)\n if (docSchema && isSchemaAssistEnabled(docSchema)) {\n return [...prev, assistFieldActions]\n }\n return prev\n },\n unstable_languageFilter: (prev, {documentId, schema, schemaType}) => {\n if (schemaType === assistDocumentTypeName) {\n return []\n }\n const docSchema = schema.get(schemaType)\n if (docSchema && isObjectSchemaType(docSchema) && isSchemaAssistEnabled(docSchema)) {\n return [...prev, createAssistDocumentPresence(documentId)]\n }\n return prev\n },\n components: {\n unstable_layout: AssistDocumentLayout,\n },\n },\n\n studio: {\n components: {\n layout: function Layout(props) {\n return <AssistLayout {...props} config={configWithDefaults} />\n },\n },\n },\n\n form: {\n components: {\n input: AssistDocumentInputWrapper,\n field: AssistFieldWrapper,\n item: AssistItem,\n block: AssistFormBlock,\n inlineBlock: AssistInlineFormBlock,\n },\n },\n\n plugins: [\n definePlugin({\n name: `${packageName}/safe-value-input`,\n form: {components: {input: SafeValueInput}},\n })(),\n\n definePlugin({\n name: `${packageName}/generate-caption`,\n form: {\n components: {\n input: (props) => {\n const {schemaType} = props\n\n if (isImage(schemaType)) {\n return <ImageContextProvider {...props} />\n }\n return props.renderDefault(props)\n },\n },\n },\n })(),\n ],\n }\n})\n","import type {SanityClient} from '@sanity/client'\nimport {defer, delay, merge, Observable, of, partition, switchMap, throwError} from 'rxjs'\nimport {filter, mergeMap, share, take} from 'rxjs/operators'\nimport {exhaustMapToWithTrailing} from 'rxjs-exhaustmap-with-trailing'\nimport {MutationEvent, ReconnectEvent, WelcomeEvent} from 'sanity'\n\n/** @internal */\nexport type ListenQueryParams = Record<string, string | number | boolean | string[]>\n\n/** @beta */\nexport interface ListenQueryOptions {\n tag?: string\n apiVersion?: string\n throttleTime?: number\n transitions?: ('update' | 'appear' | 'disappear')[]\n}\n\nconst fetch = (\n client: SanityClient,\n query: string,\n params: ListenQueryParams,\n options: ListenQueryOptions,\n) =>\n defer(() =>\n // getVersionedClient(options.apiVersion)\n client.observable.fetch(query, params, {\n tag: options.tag,\n filterResponse: true,\n }),\n )\n\nconst listen = (\n client: SanityClient,\n query: string,\n params: ListenQueryParams,\n options: ListenQueryOptions,\n) =>\n defer(() =>\n // getVersionedClient(options.apiVersion)\n client.listen(query, params, {\n events: ['welcome', 'mutation', 'reconnect'],\n includeResult: false,\n visibility: 'query',\n tag: options.tag,\n }),\n ) as Observable<ReconnectEvent | WelcomeEvent | MutationEvent>\n\nfunction isWelcomeEvent(\n event: MutationEvent | ReconnectEvent | WelcomeEvent,\n): event is WelcomeEvent {\n return event.type === 'welcome'\n}\n\n/** @internal */\nexport const listenQuery = (\n client: SanityClient,\n query: string | {fetch: string; listen: string},\n params: ListenQueryParams = {},\n options: ListenQueryOptions = {},\n) => {\n const fetchQuery = typeof query === 'string' ? query : query.fetch\n const listenerQuery = typeof query === 'string' ? query : query.listen\n\n const fetchOnce$ = fetch(client, fetchQuery, params, options)\n\n const events$ = listen(client, listenerQuery, params, options).pipe(\n mergeMap((ev, i) => {\n const isFirst = i === 0\n if (isFirst && !isWelcomeEvent(ev)) {\n // if the first event is not welcome, it is most likely a reconnect and\n // if it's not a reconnect something is very wrong\n return throwError(\n new Error(\n ev.type === 'reconnect'\n ? 'Could not establish EventSource connection'\n : `Received unexpected type of first event \"${ev.type}\"`,\n ),\n )\n }\n return of(ev)\n }),\n share(),\n )\n\n const [welcome$, mutationAndReconnect$] = partition(events$, isWelcomeEvent)\n const isRelevantEvent = (event: MutationEvent | ReconnectEvent | WelcomeEvent): boolean => {\n if (!options.transitions || event.type !== 'mutation') {\n return true\n }\n\n return options.transitions.includes(event.transition)\n }\n\n return merge(\n welcome$.pipe(take(1)),\n mutationAndReconnect$.pipe(\n filter(isRelevantEvent),\n switchMap((event) => merge(of(event), of(event).pipe(delay(options.throttleTime || 1000)))),\n ),\n ).pipe(exhaustMapToWithTrailing(fetchOnce$))\n}\n","import {useEffect, useRef, useState} from 'react'\nimport isEqual from 'react-fast-compare'\nimport {catchError, distinctUntilChanged} from 'rxjs/operators'\nimport {ListenQueryOptions, useClient} from 'sanity'\n\nimport {listenQuery} from './fixedListenQuery'\n\ntype Params = Record<string, string | number | boolean | string[]>\n\ntype ReturnShape<T> = {\n loading: boolean\n error: boolean\n data: T | null\n}\n\ntype Observable = {\n unsubscribe: () => void\n}\n\nconst DEFAULT_PARAMS = {}\nconst DEFAULT_OPTIONS: ListenQueryOptions = {apiVersion: `v2022-05-09`}\n\nexport function useListeningQuery<T>(\n query: string,\n params: Params = DEFAULT_PARAMS,\n options: ListenQueryOptions = DEFAULT_OPTIONS,\n): ReturnShape<T> {\n const [loading, setLoading] = useState(true)\n const [error, setError] = useState(false)\n const [data, setData] = useState<T | null>(null)\n const subscription = useRef<null | Observable>(null)\n\n const client = useClient({apiVersion: `v2022-05-09`})\n\n useEffect(() => {\n if (query) {\n subscription.current = listenQuery(client, query, params, options)\n .pipe(\n distinctUntilChanged(isEqual),\n catchError((err) => {\n console.error(err)\n setError(err)\n setLoading(false)\n setData(null)\n\n return err\n }),\n )\n .subscribe((documents) => {\n setData((current) => (isEqual(current, documents) ? current : documents))\n setLoading(false)\n setError(false)\n })\n }\n\n return () => {\n return subscription.current ? subscription.current.unsubscribe() : undefined\n }\n }, [query, params, options, client])\n\n return {loading, error, data}\n}\n","import {SyncIcon} from '@sanity/icons'\nimport {Box, Button, Card, Flex, Label, Spinner, Stack} from '@sanity/ui'\nimport {useCallback, useMemo, useState} from 'react'\nimport {useClient, useSchema} from 'sanity'\n\nimport {useListeningQuery} from '../../_lib/useListeningQuery'\nimport {assistSerializedTypeName, SerializedSchemaType} from '../../types'\nimport {serializeSchema} from './serializeSchema'\n\nconst NO_DATA: SerializedSchemaType[] = []\n\nconst defaultTitle = 'Sync schema'\n\nexport function SchemaTypeTool() {\n const schema = useSchema()\n const client = useClient({apiVersion: '2023-01-01'})\n const [saving, setSaving] = useState(false)\n const [syncTitle, setSyncTitle] = useState(defaultTitle)\n\n const {data} = useListeningQuery<SerializedSchemaType[]>('*[_type==$type] | order(_type)', {\n type: assistSerializedTypeName,\n })\n\n const types = useMemo(() => {\n return serializeSchema(schema)\n }, [schema])\n\n const storeTypes = useCallback(() => {\n setSaving(true)\n let canSave = true\n async function store() {\n setSyncTitle(`Syncing 0/${types.length}`)\n const transaction = client.transaction()\n for (let i = 0; i < types.length; i++) {\n if (!canSave) {\n break\n }\n const type = types[i]\n await transaction.createOrReplace(type as Required<typeof type>)\n if (i > 0 && i % 50 === 0) {\n await transaction.commit()\n transaction.reset()\n setSyncTitle(`Syncing ${i}/${types.length}`)\n }\n }\n await transaction.commit()\n }\n store()\n .catch(console.error)\n .finally(() => {\n setSaving(false)\n setSyncTitle(defaultTitle)\n })\n return () => {\n canSave = false\n setSaving(false)\n setSyncTitle(defaultTitle)\n }\n }, [types, client, setSaving, setSyncTitle])\n\n return (\n <Card padding={4} overflow=\"auto\" style={{height: 'calc(100vh - 81px)'}}>\n <Stack space={4}>\n <Box>\n <Button\n icon={saving ? <Spinner style={{marginTop: 5}} /> : SyncIcon}\n text={syncTitle}\n disabled={saving}\n onClick={storeTypes}\n />\n </Box>\n <Flex gap={2}>\n <Stack space={2}>\n <Label>Studio schema</Label>\n <ul>\n {types.map((type) => (\n <li key={type.name}>\n <SchemaEntry schemaStub={type} />\n </li>\n ))}\n </ul>\n </Stack>\n\n <Stack space={2}>\n <Label>Stored schema</Label>\n <ul>\n {(data ?? NO_DATA).map((type) => (\n <li key={type.name}>\n <SchemaEntry schemaStub={type} />\n </li>\n ))}\n </ul>\n </Stack>\n </Flex>\n </Stack>\n </Card>\n )\n}\n\nfunction SchemaEntry({schemaStub}: {schemaStub: SerializedSchemaType}) {\n const out = useMemo(() => JSON.stringify(schemaStub, null, 2), [schemaStub])\n return <pre>{out}</pre>\n}\n","import {useRunInstruction} from '../assistLayout/RunInstructionProvider'\n\nexport type GetUserInput = (args: {\n /**\n * Dialog title\n */\n title: string\n /**\n * One titled input per array item\n */\n inputs: CustomInput[]\n}) => Promise<CustomInputResult[] | undefined>\n\n/**\n *\n */\nexport interface CustomInput {\n /**\n * Id for the input\n */\n id: string\n /**\n * Title of the input field\n */\n title: string\n /**\n * Additional info that will be displayed over the input\n */\n description?: string\n}\n\nexport type CustomInputResult = {\n /**\n * Identifies which custom input the `result`belongs to\n */\n input: CustomInput\n\n /**\n * The text provided by the user in the input\n */\n result: string\n}\n\n/**\n * `useUserInput` returns a function that can be used to await user input.\n *\n * Useful for custom `fieldActions` to get user input for populating Agent Action requests,.\n *\n * ```ts\n * fieldActions: {\n * useFieldActions: (props) => {\n * const {\n * documentSchemaType,\n * schemaId,\n * getDocumentValue,\n * getConditionalPaths,\n * documentIdForAction,\n * } = props\n * const client = useClient({apiVersion: 'vX'})\n * const getUserInput = useUserInput()\n * return useMemo(() => {\n * return [\n * defineAssistFieldAction({\n * title: 'Log user input',\n * icon: UserIcon,\n * onAction: async () => {\n * const input = await getUserInput({\n * title: 'Topic',\n * inputs: [{id: 'about', title: 'What should the article be about?'}],\n * })\n * if (!input) return // user canceled input\n * await client.agent.action.generate({\n * schemaId,\n * targetDocument: {\n * operation: 'createIfNotExists',\n * _id: documentIdForAction,\n * _type: documentSchemaType.name,\n * initialValues: getDocumentValue(),\n * },\n * instruction: `\n * Create a document about the following topic:\n * $about\n * ---\n * `,\n * instructionParams: {about: input[0].result},\n * conditionalPaths: {paths: getConditionalPaths()},\n * })\n * },\n * }),\n * ]\n * }, [\n * client,\n * documentSchemaType,\n * schemaId,\n * getDocumentValue,\n * getConditionalPaths,\n * documentIdForAction,\n * getUserInput,\n * ])\n * },\n * }\n * ```\n */\nexport function useUserInput(): GetUserInput {\n const {getUserInput} = useRunInstruction()\n return getUserInput\n}\n"],"names":["scrollParent","options","instruction","status","inputs","isDocAssistable","catchError","DEFAULT_MAX_DEPTH","ABSOLUTE_MAX_DEPTH","maxDepth","filter","basePath","document","languages","toLanguages","fromLanguage","assistDocumentId","anyPresence","value"],"mappings":"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","x_google_ignoreList":[37,73]}