n8n-nodes-oxsr-technical-utils 4.0.1 → 4.1.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.
@@ -19,6 +19,8 @@ const multisite_1 = require("./actions/multisite");
19
19
  const iaDev_1 = require("./actions/iaDev");
20
20
  const metrics_1 = require("./actions/metrics");
21
21
  const seo_1 = require("./actions/seo");
22
+ const media_1 = require("./actions/media");
23
+ const server_1 = require("./actions/server");
22
24
  function normalizeSiteUrl(siteUrl) {
23
25
  const raw = (siteUrl || '').trim();
24
26
  if (!raw)
@@ -74,6 +76,8 @@ const AUTO_RESOURCE_VALUES = [
74
76
  'logs',
75
77
  'metrics',
76
78
  'content',
79
+ 'media',
80
+ 'server',
77
81
  'security',
78
82
  'performance',
79
83
  'actions',
@@ -113,6 +117,8 @@ const AUTO_OPERATIONS_BY_RESOURCE = {
113
117
  'addMenuCategories',
114
118
  'deleteMenuItemsByText',
115
119
  ],
120
+ server: ['listFiles', 'getFile', 'updateFile', 'deleteFile', 'getServerDiagnostics', 'runServerConsole'],
121
+ media: ['getMediaDetailed', 'updateMediaMeta', 'deleteMedia'],
116
122
  security: [
117
123
  'getFileChecksums',
118
124
  'checkOpenRegistration',
@@ -151,7 +157,7 @@ const AUTO_OPERATIONS_BY_RESOURCE = {
151
157
  email: ['sendEmail', 'getEmailLog', 'testSmtp'],
152
158
  multisite: ['getMultisiteSites', 'getMultisiteHealth', 'activatePluginNetwork'],
153
159
  iaDev: ['seoMetaGenerator', 'faqGenerator'],
154
- seo: ['siteKitHealth', 'keywordOpportunities', 'keywordCannibalization', 'contentGapScanner', 'onPageScore', 'autoBriefSeo'],
160
+ seo: ['siteKitHealth', 'keywordIdeasSite', 'keywordOpportunities', 'keywordCannibalization', 'contentGapScanner', 'onPageScore', 'autoBriefSeo'],
155
161
  };
156
162
  const OPERATION_DESCRIPTIONS = {
157
163
  healthCheck: 'Acción de diagnóstico general del sitio WordPress con OXSR Technical Utils.',
@@ -179,6 +185,15 @@ const OPERATION_DESCRIPTIONS = {
179
185
  bulkStatus: 'Acción de cambiar estado en lote para múltiples posts.',
180
186
  getMedia: 'Acción de listar librería de medios por rango y estado.',
181
187
  deleteOrphanMedia: 'Acción de eliminar medios huérfanos sin uso en contenido.',
188
+ getMediaDetailed: 'Acción de listar imágenes con ALT, título, URL, nombre de archivo y uso en posts.',
189
+ updateMediaMeta: 'Acción de actualizar ALT y título de una imagen por ID o URL.',
190
+ deleteMedia: 'Acción de eliminar imágenes por IDs o URLs indicadas.',
191
+ listFiles: 'Acción de listar archivos y carpetas del servidor.',
192
+ getFile: 'Acción de ver contenido de archivo del servidor.',
193
+ updateFile: 'Acción de editar/guardar archivo del servidor.',
194
+ deleteFile: 'Acción de eliminar archivo del servidor.',
195
+ getServerDiagnostics: 'Acción de leer diagnóstico general de servidor y rendimiento.',
196
+ runServerConsole: 'Acción de ejecutar comando de consola permitido para diagnóstico.',
182
197
  getContentSource: 'Acción de leer código fuente raw y metadatos SEO de un contenido.',
183
198
  updateContentSource: 'Acción de actualizar source raw, SEO y portada de un contenido.',
184
199
  getMenus: 'Acción de listar menús y, si se indica menu_id, su detalle de items.',
@@ -250,10 +265,11 @@ const OPERATION_DESCRIPTIONS = {
250
265
  seoMetaGenerator: 'Acción IA para generar metadatos SEO en lote.',
251
266
  faqGenerator: 'Acción IA para generar FAQs estructuradas.',
252
267
  siteKitHealth: 'Acción SEO para comprobar estado de integración Google Site Kit.',
268
+ keywordIdeasSite: 'Acción SEO para sugerir keywords basadas en contenido real del sitio (titles, H1/H2, focus keyword).',
253
269
  keywordOpportunities: 'Acción SEO para detectar quick wins por impresiones altas y CTR bajo.',
254
270
  keywordCannibalization: 'Acción SEO para detectar canibalización de keywords entre URLs.',
255
271
  contentGapScanner: 'Acción SEO para detectar brechas de contenido frente a competidores.',
256
- onPageScore: 'Acción SEO para puntuar on-page de URL/post (title, H1, enlaces, schema, ALT).',
272
+ onPageScore: 'Acción SEO para puntuar on-page y devolver title/meta/H1-H3 + contenido en markdown limpio para análisis IA.',
257
273
  autoBriefSeo: 'Acción SEO para generar brief de contenido por keyword objetivo.',
258
274
  };
259
275
  function humanizeOperation(value) {
@@ -431,6 +447,8 @@ class OXSRTechnicalUtils {
431
447
  { name: 'Logs & Errors', value: 'logs', description: 'Errores PHP y análisis de log' },
432
448
  { name: 'Metrics', value: 'metrics', description: 'Visitas, interacciones y rendimiento de contenido' },
433
449
  { name: 'Content', value: 'content', description: 'Posts, borradores y ALT faltante' },
450
+ { name: 'Media', value: 'media', description: 'Biblioteca de medios (imágenes): ALT, título, uso y eliminación' },
451
+ { name: 'Servidor', value: 'server', description: 'Consola de diagnóstico y gestión de archivos del servidor' },
434
452
  { name: 'Security', value: 'security', description: 'Checksums y configuración de registro' },
435
453
  { name: 'Performance', value: 'performance', description: 'Cron y revisiones' },
436
454
  { name: 'Actions', value: 'actions', description: 'Acciones remotas administrativas' },
@@ -470,6 +488,7 @@ class OXSRTechnicalUtils {
470
488
  { name: 'Logs & Errors', value: 'logs' },
471
489
  { name: 'Metrics', value: 'metrics' },
472
490
  { name: 'Content', value: 'content' },
491
+ { name: 'Servidor', value: 'server' },
473
492
  { name: 'Security', value: 'security' },
474
493
  { name: 'Performance', value: 'performance' },
475
494
  { name: 'Actions', value: 'actions' },
@@ -588,6 +607,24 @@ class OXSRTechnicalUtils {
588
607
  { name: 'Delete Menu Items By Text', value: 'deleteMenuItemsByText' },
589
608
  ],
590
609
  },
610
+ {
611
+ displayName: 'AI Operation',
612
+ name: 'autoOperation',
613
+ type: 'options',
614
+ noDataExpression: false,
615
+ displayOptions: { show: { resource: ['auto'], operation: ['autoDecide'], autoResource: ['server'] } },
616
+ default: 'getServerDiagnostics',
617
+ required: true,
618
+ description: 'Operación automática para Servidor',
619
+ options: [
620
+ { name: 'Get Server Diagnostics', value: 'getServerDiagnostics' },
621
+ { name: 'Run Server Console', value: 'runServerConsole' },
622
+ { name: 'List Files', value: 'listFiles' },
623
+ { name: 'Get File', value: 'getFile' },
624
+ { name: 'Update File', value: 'updateFile' },
625
+ { name: 'Delete File', value: 'deleteFile' },
626
+ ],
627
+ },
591
628
  {
592
629
  displayName: 'AI Operation',
593
630
  name: 'autoOperation',
@@ -790,6 +827,7 @@ class OXSRTechnicalUtils {
790
827
  description: 'Operación automática para SEO',
791
828
  options: [
792
829
  { name: 'Site Kit Health', value: 'siteKitHealth' },
830
+ { name: 'Keyword Ideas (Site)', value: 'keywordIdeasSite' },
793
831
  { name: 'Keyword Opportunities', value: 'keywordOpportunities' },
794
832
  { name: 'Keyword Cannibalization', value: 'keywordCannibalization' },
795
833
  { name: 'Content Gap Scanner', value: 'contentGapScanner' },
@@ -811,6 +849,8 @@ class OXSRTechnicalUtils {
811
849
  'logs',
812
850
  'metrics',
813
851
  'content',
852
+ 'media',
853
+ 'server',
814
854
  'security',
815
855
  'performance',
816
856
  'actions',
@@ -1423,11 +1463,38 @@ class OXSRTechnicalUtils {
1423
1463
  displayName: 'SEO Limit',
1424
1464
  name: 'seoLimit',
1425
1465
  type: 'number',
1426
- displayOptions: { show: { resource: ['seo'], operation: ['keywordOpportunities', 'keywordCannibalization', 'contentGapScanner'] } },
1466
+ displayOptions: { show: { resource: ['seo'], operation: ['keywordOpportunities', 'keywordCannibalization', 'contentGapScanner', 'keywordIdeasSite'] } },
1427
1467
  default: 25,
1428
1468
  required: false,
1429
1469
  description: 'Número máximo de resultados SEO a devolver',
1430
1470
  },
1471
+ {
1472
+ displayName: 'SEO Limit Posts',
1473
+ name: 'seoLimitPosts',
1474
+ type: 'number',
1475
+ displayOptions: { show: { resource: ['seo'], operation: ['keywordIdeasSite'] } },
1476
+ default: 20,
1477
+ required: false,
1478
+ description: 'Número de posts/páginas a analizar para ideas de keywords',
1479
+ },
1480
+ {
1481
+ displayName: 'SEO Limit Keywords',
1482
+ name: 'seoLimitKeywords',
1483
+ type: 'number',
1484
+ displayOptions: { show: { resource: ['seo'], operation: ['keywordIdeasSite'] } },
1485
+ default: 40,
1486
+ required: false,
1487
+ description: 'Máximo de keywords sugeridas a devolver',
1488
+ },
1489
+ {
1490
+ displayName: 'SEO Post Types CSV',
1491
+ name: 'seoPostTypesCsv',
1492
+ type: 'string',
1493
+ displayOptions: { show: { resource: ['seo'], operation: ['keywordIdeasSite'] } },
1494
+ default: 'post,page',
1495
+ required: false,
1496
+ description: 'Tipos de contenido a analizar, separados por coma',
1497
+ },
1431
1498
  {
1432
1499
  displayName: 'SEO Min Impressions',
1433
1500
  name: 'seoMinImpressions',
@@ -1484,6 +1551,24 @@ class OXSRTechnicalUtils {
1484
1551
  required: false,
1485
1552
  description: 'ID opcional del post/página para score on-page',
1486
1553
  },
1554
+ {
1555
+ displayName: 'SEO Include Markdown',
1556
+ name: 'seoIncludeMarkdown',
1557
+ type: 'boolean',
1558
+ displayOptions: { show: { resource: ['seo'], operation: ['onPageScore'] } },
1559
+ default: true,
1560
+ required: false,
1561
+ description: 'Incluye markdown limpio + bloque analysis_markdown para IA',
1562
+ },
1563
+ {
1564
+ displayName: 'SEO Markdown Max Chars',
1565
+ name: 'seoMarkdownMaxChars',
1566
+ type: 'number',
1567
+ displayOptions: { show: { resource: ['seo'], operation: ['onPageScore'] } },
1568
+ default: 12000,
1569
+ required: false,
1570
+ description: 'Límite de caracteres del markdown devuelto',
1571
+ },
1487
1572
  {
1488
1573
  displayName: 'SEO Keyword',
1489
1574
  name: 'seoKeyword',
@@ -1877,6 +1962,141 @@ class OXSRTechnicalUtils {
1877
1962
  required: false,
1878
1963
  description: 'Array JSON con decisiones de IA: [{"post_id":1,"seo_title":"...","seo_description":"..."}]',
1879
1964
  },
1965
+ {
1966
+ displayName: 'Limit',
1967
+ name: 'mediaLimit',
1968
+ type: 'number',
1969
+ displayOptions: { show: { resource: ['media'], operation: ['getMediaDetailed'] } },
1970
+ default: 100,
1971
+ required: false,
1972
+ description: 'Cantidad máxima de imágenes a devolver',
1973
+ },
1974
+ {
1975
+ displayName: 'Media ID',
1976
+ name: 'mediaId',
1977
+ type: 'number',
1978
+ displayOptions: { show: { resource: ['media'], operation: ['updateMediaMeta', 'deleteMedia'] } },
1979
+ default: 0,
1980
+ required: false,
1981
+ description: 'ID del attachment imagen; opcional si se indica URL',
1982
+ },
1983
+ {
1984
+ displayName: 'Media URL',
1985
+ name: 'mediaUrl',
1986
+ type: 'string',
1987
+ displayOptions: { show: { resource: ['media'], operation: ['updateMediaMeta', 'deleteMedia'] } },
1988
+ default: '',
1989
+ required: false,
1990
+ description: 'URL absoluta de la imagen; opcional si se indica ID',
1991
+ },
1992
+ {
1993
+ displayName: 'Media Title',
1994
+ name: 'mediaTitle',
1995
+ type: 'string',
1996
+ displayOptions: { show: { resource: ['media'], operation: ['updateMediaMeta'] } },
1997
+ default: '',
1998
+ required: false,
1999
+ description: 'Nuevo título para la imagen',
2000
+ },
2001
+ {
2002
+ displayName: 'Media ALT',
2003
+ name: 'mediaAlt',
2004
+ type: 'string',
2005
+ displayOptions: { show: { resource: ['media'], operation: ['updateMediaMeta'] } },
2006
+ default: '',
2007
+ required: false,
2008
+ description: 'Nuevo texto ALT para la imagen',
2009
+ },
2010
+ {
2011
+ displayName: 'Media IDs CSV',
2012
+ name: 'mediaIdsCsv',
2013
+ type: 'string',
2014
+ displayOptions: { show: { resource: ['media'], operation: ['deleteMedia'] } },
2015
+ default: '',
2016
+ required: false,
2017
+ description: 'IDs de imágenes separados por coma para eliminar',
2018
+ },
2019
+ {
2020
+ displayName: 'Media URLs CSV',
2021
+ name: 'mediaUrlsCsv',
2022
+ type: 'string',
2023
+ displayOptions: { show: { resource: ['media'], operation: ['deleteMedia'] } },
2024
+ default: '',
2025
+ required: false,
2026
+ description: 'URLs de imágenes separadas por coma para eliminar',
2027
+ },
2028
+ {
2029
+ displayName: 'Path',
2030
+ name: 'serverPath',
2031
+ type: 'string',
2032
+ displayOptions: { show: { resource: ['server'], operation: ['listFiles'] } },
2033
+ default: '',
2034
+ required: false,
2035
+ description: 'Ruta base a listar; vacío usa wp-content',
2036
+ },
2037
+ {
2038
+ displayName: 'Limit',
2039
+ name: 'serverLimit',
2040
+ type: 'number',
2041
+ displayOptions: { show: { resource: ['server'], operation: ['listFiles'] } },
2042
+ default: 500,
2043
+ required: false,
2044
+ description: 'Máximo de entradas a devolver',
2045
+ },
2046
+ {
2047
+ displayName: 'File Path',
2048
+ name: 'serverFilePath',
2049
+ type: 'string',
2050
+ displayOptions: { show: { resource: ['server'], operation: ['getFile', 'updateFile', 'deleteFile'] } },
2051
+ default: '',
2052
+ required: true,
2053
+ description: 'Ruta absoluta o relativa dentro de wp-content',
2054
+ },
2055
+ {
2056
+ displayName: 'Max Bytes',
2057
+ name: 'serverMaxBytes',
2058
+ type: 'number',
2059
+ displayOptions: { show: { resource: ['server'], operation: ['getFile'] } },
2060
+ default: 200000,
2061
+ required: false,
2062
+ description: 'Límite de bytes a leer del archivo',
2063
+ },
2064
+ {
2065
+ displayName: 'File Content',
2066
+ name: 'serverFileContent',
2067
+ type: 'string',
2068
+ typeOptions: { rows: 12 },
2069
+ displayOptions: { show: { resource: ['server'], operation: ['updateFile'] } },
2070
+ default: '',
2071
+ required: true,
2072
+ description: 'Contenido a guardar en el archivo',
2073
+ },
2074
+ {
2075
+ displayName: 'Console Command',
2076
+ name: 'serverConsoleCommand',
2077
+ type: 'options',
2078
+ displayOptions: { show: { resource: ['server'], operation: ['runServerConsole'] } },
2079
+ default: 'uptime',
2080
+ required: true,
2081
+ options: [
2082
+ { name: 'Uptime', value: 'uptime' },
2083
+ { name: 'Disk', value: 'disk' },
2084
+ { name: 'Memory', value: 'memory' },
2085
+ { name: 'CPU', value: 'cpu' },
2086
+ { name: 'Processes', value: 'processes' },
2087
+ { name: 'Tail Error Log', value: 'tail_error_log' },
2088
+ ],
2089
+ description: 'Comando de consola permitido por el plugin',
2090
+ },
2091
+ {
2092
+ displayName: 'Tail Lines',
2093
+ name: 'serverTailLines',
2094
+ type: 'number',
2095
+ displayOptions: { show: { resource: ['server'], operation: ['runServerConsole'] } },
2096
+ default: 80,
2097
+ required: false,
2098
+ description: 'Número de líneas para tail_error_log',
2099
+ },
1880
2100
  {
1881
2101
  displayName: 'Webhook URL',
1882
2102
  name: 'webhookUrl',
@@ -1963,6 +2183,12 @@ class OXSRTechnicalUtils {
1963
2183
  else if (resource === 'content') {
1964
2184
  json = (await (0, content_1.execute)(context, { siteUrl, apiKey }));
1965
2185
  }
2186
+ else if (resource === 'media') {
2187
+ json = (await (0, media_1.execute)(context, { siteUrl, apiKey }));
2188
+ }
2189
+ else if (resource === 'server') {
2190
+ json = (await (0, server_1.execute)(context, { siteUrl, apiKey }));
2191
+ }
1966
2192
  else if (resource === 'security') {
1967
2193
  json = (await (0, security_1.execute)(context, { siteUrl, apiKey }));
1968
2194
  }