@interware/content-generator 0.4.4 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +21 -1
- package/dist/_chunks/{App-CfwvfmvL.js → App-CJxSC8yt.js} +32 -720
- package/dist/_chunks/{App-BQr5_g5u.mjs → App-qbgUXlOZ.mjs} +38 -726
- package/dist/_chunks/ImageStudioTabs-BLAH3KYv.mjs +5270 -0
- package/dist/_chunks/ImageStudioTabs-DtusqpQO.js +5271 -0
- package/dist/_chunks/PluginProviders-D79TeGSE.js +34 -0
- package/dist/_chunks/PluginProviders-DWMpcAIh.mjs +35 -0
- package/dist/_chunks/Settings-BQXxV3LO.js +242 -0
- package/dist/_chunks/Settings-o2GngLaW.mjs +242 -0
- package/dist/_chunks/StudioApp-BaySMwrk.js +18 -0
- package/dist/_chunks/StudioApp-C_znlQRo.mjs +18 -0
- package/dist/_chunks/{getTranslation-B9ND5RaH.mjs → getTranslation-B6Bsu-uq.mjs} +1 -1
- package/dist/_chunks/{getTranslation-DNhP1INv.js → getTranslation-BRVMWSf8.js} +1 -1
- package/dist/_chunks/{index-DGPqyrzz.js → index-BKhe-Jyx.js} +24 -6
- package/dist/_chunks/{index-Dyq8dxMX.mjs → index-BKigRXm3.mjs} +25 -7
- package/dist/admin/index.js +1 -1
- package/dist/admin/index.mjs +1 -1
- package/dist/admin/src/components/PluginIcon.d.ts +4 -2
- package/dist/admin/src/components/PluginProviders.d.ts +12 -0
- package/dist/admin/src/components/generate-video/Form.d.ts +1 -1
- package/dist/admin/src/components/settings/Form.d.ts +4 -5
- package/dist/admin/src/components/settings/VertexSettings.d.ts +18 -0
- package/dist/admin/src/containers/settings/index.d.ts +7 -7
- package/dist/admin/src/features/background-removal/RemoveBackgroundButton.d.ts +7 -0
- package/dist/admin/src/features/background-removal/RemoveBackgroundDialog.d.ts +15 -0
- package/dist/admin/src/features/background-removal/colorKey.d.ts +29 -0
- package/dist/admin/src/features/background-removal/imageCanvas.d.ts +20 -0
- package/dist/admin/src/features/background-removal/mask.d.ts +10 -0
- package/dist/admin/src/features/background-removal/runtime.d.ts +31 -0
- package/dist/admin/src/features/generator/EditEmpty.d.ts +13 -0
- package/dist/admin/src/features/generator/GeneratorTab.d.ts +7 -0
- package/dist/admin/src/features/generator/GroundingSources.d.ts +9 -0
- package/dist/admin/src/features/generator/ModeSwitch.d.ts +6 -0
- package/dist/admin/src/features/generator/PromptComposer.d.ts +25 -0
- package/dist/admin/src/features/generator/ReferencePicker.d.ts +26 -0
- package/dist/admin/src/features/generator/VersionHistory.d.ts +13 -0
- package/dist/admin/src/features/generator/generatorApi.d.ts +71 -0
- package/dist/admin/src/features/generator/model.d.ts +60 -0
- package/dist/admin/src/features/generator/useGeneratorApi.d.ts +21 -0
- package/dist/admin/src/features/image-studio/ImageStudioTabs.d.ts +26 -0
- package/dist/admin/src/features/image-studio/SegmentedSwitch.d.ts +18 -0
- package/dist/admin/src/features/image-studio/checkerboard.d.ts +5 -0
- package/dist/admin/src/features/library/FileCard.d.ts +17 -0
- package/dist/admin/src/features/library/FolderTree.d.ts +14 -0
- package/dist/admin/src/features/library/LibraryDialogs.d.ts +46 -0
- package/dist/admin/src/features/library/LibraryImagePicker.d.ts +15 -0
- package/dist/admin/src/features/library/LibraryTab.d.ts +2 -0
- package/dist/admin/src/features/library/SaveToLibraryDialog.d.ts +15 -0
- package/dist/admin/src/features/library/model.d.ts +40 -0
- package/dist/admin/src/features/library/studioRoot.d.ts +11 -0
- package/dist/admin/src/features/library/uploadApi.d.ts +77 -0
- package/dist/admin/src/features/library/useLibraryApi.d.ts +34 -0
- package/dist/admin/src/features/templates/editor/ColorField.d.ts +11 -0
- package/dist/admin/src/features/templates/editor/Editor.d.ts +19 -0
- package/dist/admin/src/features/templates/editor/EditorBar.d.ts +9 -0
- package/dist/admin/src/features/templates/editor/EditorMenuBar.d.ts +58 -0
- package/dist/admin/src/features/templates/editor/EditorToolbar.d.ts +20 -0
- package/dist/admin/src/features/templates/editor/ElementPalette.d.ts +10 -0
- package/dist/admin/src/features/templates/editor/FloatingPanel.d.ts +17 -0
- package/dist/admin/src/features/templates/editor/FullscreenView.d.ts +11 -0
- package/dist/admin/src/features/templates/editor/IconPicker.d.ts +9 -0
- package/dist/admin/src/features/templates/editor/Inspector.d.ts +17 -0
- package/dist/admin/src/features/templates/editor/LayersPanel.d.ts +12 -0
- package/dist/admin/src/features/templates/editor/Precision.d.ts +23 -0
- package/dist/admin/src/features/templates/editor/RangeField.d.ts +12 -0
- package/dist/admin/src/features/templates/editor/SaveTemplateDialog.d.ts +14 -0
- package/dist/admin/src/features/templates/editor/Stage.d.ts +29 -0
- package/dist/admin/src/features/templates/editor/TemplateFolderSelect.d.ts +9 -0
- package/dist/admin/src/features/templates/editor/TemplatePicker.d.ts +23 -0
- package/dist/admin/src/features/templates/editor/TemplatesTab.d.ts +5 -0
- package/dist/admin/src/features/templates/editor/TypographyControls.d.ts +24 -0
- package/dist/admin/src/features/templates/editor/icons.d.ts +7 -0
- package/dist/admin/src/features/templates/editor/overlays.d.ts +20 -0
- package/dist/admin/src/features/templates/editor/useCanvasNav.d.ts +25 -0
- package/dist/admin/src/features/templates/editor/useFitScale.d.ts +3 -0
- package/dist/admin/src/features/templates/export/fontEmbed.d.ts +22 -0
- package/dist/admin/src/features/templates/export/imageSource.d.ts +21 -0
- package/dist/admin/src/features/templates/export/pdf.d.ts +6 -0
- package/dist/admin/src/features/templates/export/render.d.ts +22 -0
- package/dist/admin/src/features/templates/export/useEditorIO.d.ts +18 -0
- package/dist/admin/src/features/templates/fonts/catalog.d.ts +47 -0
- package/dist/admin/src/features/templates/fonts/customFonts.d.ts +19 -0
- package/dist/admin/src/features/templates/fonts/useCustomFonts.d.ts +9 -0
- package/dist/admin/src/features/templates/fonts/useFonts.d.ts +2 -0
- package/dist/admin/src/features/templates/model/drag.d.ts +10 -0
- package/dist/admin/src/features/templates/model/editorReducer.d.ts +58 -0
- package/dist/admin/src/features/templates/model/layers.d.ts +42 -0
- package/dist/admin/src/features/templates/model/palette.d.ts +38 -0
- package/dist/admin/src/features/templates/model/presets.d.ts +17 -0
- package/dist/admin/src/features/templates/model/shortcuts.d.ts +19 -0
- package/dist/admin/src/features/templates/model/snap.d.ts +24 -0
- package/dist/admin/src/features/templates/model/templates.d.ts +8 -0
- package/dist/admin/src/features/templates/model/types.d.ts +154 -0
- package/dist/admin/src/features/templates/model/viewport.d.ts +36 -0
- package/dist/admin/src/features/templates/render/IWLogo.d.ts +7 -0
- package/dist/admin/src/features/templates/render/LayerCanvas.d.ts +13 -0
- package/dist/admin/src/features/templates/render/fonts.d.ts +5 -0
- package/dist/admin/src/features/templates/render/icons.d.ts +10 -0
- package/dist/admin/src/features/templates/render/renderLayer.d.ts +9 -0
- package/dist/admin/src/features/templates/store/persist.d.ts +41 -0
- package/dist/admin/src/features/templates/store/templatesApi.d.ts +49 -0
- package/dist/admin/src/features/templates/store/useMyTemplates.d.ts +19 -0
- package/dist/admin/src/features/templates/store/useTemplateSaving.d.ts +14 -0
- package/dist/admin/src/features/templates/store/useTemplatesApi.d.ts +23 -0
- package/dist/admin/src/hooks/useAdminTheme.d.ts +8 -0
- package/dist/admin/src/hooks/useThemeColors.d.ts +9 -0
- package/dist/admin/src/lib/dataUrl.d.ts +6 -0
- package/dist/admin/src/lib/promptRules.d.ts +23 -0
- package/dist/admin/src/lib/use-cases/articles/index.d.ts +12 -1
- package/dist/admin/src/lib/use-cases/categories/index.d.ts +12 -1
- package/dist/admin/src/lib/use-cases/facebook/index.d.ts +1 -1
- package/dist/admin/src/lib/use-cases/generate-content/index.d.ts +2 -2
- package/dist/admin/src/lib/use-cases/images/index.d.ts +1 -4
- package/dist/admin/src/lib/use-cases/linkedin/index.d.ts +1 -1
- package/dist/admin/src/lib/use-cases/settings/index.d.ts +14 -2
- package/dist/admin/src/lib/use-cases/users/index.d.ts +12 -1
- package/dist/admin/src/pages/ImageStudio.d.ts +3 -0
- package/dist/admin/src/pages/StudioApp.d.ts +3 -0
- package/dist/admin/src/pluginId.d.ts +6 -0
- package/dist/admin/src/test-setup.d.ts +1 -0
- package/dist/admin/src/test-utils.d.ts +5 -0
- package/dist/server/index.js +2494 -1279
- package/dist/server/index.mjs +2501 -1285
- package/dist/server/src/bootstrap.d.ts +1 -1
- package/dist/server/src/content-types/index.d.ts +66 -1
- package/dist/server/src/content-types/template/index.d.ts +65 -0
- package/dist/server/src/content-types/template/schema.d.ts +69 -0
- package/dist/server/src/controllers/config.d.ts +10 -0
- package/dist/server/src/controllers/controller.d.ts +0 -5
- package/dist/server/src/controllers/image-studio.d.ts +23 -0
- package/dist/server/src/controllers/index.d.ts +129 -5
- package/dist/server/src/controllers/templates.d.ts +26 -0
- package/dist/server/src/image-studio/geminiConfig.d.ts +40 -0
- package/dist/server/src/image-studio/models.d.ts +39 -0
- package/dist/server/src/image-studio/prompt.d.ts +7 -0
- package/dist/server/src/image-studio/validate.d.ts +41 -0
- package/dist/server/src/index.d.ts +233 -75
- package/dist/server/src/routes/admin.d.ts +6 -2
- package/dist/server/src/routes/content-api.d.ts +4 -9
- package/dist/server/src/routes/index.d.ts +7 -11
- package/dist/server/src/routes/policies.d.ts +14 -0
- package/dist/server/src/services/image-studio.d.ts +66 -0
- package/dist/server/src/services/index.d.ts +30 -57
- package/dist/server/src/services/service.d.ts +10 -57
- package/dist/server/src/services/templates.d.ts +81 -0
- package/dist/server/src/templates/folders.d.ts +14 -0
- package/dist/server/src/templates/validate.d.ts +23 -0
- package/dist/server/src/utils/folders.d.ts +15 -0
- package/dist/server/src/utils/geminiClient.d.ts +24 -0
- package/dist/server/src/utils/secrets.d.ts +9 -0
- package/dist/server/src/utils/serviceAccount.d.ts +29 -0
- package/package.json +23 -10
- package/static/background-worker.d.mts +15 -0
- package/static/background-worker.mjs +87 -0
- package/dist/_chunks/Settings-BrqTzJp-.js +0 -262
- package/dist/_chunks/Settings-CdZnYLLK.mjs +0 -244
- package/dist/admin/src/components/Navigation.d.ts +0 -2
- package/dist/admin/src/components/generate-image/Form.d.ts +0 -15
- package/dist/admin/src/components/generate-images/Image.d.ts +0 -5
- package/dist/admin/src/components/generate-images/Images.d.ts +0 -2
- package/dist/admin/src/components/generate-images/Modal.d.ts +0 -9
- package/dist/admin/src/containers/generate-image/index.d.ts +0 -2
- package/dist/admin/src/containers/generate-images/index.d.ts +0 -2
- package/dist/admin/src/hooks/generate-images/useImages.d.ts +0 -12
- package/dist/admin/src/pages/GenerateImage.d.ts +0 -2
- package/dist/admin/src/pages/GenerateImages.d.ts +0 -2
|
@@ -2,9 +2,19 @@
|
|
|
2
2
|
/// <reference types="node" />
|
|
3
3
|
import type { Core } from '@strapi/strapi';
|
|
4
4
|
import { GoogleGenAI, Video } from '@google/genai';
|
|
5
|
+
import type { GeminiClient } from '../utils/geminiClient';
|
|
5
6
|
declare const service: ({ strapi }: {
|
|
6
7
|
strapi: Core.Strapi;
|
|
7
8
|
}) => {
|
|
9
|
+
/**
|
|
10
|
+
* Cliente de Google y su backend (S5.1): con la cuenta de servicio de Ajustes, Vertex AI en `global`; si
|
|
11
|
+
* no, la llave (`GOOGLE_API_KEY` del entorno gana a la del store, como antes; D10). El video pide
|
|
12
|
+
* `allowVertex: false` (D7).
|
|
13
|
+
*/
|
|
14
|
+
geminiClient({ allowVertex }?: {
|
|
15
|
+
allowVertex?: boolean;
|
|
16
|
+
}): Promise<GeminiClient>;
|
|
17
|
+
/** Atajo para los usos que solo necesitan el cliente (artículos). */
|
|
8
18
|
geminiConfig(): Promise<GoogleGenAI>;
|
|
9
19
|
getArticulos(sanitizedQueryParams: any): Promise<{
|
|
10
20
|
id: import("@strapi/types/dist/data").ID;
|
|
@@ -57,55 +67,6 @@ declare const service: ({ strapi }: {
|
|
|
57
67
|
sfid?: string;
|
|
58
68
|
username?: string;
|
|
59
69
|
}[]>;
|
|
60
|
-
getImagenes(): Promise<{
|
|
61
|
-
id: import("@strapi/types/dist/data").ID;
|
|
62
|
-
documentId: string;
|
|
63
|
-
locale?: string;
|
|
64
|
-
createdAt?: import("@strapi/types/dist/schema/attribute").DateTimeValue;
|
|
65
|
-
publishedAt?: import("@strapi/types/dist/schema/attribute").DateTimeValue;
|
|
66
|
-
updatedAt?: import("@strapi/types/dist/schema/attribute").DateTimeValue;
|
|
67
|
-
provider?: string;
|
|
68
|
-
alternativeText?: string;
|
|
69
|
-
caption?: string;
|
|
70
|
-
ext?: string;
|
|
71
|
-
folderPath?: string;
|
|
72
|
-
formats?: import("@strapi/types/dist/utils").JSONValue;
|
|
73
|
-
hash?: string;
|
|
74
|
-
height?: number;
|
|
75
|
-
mime?: string;
|
|
76
|
-
name?: string;
|
|
77
|
-
previewUrl?: string;
|
|
78
|
-
provider_metadata?: import("@strapi/types/dist/utils").JSONValue;
|
|
79
|
-
size?: number;
|
|
80
|
-
url?: string;
|
|
81
|
-
width?: number;
|
|
82
|
-
}[]>;
|
|
83
|
-
eliminarImagen(sanitizedQueryParams: any): Promise<{
|
|
84
|
-
documentId: string;
|
|
85
|
-
entries: {
|
|
86
|
-
id: import("@strapi/types/dist/data").ID;
|
|
87
|
-
documentId: string;
|
|
88
|
-
locale?: string;
|
|
89
|
-
createdAt?: import("@strapi/types/dist/schema/attribute").DateTimeValue;
|
|
90
|
-
publishedAt?: import("@strapi/types/dist/schema/attribute").DateTimeValue;
|
|
91
|
-
updatedAt?: import("@strapi/types/dist/schema/attribute").DateTimeValue;
|
|
92
|
-
provider?: string;
|
|
93
|
-
alternativeText?: string;
|
|
94
|
-
caption?: string;
|
|
95
|
-
ext?: string;
|
|
96
|
-
folderPath?: string;
|
|
97
|
-
formats?: import("@strapi/types/dist/utils").JSONValue;
|
|
98
|
-
hash?: string;
|
|
99
|
-
height?: number;
|
|
100
|
-
mime?: string;
|
|
101
|
-
name?: string;
|
|
102
|
-
previewUrl?: string;
|
|
103
|
-
provider_metadata?: import("@strapi/types/dist/utils").JSONValue;
|
|
104
|
-
size?: number;
|
|
105
|
-
url?: string;
|
|
106
|
-
width?: number;
|
|
107
|
-
}[];
|
|
108
|
-
}>;
|
|
109
70
|
downloadFile(ctx: any): Promise<void>;
|
|
110
71
|
_uploadGeneratedFile(file: Buffer | string, filename: string, mimeType: string, folderName?: string): Promise<any>;
|
|
111
72
|
generateArticle(ctx: any): Promise<{
|
|
@@ -128,14 +89,6 @@ declare const service: ({ strapi }: {
|
|
|
128
89
|
message: string;
|
|
129
90
|
image: any;
|
|
130
91
|
}>;
|
|
131
|
-
_callGeminiImageGeneration(promptText: string, aspectRatio: string, imageSizeLabel: string, referenceImages: {
|
|
132
|
-
buffer: Buffer;
|
|
133
|
-
mimeType: string;
|
|
134
|
-
}[]): Promise<string>;
|
|
135
|
-
generateImage(ctx: any): Promise<{
|
|
136
|
-
message: string;
|
|
137
|
-
file: any;
|
|
138
|
-
}>;
|
|
139
92
|
_callVeoVideoGeneration(promptText: string, aspectRatio: string, durationSeconds: number, sceneRefs: {
|
|
140
93
|
buffer: Buffer;
|
|
141
94
|
mimeType: string;
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import type { Core } from '@strapi/strapi';
|
|
2
|
+
import type { TemplateInput } from '../templates/validate';
|
|
3
|
+
export declare const TEMPLATE_UID = "plugin::strapi-content-generator-gemini.template";
|
|
4
|
+
export declare class TemplateNotFoundError extends Error {
|
|
5
|
+
}
|
|
6
|
+
export interface StoredTemplate extends TemplateInput {
|
|
7
|
+
documentId: string;
|
|
8
|
+
updatedAt: string;
|
|
9
|
+
replacesBase?: string;
|
|
10
|
+
}
|
|
11
|
+
type Doc = Record<string, unknown>;
|
|
12
|
+
interface DocumentsApi {
|
|
13
|
+
findMany(params?: Doc): Promise<Doc[]>;
|
|
14
|
+
findOne(params: {
|
|
15
|
+
documentId: string;
|
|
16
|
+
}): Promise<Doc | null>;
|
|
17
|
+
create(params: {
|
|
18
|
+
data: Doc;
|
|
19
|
+
}): Promise<Doc>;
|
|
20
|
+
update(params: {
|
|
21
|
+
documentId: string;
|
|
22
|
+
data: Doc;
|
|
23
|
+
}): Promise<Doc>;
|
|
24
|
+
delete(params: {
|
|
25
|
+
documentId: string;
|
|
26
|
+
}): Promise<unknown>;
|
|
27
|
+
}
|
|
28
|
+
interface Store {
|
|
29
|
+
get(params: {
|
|
30
|
+
key: string;
|
|
31
|
+
}): Promise<unknown>;
|
|
32
|
+
set(params: {
|
|
33
|
+
key: string;
|
|
34
|
+
value: unknown;
|
|
35
|
+
}): Promise<void>;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* «Mis templates» (diseño S4.6). Recibe el document service y el plugin store por inyección para
|
|
39
|
+
* probarse sin Strapi. Renombrar y eliminar carpetas actualizan el store y los templates en una
|
|
40
|
+
* sola operación del panel (D5).
|
|
41
|
+
*/
|
|
42
|
+
export declare const createTemplatesService: (docs: DocumentsApi, store: Store) => {
|
|
43
|
+
list(): Promise<StoredTemplate[]>;
|
|
44
|
+
findOne(documentId: string): Promise<StoredTemplate>;
|
|
45
|
+
create(input: unknown): Promise<StoredTemplate>;
|
|
46
|
+
update(documentId: string, patch: unknown): Promise<StoredTemplate>;
|
|
47
|
+
remove(documentId: string): Promise<void>;
|
|
48
|
+
/**
|
|
49
|
+
* Guarda la versión editada de una plantilla base (S4.15): la crea la primera vez y después la
|
|
50
|
+
* actualiza. Vive en la raíz y conserva la base como origen.
|
|
51
|
+
*/
|
|
52
|
+
saveBase(baseId: unknown, input: unknown): Promise<StoredTemplate>;
|
|
53
|
+
/** Vuelve a la versión de InterWare: borra la editada, si existe. */
|
|
54
|
+
restoreBase(baseId: unknown): Promise<void>;
|
|
55
|
+
folders: () => Promise<string[]>;
|
|
56
|
+
createFolder(path: unknown): Promise<string[]>;
|
|
57
|
+
renameFolder(from: unknown, to: unknown): Promise<string[]>;
|
|
58
|
+
deleteFolder(path: unknown): Promise<string[]>;
|
|
59
|
+
};
|
|
60
|
+
/** El document service y el store se piden en cada llamada: al instanciar el servicio el content-type podría no estar registrado. */
|
|
61
|
+
declare const _default: ({ strapi }: {
|
|
62
|
+
strapi: Core.Strapi;
|
|
63
|
+
}) => {
|
|
64
|
+
list(): Promise<StoredTemplate[]>;
|
|
65
|
+
findOne(documentId: string): Promise<StoredTemplate>;
|
|
66
|
+
create(input: unknown): Promise<StoredTemplate>;
|
|
67
|
+
update(documentId: string, patch: unknown): Promise<StoredTemplate>;
|
|
68
|
+
remove(documentId: string): Promise<void>;
|
|
69
|
+
/**
|
|
70
|
+
* Guarda la versión editada de una plantilla base (S4.15): la crea la primera vez y después la
|
|
71
|
+
* actualiza. Vive en la raíz y conserva la base como origen.
|
|
72
|
+
*/
|
|
73
|
+
saveBase(baseId: unknown, input: unknown): Promise<StoredTemplate>;
|
|
74
|
+
/** Vuelve a la versión de InterWare: borra la editada, si existe. */
|
|
75
|
+
restoreBase(baseId: unknown): Promise<void>;
|
|
76
|
+
folders: () => Promise<string[]>;
|
|
77
|
+
createFolder(path: unknown): Promise<string[]>;
|
|
78
|
+
renameFolder(from: unknown, to: unknown): Promise<string[]>;
|
|
79
|
+
deleteFolder(path: unknown): Promise<string[]>;
|
|
80
|
+
};
|
|
81
|
+
export default _default;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Carpetas de «Mis templates» como rutas (`Redes/LinkedIn`), igual que el prototipo (diseño S4.6,
|
|
3
|
+
* D4). La raíz es la cadena vacía. Funciones puras para probar sin base de datos.
|
|
4
|
+
*/
|
|
5
|
+
export declare const cleanPath: (path: string) => string;
|
|
6
|
+
export declare const parentOf: (path: string) => string;
|
|
7
|
+
export declare const nameOf: (path: string) => string;
|
|
8
|
+
/** Une una carpeta y un nombre; una «/» dentro del nombre se vuelve guion (como en la biblioteca). */
|
|
9
|
+
export declare const joinPath: (parent: string, name: string) => string;
|
|
10
|
+
/** ¿`path` es `base` o está dentro de ella? La raíz nunca está «bajo» una carpeta. */
|
|
11
|
+
export declare const isUnder: (path: string, base: string) => boolean;
|
|
12
|
+
export declare const renamePath: (path: string, from: string, to: string) => string;
|
|
13
|
+
/** Árbol completo: cada ruta con sus ancestros, sin raíz ni duplicados, en orden alfabético. */
|
|
14
|
+
export declare const folderTree: (paths: string[]) => string[];
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/** Entrada inválida: el controlador la responde como 400. */
|
|
2
|
+
export declare class TemplateInputError extends Error {
|
|
3
|
+
}
|
|
4
|
+
/**
|
|
5
|
+
* Tipos de capa del editor. Contrato compartido con el admin: `layerTypes.test.ts` del admin lo
|
|
6
|
+
* compara con `LayerType` para que no se desincronicen (diseño S4.6, D3).
|
|
7
|
+
*/
|
|
8
|
+
export declare const LAYER_TYPES: readonly ["text", "list", "quote", "rect", "shape", "badge", "logo", "image", "icon", "avatar", "qr"];
|
|
9
|
+
export interface TemplateInput {
|
|
10
|
+
name: string;
|
|
11
|
+
folder: string;
|
|
12
|
+
width: number;
|
|
13
|
+
height: number;
|
|
14
|
+
background: string;
|
|
15
|
+
safeMargin: number;
|
|
16
|
+
gridUnit: number;
|
|
17
|
+
layers: Record<string, unknown>[];
|
|
18
|
+
baseId?: string;
|
|
19
|
+
}
|
|
20
|
+
/** Valida y normaliza un template completo (crear). Descarta campos desconocidos. */
|
|
21
|
+
export declare const validateTemplate: (input: unknown) => TemplateInput;
|
|
22
|
+
/** Valida solo los campos presentes (actualizar). */
|
|
23
|
+
export declare const validateTemplatePatch: (input: unknown) => Partial<TemplateInput>;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { Core } from '@strapi/strapi';
|
|
2
|
+
/** Ruta válida de carpeta en Strapi: ids separados por diagonal (`/44/45`). */
|
|
3
|
+
export declare const hasValidPath: (path: string) => boolean;
|
|
4
|
+
/**
|
|
5
|
+
* Corrige el `path` de las carpetas con ese nombre cuyo `path` no cumple el formato de Strapi. El
|
|
6
|
+
* plugin creaba «Generated» con `path: '/generated'` (diseño S4.3); Strapi calcula `/<pathId>` bajo
|
|
7
|
+
* la ruta de la carpeta superior. Idempotente: las carpetas válidas no se tocan.
|
|
8
|
+
*/
|
|
9
|
+
export declare const repairFolderPaths: (strapi: Core.Strapi, name: string) => Promise<{
|
|
10
|
+
id: number;
|
|
11
|
+
from: string;
|
|
12
|
+
to: string;
|
|
13
|
+
}[]>;
|
|
14
|
+
/** Id de la carpeta de la raíz con ese nombre; la crea con el folder service de Strapi si falta. */
|
|
15
|
+
export declare const ensureFolder: (strapi: Core.Strapi, name: string) => Promise<number>;
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { GoogleGenAI } from '@google/genai';
|
|
2
|
+
import type { Backend } from '../image-studio/geminiConfig';
|
|
3
|
+
/** Región de Vertex AI: `global` (decisión de Israel, S5.1). Nano Banana 2 no está en la región de México. */
|
|
4
|
+
export declare const VERTEX_LOCATION = "global";
|
|
5
|
+
export interface GeminiClient {
|
|
6
|
+
ai: GoogleGenAI;
|
|
7
|
+
backend: Backend;
|
|
8
|
+
}
|
|
9
|
+
interface ClientInput {
|
|
10
|
+
/** JSON guardado en el plugin store (`VERTEX_SERVICE_ACCOUNT`), o null. */
|
|
11
|
+
serviceAccount: unknown;
|
|
12
|
+
/** Llave de la Gemini API (entorno o plugin store), o null. */
|
|
13
|
+
apiKey: unknown;
|
|
14
|
+
/** El video (Veo) usa la llave aunque haya cuenta de servicio (D7). */
|
|
15
|
+
allowVertex?: boolean;
|
|
16
|
+
}
|
|
17
|
+
type GenAIConstructor = new (options: ConstructorParameters<typeof GoogleGenAI>[0]) => GoogleGenAI;
|
|
18
|
+
/**
|
|
19
|
+
* Crea el cliente de Google y dice con qué backend (S5.1): con cuenta de servicio, Vertex AI en `global`; si no,
|
|
20
|
+
* la llave de la Gemini API. Las credenciales nunca aparecen en los errores. Si Vertex falla después, el error
|
|
21
|
+
* llega tal cual: no se cae a la llave en silencio (D9).
|
|
22
|
+
*/
|
|
23
|
+
export declare const createGeminiClient: ({ serviceAccount, apiKey, allowVertex }: ClientInput, Ctor?: GenAIConstructor) => GeminiClient;
|
|
24
|
+
export {};
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Estado público de una credencial guardada: si existe y sus últimos 4 caracteres, para que el
|
|
3
|
+
* panel pueda identificarla sin recibir nunca el valor completo.
|
|
4
|
+
*/
|
|
5
|
+
export interface MaskedSecret {
|
|
6
|
+
configured: boolean;
|
|
7
|
+
last4: string | null;
|
|
8
|
+
}
|
|
9
|
+
export declare const maskSecret: (value: unknown) => MaskedSecret;
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cuenta de servicio de Google Cloud para Vertex AI (S5.1). Un admin pega su JSON en Ajustes y se guarda
|
|
3
|
+
* en el plugin store (decisión de Israel). Se conserva solo lo que usa el cliente; los mensajes de error
|
|
4
|
+
* nombran campos, nunca repiten el contenido: la llave privada es un secreto.
|
|
5
|
+
*/
|
|
6
|
+
/** Clave de la cuenta de servicio en el plugin store (S5.1, D8). */
|
|
7
|
+
export declare const VERTEX_KEY = "VERTEX_SERVICE_ACCOUNT";
|
|
8
|
+
export interface ServiceAccount {
|
|
9
|
+
projectId: string;
|
|
10
|
+
clientEmail: string;
|
|
11
|
+
privateKey: string;
|
|
12
|
+
}
|
|
13
|
+
export type ParseResult = {
|
|
14
|
+
ok: true;
|
|
15
|
+
account: ServiceAccount;
|
|
16
|
+
} | {
|
|
17
|
+
ok: false;
|
|
18
|
+
message: string;
|
|
19
|
+
};
|
|
20
|
+
/** Estado público para `GET /config`: proyecto y correo, nunca la llave. */
|
|
21
|
+
export interface PublicServiceAccount {
|
|
22
|
+
configured: boolean;
|
|
23
|
+
projectId: string | null;
|
|
24
|
+
clientEmail: string | null;
|
|
25
|
+
}
|
|
26
|
+
export declare const parseServiceAccount: (value: unknown) => ParseResult;
|
|
27
|
+
/** JSON mínimo que se guarda en el store: lo que `parseServiceAccount` vuelve a leer. */
|
|
28
|
+
export declare const storedServiceAccount: (account: ServiceAccount) => string;
|
|
29
|
+
export declare const publicServiceAccount: (stored: unknown) => PublicServiceAccount;
|
package/package.json
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
-
"version": "0.
|
|
2
|
+
"version": "0.6.0",
|
|
3
3
|
"keywords": [],
|
|
4
4
|
"type": "commonjs",
|
|
5
5
|
"publishConfig": {
|
|
@@ -23,27 +23,34 @@
|
|
|
23
23
|
}
|
|
24
24
|
},
|
|
25
25
|
"files": [
|
|
26
|
-
"dist"
|
|
26
|
+
"dist",
|
|
27
|
+
"static"
|
|
27
28
|
],
|
|
28
29
|
"scripts": {
|
|
29
30
|
"build": "strapi-plugin build",
|
|
30
31
|
"watch": "strapi-plugin watch",
|
|
31
32
|
"watch:link": "strapi-plugin watch:link",
|
|
32
33
|
"verify": "strapi-plugin verify",
|
|
34
|
+
"test": "vitest run",
|
|
33
35
|
"changeset": "changeset",
|
|
34
36
|
"publish:packages": "changeset publish",
|
|
35
37
|
"version:packages": "changeset version",
|
|
36
38
|
"release": "npm run build && changeset publish",
|
|
37
|
-
"test:ts
|
|
38
|
-
"test:ts:
|
|
39
|
+
"test:ts": "npm run test:ts:front && npm run test:ts:back",
|
|
40
|
+
"test:ts:front": "tsc --noEmit -p admin/tsconfig.json",
|
|
41
|
+
"test:ts:back": "tsc --noEmit -p server/tsconfig.json",
|
|
39
42
|
"prepare": "husky"
|
|
40
43
|
},
|
|
41
44
|
"dependencies": {
|
|
42
|
-
"@google/genai": "^1.
|
|
45
|
+
"@google/genai": "^1.49.0",
|
|
46
|
+
"@radix-ui/react-tooltip": "1.0.7",
|
|
43
47
|
"@reduxjs/toolkit": "^1.9.7",
|
|
44
|
-
"@strapi/design-system": "^2.
|
|
45
|
-
"@strapi/icons": "^2.
|
|
48
|
+
"@strapi/design-system": "^2.2.3",
|
|
49
|
+
"@strapi/icons": "^2.2.3",
|
|
46
50
|
"formik": "^2.4.9",
|
|
51
|
+
"html-to-image": "^1.11.13",
|
|
52
|
+
"onnxruntime-web": "1.30.0",
|
|
53
|
+
"qrcode-generator": "^2.0.4",
|
|
47
54
|
"react-intl": "^7.1.14",
|
|
48
55
|
"react-redux": "^8.1.3",
|
|
49
56
|
"yup": "^1.7.1"
|
|
@@ -54,18 +61,24 @@
|
|
|
54
61
|
"@commitlint/cli": "^20.3.1",
|
|
55
62
|
"@commitlint/config-conventional": "^20.3.1",
|
|
56
63
|
"@strapi/sdk-plugin": "^5.4.0",
|
|
57
|
-
"@strapi/strapi": "^5.
|
|
58
|
-
"@strapi/typescript-utils": "^5.
|
|
64
|
+
"@strapi/strapi": "^5.51.0",
|
|
65
|
+
"@strapi/typescript-utils": "^5.51.0",
|
|
66
|
+
"@testing-library/jest-dom": "^6.9.1",
|
|
67
|
+
"@testing-library/react": "^16.3.3",
|
|
68
|
+
"@testing-library/user-event": "^14.6.7",
|
|
59
69
|
"@types/react": "^18",
|
|
60
70
|
"@types/react-dom": "^18",
|
|
71
|
+
"@vitejs/plugin-react": "^5.2.0",
|
|
61
72
|
"cz-conventional-changelog": "^3.3.0",
|
|
62
73
|
"husky": "^9.1.7",
|
|
74
|
+
"jsdom": "^29.1.1",
|
|
63
75
|
"prettier": "^3.6.2",
|
|
64
76
|
"react": "^18",
|
|
65
77
|
"react-dom": "^18",
|
|
66
78
|
"react-router-dom": "^6.30.2",
|
|
67
79
|
"styled-components": "^6.1.19",
|
|
68
|
-
"typescript": "^5.9.3"
|
|
80
|
+
"typescript": "^5.9.3",
|
|
81
|
+
"vitest": "^3.2.7"
|
|
69
82
|
},
|
|
70
83
|
"peerDependencies": {
|
|
71
84
|
"@strapi/sdk-plugin": "^5.3.2",
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/** Tipos del worker de «Quitar fondo» (`background-worker.mjs`). */
|
|
2
|
+
export declare const MODEL_URL: string;
|
|
3
|
+
export declare const ORT_DIR: string;
|
|
4
|
+
export declare const INPUT_SIZE: number;
|
|
5
|
+
export declare const toInputTensor: (rgba: Uint8ClampedArray, width: number, height: number) => Float32Array;
|
|
6
|
+
export declare const normalizeMask: (probs: Float32Array) => Float32Array;
|
|
7
|
+
|
|
8
|
+
type WorkerIn = { type: 'load' } | { type: 'run'; id: number; rgba: ArrayBuffer };
|
|
9
|
+
interface Deps {
|
|
10
|
+
post: (data: Record<string, unknown>, transfer?: Transferable[]) => void;
|
|
11
|
+
loadOrt: () => Promise<any>;
|
|
12
|
+
hasWebGPU: () => Promise<boolean>;
|
|
13
|
+
}
|
|
14
|
+
export declare const handleMessage: (msg: WorkerIn, deps: Deps) => Promise<void>;
|
|
15
|
+
export declare const resetWorker: () => void;
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Worker de «Quitar fondo» (S4.17, ADR-007). El CMS lo sirve desde `/ort/` junto a onnxruntime-web
|
|
3
|
+
* (lo copia `npm run assets:image-studio` de web-cms desde este paquete), así la inferencia no
|
|
4
|
+
* bloquea el panel. Recibe los píxeles a 1024 × 1024, corre ISNet con WebGPU (o WASM si el navegador
|
|
5
|
+
* no tiene WebGPU) y devuelve la máscara 0–1. El escalado al tamaño original y el alfa los hace el panel.
|
|
6
|
+
*
|
|
7
|
+
* Mensajes: `{ type: 'load' }` → `status` / `ready` | `error`; `{ type: 'run', id, rgba }` → `mask` | `error`.
|
|
8
|
+
*/
|
|
9
|
+
export const MODEL_URL = '/models/isnet/model.onnx';
|
|
10
|
+
export const ORT_DIR = '/ort/';
|
|
11
|
+
export const INPUT_SIZE = 1024;
|
|
12
|
+
|
|
13
|
+
/** RGBA → tensor NCHW `[1, 3, h, w]` con la normalización del modelo: (x − 128) / 256. El alfa se descarta. */
|
|
14
|
+
export const toInputTensor = (rgba, width, height) => {
|
|
15
|
+
const plane = width * height;
|
|
16
|
+
const out = new Float32Array(3 * plane);
|
|
17
|
+
for (let i = 0; i < plane; i++) {
|
|
18
|
+
for (let c = 0; c < 3; c++) out[c * plane + i] = (rgba[4 * i + c] - 128) / 256;
|
|
19
|
+
}
|
|
20
|
+
return out;
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
/** Probabilidades del modelo → máscara estirada a 0–1 (mín–máx, como rembg). */
|
|
24
|
+
export const normalizeMask = (probs) => {
|
|
25
|
+
let min = Infinity;
|
|
26
|
+
let max = -Infinity;
|
|
27
|
+
for (const v of probs) {
|
|
28
|
+
if (v < min) min = v;
|
|
29
|
+
if (v > max) max = v;
|
|
30
|
+
}
|
|
31
|
+
const range = max - min;
|
|
32
|
+
const out = new Float32Array(probs.length);
|
|
33
|
+
if (range > 1e-6) for (let i = 0; i < probs.length; i++) out[i] = (probs[i] - min) / range;
|
|
34
|
+
return out;
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
let session = null;
|
|
38
|
+
let ortModule = null;
|
|
39
|
+
|
|
40
|
+
/** Solo para pruebas. */
|
|
41
|
+
export const resetWorker = () => {
|
|
42
|
+
session = null;
|
|
43
|
+
ortModule = null;
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* Atiende un mensaje. Las dependencias llegan por parámetro para probarlo sin worker ni GPU.
|
|
48
|
+
* @param {{ type: 'load' } | { type: 'run', id: number, rgba: ArrayBuffer }} msg
|
|
49
|
+
*/
|
|
50
|
+
export const handleMessage = async (msg, { post, loadOrt, hasWebGPU }) => {
|
|
51
|
+
if (msg.type === 'load') {
|
|
52
|
+
try {
|
|
53
|
+
post({ type: 'status', status: 'Descargando modelo…' });
|
|
54
|
+
const backend = (await hasWebGPU()) ? 'webgpu' : 'wasm';
|
|
55
|
+
ortModule = await loadOrt();
|
|
56
|
+
ortModule.env.wasm.wasmPaths = ORT_DIR;
|
|
57
|
+
// Sin aislamiento cross-origin (COEP apagada en el CMS) WASM corre en un solo hilo.
|
|
58
|
+
ortModule.env.wasm.numThreads = 1;
|
|
59
|
+
session = await ortModule.InferenceSession.create(MODEL_URL, { executionProviders: [backend], logSeverityLevel: 3 });
|
|
60
|
+
return post({ type: 'ready', backend });
|
|
61
|
+
} catch (err) {
|
|
62
|
+
session = null;
|
|
63
|
+
return post({ type: 'error', message: String(err?.message ?? err) });
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
if (msg.type === 'run') {
|
|
67
|
+
try {
|
|
68
|
+
if (!session) throw new Error('El modelo no está cargado.');
|
|
69
|
+
const input = new ortModule.Tensor('float32', toInputTensor(new Uint8ClampedArray(msg.rgba), INPUT_SIZE, INPUT_SIZE), [1, 3, INPUT_SIZE, INPUT_SIZE]);
|
|
70
|
+
const result = await session.run({ [session.inputNames[0]]: input });
|
|
71
|
+
const mask = normalizeMask(result[session.outputNames[0]].data);
|
|
72
|
+
return post({ type: 'mask', id: msg.id, mask: mask.buffer }, [mask.buffer]);
|
|
73
|
+
} catch (err) {
|
|
74
|
+
return post({ type: 'error', id: msg.id, message: String(err?.message ?? err) });
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
};
|
|
78
|
+
|
|
79
|
+
// Solo dentro de un worker (en las pruebas este módulo se importa como uno normal).
|
|
80
|
+
if (typeof WorkerGlobalScope !== 'undefined' && self instanceof WorkerGlobalScope) {
|
|
81
|
+
const deps = {
|
|
82
|
+
post: (data, transfer) => self.postMessage(data, transfer ?? []),
|
|
83
|
+
loadOrt: () => import(`${ORT_DIR}ort.webgpu.bundle.min.mjs`),
|
|
84
|
+
hasWebGPU: async () => Boolean(self.navigator.gpu && (await self.navigator.gpu.requestAdapter().catch(() => null))),
|
|
85
|
+
};
|
|
86
|
+
self.onmessage = (e) => handleMessage(e.data, deps);
|
|
87
|
+
}
|