@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
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/ai/schemas/lexicalJsonSchema.ts"],"sourcesContent":["const CommonProperties = {\n type: 'object',\n properties: {\n children: {\n type: 'array',\n items: { $ref: '#/definitions/Node' },\n },\n direction: {\n type: ['string', 'null'],\n enum: ['ltr', null],\n },\n format: { type: 'string' },\n indent: { type: 'number' },\n version: { type: 'number' },\n },\n}\n\nconst BaseNode = {\n type: 'object',\n allOf: [{ $ref: '#/definitions/CommonProperties' }],\n properties: {\n type: { type: 'string' },\n },\n required: ['type'],\n}\n\nconst CommonNodes = {\n allOf: [\n { $ref: '#/definitions/BaseNode' },\n {\n properties: {\n type: {\n type: 'string',\n enum: ['paragraph', 'quote', 'horizontalrule'],\n },\n },\n },\n ],\n}\n\nconst HeadingNode = {\n allOf: [\n { $ref: '#/definitions/BaseNode' },\n {\n properties: {\n type: { const: 'heading' },\n tag: {\n type: 'string',\n enum: ['h1', 'h2', 'h3', 'h4'],\n },\n },\n required: ['tag'],\n },\n ],\n}\n\nconst LinkNode = {\n allOf: [\n { $ref: '#/definitions/BaseNode' },\n {\n properties: {\n id: { type: 'string' },\n type: { const: 'link' },\n fields: {\n type: 'object',\n properties: {\n linkType: { type: 'string' },\n newTab: { type: 'boolean' },\n url: { type: 'string' },\n },\n required: ['linkType', 'newTab', 'url'],\n },\n },\n required: ['id', 'fields'],\n },\n ],\n}\n\nconst ListItemNode = {\n allOf: [\n { $ref: '#/definitions/BaseNode' },\n {\n properties: {\n type: { const: 'listitem' },\n checked: { type: 'boolean' },\n value: { type: 'number' },\n },\n required: ['value'],\n },\n ],\n}\n\nconst ListNode = {\n allOf: [\n { $ref: '#/definitions/BaseNode' },\n {\n properties: {\n type: { const: 'list' },\n listType: {\n type: 'string',\n enum: ['check', 'number', 'bullet'],\n },\n start: { type: 'number' },\n tag: {\n type: 'string',\n enum: ['ul', 'ol'],\n },\n },\n required: ['listType', 'start', 'tag'],\n },\n ],\n}\n\n// const MediaNode = {\n// allOf: [\n// { $ref: '#/definitions/BaseNode' },\n// {\n// properties: {\n// type: { const: 'block' },\n// fields: {\n// type: 'object',\n// properties: {\n// id: { type: 'string' },\n// blockName: { type: 'string' },\n// blockType: { const: 'mediaBlock' },\n// media: { type: 'string' },\n// position: {\n// type: 'string',\n// enum: ['fullscreen', 'default'],\n// },\n// },\n// required: ['id', 'media', 'position', 'blockName', 'blockType'],\n// },\n// version: { const: 2 },\n// },\n// required: ['version', 'fields'],\n// },\n// ],\n// }\n\nconst Node = {\n oneOf: [\n { $ref: '#/definitions/TextNode' },\n { $ref: '#/definitions/LinkNode' },\n { $ref: '#/definitions/ListItemNode' },\n { $ref: '#/definitions/ListNode' },\n { $ref: '#/definitions/HeadingNode' },\n { $ref: '#/definitions/CommonNodes' },\n ],\n}\n\nconst RootNode = {\n allOf: [\n { $ref: '#/definitions/BaseNode' },\n {\n properties: {\n type: { const: 'root' },\n },\n },\n ],\n}\n\nconst TextNode = {\n allOf: [\n { $ref: '#/definitions/BaseNode' },\n {\n properties: {\n type: { const: 'text' },\n format: { type: 'number' },\n text: { type: 'string' },\n },\n required: ['text'],\n },\n ],\n}\n\nconst baseJsonSchema = {\n type: 'object',\n $schema: 'http://json-schema.org/draft-07/schema#',\n definitions: {\n BaseNode,\n CommonNodes,\n CommonProperties,\n HeadingNode,\n LinkNode,\n ListItemNode,\n ListNode,\n // MediaNode,\n Node,\n RootNode,\n TextNode,\n },\n properties: {\n root: { $ref: '#/definitions/RootNode' },\n },\n required: ['root'],\n}\n\nexport const lexicalJsonSchema = (customNodes = []) => {\n const schema = JSON.parse(JSON.stringify(baseJsonSchema))\n\n // Add custom nodes to the Node definition\n if (customNodes.length > 0) {\n customNodes.forEach((customNode, index) => {\n const customNodeName = `CustomNode${index + 1}`\n schema.definitions[customNodeName] = customNode\n schema.definitions.Node.oneOf.push({ $ref: `#/definitions/${customNodeName}` })\n })\n }\n\n return schema\n}\n"],"names":["CommonProperties","type","properties","children","items","$ref","direction","enum","format","indent","version","BaseNode","allOf","required","CommonNodes","HeadingNode","const","tag","LinkNode","id","fields","linkType","newTab","url","ListItemNode","checked","value","ListNode","listType","start","Node","oneOf","RootNode","TextNode","text","baseJsonSchema","$schema","definitions","root","lexicalJsonSchema","customNodes","schema","JSON","parse","stringify","length","forEach","customNode","index","customNodeName","push"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/ai/schemas/lexicalJsonSchema.ts"],"sourcesContent":["export const documentSchema = {\n type: 'object',\n $schema: 'http://json-schema.org/draft-07/schema#',\n additionalProperties: false,\n definitions: {\n // Text Node (Leaf Node)\n TextNode: {\n type: 'object',\n additionalProperties: false,\n properties: {\n type: { type: 'string', enum: ['text'] },\n detail: {\n type: 'number',\n description: 'Text detail flags',\n enum: [\n 0, // No details\n 1, // IS_DIRECTIONLESS\n 2, // IS_UNMERGEABLE\n 3, // IS_DIRECTIONLESS + IS_UNMERGEABLE\n ],\n examples: [\n { description: 'No special details', value: 0 },\n { description: 'Directionless', value: 1 },\n { description: 'Unmergeable', value: 2 },\n { description: 'Directionless + Unmergeable', value: 3 },\n ],\n },\n direction: {\n type: ['string', 'null'],\n enum: ['ltr', null],\n },\n format: {\n type: 'number',\n description: `Format flags for text:\n 0 = No format\n 1 = Bold\n 2 = Italic\n 3 = Bold + Italic (1|2)\n 4 = Strikethrough\n 8 = Underline\n 9 = Bold + Underline (1|8)\n 16 = Code\n 32 = Subscript\n 64 = Superscript\n 128 = Highlight\n \n Formats can be combined using binary OR (|).\n Example combinations:\n - Bold + Italic = 1|2 = 3\n - Bold + Underline = 1|8 = 9\n - Italic + Underline = 2|8 = 10\n - Bold + Italic + Underline = 1|2|8 = 11`,\n },\n indent: { type: 'number' },\n mode: {\n type: 'number',\n description: 'Text mode flags',\n enum: [\n 0, // Normal\n 1, // Token\n 2, // Segmented\n ],\n examples: [\n { description: 'Normal text', value: 0 },\n { description: 'Token text', value: 1 },\n { description: 'Segmented text', value: 2 },\n ],\n },\n style: {\n type: 'string',\n description: 'CSS style string (e.g., \"color: red; font-size: 12px;\")',\n },\n text: { type: 'string' },\n version: { type: 'number' },\n },\n required: [\n 'type',\n 'text',\n 'format',\n 'style',\n 'mode',\n 'detail',\n 'direction',\n 'indent',\n 'version',\n ],\n },\n // Styled Table Cell Node\n TableCellNode: {\n type: 'object',\n additionalProperties: false,\n properties: {\n type: { type: 'string', enum: ['tablecell'] },\n children: {\n type: 'array',\n items: {\n $ref: '#/definitions/TextNode',\n },\n },\n colSpan: { type: 'number' },\n direction: {\n type: ['string', 'null'],\n enum: ['ltr', null],\n },\n headerState: { type: 'number' },\n indent: { type: 'number' },\n version: { type: 'number' },\n width: {\n type: ['null'],\n enum: [null],\n },\n },\n required: [\n 'type',\n 'children',\n 'headerState',\n 'colSpan',\n 'width',\n 'direction',\n 'indent',\n 'version',\n ],\n },\n // Styled Table Row Node\n TableRowNode: {\n type: 'object',\n additionalProperties: false,\n properties: {\n type: { type: 'string', enum: ['tablerow'] },\n children: {\n type: 'array',\n items: {\n $ref: '#/definitions/TableCellNode',\n },\n },\n height: { type: 'number' },\n },\n required: ['type', 'children', 'height'],\n },\n // Styled Table Node\n TableNode: {\n type: 'object',\n additionalProperties: false,\n properties: {\n type: { type: 'string', enum: ['table'] },\n children: {\n type: 'array',\n items: {\n $ref: '#/definitions/TableRowNode',\n },\n },\n },\n required: ['type', 'children'],\n },\n // Heading Node\n HeadingNode: {\n type: 'object',\n additionalProperties: false,\n properties: {\n type: { type: 'string', enum: ['heading'] },\n children: {\n type: 'array',\n items: {\n anyOf: [{ $ref: '#/definitions/TextNode' }, { $ref: '#/definitions/LinkNode' }],\n },\n },\n direction: {\n type: ['string', 'null'],\n enum: ['ltr', null],\n },\n indent: { type: 'number' },\n tag: { type: 'string', enum: ['h1', 'h2', 'h3'] },\n version: { type: 'number' },\n },\n required: ['type', 'tag', 'children', 'direction', 'indent', 'version'],\n },\n // Paragraph Node\n ParagraphNode: {\n type: 'object',\n additionalProperties: false,\n properties: {\n type: { type: 'string', enum: ['paragraph'] },\n children: {\n type: 'array',\n items: {\n anyOf: [\n { $ref: '#/definitions/TextNode' },\n { $ref: '#/definitions/LinkNode' },\n { $ref: '#/definitions/CodeNode' },\n ],\n },\n },\n direction: {\n type: ['string', 'null'],\n enum: ['ltr', null],\n },\n format: { type: 'string', enum: ['start', 'center', 'right'] },\n indent: { type: 'number' },\n textFormat: { type: 'number' },\n textStyle: {\n type: 'string',\n description: 'CSS style string (e.g., \"color: red; font-size: 12px;\")',\n },\n version: { type: 'number' },\n },\n required: [\n 'type',\n 'children',\n 'direction',\n 'format',\n 'indent',\n 'textFormat',\n 'textStyle',\n 'version',\n ],\n },\n // Link Node\n LinkNode: {\n type: 'object',\n additionalProperties: false,\n properties: {\n type: { type: 'string', enum: ['link'] },\n children: {\n type: 'array',\n items: {\n $ref: '#/definitions/TextNode',\n },\n },\n url: { type: 'string' },\n },\n required: ['type', 'url', 'children'],\n },\n // List Item Node\n ListItemNode: {\n type: 'object',\n additionalProperties: false,\n properties: {\n type: { type: 'string', enum: ['listitem'] },\n children: {\n type: 'array',\n items: {\n anyOf: [{ $ref: '#/definitions/ParagraphNode' }, { $ref: '#/definitions/ListNode' }],\n },\n },\n },\n required: ['type', 'children'],\n },\n // List Node\n ListNode: {\n type: 'object',\n additionalProperties: false,\n properties: {\n type: { type: 'string', enum: ['list'] },\n children: {\n type: 'array',\n items: {\n $ref: '#/definitions/ListItemNode',\n },\n },\n listType: { type: 'string', enum: ['bullet', 'number'] },\n },\n required: ['type', 'listType', 'children'],\n },\n // Quote Node\n QuoteNode: {\n type: 'object',\n additionalProperties: false,\n properties: {\n type: { type: 'string', enum: ['quote'] },\n children: {\n type: 'array',\n items: {\n anyOf: [{ $ref: '#/definitions/TextNode' }, { $ref: '#/definitions/ParagraphNode' }],\n },\n },\n },\n required: ['type', 'children'],\n },\n // Code Node\n CodeNode: {\n type: 'object',\n additionalProperties: false,\n properties: {\n type: { type: 'string', enum: ['code'] },\n code: { type: 'string' },\n language: { type: 'string' },\n },\n required: ['type', 'code', 'language'],\n },\n // Horizontal Rule Node\n HorizontalRuleNode: {\n type: 'object',\n additionalProperties: false,\n properties: {\n type: { type: 'string', enum: ['horizontalrule'] },\n },\n required: ['type'],\n },\n // Image Node\n ImageNode: {\n type: 'object',\n additionalProperties: false,\n properties: {\n type: { type: 'string', enum: ['image'] },\n alt: { type: 'string' },\n caption: {\n type: 'array',\n items: {\n $ref: '#/definitions/TextNode',\n },\n },\n src: { type: 'string' },\n },\n required: ['type', 'src', 'alt', 'caption'],\n },\n // Root Node\n RootNode: {\n type: 'object',\n additionalProperties: false,\n properties: {\n type: { type: 'string', enum: ['root'] },\n children: {\n type: 'array',\n items: {\n anyOf: [\n { $ref: '#/definitions/TextNode' },\n { $ref: '#/definitions/HeadingNode' },\n { $ref: '#/definitions/ParagraphNode' },\n { $ref: '#/definitions/LinkNode' },\n { $ref: '#/definitions/ListNode' },\n { $ref: '#/definitions/QuoteNode' },\n { $ref: '#/definitions/CodeNode' },\n { $ref: '#/definitions/HorizontalRuleNode' },\n { $ref: '#/definitions/ImageNode' },\n { $ref: '#/definitions/TableNode' },\n ],\n },\n },\n direction: {\n type: ['string', 'null'],\n enum: ['ltr', null],\n },\n indent: { type: 'number' },\n version: { type: 'number' },\n },\n required: ['type', 'children', 'direction', 'indent', 'version'],\n },\n },\n properties: {\n root: {\n $ref: '#/definitions/RootNode',\n },\n },\n required: ['root'],\n}\n\nexport const lexicalJsonSchema = (customNodes = []) => {\n const schema = JSON.parse(JSON.stringify(documentSchema))\n\n // Add custom nodes to the Node definition\n if (customNodes.length > 0) {\n customNodes.forEach((customNode, index) => {\n const customNodeName = `CustomNode${index + 1}`\n schema.definitions[customNodeName] = customNode\n schema.definitions.Node.oneOf.push({ $ref: `#/definitions/${customNodeName}` })\n })\n }\n\n return schema\n}\n"],"names":["documentSchema","type","$schema","additionalProperties","definitions","TextNode","properties","enum","detail","description","examples","value","direction","format","indent","mode","style","text","version","required","TableCellNode","children","items","$ref","colSpan","headerState","width","TableRowNode","height","TableNode","HeadingNode","anyOf","tag","ParagraphNode","textFormat","textStyle","LinkNode","url","ListItemNode","ListNode","listType","QuoteNode","CodeNode","code","language","HorizontalRuleNode","ImageNode","alt","caption","src","RootNode","root","lexicalJsonSchema","customNodes","schema","JSON","parse","stringify","length","forEach","customNode","index","customNodeName","Node","oneOf","push"],"mappings":"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"}
@@ -106,7 +106,7 @@ export const instructionsCollection = (options)=>({
106
106
  type: 'tabs',
107
107
  tabs: [
108
108
  {
109
- description: 'This will appear within the tab above the fields.',
109
+ description: 'The Prompt field allows you to define dynamic templates using placeholders (e.g., {{ fieldName }}) to customize output based on your data fields.',
110
110
  fields: [
111
111
  {
112
112
  name: 'prompt',
@@ -122,7 +122,7 @@ export const instructionsCollection = (options)=>({
122
122
  label: 'Prompt'
123
123
  },
124
124
  {
125
- description: 'This will appear within the tab above the fields. sys',
125
+ description: '',
126
126
  fields: [
127
127
  {
128
128
  name: 'system',
@@ -157,7 +157,7 @@ informative and accurate but also captivating and beautifully structured.`,
157
157
  // return current['field-type'] === 'richText'
158
158
  // },
159
159
  // },
160
- description: 'This will appear within the tab above the fields. Layout',
160
+ description: '',
161
161
  fields: [
162
162
  {
163
163
  /**TODO's:
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/collections/Instructions.ts"],"sourcesContent":["import type { CollectionConfig, GroupField } from 'payload'\n\nimport { GenerationModels } from '../ai/models/index.js'\nimport { PLUGIN_INSTRUCTIONS_TABLE } from '../defaults.js'\n\nconst groupSettings = GenerationModels.reduce((fields, model) => {\n if (model.settings) {\n fields.push(model.settings)\n }\n return fields\n}, [] as GroupField[])\n\nconst modelOptions = GenerationModels.map((model) => {\n return {\n fields: model.fields,\n label: model.name,\n value: model.id,\n }\n})\n\nconst defaultAccessConfig = {\n create: () => true,\n read: () => true,\n update: () => true,\n}\n\nconst defaultAdminConfig = {\n group: 'Plugins',\n hidden: true,\n}\n\nexport const instructionsCollection = (options?: Partial<CollectionConfig>) =>\n <CollectionConfig>{\n slug: PLUGIN_INSTRUCTIONS_TABLE,\n access: {\n ...defaultAccessConfig,\n ...options?.access,\n },\n admin: {\n ...defaultAdminConfig,\n ...options?.admin,\n group: 'Plugins',\n },\n fields: [\n {\n name: 'schema-path',\n type: 'text',\n admin: {\n readOnly: true,\n },\n unique: true,\n },\n {\n name: 'field-type',\n type: 'select',\n admin: {\n readOnly: true,\n },\n defaultValue: 'text',\n label: 'Field type',\n options: [\n {\n label: 'text',\n value: 'text',\n },\n {\n label: 'textarea',\n value: 'textarea',\n },\n {\n label: 'upload',\n value: 'upload',\n },\n {\n label: 'richText',\n value: 'richText',\n },\n ],\n },\n {\n name: 'relation-to',\n type: 'text',\n admin: {\n condition: (_, current) => {\n return current['field-type'] === 'upload'\n },\n },\n label: 'Relation to',\n },\n {\n name: 'model-id',\n type: 'select',\n admin: {\n components: {\n Field: {\n clientProps: {\n filterByField: 'field-type',\n options: modelOptions,\n },\n path: '@ai-stack/payloadcms/fields#SelectField',\n },\n },\n },\n label: 'Model',\n options: modelOptions.map((option) => {\n return {\n label: option.label,\n value: option.value,\n }\n }),\n },\n {\n id: 'ai-prompts-tabs',\n type: 'tabs',\n tabs: [\n {\n description: 'This will appear within the tab above the fields.',\n fields: [\n {\n name: 'prompt',\n type: 'textarea',\n admin: {\n components: {\n Field: '@ai-stack/payloadcms/fields#PromptEditorField',\n },\n },\n label: '',\n },\n ],\n label: 'Prompt',\n },\n {\n description: 'This will appear within the tab above the fields. sys',\n fields: [\n {\n name: 'system',\n type: 'textarea',\n admin: {\n condition: (_, current) => {\n return current['field-type'] === 'richText'\n },\n },\n defaultValue: `INSTRUCTIONS:\nYou are a highly skilled and professional blog writer,\nrenowned for crafting engaging and well-organized articles.\nWhen given a title, you meticulously create blogs that are not only\ninformative and accurate but also captivating and beautifully structured.`,\n label: '',\n },\n ],\n label: 'System prompt',\n },\n {\n // Note: Update when tabs PR is merged: https://github.com/payloadcms/payload/pull/8406\n // admin: {\n // condition: (_, current) => {\n // console.log('condition in tab', current)\n // return current['field-type'] === 'richText'\n // },\n // },\n description: 'This will appear within the tab above the fields. Layout',\n fields: [\n {\n /**TODO's:\n * - Layouts can be saved in as an array\n * - user can add their own layout to collections and use it later for generate specific rich text\n * - user can select previously added layout\n */\n name: 'layout',\n type: 'textarea',\n admin: {\n condition: (_, current) => {\n return current['field-type'] === 'richText'\n },\n },\n defaultValue: `[paragraph] - Write a concise introduction (2-3 sentences) that outlines the main topic.\n[horizontalrule] - Insert a horizontal rule to separate the introduction from the main content.\n[list] - Create a list with 3-5 items. Each list item should contain:\n a. [heading] - A brief, descriptive heading (up to 5 words)\n b. [paragraph] - A short explanation or elaboration (1-2 sentences)\n[horizontalrule] - Insert another horizontal rule to separate the main content from the conclusion.\n[paragraph] - Compose a brief conclusion (2-3 sentences) summarizing the key points.\n[quote] - Include a relevant quote from a famous person, directly related to the topic. Format: \"Quote text.\" - Author Name`,\n label: '',\n },\n ],\n label: 'Layout',\n },\n ],\n },\n ...groupSettings,\n ],\n labels: {\n plural: 'Compose Settings',\n singular: 'Compose Setting',\n },\n }\n"],"names":["GenerationModels","PLUGIN_INSTRUCTIONS_TABLE","groupSettings","reduce","fields","model","settings","push","modelOptions","map","label","name","value","id","defaultAccessConfig","create","read","update","defaultAdminConfig","group","hidden","instructionsCollection","options","slug","access","admin","type","readOnly","unique","defaultValue","condition","_","current","components","Field","clientProps","filterByField","path","option","tabs","description","labels","plural","singular"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/collections/Instructions.ts"],"sourcesContent":["import type { CollectionConfig, GroupField } from 'payload'\n\nimport { GenerationModels } from '../ai/models/index.js'\nimport { PLUGIN_INSTRUCTIONS_TABLE } from '../defaults.js'\n\nconst groupSettings = GenerationModels.reduce((fields, model) => {\n if (model.settings) {\n fields.push(model.settings)\n }\n return fields\n}, [] as GroupField[])\n\nconst modelOptions = GenerationModels.map((model) => {\n return {\n fields: model.fields,\n label: model.name,\n value: model.id,\n }\n})\n\nconst defaultAccessConfig = {\n create: () => true,\n read: () => true,\n update: () => true,\n}\n\nconst defaultAdminConfig = {\n group: 'Plugins',\n hidden: true,\n}\n\nexport const instructionsCollection = (options?: Partial<CollectionConfig>) =>\n <CollectionConfig>{\n slug: PLUGIN_INSTRUCTIONS_TABLE,\n access: {\n ...defaultAccessConfig,\n ...options?.access,\n },\n admin: {\n ...defaultAdminConfig,\n ...options?.admin,\n group: 'Plugins',\n },\n fields: [\n {\n name: 'schema-path',\n type: 'text',\n admin: {\n readOnly: true,\n },\n unique: true,\n },\n {\n name: 'field-type',\n type: 'select',\n admin: {\n readOnly: true,\n },\n defaultValue: 'text',\n label: 'Field type',\n options: [\n {\n label: 'text',\n value: 'text',\n },\n {\n label: 'textarea',\n value: 'textarea',\n },\n {\n label: 'upload',\n value: 'upload',\n },\n {\n label: 'richText',\n value: 'richText',\n },\n ],\n },\n {\n name: 'relation-to',\n type: 'text',\n admin: {\n condition: (_, current) => {\n return current['field-type'] === 'upload'\n },\n },\n label: 'Relation to',\n },\n {\n name: 'model-id',\n type: 'select',\n admin: {\n components: {\n Field: {\n clientProps: {\n filterByField: 'field-type',\n options: modelOptions,\n },\n path: '@ai-stack/payloadcms/fields#SelectField',\n },\n },\n },\n label: 'Model',\n options: modelOptions.map((option) => {\n return {\n label: option.label,\n value: option.value,\n }\n }),\n },\n {\n id: 'ai-prompts-tabs',\n type: 'tabs',\n tabs: [\n { // TODO: Add some info about the field to guide user\n description: 'The Prompt field allows you to define dynamic templates using placeholders (e.g., {{ fieldName }}) to customize output based on your data fields.',\n fields: [\n {\n name: 'prompt',\n type: 'textarea',\n admin: {\n components: {\n Field: '@ai-stack/payloadcms/fields#PromptEditorField',\n },\n },\n label: '',\n },\n ],\n label: 'Prompt',\n },\n {\n description: '',\n fields: [\n {\n name: 'system',\n type: 'textarea',\n admin: {\n condition: (_, current) => {\n return current['field-type'] === 'richText'\n },\n },\n defaultValue: `INSTRUCTIONS:\nYou are a highly skilled and professional blog writer,\nrenowned for crafting engaging and well-organized articles.\nWhen given a title, you meticulously create blogs that are not only\ninformative and accurate but also captivating and beautifully structured.`,\n label: '',\n },\n ],\n label: 'System prompt',\n },\n {\n // Note: Update when tabs PR is merged: https://github.com/payloadcms/payload/pull/8406\n // admin: {\n // condition: (_, current) => {\n // console.log('condition in tab', current)\n // return current['field-type'] === 'richText'\n // },\n // },\n description: '',\n fields: [\n {\n /**TODO's:\n * - Layouts can be saved in as an array\n * - user can add their own layout to collections and use it later for generate specific rich text\n * - user can select previously added layout\n */\n name: 'layout',\n type: 'textarea',\n admin: {\n condition: (_, current) => {\n return current['field-type'] === 'richText'\n },\n },\n defaultValue: `[paragraph] - Write a concise introduction (2-3 sentences) that outlines the main topic.\n[horizontalrule] - Insert a horizontal rule to separate the introduction from the main content.\n[list] - Create a list with 3-5 items. Each list item should contain:\n a. [heading] - A brief, descriptive heading (up to 5 words)\n b. [paragraph] - A short explanation or elaboration (1-2 sentences)\n[horizontalrule] - Insert another horizontal rule to separate the main content from the conclusion.\n[paragraph] - Compose a brief conclusion (2-3 sentences) summarizing the key points.\n[quote] - Include a relevant quote from a famous person, directly related to the topic. Format: \"Quote text.\" - Author Name`,\n label: '',\n },\n ],\n label: 'Layout',\n },\n ],\n },\n ...groupSettings,\n ],\n labels: {\n plural: 'Compose Settings',\n singular: 'Compose Setting',\n },\n }\n"],"names":["GenerationModels","PLUGIN_INSTRUCTIONS_TABLE","groupSettings","reduce","fields","model","settings","push","modelOptions","map","label","name","value","id","defaultAccessConfig","create","read","update","defaultAdminConfig","group","hidden","instructionsCollection","options","slug","access","admin","type","readOnly","unique","defaultValue","condition","_","current","components","Field","clientProps","filterByField","path","option","tabs","description","labels","plural","singular"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/endpoints/index.ts"],"sourcesContent":["import type { PayloadRequest } from 'payload'\n\nimport type { ActionMenuItems, Endpoints } from '../types.js'\n\nimport { GenerationModels } from '../ai/models/index.js'\nimport { defaultPrompts } from '../ai/prompts.js'\nimport {\n PLUGIN_API_ENDPOINT_GENERATE,\n PLUGIN_API_ENDPOINT_GENERATE_UPLOAD,\n PLUGIN_INSTRUCTIONS_TABLE,\n PLUGIN_NAME,\n} from '../defaults.js'\nimport { registerEditorHelper } from '../libraries/handlebars/helpers.js'\nimport { handlebarsHelpersMap } from '../libraries/handlebars/helpersMap.js'\nimport { replacePlaceholders } from '../libraries/handlebars/replacePlaceholders.js'\n\nconst assignPrompt = async (\n action: ActionMenuItems,\n {\n type,\n actionParams,\n context,\n field,\n layout,\n systemPrompt = '',\n template,\n }: {\n actionParams: Record<any, any>\n context: object\n field: string\n layout: string\n systemPrompt: string\n template: string\n type: string\n },\n) => {\n const prompt = await replacePlaceholders(template, context)\n const toLexicalHTML = type === 'richText' ? handlebarsHelpersMap.toHTML.name : ''\n\n const assignedPrompts = {\n layout: type === 'richText' ? layout : undefined,\n prompt,\n //TODO: Define only once on a collection level\n system: type === 'richText' ? systemPrompt : undefined,\n }\n\n if (action === 'Compose') {\n return assignedPrompts\n }\n\n const { layout: getLayout, system: getSystemPrompt } = defaultPrompts.find(\n (p) => p.name === action,\n )\n\n let updatedLayout = layout\n if (getLayout) {\n updatedLayout = getLayout()\n }\n\n const system = getSystemPrompt({\n ...(actionParams || {}),\n prompt,\n systemPrompt,\n })\n\n return {\n layout: updatedLayout,\n // TODO: revisit this toLexicalHTML\n prompt: await replacePlaceholders(`{{${toLexicalHTML} ${field}}}`, context),\n system,\n }\n}\n\nexport const endpoints: Endpoints = {\n textarea: {\n handler: async (req: PayloadRequest) => {\n const data = await req.json?.()\n\n const { locale = 'en', options } = data\n const { action, actionParams, instructionId } = options\n const contextData = data.doc\n\n if (!instructionId) {\n throw new Error(\n `Instruction ID is required for \"${PLUGIN_NAME}\" to work, please check your configuration`,\n )\n }\n\n const instructions = await req.payload.findByID({\n id: instructionId,\n collection: PLUGIN_INSTRUCTIONS_TABLE,\n })\n\n const { collections } = req.payload.config\n const collection = collections.find(\n (collection) => collection.slug === PLUGIN_INSTRUCTIONS_TABLE,\n )\n\n const { custom: { [PLUGIN_NAME]: { editorConfig = {} } = {} } = {} } = collection.admin\n const { schema: editorSchema = {} } = editorConfig\n const { prompt: promptTemplate = '' } = instructions\n\n const schemaPath = instructions['schema-path'] as string\n const fieldName = schemaPath?.split('.').pop()\n\n registerEditorHelper(req.payload, schemaPath)\n\n const { defaultLocale, locales = [] } = req.payload.config.localization || {}\n const localeData = locales.find((l) => {\n return l.code === locale\n })\n\n const localeInfo = localeData?.label[defaultLocale] || locale\n\n const model = GenerationModels.find((model) => model.id === instructions['model-id'])\n const settingsName = model.settings?.name\n const modelOptions = instructions[settingsName] || {}\n\n const prompts = await assignPrompt(action, {\n type: instructions['field-type'] as string,\n actionParams,\n context: contextData,\n field: fieldName,\n layout: instructions.layout,\n systemPrompt: instructions.system,\n template: promptTemplate as string,\n })\n\n console.log('Running handler with prompts:', prompts)\n return model\n .handler?.(prompts.prompt, {\n ...modelOptions,\n editorSchema,\n layout: prompts.layout,\n locale: localeInfo,\n system: prompts.system,\n })\n .catch((error) => {\n console.error('Error: endpoint - generating text:', error)\n return new Response(JSON.stringify(error.message), { status: 500 })\n })\n },\n method: 'post',\n path: PLUGIN_API_ENDPOINT_GENERATE,\n },\n upload: {\n handler: async (req: PayloadRequest) => {\n const data = await req.json?.()\n\n const { options } = data\n const { instructionId } = options\n const contextData = data.doc\n\n let instructions = { 'model-id': '', prompt: '' }\n\n if (instructionId) {\n // @ts-expect-error\n instructions = await req.payload.findByID({\n id: instructionId,\n collection: PLUGIN_INSTRUCTIONS_TABLE,\n })\n }\n\n const { prompt: promptTemplate = '' } = instructions\n const schemaPath = instructions['schema-path']\n\n registerEditorHelper(req.payload, schemaPath)\n\n const text = await replacePlaceholders(promptTemplate, contextData)\n const modelId = instructions['model-id']\n const uploadCollectionSlug = instructions['relation-to']\n\n const model = GenerationModels.find((model) => model.id === modelId)\n const settingsName = model.settings?.name\n const modelOptions = instructions[settingsName] || {}\n\n const result = await model.handler?.(text, modelOptions)\n\n const assetData = await req.payload.create({\n collection: uploadCollectionSlug,\n data: result.data,\n file: result.file,\n })\n\n return new Response(\n JSON.stringify({\n result: {\n id: assetData.id,\n alt: assetData.alt,\n },\n }),\n )\n },\n method: 'post',\n path: PLUGIN_API_ENDPOINT_GENERATE_UPLOAD,\n },\n}\n"],"names":["GenerationModels","defaultPrompts","PLUGIN_API_ENDPOINT_GENERATE","PLUGIN_API_ENDPOINT_GENERATE_UPLOAD","PLUGIN_INSTRUCTIONS_TABLE","PLUGIN_NAME","registerEditorHelper","handlebarsHelpersMap","replacePlaceholders","assignPrompt","action","type","actionParams","context","field","layout","systemPrompt","template","prompt","toLexicalHTML","toHTML","name","assignedPrompts","undefined","system","getLayout","getSystemPrompt","find","p","updatedLayout","endpoints","textarea","handler","req","data","json","locale","options","instructionId","contextData","doc","Error","instructions","payload","findByID","id","collection","collections","config","slug","custom","editorConfig","admin","schema","editorSchema","promptTemplate","schemaPath","fieldName","split","pop","defaultLocale","locales","localization","localeData","l","code","localeInfo","label","model","settingsName","settings","modelOptions","prompts","console","log","catch","error","Response","JSON","stringify","message","status","method","path","upload","text","modelId","uploadCollectionSlug","result","assetData","create","file","alt"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/endpoints/index.ts"],"sourcesContent":["import type { PayloadRequest } from 'payload'\n\nimport type { ActionMenuItems, Endpoints } from '../types.js'\n\nimport { GenerationModels } from '../ai/models/index.js'\nimport { defaultPrompts } from '../ai/prompts.js'\nimport {\n PLUGIN_API_ENDPOINT_GENERATE,\n PLUGIN_API_ENDPOINT_GENERATE_UPLOAD,\n PLUGIN_INSTRUCTIONS_TABLE,\n PLUGIN_NAME,\n} from '../defaults.js'\nimport { registerEditorHelper } from '../libraries/handlebars/helpers.js'\nimport { handlebarsHelpersMap } from '../libraries/handlebars/helpersMap.js'\nimport { replacePlaceholders } from '../libraries/handlebars/replacePlaceholders.js'\n\nconst assignPrompt = async (\n action: ActionMenuItems,\n {\n type,\n actionParams,\n context,\n field,\n layout,\n systemPrompt = '',\n template,\n }: {\n actionParams: Record<any, any>\n context: object\n field: string\n layout: string\n systemPrompt: string\n template: string\n type: string\n },\n) => {\n const prompt = await replacePlaceholders(template, context)\n const toLexicalHTML = type === 'richText' ? handlebarsHelpersMap.toHTML.name : ''\n\n const assignedPrompts = {\n layout: type === 'richText' ? layout : undefined,\n prompt,\n //TODO: Define only once on a collection level\n system: type === 'richText' ? systemPrompt : undefined,\n }\n\n if (action === 'Compose') {\n return assignedPrompts\n }\n\n const { layout: getLayout, system: getSystemPrompt } = defaultPrompts.find(\n (p) => p.name === action,\n )\n\n let updatedLayout = layout\n if (getLayout) {\n updatedLayout = getLayout()\n }\n\n const system = getSystemPrompt({\n ...(actionParams || {}),\n prompt,\n systemPrompt,\n })\n\n return {\n layout: updatedLayout,\n // TODO: revisit this toLexicalHTML\n prompt: await replacePlaceholders(`{{${toLexicalHTML} ${field}}}`, context),\n system,\n }\n}\n\nexport const endpoints: Endpoints = {\n textarea: { //TODO: This is the main endpoint for generating content - its just needs to be renamed to 'generate' or something.\n handler: async (req: PayloadRequest) => {\n const data = await req.json?.()\n\n const { locale = 'en', options } = data\n const { action, actionParams, instructionId } = options\n const contextData = data.doc\n\n if (!instructionId) {\n throw new Error(\n `Instruction ID is required for \"${PLUGIN_NAME}\" to work, please check your configuration`,\n )\n }\n\n const instructions = await req.payload.findByID({\n id: instructionId,\n collection: PLUGIN_INSTRUCTIONS_TABLE,\n })\n\n const { collections } = req.payload.config\n const collection = collections.find(\n (collection) => collection.slug === PLUGIN_INSTRUCTIONS_TABLE,\n )\n\n const { custom: { [PLUGIN_NAME]: { editorConfig = {} } = {} } = {} } = collection.admin\n const { schema: editorSchema = {} } = editorConfig\n const { prompt: promptTemplate = '' } = instructions\n\n const schemaPath = instructions['schema-path'] as string\n const fieldName = schemaPath?.split('.').pop()\n\n registerEditorHelper(req.payload, schemaPath)\n\n const { defaultLocale, locales = [] } = req.payload.config.localization || {}\n const localeData = locales.find((l) => {\n return l.code === locale\n })\n\n const localeInfo = localeData?.label[defaultLocale] || locale\n\n const model = GenerationModels.find((model) => model.id === instructions['model-id'])\n const settingsName = model.settings?.name\n const modelOptions = instructions[settingsName] || {}\n\n const prompts = await assignPrompt(action, {\n type: instructions['field-type'] as string,\n actionParams,\n context: contextData,\n field: fieldName,\n layout: instructions.layout,\n systemPrompt: instructions.system,\n template: promptTemplate as string,\n })\n\n console.log('Running handler with prompts:', prompts)\n return model\n .handler?.(prompts.prompt, {\n ...modelOptions,\n editorSchema,\n layout: prompts.layout,\n locale: localeInfo,\n system: prompts.system,\n })\n .catch((error) => {\n console.error('Error: endpoint - generating text:', error)\n return new Response(JSON.stringify(error.message), { status: 500 })\n })\n },\n method: 'post',\n path: PLUGIN_API_ENDPOINT_GENERATE,\n },\n upload: {\n handler: async (req: PayloadRequest) => {\n const data = await req.json?.()\n\n const { options } = data\n const { instructionId } = options\n const contextData = data.doc\n\n let instructions = { 'model-id': '', prompt: '' }\n\n if (instructionId) {\n // @ts-expect-error\n instructions = await req.payload.findByID({\n id: instructionId,\n collection: PLUGIN_INSTRUCTIONS_TABLE,\n })\n }\n\n const { prompt: promptTemplate = '' } = instructions\n const schemaPath = instructions['schema-path']\n\n registerEditorHelper(req.payload, schemaPath)\n\n const text = await replacePlaceholders(promptTemplate, contextData)\n const modelId = instructions['model-id']\n const uploadCollectionSlug = instructions['relation-to']\n\n const model = GenerationModels.find((model) => model.id === modelId)\n const settingsName = model.settings?.name\n const modelOptions = instructions[settingsName] || {}\n\n const result = await model.handler?.(text, modelOptions)\n\n const assetData = await req.payload.create({\n collection: uploadCollectionSlug,\n data: result.data,\n file: result.file,\n })\n\n return new Response(\n JSON.stringify({\n result: {\n id: assetData.id,\n alt: assetData.alt,\n },\n }),\n )\n },\n method: 'post',\n path: PLUGIN_API_ENDPOINT_GENERATE_UPLOAD,\n },\n}\n"],"names":["GenerationModels","defaultPrompts","PLUGIN_API_ENDPOINT_GENERATE","PLUGIN_API_ENDPOINT_GENERATE_UPLOAD","PLUGIN_INSTRUCTIONS_TABLE","PLUGIN_NAME","registerEditorHelper","handlebarsHelpersMap","replacePlaceholders","assignPrompt","action","type","actionParams","context","field","layout","systemPrompt","template","prompt","toLexicalHTML","toHTML","name","assignedPrompts","undefined","system","getLayout","getSystemPrompt","find","p","updatedLayout","endpoints","textarea","handler","req","data","json","locale","options","instructionId","contextData","doc","Error","instructions","payload","findByID","id","collection","collections","config","slug","custom","editorConfig","admin","schema","editorSchema","promptTemplate","schemaPath","fieldName","split","pop","defaultLocale","locales","localization","localeData","l","code","localeInfo","label","model","settingsName","settings","modelOptions","prompts","console","log","catch","error","Response","JSON","stringify","message","status","method","path","upload","text","modelId","uploadCollectionSlug","result","assetData","create","file","alt"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"feature.client.d.ts","sourceRoot":"","sources":["../../../src/fields/LexicalEditor/feature.client.tsx"],"names":[],"mappings":"AAMA,eAAO,MAAM,0BAA0B;;;;;;EAerC,CAAA"}
1
+ {"version":3,"file":"feature.client.d.ts","sourceRoot":"","sources":["../../../src/fields/LexicalEditor/feature.client.tsx"],"names":[],"mappings":"AAOA,eAAO,MAAM,0BAA0B;;;;;;EAgBrC,CAAA"}
@@ -1,8 +1,12 @@
1
1
  'use client';
2
2
  import { createClientFeature } from '@payloadcms/richtext-lexical/client';
3
+ import { TextNode } from 'lexical';
3
4
  import { ComposeFeatureComponent } from './ComposeFeatureComponent.js';
4
5
  export const LexicalEditorFeatureClient = createClientFeature((props)=>{
5
6
  return {
7
+ nodes: [
8
+ TextNode
9
+ ],
6
10
  plugins: [
7
11
  {
8
12
  Component: ComposeFeatureComponent,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/fields/LexicalEditor/feature.client.tsx"],"sourcesContent":["'use client'\n\nimport { createClientFeature } from '@payloadcms/richtext-lexical/client'\n\nimport { ComposeFeatureComponent } from './ComposeFeatureComponent.js'\n\nexport const LexicalEditorFeatureClient = createClientFeature((props) => {\n return {\n plugins: [\n {\n Component: ComposeFeatureComponent,\n position: 'belowContainer',\n },\n ],\n sanitizedClientFeatureProps: {\n field: props.field,\n path: props.field?.name,\n schemaPath: props.schemaPath,\n ...props?.props,\n },\n }\n})\n"],"names":["createClientFeature","ComposeFeatureComponent","LexicalEditorFeatureClient","props","plugins","Component","position","sanitizedClientFeatureProps","field","path","name","schemaPath"],"mappings":"AAAA;AAEA,SAASA,mBAAmB,QAAQ,sCAAqC;AAEzE,SAASC,uBAAuB,QAAQ,+BAA8B;AAEtE,OAAO,MAAMC,6BAA6BF,oBAAoB,CAACG;IAC7D,OAAO;QACLC,SAAS;YACP;gBACEC,WAAWJ;gBACXK,UAAU;YACZ;SACD;QACDC,6BAA6B;YAC3BC,OAAOL,MAAMK,KAAK;YAClBC,MAAMN,MAAMK,KAAK,EAAEE;YACnBC,YAAYR,MAAMQ,UAAU;YAC5B,GAAGR,OAAOA,KAAK;QACjB;IACF;AACF,GAAE"}
1
+ {"version":3,"sources":["../../../src/fields/LexicalEditor/feature.client.tsx"],"sourcesContent":["'use client'\n\nimport { createClientFeature } from '@payloadcms/richtext-lexical/client'\nimport { TextNode } from 'lexical'\n\nimport { ComposeFeatureComponent } from './ComposeFeatureComponent.js'\n\nexport const LexicalEditorFeatureClient = createClientFeature((props) => {\n return {\n nodes: [TextNode],\n plugins: [\n {\n Component: ComposeFeatureComponent,\n position: 'belowContainer',\n },\n ],\n sanitizedClientFeatureProps: {\n field: props.field,\n path: props.field?.name,\n schemaPath: props.schemaPath,\n ...props?.props,\n },\n }\n})\n"],"names":["createClientFeature","TextNode","ComposeFeatureComponent","LexicalEditorFeatureClient","props","nodes","plugins","Component","position","sanitizedClientFeatureProps","field","path","name","schemaPath"],"mappings":"AAAA;AAEA,SAASA,mBAAmB,QAAQ,sCAAqC;AACzE,SAASC,QAAQ,QAAQ,UAAS;AAElC,SAASC,uBAAuB,QAAQ,+BAA8B;AAEtE,OAAO,MAAMC,6BAA6BH,oBAAoB,CAACI;IAC7D,OAAO;QACLC,OAAO;YAACJ;SAAS;QACjBK,SAAS;YACP;gBACEC,WAAWL;gBACXM,UAAU;YACZ;SACD;QACDC,6BAA6B;YAC3BC,OAAON,MAAMM,KAAK;YAClBC,MAAMP,MAAMM,KAAK,EAAEE;YACnBC,YAAYT,MAAMS,UAAU;YAC5B,GAAGT,OAAOA,KAAK;QACjB;IACF;AACF,GAAE"}
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,SAAS,CAAA;AAIrC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAiB9C,QAAA,MAAM,eAAe,iBACJ,YAAY,sBACV,MAAM,KAAG,MAuFzB,CAAA;AAEH,OAAO,EAAE,eAAe,EAAE,CAAA"}
1
+ {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,SAAS,CAAA;AAIrC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAuC9C,QAAA,MAAM,eAAe,iBACJ,YAAY,sBACV,MAAM,KAAG,MA+FzB,CAAA;AAEH,OAAO,EAAE,eAAe,EAAE,CAAA"}
package/dist/plugin.js CHANGED
@@ -10,8 +10,28 @@ import { isPluginActivated } from './utilities/isPluginActivated.js';
10
10
  import { updateFieldsConfig } from './utilities/updateFieldsConfig.js';
11
11
  const defaultPluginConfig = {
12
12
  collections: {},
13
+ disableSponsorMessage: false,
13
14
  generatePromptOnInit: true
14
15
  };
16
+ const sponsorMessage = `
17
+ ╔═══════════════════════════════════════════════════════════════╗
18
+ ║ THANK YOU FOR USING THE PAYLOAD AI PLUGIN! ║
19
+ ║ ║
20
+ ║ If this plugin makes your life easier, please ║
21
+ ║ consider supporting its development and maintenance: ║
22
+ ║ ║
23
+ ║ • Buy me a coffee: https://buymeacoffee.com/ashbuilds ║
24
+ ║ • Sponsor on GitHub: https://github.com/sponsors/ashbuilds ║
25
+ ║ ║
26
+ ║ Your support fuels continued improvements, ║
27
+ ║ new features, and more caffeinated coding sessions! ☕ ║
28
+ ║ ║
29
+ ║ Got feedback or need help? Submit an issue here: ║
30
+ ║ • https://github.com/ashbuilds/payload-ai/issues/new ║
31
+ ║ ║
32
+ ║ Thank you again, and happy building! ║
33
+ ╚═══════════════════════════════════════════════════════════════╝
34
+ `;
15
35
  const payloadAiPlugin = (pluginConfig)=>(incomingConfig)=>{
16
36
  pluginConfig = {
17
37
  ...defaultPluginConfig,
@@ -93,6 +113,12 @@ const payloadAiPlugin = (pluginConfig)=>(incomingConfig)=>{
93
113
  await init(payload, collectionsFieldPathMap, pluginConfig).catch((error)=>{
94
114
  console.error(error);
95
115
  payload.logger.error(`— AI Plugin: Initialization Error: ${error}`);
116
+ }).finally(()=>{
117
+ if (!pluginConfig.disableSponsorMessage) {
118
+ setTimeout(()=>{
119
+ payload.logger.info(sponsorMessage);
120
+ }, 3000);
121
+ }
96
122
  });
97
123
  };
98
124
  return updatedConfig;
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/plugin.ts"],"sourcesContent":["import type { Config } from 'payload'\n\nimport { deepMerge } from 'payload/shared'\n\nimport type { PluginConfig } from './types.js'\n\nimport { lexicalJsonSchema } from './ai/schemas/lexicalJsonSchema.js'\nimport { instructionsCollection } from './collections/Instructions.js'\nimport { PLUGIN_NAME } from './defaults.js'\nimport { fetchFields } from './endpoints/fetchFields.js'\nimport { endpoints } from './endpoints/index.js'\nimport { init } from './init.js'\nimport { translations } from './translations/index.js'\nimport { isPluginActivated } from './utilities/isPluginActivated.js'\nimport { updateFieldsConfig } from './utilities/updateFieldsConfig.js'\n\nconst defaultPluginConfig: PluginConfig = {\n collections: {},\n generatePromptOnInit: true,\n}\n\nconst payloadAiPlugin =\n (pluginConfig: PluginConfig) =>\n (incomingConfig: Config): Config => {\n pluginConfig = { ...defaultPluginConfig, ...pluginConfig }\n const isActivated = isPluginActivated()\n let updatedConfig: Config = { ...incomingConfig }\n let collectionsFieldPathMap = {}\n if (isActivated) {\n const Instructions = instructionsCollection()\n // Inject editor schema to config, so that it can be accessed when /textarea endpoint will hit\n const lexicalSchema = lexicalJsonSchema(pluginConfig.editorConfig?.nodes)\n\n if (pluginConfig.debugging) {\n Instructions.admin.hidden = false\n }\n\n Instructions.admin.custom = {\n ...(Instructions.admin.custom || {}),\n [PLUGIN_NAME]: {\n editorConfig: {\n // Used in admin client for useObject hook\n schema: lexicalSchema,\n },\n },\n }\n\n const collections = [...(incomingConfig.collections ?? []), Instructions]\n const { collections: collectionSlugs = [] } = pluginConfig\n\n const { components: { providers = [] } = {} } = incomingConfig.admin || {}\n const updatedProviders = [\n ...(providers ?? []),\n {\n path: '@ai-stack/payloadcms/client#InstructionsProvider',\n },\n ]\n\n incomingConfig.admin = {\n ...(incomingConfig.admin || {}),\n components: {\n ...(incomingConfig.admin?.components ?? {}),\n providers: updatedProviders,\n },\n }\n\n updatedConfig = {\n ...incomingConfig,\n collections: collections.map((collection) => {\n if (collectionSlugs[collection.slug]) {\n const { schemaPathMap, updatedCollectionConfig } = updateFieldsConfig(collection)\n collectionsFieldPathMap = {\n ...collectionsFieldPathMap,\n ...schemaPathMap,\n }\n return updatedCollectionConfig\n }\n\n return collection\n }),\n endpoints: [\n ...(incomingConfig.endpoints ?? []),\n endpoints.textarea,\n endpoints.upload,\n fetchFields,\n ],\n i18n: {\n ...(incomingConfig.i18n || {}),\n translations: {\n ...deepMerge(translations, incomingConfig.i18n?.translations),\n },\n },\n }\n }\n\n updatedConfig.onInit = async (payload) => {\n if (incomingConfig.onInit) await incomingConfig.onInit(payload)\n\n if (!isActivated) {\n payload.logger.warn(`— AI Plugin: Not activated. Please verify your environment keys.`)\n return\n }\n\n await init(payload, collectionsFieldPathMap, pluginConfig).catch((error) => {\n console.error(error)\n payload.logger.error(`— AI Plugin: Initialization Error: ${error}`)\n })\n }\n\n return updatedConfig\n }\n\nexport { payloadAiPlugin }\n"],"names":["deepMerge","lexicalJsonSchema","instructionsCollection","PLUGIN_NAME","fetchFields","endpoints","init","translations","isPluginActivated","updateFieldsConfig","defaultPluginConfig","collections","generatePromptOnInit","payloadAiPlugin","pluginConfig","incomingConfig","isActivated","updatedConfig","collectionsFieldPathMap","Instructions","lexicalSchema","editorConfig","nodes","debugging","admin","hidden","custom","schema","collectionSlugs","components","providers","updatedProviders","path","map","collection","slug","schemaPathMap","updatedCollectionConfig","textarea","upload","i18n","onInit","payload","logger","warn","catch","error","console"],"mappings":"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"}
1
+ {"version":3,"sources":["../src/plugin.ts"],"sourcesContent":["import type { Config } from 'payload'\n\nimport { deepMerge } from 'payload/shared'\n\nimport type { PluginConfig } from './types.js'\n\nimport { lexicalJsonSchema } from './ai/schemas/lexicalJsonSchema.js'\nimport { instructionsCollection } from './collections/Instructions.js'\nimport { PLUGIN_NAME } from './defaults.js'\nimport { fetchFields } from './endpoints/fetchFields.js'\nimport { endpoints } from './endpoints/index.js'\nimport { init } from './init.js'\nimport { translations } from './translations/index.js'\nimport { isPluginActivated } from './utilities/isPluginActivated.js'\nimport { updateFieldsConfig } from './utilities/updateFieldsConfig.js'\n\nconst defaultPluginConfig: PluginConfig = {\n collections: {},\n disableSponsorMessage: false,\n generatePromptOnInit: true,\n}\n\nconst sponsorMessage = `\n╔═══════════════════════════════════════════════════════════════╗\n║ THANK YOU FOR USING THE PAYLOAD AI PLUGIN! ║\n║ ║\n║ If this plugin makes your life easier, please ║\n║ consider supporting its development and maintenance: ║\n║ ║\n║ • Buy me a coffee: https://buymeacoffee.com/ashbuilds ║\n║ • Sponsor on GitHub: https://github.com/sponsors/ashbuilds ║\n║ ║\n║ Your support fuels continued improvements, ║\n║ new features, and more caffeinated coding sessions! ☕ ║\n║ ║\n║ Got feedback or need help? Submit an issue here: ║\n║ • https://github.com/ashbuilds/payload-ai/issues/new ║\n║ ║\n║ Thank you again, and happy building! ║\n╚═══════════════════════════════════════════════════════════════╝\n`;\n\n\nconst payloadAiPlugin =\n (pluginConfig: PluginConfig) =>\n (incomingConfig: Config): Config => {\n pluginConfig = { ...defaultPluginConfig, ...pluginConfig }\n const isActivated = isPluginActivated()\n let updatedConfig: Config = { ...incomingConfig }\n let collectionsFieldPathMap = {}\n if (isActivated) {\n const Instructions = instructionsCollection()\n // Inject editor schema to config, so that it can be accessed when /textarea endpoint will hit\n const lexicalSchema = lexicalJsonSchema(pluginConfig.editorConfig?.nodes)\n\n if (pluginConfig.debugging) {\n Instructions.admin.hidden = false\n }\n\n Instructions.admin.custom = {\n ...(Instructions.admin.custom || {}),\n [PLUGIN_NAME]: {\n editorConfig: {\n // Used in admin client for useObject hook\n schema: lexicalSchema,\n },\n },\n }\n\n const collections = [...(incomingConfig.collections ?? []), Instructions]\n const { collections: collectionSlugs = [] } = pluginConfig\n\n const { components: { providers = [] } = {} } = incomingConfig.admin || {}\n const updatedProviders = [\n ...(providers ?? []),\n {\n path: '@ai-stack/payloadcms/client#InstructionsProvider',\n },\n ]\n\n incomingConfig.admin = {\n ...(incomingConfig.admin || {}),\n components: {\n ...(incomingConfig.admin?.components ?? {}),\n providers: updatedProviders,\n },\n }\n\n updatedConfig = {\n ...incomingConfig,\n collections: collections.map((collection) => {\n if (collectionSlugs[collection.slug]) {\n const { schemaPathMap, updatedCollectionConfig } = updateFieldsConfig(collection)\n collectionsFieldPathMap = {\n ...collectionsFieldPathMap,\n ...schemaPathMap,\n }\n return updatedCollectionConfig\n }\n\n return collection\n }),\n endpoints: [\n ...(incomingConfig.endpoints ?? []),\n endpoints.textarea,\n endpoints.upload,\n fetchFields,\n ],\n i18n: {\n ...(incomingConfig.i18n || {}),\n translations: {\n ...deepMerge(translations, incomingConfig.i18n?.translations),\n },\n },\n }\n }\n\n updatedConfig.onInit = async (payload) => {\n if (incomingConfig.onInit) await incomingConfig.onInit(payload)\n\n if (!isActivated) {\n payload.logger.warn(`— AI Plugin: Not activated. Please verify your environment keys.`)\n return\n }\n\n await init(payload, collectionsFieldPathMap, pluginConfig)\n .catch((error) => {\n console.error(error)\n payload.logger.error(`— AI Plugin: Initialization Error: ${error}`)\n })\n .finally(() => {\n if (!pluginConfig.disableSponsorMessage) {\n setTimeout(() => {\n payload.logger.info(sponsorMessage)\n }, 3000)\n }\n })\n }\n\n return updatedConfig\n }\n\nexport { payloadAiPlugin }\n"],"names":["deepMerge","lexicalJsonSchema","instructionsCollection","PLUGIN_NAME","fetchFields","endpoints","init","translations","isPluginActivated","updateFieldsConfig","defaultPluginConfig","collections","disableSponsorMessage","generatePromptOnInit","sponsorMessage","payloadAiPlugin","pluginConfig","incomingConfig","isActivated","updatedConfig","collectionsFieldPathMap","Instructions","lexicalSchema","editorConfig","nodes","debugging","admin","hidden","custom","schema","collectionSlugs","components","providers","updatedProviders","path","map","collection","slug","schemaPathMap","updatedCollectionConfig","textarea","upload","i18n","onInit","payload","logger","warn","catch","error","console","finally","setTimeout","info"],"mappings":"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"}
package/dist/types.d.ts CHANGED
@@ -6,6 +6,7 @@ export interface PluginConfig {
6
6
  [key: string]: boolean;
7
7
  };
8
8
  debugging?: boolean;
9
+ disableSponsorMessage?: boolean;
9
10
  editorConfig?: {
10
11
  nodes: JSONSchema[];
11
12
  };
@@ -57,5 +58,6 @@ export type BaseItemProps<T = any> = {
57
58
  onMouseEnter?: MouseEventHandler<T> | undefined;
58
59
  onMouseLeave?: MouseEventHandler<T> | undefined;
59
60
  style?: CSSProperties | undefined;
61
+ title?: string;
60
62
  };
61
63
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/dist/types.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/types.ts"],"sourcesContent":["import type { JSONSchema } from 'openai/lib/jsonschema'\nimport type { Endpoint, Field, GroupField } from 'payload'\nimport type { CSSProperties, MouseEventHandler } from 'react'\n\n\nexport interface PluginConfig {\n collections: {\n [key: string]: boolean\n }\n debugging?: boolean\n editorConfig?: { nodes: JSONSchema[] }\n fields?: Field[]\n generatePromptOnInit?: boolean\n globals?: string[]\n interfaceName?: string\n}\n\nexport interface GenerationModel {\n fields: string[]\n handler?: (payload: any, options: any) => Promise<any>\n id: string\n name: string\n output: 'audio' | 'file' | 'image' | 'json' | 'text' | 'video'\n settings?: GroupField\n supportsPromptOptimization?: boolean\n}\n\nexport interface GenerationConfig {\n models: GenerationModel[]\n provider: string\n}\n\nexport type GenerateTextarea<T = any> = (args: {\n doc: T\n locale?: string\n options?: any\n}) => Promise<string> | string\n\nexport interface Instructions {\n 'collection-slug': string\n id: string\n 'model-id': string\n prompt: string\n}\n\nexport interface Endpoints {\n textarea: Omit<Endpoint, 'root'>\n upload: Omit<Endpoint, 'root'>\n}\n\nexport type ActionMenuItems =\n | 'Compose'\n | 'Expand'\n | 'Proofread'\n | 'Rephrase'\n | 'Settings'\n | 'Simplify'\n | 'Summarize'\n | 'Tone'\n | 'Translate'\n\nexport type ActionMenuEvents =\n | 'onCompose'\n | 'onExpand'\n | 'onProofread'\n | 'onRephrase'\n | 'onSettings'\n | 'onSimplify'\n | 'onSummarize'\n | 'onTone'\n | 'onTranslate'\n\nexport type UseMenuEvents = {\n [key in ActionMenuEvents]?: (data?: unknown) => void\n}\n\nexport type BaseItemProps<T = any> = {\n children?: React.ReactNode\n disabled?: boolean\n hideIcon?: boolean\n isActive?: boolean\n isMenu?: boolean\n onClick: (data?: unknown) => void\n onMouseEnter?: MouseEventHandler<T> | undefined\n onMouseLeave?: MouseEventHandler<T> | undefined\n style?: CSSProperties | undefined\n}\n"],"names":[],"mappings":"AA4EA,WAUC"}
1
+ {"version":3,"sources":["../src/types.ts"],"sourcesContent":["import type { JSONSchema } from 'openai/lib/jsonschema'\nimport type { Endpoint, Field, GroupField } from 'payload'\nimport type { CSSProperties, MouseEventHandler } from 'react'\n\nexport interface PluginConfig {\n collections: {\n [key: string]: boolean\n }\n debugging?: boolean\n disableSponsorMessage?: boolean\n editorConfig?: { nodes: JSONSchema[] }\n fields?: Field[]\n generatePromptOnInit?: boolean\n globals?: string[]\n interfaceName?: string\n}\n\nexport interface GenerationModel {\n fields: string[]\n handler?: (payload: any, options: any) => Promise<any>\n id: string\n name: string\n output: 'audio' | 'file' | 'image' | 'json' | 'text' | 'video'\n settings?: GroupField\n supportsPromptOptimization?: boolean\n}\n\nexport interface GenerationConfig {\n models: GenerationModel[]\n provider: string\n}\n\nexport type GenerateTextarea<T = any> = (args: {\n doc: T\n locale?: string\n options?: any\n}) => Promise<string> | string\n\nexport interface Instructions {\n 'collection-slug': string\n id: string\n 'model-id': string\n prompt: string\n}\n\nexport interface Endpoints {\n textarea: Omit<Endpoint, 'root'>\n upload: Omit<Endpoint, 'root'>\n}\n\nexport type ActionMenuItems =\n | 'Compose'\n | 'Expand'\n | 'Proofread'\n | 'Rephrase'\n | 'Settings'\n | 'Simplify'\n | 'Summarize'\n | 'Tone'\n | 'Translate'\n\nexport type ActionMenuEvents =\n | 'onCompose'\n | 'onExpand'\n | 'onProofread'\n | 'onRephrase'\n | 'onSettings'\n | 'onSimplify'\n | 'onSummarize'\n | 'onTone'\n | 'onTranslate'\n\nexport type UseMenuEvents = {\n [key in ActionMenuEvents]?: (data?: unknown) => void\n}\n\nexport type BaseItemProps<T = any> = {\n children?: React.ReactNode\n disabled?: boolean\n hideIcon?: boolean\n isActive?: boolean\n isMenu?: boolean\n onClick: (data?: unknown) => void\n onMouseEnter?: MouseEventHandler<T> | undefined\n onMouseLeave?: MouseEventHandler<T> | undefined\n style?: CSSProperties | undefined\n title?: string\n}\n"],"names":[],"mappings":"AA4EA,WAWC"}
@@ -7,7 +7,7 @@ import { PLUGIN_INSTRUCTIONS_TABLE } from '../../defaults.js';
7
7
  import { setSafeLexicalState } from '../../utilities/setSafeLexicalState.js';
8
8
  import { PluginIcon } from '../Icons/Icons.js';
9
9
  import { UndoRedoActions } from './UndoRedoActions.js';
10
- import styles from './compose.module.scss';
10
+ import styles from './compose.module.css';
11
11
  import { useMenu } from './hooks/menu/useMenu.js';
12
12
  import { useGenerate } from './hooks/useGenerate.js';
13
13
  function findParentWithClass(element, className) {
@@ -70,7 +70,7 @@ export const Compose = ({ descriptionProps, instructionId })=>{
70
70
  actionsRef
71
71
  ]);
72
72
  const [isProcessing, setIsProcessing] = useState(false);
73
- const { generate, isLoading } = useGenerate({
73
+ const { generate, isLoading, stop } = useGenerate({
74
74
  instructionId
75
75
  });
76
76
  const { ActiveComponent, Menu } = useMenu({
@@ -157,7 +157,8 @@ export const Compose = ({ descriptionProps, instructionId })=>{
157
157
  verticalAlign: "bottom"
158
158
  }),
159
159
  /*#__PURE__*/ _jsx(ActiveComponent, {
160
- isLoading: isProcessing || isLoading
160
+ isLoading: isProcessing || isLoading,
161
+ stop: stop
161
162
  }),
162
163
  /*#__PURE__*/ _jsx(UndoRedoActions, {
163
164
  onChange: (val)=>{
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/ui/Compose/Compose.tsx"],"sourcesContent":["'use client'\n\nimport type { FieldDescriptionServerProps } from 'payload'\nimport type { FC } from 'react'\n\nimport { useEditorConfigContext } from '@payloadcms/richtext-lexical/client'\nimport { FieldDescription, Popup, useDocumentDrawer, useField } from '@payloadcms/ui'\nimport React, { useCallback, useEffect, useRef, useState } from 'react'\n\nimport { PLUGIN_INSTRUCTIONS_TABLE } from '../../defaults.js'\nimport { setSafeLexicalState } from '../../utilities/setSafeLexicalState.js'\nimport { PluginIcon } from '../Icons/Icons.js'\nimport { UndoRedoActions } from './UndoRedoActions.js'\nimport styles from './compose.module.scss'\nimport { useMenu } from './hooks/menu/useMenu.js'\nimport { useGenerate } from './hooks/useGenerate.js'\n\nfunction findParentWithClass(element, className) {\n // Base case: if the element is null or we've reached the top of the DOM\n if (!element || element === document.body) {\n return null\n }\n\n // Check if the current element has the class we're looking for\n if (element.classList.contains(className)) {\n return element\n }\n\n // Recursively call the function on the parent element\n return findParentWithClass(element.parentElement, className)\n}\n\ntype ComposeProps = {\n descriptionProps?: FieldDescriptionServerProps\n instructionId: string\n}\n\nexport const Compose: FC<ComposeProps> = ({ descriptionProps, instructionId }) => {\n const [DocumentDrawer, _, { closeDrawer, openDrawer }] = useDocumentDrawer({\n id: instructionId,\n collectionSlug: PLUGIN_INSTRUCTIONS_TABLE,\n })\n\n const {\n field: { type: fieldType },\n path: pathFromContext,\n schemaPath,\n } = descriptionProps || {} as FieldDescriptionServerProps\n const { editor: lexicalEditor, editorContainerRef } = useEditorConfigContext()\n\n // Below snippet is used to show/hide the actions menu on AI enabled fields\n const [input, setInput] = useState(null)\n const actionsRef = useRef(null)\n\n // Set input element for current field\n useEffect(() => {\n if (!actionsRef.current) return\n\n const fieldId = `field-${pathFromContext.replace(/\\./g, '__')}`\n const inputElement = document.getElementById(fieldId)\n\n if (!inputElement && fieldType === 'richText') {\n setInput(editorContainerRef.current)\n } else {\n actionsRef.current.setAttribute('for', fieldId)\n setInput(inputElement)\n }\n }, [pathFromContext, schemaPath, actionsRef, editorContainerRef])\n\n // Show or hide actions menu on field\n useEffect(() => {\n if (!input || !actionsRef.current) return\n\n actionsRef.current.classList.add(styles.actions_hidden)\n input.addEventListener('click', (event) => {\n document.querySelectorAll('.ai-plugin-active')?.forEach((element) => {\n const actionElement = element.querySelector(`.${styles.actions}`)\n if (actionElement) {\n actionElement.classList.add(styles.actions_hidden)\n element.classList.remove('ai-plugin-active')\n }\n })\n\n actionsRef.current.classList.remove(styles.actions_hidden)\n const parentWithClass = findParentWithClass(event.target, 'field-type')\n parentWithClass.classList.add('ai-plugin-active')\n })\n }, [input, actionsRef])\n\n const [isProcessing, setIsProcessing] = useState(false)\n const { generate, isLoading } = useGenerate({instructionId})\n\n const { ActiveComponent, Menu } = useMenu({\n onCompose: async () => {\n console.log('Composing...')\n setIsProcessing(true)\n await generate({\n action: 'Compose',\n }).finally(() => {\n setIsProcessing(false)\n })\n },\n onExpand: async () => {\n console.log('Expanding...')\n await generate({\n action: 'Expand',\n })\n },\n onProofread: async () => {\n console.log('Proofreading...')\n await generate({\n action: 'Proofread',\n })\n },\n onRephrase: async () => {\n console.log('Rephrasing...')\n await generate({\n action: 'Rephrase',\n })\n },\n onSettings: openDrawer,\n onSimplify: async () => {\n console.log('Simplifying...')\n await generate({\n action: 'Simplify',\n })\n },\n onSummarize: async () => {\n console.log('Summarizing...')\n await generate({\n action: 'Summarize',\n })\n },\n onTranslate: async (data) => {\n console.log('Translating...')\n await generate({\n action: 'Translate',\n params: data,\n })\n },\n })\n\n const { setValue } = useField<string>({\n path: pathFromContext,\n })\n\n const setIfValueIsLexicalState = useCallback((val: any) => {\n if (val.root && lexicalEditor) {\n setSafeLexicalState(JSON.stringify(val), lexicalEditor)\n }\n\n // DO NOT PROVIDE lexicalEditor as a dependency, it freaks out and does not update the editor after first undo/redo\n }, [])\n\n return (\n <React.Fragment>\n <label\n className={`${styles.actions}`}\n onClick={(e) => e.preventDefault()}\n ref={actionsRef}\n role=\"presentation\"\n >\n <DocumentDrawer\n onSave={() => {\n closeDrawer()\n }}\n />\n <Popup\n button={<PluginIcon isLoading={isProcessing || isLoading} />}\n render={({ close }) => {\n return <Menu isLoading={isProcessing || isLoading} onClose={close} />\n }}\n verticalAlign=\"bottom\"\n />\n <ActiveComponent isLoading={isProcessing || isLoading} />\n <UndoRedoActions\n onChange={(val) => {\n setValue(val)\n setIfValueIsLexicalState(val)\n }}\n />\n </label>\n {/*Render incoming description field*/}\n {descriptionProps ? (\n <div>\n <FieldDescription {...descriptionProps} />\n </div>\n ) : null}\n </React.Fragment>\n )\n}\n"],"names":["useEditorConfigContext","FieldDescription","Popup","useDocumentDrawer","useField","React","useCallback","useEffect","useRef","useState","PLUGIN_INSTRUCTIONS_TABLE","setSafeLexicalState","PluginIcon","UndoRedoActions","styles","useMenu","useGenerate","findParentWithClass","element","className","document","body","classList","contains","parentElement","Compose","descriptionProps","instructionId","DocumentDrawer","_","closeDrawer","openDrawer","id","collectionSlug","field","type","fieldType","path","pathFromContext","schemaPath","editor","lexicalEditor","editorContainerRef","input","setInput","actionsRef","current","fieldId","replace","inputElement","getElementById","setAttribute","add","actions_hidden","addEventListener","event","querySelectorAll","forEach","actionElement","querySelector","actions","remove","parentWithClass","target","isProcessing","setIsProcessing","generate","isLoading","ActiveComponent","Menu","onCompose","console","log","action","finally","onExpand","onProofread","onRephrase","onSettings","onSimplify","onSummarize","onTranslate","data","params","setValue","setIfValueIsLexicalState","val","root","JSON","stringify","Fragment","label","onClick","e","preventDefault","ref","role","onSave","button","render","close","onClose","verticalAlign","onChange","div"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/ui/Compose/Compose.tsx"],"sourcesContent":["'use client'\n\nimport type { FieldDescriptionServerProps } from 'payload'\nimport type { FC } from 'react'\n\nimport { useEditorConfigContext } from '@payloadcms/richtext-lexical/client'\nimport { FieldDescription, Popup, useDocumentDrawer, useField } from '@payloadcms/ui'\nimport React, { useCallback, useEffect, useRef, useState } from 'react'\n\nimport { PLUGIN_INSTRUCTIONS_TABLE } from '../../defaults.js'\nimport { setSafeLexicalState } from '../../utilities/setSafeLexicalState.js'\nimport { PluginIcon } from '../Icons/Icons.js'\nimport { UndoRedoActions } from './UndoRedoActions.js'\nimport styles from './compose.module.css'\nimport { useMenu } from './hooks/menu/useMenu.js'\nimport { useGenerate } from './hooks/useGenerate.js'\n\nfunction findParentWithClass(element, className) {\n // Base case: if the element is null or we've reached the top of the DOM\n if (!element || element === document.body) {\n return null\n }\n\n // Check if the current element has the class we're looking for\n if (element.classList.contains(className)) {\n return element\n }\n\n // Recursively call the function on the parent element\n return findParentWithClass(element.parentElement, className)\n}\n\ntype ComposeProps = {\n descriptionProps?: FieldDescriptionServerProps\n instructionId: string\n}\n\nexport const Compose: FC<ComposeProps> = ({ descriptionProps, instructionId }) => {\n const [DocumentDrawer, _, { closeDrawer, openDrawer }] = useDocumentDrawer({\n id: instructionId,\n collectionSlug: PLUGIN_INSTRUCTIONS_TABLE,\n })\n\n const {\n field: { type: fieldType },\n path: pathFromContext,\n schemaPath,\n } = descriptionProps || ({} as FieldDescriptionServerProps)\n const { editor: lexicalEditor, editorContainerRef } = useEditorConfigContext()\n\n // Below snippet is used to show/hide the actions menu on AI enabled fields\n const [input, setInput] = useState(null)\n const actionsRef = useRef(null)\n\n // Set input element for current field\n useEffect(() => {\n if (!actionsRef.current) return\n\n const fieldId = `field-${pathFromContext.replace(/\\./g, '__')}`\n const inputElement = document.getElementById(fieldId)\n\n if (!inputElement && fieldType === 'richText') {\n setInput(editorContainerRef.current)\n } else {\n actionsRef.current.setAttribute('for', fieldId)\n setInput(inputElement)\n }\n }, [pathFromContext, schemaPath, actionsRef, editorContainerRef])\n\n // Show or hide actions menu on field\n useEffect(() => {\n if (!input || !actionsRef.current) return\n\n actionsRef.current.classList.add(styles.actions_hidden)\n input.addEventListener('click', (event) => {\n document.querySelectorAll('.ai-plugin-active')?.forEach((element) => {\n const actionElement = element.querySelector(`.${styles.actions}`)\n if (actionElement) {\n actionElement.classList.add(styles.actions_hidden)\n element.classList.remove('ai-plugin-active')\n }\n })\n\n actionsRef.current.classList.remove(styles.actions_hidden)\n const parentWithClass = findParentWithClass(event.target, 'field-type')\n parentWithClass.classList.add('ai-plugin-active')\n })\n }, [input, actionsRef])\n\n const [isProcessing, setIsProcessing] = useState(false)\n const { generate, isLoading, stop } = useGenerate({ instructionId })\n\n const { ActiveComponent, Menu } = useMenu({\n onCompose: async () => {\n console.log('Composing...')\n setIsProcessing(true)\n await generate({\n action: 'Compose',\n }).finally(() => {\n setIsProcessing(false)\n })\n },\n onExpand: async () => {\n console.log('Expanding...')\n await generate({\n action: 'Expand',\n })\n },\n onProofread: async () => {\n console.log('Proofreading...')\n await generate({\n action: 'Proofread',\n })\n },\n onRephrase: async () => {\n console.log('Rephrasing...')\n await generate({\n action: 'Rephrase',\n })\n },\n onSettings: openDrawer,\n onSimplify: async () => {\n console.log('Simplifying...')\n await generate({\n action: 'Simplify',\n })\n },\n onSummarize: async () => {\n console.log('Summarizing...')\n await generate({\n action: 'Summarize',\n })\n },\n onTranslate: async (data) => {\n console.log('Translating...')\n await generate({\n action: 'Translate',\n params: data,\n })\n },\n })\n\n const { setValue } = useField<string>({\n path: pathFromContext,\n })\n\n const setIfValueIsLexicalState = useCallback((val: any) => {\n if (val.root && lexicalEditor) {\n setSafeLexicalState(JSON.stringify(val), lexicalEditor)\n }\n\n // DO NOT PROVIDE lexicalEditor as a dependency, it freaks out and does not update the editor after first undo/redo\n }, [])\n\n return (\n <React.Fragment>\n <label\n className={`${styles.actions}`}\n onClick={(e) => e.preventDefault()}\n ref={actionsRef}\n role=\"presentation\"\n >\n <DocumentDrawer\n onSave={() => {\n closeDrawer()\n }}\n />\n <Popup\n button={<PluginIcon isLoading={isProcessing || isLoading} />}\n render={({ close }) => {\n return <Menu isLoading={isProcessing || isLoading} onClose={close} />\n }}\n verticalAlign=\"bottom\"\n />\n <ActiveComponent isLoading={isProcessing || isLoading} stop={stop} />\n <UndoRedoActions\n onChange={(val) => {\n setValue(val)\n setIfValueIsLexicalState(val)\n }}\n />\n </label>\n {/*Render incoming description field*/}\n {descriptionProps ? (\n <div>\n <FieldDescription {...descriptionProps} />\n </div>\n ) : null}\n </React.Fragment>\n )\n}\n"],"names":["useEditorConfigContext","FieldDescription","Popup","useDocumentDrawer","useField","React","useCallback","useEffect","useRef","useState","PLUGIN_INSTRUCTIONS_TABLE","setSafeLexicalState","PluginIcon","UndoRedoActions","styles","useMenu","useGenerate","findParentWithClass","element","className","document","body","classList","contains","parentElement","Compose","descriptionProps","instructionId","DocumentDrawer","_","closeDrawer","openDrawer","id","collectionSlug","field","type","fieldType","path","pathFromContext","schemaPath","editor","lexicalEditor","editorContainerRef","input","setInput","actionsRef","current","fieldId","replace","inputElement","getElementById","setAttribute","add","actions_hidden","addEventListener","event","querySelectorAll","forEach","actionElement","querySelector","actions","remove","parentWithClass","target","isProcessing","setIsProcessing","generate","isLoading","stop","ActiveComponent","Menu","onCompose","console","log","action","finally","onExpand","onProofread","onRephrase","onSettings","onSimplify","onSummarize","onTranslate","data","params","setValue","setIfValueIsLexicalState","val","root","JSON","stringify","Fragment","label","onClick","e","preventDefault","ref","role","onSave","button","render","close","onClose","verticalAlign","onChange","div"],"mappings":"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"}
@@ -8,12 +8,12 @@
8
8
  max-height: 100px;
9
9
  opacity: 1;
10
10
  align-items: center;
11
+ }
11
12
 
12
- &_hidden {
13
- max-height: 0;
14
- overflow: hidden;
15
- padding: 0 5px;
16
- margin: 0;
17
- opacity: 0;
18
- }
13
+ .actions_hidden {
14
+ max-height: 0;
15
+ overflow: hidden;
16
+ padding: 0 5px;
17
+ margin: 0;
18
+ opacity: 0;
19
19
  }
@@ -1,7 +1,8 @@
1
1
  import type { UseMenuEvents } from '../../../../types.js';
2
2
  export declare const useMenu: (menuEvents: UseMenuEvents) => {
3
- ActiveComponent: ({ isLoading }: {
3
+ ActiveComponent: ({ isLoading, stop }: {
4
4
  isLoading: any;
5
+ stop: any;
5
6
  }) => import("react/jsx-runtime").JSX.Element;
6
7
  Menu: ({ isLoading, onClose }: {
7
8
  isLoading: any;
@@ -1 +1 @@
1
- {"version":3,"file":"useMenu.d.ts","sourceRoot":"","sources":["../../../../../src/ui/Compose/hooks/menu/useMenu.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAmB,aAAa,EAAE,MAAM,sBAAsB,CAAA;AAoB1E,eAAO,MAAM,OAAO,eAAgB,aAAa;;;;;;;;CAyEhD,CAAA"}
1
+ {"version":3,"file":"useMenu.d.ts","sourceRoot":"","sources":["../../../../../src/ui/Compose/hooks/menu/useMenu.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAmB,aAAa,EAAE,MAAM,sBAAsB,CAAA;AAoB1E,eAAO,MAAM,OAAO,eAAgB,aAAa;;;;;;;;;CAwFhD,CAAA"}
@@ -2,10 +2,10 @@
2
2
  import { jsx as _jsx } from "react/jsx-runtime";
3
3
  import { useField } from '@payloadcms/ui';
4
4
  import React, { useEffect, useMemo, useState } from 'react';
5
+ import { useFieldProps } from '../../../../providers/FieldProvider/useFieldProps.js';
5
6
  import { Compose, Proofread, Rephrase } from './items.js';
6
7
  import { menuItemsMap } from './itemsMap.js';
7
8
  import styles from './menu.module.scss';
8
- import { useFieldProps } from '../../../../providers/FieldProvider/useFieldProps.js';
9
9
  const getActiveComponent = (ac)=>{
10
10
  switch(ac){
11
11
  case 'Proofread':
@@ -45,13 +45,24 @@ export const useMenu = (menuEvents)=>{
45
45
  fieldType
46
46
  ]);
47
47
  const MemoizedActiveComponent = useMemo(()=>{
48
- return ({ isLoading })=>{
48
+ return ({ isLoading, stop })=>{
49
49
  const ActiveComponent = getActiveComponent(activeComponent);
50
50
  const activeItem = menuItemsMap.find((i)=>i.name === activeComponent);
51
51
  return /*#__PURE__*/ _jsx(ActiveComponent, {
52
- disabled: isLoading,
53
52
  hideIcon: true,
54
- onClick: menuEvents[`on${activeComponent}`],
53
+ onClick: (data)=>{
54
+ if (!isLoading) {
55
+ const trigger = menuEvents[`on${activeComponent}`];
56
+ if (typeof trigger === 'function') {
57
+ trigger(data);
58
+ } else {
59
+ console.error('No trigger found for', activeComponent);
60
+ }
61
+ } else {
62
+ stop();
63
+ }
64
+ },
65
+ title: isLoading ? 'Click to stop' : activeItem.name,
55
66
  children: isLoading && activeItem.loadingText
56
67
  });
57
68
  };
@@ -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 { Compose, Proofread, Rephrase } from './items.js'\nimport { menuItemsMap } from './itemsMap.js'\nimport styles from './menu.module.scss'\nimport { useFieldProps } from '../../../../providers/FieldProvider/useFieldProps.js'\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 }) => {\n const ActiveComponent = getActiveComponent(activeComponent)\n const activeItem = menuItemsMap.find((i) => i.name === activeComponent)\n return (\n <ActiveComponent disabled={isLoading} hideIcon onClick={menuEvents[`on${activeComponent}`]}>\n {isLoading && activeItem.loadingText}\n </ActiveComponent>\n )\n }\n }, [activeComponent, menuEvents])\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, menuEvents])\n\n return {\n ActiveComponent: MemoizedActiveComponent,\n Menu: MemoizedMenu,\n }\n}\n"],"names":["useField","React","useEffect","useMemo","useState","Compose","Proofread","Rephrase","menuItemsMap","styles","useFieldProps","getActiveComponent","ac","useMenu","menuEvents","type","fieldType","path","pathFromContext","field","activeComponent","setActiveComponent","initialValue","value","some","i","excludedFor","includes","MemoizedActiveComponent","isLoading","ActiveComponent","activeItem","find","name","disabled","hideIcon","onClick","loadingText","filteredMenuItems","filter","MemoizedMenu","onClose","div","className","menu","map","Action","component","data","Menu"],"mappings":"AAAA;;AAEA,SAASA,QAAQ,QAAQ,iBAAgB;AACzC,OAAOC,SAASC,SAAS,EAAEC,OAAO,EAAEC,QAAQ,QAAQ,QAAO;AAI3D,SAASC,OAAO,EAAEC,SAAS,EAAEC,QAAQ,QAAQ,aAAY;AACzD,SAASC,YAAY,QAAQ,gBAAe;AAC5C,OAAOC,YAAY,qBAAoB;AACvC,SAASC,aAAa,QAAQ,uDAAsD;AAEpF,MAAMC,qBAAqB,CAACC;IAC1B,OAAQA;QACN,KAAK;YACH,OAAON;QACT,KAAK;YACH,OAAOC;QACT,KAAK;YACH,OAAOF;QACT;YACE,OAAOE;IACX;AACF;AAEA,OAAO,MAAMM,UAAU,CAACC;IACtB,MAAM,EAAEC,MAAMC,SAAS,EAAEC,MAAMC,eAAe,EAAE,GAAGR;IACnD,MAAMS,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,IAAIb,aAAagB,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,EAAE;YACnB,MAAMC,kBAAkBnB,mBAAmBS;YAC3C,MAAMW,aAAavB,aAAawB,IAAI,CAAC,CAACP,IAAMA,EAAEQ,IAAI,KAAKb;YACvD,qBACE,KAACU;gBAAgBI,UAAUL;gBAAWM,QAAQ;gBAACC,SAAStB,UAAU,CAAC,CAAC,EAAE,EAAEM,iBAAiB,CAAC;0BACvFS,aAAaE,WAAWM,WAAW;;QAG1C;IACF,GAAG;QAACjB;QAAiBN;KAAW;IAEhC,MAAMwB,oBAAoBnC,QACxB,IACEK,aAAa+B,MAAM,CAAC,CAACd,IAAMA,EAAEQ,IAAI,KAAKb,mBAAmB,CAACK,EAAEC,WAAW,EAAEC,SAASX,aACpF;QAACI;QAAiBJ;KAAU;IAG9B,MAAMwB,eAAerC,QAAQ;QAC3B,OAAO,CAAC,EAAE0B,SAAS,EAAEY,OAAO,EAAE,iBAC5B,KAACC;gBAAIC,WAAWlC,OAAOmC,IAAI;0BACxBN,kBAAkBO,GAAG,CAAC,CAACpB;oBACtB,MAAMqB,SAASrB,EAAEsB,SAAS;oBAC1B,qBACE,KAACD;wBACCZ,UAAUL;wBAEVO,SAAS,CAACY;4BACR,IAAIvB,EAAEQ,IAAI,KAAK,YAAY;gCACzBZ,mBAAmBI,EAAEQ,IAAI;4BAC3B;4BAEAnB,UAAU,CAAC,CAAC,EAAE,EAAEW,EAAEQ,IAAI,EAAE,CAAC,CAACe;4BAC1BP;wBACF;kCAECZ,aAAaJ,EAAEY,WAAW;uBAVtBZ,EAAEQ,IAAI;gBAajB;;IAGN,GAAG;QAACK;QAAmBxB;KAAW;IAElC,OAAO;QACLgB,iBAAiBF;QACjBqB,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 } 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, menuEvents])\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, menuEvents])\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;QAAiBN;KAAW;IAEhC,MAAM6B,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;QAAmB7B;KAAW;IAElC,OAAO;QACLiB,iBAAiBH;QACjB0B,MAAMT;IACR;AACF,EAAC"}
@@ -8,6 +8,7 @@ export declare const useGenerate: ({ instructionId }: {
8
8
  }) => {
9
9
  generate: (options?: ActionCallbackParams) => Promise<void | Response>;
10
10
  isLoading: boolean;
11
+ stop: () => void;
11
12
  };
12
13
  export {};
13
14
  //# sourceMappingURL=useGenerate.d.ts.map
@@ -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;AAY1E,KAAK,oBAAoB,GAAG;IAAE,MAAM,EAAE,eAAe,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,CAAA;AAEzE,eAAO,MAAM,WAAW,sBAAuB;IAAE,aAAa,EAAE,MAAM,CAAA;CAAE;yBAmKnD,oBAAoB;;CAoBxC,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,sBAAuB;IAAE,aAAa,EAAE,MAAM,CAAA;CAAE;yBA0LnD,oBAAoB;;;CA2BxC,CAAA"}