@rebasepro/plugin-data-enhancement 0.0.1-canary.eae7889 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (39) hide show
  1. package/dist/core/src/components/BootstrapAdminBanner.d.ts +4 -0
  2. package/dist/core/src/components/LoginView/LoginView.d.ts +22 -0
  3. package/dist/core/src/components/common/useDataTableController.d.ts +3 -3
  4. package/dist/core/src/components/index.d.ts +1 -0
  5. package/dist/core/src/hooks/data/useRelationSelector.d.ts +2 -2
  6. package/dist/core/src/hooks/index.d.ts +1 -0
  7. package/dist/core/src/hooks/useCollapsedGroups.d.ts +16 -1
  8. package/dist/core/src/hooks/useResolvedComponent.d.ts +47 -0
  9. package/dist/index.es.js +14 -13
  10. package/dist/index.es.js.map +1 -1
  11. package/dist/index.umd.js +14 -13
  12. package/dist/index.umd.js.map +1 -1
  13. package/dist/types/src/controllers/auth.d.ts +8 -2
  14. package/dist/types/src/controllers/client.d.ts +13 -0
  15. package/dist/types/src/controllers/collection_registry.d.ts +2 -1
  16. package/dist/types/src/controllers/data_driver.d.ts +36 -1
  17. package/dist/types/src/controllers/navigation.d.ts +18 -6
  18. package/dist/types/src/controllers/registry.d.ts +9 -1
  19. package/dist/types/src/controllers/side_entity_controller.d.ts +7 -0
  20. package/dist/types/src/rebase_context.d.ts +17 -0
  21. package/dist/types/src/types/backend_hooks.d.ts +187 -0
  22. package/dist/types/src/types/collections.d.ts +31 -11
  23. package/dist/types/src/types/component_ref.d.ts +47 -0
  24. package/dist/types/src/types/cron.d.ts +1 -1
  25. package/dist/types/src/types/entity_views.d.ts +6 -7
  26. package/dist/types/src/types/formex.d.ts +40 -0
  27. package/dist/types/src/types/index.d.ts +3 -0
  28. package/dist/types/src/types/plugins.d.ts +6 -3
  29. package/dist/types/src/types/properties.d.ts +72 -88
  30. package/dist/types/src/types/slots.d.ts +20 -10
  31. package/dist/types/src/types/translations.d.ts +6 -0
  32. package/dist/ui/src/components/FileUpload.d.ts +1 -1
  33. package/dist/ui/src/components/SearchBar.d.ts +5 -1
  34. package/dist/ui/src/styles.d.ts +2 -2
  35. package/package.json +9 -9
  36. package/src/components/DataEnhancementControllerProvider.tsx +1 -1
  37. package/src/components/FormEnhanceAction.tsx +9 -8
  38. package/src/utils/properties.ts +4 -4
  39. package/src/utils/strings_counter.ts +1 -1
package/dist/index.umd.js CHANGED
@@ -174,7 +174,7 @@
174
174
  type: property.type,
175
175
  fieldConfigId: fieldId,
176
176
  enum: "enum" in property && property.enum ? getSimpleEnumValues(property.enum) : void 0,
177
- disabled: Boolean(property.disabled || property.readOnly)
177
+ disabled: Boolean(property.ui?.disabled || property.ui?.readOnly)
178
178
  };
179
179
  }
180
180
  function getSimplifiedProperty(property, path, value) {
@@ -186,7 +186,7 @@
186
186
  description: property.description,
187
187
  type: property.type,
188
188
  fieldConfigId: "repeat",
189
- disabled: Boolean(property.disabled || property.readOnly),
189
+ disabled: Boolean(property.ui?.disabled || property.ui?.readOnly),
190
190
  of: getSimpleProperty(property.of)
191
191
  };
192
192
  const result = {
@@ -199,7 +199,7 @@
199
199
  description: property.description,
200
200
  type: property.type,
201
201
  fieldConfigId: "block",
202
- disabled: Boolean(property.disabled || property.readOnly),
202
+ disabled: Boolean(property.ui?.disabled || property.ui?.readOnly),
203
203
  oneOf: {
204
204
  typeField: property.oneOf.typeField,
205
205
  valueField: property.oneOf.valueField,
@@ -254,7 +254,7 @@
254
254
  description: property.description,
255
255
  type: property.type,
256
256
  fieldConfigId: "group",
257
- disabled: Boolean(property.disabled || property.readOnly)
257
+ disabled: Boolean(property.ui?.disabled || property.ui?.readOnly)
258
258
  };
259
259
  return {
260
260
  [path]: mapParentProperty,
@@ -397,7 +397,7 @@
397
397
  Object.entries(updatedValues).forEach(([propertyKey_1, suggestion]) => {
398
398
  const value_0 = utils.getValueInPath(currentValues, propertyKey_1);
399
399
  const property_0 = getPropertyFromKey(properties, propertyKey_1);
400
- if (!property_0 || suggestion === null || property_0.disabled) {
400
+ if (!property_0 || suggestion === null || property_0?.disabled) {
401
401
  return;
402
402
  }
403
403
  if (typeof suggestion === "number") {
@@ -559,12 +559,10 @@
559
559
  const dataEnhancementController = useDataEnhancementController();
560
560
  const [samplePrompts, setSamplePrompts] = React.useState(void 0);
561
561
  const [instructions, setInstructions] = React.useState("");
562
- const {
563
- suggestions,
564
- getSamplePrompts
565
- } = dataEnhancementController;
562
+ const getSamplePrompts = dataEnhancementController?.getSamplePrompts;
566
563
  const loadingPrompts = React.useRef(false);
567
564
  const updateSuggestedPrompts = React.useCallback(async function updateSuggestedPrompts2(instructions_0) {
565
+ if (!getSamplePrompts) return;
568
566
  if (loadingPrompts.current) return;
569
567
  loadingPrompts.current = true;
570
568
  const prompts = status === "new" ? (await getSamplePrompts(collection.singularName ?? collection.name, instructions_0)).prompts : getPromptsForExistingEntities(collection.properties);
@@ -575,16 +573,18 @@
575
573
  }, [collection.name, collection.singularName, getSamplePrompts, status]);
576
574
  React.useDeferredValue(formContext?.values);
577
575
  React.useEffect(() => {
576
+ if (!dataEnhancementController) return;
578
577
  if (!samplePrompts) {
579
578
  setSamplePrompts(getRecentPromptsFromStorage(storageKey));
580
579
  updateSuggestedPrompts().then();
581
580
  }
582
- }, [samplePrompts, storageKey, updateSuggestedPrompts, instructions, status]);
581
+ }, [dataEnhancementController, samplePrompts, storageKey, updateSuggestedPrompts, instructions, status]);
583
582
  React.useEffect(() => {
583
+ if (!dataEnhancementController) return;
584
584
  updateSuggestedPrompts().then();
585
- }, [status]);
585
+ }, [dataEnhancementController, status]);
586
586
  const enhance = (prompt_0) => {
587
- if (!formContext?.values) return;
587
+ if (!dataEnhancementController || !formContext?.values) return;
588
588
  setLoading(true);
589
589
  if (prompt_0) {
590
590
  addRecentPrompt(storageKey, prompt_0);
@@ -603,6 +603,7 @@
603
603
  });
604
604
  };
605
605
  if (!dataEnhancementController?.enabled) return null;
606
+ const suggestions = dataEnhancementController.suggestions;
606
607
  Object.values(suggestions).filter(Boolean).length > 0;
607
608
  (samplePrompts ?? []).length > 0 && instructions.length === 0;
608
609
  function submit() {
@@ -662,7 +663,7 @@
662
663
  if (common.isPropertyBuilder(p)) {
663
664
  return false;
664
665
  }
665
- return p.type === "string" && (p.markdown || p.multiline);
666
+ return p.type === "string" && (p.ui?.markdown || p.ui?.multiline);
666
667
  });
667
668
  const multilinePrompt = multilineProperties.length > 0 ? multilineProperties[Math.floor(Math.random() * multilineProperties.length)] : void 0;
668
669
  const prompts = ["Fill the missing fields", "Translate the missing content"];
@@ -1 +1 @@
1
- {"version":3,"file":"index.umd.js","sources":["../src/utils/values.ts","../src/api.ts","../src/utils/suggestions.ts","../src/utils/properties.ts","../src/editor/useEditorAIController.tsx","../src/components/DataEnhancementControllerProvider.tsx","../src/components/FormEnhanceAction.tsx","../src/useDataEnhancementPlugin.tsx"],"sourcesContent":["export function flatMapEntityValues<M extends object>(values: M, path = \"\"): object {\n if (!values) return {};\n return Object.entries(values).flatMap(([key, value]) => {\n const currentPath = path ? `${path}.${key}` : key;\n if (typeof value === \"object\") {\n return flatMapEntityValues(value, currentPath);\n } else {\n return { [currentPath]: value };\n }\n }).reduce((acc, curr) => ({ ...acc,\n...curr }), {})\n}\n","import {\n DataEnhancementRequest,\n EnhancedDataResult,\n InputEntity,\n InputProperty,\n SamplePromptsResult\n} from \"./types/data_enhancement_controller\";\nimport { EntityValues } from \"@rebasepro/types\";\nimport { flatMapEntityValues } from \"./utils/values\";\n\n// const DEFAULT_SERVER = \"http://localhost:5001/rebase-dev-2da42/europe-west3/api\"; // Local\n\nconst DEFAULT_SERVER = \"https://api.rebase.pro\";\n\nexport async function enhanceDataAPIStream<M extends Record<string, unknown>>(props: {\n apiKey: string,\n entityId?: string | number,\n entityName: string,\n entityDescription?: string,\n propertyKey?: string,\n propertyInstructions?: string;\n values: EntityValues<M>,\n path: string,\n properties: Record<string, InputProperty>,\n\n instructions?: string,\n firebaseToken: string,\n onUpdate: (suggestions: Record<string, any>) => void;\n onUpdateDelta: (propertyKey: string, partialValue: any) => void;\n onError: (error: Error) => void;\n onEnd: (result: EnhancedDataResult) => void;\n host?: string;\n}) {\n\n const flatValues = flatMapEntityValues(props.values);\n\n const properties = props.properties;\n\n const inputEntity: InputEntity = {\n entityId: props.entityId,\n values: flatValues\n }\n\n const request: DataEnhancementRequest = {\n inputEntity,\n properties,\n entityName: props.entityName,\n entityDescription: props.entityDescription,\n propertyKey: props.propertyKey,\n propertyInstructions: props.propertyInstructions,\n instructions: props.instructions\n };\n\n console.debug(\"enhanceDataAPIStream\", request);\n\n return fetch((props.host ?? DEFAULT_SERVER) + \"/data/enhance_stream/\",\n {\n // mode: \"no-cors\",\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Basic ${props.firebaseToken}`,\n \"x-de-api-key\": `Basic ${props.apiKey}`\n // \"x-de-version\": version\n },\n body: JSON.stringify(request)\n })\n .then(async (res) => {\n if (!res.ok) {\n console.error(\"enhanceDataAPIStream error\", res)\n throw await res.json();\n }\n const reader = res.body?.getReader();\n if (!reader) {\n throw new Error(\"No reader\");\n }\n\n for await (const chunk of readChunks(reader)) {\n const str = new TextDecoder().decode(chunk);\n try {\n str.split(\"&$# \").forEach((s) => {\n if (s && s.length > 0) {\n const data = JSON.parse(s.trim());\n if (data.type === \"suggestion_delta\")\n props.onUpdateDelta(data.data.propertyKey, data.data.partialValue);\n else if (data.type === \"suggestion\")\n props.onUpdate(data.data);\n else if (data.type === \"result\")\n props.onEnd(data.data);\n }\n });\n } catch (e: any) {\n console.error(\"str\", str);\n console.error(\"Error parsing stream\", e);\n props.onError(e);\n }\n }\n\n });\n\n}\n\nfunction readChunks(reader: ReadableStreamDefaultReader) {\n return {\n async *[Symbol.asyncIterator]() {\n let readResult = await reader.read();\n while (!readResult.done) {\n yield readResult.value;\n readResult = await reader.read();\n }\n }\n };\n}\n\nexport async function fetchEntityPromptSuggestion<M extends object>(props: {\n input?: string,\n entityName: string,\n firebaseToken: string,\n apiKey: string,\n host?: string\n}): Promise<SamplePromptsResult> {\n\n return fetch((props.host ?? DEFAULT_SERVER) + \"/data/prompt_autocomplete/\",\n {\n // mode: \"no-cors\",\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Basic ${props.firebaseToken}`,\n \"x-de-api-key\": `Basic ${props.apiKey}`\n },\n body: JSON.stringify({\n entityName: props.entityName,\n input: props.input ?? null\n })\n })\n .then(async (res) => {\n const data = await res.json();\n if (!res.ok) {\n console.error(\"fetchEntityPromptSuggestion\", data);\n throw Error(data.message);\n }\n return {\n prompts: data.data.prompts.map((e: string) => ({\n prompt: e,\n type: \"sample\"\n }))\n };\n });\n\n}\n\nexport async function autocompleteStream(props: {\n firebaseToken: string,\n textBefore?: string,\n textAfter: string,\n host?: string;\n onUpdate: (delta: string) => void;\n}) {\n\n let result = \"\";\n return fetch((props.host ?? DEFAULT_SERVER) + \"/data/autocomplete/\",\n {\n // mode: \"no-cors\",\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Basic ${props.firebaseToken}`\n // \"x-de-version\": version\n },\n body: JSON.stringify({\n textBefore: props.textBefore,\n textAfter: props.textAfter\n })\n })\n .then(async (res) => {\n if (!res.ok) {\n console.error(\"enhanceDataAPIStream error\", res)\n throw await res.json();\n }\n const reader = res.body?.getReader();\n if (!reader) {\n throw new Error(\"No reader\");\n }\n\n for await (const chunk of readChunks(reader)) {\n const str = new TextDecoder().decode(chunk);\n result += str;\n console.debug(\"Autocomplete update:\", str);\n props.onUpdate(str);\n }\n\n }).then(() => {\n console.debug(\"Autocomplete result:\", result);\n return result;\n });\n\n}\n","export function getAppendableSuggestion(suggestion: string | number | undefined, value: any): string | undefined {\n const suggestionIncludesValue = typeof suggestion === \"string\" && typeof value === \"string\" && suggestion.toLowerCase().trim().startsWith(value.toLowerCase().trim());\n return (typeof value === \"string\" && suggestionIncludesValue)\n ? suggestion.substring(suggestion.toLowerCase().trim().indexOf(value.toLowerCase().trim()) + value.trim().length)\n : undefined;\n}\n","import { getFieldId } from \"@rebasepro/admin\";\nimport { EnumValues, Properties, Property } from \"@rebasepro/types\";\nimport { isPropertyBuilder } from \"@rebasepro/common\";\nimport { InputProperty } from \"../types/data_enhancement_controller\";\nimport { getValueInPath } from \"@rebasepro/utils\";\n\nexport function getSimplifiedProperties<M extends Record<string, any>>(properties: Properties, values: M, path = \"\"): Record<string, InputProperty> {\n if (!properties) return {};\n return Object.entries(properties)\n .map(([key, property]) => {\n if (isPropertyBuilder(property)) return {};\n const fullKey = path ? `${path}.${key}` : key;\n const valueInPath = getValueInPath(values, fullKey);\n return getSimplifiedProperty(property, fullKey, valueInPath)\n })\n .reduce((a, b) => ({ ...a,\n...b }), {});\n}\n\nfunction getSimpleProperty(property: Property): InputProperty {\n const fieldId = getFieldId(property);\n if (!fieldId) {\n console.error(\"No fieldId found for property\", property);\n throw new Error(\"Field id not found\");\n }\n return {\n name: property.name,\n description: property.description,\n type: property.type,\n fieldConfigId: fieldId,\n enum: \"enum\" in property && property.enum\n ? getSimpleEnumValues(property.enum)\n : undefined,\n disabled: Boolean(property.disabled || property.readOnly)\n };\n}\n\nfunction getSimplifiedProperty(property: Property, path: string, value?: any): Record<string, InputProperty> {\n if (isPropertyBuilder(property)) return {};\n if (property.type === \"array\") {\n\n if (property.of && !Array.isArray(property.of) && !isPropertyBuilder(property.of)) {\n const arrayParentProperty: InputProperty = {\n name: property.name,\n description: property.description,\n type: property.type,\n fieldConfigId: \"repeat\",\n disabled: Boolean(property.disabled || property.readOnly),\n of: getSimpleProperty(property.of as Property)\n };\n\n const result = { [path]: arrayParentProperty };\n // if (Array.isArray(value)) {\n // result = {\n // ...result,\n // ...value\n // .map((v, i) => getSimplifiedProperty(property.of, `${path}.${i}`, v))\n // .reduce((a, b) => ({ ...a, ...b }), {})\n // };\n // }\n //\n // const existingValuesCount = Array.isArray(value) ? value.length : 0;\n //\n // const newValuesCount = property.of && !isPropertyBuilder<any, any>(property.of) && (property.of as Property).type === \"map\" ? 1 : 3;\n // result = {\n // ...result,\n // // ...Array.from(Array(newValuesCount))\n // // .map((v, i) => getSimplifiedProperty(property.of, `${path}.${i + existingValuesCount}`, v))\n // // .reduce((a, b) => ({ ...a, ...b }), {})\n // }\n\n return result;\n } else if (property.oneOf) {\n\n const arrayParentProperty: InputProperty = {\n name: property.name,\n description: property.description,\n type: property.type,\n fieldConfigId: \"block\",\n disabled: Boolean(property.disabled || property.readOnly),\n oneOf: {\n typeField: property.oneOf.typeField,\n valueField: property.oneOf.valueField,\n properties: Object.entries(property.oneOf.properties)\n .map(([key, prop]) => ({ [key]: getSimpleProperty(prop) }))\n .reduce((a, b) => ({ ...a,\n...b }), {})\n }\n };\n\n if (!Array.isArray(value)) {\n return { [path]: arrayParentProperty };\n }\n\n return value.map((v, i) => {\n if (v == null) return {};\n const typeKey = property.oneOf!.typeField ?? \"type\";\n const oneOfType = v[typeKey];\n const valueKey = property.oneOf!.valueField ?? \"value\";\n const oneOfValue = v[valueKey];\n const childProperty = property.oneOf!.properties[oneOfType];\n if (childProperty === undefined) {\n console.error(`No property found for type ${oneOfType}`, property.oneOf!.properties);\n return {};\n }\n const simplifiedProperty = getSimplifiedProperty(childProperty, `${path}.${i}.${valueKey}`, oneOfValue);\n return {\n [`${path}.${i}.${typeKey}`]: oneOfType,\n ...simplifiedProperty\n };\n }).reduce((a, b) => ({ ...a,\n...b }), { [path]: arrayParentProperty });\n }\n } else if (property.type === \"map\") {\n if (property.properties) {\n const mapProperties: Record<string, InputProperty> = Object.entries(property.properties)\n .map(([key, childProperty]) => {\n const childValue = value?.[key];\n return getSimplifiedProperty(childProperty, key, childValue);\n })\n .map(o => attachPathToKeys(o, path))\n .reduce((a, b) => ({ ...a,\n...b }), {});\n\n if (Object.keys(mapProperties).length === 0) return {};\n const mapParentProperty: InputProperty = {\n name: property.name,\n description: property.description,\n type: property.type,\n fieldConfigId: \"group\",\n disabled: Boolean(property.disabled || property.readOnly)\n };\n return {\n [path]: mapParentProperty,\n ...mapProperties\n } as Record<string, InputProperty>;\n }\n } else {\n const fieldId = getFieldId(property);\n if (!fieldId) {\n console.warn(`No fieldId found for property ${path} with type ${property.type}`);\n return {};\n }\n return {\n [path]: getSimpleProperty(property)\n };\n }\n return {};\n}\n\n// attach a path to every key in an object\nfunction attachPathToKeys(obj: Record<string, any>, path = \"\"): Record<string, any> {\n return Object.entries(obj)\n .map(([key, value]) => {\n const fullKey = path ? `${path}.${key}` : key;\n return { [fullKey]: value };\n })\n .reduce((a, b) => ({ ...a,\n...b }), {});\n}\n\nfunction getSimpleEnumValues(enumValues: EnumValues): string[] {\n if (Array.isArray(enumValues))\n return enumValues.map(v => String(v.id));\n if (typeof enumValues === \"object\")\n return Object.keys(enumValues);\n throw Error(\"getSimpleEnumValues: Invalid enumValues\");\n}\n","import { autocompleteStream } from \"../api\";\nimport { EditorAIController } from \"@rebasepro/admin\";\n\nexport function useEditorAIController({ getAuthToken }: { getAuthToken?: () => Promise<string> }): EditorAIController {\n const autocomplete = async (textBefore: string, textAfter: string, onUpdate: (delta: string) => void) => {\n if (!getAuthToken) {\n throw new Error(\"Firebase token is required\");\n }\n const firebaseToken = await getAuthToken();\n return autocompleteStream({\n firebaseToken,\n textBefore,\n textAfter,\n onUpdate\n });\n }\n\n return {\n autocomplete\n };\n}\n\n// async function * generateLoremIpsum(): AsyncGenerator<string> {\n// const loremIpsum = \"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.\\n# Heading\\n\\nLorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.\";\n//\n// const words = loremIpsum.split(\" \");\n//\n// for (const word of words) {\n// yield word;\n// await new Promise(resolve => setTimeout(resolve, 100));\n// }\n// }\n//\n// const generator = generateLoremIpsum();\n// for await (const word of generator) {\n//\n// }\n","import React, { PropsWithChildren, useCallback, useContext, useEffect, useMemo, useRef, useState } from \"react\";\n\nimport {\n DataEnhancementController,\n EnhancedDataResult,\n EnhanceParams,\n InputProperty\n} from \"../types/data_enhancement_controller\";\nimport {\n useAuthController,\n useCustomizationController,\n useSnackbarController\n} from \"@rebasepro/core\";\nimport { useUrlController } from \"@rebasepro/admin\";\nimport { DataDriver, Entity, EntityCollection, PluginFormActionProps } from \"@rebasepro/types\";\nimport { enhanceDataAPIStream, fetchEntityPromptSuggestion } from \"../api\";\nimport { getAppendableSuggestion } from \"../utils/suggestions\";\nimport { getSimplifiedProperties } from \"../utils/properties\";\nimport { useEditorAIController } from \"../editor/useEditorAIController\";\nimport { getValueInPath } from \"@rebasepro/utils\";\n\nexport const DataEnhancementControllerContext = React.createContext<DataEnhancementController>(null! as DataEnhancementController);\n\nexport type DataEnhancementControllerProviderProps = {\n\n apiKey: string;\n\n getConfigForPath?: (props: {\n path: string,\n collection: EntityCollection\n }) => boolean;\n\n host?: string;\n}\n\nexport const useDataEnhancementController = (): DataEnhancementController => useContext(DataEnhancementControllerContext);\n\nfunction getPropertyFromKey(properties: Record<string, InputProperty>, propertyKey: string) {\n if (propertyKey in properties) {\n return properties[propertyKey];\n } else {\n //split the property key\n const split = propertyKey.split(\".\");\n if (split.length === 1) {\n return undefined;\n }\n const parentKey = split.slice(0, split.length - 1).join(\".\");\n return getPropertyFromKey(properties, parentKey);\n\n }\n}\n\nexport function DataEnhancementControllerProvider({\n apiKey,\n getConfigForPath,\n children,\n host,\n path,\n collection,\n formContext\n}: PropsWithChildren<DataEnhancementControllerProviderProps & PluginFormActionProps<any>>) {\n\n const [enabled, setEnabled] = useState(false);\n const [suggestions, setSuggestions] = useState<Record<string, string | number>>({});\n const [loadingSuggestions, setLoadingSuggestions] = useState<string[]>([]);\n\n const enhancingInProgress = useRef(false);\n\n const authController = useAuthController();\n const snackbarController = useSnackbarController();\n\n\n const properties = useMemo(() => getSimplifiedProperties(collection.properties, formContext?.values ?? {}), [formContext?.values]);\n // const preEnhanceValuesRef = React.useRef(formContext?.values ?? {});\n const valuesRef = React.useRef(formContext?.values ?? {});\n useEffect(() => {\n if (!enhancingInProgress.current)\n valuesRef.current = formContext?.values ?? {};\n }, [formContext?.values]);\n\n const allowReferenceDataSelection = false;\n\n const updateConfig = useCallback(async () => {\n if (!getConfigForPath) return;\n const config = getConfigForPath({\n path,\n collection\n });\n if (config) {\n setEnabled(true);\n }\n }, [collection, getConfigForPath, path]);\n\n useEffect(() => {\n if (!getConfigForPath) {\n setEnabled(true);\n } else {\n updateConfig();\n }\n\n }, [getConfigForPath, updateConfig]);\n\n\n const urlController = useUrlController();\n\n const clearSuggestion = useCallback((propertyKey: string) => {\n setSuggestions((prev) => {\n //remove propertyKey from prev\n const {\n [propertyKey]: _,\n ...rest\n } = prev;\n return rest;\n });\n }, []);\n\n const appendValueDelta = useCallback((propertyKey: string, delta: string) => {\n\n const property = getPropertyFromKey(properties, propertyKey);\n if (delta === null || property?.disabled) {\n return;\n }\n\n // clearSuggestion(propertyKey);\n const value = getValueInPath(valuesRef.current, propertyKey);\n\n const currentValue = value ? (value as string) + \"\" : \"\";\n const updatedValue = currentValue + delta;\n // if (currentValue.length === 0) updatedValue = updatedValue.trimStart();\n valuesRef.current = {\n ...valuesRef.current,\n [propertyKey]: updatedValue\n };\n formContext?.setFieldValue(propertyKey, updatedValue, false);\n setSuggestions(prev => ({\n ...prev,\n [propertyKey]: (prev[propertyKey] ?? \"\") + delta\n }));\n }, [properties, formContext]);\n\n const updateSuggestedValues = useCallback((currentValues: object, updatedValues: Record<string, string | number>, replaceValues: boolean) => {\n\n setLoadingSuggestions((prev) => {\n return prev.filter(p => !Object.keys(updatedValues).includes(p));\n });\n\n Object.entries(updatedValues).forEach(([propertyKey, suggestion]) => {\n\n const value = getValueInPath(currentValues, propertyKey);\n const property = getPropertyFromKey(properties, propertyKey);\n\n if (!property || suggestion === null || property.disabled) {\n return;\n }\n\n if (typeof suggestion === \"number\") {\n formContext?.setFieldValue(propertyKey, suggestion);\n return;\n }\n\n if (replaceValues) {\n formContext?.setFieldValue(propertyKey, suggestion);\n return;\n }\n\n const appendableValue = getAppendableSuggestion(suggestion, value);\n\n const currentValue = value ? (value as string) + \"\" : \"\";\n if (appendableValue) {\n formContext?.setFieldValue(propertyKey, suggestion);\n } else {\n const multiline = property?.fieldConfigId === \"multiline\" || property?.fieldConfigId === \"markdown\";\n const trimmedValue = currentValue.trimEnd();\n if (multiline && (trimmedValue.endsWith(\".\") || trimmedValue.endsWith(\"?\") || trimmedValue.endsWith(\"!\") || trimmedValue.endsWith(\":\"))) {\n formContext?.setFieldValue(propertyKey, trimmedValue + \"\\n\\n\" + (suggestion as string).trimStart());\n } else {\n formContext?.setFieldValue(propertyKey, trimmedValue + (trimmedValue.length > 0 ? \" \" : \"\") + (suggestion as string));\n }\n }\n });\n\n setSuggestions(prev => ({\n ...prev,\n ...Object.keys(updatedValues)\n .reduce((acc, key) => {\n const value = getValueInPath(formContext?.values, key);\n const suggestion = updatedValues[key];\n return {\n ...acc,\n [key]: getAppendableSuggestion(suggestion, value) ?? suggestion\n };\n }, {})\n }));\n }, [properties, formContext]);\n\n const displayNeededSubscriptionSnackbar = useCallback((projectId: any) => {\n snackbarController.open({\n type: \"warning\",\n message: \"A valid subscription is needed in order to use this function.\",\n autoHideDuration: 4000\n });\n }, [snackbarController]);\n\n const editorAIController = useEditorAIController({ getAuthToken: authController.getAuthToken });\n\n const clearAllSuggestions = useCallback(() => {\n setSuggestions({});\n }, []);\n\n const enhance = useCallback(async (props: EnhanceParams<any>): Promise<EnhancedDataResult | null> => {\n\n if (!authController.user) {\n snackbarController.open({\n type: \"warning\",\n message: \"You need to be logged in to enhance data\"\n });\n return Promise.reject(new Error(\"Not logged in\"));\n }\n\n const resolvedPath = urlController.resolveDatabasePathsFrom(path);\n const firebaseToken = await authController.getAuthToken();\n\n if (props.propertyKey) {\n clearSuggestion(props.propertyKey)\n } else {\n clearAllSuggestions();\n }\n\n setLoadingSuggestions((prev) => [...prev, ...(props.propertyKey ? [props.propertyKey] : Object.keys(properties))]);\n enhancingInProgress.current = true;\n\n const currentValues = valuesRef.current ?? {};\n\n return new Promise((resolve, reject) => {\n function onError(e: any) {\n setLoadingSuggestions([]);\n if (e.code === \"payment-required\") {\n const projectId = e.data.projectId;\n displayNeededSubscriptionSnackbar(projectId);\n } else {\n console.error(\"Enhance error\", e);\n }\n reject(e);\n enhancingInProgress.current = false;\n }\n\n try {\n enhanceDataAPIStream({\n ...props,\n host,\n apiKey,\n properties,\n path: resolvedPath,\n entityName: collection.singularName ?? collection.name,\n entityDescription: collection.description,\n\n firebaseToken,\n onUpdate: (suggestions) => {\n console.debug(\"de onUpdate\", suggestions);\n updateSuggestedValues(currentValues, suggestions, props.replaceValues ?? false);\n },\n onUpdateDelta: (propertyKey: string, partialValue: string) => {\n // console.debug(\"de delta\", propertyKey, partialValue);\n appendValueDelta(propertyKey, partialValue);\n },\n onError,\n onEnd: (result) => {\n console.debug(\"de onEnd\", result);\n if (result.errors) {\n result.errors.forEach((error) => {\n snackbarController.open({\n type: \"warning\",\n message: error\n })\n });\n }\n if (Object.keys(result.suggestions).length === 0) {\n snackbarController.open({\n type: \"info\",\n autoHideDuration: 1800,\n message: \"No fields were updated\"\n })\n }\n setLoadingSuggestions([]);\n resolve(result);\n enhancingInProgress.current = false;\n }\n }).catch(onError);\n } catch (e: any) {\n onError(e);\n }\n });\n }, [\n authController, urlController, path, clearSuggestion, clearAllSuggestions,\n properties, host, apiKey, collection, updateSuggestedValues, appendValueDelta, displayNeededSubscriptionSnackbar, snackbarController\n ]);\n\n const getSamplePrompts = useCallback(async (entityName: string, input?: string) => {\n const firebaseToken = await authController.getAuthToken()\n return fetchEntityPromptSuggestion({\n host,\n entityName,\n firebaseToken,\n apiKey,\n input\n });\n }, [apiKey, authController.getAuthToken, host]);\n\n const dataEnhancementController: DataEnhancementController = useMemo(() => ({\n enabled,\n suggestions,\n clearSuggestion,\n enhance,\n allowReferenceDataSelection,\n clearAllSuggestions,\n getSamplePrompts,\n loadingSuggestions,\n editorAIController\n }), [\n enabled,\n suggestions,\n clearSuggestion,\n enhance,\n allowReferenceDataSelection,\n clearAllSuggestions,\n getSamplePrompts,\n loadingSuggestions,\n editorAIController\n ]);\n\n return (\n <DataEnhancementControllerContext.Provider\n value={dataEnhancementController}>\n {children}\n </DataEnhancementControllerContext.Provider>\n );\n}\n\n\n","\nimport React, { useCallback, useDeferredValue, useEffect, useRef } from \"react\";\n\nimport { Button, CircularProgress, cls, focusedDisabled, IconButton, Menu, MenuItem, Separator, TextareaAutosize , iconSize } from \"@rebasepro/ui\";\nimport { XIcon, SendIcon } from \"lucide-react\";\nimport {\n AIIcon,\n useLargeLayout\n} from \"@rebasepro/core\";\nimport { EntityStatus, PluginFormActionProps, Properties, Property } from \"@rebasepro/types\";\nimport { isPropertyBuilder, stripCollectionPath } from \"@rebasepro/common\";\nimport { useDataEnhancementController } from \"./DataEnhancementControllerProvider\";\nimport { SamplePrompt } from \"../types/data_enhancement_controller\";\n\nexport function FormEnhanceAction({\n entityId,\n path,\n status,\n collection,\n formContext,\n openEntityMode\n}: PluginFormActionProps) {\n\n const largeLayout = useLargeLayout();\n\n const storageKey = createLocalStorageKey(path, status);\n\n const [loading, setLoading] = React.useState(false);\n const dataEnhancementController = useDataEnhancementController();\n\n const [samplePrompts, setSamplePrompts] = React.useState<SamplePrompt[] | undefined>(undefined);\n const [instructions, setInstructions] = React.useState<string>(\"\");\n\n const {\n suggestions,\n getSamplePrompts\n } = dataEnhancementController;\n\n const loadingPrompts = useRef(false);\n const updateSuggestedPrompts = useCallback(async function updateSuggestedPrompts(instructions?: string) {\n if (loadingPrompts.current) return;\n loadingPrompts.current = true;\n const prompts = status === \"new\"\n ? (await getSamplePrompts(collection.singularName ?? collection.name, instructions)).prompts\n : getPromptsForExistingEntities(collection.properties);\n\n const recentPromptsFromStorage = getRecentPromptsFromStorage(storageKey);\n const recentPrompts = recentPromptsFromStorage.map(prompt => prompt.prompt);\n setSamplePrompts([...recentPromptsFromStorage, ...prompts.filter(p => !recentPrompts.includes(p.prompt))].slice(0, 5));\n loadingPrompts.current = false;\n },\n [collection.name, collection.singularName, getSamplePrompts, status]);\n\n const deferredValues = useDeferredValue(formContext?.values);\n // const enoughData = countStringCharacters(deferredValues, collection.properties) > 20;\n\n useEffect(() => {\n if (!samplePrompts) {\n setSamplePrompts(getRecentPromptsFromStorage(storageKey));\n updateSuggestedPrompts().then();\n }\n }, [samplePrompts, storageKey, updateSuggestedPrompts, instructions, status]);\n\n useEffect(() => {\n updateSuggestedPrompts().then();\n }, [status]);\n\n const enhance = (prompt?: string) => {\n if (!formContext?.values) return;\n setLoading(true);\n if (prompt) {\n addRecentPrompt(storageKey, prompt);\n setSamplePrompts([{\n prompt,\n type: \"recent\"\n }, ...(samplePrompts ?? []).slice(0, 5)]);\n }\n return dataEnhancementController.enhance({\n entityId,\n values: formContext!.values,\n instructions: prompt,\n replaceValues: true\n }).finally(() => {\n setLoading(false);\n });\n };\n\n if (!dataEnhancementController?.enabled)\n return null;\n\n const hasSuggestions = Object.values(suggestions).filter(Boolean).length > 0;\n\n const disabledSuggestionActions = !hasSuggestions;\n const promptSuggestionsEnabled = (samplePrompts ?? []).length > 0 && instructions.length === 0;\n\n // const noIdSet = !formContext?.entityId;\n\n function submit() {\n enhance(instructions);\n }\n\n return (\n <Menu\n align={\"end\"}\n sideOffset={8}\n className={\"max-w-[100vw]\"}\n trigger={<Button variant={\"filled\"}\n color={\"neutral\"}\n fullWidth={largeLayout && openEntityMode === \"full_screen\"}\n size={\"small\"}\n disabled={loading}>\n {!loading && <AIIcon size={\"small\"}/>}\n {loading && <CircularProgress size={\"small\"}/>}\n Autofill\n </Button>}>\n\n <MenuItem className={\"py-4\"}\n onClick={() => {\n enhance();\n }}>\n <AIIcon size={\"small\"}/>\n Autofill based on the current content\n </MenuItem>\n\n <Separator orientation={\"horizontal\"} className={\"mt-2\"}/>\n\n {samplePrompts?.map((samplePrompt, index) => {\n return <MenuItem\n key={index + \"_\" + samplePrompt.prompt}\n onClick={() => {\n setInstructions(samplePrompt.prompt);\n enhance(samplePrompt.prompt);\n }}\n >\n <div className={\"pl-9 grow text-text-secondary dark:text-text-secondary-dark\"}>\n {samplePrompt.prompt}\n </div>\n\n {samplePrompt.type === \"recent\" && <IconButton\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n removeRecentPrompt(storageKey, samplePrompt.prompt);\n setSamplePrompts((samplePrompts ?? []).filter(p => p.prompt !== samplePrompt.prompt));\n }}\n size={\"smallest\"}\n >\n <XIcon size={iconSize.smallest}/>\n </IconButton>\n }\n </MenuItem>;\n })}\n\n <Separator orientation={\"horizontal\"}/>\n\n <div\n className={cls(\n \"my-2 w-[500px] max-w-full flex items-start text-surface-700 dark:text-surface-200\"\n )}>\n\n <TextareaAutosize\n className={cls(\"p-4 rounded-lg resize-none bg-surface-100 dark:bg-surface-950 mx-2 w-full grow outline-hidden max-h-[300px] overflow-auto\", focusedDisabled)}\n value={instructions}\n autoFocus={status === \"new\"}\n disabled={loading}\n onFocus={(event) => {\n event.stopPropagation();\n }}\n placeholder={\"...or provide instructions\"}\n onKeyDown={(e) => {\n e.stopPropagation();\n if (e.key === \"Enter\" && !e.shiftKey) {\n e.preventDefault();\n submit();\n }\n\n }}\n onChange={(e) => {\n setInstructions(e.target.value);\n }}\n />\n\n <IconButton\n size={\"small\"}\n onClick={() => {\n setInstructions(\"\");\n }}\n color={!instructions ? \"primary\" : undefined}\n disabled={loading || !instructions}>\n <XIcon size={iconSize.small}/>\n </IconButton>\n\n <IconButton\n onClick={() => enhance(instructions)}\n size={\"small\"}\n color={!instructions ? \"primary\" : undefined}\n disabled={loading || !instructions}>\n {loading &&\n <CircularProgress size={\"smallest\"}/>}\n {!loading &&\n <SendIcon color={\"primary\"}/>}\n </IconButton>\n\n </div>\n\n </Menu>\n );\n}\n\nexport interface EnhanceDialogProps {\n open: boolean;\n onClose: () => void;\n selectReferences: () => void;\n loading: boolean;\n enhance: (instructions: string) => void;\n samplePrompts?: string[];\n}\n\nfunction getPromptsForExistingEntities(properties: Properties): SamplePrompt[] {\n\n const multilineProperties = Object.values(properties).filter((p: Property) => {\n if (isPropertyBuilder(p)) {\n return false;\n }\n return p.type === \"string\" && (p.markdown || p.multiline);\n });\n\n const multilinePrompt: Property | undefined = multilineProperties.length > 0\n ? multilineProperties[Math.floor(Math.random() * multilineProperties.length)] as Property\n : undefined;\n\n const prompts = [\n \"Fill the missing fields\",\n \"Translate the missing content\"\n ];\n if (multilinePrompt) {\n prompts.push(`Add 2 paragraphs to '${multilinePrompt.name}'`);\n }\n return prompts.map(p => ({\n prompt: p,\n type: \"sample\"\n }));\n}\n\nconst createLocalStorageKey = (path: string, status: EntityStatus) => {\n const statusString = status === \"new\" ? \"new\" : \"existing\";\n return `data_enhancement::${statusString}::${stripCollectionPath(path)}`;\n};\n\nconst getRecentPromptsFromStorage = (storageKey: string): SamplePrompt[] => {\n const item = localStorage.getItem(storageKey);\n return item ? JSON.parse(item).map((e: string) => ({\n prompt: e,\n type: \"recent\"\n })) : [];\n};\n\nconst addRecentPrompt = (storageKey: string, prompt: string) => {\n if (!prompt || prompt.trim().length === 0) {\n return;\n }\n const recentPrompts = getRecentPromptsFromStorage(storageKey);\n localStorage.setItem(storageKey, JSON.stringify([prompt, ...recentPrompts\n .map(e => e.prompt)\n .filter(e => e !== prompt)\n .slice(0, 5)]));\n};\n\nconst removeRecentPrompt = (storageKey: string, prompt: string) => {\n localStorage.setItem(storageKey, JSON.stringify(getRecentPromptsFromStorage(storageKey)\n .map(e => e.prompt)\n .filter(e => e !== prompt)));\n};\n","import React from \"react\";\n\nimport { EntityCollection, RebasePlugin, User } from \"@rebasepro/types\";\nimport { DataEnhancementControllerProvider } from \"./components/DataEnhancementControllerProvider\";\nimport { FormEnhanceAction } from \"./components/FormEnhanceAction\";\n\nconst DEFAULT_API_KEY = \"fcms-U9jdDii0xXWSDC34asfrf54lbkFJBfKfRWcEDEwdc4V5wDWEDF\";\n\nexport interface DataEnhancementPluginProps {\n\n apiKey?: string;\n\n /**\n * Use this function to determine if the data enhancement plugin should be enabled for a given path.\n * If this function is not provided, the plugin will be enabled for all paths.\n * If the function returns false, the plugin will be disabled for the given path.\n * You can also return a configuration object to override the default configuration.\n *\n * @param path\n * @param collection\n */\n getConfigForPath?: (props: {\n path: string,\n collection: EntityCollection,\n user: User | null\n }) => boolean;\n\n /**\n * Host to use for the data enhancement API.\n * This prop is only use in development mode.\n */\n host?: string;\n}\n\n/**\n * Use this hook to initialise the data enhancement plugin.\n * This is likely the only hook you will need to use.\n * @param props\n */\nexport function useDataEnhancementPlugin(props?: DataEnhancementPluginProps): RebasePlugin {\n\n const apiKey = props?.apiKey ?? DEFAULT_API_KEY;\n const getConfigForPath = props?.getConfigForPath;\n\n return React.useMemo(() => ({\n key: \"data_enhancement\",\n slots: [\n {\n slot: \"form.actions\",\n Component: FormEnhanceAction,\n order: 40\n }\n ],\n providers: [\n {\n scope: \"form\" as const,\n Component: DataEnhancementControllerProvider as React.ComponentType<any>,\n props: {\n apiKey,\n getConfigForPath,\n host: props?.host\n }\n }\n ]\n }), [apiKey, getConfigForPath, props?.host]);\n}\n"],"names":["flatMapEntityValues","values","path","Object","entries","flatMap","key","value","currentPath","reduce","acc","curr","DEFAULT_SERVER","enhanceDataAPIStream","props","flatValues","properties","inputEntity","entityId","request","entityName","entityDescription","propertyKey","propertyInstructions","instructions","console","debug","fetch","host","method","headers","Authorization","firebaseToken","apiKey","body","JSON","stringify","then","res","ok","error","json","reader","getReader","Error","chunk","readChunks","str","TextDecoder","decode","split","forEach","s","length","data","parse","trim","type","onUpdateDelta","partialValue","onUpdate","onEnd","e","onError","Symbol","asyncIterator","readResult","read","done","fetchEntityPromptSuggestion","input","message","prompts","map","prompt","autocompleteStream","result","textBefore","textAfter","getAppendableSuggestion","suggestion","suggestionIncludesValue","toLowerCase","startsWith","substring","indexOf","undefined","getSimplifiedProperties","property","isPropertyBuilder","fullKey","valueInPath","getValueInPath","getSimplifiedProperty","a","b","getSimpleProperty","fieldId","getFieldId","name","description","fieldConfigId","enum","getSimpleEnumValues","disabled","Boolean","readOnly","of","Array","isArray","arrayParentProperty","oneOf","typeField","valueField","prop","v","i","typeKey","oneOfType","valueKey","oneOfValue","childProperty","simplifiedProperty","mapProperties","childValue","o","attachPathToKeys","keys","mapParentProperty","warn","obj","enumValues","String","id","useEditorAIController","getAuthToken","autocomplete","DataEnhancementControllerContext","React","createContext","useDataEnhancementController","useContext","getPropertyFromKey","parentKey","slice","join","DataEnhancementControllerProvider","getConfigForPath","children","collection","formContext","enabled","setEnabled","useState","suggestions","setSuggestions","loadingSuggestions","setLoadingSuggestions","enhancingInProgress","useRef","authController","useAuthController","snackbarController","useSnackbarController","useMemo","valuesRef","useEffect","current","allowReferenceDataSelection","updateConfig","useCallback","config","urlController","useUrlController","clearSuggestion","prev","_","rest","appendValueDelta","delta","currentValue","updatedValue","setFieldValue","updateSuggestedValues","currentValues","updatedValues","replaceValues","filter","p","includes","appendableValue","multiline","trimmedValue","trimEnd","endsWith","trimStart","displayNeededSubscriptionSnackbar","projectId","open","autoHideDuration","editorAIController","clearAllSuggestions","enhance","user","Promise","reject","resolvedPath","resolveDatabasePathsFrom","resolve","code","singularName","errors","catch","getSamplePrompts","dataEnhancementController","FormEnhanceAction","status","openEntityMode","largeLayout","useLargeLayout","storageKey","createLocalStorageKey","loading","setLoading","samplePrompts","setSamplePrompts","setInstructions","loadingPrompts","updateSuggestedPrompts","getPromptsForExistingEntities","recentPromptsFromStorage","getRecentPromptsFromStorage","recentPrompts","useDeferredValue","addRecentPrompt","finally","submit","jsxs","Menu","Button","jsx","AIIcon","CircularProgress","MenuItem","Separator","samplePrompt","index","IconButton","preventDefault","stopPropagation","removeRecentPrompt","XIcon","iconSize","smallest","cls","TextareaAutosize","focusedDisabled","event","shiftKey","target","small","SendIcon","multilineProperties","markdown","multilinePrompt","Math","floor","random","push","statusString","stripCollectionPath","item","localStorage","getItem","setItem","DEFAULT_API_KEY","useDataEnhancementPlugin","$","_c","t0","t1","for","slot","Component","order","t2","t3","slots","providers","scope"],"mappings":"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"}
1
+ {"version":3,"file":"index.umd.js","sources":["../src/utils/values.ts","../src/api.ts","../src/utils/suggestions.ts","../src/utils/properties.ts","../src/editor/useEditorAIController.tsx","../src/components/DataEnhancementControllerProvider.tsx","../src/components/FormEnhanceAction.tsx","../src/useDataEnhancementPlugin.tsx"],"sourcesContent":["export function flatMapEntityValues<M extends object>(values: M, path = \"\"): object {\n if (!values) return {};\n return Object.entries(values).flatMap(([key, value]) => {\n const currentPath = path ? `${path}.${key}` : key;\n if (typeof value === \"object\") {\n return flatMapEntityValues(value, currentPath);\n } else {\n return { [currentPath]: value };\n }\n }).reduce((acc, curr) => ({ ...acc,\n...curr }), {})\n}\n","import {\n DataEnhancementRequest,\n EnhancedDataResult,\n InputEntity,\n InputProperty,\n SamplePromptsResult\n} from \"./types/data_enhancement_controller\";\nimport { EntityValues } from \"@rebasepro/types\";\nimport { flatMapEntityValues } from \"./utils/values\";\n\n// const DEFAULT_SERVER = \"http://localhost:5001/rebase-dev-2da42/europe-west3/api\"; // Local\n\nconst DEFAULT_SERVER = \"https://api.rebase.pro\";\n\nexport async function enhanceDataAPIStream<M extends Record<string, unknown>>(props: {\n apiKey: string,\n entityId?: string | number,\n entityName: string,\n entityDescription?: string,\n propertyKey?: string,\n propertyInstructions?: string;\n values: EntityValues<M>,\n path: string,\n properties: Record<string, InputProperty>,\n\n instructions?: string,\n firebaseToken: string,\n onUpdate: (suggestions: Record<string, any>) => void;\n onUpdateDelta: (propertyKey: string, partialValue: any) => void;\n onError: (error: Error) => void;\n onEnd: (result: EnhancedDataResult) => void;\n host?: string;\n}) {\n\n const flatValues = flatMapEntityValues(props.values);\n\n const properties = props.properties;\n\n const inputEntity: InputEntity = {\n entityId: props.entityId,\n values: flatValues\n }\n\n const request: DataEnhancementRequest = {\n inputEntity,\n properties,\n entityName: props.entityName,\n entityDescription: props.entityDescription,\n propertyKey: props.propertyKey,\n propertyInstructions: props.propertyInstructions,\n instructions: props.instructions\n };\n\n console.debug(\"enhanceDataAPIStream\", request);\n\n return fetch((props.host ?? DEFAULT_SERVER) + \"/data/enhance_stream/\",\n {\n // mode: \"no-cors\",\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Basic ${props.firebaseToken}`,\n \"x-de-api-key\": `Basic ${props.apiKey}`\n // \"x-de-version\": version\n },\n body: JSON.stringify(request)\n })\n .then(async (res) => {\n if (!res.ok) {\n console.error(\"enhanceDataAPIStream error\", res)\n throw await res.json();\n }\n const reader = res.body?.getReader();\n if (!reader) {\n throw new Error(\"No reader\");\n }\n\n for await (const chunk of readChunks(reader)) {\n const str = new TextDecoder().decode(chunk);\n try {\n str.split(\"&$# \").forEach((s) => {\n if (s && s.length > 0) {\n const data = JSON.parse(s.trim());\n if (data.type === \"suggestion_delta\")\n props.onUpdateDelta(data.data.propertyKey, data.data.partialValue);\n else if (data.type === \"suggestion\")\n props.onUpdate(data.data);\n else if (data.type === \"result\")\n props.onEnd(data.data);\n }\n });\n } catch (e: any) {\n console.error(\"str\", str);\n console.error(\"Error parsing stream\", e);\n props.onError(e);\n }\n }\n\n });\n\n}\n\nfunction readChunks(reader: ReadableStreamDefaultReader) {\n return {\n async *[Symbol.asyncIterator]() {\n let readResult = await reader.read();\n while (!readResult.done) {\n yield readResult.value;\n readResult = await reader.read();\n }\n }\n };\n}\n\nexport async function fetchEntityPromptSuggestion<M extends object>(props: {\n input?: string,\n entityName: string,\n firebaseToken: string,\n apiKey: string,\n host?: string\n}): Promise<SamplePromptsResult> {\n\n return fetch((props.host ?? DEFAULT_SERVER) + \"/data/prompt_autocomplete/\",\n {\n // mode: \"no-cors\",\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Basic ${props.firebaseToken}`,\n \"x-de-api-key\": `Basic ${props.apiKey}`\n },\n body: JSON.stringify({\n entityName: props.entityName,\n input: props.input ?? null\n })\n })\n .then(async (res) => {\n const data = await res.json();\n if (!res.ok) {\n console.error(\"fetchEntityPromptSuggestion\", data);\n throw Error(data.message);\n }\n return {\n prompts: data.data.prompts.map((e: string) => ({\n prompt: e,\n type: \"sample\"\n }))\n };\n });\n\n}\n\nexport async function autocompleteStream(props: {\n firebaseToken: string,\n textBefore?: string,\n textAfter: string,\n host?: string;\n onUpdate: (delta: string) => void;\n}) {\n\n let result = \"\";\n return fetch((props.host ?? DEFAULT_SERVER) + \"/data/autocomplete/\",\n {\n // mode: \"no-cors\",\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Basic ${props.firebaseToken}`\n // \"x-de-version\": version\n },\n body: JSON.stringify({\n textBefore: props.textBefore,\n textAfter: props.textAfter\n })\n })\n .then(async (res) => {\n if (!res.ok) {\n console.error(\"enhanceDataAPIStream error\", res)\n throw await res.json();\n }\n const reader = res.body?.getReader();\n if (!reader) {\n throw new Error(\"No reader\");\n }\n\n for await (const chunk of readChunks(reader)) {\n const str = new TextDecoder().decode(chunk);\n result += str;\n console.debug(\"Autocomplete update:\", str);\n props.onUpdate(str);\n }\n\n }).then(() => {\n console.debug(\"Autocomplete result:\", result);\n return result;\n });\n\n}\n","export function getAppendableSuggestion(suggestion: string | number | undefined, value: any): string | undefined {\n const suggestionIncludesValue = typeof suggestion === \"string\" && typeof value === \"string\" && suggestion.toLowerCase().trim().startsWith(value.toLowerCase().trim());\n return (typeof value === \"string\" && suggestionIncludesValue)\n ? suggestion.substring(suggestion.toLowerCase().trim().indexOf(value.toLowerCase().trim()) + value.trim().length)\n : undefined;\n}\n","import { getFieldId } from \"@rebasepro/admin\";\nimport { EnumValues, Properties, Property } from \"@rebasepro/types\";\nimport { isPropertyBuilder } from \"@rebasepro/common\";\nimport { InputProperty } from \"../types/data_enhancement_controller\";\nimport { getValueInPath } from \"@rebasepro/utils\";\n\nexport function getSimplifiedProperties<M extends Record<string, any>>(properties: Properties, values: M, path = \"\"): Record<string, InputProperty> {\n if (!properties) return {};\n return Object.entries(properties)\n .map(([key, property]) => {\n if (isPropertyBuilder(property)) return {};\n const fullKey = path ? `${path}.${key}` : key;\n const valueInPath = getValueInPath(values, fullKey);\n return getSimplifiedProperty(property, fullKey, valueInPath)\n })\n .reduce((a, b) => ({ ...a,\n...b }), {});\n}\n\nfunction getSimpleProperty(property: Property): InputProperty {\n const fieldId = getFieldId(property);\n if (!fieldId) {\n console.error(\"No fieldId found for property\", property);\n throw new Error(\"Field id not found\");\n }\n return {\n name: property.name,\n description: property.description,\n type: property.type,\n fieldConfigId: fieldId,\n enum: \"enum\" in property && property.enum\n ? getSimpleEnumValues(property.enum)\n : undefined,\n disabled: Boolean(property.ui?.disabled || property.ui?.readOnly)\n };\n}\n\nfunction getSimplifiedProperty(property: Property, path: string, value?: any): Record<string, InputProperty> {\n if (isPropertyBuilder(property)) return {};\n if (property.type === \"array\") {\n\n if (property.of && !Array.isArray(property.of) && !isPropertyBuilder(property.of)) {\n const arrayParentProperty: InputProperty = {\n name: property.name,\n description: property.description,\n type: property.type,\n fieldConfigId: \"repeat\",\n disabled: Boolean(property.ui?.disabled || property.ui?.readOnly),\n of: getSimpleProperty(property.of as Property)\n };\n\n const result = { [path]: arrayParentProperty };\n // if (Array.isArray(value)) {\n // result = {\n // ...result,\n // ...value\n // .map((v, i) => getSimplifiedProperty(property.of, `${path}.${i}`, v))\n // .reduce((a, b) => ({ ...a, ...b }), {})\n // };\n // }\n //\n // const existingValuesCount = Array.isArray(value) ? value.length : 0;\n //\n // const newValuesCount = property.of && !isPropertyBuilder<any, any>(property.of) && (property.of as Property).type === \"map\" ? 1 : 3;\n // result = {\n // ...result,\n // // ...Array.from(Array(newValuesCount))\n // // .map((v, i) => getSimplifiedProperty(property.of, `${path}.${i + existingValuesCount}`, v))\n // // .reduce((a, b) => ({ ...a, ...b }), {})\n // }\n\n return result;\n } else if (property.oneOf) {\n\n const arrayParentProperty: InputProperty = {\n name: property.name,\n description: property.description,\n type: property.type,\n fieldConfigId: \"block\",\n disabled: Boolean(property.ui?.disabled || property.ui?.readOnly),\n oneOf: {\n typeField: property.oneOf.typeField,\n valueField: property.oneOf.valueField,\n properties: Object.entries(property.oneOf.properties)\n .map(([key, prop]) => ({ [key]: getSimpleProperty(prop) }))\n .reduce((a, b) => ({ ...a,\n...b }), {})\n }\n };\n\n if (!Array.isArray(value)) {\n return { [path]: arrayParentProperty };\n }\n\n return value.map((v, i) => {\n if (v == null) return {};\n const typeKey = property.oneOf!.typeField ?? \"type\";\n const oneOfType = v[typeKey];\n const valueKey = property.oneOf!.valueField ?? \"value\";\n const oneOfValue = v[valueKey];\n const childProperty = property.oneOf!.properties[oneOfType];\n if (childProperty === undefined) {\n console.error(`No property found for type ${oneOfType}`, property.oneOf!.properties);\n return {};\n }\n const simplifiedProperty = getSimplifiedProperty(childProperty, `${path}.${i}.${valueKey}`, oneOfValue);\n return {\n [`${path}.${i}.${typeKey}`]: oneOfType,\n ...simplifiedProperty\n };\n }).reduce((a, b) => ({ ...a,\n...b }), { [path]: arrayParentProperty });\n }\n } else if (property.type === \"map\") {\n if (property.properties) {\n const mapProperties: Record<string, InputProperty> = Object.entries(property.properties)\n .map(([key, childProperty]) => {\n const childValue = value?.[key];\n return getSimplifiedProperty(childProperty, key, childValue);\n })\n .map(o => attachPathToKeys(o, path))\n .reduce((a, b) => ({ ...a,\n...b }), {});\n\n if (Object.keys(mapProperties).length === 0) return {};\n const mapParentProperty: InputProperty = {\n name: property.name,\n description: property.description,\n type: property.type,\n fieldConfigId: \"group\",\n disabled: Boolean(property.ui?.disabled || property.ui?.readOnly)\n };\n return {\n [path]: mapParentProperty,\n ...mapProperties\n } as Record<string, InputProperty>;\n }\n } else {\n const fieldId = getFieldId(property);\n if (!fieldId) {\n console.warn(`No fieldId found for property ${path} with type ${property.type}`);\n return {};\n }\n return {\n [path]: getSimpleProperty(property)\n };\n }\n return {};\n}\n\n// attach a path to every key in an object\nfunction attachPathToKeys(obj: Record<string, any>, path = \"\"): Record<string, any> {\n return Object.entries(obj)\n .map(([key, value]) => {\n const fullKey = path ? `${path}.${key}` : key;\n return { [fullKey]: value };\n })\n .reduce((a, b) => ({ ...a,\n...b }), {});\n}\n\nfunction getSimpleEnumValues(enumValues: EnumValues): string[] {\n if (Array.isArray(enumValues))\n return enumValues.map(v => String(v.id));\n if (typeof enumValues === \"object\")\n return Object.keys(enumValues);\n throw Error(\"getSimpleEnumValues: Invalid enumValues\");\n}\n","import { autocompleteStream } from \"../api\";\nimport { EditorAIController } from \"@rebasepro/admin\";\n\nexport function useEditorAIController({ getAuthToken }: { getAuthToken?: () => Promise<string> }): EditorAIController {\n const autocomplete = async (textBefore: string, textAfter: string, onUpdate: (delta: string) => void) => {\n if (!getAuthToken) {\n throw new Error(\"Firebase token is required\");\n }\n const firebaseToken = await getAuthToken();\n return autocompleteStream({\n firebaseToken,\n textBefore,\n textAfter,\n onUpdate\n });\n }\n\n return {\n autocomplete\n };\n}\n\n// async function * generateLoremIpsum(): AsyncGenerator<string> {\n// const loremIpsum = \"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.\\n# Heading\\n\\nLorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.\";\n//\n// const words = loremIpsum.split(\" \");\n//\n// for (const word of words) {\n// yield word;\n// await new Promise(resolve => setTimeout(resolve, 100));\n// }\n// }\n//\n// const generator = generateLoremIpsum();\n// for await (const word of generator) {\n//\n// }\n","import React, { PropsWithChildren, useCallback, useContext, useEffect, useMemo, useRef, useState } from \"react\";\n\nimport {\n DataEnhancementController,\n EnhancedDataResult,\n EnhanceParams,\n InputProperty\n} from \"../types/data_enhancement_controller\";\nimport {\n useAuthController,\n useCustomizationController,\n useSnackbarController\n} from \"@rebasepro/core\";\nimport { useUrlController } from \"@rebasepro/admin\";\nimport { DataDriver, Entity, EntityCollection, PluginFormActionProps } from \"@rebasepro/types\";\nimport { enhanceDataAPIStream, fetchEntityPromptSuggestion } from \"../api\";\nimport { getAppendableSuggestion } from \"../utils/suggestions\";\nimport { getSimplifiedProperties } from \"../utils/properties\";\nimport { useEditorAIController } from \"../editor/useEditorAIController\";\nimport { getValueInPath } from \"@rebasepro/utils\";\n\nexport const DataEnhancementControllerContext = React.createContext<DataEnhancementController>(null! as DataEnhancementController);\n\nexport type DataEnhancementControllerProviderProps = {\n\n apiKey: string;\n\n getConfigForPath?: (props: {\n path: string,\n collection: EntityCollection\n }) => boolean;\n\n host?: string;\n}\n\nexport const useDataEnhancementController = (): DataEnhancementController => useContext(DataEnhancementControllerContext);\n\nfunction getPropertyFromKey(properties: Record<string, InputProperty>, propertyKey: string) {\n if (propertyKey in properties) {\n return properties[propertyKey];\n } else {\n //split the property key\n const split = propertyKey.split(\".\");\n if (split.length === 1) {\n return undefined;\n }\n const parentKey = split.slice(0, split.length - 1).join(\".\");\n return getPropertyFromKey(properties, parentKey);\n\n }\n}\n\nexport function DataEnhancementControllerProvider({\n apiKey,\n getConfigForPath,\n children,\n host,\n path,\n collection,\n formContext\n}: PropsWithChildren<DataEnhancementControllerProviderProps & PluginFormActionProps<any>>) {\n\n const [enabled, setEnabled] = useState(false);\n const [suggestions, setSuggestions] = useState<Record<string, string | number>>({});\n const [loadingSuggestions, setLoadingSuggestions] = useState<string[]>([]);\n\n const enhancingInProgress = useRef(false);\n\n const authController = useAuthController();\n const snackbarController = useSnackbarController();\n\n\n const properties = useMemo(() => getSimplifiedProperties(collection.properties, formContext?.values ?? {}), [formContext?.values]);\n // const preEnhanceValuesRef = React.useRef(formContext?.values ?? {});\n const valuesRef = React.useRef(formContext?.values ?? {});\n useEffect(() => {\n if (!enhancingInProgress.current)\n valuesRef.current = formContext?.values ?? {};\n }, [formContext?.values]);\n\n const allowReferenceDataSelection = false;\n\n const updateConfig = useCallback(async () => {\n if (!getConfigForPath) return;\n const config = getConfigForPath({\n path,\n collection\n });\n if (config) {\n setEnabled(true);\n }\n }, [collection, getConfigForPath, path]);\n\n useEffect(() => {\n if (!getConfigForPath) {\n setEnabled(true);\n } else {\n updateConfig();\n }\n\n }, [getConfigForPath, updateConfig]);\n\n\n const urlController = useUrlController();\n\n const clearSuggestion = useCallback((propertyKey: string) => {\n setSuggestions((prev) => {\n //remove propertyKey from prev\n const {\n [propertyKey]: _,\n ...rest\n } = prev;\n return rest;\n });\n }, []);\n\n const appendValueDelta = useCallback((propertyKey: string, delta: string) => {\n\n const property = getPropertyFromKey(properties, propertyKey);\n if (delta === null || property?.disabled) {\n return;\n }\n\n // clearSuggestion(propertyKey);\n const value = getValueInPath(valuesRef.current, propertyKey);\n\n const currentValue = value ? (value as string) + \"\" : \"\";\n const updatedValue = currentValue + delta;\n // if (currentValue.length === 0) updatedValue = updatedValue.trimStart();\n valuesRef.current = {\n ...valuesRef.current,\n [propertyKey]: updatedValue\n };\n formContext?.setFieldValue(propertyKey, updatedValue, false);\n setSuggestions(prev => ({\n ...prev,\n [propertyKey]: (prev[propertyKey] ?? \"\") + delta\n }));\n }, [properties, formContext]);\n\n const updateSuggestedValues = useCallback((currentValues: object, updatedValues: Record<string, string | number>, replaceValues: boolean) => {\n\n setLoadingSuggestions((prev) => {\n return prev.filter(p => !Object.keys(updatedValues).includes(p));\n });\n\n Object.entries(updatedValues).forEach(([propertyKey, suggestion]) => {\n\n const value = getValueInPath(currentValues, propertyKey);\n const property = getPropertyFromKey(properties, propertyKey);\n\n if (!property || suggestion === null || property?.disabled) {\n return;\n }\n\n if (typeof suggestion === \"number\") {\n formContext?.setFieldValue(propertyKey, suggestion);\n return;\n }\n\n if (replaceValues) {\n formContext?.setFieldValue(propertyKey, suggestion);\n return;\n }\n\n const appendableValue = getAppendableSuggestion(suggestion, value);\n\n const currentValue = value ? (value as string) + \"\" : \"\";\n if (appendableValue) {\n formContext?.setFieldValue(propertyKey, suggestion);\n } else {\n const multiline = property?.fieldConfigId === \"multiline\" || property?.fieldConfigId === \"markdown\";\n const trimmedValue = currentValue.trimEnd();\n if (multiline && (trimmedValue.endsWith(\".\") || trimmedValue.endsWith(\"?\") || trimmedValue.endsWith(\"!\") || trimmedValue.endsWith(\":\"))) {\n formContext?.setFieldValue(propertyKey, trimmedValue + \"\\n\\n\" + (suggestion as string).trimStart());\n } else {\n formContext?.setFieldValue(propertyKey, trimmedValue + (trimmedValue.length > 0 ? \" \" : \"\") + (suggestion as string));\n }\n }\n });\n\n setSuggestions(prev => ({\n ...prev,\n ...Object.keys(updatedValues)\n .reduce((acc, key) => {\n const value = getValueInPath(formContext?.values, key);\n const suggestion = updatedValues[key];\n return {\n ...acc,\n [key]: getAppendableSuggestion(suggestion, value) ?? suggestion\n };\n }, {})\n }));\n }, [properties, formContext]);\n\n const displayNeededSubscriptionSnackbar = useCallback((projectId: any) => {\n snackbarController.open({\n type: \"warning\",\n message: \"A valid subscription is needed in order to use this function.\",\n autoHideDuration: 4000\n });\n }, [snackbarController]);\n\n const editorAIController = useEditorAIController({ getAuthToken: authController.getAuthToken });\n\n const clearAllSuggestions = useCallback(() => {\n setSuggestions({});\n }, []);\n\n const enhance = useCallback(async (props: EnhanceParams<any>): Promise<EnhancedDataResult | null> => {\n\n if (!authController.user) {\n snackbarController.open({\n type: \"warning\",\n message: \"You need to be logged in to enhance data\"\n });\n return Promise.reject(new Error(\"Not logged in\"));\n }\n\n const resolvedPath = urlController.resolveDatabasePathsFrom(path);\n const firebaseToken = await authController.getAuthToken();\n\n if (props.propertyKey) {\n clearSuggestion(props.propertyKey)\n } else {\n clearAllSuggestions();\n }\n\n setLoadingSuggestions((prev) => [...prev, ...(props.propertyKey ? [props.propertyKey] : Object.keys(properties))]);\n enhancingInProgress.current = true;\n\n const currentValues = valuesRef.current ?? {};\n\n return new Promise((resolve, reject) => {\n function onError(e: any) {\n setLoadingSuggestions([]);\n if (e.code === \"payment-required\") {\n const projectId = e.data.projectId;\n displayNeededSubscriptionSnackbar(projectId);\n } else {\n console.error(\"Enhance error\", e);\n }\n reject(e);\n enhancingInProgress.current = false;\n }\n\n try {\n enhanceDataAPIStream({\n ...props,\n host,\n apiKey,\n properties,\n path: resolvedPath,\n entityName: collection.singularName ?? collection.name,\n entityDescription: collection.description,\n\n firebaseToken,\n onUpdate: (suggestions) => {\n console.debug(\"de onUpdate\", suggestions);\n updateSuggestedValues(currentValues, suggestions, props.replaceValues ?? false);\n },\n onUpdateDelta: (propertyKey: string, partialValue: string) => {\n // console.debug(\"de delta\", propertyKey, partialValue);\n appendValueDelta(propertyKey, partialValue);\n },\n onError,\n onEnd: (result) => {\n console.debug(\"de onEnd\", result);\n if (result.errors) {\n result.errors.forEach((error) => {\n snackbarController.open({\n type: \"warning\",\n message: error\n })\n });\n }\n if (Object.keys(result.suggestions).length === 0) {\n snackbarController.open({\n type: \"info\",\n autoHideDuration: 1800,\n message: \"No fields were updated\"\n })\n }\n setLoadingSuggestions([]);\n resolve(result);\n enhancingInProgress.current = false;\n }\n }).catch(onError);\n } catch (e: any) {\n onError(e);\n }\n });\n }, [\n authController, urlController, path, clearSuggestion, clearAllSuggestions,\n properties, host, apiKey, collection, updateSuggestedValues, appendValueDelta, displayNeededSubscriptionSnackbar, snackbarController\n ]);\n\n const getSamplePrompts = useCallback(async (entityName: string, input?: string) => {\n const firebaseToken = await authController.getAuthToken()\n return fetchEntityPromptSuggestion({\n host,\n entityName,\n firebaseToken,\n apiKey,\n input\n });\n }, [apiKey, authController.getAuthToken, host]);\n\n const dataEnhancementController: DataEnhancementController = useMemo(() => ({\n enabled,\n suggestions,\n clearSuggestion,\n enhance,\n allowReferenceDataSelection,\n clearAllSuggestions,\n getSamplePrompts,\n loadingSuggestions,\n editorAIController\n }), [\n enabled,\n suggestions,\n clearSuggestion,\n enhance,\n allowReferenceDataSelection,\n clearAllSuggestions,\n getSamplePrompts,\n loadingSuggestions,\n editorAIController\n ]);\n\n return (\n <DataEnhancementControllerContext.Provider\n value={dataEnhancementController}>\n {children}\n </DataEnhancementControllerContext.Provider>\n );\n}\n\n\n","\nimport React, { useCallback, useDeferredValue, useEffect, useRef } from \"react\";\n\nimport { Button, CircularProgress, cls, focusedDisabled, IconButton, Menu, MenuItem, Separator, TextareaAutosize , iconSize } from \"@rebasepro/ui\";\nimport { XIcon, SendIcon } from \"lucide-react\";\nimport {\n AIIcon,\n useLargeLayout\n} from \"@rebasepro/core\";\nimport { EntityStatus, PluginFormActionProps, Properties, Property } from \"@rebasepro/types\";\nimport { isPropertyBuilder, stripCollectionPath } from \"@rebasepro/common\";\nimport { useDataEnhancementController } from \"./DataEnhancementControllerProvider\";\nimport { SamplePrompt } from \"../types/data_enhancement_controller\";\n\nexport function FormEnhanceAction({\n entityId,\n path,\n status,\n collection,\n formContext,\n openEntityMode\n}: PluginFormActionProps) {\n\n const largeLayout = useLargeLayout();\n\n const storageKey = createLocalStorageKey(path, status);\n\n const [loading, setLoading] = React.useState(false);\n const dataEnhancementController = useDataEnhancementController();\n\n const [samplePrompts, setSamplePrompts] = React.useState<SamplePrompt[] | undefined>(undefined);\n const [instructions, setInstructions] = React.useState<string>(\"\");\n\n const getSamplePrompts = dataEnhancementController?.getSamplePrompts;\n\n const loadingPrompts = useRef(false);\n const updateSuggestedPrompts = useCallback(async function updateSuggestedPrompts(instructions?: string) {\n if (!getSamplePrompts) return;\n if (loadingPrompts.current) return;\n loadingPrompts.current = true;\n const prompts = status === \"new\"\n ? (await getSamplePrompts(collection.singularName ?? collection.name, instructions)).prompts\n : getPromptsForExistingEntities(collection.properties);\n\n const recentPromptsFromStorage = getRecentPromptsFromStorage(storageKey);\n const recentPrompts = recentPromptsFromStorage.map(prompt => prompt.prompt);\n setSamplePrompts([...recentPromptsFromStorage, ...prompts.filter(p => !recentPrompts.includes(p.prompt))].slice(0, 5));\n loadingPrompts.current = false;\n },\n [collection.name, collection.singularName, getSamplePrompts, status]);\n\n const deferredValues = useDeferredValue(formContext?.values);\n // const enoughData = countStringCharacters(deferredValues, collection.properties) > 20;\n\n useEffect(() => {\n if (!dataEnhancementController) return;\n if (!samplePrompts) {\n setSamplePrompts(getRecentPromptsFromStorage(storageKey));\n updateSuggestedPrompts().then();\n }\n }, [dataEnhancementController, samplePrompts, storageKey, updateSuggestedPrompts, instructions, status]);\n\n useEffect(() => {\n if (!dataEnhancementController) return;\n updateSuggestedPrompts().then();\n }, [dataEnhancementController, status]);\n\n const enhance = (prompt?: string) => {\n if (!dataEnhancementController || !formContext?.values) return;\n setLoading(true);\n if (prompt) {\n addRecentPrompt(storageKey, prompt);\n setSamplePrompts([{\n prompt,\n type: \"recent\"\n }, ...(samplePrompts ?? []).slice(0, 5)]);\n }\n return dataEnhancementController.enhance({\n entityId,\n values: formContext!.values,\n instructions: prompt,\n replaceValues: true\n }).finally(() => {\n setLoading(false);\n });\n };\n\n if (!dataEnhancementController?.enabled)\n return null;\n\n const suggestions = dataEnhancementController.suggestions;\n const hasSuggestions = Object.values(suggestions).filter(Boolean).length > 0;\n\n const disabledSuggestionActions = !hasSuggestions;\n const promptSuggestionsEnabled = (samplePrompts ?? []).length > 0 && instructions.length === 0;\n\n // const noIdSet = !formContext?.entityId;\n\n function submit() {\n enhance(instructions);\n }\n\n return (\n <Menu\n align={\"end\"}\n sideOffset={8}\n className={\"max-w-[100vw]\"}\n trigger={<Button variant={\"filled\"}\n color={\"neutral\"}\n fullWidth={largeLayout && openEntityMode === \"full_screen\"}\n size={\"small\"}\n disabled={loading}>\n {!loading && <AIIcon size={\"small\"}/>}\n {loading && <CircularProgress size={\"small\"}/>}\n Autofill\n </Button>}>\n\n <MenuItem className={\"py-4\"}\n onClick={() => {\n enhance();\n }}>\n <AIIcon size={\"small\"}/>\n Autofill based on the current content\n </MenuItem>\n\n <Separator orientation={\"horizontal\"} className={\"mt-2\"}/>\n\n {samplePrompts?.map((samplePrompt, index) => {\n return <MenuItem\n key={index + \"_\" + samplePrompt.prompt}\n onClick={() => {\n setInstructions(samplePrompt.prompt);\n enhance(samplePrompt.prompt);\n }}\n >\n <div className={\"pl-9 grow text-text-secondary dark:text-text-secondary-dark\"}>\n {samplePrompt.prompt}\n </div>\n\n {samplePrompt.type === \"recent\" && <IconButton\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n removeRecentPrompt(storageKey, samplePrompt.prompt);\n setSamplePrompts((samplePrompts ?? []).filter(p => p.prompt !== samplePrompt.prompt));\n }}\n size={\"smallest\"}\n >\n <XIcon size={iconSize.smallest}/>\n </IconButton>\n }\n </MenuItem>;\n })}\n\n <Separator orientation={\"horizontal\"}/>\n\n <div\n className={cls(\n \"my-2 w-[500px] max-w-full flex items-start text-surface-700 dark:text-surface-200\"\n )}>\n\n <TextareaAutosize\n className={cls(\"p-4 rounded-lg resize-none bg-surface-100 dark:bg-surface-950 mx-2 w-full grow outline-hidden max-h-[300px] overflow-auto\", focusedDisabled)}\n value={instructions}\n autoFocus={status === \"new\"}\n disabled={loading}\n onFocus={(event) => {\n event.stopPropagation();\n }}\n placeholder={\"...or provide instructions\"}\n onKeyDown={(e) => {\n e.stopPropagation();\n if (e.key === \"Enter\" && !e.shiftKey) {\n e.preventDefault();\n submit();\n }\n\n }}\n onChange={(e) => {\n setInstructions(e.target.value);\n }}\n />\n\n <IconButton\n size={\"small\"}\n onClick={() => {\n setInstructions(\"\");\n }}\n color={!instructions ? \"primary\" : undefined}\n disabled={loading || !instructions}>\n <XIcon size={iconSize.small}/>\n </IconButton>\n\n <IconButton\n onClick={() => enhance(instructions)}\n size={\"small\"}\n color={!instructions ? \"primary\" : undefined}\n disabled={loading || !instructions}>\n {loading &&\n <CircularProgress size={\"smallest\"}/>}\n {!loading &&\n <SendIcon color={\"primary\"}/>}\n </IconButton>\n\n </div>\n\n </Menu>\n );\n}\n\nexport interface EnhanceDialogProps {\n open: boolean;\n onClose: () => void;\n selectReferences: () => void;\n loading: boolean;\n enhance: (instructions: string) => void;\n samplePrompts?: string[];\n}\n\nfunction getPromptsForExistingEntities(properties: Properties): SamplePrompt[] {\n\n const multilineProperties = Object.values(properties).filter((p: Property) => {\n if (isPropertyBuilder(p)) {\n return false;\n }\n return p.type === \"string\" && (p.ui?.markdown || p.ui?.multiline);\n });\n\n const multilinePrompt: Property | undefined = multilineProperties.length > 0\n ? multilineProperties[Math.floor(Math.random() * multilineProperties.length)] as Property\n : undefined;\n\n const prompts = [\n \"Fill the missing fields\",\n \"Translate the missing content\"\n ];\n if (multilinePrompt) {\n prompts.push(`Add 2 paragraphs to '${multilinePrompt.name}'`);\n }\n return prompts.map(p => ({\n prompt: p,\n type: \"sample\"\n }));\n}\n\nconst createLocalStorageKey = (path: string, status: EntityStatus) => {\n const statusString = status === \"new\" ? \"new\" : \"existing\";\n return `data_enhancement::${statusString}::${stripCollectionPath(path)}`;\n};\n\nconst getRecentPromptsFromStorage = (storageKey: string): SamplePrompt[] => {\n const item = localStorage.getItem(storageKey);\n return item ? JSON.parse(item).map((e: string) => ({\n prompt: e,\n type: \"recent\"\n })) : [];\n};\n\nconst addRecentPrompt = (storageKey: string, prompt: string) => {\n if (!prompt || prompt.trim().length === 0) {\n return;\n }\n const recentPrompts = getRecentPromptsFromStorage(storageKey);\n localStorage.setItem(storageKey, JSON.stringify([prompt, ...recentPrompts\n .map(e => e.prompt)\n .filter(e => e !== prompt)\n .slice(0, 5)]));\n};\n\nconst removeRecentPrompt = (storageKey: string, prompt: string) => {\n localStorage.setItem(storageKey, JSON.stringify(getRecentPromptsFromStorage(storageKey)\n .map(e => e.prompt)\n .filter(e => e !== prompt)));\n};\n","import React from \"react\";\n\nimport { EntityCollection, RebasePlugin, User } from \"@rebasepro/types\";\nimport { DataEnhancementControllerProvider } from \"./components/DataEnhancementControllerProvider\";\nimport { FormEnhanceAction } from \"./components/FormEnhanceAction\";\n\nconst DEFAULT_API_KEY = \"fcms-U9jdDii0xXWSDC34asfrf54lbkFJBfKfRWcEDEwdc4V5wDWEDF\";\n\nexport interface DataEnhancementPluginProps {\n\n apiKey?: string;\n\n /**\n * Use this function to determine if the data enhancement plugin should be enabled for a given path.\n * If this function is not provided, the plugin will be enabled for all paths.\n * If the function returns false, the plugin will be disabled for the given path.\n * You can also return a configuration object to override the default configuration.\n *\n * @param path\n * @param collection\n */\n getConfigForPath?: (props: {\n path: string,\n collection: EntityCollection,\n user: User | null\n }) => boolean;\n\n /**\n * Host to use for the data enhancement API.\n * This prop is only use in development mode.\n */\n host?: string;\n}\n\n/**\n * Use this hook to initialise the data enhancement plugin.\n * This is likely the only hook you will need to use.\n * @param props\n */\nexport function useDataEnhancementPlugin(props?: DataEnhancementPluginProps): RebasePlugin {\n\n const apiKey = props?.apiKey ?? DEFAULT_API_KEY;\n const getConfigForPath = props?.getConfigForPath;\n\n return React.useMemo(() => ({\n key: \"data_enhancement\",\n slots: [\n {\n slot: \"form.actions\",\n Component: FormEnhanceAction,\n order: 40\n }\n ],\n providers: [\n {\n scope: \"form\" as const,\n Component: DataEnhancementControllerProvider as React.ComponentType<any>,\n props: {\n apiKey,\n getConfigForPath,\n host: props?.host\n }\n }\n ]\n }), [apiKey, getConfigForPath, props?.host]);\n}\n"],"names":["flatMapEntityValues","values","path","Object","entries","flatMap","key","value","currentPath","reduce","acc","curr","DEFAULT_SERVER","enhanceDataAPIStream","props","flatValues","properties","inputEntity","entityId","request","entityName","entityDescription","propertyKey","propertyInstructions","instructions","console","debug","fetch","host","method","headers","Authorization","firebaseToken","apiKey","body","JSON","stringify","then","res","ok","error","json","reader","getReader","Error","chunk","readChunks","str","TextDecoder","decode","split","forEach","s","length","data","parse","trim","type","onUpdateDelta","partialValue","onUpdate","onEnd","e","onError","Symbol","asyncIterator","readResult","read","done","fetchEntityPromptSuggestion","input","message","prompts","map","prompt","autocompleteStream","result","textBefore","textAfter","getAppendableSuggestion","suggestion","suggestionIncludesValue","toLowerCase","startsWith","substring","indexOf","undefined","getSimplifiedProperties","property","isPropertyBuilder","fullKey","valueInPath","getValueInPath","getSimplifiedProperty","a","b","getSimpleProperty","fieldId","getFieldId","name","description","fieldConfigId","enum","getSimpleEnumValues","disabled","Boolean","ui","readOnly","of","Array","isArray","arrayParentProperty","oneOf","typeField","valueField","prop","v","i","typeKey","oneOfType","valueKey","oneOfValue","childProperty","simplifiedProperty","mapProperties","childValue","o","attachPathToKeys","keys","mapParentProperty","warn","obj","enumValues","String","id","useEditorAIController","getAuthToken","autocomplete","DataEnhancementControllerContext","React","createContext","useDataEnhancementController","useContext","getPropertyFromKey","parentKey","slice","join","DataEnhancementControllerProvider","getConfigForPath","children","collection","formContext","enabled","setEnabled","useState","suggestions","setSuggestions","loadingSuggestions","setLoadingSuggestions","enhancingInProgress","useRef","authController","useAuthController","snackbarController","useSnackbarController","useMemo","valuesRef","useEffect","current","allowReferenceDataSelection","updateConfig","useCallback","config","urlController","useUrlController","clearSuggestion","prev","_","rest","appendValueDelta","delta","currentValue","updatedValue","setFieldValue","updateSuggestedValues","currentValues","updatedValues","replaceValues","filter","p","includes","appendableValue","multiline","trimmedValue","trimEnd","endsWith","trimStart","displayNeededSubscriptionSnackbar","projectId","open","autoHideDuration","editorAIController","clearAllSuggestions","enhance","user","Promise","reject","resolvedPath","resolveDatabasePathsFrom","resolve","code","singularName","errors","catch","getSamplePrompts","dataEnhancementController","FormEnhanceAction","status","openEntityMode","largeLayout","useLargeLayout","storageKey","createLocalStorageKey","loading","setLoading","samplePrompts","setSamplePrompts","setInstructions","loadingPrompts","updateSuggestedPrompts","getPromptsForExistingEntities","recentPromptsFromStorage","getRecentPromptsFromStorage","recentPrompts","useDeferredValue","addRecentPrompt","finally","submit","jsxs","Menu","Button","jsx","AIIcon","CircularProgress","MenuItem","Separator","samplePrompt","index","IconButton","preventDefault","stopPropagation","removeRecentPrompt","XIcon","iconSize","smallest","cls","TextareaAutosize","focusedDisabled","event","shiftKey","target","small","SendIcon","multilineProperties","markdown","multilinePrompt","Math","floor","random","push","statusString","stripCollectionPath","item","localStorage","getItem","setItem","DEFAULT_API_KEY","useDataEnhancementPlugin","$","_c","t0","t1","for","slot","Component","order","t2","t3","slots","providers","scope"],"mappings":"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"}
@@ -80,8 +80,14 @@ export type AuthController<USER extends User = User, ExtraData = unknown> = {
80
80
  export interface AuthControllerExtended<USER extends User = User, ExtraData = unknown> extends AuthController<USER, ExtraData> {
81
81
  /** Login with email and password */
82
82
  emailPasswordLogin?(email: string, password: string): Promise<void>;
83
- /** Login with a Google ID token or trigger Google popup */
84
- googleLogin?(idToken: string): Promise<void>;
83
+ /** Login with a Google token or authorization code */
84
+ googleLogin?: {
85
+ (token: string, tokenType?: "idToken" | "accessToken"): Promise<void>;
86
+ (payload: {
87
+ code: string;
88
+ redirectUri: string;
89
+ }): Promise<void>;
90
+ };
85
91
  /** Register a new user */
86
92
  register?(email: string, password: string, displayName?: string): Promise<void>;
87
93
  /** Skip login (for anonymous access if enabled) */
@@ -167,4 +167,17 @@ export interface RebaseClient<DB = unknown> {
167
167
  email?: EmailService;
168
168
  /** Admin API for user and role management */
169
169
  admin?: AdminAPI;
170
+ /**
171
+ * The base HTTP URL of the backend server.
172
+ * Exposed by the SDK client (`@rebasepro/client`) and used to auto-derive
173
+ * the `ApiConfigProvider` URL.
174
+ */
175
+ baseUrl?: string;
176
+ /**
177
+ * WebSocket client for realtime subscriptions and admin capabilities.
178
+ * Exposed by the SDK client (`@rebasepro/client`). The shape is intentionally
179
+ * left as `unknown` in the base interface — callers should narrow via feature
180
+ * detection (e.g. `typeof ws.executeSql === "function"`).
181
+ */
182
+ ws?: unknown;
170
183
  }
@@ -36,7 +36,8 @@ export type CollectionRegistryController<DB = Record<string, unknown>, EC extend
36
36
  * Retrieve all the related parent collection ids for a given path
37
37
  * @param path
38
38
  */
39
- getParentCollectionIds: (path: string) => string[];
39
+ getParentCollectionSlugs: (path: string) => string[];
40
+ getParentEntityIds: (path: string) => string[];
40
41
  /**
41
42
  * Resolve paths from a list of ids
42
43
  * @param ids
@@ -144,12 +144,19 @@ export interface DataDriver {
144
144
  path: string;
145
145
  databaseId?: string;
146
146
  collection: EntityCollection;
147
- parentCollectionIds?: string[];
147
+ parentCollectionSlugs?: string[];
148
+ parentEntityIds?: string[];
148
149
  }) => Promise<boolean>;
149
150
  /**
150
151
  * Flag to indicate if the driver has requested the initialization of the text search index
151
152
  */
152
153
  needsInitTextSearch?: boolean;
154
+ /**
155
+ * Optional REST-optimised fetch service. When present, the REST API
156
+ * generator uses these methods instead of the generic `fetchEntity` /
157
+ * `fetchCollection` pipeline, enabling include-aware eager-loading.
158
+ */
159
+ restFetchService?: RestFetchService;
153
160
  /**
154
161
  * Return the admin capabilities of this driver.
155
162
  * @see SQLAdmin
@@ -158,3 +165,31 @@ export interface DataDriver {
158
165
  */
159
166
  admin?: import("../types/backend").DatabaseAdmin;
160
167
  }
168
+ /**
169
+ * REST-optimised fetch service exposed by drivers that support
170
+ * eager-loading of relations via `include`.
171
+ *
172
+ * The methods return flattened rows (`{ id, ...columns }`) rather
173
+ * than the `Entity<M>` wrapper used by the generic DataDriver API.
174
+ *
175
+ * @group DataDriver
176
+ */
177
+ export interface RestFetchService {
178
+ /**
179
+ * Fetch a collection of flattened entities with optional relation includes.
180
+ */
181
+ fetchCollectionForRest(collectionPath: string, options?: {
182
+ filter?: FilterValues<string>;
183
+ orderBy?: string;
184
+ order?: "desc" | "asc";
185
+ limit?: number;
186
+ offset?: number;
187
+ startAfter?: Record<string, unknown>;
188
+ searchString?: string;
189
+ databaseId?: string;
190
+ }, include?: string[]): Promise<Record<string, unknown>[]>;
191
+ /**
192
+ * Fetch a single flattened entity with optional relation includes.
193
+ */
194
+ fetchEntityForRest(collectionPath: string, entityId: string | number, include?: string[], databaseId?: string): Promise<Record<string, unknown> | null>;
195
+ }
@@ -144,17 +144,18 @@ export interface AppView {
144
144
  * It will still be accessible if you reach the specified path
145
145
  */
146
146
  hideFromNavigation?: boolean;
147
+ /**
148
+ * Navigation group for this view.
149
+ * Views sharing the same group name will be visually grouped
150
+ * together in the drawer and home page. If not set, the view
151
+ * falls into the default "Views" group.
152
+ */
153
+ group?: string;
147
154
  /**
148
155
  * Component to be rendered. This can be any React component, and can use
149
156
  * any of the provided hooks
150
157
  */
151
158
  view: React.ReactNode;
152
- /**
153
- * Optional field used to group top level navigation entries under a
154
- * navigation view.
155
- * This prop is ignored for admin views.
156
- */
157
- group?: string;
158
159
  /**
159
160
  * If true, a wildcard route (slug/*) is automatically registered
160
161
  * alongside the base route, enabling nested navigation within this view.
@@ -193,6 +194,17 @@ export interface NavigationGroupMapping {
193
194
  * List of collection ids or view paths that belong to this group.
194
195
  */
195
196
  entries: string[];
197
+ /**
198
+ * Configure which groups start collapsed.
199
+ * Set to `true` to collapse in both drawer and home page,
200
+ * or use an object to control each independently.
201
+ *
202
+ * @defaultValue false (expanded)
203
+ */
204
+ collapsedByDefault?: boolean | {
205
+ drawer?: boolean;
206
+ home?: boolean;
207
+ };
196
208
  }
197
209
  export interface NavigationEntry {
198
210
  id: string;
@@ -3,7 +3,7 @@ import type { EntityCollection } from "../types/collections";
3
3
  import type { EntityCollectionsBuilder } from "../types/builders";
4
4
  import type { EntityCustomView } from "../types/entity_views";
5
5
  import type { EntityAction } from "../types/entity_actions";
6
- import type { AppView } from "./navigation";
6
+ import type { AppView, NavigationGroupMapping } from "./navigation";
7
7
  /**
8
8
  * Options to enable the built-in collection editor.
9
9
  * When provided to `<RebaseCMS>`, the editor is auto-wired as a native feature.
@@ -25,6 +25,14 @@ export interface RebaseCMSConfig<EC extends EntityCollection = any> {
25
25
  entityViews?: EntityCustomView<any>[];
26
26
  entityActions?: EntityAction[];
27
27
  plugins?: any[];
28
+ /**
29
+ * Centralized configuration for how collections and views are grouped
30
+ * in the navigation sidebar and home page.
31
+ * Each mapping defines a named group and the collection/view slugs
32
+ * that belong to it. The array order determines group display order.
33
+ * Entry order within each group determines card order.
34
+ */
35
+ navigationGroupMappings?: NavigationGroupMapping[];
28
36
  /**
29
37
  * Enable the built-in visual collection/schema editor.
30
38
  * Pass `true` for zero-config, or an options object for fine-grained control.
@@ -62,6 +62,13 @@ export interface EntitySidePanelProps<M extends Record<string, unknown> = Record
62
62
  * Allow the user to open the entity fullscreen
63
63
  */
64
64
  allowFullScreen?: boolean;
65
+ /**
66
+ * Pre-populate the form with these values when creating a new entity.
67
+ * Only applied when `entityId` is not set (i.e. the form is in "new" mode).
68
+ * Useful for actions that fetch data from an external source (e.g. a URL)
69
+ * and want to pre-fill the document before the user saves.
70
+ */
71
+ defaultValues?: Partial<M>;
65
72
  }
66
73
  /**
67
74
  * Controller to open the side dialog displaying entity forms