@ai-stack/payloadcms 3.2.1-beta → 3.2.3-beta

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 (41) hide show
  1. package/LICENSE.md +2 -2
  2. package/README.md +14 -7
  3. package/dist/ai/models/openai/generateImage.d.ts.map +1 -1
  4. package/dist/ai/models/openai/generateImage.js +0 -1
  5. package/dist/ai/models/openai/generateImage.js.map +1 -1
  6. package/dist/ai/models/openai/generateRichText.d.ts +1 -1
  7. package/dist/ai/models/openai/generateRichText.d.ts.map +1 -1
  8. package/dist/ai/models/openai/generateRichText.js +14 -7
  9. package/dist/ai/models/openai/generateRichText.js.map +1 -1
  10. package/dist/ai/schemas/lexicalJsonSchema.d.ts +369 -0
  11. package/dist/ai/schemas/lexicalJsonSchema.d.ts.map +1 -1
  12. package/dist/ai/schemas/lexicalJsonSchema.js +547 -214
  13. package/dist/ai/schemas/lexicalJsonSchema.js.map +1 -1
  14. package/dist/collections/Instructions.js +3 -3
  15. package/dist/collections/Instructions.js.map +1 -1
  16. package/dist/endpoints/index.js.map +1 -1
  17. package/dist/fields/LexicalEditor/feature.client.d.ts.map +1 -1
  18. package/dist/fields/LexicalEditor/feature.client.js +4 -0
  19. package/dist/fields/LexicalEditor/feature.client.js.map +1 -1
  20. package/dist/plugin.d.ts.map +1 -1
  21. package/dist/plugin.js +26 -0
  22. package/dist/plugin.js.map +1 -1
  23. package/dist/types.d.ts +2 -0
  24. package/dist/types.d.ts.map +1 -1
  25. package/dist/types.js.map +1 -1
  26. package/dist/ui/Compose/Compose.js +4 -3
  27. package/dist/ui/Compose/Compose.js.map +1 -1
  28. package/dist/ui/Compose/{compose.module.scss → compose.module.css} +7 -7
  29. package/dist/ui/Compose/hooks/menu/useMenu.d.ts +2 -1
  30. package/dist/ui/Compose/hooks/menu/useMenu.d.ts.map +1 -1
  31. package/dist/ui/Compose/hooks/menu/useMenu.js +15 -4
  32. package/dist/ui/Compose/hooks/menu/useMenu.js.map +1 -1
  33. package/dist/ui/Compose/hooks/useGenerate.d.ts +1 -0
  34. package/dist/ui/Compose/hooks/useGenerate.d.ts.map +1 -1
  35. package/dist/ui/Compose/hooks/useGenerate.js +40 -11
  36. package/dist/ui/Compose/hooks/useGenerate.js.map +1 -1
  37. package/dist/utilities/editorSchemaValidator.d.ts +3 -0
  38. package/dist/utilities/editorSchemaValidator.d.ts.map +1 -0
  39. package/dist/utilities/editorSchemaValidator.js +31 -0
  40. package/dist/utilities/editorSchemaValidator.js.map +1 -0
  41. package/package.json +3 -5
@@ -5,6 +5,7 @@ import { useCompletion, experimental_useObject as useObject } from 'ai/react';
5
5
  import { useCallback, useEffect, useMemo } from 'react';
6
6
  import { PLUGIN_API_ENDPOINT_GENERATE, PLUGIN_API_ENDPOINT_GENERATE_UPLOAD, PLUGIN_INSTRUCTIONS_TABLE, PLUGIN_NAME } from '../../../defaults.js';
7
7
  import { useFieldProps } from '../../../providers/FieldProvider/useFieldProps.js';
8
+ import { editorSchemaValidator } from '../../../utilities/editorSchemaValidator.js';
8
9
  import { setSafeLexicalState } from '../../../utilities/setSafeLexicalState.js';
9
10
  import { useHistory } from './useHistory.js';
10
11
  export const useGenerate = ({ instructionId })=>{
@@ -23,10 +24,30 @@ export const useGenerate = ({ instructionId })=>{
23
24
  const collection = collections.find((collection)=>collection.slug === PLUGIN_INSTRUCTIONS_TABLE);
24
25
  const { custom: { [PLUGIN_NAME]: { editorConfig = {} } = {} } = {} } = collection.admin;
25
26
  const { schema: editorSchema = {} } = editorConfig;
26
- const memoizedSchema = useMemo(()=>jsonSchema(editorSchema), [
27
+ const memoizedValidator = useMemo(()=>{
28
+ return editorSchemaValidator(editorSchema);
29
+ }, [
27
30
  editorSchema
28
31
  ]);
29
- const { isLoading: loadingObject, object, stop, submit } = useObject({
32
+ const memoizedSchema = useMemo(()=>jsonSchema(editorSchema, {
33
+ validate: (value)=>{
34
+ const isValid = memoizedValidator(value);
35
+ if (isValid) {
36
+ return {
37
+ success: true,
38
+ value
39
+ };
40
+ } else {
41
+ return {
42
+ error: new Error('Invalid schema'),
43
+ success: false
44
+ };
45
+ }
46
+ }
47
+ }), [
48
+ memoizedValidator
49
+ ]);
50
+ const { isLoading: loadingObject, object, stop: objectStop, submit } = useObject({
30
51
  api: `/api${PLUGIN_API_ENDPOINT_GENERATE}`,
31
52
  onError: (error)=>{
32
53
  console.error('Error generating object:', error);
@@ -44,17 +65,16 @@ export const useGenerate = ({ instructionId })=>{
44
65
  useEffect(()=>{
45
66
  if (!object) return;
46
67
  requestAnimationFrame(()=>{
47
- if (!editor) {
48
- setValue(object);
49
- return;
68
+ const validateObject = memoizedSchema.validate(object);
69
+ if (validateObject?.success) {
70
+ setSafeLexicalState(object, editor);
50
71
  }
51
- // Currently this is being used as setValue for RichText component does not render new changes right away.
52
- setSafeLexicalState(object, editor);
53
72
  });
54
73
  }, [
55
- object
74
+ object,
75
+ editorSchema
56
76
  ]);
57
- const { complete, completion, isLoading: loadingCompletion } = useCompletion({
77
+ const { complete, completion, isLoading: loadingCompletion, stop: completionStop } = useCompletion({
58
78
  api: `${serverURL}${api}${PLUGIN_API_ENDPOINT_GENERATE}`,
59
79
  onError: (error)=>{
60
80
  console.error('Error generating text:', error);
@@ -136,7 +156,7 @@ export const useGenerate = ({ instructionId })=>{
136
156
  }
137
157
  return uploadResponse;
138
158
  }).catch((error)=>{
139
- console.error('Error generating your upload', error);
159
+ console.error('Error generating or setting your upload, please set it manually if its saved in your media files: ', error);
140
160
  });
141
161
  }, [
142
162
  getData,
@@ -162,9 +182,18 @@ export const useGenerate = ({ instructionId })=>{
162
182
  streamText,
163
183
  type
164
184
  ]);
185
+ const stop = useCallback(()=>{
186
+ console.log('Stopping...');
187
+ objectStop();
188
+ completionStop();
189
+ }, [
190
+ objectStop,
191
+ completionStop
192
+ ]);
165
193
  return {
166
194
  generate,
167
- isLoading: loadingCompletion || loadingObject
195
+ isLoading: loadingCompletion || loadingObject,
196
+ stop
168
197
  };
169
198
  };
170
199
 
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/ui/Compose/hooks/useGenerate.ts"],"sourcesContent":["import { useEditorConfigContext } from '@payloadcms/richtext-lexical/client'\nimport { useConfig, useField, useForm, useLocale } from '@payloadcms/ui'\nimport { jsonSchema } from 'ai'\nimport { useCompletion, experimental_useObject as useObject } from 'ai/react'\nimport { useCallback, useEffect, useMemo } from 'react'\n\nimport type { ActionMenuItems, GenerateTextarea } from '../../../types.js'\n\nimport {\n PLUGIN_API_ENDPOINT_GENERATE,\n PLUGIN_API_ENDPOINT_GENERATE_UPLOAD,\n PLUGIN_INSTRUCTIONS_TABLE,\n PLUGIN_NAME,\n} from '../../../defaults.js'\nimport { useFieldProps } from '../../../providers/FieldProvider/useFieldProps.js'\nimport { setSafeLexicalState } from '../../../utilities/setSafeLexicalState.js'\nimport { useHistory } from './useHistory.js'\n\ntype ActionCallbackParams = { action: ActionMenuItems; params?: unknown }\n\nexport const useGenerate = ({ instructionId }: { instructionId: string }) => {\n const { type, path: pathFromContext } = useFieldProps()\n const editorConfigContext = useEditorConfigContext()\n const { editor } = editorConfigContext\n\n const { config } = useConfig()\n const {\n routes: { api },\n serverURL,\n } = config\n\n const { setValue } = useField<string>({\n path: pathFromContext,\n })\n\n const { set: setHistory } = useHistory()\n\n const { getData } = useForm()\n const localFromContext = useLocale()\n const {\n config: { collections },\n } = useConfig()\n\n const collection = collections.find((collection) => collection.slug === PLUGIN_INSTRUCTIONS_TABLE)\n const { custom: { [PLUGIN_NAME]: { editorConfig = {} } = {} } = {} } = collection.admin\n const { schema: editorSchema = {} } = editorConfig\n\n const memoizedSchema = useMemo(() => jsonSchema(editorSchema), [editorSchema])\n\n const {\n isLoading: loadingObject,\n object,\n stop, // TODO: Implement this function\n submit,\n } = useObject({\n api: `/api${PLUGIN_API_ENDPOINT_GENERATE}`,\n onError: (error) => {\n console.error('Error generating object:', error)\n },\n onFinish: (result) => {\n if (result.object) {\n setHistory(result.object)\n setValue(result.object)\n } else {\n console.log('onFinish: result ', result)\n }\n },\n schema: memoizedSchema,\n })\n\n useEffect(() => {\n if (!object) return\n\n requestAnimationFrame(() => {\n if (!editor) {\n setValue(object)\n return\n }\n\n // Currently this is being used as setValue for RichText component does not render new changes right away.\n setSafeLexicalState(object, editor)\n })\n }, [object])\n\n const {\n complete,\n completion,\n isLoading: loadingCompletion,\n } = useCompletion({\n api: `${serverURL}${api}${PLUGIN_API_ENDPOINT_GENERATE}`,\n onError: (error) => {\n console.error('Error generating text:', error)\n },\n onFinish: (prompt, result) => {\n setHistory(result)\n },\n streamProtocol: 'data',\n })\n\n useEffect(() => {\n if (!completion) return\n\n requestAnimationFrame(() => {\n setValue(completion)\n })\n }, [completion])\n\n const streamObject = useCallback(\n ({ action = 'Compose', params }: ActionCallbackParams) => {\n const doc = getData()\n const options = {\n action,\n actionParams: params,\n instructionId,\n }\n\n submit({\n doc,\n locale: localFromContext?.code,\n options,\n })\n },\n [getData, localFromContext?.code, instructionId],\n )\n\n const streamText = useCallback(\n async ({ action = 'Compose', params }: ActionCallbackParams) => {\n const doc = getData()\n\n const options = {\n action,\n actionParams: params,\n instructionId,\n }\n\n await complete('', {\n body: {\n doc,\n locale: localFromContext?.code,\n options,\n },\n })\n },\n [getData, localFromContext?.code, instructionId],\n )\n\n const generateUpload = useCallback(async () => {\n const doc = getData()\n\n return fetch(`${serverURL}${api}${PLUGIN_API_ENDPOINT_GENERATE_UPLOAD}`, {\n body: JSON.stringify({\n doc,\n locale: localFromContext?.code,\n options: {\n instructionId,\n },\n } satisfies Parameters<GenerateTextarea>[0]),\n credentials: 'include',\n headers: {\n 'Content-Type': 'application/json',\n },\n method: 'POST',\n })\n .then(async (uploadResponse) => {\n if (uploadResponse.ok) {\n const { result } = await uploadResponse.json()\n if (!result) throw new Error('generateUpload: Something went wrong')\n\n setValue(result?.id)\n setHistory(result?.id)\n } else {\n const { errors = [] } = await uploadResponse.json()\n const errStr = errors.map((error) => error.message).join(', ')\n throw new Error(errStr)\n }\n return uploadResponse\n })\n .catch((error) => {\n console.error('Error generating your upload', error)\n })\n }, [getData, localFromContext?.code, instructionId])\n\n const generate = useCallback(\n async (options?: ActionCallbackParams) => {\n if (type === 'richText') {\n return streamObject(options)\n }\n\n if (['text', 'textarea'].includes(type)) {\n return streamText(options)\n }\n\n if (type === 'upload') {\n return generateUpload()\n }\n },\n [generateUpload, streamObject, streamText, type],\n )\n\n return {\n generate,\n isLoading: loadingCompletion || loadingObject,\n }\n}\n"],"names":["useEditorConfigContext","useConfig","useField","useForm","useLocale","jsonSchema","useCompletion","experimental_useObject","useObject","useCallback","useEffect","useMemo","PLUGIN_API_ENDPOINT_GENERATE","PLUGIN_API_ENDPOINT_GENERATE_UPLOAD","PLUGIN_INSTRUCTIONS_TABLE","PLUGIN_NAME","useFieldProps","setSafeLexicalState","useHistory","useGenerate","instructionId","type","path","pathFromContext","editorConfigContext","editor","config","routes","api","serverURL","setValue","set","setHistory","getData","localFromContext","collections","collection","find","slug","custom","editorConfig","admin","schema","editorSchema","memoizedSchema","isLoading","loadingObject","object","stop","submit","onError","error","console","onFinish","result","log","requestAnimationFrame","complete","completion","loadingCompletion","prompt","streamProtocol","streamObject","action","params","doc","options","actionParams","locale","code","streamText","body","generateUpload","fetch","JSON","stringify","credentials","headers","method","then","uploadResponse","ok","json","Error","id","errors","errStr","map","message","join","catch","generate","includes"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../src/ui/Compose/hooks/useGenerate.ts"],"sourcesContent":["import { useEditorConfigContext } from '@payloadcms/richtext-lexical/client'\nimport { useConfig, useField, useForm, useLocale } from '@payloadcms/ui'\nimport { jsonSchema } from 'ai'\nimport { useCompletion, experimental_useObject as useObject } from 'ai/react'\nimport { useCallback, useEffect, useMemo } from 'react'\n\nimport type { ActionMenuItems, GenerateTextarea } from '../../../types.js'\n\nimport {\n PLUGIN_API_ENDPOINT_GENERATE,\n PLUGIN_API_ENDPOINT_GENERATE_UPLOAD,\n PLUGIN_INSTRUCTIONS_TABLE,\n PLUGIN_NAME,\n} from '../../../defaults.js'\nimport { useFieldProps } from '../../../providers/FieldProvider/useFieldProps.js'\nimport { editorSchemaValidator } from '../../../utilities/editorSchemaValidator.js'\nimport { setSafeLexicalState } from '../../../utilities/setSafeLexicalState.js'\nimport { useHistory } from './useHistory.js'\n\ntype ActionCallbackParams = { action: ActionMenuItems; params?: unknown }\n\nexport const useGenerate = ({ instructionId }: { instructionId: string }) => {\n const { type, path: pathFromContext } = useFieldProps()\n const editorConfigContext = useEditorConfigContext()\n\n const { editor } = editorConfigContext\n\n const { config } = useConfig()\n const {\n routes: { api },\n serverURL,\n } = config\n\n const { setValue } = useField<string>({\n path: pathFromContext,\n })\n\n const { set: setHistory } = useHistory()\n\n const { getData } = useForm()\n const localFromContext = useLocale()\n const {\n config: { collections },\n } = useConfig()\n\n const collection = collections.find((collection) => collection.slug === PLUGIN_INSTRUCTIONS_TABLE)\n const { custom: { [PLUGIN_NAME]: { editorConfig = {} } = {} } = {} } = collection.admin\n const { schema: editorSchema = {} } = editorConfig\n\n const memoizedValidator = useMemo(() => {\n return editorSchemaValidator(editorSchema)\n }, [editorSchema])\n\n const memoizedSchema = useMemo(\n () =>\n jsonSchema(editorSchema, {\n validate: (value) => {\n const isValid = memoizedValidator(value)\n\n if (isValid) {\n return {\n success: true,\n value,\n }\n } else {\n return {\n error: new Error('Invalid schema'),\n success: false,\n }\n }\n },\n }),\n [memoizedValidator],\n )\n\n const {\n isLoading: loadingObject,\n object,\n stop: objectStop,\n submit,\n } = useObject({\n api: `/api${PLUGIN_API_ENDPOINT_GENERATE}`,\n onError: (error) => {\n console.error('Error generating object:', error)\n },\n onFinish: (result) => {\n if (result.object) {\n setHistory(result.object)\n setValue(result.object)\n } else {\n console.log('onFinish: result ', result)\n }\n },\n schema: memoizedSchema,\n })\n\n useEffect(() => {\n if (!object) return\n\n requestAnimationFrame(() => {\n const validateObject = memoizedSchema.validate(object)\n if (validateObject?.success) {\n setSafeLexicalState(object, editor)\n }\n })\n }, [object, editorSchema])\n\n const {\n complete,\n completion,\n isLoading: loadingCompletion,\n stop: completionStop,\n } = useCompletion({\n api: `${serverURL}${api}${PLUGIN_API_ENDPOINT_GENERATE}`,\n onError: (error) => {\n console.error('Error generating text:', error)\n },\n onFinish: (prompt, result) => {\n setHistory(result)\n },\n streamProtocol: 'data',\n })\n\n useEffect(() => {\n if (!completion) return\n\n requestAnimationFrame(() => {\n setValue(completion)\n })\n }, [completion])\n\n const streamObject = useCallback(\n ({ action = 'Compose', params }: ActionCallbackParams) => {\n const doc = getData()\n const options = {\n action,\n actionParams: params,\n instructionId,\n }\n\n submit({\n doc,\n locale: localFromContext?.code,\n options,\n })\n },\n [getData, localFromContext?.code, instructionId],\n )\n\n const streamText = useCallback(\n async ({ action = 'Compose', params }: ActionCallbackParams) => {\n const doc = getData()\n\n const options = {\n action,\n actionParams: params,\n instructionId,\n }\n\n await complete('', {\n body: {\n doc,\n locale: localFromContext?.code,\n options,\n },\n })\n },\n [getData, localFromContext?.code, instructionId],\n )\n\n const generateUpload = useCallback(async () => {\n const doc = getData()\n\n return fetch(`${serverURL}${api}${PLUGIN_API_ENDPOINT_GENERATE_UPLOAD}`, {\n body: JSON.stringify({\n doc,\n locale: localFromContext?.code,\n options: {\n instructionId,\n },\n } satisfies Parameters<GenerateTextarea>[0]),\n credentials: 'include',\n headers: {\n 'Content-Type': 'application/json',\n },\n method: 'POST',\n })\n .then(async (uploadResponse) => {\n if (uploadResponse.ok) {\n const { result } = await uploadResponse.json()\n if (!result) throw new Error('generateUpload: Something went wrong')\n\n setValue(result?.id)\n setHistory(result?.id)\n } else {\n const { errors = [] } = await uploadResponse.json()\n const errStr = errors.map((error) => error.message).join(', ')\n throw new Error(errStr)\n }\n return uploadResponse\n })\n .catch((error) => {\n console.error('Error generating or setting your upload, please set it manually if its saved in your media files: ', error)\n })\n }, [getData, localFromContext?.code, instructionId])\n\n const generate = useCallback(\n async (options?: ActionCallbackParams) => {\n if (type === 'richText') {\n return streamObject(options)\n }\n\n if (['text', 'textarea'].includes(type)) {\n return streamText(options)\n }\n\n if (type === 'upload') {\n return generateUpload()\n }\n },\n [generateUpload, streamObject, streamText, type],\n )\n\n const stop = useCallback(() => {\n console.log('Stopping...')\n objectStop()\n completionStop()\n }, [objectStop, completionStop])\n\n return {\n generate,\n isLoading: loadingCompletion || loadingObject,\n stop\n }\n}\n"],"names":["useEditorConfigContext","useConfig","useField","useForm","useLocale","jsonSchema","useCompletion","experimental_useObject","useObject","useCallback","useEffect","useMemo","PLUGIN_API_ENDPOINT_GENERATE","PLUGIN_API_ENDPOINT_GENERATE_UPLOAD","PLUGIN_INSTRUCTIONS_TABLE","PLUGIN_NAME","useFieldProps","editorSchemaValidator","setSafeLexicalState","useHistory","useGenerate","instructionId","type","path","pathFromContext","editorConfigContext","editor","config","routes","api","serverURL","setValue","set","setHistory","getData","localFromContext","collections","collection","find","slug","custom","editorConfig","admin","schema","editorSchema","memoizedValidator","memoizedSchema","validate","value","isValid","success","error","Error","isLoading","loadingObject","object","stop","objectStop","submit","onError","console","onFinish","result","log","requestAnimationFrame","validateObject","complete","completion","loadingCompletion","completionStop","prompt","streamProtocol","streamObject","action","params","doc","options","actionParams","locale","code","streamText","body","generateUpload","fetch","JSON","stringify","credentials","headers","method","then","uploadResponse","ok","json","id","errors","errStr","map","message","join","catch","generate","includes"],"mappings":"AAAA,SAASA,sBAAsB,QAAQ,sCAAqC;AAC5E,SAASC,SAAS,EAAEC,QAAQ,EAAEC,OAAO,EAAEC,SAAS,QAAQ,iBAAgB;AACxE,SAASC,UAAU,QAAQ,KAAI;AAC/B,SAASC,aAAa,EAAEC,0BAA0BC,SAAS,QAAQ,WAAU;AAC7E,SAASC,WAAW,EAAEC,SAAS,EAAEC,OAAO,QAAQ,QAAO;AAIvD,SACEC,4BAA4B,EAC5BC,mCAAmC,EACnCC,yBAAyB,EACzBC,WAAW,QACN,uBAAsB;AAC7B,SAASC,aAAa,QAAQ,oDAAmD;AACjF,SAASC,qBAAqB,QAAQ,8CAA6C;AACnF,SAASC,mBAAmB,QAAQ,4CAA2C;AAC/E,SAASC,UAAU,QAAQ,kBAAiB;AAI5C,OAAO,MAAMC,cAAc,CAAC,EAAEC,aAAa,EAA6B;IACtE,MAAM,EAAEC,IAAI,EAAEC,MAAMC,eAAe,EAAE,GAAGR;IACxC,MAAMS,sBAAsBzB;IAE5B,MAAM,EAAE0B,MAAM,EAAE,GAAGD;IAEnB,MAAM,EAAEE,MAAM,EAAE,GAAG1B;IACnB,MAAM,EACJ2B,QAAQ,EAAEC,GAAG,EAAE,EACfC,SAAS,EACV,GAAGH;IAEJ,MAAM,EAAEI,QAAQ,EAAE,GAAG7B,SAAiB;QACpCqB,MAAMC;IACR;IAEA,MAAM,EAAEQ,KAAKC,UAAU,EAAE,GAAGd;IAE5B,MAAM,EAAEe,OAAO,EAAE,GAAG/B;IACpB,MAAMgC,mBAAmB/B;IACzB,MAAM,EACJuB,QAAQ,EAAES,WAAW,EAAE,EACxB,GAAGnC;IAEJ,MAAMoC,aAAaD,YAAYE,IAAI,CAAC,CAACD,aAAeA,WAAWE,IAAI,KAAKzB;IACxE,MAAM,EAAE0B,QAAQ,EAAE,CAACzB,YAAY,EAAE,EAAE0B,eAAe,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,GAAGJ,WAAWK,KAAK;IACvF,MAAM,EAAEC,QAAQC,eAAe,CAAC,CAAC,EAAE,GAAGH;IAEtC,MAAMI,oBAAoBlC,QAAQ;QAChC,OAAOM,sBAAsB2B;IAC/B,GAAG;QAACA;KAAa;IAEjB,MAAME,iBAAiBnC,QACrB,IACEN,WAAWuC,cAAc;YACvBG,UAAU,CAACC;gBACT,MAAMC,UAAUJ,kBAAkBG;gBAElC,IAAIC,SAAS;oBACX,OAAO;wBACLC,SAAS;wBACTF;oBACF;gBACF,OAAO;oBACL,OAAO;wBACLG,OAAO,IAAIC,MAAM;wBACjBF,SAAS;oBACX;gBACF;YACF;QACF,IACF;QAACL;KAAkB;IAGrB,MAAM,EACJQ,WAAWC,aAAa,EACxBC,MAAM,EACNC,MAAMC,UAAU,EAChBC,MAAM,EACP,GAAGlD,UAAU;QACZqB,KAAK,CAAC,IAAI,EAAEjB,8BAA8B;QAC1C+C,SAAS,CAACR;YACRS,QAAQT,KAAK,CAAC,4BAA4BA;QAC5C;QACAU,UAAU,CAACC;YACT,IAAIA,OAAOP,MAAM,EAAE;gBACjBtB,WAAW6B,OAAOP,MAAM;gBACxBxB,SAAS+B,OAAOP,MAAM;YACxB,OAAO;gBACLK,QAAQG,GAAG,CAAC,qBAAqBD;YACnC;QACF;QACAnB,QAAQG;IACV;IAEApC,UAAU;QACR,IAAI,CAAC6C,QAAQ;QAEbS,sBAAsB;YACpB,MAAMC,iBAAiBnB,eAAeC,QAAQ,CAACQ;YAC/C,IAAIU,gBAAgBf,SAAS;gBAC3BhC,oBAAoBqC,QAAQ7B;YAC9B;QACF;IACF,GAAG;QAAC6B;QAAQX;KAAa;IAEzB,MAAM,EACJsB,QAAQ,EACRC,UAAU,EACVd,WAAWe,iBAAiB,EAC5BZ,MAAMa,cAAc,EACrB,GAAG/D,cAAc;QAChBuB,KAAK,GAAGC,YAAYD,MAAMjB,8BAA8B;QACxD+C,SAAS,CAACR;YACRS,QAAQT,KAAK,CAAC,0BAA0BA;QAC1C;QACAU,UAAU,CAACS,QAAQR;YACjB7B,WAAW6B;QACb;QACAS,gBAAgB;IAClB;IAEA7D,UAAU;QACR,IAAI,CAACyD,YAAY;QAEjBH,sBAAsB;YACpBjC,SAASoC;QACX;IACF,GAAG;QAACA;KAAW;IAEf,MAAMK,eAAe/D,YACnB,CAAC,EAAEgE,SAAS,SAAS,EAAEC,MAAM,EAAwB;QACnD,MAAMC,MAAMzC;QACZ,MAAM0C,UAAU;YACdH;YACAI,cAAcH;YACdrD;QACF;QAEAqC,OAAO;YACLiB;YACAG,QAAQ3C,kBAAkB4C;YAC1BH;QACF;IACF,GACA;QAAC1C;QAASC,kBAAkB4C;QAAM1D;KAAc;IAGlD,MAAM2D,aAAavE,YACjB,OAAO,EAAEgE,SAAS,SAAS,EAAEC,MAAM,EAAwB;QACzD,MAAMC,MAAMzC;QAEZ,MAAM0C,UAAU;YACdH;YACAI,cAAcH;YACdrD;QACF;QAEA,MAAM6C,SAAS,IAAI;YACjBe,MAAM;gBACJN;gBACAG,QAAQ3C,kBAAkB4C;gBAC1BH;YACF;QACF;IACF,GACA;QAAC1C;QAASC,kBAAkB4C;QAAM1D;KAAc;IAGlD,MAAM6D,iBAAiBzE,YAAY;QACjC,MAAMkE,MAAMzC;QAEZ,OAAOiD,MAAM,GAAGrD,YAAYD,MAAMhB,qCAAqC,EAAE;YACvEoE,MAAMG,KAAKC,SAAS,CAAC;gBACnBV;gBACAG,QAAQ3C,kBAAkB4C;gBAC1BH,SAAS;oBACPvD;gBACF;YACF;YACAiE,aAAa;YACbC,SAAS;gBACP,gBAAgB;YAClB;YACAC,QAAQ;QACV,GACGC,IAAI,CAAC,OAAOC;YACX,IAAIA,eAAeC,EAAE,EAAE;gBACrB,MAAM,EAAE7B,MAAM,EAAE,GAAG,MAAM4B,eAAeE,IAAI;gBAC5C,IAAI,CAAC9B,QAAQ,MAAM,IAAIV,MAAM;gBAE7BrB,SAAS+B,QAAQ+B;gBACjB5D,WAAW6B,QAAQ+B;YACrB,OAAO;gBACL,MAAM,EAAEC,SAAS,EAAE,EAAE,GAAG,MAAMJ,eAAeE,IAAI;gBACjD,MAAMG,SAASD,OAAOE,GAAG,CAAC,CAAC7C,QAAUA,MAAM8C,OAAO,EAAEC,IAAI,CAAC;gBACzD,MAAM,IAAI9C,MAAM2C;YAClB;YACA,OAAOL;QACT,GACCS,KAAK,CAAC,CAAChD;YACNS,QAAQT,KAAK,CAAC,sGAAsGA;QACtH;IACJ,GAAG;QAACjB;QAASC,kBAAkB4C;QAAM1D;KAAc;IAEnD,MAAM+E,WAAW3F,YACf,OAAOmE;QACL,IAAItD,SAAS,YAAY;YACvB,OAAOkD,aAAaI;QACtB;QAEA,IAAI;YAAC;YAAQ;SAAW,CAACyB,QAAQ,CAAC/E,OAAO;YACvC,OAAO0D,WAAWJ;QACpB;QAEA,IAAItD,SAAS,UAAU;YACrB,OAAO4D;QACT;IACF,GACA;QAACA;QAAgBV;QAAcQ;QAAY1D;KAAK;IAGlD,MAAMkC,OAAO/C,YAAY;QACvBmD,QAAQG,GAAG,CAAC;QACZN;QACAY;IACF,GAAG;QAACZ;QAAYY;KAAe;IAE/B,OAAO;QACL+B;QACA/C,WAAWe,qBAAqBd;QAChCE;IACF;AACF,EAAC"}
@@ -0,0 +1,3 @@
1
+ import ajvModule from 'ajv';
2
+ export declare const editorSchemaValidator: (schema: any) => ajvModule.ValidateFunction<unknown>;
3
+ //# sourceMappingURL=editorSchemaValidator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"editorSchemaValidator.d.ts","sourceRoot":"","sources":["../../src/utilities/editorSchemaValidator.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,KAAK,CAAA;AAE3B,eAAO,MAAM,qBAAqB,sDAkCjC,CAAA"}
@@ -0,0 +1,31 @@
1
+ import ajvModule from 'ajv';
2
+ export const editorSchemaValidator = (schema)=>{
3
+ const modifiedSchema = JSON.parse(JSON.stringify(schema), function(key, value) {
4
+ if (key === 'required' && Array.isArray(value)) {
5
+ // Safely access properties from parent
6
+ const parent = this;
7
+ const parentProperties = parent.properties;
8
+ if (parentProperties) {
9
+ const requiredFields = [
10
+ 'type'
11
+ ]; // type is always required
12
+ // Check if this node has children property
13
+ if ('children' in parentProperties) {
14
+ requiredFields.push('children');
15
+ }
16
+ // Check if this node has text property
17
+ if ('text' in parentProperties) {
18
+ requiredFields.push('text');
19
+ }
20
+ const filteredRequired = value.filter((field)=>requiredFields.includes(field));
21
+ return filteredRequired.length ? filteredRequired : undefined;
22
+ }
23
+ }
24
+ return value;
25
+ });
26
+ const Ajv = ajvModule.default;
27
+ const ajv = new Ajv();
28
+ return ajv.compile(modifiedSchema);
29
+ };
30
+
31
+ //# sourceMappingURL=editorSchemaValidator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/utilities/editorSchemaValidator.ts"],"sourcesContent":["import ajvModule from 'ajv'\n\nexport const editorSchemaValidator = (schema) => {\n const modifiedSchema = JSON.parse(\n JSON.stringify(schema),\n function (key: string, value: any) {\n if (key === 'required' && Array.isArray(value)) {\n // Safely access properties from parent\n const parent = this as { properties?: Record<string, any> };\n const parentProperties = parent.properties;\n\n if (parentProperties) {\n const requiredFields = ['type']; // type is always required\n\n // Check if this node has children property\n if ('children' in parentProperties) {\n requiredFields.push('children');\n }\n\n // Check if this node has text property\n if ('text' in parentProperties) {\n requiredFields.push('text');\n }\n\n const filteredRequired = value.filter((field) => requiredFields.includes(field));\n return filteredRequired.length ? filteredRequired : undefined;\n }\n }\n return value;\n },\n );\n\n const Ajv = ajvModule.default\n const ajv = new Ajv()\n\n return ajv.compile(modifiedSchema)\n}"],"names":["ajvModule","editorSchemaValidator","schema","modifiedSchema","JSON","parse","stringify","key","value","Array","isArray","parent","parentProperties","properties","requiredFields","push","filteredRequired","filter","field","includes","length","undefined","Ajv","default","ajv","compile"],"mappings":"AAAA,OAAOA,eAAe,MAAK;AAE3B,OAAO,MAAMC,wBAAwB,CAACC;IACpC,MAAMC,iBAAiBC,KAAKC,KAAK,CAC/BD,KAAKE,SAAS,CAACJ,SACf,SAAUK,GAAW,EAAEC,KAAU;QAC/B,IAAID,QAAQ,cAAcE,MAAMC,OAAO,CAACF,QAAQ;YAC9C,uCAAuC;YACvC,MAAMG,SAAS,IAAI;YACnB,MAAMC,mBAAmBD,OAAOE,UAAU;YAE1C,IAAID,kBAAkB;gBACpB,MAAME,iBAAiB;oBAAC;iBAAO,EAAE,0BAA0B;gBAE3D,2CAA2C;gBAC3C,IAAI,cAAcF,kBAAkB;oBAClCE,eAAeC,IAAI,CAAC;gBACtB;gBAEA,uCAAuC;gBACvC,IAAI,UAAUH,kBAAkB;oBAC9BE,eAAeC,IAAI,CAAC;gBACtB;gBAEA,MAAMC,mBAAmBR,MAAMS,MAAM,CAAC,CAACC,QAAUJ,eAAeK,QAAQ,CAACD;gBACzE,OAAOF,iBAAiBI,MAAM,GAAGJ,mBAAmBK;YACtD;QACF;QACA,OAAOb;IACT;IAGF,MAAMc,MAAMtB,UAAUuB,OAAO;IAC7B,MAAMC,MAAM,IAAIF;IAEhB,OAAOE,IAAIC,OAAO,CAACtB;AACrB,EAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ai-stack/payloadcms",
3
- "version": "3.2.1-beta",
3
+ "version": "3.2.3-beta",
4
4
  "private": false,
5
5
  "bugs": "https://github.com/ashbuilds/payload-ai/issues",
6
6
  "repository": "https://github.com/ashbuilds/payload-ai",
@@ -53,21 +53,19 @@
53
53
  "@ai-sdk/provider-utils": "^1.0.17",
54
54
  "@ai-sdk/ui-utils": "^0.0.27",
55
55
  "@anthropic-ai/sdk": "^0.24.3",
56
- "@langchain/core": "^0.2.31",
57
- "@langchain/openai": "^0.2.8",
58
56
  "@lexical/html": "0.20.0",
59
57
  "ai": "^3.3.20",
60
58
  "elevenlabs": "^0.8.2",
61
59
  "get-input-selection": "^1.1.4",
62
60
  "handlebars": "4.7.8",
63
61
  "handlebars-async-helpers": "^1.0.6",
64
- "langchain": "^0.2.17",
65
62
  "lexical": "^0.20.0",
66
63
  "locale-codes": "^1.3.1",
67
64
  "lodash.isequal": "^4.5.0",
68
65
  "openai": "^4.56.1",
69
66
  "scroll-into-view-if-needed": "^3.1.0",
70
- "textarea-caret": "^3.0.2"
67
+ "textarea-caret": "^3.0.2",
68
+ "ajv": "^8.17.1"
71
69
  },
72
70
  "devDependencies": {
73
71
  "@eslint/compat": "^1.1.1",