Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .atl/.skill-registry.cache.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"fingerprint": "bdf7c61e4bc90ca1b7ba057da79d29774456aaf0"
}
82 changes: 82 additions & 0 deletions .atl/skill-registry.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
# Skill Registry

Generated: 2026-07-28
Scope: user-level skills (D:\Usuarios\ricardo.pinto\.config\opencode\skills)
Project-level skills: none detected
Comment on lines +4 to +5

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🔒 Security & Privacy | 🟠 Major | ⚡ Quick win

Do not commit machine-specific user-level paths.

The registry exposes the local username ricardo.pinto and hard-codes Windows paths that will be invalid for other developers and CI. Store portable skill identifiers/project-relative paths, or generate user-level registry data outside version control.

Also applies to: 9-82

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.atl/skill-registry.md around lines 4 - 5, Remove the machine-specific
user-level path and username from the skill registry, including the entries
covered by lines 9-82. Replace them with portable skill identifiers or
project-relative paths; if the registry must represent user-level skills,
generate that data outside version control.


| Skill | Trigger | Path | Scope |
|-------|---------|------|-------|
| actsis-arch-api-controller | crear controller, api controller, web api, endpoint, crud api | `D:\Usuarios\ricardo.pinto\.config\opencode\skills\actsis-arch-api-controller\SKILL.md` | user |
| actsis-arch-api-filter-pagination | filtro, paginacion, filtromodelo, pagedfilter, paginated query | `D:\Usuarios\ricardo.pinto\.config\opencode\skills\actsis-arch-api-filter-pagination\SKILL.md` | user |
| actsis-arch-blazor-auth-di | auth di, configurar autenticacion, program cs auth, service configuration auth | `D:\Usuarios\ricardo.pinto\.config\opencode\skills\actsis-arch-blazor-auth-di\SKILL.md` | user |
| actsis-arch-blazor-auth-login | login, autenticar, authenticate, iniciar sesion, sso | `D:\Usuarios\ricardo.pinto\.config\opencode\skills\actsis-arch-blazor-auth-login\SKILL.md` | user |
| actsis-arch-blazor-auth-state | auth state, authentication state, customauthstateprovider, protectedlocalstorage | `D:\Usuarios\ricardo.pinto\.config\opencode\skills\actsis-arch-blazor-auth-state\SKILL.md` | user |
| actsis-arch-blazor-export | exportar, excel, export, descargar, download excel | `D:\Usuarios\ricardo.pinto\.config\opencode\skills\actsis-arch-blazor-export\SKILL.md` | user |
| actsis-arch-blazor-filter-pattern | filtro, buscar, busqueda, filtrar datos, search filter | `D:\Usuarios\ricardo.pinto\.config\opencode\skills\actsis-arch-blazor-filter-pattern\SKILL.md` | user |
| actsis-arch-blazor-form-controls | textbox, numeric, date, dropdown, switch, checkbox, editor, form control | `D:\Usuarios\ricardo.pinto\.config\opencode\skills\actsis-arch-blazor-form-controls\SKILL.md` | user |
| actsis-arch-blazor-gridview | grid, grilla, tabla datos, gridview, datagrid | `D:\Usuarios\ricardo.pinto\.config\opencode\skills\actsis-arch-blazor-gridview\SKILL.md` | user |
| actsis-arch-blazor-layout | layout, appmainlayout, sidebar, header, breadcrumb, footer, floating menu | `D:\Usuarios\ricardo.pinto\.config\opencode\skills\actsis-arch-blazor-layout\SKILL.md` | user |
| actsis-arch-blazor-menu | menu, appmenu, submenu, navegacion, navigation, sidebar menu | `D:\Usuarios\ricardo.pinto\.config\opencode\skills\actsis-arch-blazor-menu\SKILL.md` | user |
| actsis-arch-blazor-modal-confirm | modal, confirmacion, confirmation, dialogo, popup | `D:\Usuarios\ricardo.pinto\.config\opencode\skills\actsis-arch-blazor-modal-confirm\SKILL.md` | user |
| actsis-arch-blazor-page-structure | crear pagina, blazor page, nueva pantalla, page structure, actsis page | `D:\Usuarios\ricardo.pinto\.config\opencode\skills\actsis-arch-blazor-page-structure\SKILL.md` | user |
| actsis-arch-blazor-report | reporte, report, report generator, imprimir, generar reporte | `D:\Usuarios\ricardo.pinto\.config\opencode\skills\actsis-arch-blazor-report\SKILL.md` | user |
| actsis-arch-blazor-valuelist | lista valores, valuelist, lov, buscar, seleccionar, value list | `D:\Usuarios\ricardo.pinto\.config\opencode\skills\actsis-arch-blazor-valuelist\SKILL.md` | user |
| actsis-arch-bs4-to-bs5-migration | migrar bootstrap, bootstrap 4 a 5, bs4 to bs5, vendorizar bootstrap 5, actualizar bootstrap, modernizar css framework | `D:\Usuarios\ricardo.pinto\.config\opencode\skills\actsis-arch-bs4-to-bs5-migration\SKILL.md` | user |
| actsis-arch-clean-code-csharp | clean code, refactorizar c#, reglas c#, formato de clase | `D:\Usuarios\ricardo.pinto\.config\opencode\skills\actsis-arch-clean-code-csharp\SKILL.md` | user |
| actsis-arch-client-creation | crear cliente, http client, api client, rest client, consumir api | `D:\Usuarios\ricardo.pinto\.config\opencode\skills\actsis-arch-client-creation\SKILL.md` | user |
| actsis-arch-client-di | registrar cliente, di, dependency injection, service configuration, inyectar cliente | `D:\Usuarios\ricardo.pinto\.config\opencode\skills\actsis-arch-client-di\SKILL.md` | user |
| actsis-arch-code-headers | encabezado, versión, comentarios xml, versionar archivo, sincronizar headers SGI, headers prohibidos, limpiar headers | `D:\Usuarios\ricardo.pinto\.config\opencode\skills\actsis-arch-code-headers\SKILL.md` | user |
| actsis-arch-core-business | crear negocio, core business, logica negocio, business logic | `D:\Usuarios\ricardo.pinto\.config\opencode\skills\actsis-arch-core-business\SKILL.md` | user |
| actsis-arch-core-data | crear datos, core data, dao, acceso a datos, data access | `D:\Usuarios\ricardo.pinto\.config\opencode\skills\actsis-arch-core-data\SKILL.md` | user |
| actsis-arch-core-entity | crear entidad, core entity, mapear tabla, entity class, table attribute | `D:\Usuarios\ricardo.pinto\.config\opencode\skills\actsis-arch-core-entity\SKILL.md` | user |
| actsis-arch-crystal-reports-migration | migrar reportes, crystal reports, jasper reports, telerik reporting, report migration | `D:\Usuarios\ricardo.pinto\.config\opencode\skills\actsis-arch-crystal-reports-migration\SKILL.md` | user |
| actsis-arch-jqgrid-to-gridview | migrar jqgrid, jqgrid to gridview, colmodel to column, jqgrid migration | `D:\Usuarios\ricardo.pinto\.config\opencode\skills\actsis-arch-jqgrid-to-gridview\SKILL.md` | user |
| actsis-arch-layer-responsibilities | arquitectura capas .net, crear capa, dónde poner lógica, separar capas, capa datos, capa negocio | `D:\Usuarios\ricardo.pinto\.config\opencode\skills\actsis-arch-layer-responsibilities\SKILL.md` | user |
| actsis-arch-migration-verification | verificar migracion, auditar migracion, paridad migracion webforms, auditar pantalla migrada, paridad visual migracion | `D:\Usuarios\ricardo.pinto\.config\opencode\skills\actsis-arch-migration-verification\SKILL.md` | user |
| actsis-arch-mvc-controller-to-api | migrar controller mvc, controller to api, mvc to api, facade dao to business | `D:\Usuarios\ricardo.pinto\.config\opencode\skills\actsis-arch-mvc-controller-to-api\SKILL.md` | user |
| actsis-arch-mvc-js-to-csharp | migrar javascript, jquery to csharp, ajax to client, js migration | `D:\Usuarios\ricardo.pinto\.config\opencode\skills\actsis-arch-mvc-js-to-csharp\SKILL.md` | user |
| actsis-arch-mvc-to-blazor-screen | migrar pantalla, mvc to blazor, screen migration, migrar mvc | `D:\Usuarios\ricardo.pinto\.config\opencode\skills\actsis-arch-mvc-to-blazor-screen\SKILL.md` | user |
| actsis-arch-mvc-view-to-blazor | migrar vista mvc, cshtml to razor, mvc view to blazor, view migration | `D:\Usuarios\ricardo.pinto\.config\opencode\skills\actsis-arch-mvc-view-to-blazor\SKILL.md` | user |
| actsis-arch-naming-conventions | nombrar clase c#, nomenclatura c#, crear clase, crear variable c#, PascalCase actsis, camelCase actsis | `D:\Usuarios\ricardo.pinto\.config\opencode\skills\actsis-arch-naming-conventions\SKILL.md` | user |
| actsis-arch-oracle-migration | migrar pantalla oracle forms, migrar forma, oracle forms a blazor, crear entidad pry_, pantalla actsis | `D:\Usuarios\ricardo.pinto\.config\opencode\skills\actsis-arch-oracle-migration\SKILL.md` | user |
| actsis-arch-oracle-plsql | oracle, plsql, reglas sql, paquete plsql | `D:\Usuarios\ricardo.pinto\.config\opencode\skills\actsis-arch-oracle-plsql\SKILL.md` | user |
| actsis-arch-rest-api | rest api, crear endpoint, api controller | `D:\Usuarios\ricardo.pinto\.config\opencode\skills\actsis-arch-rest-api\SKILL.md` | user |
| actsis-arch-session-to-blazor-state | migrar session, session to blazor, session state, httpcontext session | `D:\Usuarios\ricardo.pinto\.config\opencode\skills\actsis-arch-session-to-blazor-state\SKILL.md` | user |
| actsis-arch-webforms-to-blazor-migration | migrar webforms a blazor, webforms to blazor, migrar pantalla legacy, automatizar migracion pantalla | `D:\Usuarios\ricardo.pinto\.config\opencode\skills\actsis-arch-webforms-to-blazor-migration\SKILL.md` | user |
| actsis-scm-create-svn-branch | crear branch svn, crear rama svn, svn branch, branch svn, crear branch para requerimiento | `D:\Usuarios\ricardo.pinto\.config\opencode\skills\actsis-scm-create-svn-branch\SKILL.md` | user |
| actsis-scm-git-workflow | crear rama git, commit git, github pr actsis, conventional commit actsis, merge main actsis | `D:\Usuarios\ricardo.pinto\.config\opencode\skills\actsis-scm-git-workflow\SKILL.md` | user |
| actsis-scm-nuget-versioning | nuget, versionar paquete, crear nuget | `D:\Usuarios\ricardo.pinto\.config\opencode\skills\actsis-scm-nuget-versioning\SKILL.md` | user |
| actsis-scm-svn-workflow | commit svn, svn workflow, actualizar svn, svn update, trunk svn, cerrar rama svn | `D:\Usuarios\ricardo.pinto\.config\opencode\skills\actsis-scm-svn-workflow\SKILL.md` | user |
| actsis-sgc-actividades-load | cargar actividades al SGI, registrar horas ACTSIS, leer Excel de control de actividades | `D:\Usuarios\ricardo.pinto\.config\opencode\skills\actsis-sgc-actividades-load\SKILL.md` | user |
| actsis-sgc-auditoria-ti-infra | auditoria TI, auditoria infraestructura, subregistro incidentes, inactividad TI | `D:\Usuarios\ricardo.pinto\.config\opencode\skills\actsis-sgc-auditoria-ti-infra\SKILL.md` | user |
| actsis-sgc-dev-directory-setup | directorio desarrollo, carpeta desarrollo, setup directorio, preparar desarrollo, crear carpeta requerimiento, iniciar desarrollo | `D:\Usuarios\ricardo.pinto\.config\opencode\skills\actsis-sgc-dev-directory-setup\SKILL.md` | user |
| actsis-sgc-informe-avance-ia | informe de avance, informe ejecutivo IA, avance de requerimientos, reporte semanal IA, auditoria avance | `D:\Usuarios\ricardo.pinto\.config\opencode\skills\actsis-sgc-informe-avance-ia\SKILL.md` | user |
| actsis-sgc-informe-ejecutivo | generar informe ejecutivo, actualizar el informe ejecutivo, crear informe IA | `D:\Usuarios\ricardo.pinto\.config\opencode\skills\actsis-sgc-informe-ejecutivo\SKILL.md` | user |
| actsis-sgc-pendientes-plan | revisar pendientes SGI, priorizar requerimientos, planificar cola SGI, pendientes Actsis | `D:\Usuarios\ricardo.pinto\.config\opencode\skills\actsis-sgc-pendientes-plan\SKILL.md` | user |
| actsis-sgc-quality-gates | revisión par, quality gate, pre-commit, validar entrega, verificar calidad, SGI traceability gate | `D:\Usuarios\ricardo.pinto\.config\opencode\skills\actsis-sgc-quality-gates\SKILL.md` | user |
| actsis-sgc-requirements-flow | nuevo requerimiento MAR, avanzar requerimiento, estado MAR, PP-02, cambiar estado requerimiento, flujo atención requerimiento | `D:\Usuarios\ricardo.pinto\.config\opencode\skills\actsis-sgc-requirements-flow\SKILL.md` | user |
| actsis-sgc-sdd-vcs-delivery | delivery strategy, estrategia de entrega, sdd-tasks, sdd-apply, chain strategy, review workload | `D:\Usuarios\ricardo.pinto\.config\opencode\skills\actsis-sgc-sdd-vcs-delivery\SKILL.md` | user |
| actsis-sgc-sdlc-traceability | trazabilidad SGC, artefacto SDLC, formato FD-10, formato FD-14, formato FP-31, qué formato usar, revisión par formato | `D:\Usuarios\ricardo.pinto\.config\opencode\skills\actsis-sgc-sdlc-traceability\SKILL.md` | user |
| actsis-sgc-sgi-activity-audit | auditar actividades, auditar usuario SGI, auditoria de horas, informe auditoria, audit activities | `D:\Usuarios\ricardo.pinto\.config\opencode\skills\actsis-sgc-sgi-activity-audit\SKILL.md` | user |
| actsis-sgc-sgi-audit-branch | auditar rama SGI, auditar branch SGI, inventario SGI, verificar objetos SGI, validar alineacion SGI | `D:\Usuarios\ricardo.pinto\.config\opencode\skills\actsis-sgc-sgi-audit-branch\SKILL.md` | user |
| actsis-sgc-sgi-create-objects | crear objetos SGI, registrar en OBJETOS, dar de alta objeto SGI, crear artefacto SGI | `D:\Usuarios\ricardo.pinto\.config\opencode\skills\actsis-sgc-sgi-create-objects\SKILL.md` | user |
| actsis-sgc-sgi-register-objects | registrar objetos requerimiento, registro PRY_RQS_OBJETOS, cargar horas desarrollo, estimación horas objetos, asociar componentes requisito | `D:\Usuarios\ricardo.pinto\.config\opencode\skills\actsis-sgc-sgi-register-objects\SKILL.md` | user |
| actsis-sgc-sgi-register-requirement | registrar requerimiento SGI, registrar en PRY_REQUERIMIENTOS, analizar requerimiento SGI, nuevo requerimiento PRY | `D:\Usuarios\ricardo.pinto\.config\opencode\skills\actsis-sgc-sgi-register-requirement\SKILL.md` | user |
| actsis-sgc-sgi-register-requisitos | registrar requisitos funcionales, registro PRY_REQUISITOS, requisitos funcionales SGI, agregar requisito funcional requerimiento | `D:\Usuarios\ricardo.pinto\.config\opencode\skills\actsis-sgc-sgi-register-requisitos\SKILL.md` | user |
| actsis-sgc-sgi-repo-audit | auditar requerimientos, cruce repo SGI, trazabilidad commits, informe ejecutivo repos | `D:\Usuarios\ricardo.pinto\.config\opencode\skills\actsis-sgc-sgi-repo-audit\SKILL.md` | user |
| actsis-sgc-sgi-requirement-scheduling | programar requerimiento SGI, simular programación, programación finita, publicar programación SGI | `D:\Usuarios\ricardo.pinto\.config\opencode\skills\actsis-sgc-sgi-requirement-scheduling\SKILL.md` | user |
| actsis-sgc-sgi-requirements-registration | registrar requerimiento SGI completo, flujo completo SGI, registro completo PRY | `D:\Usuarios\ricardo.pinto\.config\opencode\skills\actsis-sgc-sgi-requirements-registration\SKILL.md` | user |
| actsis-ui-controls-naming | nombrar control, id html, nomenclatura UI | `D:\Usuarios\ricardo.pinto\.config\opencode\skills\actsis-ui-controls-naming\SKILL.md` | user |
| actsis-ui-design-rules | diseño ui, maquetar pantalla, alinear tabla, orden de botones | `D:\Usuarios\ricardo.pinto\.config\opencode\skills\actsis-ui-design-rules\SKILL.md` | user |
| actsis-ui-help-pages | crear ayuda, help page, documentar pantalla, actualizar ayuda, help SGI, pagina de ayuda | `D:\Usuarios\ricardo.pinto\.config\opencode\skills\actsis-ui-help-pages\SKILL.md` | user |
| actsis-ui-telerik-migration | reemplazar telerik, migrar componente, telerik a actsis | `D:\Usuarios\ricardo.pinto\.config\opencode\skills\actsis-ui-telerik-migration\SKILL.md` | user |
| branch-pr | creating, opening, or preparing PRs for review | `D:\Usuarios\ricardo.pinto\.config\opencode\skills\branch-pr\SKILL.md` | user |
| chained-pr | PRs over 400 lines, stacked PRs, review slices | `D:\Usuarios\ricardo.pinto\.config\opencode\skills\chained-pr\SKILL.md` | user |
| cognitive-doc-design | writing guides, READMEs, RFCs, onboarding, architecture, or review-facing docs | `D:\Usuarios\ricardo.pinto\.config\opencode\skills\cognitive-doc-design\SKILL.md` | user |
| comment-writer | PR feedback, issue replies, reviews, Slack messages, or GitHub comments | `D:\Usuarios\ricardo.pinto\.config\opencode\skills\comment-writer\SKILL.md` | user |
| go-testing | Go tests, go test coverage, Bubbletea teatest, golden files | `D:\Usuarios\ricardo.pinto\.config\opencode\skills\go-testing\SKILL.md` | user |
| issue-creation | creating GitHub issues, bug reports, or feature requests | `D:\Usuarios\ricardo.pinto\.config\opencode\skills\issue-creation\SKILL.md` | user |
| judgment-day | judgment day, dual review, adversarial review, juzgar | `D:\Usuarios\ricardo.pinto\.config\opencode\skills\judgment-day\SKILL.md` | user |
| skill-creator | new skills, agent instructions, documenting AI usage patterns | `D:\Usuarios\ricardo.pinto\.config\opencode\skills\skill-creator\SKILL.md` | user |
| skill-improver | improve skills, audit skills, refactor skills, skill quality | `D:\Usuarios\ricardo.pinto\.config\opencode\skills\skill-improver\SKILL.md` | user |
| work-unit-commits | implementation, commit splitting, chained PRs, or keeping tests and docs with code | `D:\Usuarios\ricardo.pinto\.config\opencode\skills\work-unit-commits\SKILL.md` | user |
2 changes: 1 addition & 1 deletion auth/token-storage.js
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ class TokenStorage {
this._refreshPromise = null;

if (!this.config.clientId || !this.config.clientSecret) {
console.warn("TokenStorage: Client ID or Secret is not configured (checked MS_CLIENT_ID/OUTLOOK_CLIENT_ID). Token refresh will fail.");
console.warn("TokenStorage: MS_CLIENT_ID or MS_CLIENT_SECRET is not configured. Token operations might fail.");

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Keep the warning consistent with supported credential fallbacks.

TokenStorage also accepts OUTLOOK_CLIENT_ID and OUTLOOK_CLIENT_SECRET at Lines 11-13, but this warning names only MS_*. When fallback credentials are incomplete, the message points users toward the wrong variable names. Update the warning and its exact-string test accordingly.

Proposed wording
-      console.warn("TokenStorage: MS_CLIENT_ID or MS_CLIENT_SECRET is not configured. Token operations might fail.");
+      console.warn("TokenStorage: no supported client ID/secret pair is configured (MS_CLIENT_ID/MS_CLIENT_SECRET or OUTLOOK_CLIENT_ID/OUTLOOK_CLIENT_SECRET). Token operations might fail.");
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
console.warn("TokenStorage: MS_CLIENT_ID or MS_CLIENT_SECRET is not configured. Token operations might fail.");
console.warn("TokenStorage: no supported client ID/secret pair is configured (MS_CLIENT_ID/MS_CLIENT_SECRET or OUTLOOK_CLIENT_ID/OUTLOOK_CLIENT_SECRET). Token operations might fail.");
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@auth/token-storage.js` at line 31, Update the warning in TokenStorage to
reference both supported credential variable pairs,
MS_CLIENT_ID/MS_CLIENT_SECRET and OUTLOOK_CLIENT_ID/OUTLOOK_CLIENT_SECRET, so it
accurately reflects fallback configuration options. Update the corresponding
exact-string test to match the revised warning text.

}
}

Expand Down
102 changes: 63 additions & 39 deletions email/folder-utils.js
Original file line number Diff line number Diff line change
Expand Up @@ -60,52 +60,75 @@ async function resolveFolderPath(accessToken, folderName) {
}

/**
* Get the ID of a mail folder by its name
* Resolve a single folder segment within a parent folder
* @param {string} accessToken - Access token
* @param {string} folderName - Name of the folder to find
* @param {string|null} parentId - Parent folder ID, or null for top-level
* @param {string} segment - Folder segment name to resolve
* @returns {Promise<string|null>} - Folder ID or null if not found
*/
async function getFolderIdByName(accessToken, folderName) {
try {
// First try with exact match filter
console.error(`Looking for folder with name "${folderName}"`);
const response = await callGraphAPI(
accessToken,
'GET',
'me/mailFolders',
null,
{ $filter: `displayName eq '${folderName}'` }
async function resolveSegmentInParent(accessToken, parentId, segment) {
const base = parentId ? `me/mailFolders/${parentId}/childFolders` : 'me/mailFolders';

// Escape single quotes for OData string literal (apostrophes must be doubled)
const escapedSegment = segment.replace(/'/g, "''");

// First try with exact match filter
const response = await callGraphAPI(
accessToken,
'GET',
base,
null,
{ $filter: `displayName eq '${escapedSegment}'` }
);

if (response.value && response.value.length > 0) {
return response.value[0].id;
}

// If exact match fails, try to get all folders and do a case-insensitive comparison
const allFoldersResponse = await callGraphAPI(
accessToken,
'GET',
base,
null,
{ $top: 100 }
);

if (allFoldersResponse.value) {
const lowerSegment = segment.toLowerCase();
const matchingFolder = allFoldersResponse.value.find(
folder => folder.displayName.toLowerCase() === lowerSegment
);

if (response.value && response.value.length > 0) {
console.error(`Found folder "${folderName}" with ID: ${response.value[0].id}`);
return response.value[0].id;

if (matchingFolder) {
return matchingFolder.id;
}

// If exact match fails, try to get all folders and do a case-insensitive comparison
console.error(`No exact match found for "${folderName}", trying case-insensitive search`);
const allFoldersResponse = await callGraphAPI(
accessToken,
'GET',
'me/mailFolders',
null,
{ $top: 100 }
);

if (allFoldersResponse.value) {
const lowerFolderName = folderName.toLowerCase();
const matchingFolder = allFoldersResponse.value.find(
folder => folder.displayName.toLowerCase() === lowerFolderName
);

if (matchingFolder) {
console.error(`Found case-insensitive match for "${folderName}" with ID: ${matchingFolder.id}`);
return matchingFolder.id;
}

return null;
Comment thread
coderabbitai[bot] marked this conversation as resolved.
}

/**
* Get the ID of a mail folder by its name or path
* @param {string} accessToken - Access token
* @param {string} folderName - Name or path (e.g. "Tramite/REQ-104951") of the folder to find
* @returns {Promise<string|null>} - Folder ID or null if not found
*/
async function getFolderIdByName(accessToken, folderName) {
const segments = folderName.split('/').map(s => s.trim()).filter(Boolean);
if (segments.length === 0) {
return null;
}

try {
let currentId = null;
for (const segment of segments) {
currentId = await resolveSegmentInParent(accessToken, currentId, segment);
if (currentId === null) {
return null;
}
}

console.error(`No folder found matching "${folderName}"`);
return null;
return currentId;
} catch (error) {
console.error(`Error finding folder "${folderName}": ${error.message}`);
return null;
Expand Down Expand Up @@ -170,6 +193,7 @@ async function getAllFolders(accessToken) {
module.exports = {
WELL_KNOWN_FOLDERS,
resolveFolderPath,
resolveSegmentInParent,
getFolderIdByName,
getAllFolders
};
Loading