@ai-stack/payloadcms 3.2.8-beta → 3.2.10-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 (110) hide show
  1. package/README.md +42 -21
  2. package/dist/ai/models/anthropic/generateRichText.d.ts +1 -1
  3. package/dist/ai/models/anthropic/generateRichText.d.ts.map +1 -1
  4. package/dist/ai/models/anthropic/generateRichText.js +5 -6
  5. package/dist/ai/models/anthropic/generateRichText.js.map +1 -1
  6. package/dist/ai/models/anthropic/index.js +15 -12
  7. package/dist/ai/models/anthropic/index.js.map +1 -1
  8. package/dist/ai/models/openai/generateImage.d.ts +2 -6
  9. package/dist/ai/models/openai/generateImage.d.ts.map +1 -1
  10. package/dist/ai/models/openai/generateImage.js +19 -9
  11. package/dist/ai/models/openai/generateImage.js.map +1 -1
  12. package/dist/ai/models/openai/generateRichText.d.ts +1 -1
  13. package/dist/ai/models/openai/generateRichText.d.ts.map +1 -1
  14. package/dist/ai/models/openai/generateRichText.js +5 -6
  15. package/dist/ai/models/openai/generateRichText.js.map +1 -1
  16. package/dist/ai/models/openai/index.d.ts.map +1 -1
  17. package/dist/ai/models/openai/index.js +133 -4
  18. package/dist/ai/models/openai/index.js.map +1 -1
  19. package/dist/ai/prompts.js +6 -6
  20. package/dist/ai/prompts.js.map +1 -1
  21. package/dist/ai/schemas/lexicalJsonSchema.d.ts +20 -370
  22. package/dist/ai/schemas/lexicalJsonSchema.d.ts.map +1 -1
  23. package/dist/ai/schemas/lexicalJsonSchema.js +81 -9
  24. package/dist/ai/schemas/lexicalJsonSchema.js.map +1 -1
  25. package/dist/ai/utils/editImagesWithOpenAI.d.ts +11 -0
  26. package/dist/ai/utils/editImagesWithOpenAI.d.ts.map +1 -0
  27. package/dist/ai/utils/editImagesWithOpenAI.js +37 -0
  28. package/dist/ai/utils/editImagesWithOpenAI.js.map +1 -0
  29. package/dist/ai/utils/filterEditorSchemaByNodes.d.ts +72 -0
  30. package/dist/ai/utils/filterEditorSchemaByNodes.d.ts.map +1 -0
  31. package/dist/ai/utils/filterEditorSchemaByNodes.js +43 -0
  32. package/dist/ai/utils/filterEditorSchemaByNodes.js.map +1 -0
  33. package/dist/ai/utils/isObjectSchema.d.ts +3 -0
  34. package/dist/ai/utils/isObjectSchema.d.ts.map +1 -0
  35. package/dist/ai/utils/isObjectSchema.js +5 -0
  36. package/dist/ai/utils/isObjectSchema.js.map +1 -0
  37. package/dist/collections/Instructions.d.ts.map +1 -1
  38. package/dist/collections/Instructions.js +43 -29
  39. package/dist/collections/Instructions.js.map +1 -1
  40. package/dist/defaults.d.ts +1 -1
  41. package/dist/defaults.js +1 -1
  42. package/dist/defaults.js.map +1 -1
  43. package/dist/endpoints/fetchFields.d.ts +2 -1
  44. package/dist/endpoints/fetchFields.d.ts.map +1 -1
  45. package/dist/endpoints/fetchFields.js +33 -17
  46. package/dist/endpoints/fetchFields.js.map +1 -1
  47. package/dist/endpoints/index.d.ts.map +1 -1
  48. package/dist/endpoints/index.js +65 -15
  49. package/dist/endpoints/index.js.map +1 -1
  50. package/dist/fields/ComposeField/ComposeField.js +3 -2
  51. package/dist/fields/ComposeField/ComposeField.js.map +1 -1
  52. package/dist/fields/LexicalEditor/ComposeFeatureComponent.d.ts.map +1 -1
  53. package/dist/fields/LexicalEditor/ComposeFeatureComponent.js +3 -2
  54. package/dist/fields/LexicalEditor/ComposeFeatureComponent.js.map +1 -1
  55. package/dist/fields/PromptEditorField/PromptEditorField.d.ts.map +1 -1
  56. package/dist/fields/PromptEditorField/PromptEditorField.js +46 -16
  57. package/dist/fields/PromptEditorField/PromptEditorField.js.map +1 -1
  58. package/dist/fields/PromptEditorField/defaultStyle.d.ts +50 -0
  59. package/dist/fields/PromptEditorField/defaultStyle.d.ts.map +1 -0
  60. package/dist/fields/PromptEditorField/defaultStyle.js +51 -0
  61. package/dist/fields/PromptEditorField/defaultStyle.js.map +1 -0
  62. package/dist/init.d.ts.map +1 -1
  63. package/dist/init.js +5 -3
  64. package/dist/init.js.map +1 -1
  65. package/dist/plugin.js +3 -3
  66. package/dist/plugin.js.map +1 -1
  67. package/dist/providers/InstructionsProvider/InstructionsProvider.d.ts +3 -0
  68. package/dist/providers/InstructionsProvider/InstructionsProvider.d.ts.map +1 -1
  69. package/dist/providers/InstructionsProvider/InstructionsProvider.js +14 -4
  70. package/dist/providers/InstructionsProvider/InstructionsProvider.js.map +1 -1
  71. package/dist/providers/InstructionsProvider/useInstructions.d.ts.map +1 -1
  72. package/dist/providers/InstructionsProvider/useInstructions.js +54 -29
  73. package/dist/providers/InstructionsProvider/useInstructions.js.map +1 -1
  74. package/dist/types.d.ts +28 -3
  75. package/dist/types.d.ts.map +1 -1
  76. package/dist/types.js.map +1 -1
  77. package/dist/ui/Compose/Compose.d.ts +2 -1
  78. package/dist/ui/Compose/Compose.d.ts.map +1 -1
  79. package/dist/ui/Compose/Compose.js +7 -6
  80. package/dist/ui/Compose/Compose.js.map +1 -1
  81. package/dist/ui/Compose/hooks/menu/TranslateMenu.d.ts.map +1 -1
  82. package/dist/ui/Compose/hooks/menu/TranslateMenu.js +4 -0
  83. package/dist/ui/Compose/hooks/menu/TranslateMenu.js.map +1 -1
  84. package/dist/ui/Compose/hooks/menu/useMenu.d.ts +2 -2
  85. package/dist/ui/Compose/hooks/menu/useMenu.d.ts.map +1 -1
  86. package/dist/ui/Compose/hooks/menu/useMenu.js +9 -4
  87. package/dist/ui/Compose/hooks/menu/useMenu.js.map +1 -1
  88. package/dist/ui/Compose/hooks/useGenerate.d.ts.map +1 -1
  89. package/dist/ui/Compose/hooks/useGenerate.js +11 -4
  90. package/dist/ui/Compose/hooks/useGenerate.js.map +1 -1
  91. package/dist/utilities/extractImageData.d.ts +10 -0
  92. package/dist/utilities/extractImageData.d.ts.map +1 -0
  93. package/dist/utilities/extractImageData.js +22 -0
  94. package/dist/utilities/extractImageData.js.map +1 -0
  95. package/dist/utilities/isPluginActivated.d.ts +1 -1
  96. package/dist/utilities/isPluginActivated.d.ts.map +1 -1
  97. package/dist/utilities/isPluginActivated.js.map +1 -1
  98. package/dist/utilities/setSafeLexicalState.js +5 -2
  99. package/dist/utilities/setSafeLexicalState.js.map +1 -1
  100. package/package.json +19 -14
  101. package/dist/ai/models/example-prompt-rich-text.md +0 -47
  102. package/dist/ai/models/example.d.ts +0 -73
  103. package/dist/ai/models/example.d.ts.map +0 -1
  104. package/dist/ai/models/example.js +0 -126
  105. package/dist/ai/models/example.js.map +0 -1
  106. package/dist/libraries/autocomplete/AutocompleteTextArea.d.ts +0 -8
  107. package/dist/libraries/autocomplete/AutocompleteTextArea.d.ts.map +0 -1
  108. package/dist/libraries/autocomplete/AutocompleteTextArea.js +0 -437
  109. package/dist/libraries/autocomplete/AutocompleteTextArea.js.map +0 -1
  110. package/dist/libraries/autocomplete/AutocompleteTextArea.module.scss +0 -35
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../src/ui/Compose/hooks/menu/useMenu.tsx"],"sourcesContent":["'use client'\n\nimport { useField } from '@payloadcms/ui'\nimport React, { useEffect, useMemo, useState } from 'react'\n\nimport type { ActionMenuItems, UseMenuEvents } from '../../../../types.js'\n\nimport { useFieldProps } from '../../../../providers/FieldProvider/useFieldProps.js'\nimport { Compose, Proofread, Rephrase } from './items.js'\nimport { menuItemsMap } from './itemsMap.js'\nimport styles from './menu.module.scss'\n\nconst getActiveComponent = (ac) => {\n switch (ac) {\n case 'Proofread':\n return Proofread\n case 'Rephrase':\n return Rephrase\n case 'Compose':\n return Compose\n default:\n return Rephrase\n }\n}\n\nexport const useMenu = (menuEvents: UseMenuEvents) => {\n const { type: fieldType, path: pathFromContext } = useFieldProps()\n const field = useField({ path: pathFromContext })\n const [activeComponent, setActiveComponent] = useState<ActionMenuItems>('Rephrase')\n\n const { initialValue, value } = field\n\n useEffect(() => {\n if (!value) {\n setActiveComponent('Compose')\n return\n }\n\n if (menuItemsMap.some((i) => i.excludedFor?.includes(fieldType))) {\n setActiveComponent('Compose')\n return\n }\n\n if (typeof value === 'string' && value !== initialValue) {\n setActiveComponent('Proofread')\n } else {\n setActiveComponent('Rephrase')\n }\n }, [initialValue, value, fieldType])\n\n const MemoizedActiveComponent = useMemo(() => {\n return ({ isLoading, stop }) => {\n const ActiveComponent = getActiveComponent(activeComponent)\n const activeItem = menuItemsMap.find((i) => i.name === activeComponent)\n return (\n <ActiveComponent\n hideIcon\n onClick={(data) => {\n if (!isLoading) {\n const trigger = menuEvents[`on${activeComponent}`]\n if (typeof trigger === 'function') {\n trigger(data)\n } else {\n console.error('No trigger found for', activeComponent)\n }\n } else {\n stop()\n }\n }}\n title={isLoading ? 'Click to stop' : activeItem.name}\n >\n {isLoading && activeItem.loadingText}\n </ActiveComponent>\n )\n }\n }, [activeComponent])\n\n const filteredMenuItems = useMemo(\n () =>\n menuItemsMap.filter((i) => i.name !== activeComponent && !i.excludedFor?.includes(fieldType)),\n [activeComponent, fieldType],\n )\n\n const MemoizedMenu = useMemo(() => {\n return ({ isLoading, onClose }) => (\n <div className={styles.menu}>\n {filteredMenuItems.map((i) => {\n const Action = i.component\n return (\n <Action\n disabled={isLoading}\n key={i.name}\n onClick={(data) => {\n if (i.name !== 'Settings') {\n setActiveComponent(i.name)\n }\n\n menuEvents[`on${i.name}`](data)\n onClose()\n }}\n >\n {isLoading && i.loadingText}\n </Action>\n )\n })}\n </div>\n )\n }, [filteredMenuItems])\n\n return {\n ActiveComponent: MemoizedActiveComponent,\n Menu: MemoizedMenu,\n }\n}\n"],"names":["useField","React","useEffect","useMemo","useState","useFieldProps","Compose","Proofread","Rephrase","menuItemsMap","styles","getActiveComponent","ac","useMenu","menuEvents","type","fieldType","path","pathFromContext","field","activeComponent","setActiveComponent","initialValue","value","some","i","excludedFor","includes","MemoizedActiveComponent","isLoading","stop","ActiveComponent","activeItem","find","name","hideIcon","onClick","data","trigger","console","error","title","loadingText","filteredMenuItems","filter","MemoizedMenu","onClose","div","className","menu","map","Action","component","disabled","Menu"],"mappings":"AAAA;;AAEA,SAASA,QAAQ,QAAQ,iBAAgB;AACzC,OAAOC,SAASC,SAAS,EAAEC,OAAO,EAAEC,QAAQ,QAAQ,QAAO;AAI3D,SAASC,aAAa,QAAQ,uDAAsD;AACpF,SAASC,OAAO,EAAEC,SAAS,EAAEC,QAAQ,QAAQ,aAAY;AACzD,SAASC,YAAY,QAAQ,gBAAe;AAC5C,OAAOC,YAAY,qBAAoB;AAEvC,MAAMC,qBAAqB,CAACC;IAC1B,OAAQA;QACN,KAAK;YACH,OAAOL;QACT,KAAK;YACH,OAAOC;QACT,KAAK;YACH,OAAOF;QACT;YACE,OAAOE;IACX;AACF;AAEA,OAAO,MAAMK,UAAU,CAACC;IACtB,MAAM,EAAEC,MAAMC,SAAS,EAAEC,MAAMC,eAAe,EAAE,GAAGb;IACnD,MAAMc,QAAQnB,SAAS;QAAEiB,MAAMC;IAAgB;IAC/C,MAAM,CAACE,iBAAiBC,mBAAmB,GAAGjB,SAA0B;IAExE,MAAM,EAAEkB,YAAY,EAAEC,KAAK,EAAE,GAAGJ;IAEhCjB,UAAU;QACR,IAAI,CAACqB,OAAO;YACVF,mBAAmB;YACnB;QACF;QAEA,IAAIZ,aAAae,IAAI,CAAC,CAACC,IAAMA,EAAEC,WAAW,EAAEC,SAASX,aAAa;YAChEK,mBAAmB;YACnB;QACF;QAEA,IAAI,OAAOE,UAAU,YAAYA,UAAUD,cAAc;YACvDD,mBAAmB;QACrB,OAAO;YACLA,mBAAmB;QACrB;IACF,GAAG;QAACC;QAAcC;QAAOP;KAAU;IAEnC,MAAMY,0BAA0BzB,QAAQ;QACtC,OAAO,CAAC,EAAE0B,SAAS,EAAEC,IAAI,EAAE;YACzB,MAAMC,kBAAkBpB,mBAAmBS;YAC3C,MAAMY,aAAavB,aAAawB,IAAI,CAAC,CAACR,IAAMA,EAAES,IAAI,KAAKd;YACvD,qBACE,KAACW;gBACCI,QAAQ;gBACRC,SAAS,CAACC;oBACR,IAAI,CAACR,WAAW;wBACd,MAAMS,UAAUxB,UAAU,CAAC,CAAC,EAAE,EAAEM,iBAAiB,CAAC;wBAClD,IAAI,OAAOkB,YAAY,YAAY;4BACjCA,QAAQD;wBACV,OAAO;4BACLE,QAAQC,KAAK,CAAC,wBAAwBpB;wBACxC;oBACF,OAAO;wBACLU;oBACF;gBACF;gBACAW,OAAOZ,YAAY,kBAAkBG,WAAWE,IAAI;0BAEnDL,aAAaG,WAAWU,WAAW;;QAG1C;IACF,GAAG;QAACtB;KAAgB;IAEpB,MAAMuB,oBAAoBxC,QACxB,IACEM,aAAamC,MAAM,CAAC,CAACnB,IAAMA,EAAES,IAAI,KAAKd,mBAAmB,CAACK,EAAEC,WAAW,EAAEC,SAASX,aACpF;QAACI;QAAiBJ;KAAU;IAG9B,MAAM6B,eAAe1C,QAAQ;QAC3B,OAAO,CAAC,EAAE0B,SAAS,EAAEiB,OAAO,EAAE,iBAC5B,KAACC;gBAAIC,WAAWtC,OAAOuC,IAAI;0BACxBN,kBAAkBO,GAAG,CAAC,CAACzB;oBACtB,MAAM0B,SAAS1B,EAAE2B,SAAS;oBAC1B,qBACE,KAACD;wBACCE,UAAUxB;wBAEVO,SAAS,CAACC;4BACR,IAAIZ,EAAES,IAAI,KAAK,YAAY;gCACzBb,mBAAmBI,EAAES,IAAI;4BAC3B;4BAEApB,UAAU,CAAC,CAAC,EAAE,EAAEW,EAAES,IAAI,EAAE,CAAC,CAACG;4BAC1BS;wBACF;kCAECjB,aAAaJ,EAAEiB,WAAW;uBAVtBjB,EAAES,IAAI;gBAajB;;IAGN,GAAG;QAACS;KAAkB;IAEtB,OAAO;QACLZ,iBAAiBH;QACjB0B,MAAMT;IACR;AACF,EAAC"}
1
+ {"version":3,"sources":["../../../../../src/ui/Compose/hooks/menu/useMenu.tsx"],"sourcesContent":["'use client'\n\nimport { useField } from '@payloadcms/ui'\nimport React, { useEffect, useMemo, useState } from 'react'\n\nimport type { ActionMenuItems, UseMenuEvents, UseMenuOptions } from '../../../../types.js'\n\nimport { useFieldProps } from '../../../../providers/FieldProvider/useFieldProps.js'\nimport { Compose, Proofread, Rephrase } from './items.js'\nimport { menuItemsMap } from './itemsMap.js'\nimport styles from './menu.module.scss'\n\nconst getActiveComponent = (ac) => {\n switch (ac) {\n case 'Proofread':\n return Proofread\n case 'Rephrase':\n return Rephrase\n case 'Compose':\n return Compose\n default:\n return Rephrase\n }\n}\n\nexport const useMenu = (menuEvents: UseMenuEvents, options: UseMenuOptions) => {\n const { type: fieldType, path: pathFromContext } = useFieldProps()\n const field = useField({ path: pathFromContext })\n const [activeComponent, setActiveComponent] = useState<ActionMenuItems>('Rephrase')\n\n const { initialValue, value } = field\n\n useEffect(() => {\n if (!value) {\n setActiveComponent('Compose')\n return\n }\n\n if (menuItemsMap.some((i) => i.excludedFor?.includes(fieldType))) {\n setActiveComponent('Compose')\n return\n }\n\n if (typeof value === 'string' && value !== initialValue) {\n setActiveComponent('Proofread')\n } else {\n setActiveComponent('Rephrase')\n }\n }, [initialValue, value, fieldType])\n\n const MemoizedActiveComponent = useMemo(() => {\n return ({ isLoading, stop }) => {\n const ActiveComponent = getActiveComponent(activeComponent)\n const activeItem = menuItemsMap.find((i) => i.name === activeComponent)\n return (\n <ActiveComponent\n hideIcon\n onClick={(data) => {\n if (!isLoading) {\n const trigger = menuEvents[`on${activeComponent}`]\n if (typeof trigger === 'function') {\n trigger(data)\n } else {\n console.error('No trigger found for', activeComponent)\n }\n } else {\n stop()\n }\n }}\n title={isLoading ? 'Click to stop' : activeItem.name}\n >\n {isLoading && activeItem.loadingText}\n </ActiveComponent>\n )\n }\n }, [activeComponent])\n\n const filteredMenuItems = useMemo(\n () =>\n menuItemsMap.filter((i) => {\n if (i.name === 'Settings' && !options.isConfigAllowed) return false // Disable settings if a user role is not permitted\n return i.name !== activeComponent && !i.excludedFor?.includes(fieldType)\n }),\n [activeComponent, fieldType, options.isConfigAllowed],\n )\n\n const MemoizedMenu = useMemo(() => {\n return ({ isLoading, onClose }) => (\n <div className={styles.menu}>\n {filteredMenuItems.map((i) => {\n const Action = i.component\n return (\n <Action\n disabled={isLoading}\n key={i.name}\n onClick={(data) => {\n if (i.name !== 'Settings') {\n setActiveComponent(i.name)\n }\n\n menuEvents[`on${i.name}`]?.(data)\n onClose()\n }}\n >\n {isLoading && i.loadingText}\n </Action>\n )\n })}\n </div>\n )\n }, [filteredMenuItems])\n\n return {\n ActiveComponent: MemoizedActiveComponent,\n Menu: MemoizedMenu,\n }\n}\n"],"names":["useField","React","useEffect","useMemo","useState","useFieldProps","Compose","Proofread","Rephrase","menuItemsMap","styles","getActiveComponent","ac","useMenu","menuEvents","options","type","fieldType","path","pathFromContext","field","activeComponent","setActiveComponent","initialValue","value","some","i","excludedFor","includes","MemoizedActiveComponent","isLoading","stop","ActiveComponent","activeItem","find","name","hideIcon","onClick","data","trigger","console","error","title","loadingText","filteredMenuItems","filter","isConfigAllowed","MemoizedMenu","onClose","div","className","menu","map","Action","component","disabled","Menu"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"useGenerate.d.ts","sourceRoot":"","sources":["../../../../src/ui/Compose/hooks/useGenerate.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,eAAe,EAAoB,MAAM,mBAAmB,CAAA;AAa1E,KAAK,oBAAoB,GAAG;IAAE,MAAM,EAAE,eAAe,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,CAAA;AAEzE,eAAO,MAAM,WAAW,GAAI,mBAAmB;IAAE,aAAa,EAAE,MAAM,CAAA;CAAE;yBA2MnD,oBAAoB;;;CA2BxC,CAAA"}
1
+ {"version":3,"file":"useGenerate.d.ts","sourceRoot":"","sources":["../../../../src/ui/Compose/hooks/useGenerate.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,eAAe,EAAoB,MAAM,mBAAmB,CAAA;AAa1E,KAAK,oBAAoB,GAAG;IAAE,MAAM,EAAE,eAAe,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,CAAA;AAEzE,eAAO,MAAM,WAAW,GAAI,mBAAmB;IAAE,aAAa,EAAE,MAAM,CAAA;CAAE;yBAgNnD,oBAAoB;;;CA2BxC,CAAA"}
@@ -1,7 +1,7 @@
1
+ import { useCompletion, experimental_useObject as useObject } from '@ai-sdk/react';
1
2
  import { useEditorConfigContext } from '@payloadcms/richtext-lexical/client';
2
- import { useConfig, useField, useForm, useLocale } from '@payloadcms/ui';
3
+ import { useConfig, useDocumentInfo, useField, useForm, useLocale } from '@payloadcms/ui';
3
4
  import { jsonSchema } from 'ai';
4
- import { useCompletion, experimental_useObject as useObject } from 'ai/react';
5
5
  import { useCallback, useEffect, useMemo, useRef } 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';
@@ -27,6 +27,7 @@ export const useGenerate = ({ instructionId })=>{
27
27
  });
28
28
  const { set: setHistory } = useHistory();
29
29
  const { getData } = useForm();
30
+ const { id: documentId, collectionSlug } = useDocumentInfo();
30
31
  const localFromContext = useLocale();
31
32
  const { config: { collections } } = useConfig();
32
33
  const collection = collections.find((collection)=>collection.slug === PLUGIN_INSTRUCTIONS_TABLE);
@@ -109,6 +110,7 @@ export const useGenerate = ({ instructionId })=>{
109
110
  instructionId: currentInstructionId
110
111
  };
111
112
  submit({
113
+ allowedEditorNodes: Array.from(editor?._nodes?.keys() || []),
112
114
  doc,
113
115
  locale: localFromContext?.code,
114
116
  options
@@ -143,7 +145,9 @@ export const useGenerate = ({ instructionId })=>{
143
145
  const currentInstructionId = instructionIdRef.current;
144
146
  return fetch(`${serverURL}${api}${PLUGIN_API_ENDPOINT_GENERATE_UPLOAD}`, {
145
147
  body: JSON.stringify({
148
+ collectionSlug,
146
149
  doc,
150
+ documentId,
147
151
  locale: localFromContext?.code,
148
152
  options: {
149
153
  instructionId: currentInstructionId
@@ -168,13 +172,16 @@ export const useGenerate = ({ instructionId })=>{
168
172
  }
169
173
  return uploadResponse;
170
174
  }).catch((error)=>{
171
- console.error('Error generating or setting your upload, please set it manually if its saved in your media files: ', error);
175
+ console.warn('Error generating or setting your upload, please set it manually if its saved in your media files.');
176
+ console.error(error);
172
177
  });
173
178
  }, [
174
179
  getData,
175
180
  localFromContext?.code,
176
181
  instructionIdRef,
177
- setValue
182
+ setValue,
183
+ documentId,
184
+ collectionSlug
178
185
  ]);
179
186
  const generate = useCallback(async (options)=>{
180
187
  if (type === 'richText') {
@@ -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, useRef } 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 // Create a ref to hold the current instructionId\n const instructionIdRef = useRef(instructionId)\n\n // Update the ref whenever instructionId changes\n useEffect(() => {\n instructionIdRef.current = instructionId\n }, [instructionId])\n\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, editor])\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\n const currentInstructionId = instructionIdRef.current\n\n const options = {\n action,\n actionParams: params,\n instructionId: currentInstructionId,\n }\n\n submit({\n doc,\n locale: localFromContext?.code,\n options,\n })\n },\n [localFromContext?.code, instructionIdRef],\n )\n\n const streamText = useCallback(\n async ({ action = 'Compose', params }: ActionCallbackParams) => {\n const doc = getData()\n const currentInstructionId = instructionIdRef.current\n\n const options = {\n action,\n actionParams: params,\n instructionId: currentInstructionId,\n }\n\n await complete('', {\n body: {\n doc,\n locale: localFromContext?.code,\n options,\n },\n })\n },\n [getData, localFromContext?.code, instructionIdRef, complete],\n )\n\n const generateUpload = useCallback(async () => {\n const doc = getData()\n const currentInstructionId = instructionIdRef.current\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: currentInstructionId,\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 console.log('Image updated...', result)\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(\n 'Error generating or setting your upload, please set it manually if its saved in your media files: ',\n error,\n )\n })\n }, [getData, localFromContext?.code, instructionIdRef, setValue])\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","useRef","PLUGIN_API_ENDPOINT_GENERATE","PLUGIN_API_ENDPOINT_GENERATE_UPLOAD","PLUGIN_INSTRUCTIONS_TABLE","PLUGIN_NAME","useFieldProps","editorSchemaValidator","setSafeLexicalState","useHistory","useGenerate","instructionId","instructionIdRef","current","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","currentInstructionId","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":"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"}
1
+ {"version":3,"sources":["../../../../src/ui/Compose/hooks/useGenerate.ts"],"sourcesContent":["import { useCompletion, experimental_useObject as useObject } from '@ai-sdk/react'\nimport { useEditorConfigContext } from '@payloadcms/richtext-lexical/client'\nimport { useConfig, useDocumentInfo, useField, useForm, useLocale } from '@payloadcms/ui'\nimport { jsonSchema } from 'ai'\nimport { useCallback, useEffect, useMemo, useRef } 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 // Create a ref to hold the current instructionId\n const instructionIdRef = useRef(instructionId)\n\n // Update the ref whenever instructionId changes\n useEffect(() => {\n instructionIdRef.current = instructionId\n }, [instructionId])\n\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 { id: documentId, collectionSlug } = useDocumentInfo()\n\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, editor])\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\n const currentInstructionId = instructionIdRef.current\n\n const options = {\n action,\n actionParams: params,\n instructionId: currentInstructionId,\n }\n\n submit({\n allowedEditorNodes: Array.from(editor?._nodes?.keys() || []),\n doc,\n locale: localFromContext?.code,\n options,\n })\n },\n [localFromContext?.code, instructionIdRef],\n )\n\n const streamText = useCallback(\n async ({ action = 'Compose', params }: ActionCallbackParams) => {\n const doc = getData()\n const currentInstructionId = instructionIdRef.current\n\n const options = {\n action,\n actionParams: params,\n instructionId: currentInstructionId,\n }\n\n await complete('', {\n body: {\n doc,\n locale: localFromContext?.code,\n options,\n },\n })\n },\n [getData, localFromContext?.code, instructionIdRef, complete],\n )\n\n const generateUpload = useCallback(async () => {\n const doc = getData()\n const currentInstructionId = instructionIdRef.current\n\n return fetch(`${serverURL}${api}${PLUGIN_API_ENDPOINT_GENERATE_UPLOAD}`, {\n body: JSON.stringify({\n collectionSlug,\n doc,\n documentId,\n locale: localFromContext?.code,\n options: {\n instructionId: currentInstructionId,\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 console.log('Image updated...', result)\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.warn(\n 'Error generating or setting your upload, please set it manually if its saved in your media files.',\n )\n console.error(error)\n })\n }, [getData, localFromContext?.code, instructionIdRef, setValue, documentId, collectionSlug])\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":["useCompletion","experimental_useObject","useObject","useEditorConfigContext","useConfig","useDocumentInfo","useField","useForm","useLocale","jsonSchema","useCallback","useEffect","useMemo","useRef","PLUGIN_API_ENDPOINT_GENERATE","PLUGIN_API_ENDPOINT_GENERATE_UPLOAD","PLUGIN_INSTRUCTIONS_TABLE","PLUGIN_NAME","useFieldProps","editorSchemaValidator","setSafeLexicalState","useHistory","useGenerate","instructionId","instructionIdRef","current","type","path","pathFromContext","editorConfigContext","editor","config","routes","api","serverURL","setValue","set","setHistory","getData","id","documentId","collectionSlug","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","currentInstructionId","options","actionParams","allowedEditorNodes","Array","from","_nodes","keys","locale","code","streamText","body","generateUpload","fetch","JSON","stringify","credentials","headers","method","then","uploadResponse","ok","json","errors","errStr","map","message","join","catch","warn","generate","includes"],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ type ImageData = {
2
+ image: {
3
+ name: string;
4
+ type: string;
5
+ url: string;
6
+ };
7
+ }[];
8
+ export declare function extractImageData(input: string): ImageData;
9
+ export {};
10
+ //# sourceMappingURL=extractImageData.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extractImageData.d.ts","sourceRoot":"","sources":["../../src/utilities/extractImageData.ts"],"names":[],"mappings":"AAAA,KAAK,SAAS,GAAG;IACf,KAAK,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAA;CACnD,EAAE,CAAA;AAEH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,CAsBzD"}
@@ -0,0 +1,22 @@
1
+ export function extractImageData(input) {
2
+ const regex = /\/[\w%\-./]+\.(png|jpe?g|webp)/gi;
3
+ const matches = input.match(regex);
4
+ if (!matches) return [];
5
+ return matches.map((url)=>{
6
+ const decodedUrl = decodeURIComponent(url);
7
+ const parts = decodedUrl.split('/');
8
+ const filename = parts[parts.length - 1];
9
+ const name = filename.replace(/\.(png|jpe?g|webp)$/i, '');
10
+ const typeMatch = filename.match(/\.(png|jpe?g|webp)$/i);
11
+ const type = typeMatch ? typeMatch[1].toLowerCase() : 'unknown';
12
+ return {
13
+ image: {
14
+ name,
15
+ type,
16
+ url
17
+ }
18
+ };
19
+ });
20
+ }
21
+
22
+ //# sourceMappingURL=extractImageData.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/utilities/extractImageData.ts"],"sourcesContent":["type ImageData = {\n image: { name: string; type: string; url: string }\n}[]\n\nexport function extractImageData(input: string): ImageData {\n const regex = /\\/[\\w%\\-./]+\\.(png|jpe?g|webp)/gi\n const matches = input.match(regex)\n\n if (!matches) return []\n\n return matches.map((url) => {\n const decodedUrl = decodeURIComponent(url)\n const parts = decodedUrl.split('/')\n const filename = parts[parts.length - 1]\n const name = filename.replace(/\\.(png|jpe?g|webp)$/i, '')\n const typeMatch = filename.match(/\\.(png|jpe?g|webp)$/i)\n const type = typeMatch ? typeMatch[1].toLowerCase() : 'unknown'\n\n return {\n image: {\n name,\n type,\n url,\n },\n }\n })\n}\n"],"names":["extractImageData","input","regex","matches","match","map","url","decodedUrl","decodeURIComponent","parts","split","filename","length","name","replace","typeMatch","type","toLowerCase","image"],"mappings":"AAIA,OAAO,SAASA,iBAAiBC,KAAa;IAC5C,MAAMC,QAAQ;IACd,MAAMC,UAAUF,MAAMG,KAAK,CAACF;IAE5B,IAAI,CAACC,SAAS,OAAO,EAAE;IAEvB,OAAOA,QAAQE,GAAG,CAAC,CAACC;QAClB,MAAMC,aAAaC,mBAAmBF;QACtC,MAAMG,QAAQF,WAAWG,KAAK,CAAC;QAC/B,MAAMC,WAAWF,KAAK,CAACA,MAAMG,MAAM,GAAG,EAAE;QACxC,MAAMC,OAAOF,SAASG,OAAO,CAAC,wBAAwB;QACtD,MAAMC,YAAYJ,SAASP,KAAK,CAAC;QACjC,MAAMY,OAAOD,YAAYA,SAAS,CAAC,EAAE,CAACE,WAAW,KAAK;QAEtD,OAAO;YACLC,OAAO;gBACLL;gBACAG;gBACAV;YACF;QACF;IACF;AACF"}
@@ -1,3 +1,3 @@
1
- import { PluginConfig } from '../types.js';
1
+ import type { PluginConfig } from '../types.js';
2
2
  export declare const isPluginActivated: (pluginConfig: PluginConfig) => boolean;
3
3
  //# sourceMappingURL=isPluginActivated.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"isPluginActivated.d.ts","sourceRoot":"","sources":["../../src/utilities/isPluginActivated.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAE1C,eAAO,MAAM,iBAAiB,GAAI,cAAc,YAAY,YAE3D,CAAA"}
1
+ {"version":3,"file":"isPluginActivated.d.ts","sourceRoot":"","sources":["../../src/utilities/isPluginActivated.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAI/C,eAAO,MAAM,iBAAiB,GAAI,cAAc,YAAY,YAE3D,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utilities/isPluginActivated.ts"],"sourcesContent":["import { getGenerationModels } from './getGenerationModels.js'\nimport { PluginConfig } from '../types.js'\n\nexport const isPluginActivated = (pluginConfig: PluginConfig) => {\n return getGenerationModels(pluginConfig).length > 0\n}\n"],"names":["getGenerationModels","isPluginActivated","pluginConfig","length"],"mappings":"AAAA,SAASA,mBAAmB,QAAQ,2BAA0B;AAG9D,OAAO,MAAMC,oBAAoB,CAACC;IAChC,OAAOF,oBAAoBE,cAAcC,MAAM,GAAG;AACpD,EAAC"}
1
+ {"version":3,"sources":["../../src/utilities/isPluginActivated.ts"],"sourcesContent":["import type { PluginConfig } from '../types.js'\n\nimport { getGenerationModels } from './getGenerationModels.js'\n\nexport const isPluginActivated = (pluginConfig: PluginConfig) => {\n return getGenerationModels(pluginConfig).length > 0\n}\n"],"names":["getGenerationModels","isPluginActivated","pluginConfig","length"],"mappings":"AAEA,SAASA,mBAAmB,QAAQ,2BAA0B;AAE9D,OAAO,MAAMC,oBAAoB,CAACC;IAChC,OAAOF,oBAAoBE,cAAcC,MAAM,GAAG;AACpD,EAAC"}
@@ -5,8 +5,11 @@ export const setSafeLexicalState = (state, editorInstance, action = 'replace')=>
5
5
  return;
6
6
  }
7
7
  editorInstance.setEditorState(editorState);
8
- } catch (e) {
9
- console.error('Error setting editor state: ', e);
8
+ } catch (error) {
9
+ console.error('Error setting editor state: ', {
10
+ error,
11
+ state
12
+ });
10
13
  }
11
14
  };
12
15
 
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utilities/setSafeLexicalState.ts"],"sourcesContent":["import type { LexicalEditor } from 'lexical'\n\ntype EditorAction = 'replace' | 'update'\n\nexport const setSafeLexicalState = (\n state,\n editorInstance: LexicalEditor,\n action: EditorAction = 'replace',\n) => {\n try {\n const editorState = editorInstance.parseEditorState(state)\n if (editorState.isEmpty()) {\n return\n }\n\n editorInstance.setEditorState(editorState)\n } catch (e) {\n console.error('Error setting editor state: ', e)\n }\n}\n"],"names":["setSafeLexicalState","state","editorInstance","action","editorState","parseEditorState","isEmpty","setEditorState","e","console","error"],"mappings":"AAIA,OAAO,MAAMA,sBAAsB,CACjCC,OACAC,gBACAC,SAAuB,SAAS;IAEhC,IAAI;QACF,MAAMC,cAAcF,eAAeG,gBAAgB,CAACJ;QACpD,IAAIG,YAAYE,OAAO,IAAI;YACzB;QACF;QAEAJ,eAAeK,cAAc,CAACH;IAChC,EAAE,OAAOI,GAAG;QACVC,QAAQC,KAAK,CAAC,gCAAgCF;IAChD;AACF,EAAC"}
1
+ {"version":3,"sources":["../../src/utilities/setSafeLexicalState.ts"],"sourcesContent":["import type { LexicalEditor } from 'lexical'\n\ntype EditorAction = 'replace' | 'update'\n\nexport const setSafeLexicalState = (\n state,\n editorInstance: LexicalEditor,\n action: EditorAction = 'replace',\n) => {\n try {\n const editorState = editorInstance.parseEditorState(state)\n if (editorState.isEmpty()) {\n return\n }\n\n editorInstance.setEditorState(editorState)\n } catch (error) {\n console.error('Error setting editor state: ', { error, state })\n }\n}\n"],"names":["setSafeLexicalState","state","editorInstance","action","editorState","parseEditorState","isEmpty","setEditorState","error","console"],"mappings":"AAIA,OAAO,MAAMA,sBAAsB,CACjCC,OACAC,gBACAC,SAAuB,SAAS;IAEhC,IAAI;QACF,MAAMC,cAAcF,eAAeG,gBAAgB,CAACJ;QACpD,IAAIG,YAAYE,OAAO,IAAI;YACzB;QACF;QAEAJ,eAAeK,cAAc,CAACH;IAChC,EAAE,OAAOI,OAAO;QACdC,QAAQD,KAAK,CAAC,gCAAgC;YAAEA;YAAOP;QAAM;IAC/D;AACF,EAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ai-stack/payloadcms",
3
- "version": "3.2.8-beta",
3
+ "version": "3.2.10-beta",
4
4
  "private": false,
5
5
  "bugs": "https://github.com/ashbuilds/payload-ai/issues",
6
6
  "repository": "https://github.com/ashbuilds/payload-ai",
@@ -17,7 +17,8 @@
17
17
  "payloadcms",
18
18
  "smart-generation",
19
19
  "ai-translate",
20
- "ai-writing-tool"
20
+ "ai-writing-tool",
21
+ "gpt-image-1"
21
22
  ],
22
23
  "type": "module",
23
24
  "main": "./dist/index.js",
@@ -48,22 +49,24 @@
48
49
  "dist"
49
50
  ],
50
51
  "dependencies": {
51
- "@ai-sdk/anthropic": "^0.0.38",
52
- "@ai-sdk/openai": "^0.0.43",
53
- "@ai-sdk/provider-utils": "^1.0.17",
54
- "@ai-sdk/ui-utils": "^0.0.27",
55
- "@anthropic-ai/sdk": "^0.24.3",
56
- "ai": "^3.3.20",
52
+ "@ai-sdk/anthropic": "^1.2.10",
53
+ "@ai-sdk/openai": "^1.3.21",
54
+ "@ai-sdk/provider-utils": "^2.2.7",
55
+ "@ai-sdk/react": "^1.2.11",
56
+ "@ai-sdk/ui-utils": "^1.2.10",
57
+ "@anthropic-ai/sdk": "^0.40.1",
58
+ "ai": "^4.3.13",
59
+ "ajv": "^8.17.1",
57
60
  "elevenlabs": "^0.8.2",
58
61
  "get-input-selection": "^1.1.4",
59
62
  "handlebars": "4.7.8",
60
63
  "handlebars-async-helpers": "^1.0.6",
61
64
  "locale-codes": "^1.3.1",
62
65
  "lodash.isequal": "^4.5.0",
63
- "openai": "^4.56.1",
66
+ "openai": "^4.97.0",
67
+ "react-mentions": "^4.4.10",
64
68
  "scroll-into-view-if-needed": "^3.1.0",
65
- "textarea-caret": "^3.0.2",
66
- "ajv": "^8.17.1"
69
+ "textarea-caret": "^3.0.2"
67
70
  },
68
71
  "devDependencies": {
69
72
  "@eslint/compat": "^1.1.1",
@@ -71,8 +74,10 @@
71
74
  "@swc/cli": "0.4.0",
72
75
  "@types/dot-object": "2.1.6",
73
76
  "@types/handlebars": "^4.1.0",
77
+ "@types/json-schema": "^7.0.15",
74
78
  "@types/react": "npm:types-react@19.0.0-beta.2",
75
79
  "@types/react-dom": "npm:types-react-dom@19.0.0-beta.2",
80
+ "@types/react-mentions": "^4.4.1",
76
81
  "@typescript-eslint/eslint-plugin": "^7.18.0",
77
82
  "@typescript-eslint/parser": "^7.18.0",
78
83
  "copyfiles": "2.4.1",
@@ -95,12 +100,12 @@
95
100
  "typescript-eslint": "^7.18.0"
96
101
  },
97
102
  "peerDependencies": {
103
+ "@lexical/html": "^0.28.0",
98
104
  "@payloadcms/richtext-lexical": "^3.31.0",
99
105
  "@payloadcms/translations": "^3.31.0",
100
106
  "@payloadcms/ui": "^3.31.0",
101
- "payload": "^3.31.0",
102
- "@lexical/html": "^0.28.0",
103
- "lexical": "^0.28.0"
107
+ "lexical": "^0.28.0",
108
+ "payload": "^3.31.0"
104
109
  },
105
110
  "publishConfig": {
106
111
  "@ai-stack:registry": "https://registry.npmjs.org",
@@ -1,47 +0,0 @@
1
- # Comprehensive Blog Writing Prompt
2
-
3
- Create an engaging and informative blog post on the topic of **{{ title }}**. Your writing should be well-structured, authoritative, and seamlessly incorporate the provided product information.
4
-
5
- ## Structure and Style:
6
-
7
- 1. Begin with a compelling introduction that hooks the reader and outlines the main points you'll cover.
8
- 2. Divide the main body into 3-5 distinct sections, each exploring a different aspect of the topic.
9
- 3. Conclude with a summary of key takeaways and a call-to-action for readers.
10
- 4. Use appropriate headings (H2, H3) to organize your content.
11
- 5. Employ text styling techniques to enhance readability and emphasize important points:
12
- - **Bold** for key concepts or product names
13
- - *Italic* for emphasis or introducing new terms
14
- - ~~Strikethrough~~ for contrasts or outdated information
15
- - `Code formatting` for technical terms or product codes
16
-
17
- ## Product Integration:
18
-
19
- Incorporate the following products naturally throughout your blog post:
20
-
21
- {{#each resources}}
22
- - **Product URL**: {{this.url}}
23
- **Product Details**: {{this.data}}
24
-
25
- Seamlessly weave this product's features and benefits into your content where relevant. Use it to support your points, provide examples, or offer solutions related to the blog topic.
26
-
27
- {{/each}}
28
-
29
- ## Linking Products:
30
-
31
- When mentioning each product in your content, create a hyperlink to its corresponding URL. Use descriptive anchor text that naturally fits within the sentence. For example:
32
-
33
- - "The [innovative features of Product X](product-x-url) make it an excellent choice for..."
34
- - "Learn more about [how Product Y can streamline your workflow](product-y-url)."
35
-
36
- Ensure that each product is linked at least once within the blog post, preferably where it's most relevant to the surrounding content.
37
-
38
- ## Additional Guidelines:
39
-
40
- 1. Maintain a conversational yet professional tone throughout the post.
41
- 2. Include relevant statistics, examples, or case studies to support your points.
42
- 3. Address potential questions or concerns your readers might have about the topic.
43
- 4. Use transition phrases to ensure smooth flow between paragraphs and sections.
44
- 5. Proofread for grammar, spelling, and clarity before submitting.
45
- 6. Double-check that all product links are correctly inserted and functional.
46
-
47
- Remember to craft your content in a way that provides value to the reader while organically showcasing the listed products. Aim for a blog post length of 800-1200 words, adjusting as necessary to fully explore the topic and incorporate all products effectively.
@@ -1,73 +0,0 @@
1
- export declare const exampleOutput: {
2
- root: {
3
- type: string;
4
- children: ({
5
- type: string;
6
- children: {
7
- type: string;
8
- format: number;
9
- text: string;
10
- }[];
11
- listType?: undefined;
12
- start?: undefined;
13
- tag?: undefined;
14
- } | {
15
- type: string;
16
- children: ({
17
- type: string;
18
- children: {
19
- type: string;
20
- text: string;
21
- }[];
22
- value: number;
23
- checked?: undefined;
24
- } | {
25
- type: string;
26
- checked: boolean;
27
- children: {
28
- type: string;
29
- text: string;
30
- }[];
31
- value: number;
32
- })[];
33
- listType: string;
34
- start: number;
35
- tag: string;
36
- } | {
37
- type: string;
38
- children: {
39
- type: string;
40
- text: string;
41
- }[];
42
- tag: string;
43
- listType?: undefined;
44
- start?: undefined;
45
- } | {
46
- type: string;
47
- children: ({
48
- type: string;
49
- text: string;
50
- id?: undefined;
51
- children?: undefined;
52
- fields?: undefined;
53
- } | {
54
- id: string;
55
- type: string;
56
- children: {
57
- type: string;
58
- text: string;
59
- }[];
60
- fields: {
61
- linkType: string;
62
- newTab: boolean;
63
- url: string;
64
- };
65
- text?: undefined;
66
- })[];
67
- listType?: undefined;
68
- start?: undefined;
69
- tag?: undefined;
70
- })[];
71
- };
72
- };
73
- //# sourceMappingURL=example.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"example.d.ts","sourceRoot":"","sources":["../../../src/ai/models/example.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2HzB,CAAA"}
@@ -1,126 +0,0 @@
1
- export const exampleOutput = {
2
- root: {
3
- type: 'root',
4
- children: [
5
- {
6
- type: 'paragraph',
7
- children: [
8
- {
9
- type: 'text',
10
- format: 0,
11
- text: 'This is an example of text '
12
- }
13
- ]
14
- },
15
- {
16
- type: 'paragraph',
17
- children: [
18
- {
19
- type: 'text',
20
- format: 0,
21
- text: 'This text has example of '
22
- },
23
- {
24
- type: 'text',
25
- format: 1,
26
- text: 'bold,'
27
- },
28
- {
29
- type: 'text',
30
- format: 2,
31
- text: 'italic,'
32
- },
33
- {
34
- type: 'text',
35
- format: 8,
36
- text: 'underline,'
37
- },
38
- {
39
- type: 'text',
40
- format: 4,
41
- text: 'strikethrough,'
42
- },
43
- {
44
- type: 'text',
45
- format: 16,
46
- text: 'code'
47
- },
48
- {
49
- type: 'text',
50
- format: 0,
51
- text: ' text types. Use these to highlight and emphasis specific content as needed.'
52
- }
53
- ]
54
- },
55
- {
56
- type: 'list',
57
- children: [
58
- {
59
- type: 'listitem',
60
- children: [
61
- {
62
- type: 'text',
63
- text: 'This is a checklist item #1'
64
- }
65
- ],
66
- value: 1
67
- },
68
- {
69
- type: 'listitem',
70
- checked: true,
71
- children: [
72
- {
73
- type: 'text',
74
- text: 'This checklist item is checked'
75
- }
76
- ],
77
- value: 2
78
- }
79
- ],
80
- listType: 'check',
81
- start: 1,
82
- tag: 'ul'
83
- },
84
- {
85
- type: 'heading',
86
- children: [
87
- {
88
- type: 'text',
89
- text: 'Heading level 1'
90
- }
91
- ],
92
- tag: 'h1'
93
- },
94
- {
95
- type: 'paragraph',
96
- children: [
97
- {
98
- type: 'text',
99
- text: 'This paragraph has a '
100
- },
101
- {
102
- id: 'unique-id-1',
103
- type: 'link',
104
- children: [
105
- {
106
- type: 'text',
107
- text: 'link'
108
- }
109
- ],
110
- fields: {
111
- linkType: 'custom',
112
- newTab: true,
113
- url: 'https://example.com'
114
- }
115
- },
116
- {
117
- type: 'text',
118
- text: ' that opens in a new tab.'
119
- }
120
- ]
121
- }
122
- ]
123
- }
124
- };
125
-
126
- //# sourceMappingURL=example.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/ai/models/example.ts"],"sourcesContent":["export const exampleOutput = {\n root: {\n type: 'root',\n children: [\n {\n type: 'paragraph',\n children: [\n {\n type: 'text',\n format: 0,\n text: 'This is an example of text ',\n },\n ],\n },\n {\n type: 'paragraph',\n children: [\n {\n type: 'text',\n format: 0,\n text: 'This text has example of ',\n },\n {\n type: 'text',\n format: 1,\n text: 'bold,',\n },\n {\n type: 'text',\n format: 2,\n text: 'italic,',\n },\n {\n type: 'text',\n format: 8,\n text: 'underline,',\n },\n {\n type: 'text',\n format: 4,\n text: 'strikethrough,',\n },\n {\n type: 'text',\n format: 16,\n text: 'code',\n },\n {\n type: 'text',\n format: 0,\n text: ' text types. Use these to highlight and emphasis specific content as needed.',\n },\n ],\n },\n {\n type: 'list',\n children: [\n {\n type: 'listitem',\n children: [\n {\n type: 'text',\n text: 'This is a checklist item #1',\n },\n ],\n value: 1,\n },\n {\n type: 'listitem',\n checked: true,\n children: [\n {\n type: 'text',\n text: 'This checklist item is checked',\n },\n ],\n value: 2,\n },\n ],\n listType: 'check',\n start: 1,\n tag: 'ul',\n },\n {\n type: 'heading',\n children: [\n {\n type: 'text',\n text: 'Heading level 1',\n },\n ],\n tag: 'h1',\n },\n {\n type: 'paragraph',\n children: [\n {\n type: 'text',\n text: 'This paragraph has a ',\n },\n {\n id: 'unique-id-1',\n type: 'link',\n children: [\n {\n type: 'text',\n text: 'link',\n },\n ],\n fields: {\n linkType: 'custom',\n newTab: true,\n url: 'https://example.com',\n },\n },\n {\n type: 'text',\n text: ' that opens in a new tab.',\n },\n ],\n },\n ],\n },\n}\n"],"names":["exampleOutput","root","type","children","format","text","value","checked","listType","start","tag","id","fields","linkType","newTab","url"],"mappings":"AAAA,OAAO,MAAMA,gBAAgB;IAC3BC,MAAM;QACJC,MAAM;QACNC,UAAU;YACR;gBACED,MAAM;gBACNC,UAAU;oBACR;wBACED,MAAM;wBACNE,QAAQ;wBACRC,MAAM;oBACR;iBACD;YACH;YACA;gBACEH,MAAM;gBACNC,UAAU;oBACR;wBACED,MAAM;wBACNE,QAAQ;wBACRC,MAAM;oBACR;oBACA;wBACEH,MAAM;wBACNE,QAAQ;wBACRC,MAAM;oBACR;oBACA;wBACEH,MAAM;wBACNE,QAAQ;wBACRC,MAAM;oBACR;oBACA;wBACEH,MAAM;wBACNE,QAAQ;wBACRC,MAAM;oBACR;oBACA;wBACEH,MAAM;wBACNE,QAAQ;wBACRC,MAAM;oBACR;oBACA;wBACEH,MAAM;wBACNE,QAAQ;wBACRC,MAAM;oBACR;oBACA;wBACEH,MAAM;wBACNE,QAAQ;wBACRC,MAAM;oBACR;iBACD;YACH;YACA;gBACEH,MAAM;gBACNC,UAAU;oBACR;wBACED,MAAM;wBACNC,UAAU;4BACR;gCACED,MAAM;gCACNG,MAAM;4BACR;yBACD;wBACDC,OAAO;oBACT;oBACA;wBACEJ,MAAM;wBACNK,SAAS;wBACTJ,UAAU;4BACR;gCACED,MAAM;gCACNG,MAAM;4BACR;yBACD;wBACDC,OAAO;oBACT;iBACD;gBACDE,UAAU;gBACVC,OAAO;gBACPC,KAAK;YACP;YACA;gBACER,MAAM;gBACNC,UAAU;oBACR;wBACED,MAAM;wBACNG,MAAM;oBACR;iBACD;gBACDK,KAAK;YACP;YACA;gBACER,MAAM;gBACNC,UAAU;oBACR;wBACED,MAAM;wBACNG,MAAM;oBACR;oBACA;wBACEM,IAAI;wBACJT,MAAM;wBACNC,UAAU;4BACR;gCACED,MAAM;gCACNG,MAAM;4BACR;yBACD;wBACDO,QAAQ;4BACNC,UAAU;4BACVC,QAAQ;4BACRC,KAAK;wBACP;oBACF;oBACA;wBACEb,MAAM;wBACNG,MAAM;oBACR;iBACD;YACH;SACD;IACH;AACF,EAAC"}
@@ -1,8 +0,0 @@
1
- /**
2
- * Credit: Yury Dymov
3
- * Github: https://github.com/yury-dymov/react-autocomplete-input
4
- *
5
- * Modified to only be use for PromptEditorField
6
- */
7
- export declare const AutocompleteTextField: (props: any) => import("react/jsx-runtime").JSX.Element;
8
- //# sourceMappingURL=AutocompleteTextArea.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"AutocompleteTextArea.d.ts","sourceRoot":"","sources":["../../../src/libraries/autocomplete/AutocompleteTextArea.tsx"],"names":[],"mappings":"AAAA;;;;;GAKG;AAmBH,eAAO,MAAM,qBAAqB,GAAI,UAAK,4CAkgB1C,CAAA"}