Skip to content

feat(modules-local): add dynamic loading of local modules and update .gitignore#4

Open
daniel89fg wants to merge 2 commits intocristotodev:mainfrom
daniel89fg:modules-local
Open

feat(modules-local): add dynamic loading of local modules and update .gitignore#4
daniel89fg wants to merge 2 commits intocristotodev:mainfrom
daniel89fg:modules-local

Conversation

@daniel89fg
Copy link
Copy Markdown

Todos los modelos añadido son una maravilla, pero en mi caso y entiendo es recurrente, cada programador o instalación tiene sus propios plugins, y esos modelos no tienen porque subirla al repositorio oficial, de tal forma que ahora podemos añadir modulos locales "privados" para usar localmente sin compartirlos con nadie.

Considero que esto es una mejora necesaria, ya que por ejemplo como desarrollador de FS tengo muchas instalaciones y plugins a los que necesito acceder, pero sin que nadie más tenga conocimiento.

Copilot AI review requested due to automatic review settings March 24, 2026 09:23
Copy link
Copy Markdown

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Este PR introduce un mecanismo para cargar dinámicamente módulos “locales” (privados) desde una carpeta no versionada, permitiendo extender recursos/herramientas sin subir esos plugins al repositorio.

Changes:

  • Añade loadLocalModules() para descubrir e importar módulos locales desde modules-local/.
  • Integra módulos locales en los handlers MCP de listado de tools/resources, lectura de resources y ejecución de tools.
  • Actualiza .gitignore para excluir src/modules-local/.

Reviewed changes

Copilot reviewed 4 out of 5 changed files in this pull request and generated 8 comments.

Show a summary per file
File Description
src/local-loader.ts Implementa el descubrimiento/carga dinámica de módulos locales.
src/types/local-module.ts Define el contrato de configuración/tipo para módulos locales cargados.
src/index.ts Integra módulos locales en ListTools, ListResources, ReadResource y CallTool.
.gitignore Ignora src/modules-local/ para mantener plugins locales fuera del repo.
tsconfig.tsbuildinfo Se actualiza por el build e incluye rutas de módulos locales (artefacto).

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment on lines +24 to +31
/** Clase del recurso. Debe implementar getResource(uri) y matchesUri(uri) */
Resource: new (client: FacturaScriptsClient) => any;
/** Definición de la herramienta MCP (name, description, inputSchema) */
toolDefinition: {
name: string;
description: string;
inputSchema: object;
};
Copy link

Copilot AI Mar 24, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LocalModuleConfig.Resource y LoadedLocalModule.instance están tipados como any, lo que hace que se pierda el contrato de matchesUri()/getResource() y que errores se detecten solo en runtime. Sería más seguro definir un tipo/interfaz (p. ej. LocalResource { matchesUri(uri: string): boolean; getResource(uri: string): Promise<Resource>; }) y usarlo aquí para tener checks en compilación.

Copilot uses AI. Check for mistakes.
Comment on lines +2907 to +2908
if (localModule.instance.matchesUri(uri)) {
return await localModule.instance.getResource(uri);
Copy link

Copilot AI Mar 24, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Aquí se asume que localModule.instance.matchesUri existe y es callable. Si un módulo local está mal implementado, esto puede tirar abajo el handler con TypeError. Para robustez, añade un type-guard (comprobar que matchesUri/getResource son funciones) o garantiza esa validación en loadLocalModules() antes de añadir el módulo a localModules.

Suggested change
if (localModule.instance.matchesUri(uri)) {
return await localModule.instance.getResource(uri);
const instance = (localModule as any).instance;
if (
instance &&
typeof instance.matchesUri === 'function' &&
typeof instance.getResource === 'function' &&
instance.matchesUri(uri)
) {
return await instance.getResource(uri);

Copilot uses AI. Check for mistakes.
Comment on lines +3860 to +3874
default: {
// Módulos locales
const localMod = localModules.find(m => m.toolDefinition.name === name);
if (localMod) {
const uri = buildUri(localMod.resourceName);
const result = await localMod.instance.getResource(uri);
return {
content: [
{
type: 'text',
text: (result as any).contents?.[0]?.text || 'No data',
},
],
};
}
Copy link

Copilot AI Mar 24, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

La ejecución de herramientas locales en el default ignora la semántica de la tool: siempre llama a getResource(buildUri(resourceName)) y devuelve solo contents[0].text. Esto limita mucho a módulos locales (no pueden implementar acciones ni consumir argumentos arbitrarios fuera de limit/offset/filter/order y prefijos filter_/operation_/sort_ del buildUri). Considera extender LocalModuleConfig con una toolImplementation(args) (o similar) y delegar ahí la ejecución, o al menos pasar todos los args relevantes a la lógica del módulo local.

Copilot uses AI. Check for mistakes.
@@ -1 +1 @@
{"root":["./src/env.ts","./src/index.ts","./src/fs/client.ts","./src/modules/index.ts","./src/modules/accounting/index.ts","./src/modules/accounting/asientos/index.ts","./src/modules/accounting/asientos/resource.ts","./src/modules/accounting/asientos/tool.ts","./src/modules/accounting/conceptopartidas/index.ts","./src/modules/accounting/conceptopartidas/resource.ts","./src/modules/accounting/conceptopartidas/tool.ts","./src/modules/accounting/cuentas/index.ts","./src/modules/accounting/cuentas/resource.ts","./src/modules/accounting/cuentas/tool.ts","./src/modules/accounting/diarios/index.ts","./src/modules/accounting/diarios/resource.ts","./src/modules/accounting/diarios/tool.ts","./src/modules/accounting/ejercicios/index.ts","./src/modules/accounting/ejercicios/resource.ts","./src/modules/accounting/ejercicios/tool.ts","./src/modules/accounting/partidas/index.ts","./src/modules/accounting/partidas/resource.ts","./src/modules/accounting/partidas/tool.ts","./src/modules/accounting/subcuentas/index.ts","./src/modules/accounting/subcuentas/resource.ts","./src/modules/accounting/subcuentas/tool.ts","./src/modules/communication/index.ts","./src/modules/communication/contactos/index.ts","./src/modules/communication/contactos/resource.ts","./src/modules/communication/contactos/tool.ts","./src/modules/communication/emailnotifications/index.ts","./src/modules/communication/emailnotifications/resource.ts","./src/modules/communication/emailnotifications/tool.ts","./src/modules/communication/emailsentes/index.ts","./src/modules/communication/emailsentes/resource.ts","./src/modules/communication/emailsentes/tool.ts","./src/modules/configuration/index.ts","./src/modules/configuration/agenciatransportes/index.ts","./src/modules/configuration/agenciatransportes/resource.ts","./src/modules/configuration/agenciatransportes/tool.ts","./src/modules/configuration/agentes/index.ts","./src/modules/configuration/agentes/resource.ts","./src/modules/configuration/agentes/tool.ts","./src/modules/configuration/almacenes/index.ts","./src/modules/configuration/almacenes/resource.ts","./src/modules/configuration/almacenes/tool.ts","./src/modules/configuration/atributos/index.ts","./src/modules/configuration/atributos/resource.ts","./src/modules/configuration/atributos/tool.ts","./src/modules/configuration/atributovalores/index.ts","./src/modules/configuration/atributovalores/resource.ts","./src/modules/configuration/atributovalores/tool.ts","./src/modules/configuration/estadodocumentos/index.ts","./src/modules/configuration/estadodocumentos/resource.ts","./src/modules/configuration/estadodocumentos/tool.ts","./src/modules/configuration/fabricantes/index.ts","./src/modules/configuration/fabricantes/resource.ts","./src/modules/configuration/fabricantes/tool.ts","./src/modules/configuration/familias/index.ts","./src/modules/configuration/familias/resource.ts","./src/modules/configuration/familias/tool.ts","./src/modules/configuration/formapagos/index.ts","./src/modules/configuration/formapagos/resource.ts","./src/modules/configuration/formapagos/tool.ts","./src/modules/configuration/formatodocumentos/index.ts","./src/modules/configuration/formatodocumentos/resource.ts","./src/modules/configuration/formatodocumentos/tool.ts","./src/modules/configuration/grupoclientes/index.ts","./src/modules/configuration/grupoclientes/resource.ts","./src/modules/configuration/grupoclientes/tool.ts","./src/modules/configuration/identificadorfiscales/index.ts","./src/modules/configuration/identificadorfiscales/resource.ts","./src/modules/configuration/identificadorfiscales/tool.ts","./src/modules/configuration/impuestos/index.ts","./src/modules/configuration/impuestos/resource.ts","./src/modules/configuration/impuestos/tool.ts","./src/modules/configuration/impuestozonas/index.ts","./src/modules/configuration/impuestozonas/resource.ts","./src/modules/configuration/impuestozonas/tool.ts","./src/modules/configuration/regularizacionimpuestos/index.ts","./src/modules/configuration/regularizacionimpuestos/resource.ts","./src/modules/configuration/regularizacionimpuestos/tool.ts","./src/modules/configuration/retenciones/index.ts","./src/modules/configuration/retenciones/resource.ts","./src/modules/configuration/retenciones/tool.ts","./src/modules/configuration/secuenciadocumentos/index.ts","./src/modules/configuration/secuenciadocumentos/resource.ts","./src/modules/configuration/secuenciadocumentos/tool.ts","./src/modules/configuration/series/index.ts","./src/modules/configuration/series/resource.ts","./src/modules/configuration/series/tool.ts","./src/modules/configuration/tarifas/index.ts","./src/modules/configuration/tarifas/resource.ts","./src/modules/configuration/tarifas/tool.ts","./src/modules/core-business/index.ts","./src/modules/core-business/clientes/index.ts","./src/modules/core-business/clientes/resource.ts","./src/modules/core-business/clientes/tool.ts","./src/modules/core-business/productoimagenes/index.ts","./src/modules/core-business/productoimagenes/resource.ts","./src/modules/core-business/productoimagenes/tool.ts","./src/modules/core-business/productos/index.ts","./src/modules/core-business/productos/resource.ts","./src/modules/core-business/productos/tool.ts","./src/modules/core-business/proveedores/index.ts","./src/modules/core-business/proveedores/resource.ts","./src/modules/core-business/proveedores/tool.ts","./src/modules/core-business/stocks/index.ts","./src/modules/core-business/stocks/resource.ts","./src/modules/core-business/stocks/tool.ts","./src/modules/core-business/variantes/index.ts","./src/modules/core-business/variantes/resource.ts","./src/modules/core-business/variantes/tool.ts","./src/modules/finance/index.ts","./src/modules/finance/cuentabancoclientes/index.ts","./src/modules/finance/cuentabancoclientes/resource.ts","./src/modules/finance/cuentabancoclientes/tool.ts","./src/modules/finance/cuentabancoproveedores/index.ts","./src/modules/finance/cuentabancoproveedores/resource.ts","./src/modules/finance/cuentabancoproveedores/tool.ts","./src/modules/finance/cuentabancos/index.ts","./src/modules/finance/cuentabancos/resource.ts","./src/modules/finance/cuentabancos/tool.ts","./src/modules/finance/cuentaespeciales/index.ts","./src/modules/finance/cuentaespeciales/resource.ts","./src/modules/finance/cuentaespeciales/tool.ts","./src/modules/finance/divisas/index.ts","./src/modules/finance/divisas/resource.ts","./src/modules/finance/divisas/tool.ts","./src/modules/finance/pagoclientes/index.ts","./src/modules/finance/pagoclientes/resource.ts","./src/modules/finance/pagoclientes/tool.ts","./src/modules/finance/pagoproveedores/index.ts","./src/modules/finance/pagoproveedores/resource.ts","./src/modules/finance/pagoproveedores/tool.ts","./src/modules/finance/reciboclientes/index.ts","./src/modules/finance/reciboclientes/resource.ts","./src/modules/finance/reciboclientes/tool.ts","./src/modules/finance/reciboproveedores/index.ts","./src/modules/finance/reciboproveedores/resource.ts","./src/modules/finance/reciboproveedores/tool.ts","./src/modules/geographic/index.ts","./src/modules/geographic/ciudades/index.ts","./src/modules/geographic/ciudades/resource.ts","./src/modules/geographic/ciudades/tool.ts","./src/modules/geographic/codigopostales/index.ts","./src/modules/geographic/codigopostales/resource.ts","./src/modules/geographic/codigopostales/tool.ts","./src/modules/geographic/empresas/index.ts","./src/modules/geographic/empresas/resource.ts","./src/modules/geographic/empresas/tool.ts","./src/modules/geographic/pais/index.ts","./src/modules/geographic/pais/resource.ts","./src/modules/geographic/pais/tool.ts","./src/modules/geographic/provincias/index.ts","./src/modules/geographic/provincias/resource.ts","./src/modules/geographic/provincias/tool.ts","./src/modules/geographic/puntointeresciudades/index.ts","./src/modules/geographic/puntointeresciudades/resource.ts","./src/modules/geographic/puntointeresciudades/tool.ts","./src/modules/purchasing/index.ts","./src/modules/purchasing/albaranproveedores/index.ts","./src/modules/purchasing/albaranproveedores/resource.ts","./src/modules/purchasing/albaranproveedores/tool.ts","./src/modules/purchasing/facturaproveedores/index.ts","./src/modules/purchasing/facturaproveedores/resource.ts","./src/modules/purchasing/facturaproveedores/tool.ts","./src/modules/purchasing/pedidoproveedores/index.ts","./src/modules/purchasing/pedidoproveedores/resource.ts","./src/modules/purchasing/pedidoproveedores/tool.ts","./src/modules/purchasing/presupuestoproveedores/index.ts","./src/modules/purchasing/presupuestoproveedores/resource.ts","./src/modules/purchasing/presupuestoproveedores/tool.ts","./src/modules/purchasing/productoproveedores/index.ts","./src/modules/purchasing/productoproveedores/resource.ts","./src/modules/purchasing/productoproveedores/tool.ts","./src/modules/sales-orders/index.ts","./src/modules/sales-orders/albaranclientes/index.ts","./src/modules/sales-orders/albaranclientes/resource.ts","./src/modules/sales-orders/albaranclientes/tool.ts","./src/modules/sales-orders/facturaclientes/index.ts","./src/modules/sales-orders/facturaclientes/resource.ts","./src/modules/sales-orders/facturaclientes/tool-tiempo-beneficios-bulk.ts","./src/modules/sales-orders/facturaclientes/tool-tiempo-beneficios.ts","./src/modules/sales-orders/facturaclientes/tool.ts","./src/modules/sales-orders/line-items/index.ts","./src/modules/sales-orders/line-items/lineaalbaranclientes/index.ts","./src/modules/sales-orders/line-items/lineaalbaranclientes/resource.ts","./src/modules/sales-orders/line-items/lineaalbaranclientes/tool.ts","./src/modules/sales-orders/line-items/lineaalbaranproveedores/index.ts","./src/modules/sales-orders/line-items/lineaalbaranproveedores/resource.ts","./src/modules/sales-orders/line-items/lineaalbaranproveedores/tool.ts","./src/modules/sales-orders/line-items/lineafacturaclientes/index.ts","./src/modules/sales-orders/line-items/lineafacturaclientes/resource.ts","./src/modules/sales-orders/line-items/lineafacturaclientes/tool.ts","./src/modules/sales-orders/line-items/lineafacturaproveedores/index.ts","./src/modules/sales-orders/line-items/lineafacturaproveedores/resource.ts","./src/modules/sales-orders/line-items/lineafacturaproveedores/tool.ts","./src/modules/sales-orders/line-items/lineapedidoclientes/index.ts","./src/modules/sales-orders/line-items/lineapedidoclientes/resource.ts","./src/modules/sales-orders/line-items/lineapedidoclientes/tool.ts","./src/modules/sales-orders/line-items/lineapedidoproveedores/index.ts","./src/modules/sales-orders/line-items/lineapedidoproveedores/resource.ts","./src/modules/sales-orders/line-items/lineapedidoproveedores/tool.ts","./src/modules/sales-orders/line-items/lineapresupuestoclientes/index.ts","./src/modules/sales-orders/line-items/lineapresupuestoclientes/resource.ts","./src/modules/sales-orders/line-items/lineapresupuestoclientes/tool.ts","./src/modules/sales-orders/line-items/lineapresupuestoproveedores/index.ts","./src/modules/sales-orders/line-items/lineapresupuestoproveedores/resource.ts","./src/modules/sales-orders/line-items/lineapresupuestoproveedores/tool.ts","./src/modules/sales-orders/pedidoclientes/index.ts","./src/modules/sales-orders/pedidoclientes/resource.ts","./src/modules/sales-orders/pedidoclientes/tool.ts","./src/modules/sales-orders/presupuestoclientes/index.ts","./src/modules/sales-orders/presupuestoclientes/resource.ts","./src/modules/sales-orders/presupuestoclientes/tool.ts","./src/modules/system/index.ts","./src/modules/system/apiaccess/index.ts","./src/modules/system/apiaccess/resource.ts","./src/modules/system/apiaccess/tool.ts","./src/modules/system/apikeyes/index.ts","./src/modules/system/apikeyes/resource.ts","./src/modules/system/apikeyes/tool.ts","./src/modules/system/attachedfilerelations/index.ts","./src/modules/system/attachedfilerelations/resource.ts","./src/modules/system/attachedfilerelations/tool.ts","./src/modules/system/attachedfiles/index.ts","./src/modules/system/attachedfiles/resource.ts","./src/modules/system/attachedfiles/tool.ts","./src/modules/system/cronjobes/index.ts","./src/modules/system/cronjobes/resource.ts","./src/modules/system/cronjobes/tool.ts","./src/modules/system/doctransformations/index.ts","./src/modules/system/doctransformations/resource.ts","./src/modules/system/doctransformations/tool.ts","./src/modules/system/logmessages/index.ts","./src/modules/system/logmessages/resource.ts","./src/modules/system/logmessages/tool.ts","./src/modules/system/pagefilteres/index.ts","./src/modules/system/pagefilteres/resource.ts","./src/modules/system/pagefilteres/tool.ts","./src/modules/system/pages/index.ts","./src/modules/system/pages/resource.ts","./src/modules/system/pages/tool.ts","./src/modules/system/totalmodeles/index.ts","./src/modules/system/totalmodeles/resource.ts","./src/modules/system/totalmodeles/tool.ts","./src/modules/system/workeventes/index.ts","./src/modules/system/workeventes/resource.ts","./src/modules/system/workeventes/tool.ts","./src/types/facturascripts.ts","./src/utils/filterparser.ts"],"version":"5.9.2"} No newline at end of file
{"root":["./src/env.ts","./src/index.ts","./src/local-loader.ts","./src/fs/client.ts","./src/modules/index.ts","./src/modules/accounting/index.ts","./src/modules/accounting/asientos/index.ts","./src/modules/accounting/asientos/resource.ts","./src/modules/accounting/asientos/tool.ts","./src/modules/accounting/conceptopartidas/index.ts","./src/modules/accounting/conceptopartidas/resource.ts","./src/modules/accounting/conceptopartidas/tool.ts","./src/modules/accounting/cuentas/index.ts","./src/modules/accounting/cuentas/resource.ts","./src/modules/accounting/cuentas/tool.ts","./src/modules/accounting/diarios/index.ts","./src/modules/accounting/diarios/resource.ts","./src/modules/accounting/diarios/tool.ts","./src/modules/accounting/ejercicios/index.ts","./src/modules/accounting/ejercicios/resource.ts","./src/modules/accounting/ejercicios/tool.ts","./src/modules/accounting/partidas/index.ts","./src/modules/accounting/partidas/resource.ts","./src/modules/accounting/partidas/tool.ts","./src/modules/accounting/subcuentas/index.ts","./src/modules/accounting/subcuentas/resource.ts","./src/modules/accounting/subcuentas/tool.ts","./src/modules/communication/index.ts","./src/modules/communication/contactos/index.ts","./src/modules/communication/contactos/resource.ts","./src/modules/communication/contactos/tool.ts","./src/modules/communication/emailnotifications/index.ts","./src/modules/communication/emailnotifications/resource.ts","./src/modules/communication/emailnotifications/tool.ts","./src/modules/communication/emailsentes/index.ts","./src/modules/communication/emailsentes/resource.ts","./src/modules/communication/emailsentes/tool.ts","./src/modules/configuration/index.ts","./src/modules/configuration/agenciatransportes/index.ts","./src/modules/configuration/agenciatransportes/resource.ts","./src/modules/configuration/agenciatransportes/tool.ts","./src/modules/configuration/agentes/index.ts","./src/modules/configuration/agentes/resource.ts","./src/modules/configuration/agentes/tool.ts","./src/modules/configuration/almacenes/index.ts","./src/modules/configuration/almacenes/resource.ts","./src/modules/configuration/almacenes/tool.ts","./src/modules/configuration/atributos/index.ts","./src/modules/configuration/atributos/resource.ts","./src/modules/configuration/atributos/tool.ts","./src/modules/configuration/atributovalores/index.ts","./src/modules/configuration/atributovalores/resource.ts","./src/modules/configuration/atributovalores/tool.ts","./src/modules/configuration/estadodocumentos/index.ts","./src/modules/configuration/estadodocumentos/resource.ts","./src/modules/configuration/estadodocumentos/tool.ts","./src/modules/configuration/fabricantes/index.ts","./src/modules/configuration/fabricantes/resource.ts","./src/modules/configuration/fabricantes/tool.ts","./src/modules/configuration/familias/index.ts","./src/modules/configuration/familias/resource.ts","./src/modules/configuration/familias/tool.ts","./src/modules/configuration/formapagos/index.ts","./src/modules/configuration/formapagos/resource.ts","./src/modules/configuration/formapagos/tool.ts","./src/modules/configuration/formatodocumentos/index.ts","./src/modules/configuration/formatodocumentos/resource.ts","./src/modules/configuration/formatodocumentos/tool.ts","./src/modules/configuration/grupoclientes/index.ts","./src/modules/configuration/grupoclientes/resource.ts","./src/modules/configuration/grupoclientes/tool.ts","./src/modules/configuration/identificadorfiscales/index.ts","./src/modules/configuration/identificadorfiscales/resource.ts","./src/modules/configuration/identificadorfiscales/tool.ts","./src/modules/configuration/impuestos/index.ts","./src/modules/configuration/impuestos/resource.ts","./src/modules/configuration/impuestos/tool.ts","./src/modules/configuration/impuestozonas/index.ts","./src/modules/configuration/impuestozonas/resource.ts","./src/modules/configuration/impuestozonas/tool.ts","./src/modules/configuration/regularizacionimpuestos/index.ts","./src/modules/configuration/regularizacionimpuestos/resource.ts","./src/modules/configuration/regularizacionimpuestos/tool.ts","./src/modules/configuration/retenciones/index.ts","./src/modules/configuration/retenciones/resource.ts","./src/modules/configuration/retenciones/tool.ts","./src/modules/configuration/secuenciadocumentos/index.ts","./src/modules/configuration/secuenciadocumentos/resource.ts","./src/modules/configuration/secuenciadocumentos/tool.ts","./src/modules/configuration/series/index.ts","./src/modules/configuration/series/resource.ts","./src/modules/configuration/series/tool.ts","./src/modules/configuration/tarifas/index.ts","./src/modules/configuration/tarifas/resource.ts","./src/modules/configuration/tarifas/tool.ts","./src/modules/core-business/index.ts","./src/modules/core-business/clientes/index.ts","./src/modules/core-business/clientes/resource.ts","./src/modules/core-business/clientes/tool.ts","./src/modules/core-business/productoimagenes/index.ts","./src/modules/core-business/productoimagenes/resource.ts","./src/modules/core-business/productoimagenes/tool.ts","./src/modules/core-business/productos/index.ts","./src/modules/core-business/productos/resource.ts","./src/modules/core-business/productos/tool.ts","./src/modules/core-business/proveedores/index.ts","./src/modules/core-business/proveedores/resource.ts","./src/modules/core-business/proveedores/tool.ts","./src/modules/core-business/stocks/index.ts","./src/modules/core-business/stocks/resource.ts","./src/modules/core-business/stocks/tool.ts","./src/modules/core-business/variantes/index.ts","./src/modules/core-business/variantes/resource.ts","./src/modules/core-business/variantes/tool.ts","./src/modules/finance/index.ts","./src/modules/finance/cuentabancoclientes/index.ts","./src/modules/finance/cuentabancoclientes/resource.ts","./src/modules/finance/cuentabancoclientes/tool.ts","./src/modules/finance/cuentabancoproveedores/index.ts","./src/modules/finance/cuentabancoproveedores/resource.ts","./src/modules/finance/cuentabancoproveedores/tool.ts","./src/modules/finance/cuentabancos/index.ts","./src/modules/finance/cuentabancos/resource.ts","./src/modules/finance/cuentabancos/tool.ts","./src/modules/finance/cuentaespeciales/index.ts","./src/modules/finance/cuentaespeciales/resource.ts","./src/modules/finance/cuentaespeciales/tool.ts","./src/modules/finance/divisas/index.ts","./src/modules/finance/divisas/resource.ts","./src/modules/finance/divisas/tool.ts","./src/modules/finance/pagoclientes/index.ts","./src/modules/finance/pagoclientes/resource.ts","./src/modules/finance/pagoclientes/tool.ts","./src/modules/finance/pagoproveedores/index.ts","./src/modules/finance/pagoproveedores/resource.ts","./src/modules/finance/pagoproveedores/tool.ts","./src/modules/finance/reciboclientes/index.ts","./src/modules/finance/reciboclientes/resource.ts","./src/modules/finance/reciboclientes/tool.ts","./src/modules/finance/reciboproveedores/index.ts","./src/modules/finance/reciboproveedores/resource.ts","./src/modules/finance/reciboproveedores/tool.ts","./src/modules/geographic/index.ts","./src/modules/geographic/ciudades/index.ts","./src/modules/geographic/ciudades/resource.ts","./src/modules/geographic/ciudades/tool.ts","./src/modules/geographic/codigopostales/index.ts","./src/modules/geographic/codigopostales/resource.ts","./src/modules/geographic/codigopostales/tool.ts","./src/modules/geographic/empresas/index.ts","./src/modules/geographic/empresas/resource.ts","./src/modules/geographic/empresas/tool.ts","./src/modules/geographic/pais/index.ts","./src/modules/geographic/pais/resource.ts","./src/modules/geographic/pais/tool.ts","./src/modules/geographic/provincias/index.ts","./src/modules/geographic/provincias/resource.ts","./src/modules/geographic/provincias/tool.ts","./src/modules/geographic/puntointeresciudades/index.ts","./src/modules/geographic/puntointeresciudades/resource.ts","./src/modules/geographic/puntointeresciudades/tool.ts","./src/modules/purchasing/index.ts","./src/modules/purchasing/albaranproveedores/index.ts","./src/modules/purchasing/albaranproveedores/resource.ts","./src/modules/purchasing/albaranproveedores/tool.ts","./src/modules/purchasing/facturaproveedores/index.ts","./src/modules/purchasing/facturaproveedores/resource.ts","./src/modules/purchasing/facturaproveedores/tool.ts","./src/modules/purchasing/pedidoproveedores/index.ts","./src/modules/purchasing/pedidoproveedores/resource.ts","./src/modules/purchasing/pedidoproveedores/tool.ts","./src/modules/purchasing/presupuestoproveedores/index.ts","./src/modules/purchasing/presupuestoproveedores/resource.ts","./src/modules/purchasing/presupuestoproveedores/tool.ts","./src/modules/purchasing/productoproveedores/index.ts","./src/modules/purchasing/productoproveedores/resource.ts","./src/modules/purchasing/productoproveedores/tool.ts","./src/modules/sales-orders/index.ts","./src/modules/sales-orders/albaranclientes/index.ts","./src/modules/sales-orders/albaranclientes/resource.ts","./src/modules/sales-orders/albaranclientes/tool.ts","./src/modules/sales-orders/facturaclientes/index.ts","./src/modules/sales-orders/facturaclientes/resource.ts","./src/modules/sales-orders/facturaclientes/tool-tiempo-beneficios-bulk.ts","./src/modules/sales-orders/facturaclientes/tool-tiempo-beneficios.ts","./src/modules/sales-orders/facturaclientes/tool.ts","./src/modules/sales-orders/line-items/index.ts","./src/modules/sales-orders/line-items/lineaalbaranclientes/index.ts","./src/modules/sales-orders/line-items/lineaalbaranclientes/resource.ts","./src/modules/sales-orders/line-items/lineaalbaranclientes/tool.ts","./src/modules/sales-orders/line-items/lineaalbaranproveedores/index.ts","./src/modules/sales-orders/line-items/lineaalbaranproveedores/resource.ts","./src/modules/sales-orders/line-items/lineaalbaranproveedores/tool.ts","./src/modules/sales-orders/line-items/lineafacturaclientes/index.ts","./src/modules/sales-orders/line-items/lineafacturaclientes/resource.ts","./src/modules/sales-orders/line-items/lineafacturaclientes/tool.ts","./src/modules/sales-orders/line-items/lineafacturaproveedores/index.ts","./src/modules/sales-orders/line-items/lineafacturaproveedores/resource.ts","./src/modules/sales-orders/line-items/lineafacturaproveedores/tool.ts","./src/modules/sales-orders/line-items/lineapedidoclientes/index.ts","./src/modules/sales-orders/line-items/lineapedidoclientes/resource.ts","./src/modules/sales-orders/line-items/lineapedidoclientes/tool.ts","./src/modules/sales-orders/line-items/lineapedidoproveedores/index.ts","./src/modules/sales-orders/line-items/lineapedidoproveedores/resource.ts","./src/modules/sales-orders/line-items/lineapedidoproveedores/tool.ts","./src/modules/sales-orders/line-items/lineapresupuestoclientes/index.ts","./src/modules/sales-orders/line-items/lineapresupuestoclientes/resource.ts","./src/modules/sales-orders/line-items/lineapresupuestoclientes/tool.ts","./src/modules/sales-orders/line-items/lineapresupuestoproveedores/index.ts","./src/modules/sales-orders/line-items/lineapresupuestoproveedores/resource.ts","./src/modules/sales-orders/line-items/lineapresupuestoproveedores/tool.ts","./src/modules/sales-orders/pedidoclientes/index.ts","./src/modules/sales-orders/pedidoclientes/resource.ts","./src/modules/sales-orders/pedidoclientes/tool.ts","./src/modules/sales-orders/presupuestoclientes/index.ts","./src/modules/sales-orders/presupuestoclientes/resource.ts","./src/modules/sales-orders/presupuestoclientes/tool.ts","./src/modules/system/index.ts","./src/modules/system/apiaccess/index.ts","./src/modules/system/apiaccess/resource.ts","./src/modules/system/apiaccess/tool.ts","./src/modules/system/apikeyes/index.ts","./src/modules/system/apikeyes/resource.ts","./src/modules/system/apikeyes/tool.ts","./src/modules/system/attachedfilerelations/index.ts","./src/modules/system/attachedfilerelations/resource.ts","./src/modules/system/attachedfilerelations/tool.ts","./src/modules/system/attachedfiles/index.ts","./src/modules/system/attachedfiles/resource.ts","./src/modules/system/attachedfiles/tool.ts","./src/modules/system/cronjobes/index.ts","./src/modules/system/cronjobes/resource.ts","./src/modules/system/cronjobes/tool.ts","./src/modules/system/doctransformations/index.ts","./src/modules/system/doctransformations/resource.ts","./src/modules/system/doctransformations/tool.ts","./src/modules/system/logmessages/index.ts","./src/modules/system/logmessages/resource.ts","./src/modules/system/logmessages/tool.ts","./src/modules/system/pagefilteres/index.ts","./src/modules/system/pagefilteres/resource.ts","./src/modules/system/pagefilteres/tool.ts","./src/modules/system/pages/index.ts","./src/modules/system/pages/resource.ts","./src/modules/system/pages/tool.ts","./src/modules/system/totalmodeles/index.ts","./src/modules/system/totalmodeles/resource.ts","./src/modules/system/totalmodeles/tool.ts","./src/modules/system/workeventes/index.ts","./src/modules/system/workeventes/resource.ts","./src/modules/system/workeventes/tool.ts","./src/modules-local/ejemplo-mi-recurso/index.ts","./src/modules-local/ejemplo-mi-recurso/resource.ts","./src/modules-local/publications/index.ts","./src/modules-local/publications/resource.ts","./src/types/facturascripts.ts","./src/types/local-module.ts","./src/utils/filterparser.ts"],"version":"5.9.2"} No newline at end of file
Copy link

Copilot AI Mar 24, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

tsconfig.tsbuildinfo es un artefacto de build (además aquí está filtrando rutas de módulos locales bajo src/modules-local/). Como el repo ya ignora *.tsbuildinfo, lo ideal es sacarlo del commit y dejar de trackearlo (p. ej. git rm --cached tsconfig.tsbuildinfo) para evitar diffs ruidosos y fugas de nombres de módulos locales.

Suggested change
{"root":["./src/env.ts","./src/index.ts","./src/local-loader.ts","./src/fs/client.ts","./src/modules/index.ts","./src/modules/accounting/index.ts","./src/modules/accounting/asientos/index.ts","./src/modules/accounting/asientos/resource.ts","./src/modules/accounting/asientos/tool.ts","./src/modules/accounting/conceptopartidas/index.ts","./src/modules/accounting/conceptopartidas/resource.ts","./src/modules/accounting/conceptopartidas/tool.ts","./src/modules/accounting/cuentas/index.ts","./src/modules/accounting/cuentas/resource.ts","./src/modules/accounting/cuentas/tool.ts","./src/modules/accounting/diarios/index.ts","./src/modules/accounting/diarios/resource.ts","./src/modules/accounting/diarios/tool.ts","./src/modules/accounting/ejercicios/index.ts","./src/modules/accounting/ejercicios/resource.ts","./src/modules/accounting/ejercicios/tool.ts","./src/modules/accounting/partidas/index.ts","./src/modules/accounting/partidas/resource.ts","./src/modules/accounting/partidas/tool.ts","./src/modules/accounting/subcuentas/index.ts","./src/modules/accounting/subcuentas/resource.ts","./src/modules/accounting/subcuentas/tool.ts","./src/modules/communication/index.ts","./src/modules/communication/contactos/index.ts","./src/modules/communication/contactos/resource.ts","./src/modules/communication/contactos/tool.ts","./src/modules/communication/emailnotifications/index.ts","./src/modules/communication/emailnotifications/resource.ts","./src/modules/communication/emailnotifications/tool.ts","./src/modules/communication/emailsentes/index.ts","./src/modules/communication/emailsentes/resource.ts","./src/modules/communication/emailsentes/tool.ts","./src/modules/configuration/index.ts","./src/modules/configuration/agenciatransportes/index.ts","./src/modules/configuration/agenciatransportes/resource.ts","./src/modules/configuration/agenciatransportes/tool.ts","./src/modules/configuration/agentes/index.ts","./src/modules/configuration/agentes/resource.ts","./src/modules/configuration/agentes/tool.ts","./src/modules/configuration/almacenes/index.ts","./src/modules/configuration/almacenes/resource.ts","./src/modules/configuration/almacenes/tool.ts","./src/modules/configuration/atributos/index.ts","./src/modules/configuration/atributos/resource.ts","./src/modules/configuration/atributos/tool.ts","./src/modules/configuration/atributovalores/index.ts","./src/modules/configuration/atributovalores/resource.ts","./src/modules/configuration/atributovalores/tool.ts","./src/modules/configuration/estadodocumentos/index.ts","./src/modules/configuration/estadodocumentos/resource.ts","./src/modules/configuration/estadodocumentos/tool.ts","./src/modules/configuration/fabricantes/index.ts","./src/modules/configuration/fabricantes/resource.ts","./src/modules/configuration/fabricantes/tool.ts","./src/modules/configuration/familias/index.ts","./src/modules/configuration/familias/resource.ts","./src/modules/configuration/familias/tool.ts","./src/modules/configuration/formapagos/index.ts","./src/modules/configuration/formapagos/resource.ts","./src/modules/configuration/formapagos/tool.ts","./src/modules/configuration/formatodocumentos/index.ts","./src/modules/configuration/formatodocumentos/resource.ts","./src/modules/configuration/formatodocumentos/tool.ts","./src/modules/configuration/grupoclientes/index.ts","./src/modules/configuration/grupoclientes/resource.ts","./src/modules/configuration/grupoclientes/tool.ts","./src/modules/configuration/identificadorfiscales/index.ts","./src/modules/configuration/identificadorfiscales/resource.ts","./src/modules/configuration/identificadorfiscales/tool.ts","./src/modules/configuration/impuestos/index.ts","./src/modules/configuration/impuestos/resource.ts","./src/modules/configuration/impuestos/tool.ts","./src/modules/configuration/impuestozonas/index.ts","./src/modules/configuration/impuestozonas/resource.ts","./src/modules/configuration/impuestozonas/tool.ts","./src/modules/configuration/regularizacionimpuestos/index.ts","./src/modules/configuration/regularizacionimpuestos/resource.ts","./src/modules/configuration/regularizacionimpuestos/tool.ts","./src/modules/configuration/retenciones/index.ts","./src/modules/configuration/retenciones/resource.ts","./src/modules/configuration/retenciones/tool.ts","./src/modules/configuration/secuenciadocumentos/index.ts","./src/modules/configuration/secuenciadocumentos/resource.ts","./src/modules/configuration/secuenciadocumentos/tool.ts","./src/modules/configuration/series/index.ts","./src/modules/configuration/series/resource.ts","./src/modules/configuration/series/tool.ts","./src/modules/configuration/tarifas/index.ts","./src/modules/configuration/tarifas/resource.ts","./src/modules/configuration/tarifas/tool.ts","./src/modules/core-business/index.ts","./src/modules/core-business/clientes/index.ts","./src/modules/core-business/clientes/resource.ts","./src/modules/core-business/clientes/tool.ts","./src/modules/core-business/productoimagenes/index.ts","./src/modules/core-business/productoimagenes/resource.ts","./src/modules/core-business/productoimagenes/tool.ts","./src/modules/core-business/productos/index.ts","./src/modules/core-business/productos/resource.ts","./src/modules/core-business/productos/tool.ts","./src/modules/core-business/proveedores/index.ts","./src/modules/core-business/proveedores/resource.ts","./src/modules/core-business/proveedores/tool.ts","./src/modules/core-business/stocks/index.ts","./src/modules/core-business/stocks/resource.ts","./src/modules/core-business/stocks/tool.ts","./src/modules/core-business/variantes/index.ts","./src/modules/core-business/variantes/resource.ts","./src/modules/core-business/variantes/tool.ts","./src/modules/finance/index.ts","./src/modules/finance/cuentabancoclientes/index.ts","./src/modules/finance/cuentabancoclientes/resource.ts","./src/modules/finance/cuentabancoclientes/tool.ts","./src/modules/finance/cuentabancoproveedores/index.ts","./src/modules/finance/cuentabancoproveedores/resource.ts","./src/modules/finance/cuentabancoproveedores/tool.ts","./src/modules/finance/cuentabancos/index.ts","./src/modules/finance/cuentabancos/resource.ts","./src/modules/finance/cuentabancos/tool.ts","./src/modules/finance/cuentaespeciales/index.ts","./src/modules/finance/cuentaespeciales/resource.ts","./src/modules/finance/cuentaespeciales/tool.ts","./src/modules/finance/divisas/index.ts","./src/modules/finance/divisas/resource.ts","./src/modules/finance/divisas/tool.ts","./src/modules/finance/pagoclientes/index.ts","./src/modules/finance/pagoclientes/resource.ts","./src/modules/finance/pagoclientes/tool.ts","./src/modules/finance/pagoproveedores/index.ts","./src/modules/finance/pagoproveedores/resource.ts","./src/modules/finance/pagoproveedores/tool.ts","./src/modules/finance/reciboclientes/index.ts","./src/modules/finance/reciboclientes/resource.ts","./src/modules/finance/reciboclientes/tool.ts","./src/modules/finance/reciboproveedores/index.ts","./src/modules/finance/reciboproveedores/resource.ts","./src/modules/finance/reciboproveedores/tool.ts","./src/modules/geographic/index.ts","./src/modules/geographic/ciudades/index.ts","./src/modules/geographic/ciudades/resource.ts","./src/modules/geographic/ciudades/tool.ts","./src/modules/geographic/codigopostales/index.ts","./src/modules/geographic/codigopostales/resource.ts","./src/modules/geographic/codigopostales/tool.ts","./src/modules/geographic/empresas/index.ts","./src/modules/geographic/empresas/resource.ts","./src/modules/geographic/empresas/tool.ts","./src/modules/geographic/pais/index.ts","./src/modules/geographic/pais/resource.ts","./src/modules/geographic/pais/tool.ts","./src/modules/geographic/provincias/index.ts","./src/modules/geographic/provincias/resource.ts","./src/modules/geographic/provincias/tool.ts","./src/modules/geographic/puntointeresciudades/index.ts","./src/modules/geographic/puntointeresciudades/resource.ts","./src/modules/geographic/puntointeresciudades/tool.ts","./src/modules/purchasing/index.ts","./src/modules/purchasing/albaranproveedores/index.ts","./src/modules/purchasing/albaranproveedores/resource.ts","./src/modules/purchasing/albaranproveedores/tool.ts","./src/modules/purchasing/facturaproveedores/index.ts","./src/modules/purchasing/facturaproveedores/resource.ts","./src/modules/purchasing/facturaproveedores/tool.ts","./src/modules/purchasing/pedidoproveedores/index.ts","./src/modules/purchasing/pedidoproveedores/resource.ts","./src/modules/purchasing/pedidoproveedores/tool.ts","./src/modules/purchasing/presupuestoproveedores/index.ts","./src/modules/purchasing/presupuestoproveedores/resource.ts","./src/modules/purchasing/presupuestoproveedores/tool.ts","./src/modules/purchasing/productoproveedores/index.ts","./src/modules/purchasing/productoproveedores/resource.ts","./src/modules/purchasing/productoproveedores/tool.ts","./src/modules/sales-orders/index.ts","./src/modules/sales-orders/albaranclientes/index.ts","./src/modules/sales-orders/albaranclientes/resource.ts","./src/modules/sales-orders/albaranclientes/tool.ts","./src/modules/sales-orders/facturaclientes/index.ts","./src/modules/sales-orders/facturaclientes/resource.ts","./src/modules/sales-orders/facturaclientes/tool-tiempo-beneficios-bulk.ts","./src/modules/sales-orders/facturaclientes/tool-tiempo-beneficios.ts","./src/modules/sales-orders/facturaclientes/tool.ts","./src/modules/sales-orders/line-items/index.ts","./src/modules/sales-orders/line-items/lineaalbaranclientes/index.ts","./src/modules/sales-orders/line-items/lineaalbaranclientes/resource.ts","./src/modules/sales-orders/line-items/lineaalbaranclientes/tool.ts","./src/modules/sales-orders/line-items/lineaalbaranproveedores/index.ts","./src/modules/sales-orders/line-items/lineaalbaranproveedores/resource.ts","./src/modules/sales-orders/line-items/lineaalbaranproveedores/tool.ts","./src/modules/sales-orders/line-items/lineafacturaclientes/index.ts","./src/modules/sales-orders/line-items/lineafacturaclientes/resource.ts","./src/modules/sales-orders/line-items/lineafacturaclientes/tool.ts","./src/modules/sales-orders/line-items/lineafacturaproveedores/index.ts","./src/modules/sales-orders/line-items/lineafacturaproveedores/resource.ts","./src/modules/sales-orders/line-items/lineafacturaproveedores/tool.ts","./src/modules/sales-orders/line-items/lineapedidoclientes/index.ts","./src/modules/sales-orders/line-items/lineapedidoclientes/resource.ts","./src/modules/sales-orders/line-items/lineapedidoclientes/tool.ts","./src/modules/sales-orders/line-items/lineapedidoproveedores/index.ts","./src/modules/sales-orders/line-items/lineapedidoproveedores/resource.ts","./src/modules/sales-orders/line-items/lineapedidoproveedores/tool.ts","./src/modules/sales-orders/line-items/lineapresupuestoclientes/index.ts","./src/modules/sales-orders/line-items/lineapresupuestoclientes/resource.ts","./src/modules/sales-orders/line-items/lineapresupuestoclientes/tool.ts","./src/modules/sales-orders/line-items/lineapresupuestoproveedores/index.ts","./src/modules/sales-orders/line-items/lineapresupuestoproveedores/resource.ts","./src/modules/sales-orders/line-items/lineapresupuestoproveedores/tool.ts","./src/modules/sales-orders/pedidoclientes/index.ts","./src/modules/sales-orders/pedidoclientes/resource.ts","./src/modules/sales-orders/pedidoclientes/tool.ts","./src/modules/sales-orders/presupuestoclientes/index.ts","./src/modules/sales-orders/presupuestoclientes/resource.ts","./src/modules/sales-orders/presupuestoclientes/tool.ts","./src/modules/system/index.ts","./src/modules/system/apiaccess/index.ts","./src/modules/system/apiaccess/resource.ts","./src/modules/system/apiaccess/tool.ts","./src/modules/system/apikeyes/index.ts","./src/modules/system/apikeyes/resource.ts","./src/modules/system/apikeyes/tool.ts","./src/modules/system/attachedfilerelations/index.ts","./src/modules/system/attachedfilerelations/resource.ts","./src/modules/system/attachedfilerelations/tool.ts","./src/modules/system/attachedfiles/index.ts","./src/modules/system/attachedfiles/resource.ts","./src/modules/system/attachedfiles/tool.ts","./src/modules/system/cronjobes/index.ts","./src/modules/system/cronjobes/resource.ts","./src/modules/system/cronjobes/tool.ts","./src/modules/system/doctransformations/index.ts","./src/modules/system/doctransformations/resource.ts","./src/modules/system/doctransformations/tool.ts","./src/modules/system/logmessages/index.ts","./src/modules/system/logmessages/resource.ts","./src/modules/system/logmessages/tool.ts","./src/modules/system/pagefilteres/index.ts","./src/modules/system/pagefilteres/resource.ts","./src/modules/system/pagefilteres/tool.ts","./src/modules/system/pages/index.ts","./src/modules/system/pages/resource.ts","./src/modules/system/pages/tool.ts","./src/modules/system/totalmodeles/index.ts","./src/modules/system/totalmodeles/resource.ts","./src/modules/system/totalmodeles/tool.ts","./src/modules/system/workeventes/index.ts","./src/modules/system/workeventes/resource.ts","./src/modules/system/workeventes/tool.ts","./src/modules-local/ejemplo-mi-recurso/index.ts","./src/modules-local/ejemplo-mi-recurso/resource.ts","./src/modules-local/publications/index.ts","./src/modules-local/publications/resource.ts","./src/types/facturascripts.ts","./src/types/local-module.ts","./src/utils/filterparser.ts"],"version":"5.9.2"}
{}

Copilot uses AI. Check for mistakes.

const loaded: LoadedLocalModule[] = [];

let entries: import('fs').Dirent<string>[];
Copy link

Copilot AI Mar 24, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

import('fs').Dirent<string>[] probablemente no compila: en @types/node la clase Dirent no es genérica, así que TypeScript suele dar Type 'Dirent' is not generic. Cambia el tipo a import('fs').Dirent[] (o simplemente infiérelo desde readdirSync).

Suggested change
let entries: import('fs').Dirent<string>[];
let entries: import('fs').Dirent[];

Copilot uses AI. Check for mistakes.
Comment on lines +39 to +42
const indexPath = join(localModulesDir, dir.name as string, 'index.js');

if (!existsSync(indexPath)) {
console.error(`[local-loader] Módulo "${dir.name}" no tiene index.js compilado — ejecuta npm run build`);
Copy link

Copilot AI Mar 24, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

El loader solo busca index.js. Con npm run dev:ts (que ejecuta tsx src/index.ts) __dirname apunta a src/ y en módulos locales normalmente habrá index.ts, no index.js, así que en modo dev no se cargarán. Para que funcione en ambos modos, contempla resolver index.ts cuando se ejecute desde TS (o buscar primero index.js y si no existe, probar index.ts).

Suggested change
const indexPath = join(localModulesDir, dir.name as string, 'index.js');
if (!existsSync(indexPath)) {
console.error(`[local-loader] Módulo "${dir.name}" no tiene index.js compilado — ejecuta npm run build`);
const jsIndexPath = join(localModulesDir, dir.name as string, 'index.js');
const tsIndexPath = join(localModulesDir, dir.name as string, 'index.ts');
let indexPath: string;
if (existsSync(jsIndexPath)) {
indexPath = jsIndexPath;
} else if (existsSync(tsIndexPath)) {
indexPath = tsIndexPath;
} else {
console.error(
`[local-loader] Módulo "${dir.name}" no tiene ni index.js compilado ni index.ts — ` +
'ejecuta npm run build o crea un index.ts en modules-local/'
);

Copilot uses AI. Check for mistakes.
console.error(`[local-loader] Módulo "${dir.name}": moduleConfig incompleto (faltan resourceName, Resource o toolDefinition)`);
continue;
}

Copy link

Copilot AI Mar 24, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Antes de instanciar y registrar el módulo, convendría validar que config.Resource realmente expone matchesUri() y getResource() (o que la instancia las tiene como funciones). Ahora mismo, si un módulo local exporta una clase incorrecta, el servidor puede reventar más tarde al atender ReadResource/CallTool. Considera hacer esta validación aquí y saltarte el módulo con un log claro.

Suggested change
// Validar que el Resource exportado tiene la forma esperada antes de instanciarlo.
const resourceProto = (config.Resource as any)?.prototype;
if (
!resourceProto ||
typeof resourceProto.matchesUri !== 'function' ||
typeof resourceProto.getResource !== 'function'
) {
console.error(
`[local-loader] Módulo "${dir.name}": Resource no implementa matchesUri()/getResource(), módulo ignorado`
);
continue;
}

Copilot uses AI. Check for mistakes.
Comment on lines +19 to +26
export async function loadLocalModules(fsClient: FacturaScriptsClient): Promise<LoadedLocalModule[]> {
const localModulesDir = join(__dirname, 'modules-local');

if (!existsSync(localModulesDir)) {
return [];
}

const loaded: LoadedLocalModule[] = [];
Copy link

Copilot AI Mar 24, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Falta cobertura de tests para loadLocalModules(). Hay unit tests en el repo (Vitest) para otros componentes, y este loader tiene bastante lógica de IO/validación; añadir tests (p. ej. directorio inexistente => [], módulo sin moduleConfig, carga correcta, etc.) ayudaría a evitar regresiones.

Copilot uses AI. Check for mistakes.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants