feat(modules-local): add dynamic loading of local modules and update .gitignore#4
feat(modules-local): add dynamic loading of local modules and update .gitignore#4daniel89fg wants to merge 2 commits intocristotodev:mainfrom
Conversation
There was a problem hiding this comment.
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 desdemodules-local/. - Integra módulos locales en los handlers MCP de listado de tools/resources, lectura de resources y ejecución de tools.
- Actualiza
.gitignorepara excluirsrc/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.
| /** 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; | ||
| }; |
There was a problem hiding this comment.
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.
| if (localModule.instance.matchesUri(uri)) { | ||
| return await localModule.instance.getResource(uri); |
There was a problem hiding this comment.
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.
| 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); |
| 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', | ||
| }, | ||
| ], | ||
| }; | ||
| } |
There was a problem hiding this comment.
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.
tsconfig.tsbuildinfo
Outdated
| @@ -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 | |||
There was a problem hiding this comment.
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.
| {"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"} | |
| {} |
|
|
||
| const loaded: LoadedLocalModule[] = []; | ||
|
|
||
| let entries: import('fs').Dirent<string>[]; |
There was a problem hiding this comment.
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).
| let entries: import('fs').Dirent<string>[]; | |
| let entries: import('fs').Dirent[]; |
| 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`); |
There was a problem hiding this comment.
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).
| 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/' | |
| ); |
| console.error(`[local-loader] Módulo "${dir.name}": moduleConfig incompleto (faltan resourceName, Resource o toolDefinition)`); | ||
| continue; | ||
| } | ||
|
|
There was a problem hiding this comment.
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.
| // 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; | |
| } |
| export async function loadLocalModules(fsClient: FacturaScriptsClient): Promise<LoadedLocalModule[]> { | ||
| const localModulesDir = join(__dirname, 'modules-local'); | ||
|
|
||
| if (!existsSync(localModulesDir)) { | ||
| return []; | ||
| } | ||
|
|
||
| const loaded: LoadedLocalModule[] = []; |
There was a problem hiding this comment.
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.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
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.