strapi-content-embeddings 0.1.3 → 0.1.5
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.
- package/README.md +187 -0
- package/dist/_chunks/{App-Swmo_WMf.js → App-Rq72tIgS.js} +37 -55
- package/dist/_chunks/App-Rq72tIgS.js.map +1 -0
- package/dist/_chunks/{App-BlCKKuQN.mjs → App-j180lztd.mjs} +37 -55
- package/dist/_chunks/App-j180lztd.mjs.map +1 -0
- package/dist/_chunks/en-B4KWt_jN.js +1 -0
- package/dist/_chunks/en-B4KWt_jN.js.map +1 -0
- package/dist/_chunks/en-Byx4XI2L.mjs +1 -0
- package/dist/_chunks/en-Byx4XI2L.mjs.map +1 -0
- package/dist/_chunks/{index-CXVoFiJp.mjs → index-B3j0IFUi.mjs} +70 -27
- package/dist/_chunks/index-B3j0IFUi.mjs.map +1 -0
- package/dist/_chunks/{index-BpKkUIJY.js → index-jf6vikTZ.js} +70 -27
- package/dist/_chunks/index-jf6vikTZ.js.map +1 -0
- package/dist/admin/index.js +2 -1
- package/dist/admin/index.js.map +1 -0
- package/dist/admin/index.mjs +2 -1
- package/dist/admin/index.mjs.map +1 -0
- package/dist/admin/src/components/custom/MarkdownEditor.d.ts +1 -1
- package/dist/server/index.js +850 -57
- package/dist/server/index.js.map +1 -0
- package/dist/server/index.mjs +850 -57
- package/dist/server/index.mjs.map +1 -0
- package/dist/server/src/config/index.d.ts +9 -0
- package/dist/server/src/controllers/controller.d.ts +14 -0
- package/dist/server/src/controllers/index.d.ts +2 -0
- package/dist/server/src/index.d.ts +38 -2
- package/dist/server/src/mcp/tools/create-embedding.d.ts +6 -0
- package/dist/server/src/mcp/tools/index.d.ts +4 -0
- package/dist/server/src/plugin-manager.d.ts +16 -0
- package/dist/server/src/routes/content-api.d.ts +10 -0
- package/dist/server/src/routes/index.d.ts +10 -0
- package/dist/server/src/services/embeddings.d.ts +43 -2
- package/dist/server/src/services/index.d.ts +23 -2
- package/dist/server/src/services/sync.d.ts +48 -0
- package/dist/server/src/utils/chunking.d.ts +44 -0
- package/package.json +1 -1
|
@@ -210,6 +210,42 @@ const MDXEditorStyles = styled.createGlobalStyle`
|
|
|
210
210
|
outline: none;
|
|
211
211
|
}
|
|
212
212
|
|
|
213
|
+
/* Placeholder positioning - ensure it's at the top */
|
|
214
|
+
[class*="_contentEditable"] {
|
|
215
|
+
position: relative;
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
[class*="_contentEditable"][data-placeholder]::before {
|
|
219
|
+
position: absolute;
|
|
220
|
+
top: var(--mdx-spacing-3);
|
|
221
|
+
left: var(--mdx-spacing-3);
|
|
222
|
+
color: #a5a5ba;
|
|
223
|
+
pointer-events: none;
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
/* MDXEditor/Lexical placeholder styles */
|
|
227
|
+
[class*="_placeholder"],
|
|
228
|
+
[class*="ContentEditable__placeholder"],
|
|
229
|
+
[class*="editor-placeholder"] {
|
|
230
|
+
position: absolute !important;
|
|
231
|
+
top: var(--mdx-spacing-3) !important;
|
|
232
|
+
left: var(--mdx-spacing-3) !important;
|
|
233
|
+
color: #a5a5ba;
|
|
234
|
+
pointer-events: none;
|
|
235
|
+
overflow: hidden;
|
|
236
|
+
text-overflow: ellipsis;
|
|
237
|
+
user-select: none;
|
|
238
|
+
display: inline-block;
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
/* Editor root wrapper needs relative positioning for placeholder */
|
|
242
|
+
[class*="_rootContentEditableWrapper"],
|
|
243
|
+
[class*="_editorWrapper"] {
|
|
244
|
+
position: relative;
|
|
245
|
+
display: flex;
|
|
246
|
+
flex-direction: column;
|
|
247
|
+
}
|
|
248
|
+
|
|
213
249
|
/* Heading styles */
|
|
214
250
|
[class*="_contentEditable"] h1 {
|
|
215
251
|
font-size: 1.75rem;
|
|
@@ -342,6 +378,19 @@ const EditorWrapper = styled__default.default(designSystem.Box)`
|
|
|
342
378
|
transition: border-color 0.2s, box-shadow 0.2s;
|
|
343
379
|
box-shadow: ${({ $isFocused }) => $isFocused ? "0 0 0 2px rgba(73, 69, 255, 0.2)" : "none"};
|
|
344
380
|
`;
|
|
381
|
+
function ToolbarContents() {
|
|
382
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
383
|
+
/* @__PURE__ */ jsxRuntime.jsx(editor.UndoRedo, {}),
|
|
384
|
+
/* @__PURE__ */ jsxRuntime.jsx(editor.Separator, {}),
|
|
385
|
+
/* @__PURE__ */ jsxRuntime.jsx(editor.BlockTypeSelect, {}),
|
|
386
|
+
/* @__PURE__ */ jsxRuntime.jsx(editor.Separator, {}),
|
|
387
|
+
/* @__PURE__ */ jsxRuntime.jsx(editor.BoldItalicUnderlineToggles, {}),
|
|
388
|
+
/* @__PURE__ */ jsxRuntime.jsx(editor.Separator, {}),
|
|
389
|
+
/* @__PURE__ */ jsxRuntime.jsx(editor.CreateLink, {}),
|
|
390
|
+
/* @__PURE__ */ jsxRuntime.jsx(editor.Separator, {}),
|
|
391
|
+
/* @__PURE__ */ jsxRuntime.jsx(editor.ListsToggle, {})
|
|
392
|
+
] });
|
|
393
|
+
}
|
|
345
394
|
function MarkdownEditor({ content, onChange, height = 300 }) {
|
|
346
395
|
const [isFocused, setIsFocused] = react.useState(false);
|
|
347
396
|
return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
@@ -367,17 +416,7 @@ function MarkdownEditor({ content, onChange, height = 300 }) {
|
|
|
367
416
|
editor.linkDialogPlugin(),
|
|
368
417
|
editor.markdownShortcutPlugin(),
|
|
369
418
|
editor.toolbarPlugin({
|
|
370
|
-
toolbarContents:
|
|
371
|
-
/* @__PURE__ */ jsxRuntime.jsx(editor.UndoRedo, {}),
|
|
372
|
-
/* @__PURE__ */ jsxRuntime.jsx(editor.Separator, {}),
|
|
373
|
-
/* @__PURE__ */ jsxRuntime.jsx(editor.BlockTypeSelect, {}),
|
|
374
|
-
/* @__PURE__ */ jsxRuntime.jsx(editor.Separator, {}),
|
|
375
|
-
/* @__PURE__ */ jsxRuntime.jsx(editor.BoldItalicUnderlineToggles, {}),
|
|
376
|
-
/* @__PURE__ */ jsxRuntime.jsx(editor.Separator, {}),
|
|
377
|
-
/* @__PURE__ */ jsxRuntime.jsx(editor.CreateLink, {}),
|
|
378
|
-
/* @__PURE__ */ jsxRuntime.jsx(editor.Separator, {}),
|
|
379
|
-
/* @__PURE__ */ jsxRuntime.jsx(editor.ListsToggle, {})
|
|
380
|
-
] })
|
|
419
|
+
toolbarContents: ToolbarContents
|
|
381
420
|
})
|
|
382
421
|
]
|
|
383
422
|
}
|
|
@@ -391,7 +430,7 @@ const StyledTypography = styled__default.default(designSystem.Typography)`
|
|
|
391
430
|
margin-top: 1rem;
|
|
392
431
|
margin-bottom: 0.5rem;
|
|
393
432
|
`;
|
|
394
|
-
const
|
|
433
|
+
const CHUNK_SIZE = 4e3;
|
|
395
434
|
function EmbeddingsModal() {
|
|
396
435
|
const { post, get, put } = admin.useFetchClient();
|
|
397
436
|
const { toggleNotification } = admin.useNotification();
|
|
@@ -464,7 +503,8 @@ function EmbeddingsModal() {
|
|
|
464
503
|
}
|
|
465
504
|
}, [modifiedValues]);
|
|
466
505
|
const contentLength = content.length;
|
|
467
|
-
const
|
|
506
|
+
const willChunk = contentLength > CHUNK_SIZE;
|
|
507
|
+
const estimatedChunks = willChunk ? Math.ceil(contentLength / (CHUNK_SIZE - 200)) : 1;
|
|
468
508
|
const isSaved = !!id;
|
|
469
509
|
function generateMetadata() {
|
|
470
510
|
return {
|
|
@@ -475,7 +515,7 @@ function EmbeddingsModal() {
|
|
|
475
515
|
updatedAt: (/* @__PURE__ */ new Date()).toISOString()
|
|
476
516
|
};
|
|
477
517
|
}
|
|
478
|
-
const isValid = title.trim() && content.trim()
|
|
518
|
+
const isValid = title.trim() && content.trim();
|
|
479
519
|
function handleOpenCreate() {
|
|
480
520
|
setIsUpdateMode(false);
|
|
481
521
|
setTitle("");
|
|
@@ -504,13 +544,6 @@ function EmbeddingsModal() {
|
|
|
504
544
|
});
|
|
505
545
|
return;
|
|
506
546
|
}
|
|
507
|
-
if (isOverLimit) {
|
|
508
|
-
toggleNotification({
|
|
509
|
-
type: "warning",
|
|
510
|
-
message: `Content exceeds ${MAX_CONTENT_LENGTH} character limit`
|
|
511
|
-
});
|
|
512
|
-
return;
|
|
513
|
-
}
|
|
514
547
|
setIsLoading(true);
|
|
515
548
|
try {
|
|
516
549
|
if (isUpdateMode && existingEmbedding) {
|
|
@@ -573,6 +606,12 @@ function EmbeddingsModal() {
|
|
|
573
606
|
if (isCheckingExisting) {
|
|
574
607
|
return /* @__PURE__ */ jsxRuntime.jsx(designSystem.Box, { paddingTop: 2, children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Loader, { small: true, children: "Checking embeddings..." }) });
|
|
575
608
|
}
|
|
609
|
+
let submitButtonText;
|
|
610
|
+
if (isUpdateMode) {
|
|
611
|
+
submitButtonText = isLoading ? "Updating..." : "Update Embedding";
|
|
612
|
+
} else {
|
|
613
|
+
submitButtonText = isLoading ? "Creating..." : "Create Embedding";
|
|
614
|
+
}
|
|
576
615
|
return /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Box, { paddingTop: 2, children: [
|
|
577
616
|
existingEmbedding ? /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { direction: "column", gap: 2, children: [
|
|
578
617
|
/* @__PURE__ */ jsxRuntime.jsx(designSystem.Button, { onClick: handleViewEmbedding, startIcon: /* @__PURE__ */ jsxRuntime.jsx(icons.Eye, {}), fullWidth: true, children: "View Embedding" }),
|
|
@@ -592,11 +631,14 @@ function EmbeddingsModal() {
|
|
|
592
631
|
/* @__PURE__ */ jsxRuntime.jsx(designSystem.Modal.Header, { children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Modal.Title, { children: isUpdateMode ? "Update Embedding" : "Create Embedding from Content" }) }),
|
|
593
632
|
/* @__PURE__ */ jsxRuntime.jsx(designSystem.Modal.Body, { children: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Box, { children: [
|
|
594
633
|
/* @__PURE__ */ jsxRuntime.jsxs(StyledTypography, { variant: "omega", textColor: "neutral600", children: [
|
|
595
|
-
"
|
|
634
|
+
"Content: ",
|
|
596
635
|
contentLength,
|
|
597
|
-
"
|
|
598
|
-
|
|
599
|
-
|
|
636
|
+
" characters",
|
|
637
|
+
willChunk && /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Typography, { textColor: "primary600", children: [
|
|
638
|
+
" (will create ~",
|
|
639
|
+
estimatedChunks,
|
|
640
|
+
" embeddings)"
|
|
641
|
+
] })
|
|
600
642
|
] }),
|
|
601
643
|
/* @__PURE__ */ jsxRuntime.jsx(designSystem.Box, { marginBottom: 4, children: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Field.Root, { children: [
|
|
602
644
|
/* @__PURE__ */ jsxRuntime.jsx(designSystem.Field.Label, { children: "Title" }),
|
|
@@ -635,7 +677,7 @@ function EmbeddingsModal() {
|
|
|
635
677
|
onClick: handleSubmit,
|
|
636
678
|
disabled: isLoading || !isValid,
|
|
637
679
|
loading: isLoading,
|
|
638
|
-
children:
|
|
680
|
+
children: submitButtonText
|
|
639
681
|
}
|
|
640
682
|
)
|
|
641
683
|
] })
|
|
@@ -655,7 +697,7 @@ const index = {
|
|
|
655
697
|
defaultMessage: PLUGIN_ID
|
|
656
698
|
},
|
|
657
699
|
Component: async () => {
|
|
658
|
-
const { App } = await Promise.resolve().then(() => require("./App-
|
|
700
|
+
const { App } = await Promise.resolve().then(() => require("./App-Rq72tIgS.js"));
|
|
659
701
|
return App;
|
|
660
702
|
}
|
|
661
703
|
});
|
|
@@ -696,3 +738,4 @@ exports.MarkdownEditor = MarkdownEditor;
|
|
|
696
738
|
exports.PLUGIN_ID = PLUGIN_ID;
|
|
697
739
|
exports.RobotIcon = RobotIcon;
|
|
698
740
|
exports.index = index;
|
|
741
|
+
//# sourceMappingURL=index-jf6vikTZ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index-jf6vikTZ.js","sources":["../../admin/src/pluginId.ts","../../admin/src/utils/getTranslation.ts","../../admin/src/components/Initializer.tsx","../../admin/src/components/custom/RobotIcon.tsx","../../admin/src/components/PluginIcon.tsx","../../admin/src/components/custom/MarkdownEditor.tsx","../../admin/src/components/custom/EmbeddingsModal.tsx","../../admin/src/components/custom/EmbeddingsWidget.tsx","../../admin/src/index.tsx"],"sourcesContent":["export const PLUGIN_ID = 'strapi-content-embeddings';\n","import { PLUGIN_ID } from '../pluginId';\n\nconst getTranslation = (id: string) => `${PLUGIN_ID}.${id}`;\n\nexport { getTranslation };\n","import { useEffect, useRef } from 'react';\n\nimport { PLUGIN_ID } from '../pluginId';\n\ntype InitializerProps = {\n setPlugin: (id: string) => void;\n};\n\nconst Initializer = ({ setPlugin }: InitializerProps) => {\n const ref = useRef(setPlugin);\n\n useEffect(() => {\n ref.current(PLUGIN_ID);\n }, []);\n\n return null;\n};\n\nexport { Initializer };\n","import React from \"react\";\n\ninterface RobotIconProps {\n height?: string | number;\n width?: string | number;\n}\n\nexport function RobotIcon({ height = 48, width = 48 }: RobotIconProps) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n height={height}\n viewBox=\"0 -960 960 960\"\n width={width}\n fill=\"currentColor\"\n >\n <path d=\"M160-120v-220q0-24.75 17.625-42.375T220-400h520q24.75 0 42.375 17.625T800-340v220H160Zm200-320q-83 0-141.5-58.5T160-640q0-83 58.5-141.5T360-840h240q83 0 141.5 58.5T800-640q0 83-58.5 141.5T600-440H360ZM220-180h520v-160H220v160Zm140-320h240q58.333 0 99.167-40.765 40.833-40.764 40.833-99Q740-698 699.167-739 658.333-780 600-780H360q-58.333 0-99.167 40.765-40.833 40.764-40.833 99Q220-582 260.833-541q40.834 41 99.167 41Zm.175-110q12.825 0 21.325-8.675 8.5-8.676 8.5-21.5 0-12.825-8.675-21.325-8.676-8.5-21.5-8.5-12.825 0-21.325 8.675-8.5 8.676-8.5 21.5 0 12.825 8.675 21.325 8.676 8.5 21.5 8.5Zm240 0q12.825 0 21.325-8.675 8.5-8.676 8.5-21.5 0-12.825-8.675-21.325-8.676-8.5-21.5-8.5-12.825 0-21.325 8.675-8.5 8.676-8.5 21.5 0 12.825 8.675 21.325 8.676 8.5 21.5 8.5ZM480-180Zm0-460Z\" />\n </svg>\n );\n}\n","import { RobotIcon } from './custom/RobotIcon';\n\nconst PluginIcon = () => <RobotIcon height={24} width={24} />;\n\nexport { PluginIcon };\n","import { useState } from 'react';\nimport { Box } from '@strapi/design-system';\nimport styled, { createGlobalStyle } from 'styled-components';\nimport {\n MDXEditor,\n headingsPlugin,\n listsPlugin,\n quotePlugin,\n thematicBreakPlugin,\n markdownShortcutPlugin,\n linkPlugin,\n linkDialogPlugin,\n toolbarPlugin,\n BoldItalicUnderlineToggles,\n BlockTypeSelect,\n CreateLink,\n ListsToggle,\n UndoRedo,\n Separator,\n} from '@mdxeditor/editor';\n\ninterface MarkdownEditorProps {\n content: string;\n onChange: (content: string) => void;\n height?: number;\n}\n\nconst MDXEditorStyles = createGlobalStyle`\n /* MDXEditor CSS Variables */\n :root {\n --mdx-spacing-0_5: 0.125rem;\n --mdx-spacing-1: 0.25rem;\n --mdx-spacing-1_5: 0.375rem;\n --mdx-spacing-2: 0.5rem;\n --mdx-spacing-3: 0.75rem;\n --mdx-spacing-4: 1rem;\n --mdx-spacing-36: 9rem;\n --mdx-radius-base: 0.25rem;\n --mdx-radius-medium: 0.375rem;\n --mdx-text-sm: 0.875rem;\n --mdx-baseBg: #f6f6f9;\n --mdx-baseBgActive: #e8e8ec;\n --mdx-basePageBg: #ffffff;\n --mdx-baseBorder: #dcdce4;\n --mdx-baseBorderHover: #b9bbc6;\n --mdx-baseBase: #e0e1e6;\n --mdx-baseTextContrast: #1c2024;\n --mdx-accentText: #4945ff;\n }\n\n /* Toolbar Root - critical for horizontal layout */\n [class*=\"_toolbarRoot\"] {\n z-index: 2;\n display: flex !important;\n flex-direction: row !important;\n flex-wrap: wrap !important;\n gap: var(--mdx-spacing-1);\n border-radius: var(--mdx-radius-medium);\n padding: var(--mdx-spacing-1_5);\n align-items: center !important;\n overflow-x: auto;\n position: sticky;\n top: 0;\n background-color: var(--mdx-baseBg) !important;\n border-bottom: 1px solid var(--mdx-baseBorder);\n width: 100%;\n }\n\n [class*=\"_toolbarRoot\"] div[role='separator'] {\n margin: var(--mdx-spacing-2) var(--mdx-spacing-1);\n border-left: 1px solid var(--mdx-baseBorder);\n border-right: 1px solid var(--mdx-baseBase);\n height: var(--mdx-spacing-4);\n }\n\n [class*=\"_toolbarRoot\"] svg {\n color: var(--mdx-baseTextContrast);\n display: block;\n }\n\n /* Toolbar button groups */\n [class*=\"_toolbarGroupOfGroups\"] {\n display: flex;\n margin: 0 var(--mdx-spacing-1);\n }\n\n [class*=\"_toolbarToggleSingleGroup\"] {\n display: flex;\n align-items: center;\n white-space: nowrap;\n }\n\n /* Toolbar buttons and toggle items */\n [class*=\"_toolbarToggleItem\"],\n [class*=\"_toolbarButton\"] {\n border: 0;\n background-color: transparent;\n font-size: inherit;\n appearance: none;\n box-sizing: border-box;\n cursor: pointer;\n padding: var(--mdx-spacing-0_5);\n border-radius: var(--mdx-radius-base);\n }\n\n [class*=\"_toolbarToggleItem\"]:hover,\n [class*=\"_toolbarButton\"]:hover {\n background-color: var(--mdx-baseBgActive);\n }\n\n [class*=\"_toolbarToggleItem\"][data-state='on'],\n [class*=\"_toolbarButton\"][data-state='on'],\n [class*=\"_toolbarToggleItem\"]:active,\n [class*=\"_toolbarButton\"]:active {\n color: var(--mdx-baseTextContrast);\n background-color: var(--mdx-baseBgActive);\n }\n\n /* Block type select dropdown */\n [class*=\"_toolbarNodeKindSelectTrigger\"],\n [class*=\"_selectTrigger\"] {\n border: 0;\n display: flex;\n color: inherit;\n align-items: center;\n width: var(--mdx-spacing-36);\n padding: var(--mdx-spacing-0_5) var(--mdx-spacing-1);\n padding-inline-start: var(--mdx-spacing-2);\n border-radius: var(--mdx-radius-medium);\n white-space: nowrap;\n font-size: var(--mdx-text-sm);\n background-color: var(--mdx-basePageBg);\n margin: 0 var(--mdx-spacing-1);\n cursor: pointer;\n }\n\n /* Dropdown containers */\n [class*=\"_toolbarNodeKindSelectContainer\"],\n [class*=\"_selectContainer\"] {\n filter: drop-shadow(0 2px 2px rgb(0 0 0 / 0.2));\n z-index: 100;\n width: var(--mdx-spacing-36);\n border-radius: var(--mdx-radius-base);\n background-color: var(--mdx-basePageBg);\n font-size: var(--mdx-text-sm);\n }\n\n /* Select items */\n [class*=\"_toolbarNodeKindSelectItem\"],\n [class*=\"_selectItem\"] {\n cursor: pointer;\n display: flex;\n padding: var(--mdx-spacing-2);\n }\n\n [class*=\"_toolbarNodeKindSelectItem\"][data-highlighted],\n [class*=\"_selectItem\"][data-highlighted],\n [class*=\"_toolbarNodeKindSelectItem\"][data-state='checked'],\n [class*=\"_selectItem\"][data-state='checked'] {\n background-color: var(--mdx-baseBg);\n outline: none;\n }\n\n /* Dropdown arrow */\n [class*=\"_selectDropdownArrow\"] {\n margin-left: auto;\n display: flex;\n align-items: center;\n }\n\n /* Content editable area */\n [class*=\"_contentEditable\"] {\n box-sizing: border-box;\n width: 100%;\n color: var(--mdx-baseTextContrast);\n padding: var(--mdx-spacing-3);\n min-height: 200px;\n outline: none;\n font-family: system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif;\n font-size: 14px;\n line-height: 1.6;\n }\n\n [class*=\"_contentEditable\"]:focus {\n outline: none;\n }\n\n /* Placeholder positioning - ensure it's at the top */\n [class*=\"_contentEditable\"] {\n position: relative;\n }\n\n [class*=\"_contentEditable\"][data-placeholder]::before {\n position: absolute;\n top: var(--mdx-spacing-3);\n left: var(--mdx-spacing-3);\n color: #a5a5ba;\n pointer-events: none;\n }\n\n /* MDXEditor/Lexical placeholder styles */\n [class*=\"_placeholder\"],\n [class*=\"ContentEditable__placeholder\"],\n [class*=\"editor-placeholder\"] {\n position: absolute !important;\n top: var(--mdx-spacing-3) !important;\n left: var(--mdx-spacing-3) !important;\n color: #a5a5ba;\n pointer-events: none;\n overflow: hidden;\n text-overflow: ellipsis;\n user-select: none;\n display: inline-block;\n }\n\n /* Editor root wrapper needs relative positioning for placeholder */\n [class*=\"_rootContentEditableWrapper\"],\n [class*=\"_editorWrapper\"] {\n position: relative;\n display: flex;\n flex-direction: column;\n }\n\n /* Heading styles */\n [class*=\"_contentEditable\"] h1 {\n font-size: 1.75rem;\n font-weight: 600;\n margin: 0 0 1rem;\n }\n\n [class*=\"_contentEditable\"] h2 {\n font-size: 1.5rem;\n font-weight: 600;\n margin: 1rem 0 0.75rem;\n }\n\n [class*=\"_contentEditable\"] h3 {\n font-size: 1.25rem;\n font-weight: 600;\n margin: 1rem 0 0.5rem;\n }\n\n /* Paragraph and list styles */\n [class*=\"_contentEditable\"] p {\n margin: 0 0 1rem;\n }\n\n [class*=\"_contentEditable\"] ul,\n [class*=\"_contentEditable\"] ol {\n margin: 0 0 1rem;\n padding-left: 1.5rem;\n }\n\n [class*=\"_contentEditable\"] li {\n margin: 0.25rem 0;\n }\n\n /* Code styles */\n [class*=\"_contentEditable\"] code {\n background: #f0f0f5;\n padding: 0.2em 0.4em;\n border-radius: 3px;\n font-family: \"Monaco\", \"Menlo\", monospace;\n font-size: 0.9em;\n }\n\n [class*=\"_contentEditable\"] pre {\n background: #2d2d2d;\n color: #f8f8f2;\n padding: 1rem;\n border-radius: 4px;\n overflow-x: auto;\n margin: 0 0 1rem;\n }\n\n [class*=\"_contentEditable\"] pre code {\n background: none;\n padding: 0;\n }\n\n /* Blockquote */\n [class*=\"_contentEditable\"] blockquote {\n border-left: 3px solid #dcdce4;\n margin: 0 0 1rem;\n padding-left: 1rem;\n color: #666;\n }\n\n /* Links */\n [class*=\"_contentEditable\"] a {\n color: #4945ff;\n text-decoration: underline;\n }\n\n /* Horizontal rule */\n [class*=\"_contentEditable\"] hr {\n border: none;\n border-top: 1px solid #dcdce4;\n margin: 1.5rem 0;\n }\n\n /* Editor root */\n [class*=\"_editorRoot\"] {\n font-family: system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif;\n color: var(--mdx-baseTextContrast);\n background: var(--mdx-basePageBg);\n }\n\n /* Link dialog */\n [class*=\"_linkDialogPopoverContent\"] {\n display: flex;\n flex-direction: column;\n gap: var(--mdx-spacing-2);\n padding: var(--mdx-spacing-3);\n background-color: var(--mdx-basePageBg);\n border-radius: var(--mdx-radius-medium);\n box-shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1);\n z-index: 100;\n }\n\n [class*=\"_linkDialogInputWrapper\"] {\n display: flex;\n gap: var(--mdx-spacing-1);\n }\n\n [class*=\"_linkDialogInputWrapper\"] input {\n flex: 1;\n padding: var(--mdx-spacing-1) var(--mdx-spacing-2);\n border: 1px solid var(--mdx-baseBorder);\n border-radius: var(--mdx-radius-base);\n font-size: var(--mdx-text-sm);\n }\n\n [class*=\"_linkDialogInputWrapper\"] button {\n padding: var(--mdx-spacing-1) var(--mdx-spacing-2);\n background-color: var(--mdx-accentText);\n color: white;\n border: none;\n border-radius: var(--mdx-radius-base);\n cursor: pointer;\n }\n\n /* Popover positioning */\n [data-radix-popper-content-wrapper] {\n z-index: 100 !important;\n }\n`;\n\nconst EditorWrapper = styled(Box)<{ $isFocused: boolean }>`\n border: 1px solid ${({ $isFocused }) => ($isFocused ? '#4945ff' : '#dcdce4')};\n border-radius: 4px;\n overflow: hidden;\n background: #fff;\n transition: border-color 0.2s, box-shadow 0.2s;\n box-shadow: ${({ $isFocused }) => ($isFocused ? '0 0 0 2px rgba(73, 69, 255, 0.2)' : 'none')};\n`;\n\n// Toolbar contents component defined outside to prevent re-renders\nfunction ToolbarContents() {\n return (\n <>\n <UndoRedo />\n <Separator />\n <BlockTypeSelect />\n <Separator />\n <BoldItalicUnderlineToggles />\n <Separator />\n <CreateLink />\n <Separator />\n <ListsToggle />\n </>\n );\n}\n\nexport function MarkdownEditor({ content, onChange, height = 300 }: Readonly<MarkdownEditorProps>) {\n const [isFocused, setIsFocused] = useState(false);\n\n return (\n <>\n <MDXEditorStyles />\n <EditorWrapper\n $isFocused={isFocused}\n onFocus={() => setIsFocused(true)}\n onBlur={() => setIsFocused(false)}\n >\n <div style={{ minHeight: `${height}px` }}>\n <MDXEditor\n markdown={content}\n onChange={onChange}\n placeholder=\"Write your content here...\"\n plugins={[\n headingsPlugin(),\n listsPlugin(),\n quotePlugin(),\n thematicBreakPlugin(),\n linkPlugin(),\n linkDialogPlugin(),\n markdownShortcutPlugin(),\n toolbarPlugin({\n toolbarContents: ToolbarContents,\n }),\n ]}\n />\n </div>\n </EditorWrapper>\n </>\n );\n}\n","import React, { useState, useEffect } from \"react\";\nimport { useNavigate } from \"react-router-dom\";\nimport styled from \"styled-components\";\nimport qs from \"qs\";\nimport {\n unstable_useContentManagerContext as useContentManagerContext,\n useFetchClient,\n useNotification,\n} from \"@strapi/strapi/admin\";\nimport {\n Button,\n Typography,\n Box,\n Modal,\n Field,\n TextInput,\n Loader,\n Flex,\n} from \"@strapi/design-system\";\nimport { Plus, Eye, Pencil } from \"@strapi/icons\";\nimport { PLUGIN_ID } from \"../../pluginId\";\nimport { MarkdownEditor } from \"./MarkdownEditor\";\n\nconst StyledTypography = styled(Typography)`\n display: block;\n margin-top: 1rem;\n margin-bottom: 0.5rem;\n`;\n\nconst CHUNK_SIZE = 4000; // Content over this will be auto-chunked\n\ninterface ExistingEmbedding {\n documentId: string;\n title: string;\n content?: string;\n}\n\nexport function EmbeddingsModal() {\n const { post, get, put } = useFetchClient();\n const { toggleNotification } = useNotification();\n const navigate = useNavigate();\n\n // Access content manager context\n const context = useContentManagerContext();\n const { form, id, slug, collectionType } = context;\n\n const modifiedValues = form?.values || {};\n\n const [isVisible, setIsVisible] = useState(false);\n const [isUpdateMode, setIsUpdateMode] = useState(false);\n const [title, setTitle] = useState(\"\");\n const [content, setContent] = useState(\"\");\n const [fieldName, setFieldName] = useState(\"\");\n const [isLoading, setIsLoading] = useState(false);\n const [isCheckingExisting, setIsCheckingExisting] = useState(true);\n const [existingEmbedding, setExistingEmbedding] = useState<ExistingEmbedding | null>(null);\n\n // Check for existing embedding when component mounts or id changes\n useEffect(() => {\n async function checkExistingEmbedding() {\n if (!id || !slug) {\n setIsCheckingExisting(false);\n return;\n }\n\n try {\n // Query embeddings filtered by metadata containing this documentId\n const query = qs.stringify({\n filters: {\n $and: [\n { collectionType: { $eq: slug } },\n { metadata: { $containsi: id } },\n ],\n },\n });\n\n const response = await get(`/${PLUGIN_ID}/embeddings/find?${query}`);\n\n if (response.data?.data?.length > 0) {\n // Found existing embedding for this content\n setExistingEmbedding({\n documentId: response.data.data[0].documentId,\n title: response.data.data[0].title,\n content: response.data.data[0].content,\n });\n }\n } catch (error) {\n console.error(\"Failed to check for existing embedding:\", error);\n } finally {\n setIsCheckingExisting(false);\n }\n }\n\n checkExistingEmbedding();\n }, [id, slug, get]);\n\n // Find text content from form values\n useEffect(() => {\n if (!modifiedValues) return;\n\n // Look for common text field names\n const textFieldNames = [\"content\", \"description\", \"body\", \"text\", \"richtext\", \"markdown\"];\n\n for (const fieldName of textFieldNames) {\n const value = modifiedValues[fieldName];\n if (value) {\n setFieldName(fieldName);\n // Handle different content formats\n if (typeof value === \"string\" && value.trim()) {\n setContent(value);\n break;\n } else if (Array.isArray(value)) {\n // Blocks format - extract text\n const text = value\n .map((block: any) => {\n if (block.children) {\n return block.children.map((child: any) => child.text || \"\").join(\"\");\n }\n return \"\";\n })\n .join(\"\\n\\n\");\n if (text.trim()) {\n setContent(text);\n break;\n }\n }\n }\n }\n }, [modifiedValues]);\n\n const contentLength = content.length;\n const willChunk = contentLength > CHUNK_SIZE;\n const estimatedChunks = willChunk ? Math.ceil(contentLength / (CHUNK_SIZE - 200)) : 1;\n // Check if content is saved (has an id) - don't require publish\n const isSaved = !!id;\n\n // Auto-generate metadata from collection context\n function generateMetadata(): Record<string, any> {\n return {\n source: \"content-manager\",\n collectionType: slug || collectionType || \"unknown\",\n fieldName: fieldName || \"content\",\n documentId: id,\n updatedAt: new Date().toISOString(),\n };\n }\n\n const isValid = title.trim() && content.trim(); // No length limit - auto-chunks if needed\n\n function handleOpenCreate() {\n setIsUpdateMode(false);\n setTitle(\"\");\n // Content is already set from form values\n setIsVisible(true);\n }\n\n function handleOpenUpdate() {\n if (existingEmbedding) {\n setIsUpdateMode(true);\n setTitle(existingEmbedding.title);\n // Use current form content for update\n setIsVisible(true);\n }\n }\n\n async function handleSubmit(e: React.FormEvent) {\n e.preventDefault();\n\n if (!title.trim()) {\n toggleNotification({\n type: \"warning\",\n message: \"Embeddings title is required\",\n });\n return;\n }\n\n if (!content.trim()) {\n toggleNotification({\n type: \"warning\",\n message: \"Embeddings content is required\",\n });\n return;\n }\n\n setIsLoading(true);\n\n try {\n if (isUpdateMode && existingEmbedding) {\n // Update existing embedding\n const result = await put(`/${PLUGIN_ID}/embeddings/update-embedding/${existingEmbedding.documentId}`, {\n data: {\n title: title.trim(),\n content: content.trim(),\n metadata: generateMetadata(),\n },\n });\n\n setExistingEmbedding({\n documentId: result.data.documentId,\n title: result.data.title,\n content: result.data.content,\n });\n setIsVisible(false);\n toggleNotification({\n type: \"success\",\n message: \"Embedding updated successfully\",\n });\n } else {\n // Create new embedding\n const result = await post(`/${PLUGIN_ID}/embeddings/create-embedding`, {\n data: {\n title: title.trim(),\n content: content.trim(),\n collectionType: slug || collectionType,\n fieldName,\n metadata: generateMetadata(),\n },\n });\n\n setExistingEmbedding({\n documentId: result.data.documentId,\n title: result.data.title,\n content: result.data.content,\n });\n setIsVisible(false);\n toggleNotification({\n type: \"success\",\n message: \"Embedding created successfully\",\n });\n }\n } catch (error: any) {\n console.error(\"Failed to save embedding:\", error);\n toggleNotification({\n type: \"danger\",\n message: error.message || \"Failed to save embedding\",\n });\n } finally {\n setIsLoading(false);\n }\n }\n\n function handleViewEmbedding() {\n if (existingEmbedding?.documentId) {\n navigate(`/plugins/${PLUGIN_ID}/embeddings/${existingEmbedding.documentId}`);\n }\n }\n\n // Don't render if not in edit view context\n if (!form || !id) {\n return null;\n }\n\n // Show loading state while checking for existing embedding\n if (isCheckingExisting) {\n return (\n <Box paddingTop={2}>\n <Loader small>Checking embeddings...</Loader>\n </Box>\n );\n }\n\n // Determine button text based on mode and loading state\n let submitButtonText: string;\n if (isUpdateMode) {\n submitButtonText = isLoading ? \"Updating...\" : \"Update Embedding\";\n } else {\n submitButtonText = isLoading ? \"Creating...\" : \"Create Embedding\";\n }\n\n return (\n <Box paddingTop={2}>\n {existingEmbedding ? (\n <Flex direction=\"column\" gap={2}>\n <Button onClick={handleViewEmbedding} startIcon={<Eye />} fullWidth>\n View Embedding\n </Button>\n <Button onClick={handleOpenUpdate} startIcon={<Pencil />} variant=\"secondary\" fullWidth>\n Update Embedding\n </Button>\n </Flex>\n ) : (\n <Button\n onClick={handleOpenCreate}\n startIcon={<Plus />}\n disabled={!isSaved}\n fullWidth\n >\n Create Embedding\n </Button>\n )}\n\n {!isSaved && !existingEmbedding && (\n <Typography variant=\"pi\" textColor=\"neutral600\" style={{ display: \"block\", marginTop: \"0.5rem\" }}>\n Save content first to create embedding\n </Typography>\n )}\n\n <Modal.Root open={isVisible} onOpenChange={setIsVisible}>\n <Modal.Content>\n <Modal.Header>\n <Modal.Title>\n {isUpdateMode ? \"Update Embedding\" : \"Create Embedding from Content\"}\n </Modal.Title>\n </Modal.Header>\n <Modal.Body>\n <Box>\n <StyledTypography variant=\"omega\" textColor=\"neutral600\">\n Content: {contentLength} characters\n {willChunk && (\n <Typography textColor=\"primary600\"> (will create ~{estimatedChunks} embeddings)</Typography>\n )}\n </StyledTypography>\n\n <Box marginBottom={4}>\n <Field.Root>\n <Field.Label>Title</Field.Label>\n <TextInput\n placeholder=\"Enter embedding title\"\n value={title}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) =>\n setTitle(e.target.value)\n }\n />\n </Field.Root>\n </Box>\n\n <Box marginBottom={4}>\n <Field.Root>\n <Field.Label>Content</Field.Label>\n <Field.Hint>\n {fieldName ? `From field: ${fieldName}` : \"Enter content manually\"}\n {isUpdateMode && \" - Changes will regenerate the embedding vector\"}\n </Field.Hint>\n </Field.Root>\n <MarkdownEditor\n content={content}\n onChange={setContent}\n height={200}\n />\n </Box>\n </Box>\n </Modal.Body>\n <Modal.Footer>\n <Modal.Close>\n <Button variant=\"tertiary\">Cancel</Button>\n </Modal.Close>\n <Button\n onClick={handleSubmit}\n disabled={isLoading || !isValid}\n loading={isLoading}\n >\n {submitButtonText}\n </Button>\n </Modal.Footer>\n </Modal.Content>\n </Modal.Root>\n </Box>\n );\n}\n","import React from \"react\";\nimport { Box } from \"@strapi/design-system\";\nimport { EmbeddingsModal } from \"./EmbeddingsModal\";\n\nexport function EmbeddingsWidget() {\n return (\n <Box>\n <EmbeddingsModal />\n </Box>\n );\n}\n","import React from 'react';\nimport { getTranslation } from './utils/getTranslation';\nimport { PLUGIN_ID } from './pluginId';\nimport { Initializer } from './components/Initializer';\nimport { PluginIcon } from './components/PluginIcon';\nimport { EmbeddingsWidget } from './components/custom/EmbeddingsWidget';\n\nexport default {\n register(app: any) {\n app.addMenuLink({\n to: `plugins/${PLUGIN_ID}`,\n icon: PluginIcon,\n intlLabel: {\n id: `${PLUGIN_ID}.plugin.name`,\n defaultMessage: PLUGIN_ID,\n },\n Component: async () => {\n const { App } = await import('./pages/App');\n return App;\n },\n });\n\n app.registerPlugin({\n id: PLUGIN_ID,\n initializer: Initializer,\n isReady: false,\n name: PLUGIN_ID,\n });\n },\n\n bootstrap(app: any) {\n app.getPlugin('content-manager').injectComponent('editView', 'right-links', {\n name: \"open-ai-embeddings\",\n Component: () => <EmbeddingsWidget />\n })\n },\n\n async registerTrads(app: any) {\n const { locales } = app;\n\n const importedTranslations = await Promise.all(\n (locales as string[]).map((locale) => {\n return import(`./translations/${locale}.json`)\n .then(({ default: data }) => {\n return {\n data: getTranslation(data),\n locale,\n };\n })\n .catch(() => {\n return {\n data: {},\n locale,\n };\n });\n })\n );\n\n return importedTranslations;\n },\n};\n"],"names":["useRef","useEffect","jsx","createGlobalStyle","styled","Box","jsxs","Fragment","UndoRedo","Separator","BlockTypeSelect","BoldItalicUnderlineToggles","CreateLink","ListsToggle","useState","MDXEditor","headingsPlugin","listsPlugin","quotePlugin","thematicBreakPlugin","linkPlugin","linkDialogPlugin","markdownShortcutPlugin","toolbarPlugin","Typography","useFetchClient","useNotification","useNavigate","useContentManagerContext","qs","fieldName","Loader","Flex","Button","Eye","Pencil","Plus","Modal","Field","TextInput"],"mappings":"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"}
|
package/dist/admin/index.js
CHANGED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;"}
|
package/dist/admin/index.mjs
CHANGED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;"}
|
|
@@ -3,5 +3,5 @@ interface MarkdownEditorProps {
|
|
|
3
3
|
onChange: (content: string) => void;
|
|
4
4
|
height?: number;
|
|
5
5
|
}
|
|
6
|
-
export declare function MarkdownEditor({ content, onChange, height }: MarkdownEditorProps): import("react/jsx-runtime").JSX.Element;
|
|
6
|
+
export declare function MarkdownEditor({ content, onChange, height }: Readonly<MarkdownEditorProps>): import("react/jsx-runtime").JSX.Element;
|
|
7
7
|
export {};
|