vikunja-mcp-ng 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +123 -0
- package/dist/auth/AuthManager.d.ts +63 -0
- package/dist/auth/AuthManager.d.ts.map +1 -0
- package/dist/auth/AuthManager.js +137 -0
- package/dist/auth/AuthManager.js.map +1 -0
- package/dist/auth/index.d.ts +7 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/index.js +14 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/auth/permissions.d.ts +60 -0
- package/dist/auth/permissions.d.ts.map +1 -0
- package/dist/auth/permissions.js +173 -0
- package/dist/auth/permissions.js.map +1 -0
- package/dist/client/VikunjaClientFactory.d.ts +41 -0
- package/dist/client/VikunjaClientFactory.d.ts.map +1 -0
- package/dist/client/VikunjaClientFactory.js +58 -0
- package/dist/client/VikunjaClientFactory.js.map +1 -0
- package/dist/client.d.ts +70 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +136 -0
- package/dist/client.js.map +1 -0
- package/dist/config/ConfigurationManager.d.ts +106 -0
- package/dist/config/ConfigurationManager.d.ts.map +1 -0
- package/dist/config/ConfigurationManager.js +509 -0
- package/dist/config/ConfigurationManager.js.map +1 -0
- package/dist/config/index.d.ts +9 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +36 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/secrets.d.ts +33 -0
- package/dist/config/secrets.d.ts.map +1 -0
- package/dist/config/secrets.js +90 -0
- package/dist/config/secrets.js.map +1 -0
- package/dist/config/types.d.ts +1113 -0
- package/dist/config/types.d.ts.map +1 -0
- package/dist/config/types.js +189 -0
- package/dist/config/types.js.map +1 -0
- package/dist/formatters/BatchImportResponseFormatter.d.ts +89 -0
- package/dist/formatters/BatchImportResponseFormatter.d.ts.map +1 -0
- package/dist/formatters/BatchImportResponseFormatter.js +125 -0
- package/dist/formatters/BatchImportResponseFormatter.js.map +1 -0
- package/dist/index.d.ts +20 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +130 -0
- package/dist/index.js.map +1 -0
- package/dist/middleware/direct-middleware.d.ts +9 -0
- package/dist/middleware/direct-middleware.d.ts.map +1 -0
- package/dist/middleware/direct-middleware.js +49 -0
- package/dist/middleware/direct-middleware.js.map +1 -0
- package/dist/middleware/index.d.ts +8 -0
- package/dist/middleware/index.d.ts.map +1 -0
- package/dist/middleware/index.js +21 -0
- package/dist/middleware/index.js.map +1 -0
- package/dist/middleware/simplified-rate-limit.d.ts +147 -0
- package/dist/middleware/simplified-rate-limit.d.ts.map +1 -0
- package/dist/middleware/simplified-rate-limit.js +533 -0
- package/dist/middleware/simplified-rate-limit.js.map +1 -0
- package/dist/parsers/CSVParser.d.ts +36 -0
- package/dist/parsers/CSVParser.d.ts.map +1 -0
- package/dist/parsers/CSVParser.js +69 -0
- package/dist/parsers/CSVParser.js.map +1 -0
- package/dist/parsers/InputParserFactory.d.ts +17 -0
- package/dist/parsers/InputParserFactory.d.ts.map +1 -0
- package/dist/parsers/InputParserFactory.js +137 -0
- package/dist/parsers/InputParserFactory.js.map +1 -0
- package/dist/parsers/JSONParser.d.ts +74 -0
- package/dist/parsers/JSONParser.d.ts.map +1 -0
- package/dist/parsers/JSONParser.js +69 -0
- package/dist/parsers/JSONParser.js.map +1 -0
- package/dist/services/EntityResolver.d.ts +92 -0
- package/dist/services/EntityResolver.d.ts.map +1 -0
- package/dist/services/EntityResolver.js +201 -0
- package/dist/services/EntityResolver.js.map +1 -0
- package/dist/services/TaskCreationService.d.ts +99 -0
- package/dist/services/TaskCreationService.d.ts.map +1 -0
- package/dist/services/TaskCreationService.js +392 -0
- package/dist/services/TaskCreationService.js.map +1 -0
- package/dist/storage/SimpleFilterStorage.d.ts +103 -0
- package/dist/storage/SimpleFilterStorage.d.ts.map +1 -0
- package/dist/storage/SimpleFilterStorage.js +350 -0
- package/dist/storage/SimpleFilterStorage.js.map +1 -0
- package/dist/storage/filtering/FilterSerializer.d.ts +45 -0
- package/dist/storage/filtering/FilterSerializer.d.ts.map +1 -0
- package/dist/storage/filtering/FilterSerializer.js +171 -0
- package/dist/storage/filtering/FilterSerializer.js.map +1 -0
- package/dist/storage/filtering/FilterValidator.d.ts +59 -0
- package/dist/storage/filtering/FilterValidator.d.ts.map +1 -0
- package/dist/storage/filtering/FilterValidator.js +183 -0
- package/dist/storage/filtering/FilterValidator.js.map +1 -0
- package/dist/storage/index.d.ts +61 -0
- package/dist/storage/index.d.ts.map +1 -0
- package/dist/storage/index.js +125 -0
- package/dist/storage/index.js.map +1 -0
- package/dist/storage/templateFileStore.d.ts +62 -0
- package/dist/storage/templateFileStore.d.ts.map +1 -0
- package/dist/storage/templateFileStore.js +151 -0
- package/dist/storage/templateFileStore.js.map +1 -0
- package/dist/tools/admin.d.ts +51 -0
- package/dist/tools/admin.d.ts.map +1 -0
- package/dist/tools/admin.js +207 -0
- package/dist/tools/admin.js.map +1 -0
- package/dist/tools/auth.d.ts +9 -0
- package/dist/tools/auth.d.ts.map +1 -0
- package/dist/tools/auth.js +175 -0
- package/dist/tools/auth.js.map +1 -0
- package/dist/tools/batch-import.d.ts +5 -0
- package/dist/tools/batch-import.d.ts.map +1 -0
- package/dist/tools/batch-import.js +153 -0
- package/dist/tools/batch-import.js.map +1 -0
- package/dist/tools/caldav-tokens.d.ts +45 -0
- package/dist/tools/caldav-tokens.d.ts.map +1 -0
- package/dist/tools/caldav-tokens.js +93 -0
- package/dist/tools/caldav-tokens.js.map +1 -0
- package/dist/tools/export.d.ts +14 -0
- package/dist/tools/export.d.ts.map +1 -0
- package/dist/tools/export.js +252 -0
- package/dist/tools/export.js.map +1 -0
- package/dist/tools/filters.d.ts +50 -0
- package/dist/tools/filters.d.ts.map +1 -0
- package/dist/tools/filters.js +512 -0
- package/dist/tools/filters.js.map +1 -0
- package/dist/tools/index.d.ts +53 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +217 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/labels.d.ts +22 -0
- package/dist/tools/labels.d.ts.map +1 -0
- package/dist/tools/labels.js +206 -0
- package/dist/tools/labels.js.map +1 -0
- package/dist/tools/notifications.d.ts +17 -0
- package/dist/tools/notifications.d.ts.map +1 -0
- package/dist/tools/notifications.js +171 -0
- package/dist/tools/notifications.js.map +1 -0
- package/dist/tools/projects/backgrounds.d.ts +80 -0
- package/dist/tools/projects/backgrounds.d.ts.map +1 -0
- package/dist/tools/projects/backgrounds.js +154 -0
- package/dist/tools/projects/backgrounds.js.map +1 -0
- package/dist/tools/projects/buckets.d.ts +147 -0
- package/dist/tools/projects/buckets.d.ts.map +1 -0
- package/dist/tools/projects/buckets.js +291 -0
- package/dist/tools/projects/buckets.js.map +1 -0
- package/dist/tools/projects/crud.d.ts +145 -0
- package/dist/tools/projects/crud.d.ts.map +1 -0
- package/dist/tools/projects/crud.js +425 -0
- package/dist/tools/projects/crud.js.map +1 -0
- package/dist/tools/projects/duplicate.d.ts +41 -0
- package/dist/tools/projects/duplicate.d.ts.map +1 -0
- package/dist/tools/projects/duplicate.js +49 -0
- package/dist/tools/projects/duplicate.js.map +1 -0
- package/dist/tools/projects/hierarchy.d.ts +77 -0
- package/dist/tools/projects/hierarchy.d.ts.map +1 -0
- package/dist/tools/projects/hierarchy.js +300 -0
- package/dist/tools/projects/hierarchy.js.map +1 -0
- package/dist/tools/projects/index.d.ts +34 -0
- package/dist/tools/projects/index.d.ts.map +1 -0
- package/dist/tools/projects/index.js +522 -0
- package/dist/tools/projects/index.js.map +1 -0
- package/dist/tools/projects/permission.d.ts +26 -0
- package/dist/tools/projects/permission.d.ts.map +1 -0
- package/dist/tools/projects/permission.js +53 -0
- package/dist/tools/projects/permission.js.map +1 -0
- package/dist/tools/projects/response-formatter.d.ts +54 -0
- package/dist/tools/projects/response-formatter.d.ts.map +1 -0
- package/dist/tools/projects/response-formatter.js +139 -0
- package/dist/tools/projects/response-formatter.js.map +1 -0
- package/dist/tools/projects/sharing-access.d.ts +165 -0
- package/dist/tools/projects/sharing-access.d.ts.map +1 -0
- package/dist/tools/projects/sharing-access.js +450 -0
- package/dist/tools/projects/sharing-access.js.map +1 -0
- package/dist/tools/projects/sharing.d.ts +105 -0
- package/dist/tools/projects/sharing.d.ts.map +1 -0
- package/dist/tools/projects/sharing.js +258 -0
- package/dist/tools/projects/sharing.js.map +1 -0
- package/dist/tools/projects/validation.d.ts +51 -0
- package/dist/tools/projects/validation.d.ts.map +1 -0
- package/dist/tools/projects/validation.js +160 -0
- package/dist/tools/projects/validation.js.map +1 -0
- package/dist/tools/projects/views.d.ts +161 -0
- package/dist/tools/projects/views.d.ts.map +1 -0
- package/dist/tools/projects/views.js +234 -0
- package/dist/tools/projects/views.js.map +1 -0
- package/dist/tools/projects.d.ts +20 -0
- package/dist/tools/projects.d.ts.map +1 -0
- package/dist/tools/projects.js +66 -0
- package/dist/tools/projects.js.map +1 -0
- package/dist/tools/reactions.d.ts +25 -0
- package/dist/tools/reactions.d.ts.map +1 -0
- package/dist/tools/reactions.js +108 -0
- package/dist/tools/reactions.js.map +1 -0
- package/dist/tools/subscriptions.d.ts +23 -0
- package/dist/tools/subscriptions.d.ts.map +1 -0
- package/dist/tools/subscriptions.js +111 -0
- package/dist/tools/subscriptions.js.map +1 -0
- package/dist/tools/task-assignees.d.ts +13 -0
- package/dist/tools/task-assignees.d.ts.map +1 -0
- package/dist/tools/task-assignees.js +74 -0
- package/dist/tools/task-assignees.js.map +1 -0
- package/dist/tools/task-bulk.d.ts +13 -0
- package/dist/tools/task-bulk.d.ts.map +1 -0
- package/dist/tools/task-bulk.js +117 -0
- package/dist/tools/task-bulk.js.map +1 -0
- package/dist/tools/task-comments.d.ts +12 -0
- package/dist/tools/task-comments.d.ts.map +1 -0
- package/dist/tools/task-comments.js +65 -0
- package/dist/tools/task-comments.js.map +1 -0
- package/dist/tools/task-crud.d.ts +13 -0
- package/dist/tools/task-crud.d.ts.map +1 -0
- package/dist/tools/task-crud.js +168 -0
- package/dist/tools/task-crud.js.map +1 -0
- package/dist/tools/task-labels.d.ts +13 -0
- package/dist/tools/task-labels.d.ts.map +1 -0
- package/dist/tools/task-labels.js +64 -0
- package/dist/tools/task-labels.js.map +1 -0
- package/dist/tools/task-relations.d.ts +13 -0
- package/dist/tools/task-relations.d.ts.map +1 -0
- package/dist/tools/task-relations.js +74 -0
- package/dist/tools/task-relations.js.map +1 -0
- package/dist/tools/task-reminders.d.ts +13 -0
- package/dist/tools/task-reminders.d.ts.map +1 -0
- package/dist/tools/task-reminders.js +69 -0
- package/dist/tools/task-reminders.js.map +1 -0
- package/dist/tools/tasks/assignees/AssigneeOperationsService.d.ts +63 -0
- package/dist/tools/tasks/assignees/AssigneeOperationsService.d.ts.map +1 -0
- package/dist/tools/tasks/assignees/AssigneeOperationsService.js +152 -0
- package/dist/tools/tasks/assignees/AssigneeOperationsService.js.map +1 -0
- package/dist/tools/tasks/assignees/AssigneeResponseFormatter.d.ts +28 -0
- package/dist/tools/tasks/assignees/AssigneeResponseFormatter.d.ts.map +1 -0
- package/dist/tools/tasks/assignees/AssigneeResponseFormatter.js +73 -0
- package/dist/tools/tasks/assignees/AssigneeResponseFormatter.js.map +1 -0
- package/dist/tools/tasks/assignees/AssigneeValidationService.d.ts +46 -0
- package/dist/tools/tasks/assignees/AssigneeValidationService.d.ts.map +1 -0
- package/dist/tools/tasks/assignees/AssigneeValidationService.js +70 -0
- package/dist/tools/tasks/assignees/AssigneeValidationService.js.map +1 -0
- package/dist/tools/tasks/assignees/index.d.ts +52 -0
- package/dist/tools/tasks/assignees/index.d.ts.map +1 -0
- package/dist/tools/tasks/assignees/index.js +103 -0
- package/dist/tools/tasks/assignees/index.js.map +1 -0
- package/dist/tools/tasks/attach.d.ts +39 -0
- package/dist/tools/tasks/attach.d.ts.map +1 -0
- package/dist/tools/tasks/attach.js +90 -0
- package/dist/tools/tasks/attach.js.map +1 -0
- package/dist/tools/tasks/attachments.d.ts +67 -0
- package/dist/tools/tasks/attachments.d.ts.map +1 -0
- package/dist/tools/tasks/attachments.js +153 -0
- package/dist/tools/tasks/attachments.js.map +1 -0
- package/dist/tools/tasks/buckets.d.ts +41 -0
- package/dist/tools/tasks/buckets.d.ts.map +1 -0
- package/dist/tools/tasks/buckets.js +75 -0
- package/dist/tools/tasks/buckets.js.map +1 -0
- package/dist/tools/tasks/bulk/BatchProcessorFactory.d.ts +30 -0
- package/dist/tools/tasks/bulk/BatchProcessorFactory.d.ts.map +1 -0
- package/dist/tools/tasks/bulk/BatchProcessorFactory.js +69 -0
- package/dist/tools/tasks/bulk/BatchProcessorFactory.js.map +1 -0
- package/dist/tools/tasks/bulk/BulkOperationErrorHandler.d.ts +50 -0
- package/dist/tools/tasks/bulk/BulkOperationErrorHandler.d.ts.map +1 -0
- package/dist/tools/tasks/bulk/BulkOperationErrorHandler.js +183 -0
- package/dist/tools/tasks/bulk/BulkOperationErrorHandler.js.map +1 -0
- package/dist/tools/tasks/bulk/BulkOperationProcessor.d.ts +101 -0
- package/dist/tools/tasks/bulk/BulkOperationProcessor.d.ts.map +1 -0
- package/dist/tools/tasks/bulk/BulkOperationProcessor.js +416 -0
- package/dist/tools/tasks/bulk/BulkOperationProcessor.js.map +1 -0
- package/dist/tools/tasks/bulk/BulkOperationTypes.d.ts +50 -0
- package/dist/tools/tasks/bulk/BulkOperationTypes.d.ts.map +1 -0
- package/dist/tools/tasks/bulk/BulkOperationTypes.js +6 -0
- package/dist/tools/tasks/bulk/BulkOperationTypes.js.map +1 -0
- package/dist/tools/tasks/bulk/BulkOperationValidator.d.ts +53 -0
- package/dist/tools/tasks/bulk/BulkOperationValidator.d.ts.map +1 -0
- package/dist/tools/tasks/bulk/BulkOperationValidator.js +216 -0
- package/dist/tools/tasks/bulk/BulkOperationValidator.js.map +1 -0
- package/dist/tools/tasks/bulk/index.d.ts +9 -0
- package/dist/tools/tasks/bulk/index.d.ts.map +1 -0
- package/dist/tools/tasks/bulk/index.js +15 -0
- package/dist/tools/tasks/bulk/index.js.map +1 -0
- package/dist/tools/tasks/bulk-operations-simplified.d.ts +62 -0
- package/dist/tools/tasks/bulk-operations-simplified.d.ts.map +1 -0
- package/dist/tools/tasks/bulk-operations-simplified.js +416 -0
- package/dist/tools/tasks/bulk-operations-simplified.js.map +1 -0
- package/dist/tools/tasks/bulk-operations.d.ts +8 -0
- package/dist/tools/tasks/bulk-operations.d.ts.map +1 -0
- package/dist/tools/tasks/bulk-operations.js +13 -0
- package/dist/tools/tasks/bulk-operations.js.map +1 -0
- package/dist/tools/tasks/by-index.d.ts +36 -0
- package/dist/tools/tasks/by-index.d.ts.map +1 -0
- package/dist/tools/tasks/by-index.js +52 -0
- package/dist/tools/tasks/by-index.js.map +1 -0
- package/dist/tools/tasks/comments/CommentOperationsService.d.ts +44 -0
- package/dist/tools/tasks/comments/CommentOperationsService.d.ts.map +1 -0
- package/dist/tools/tasks/comments/CommentOperationsService.js +86 -0
- package/dist/tools/tasks/comments/CommentOperationsService.js.map +1 -0
- package/dist/tools/tasks/comments/CommentResponseFormatter.d.ts +41 -0
- package/dist/tools/tasks/comments/CommentResponseFormatter.d.ts.map +1 -0
- package/dist/tools/tasks/comments/CommentResponseFormatter.js +114 -0
- package/dist/tools/tasks/comments/CommentResponseFormatter.js.map +1 -0
- package/dist/tools/tasks/comments/CommentValidationService.d.ts +62 -0
- package/dist/tools/tasks/comments/CommentValidationService.d.ts.map +1 -0
- package/dist/tools/tasks/comments/CommentValidationService.js +105 -0
- package/dist/tools/tasks/comments/CommentValidationService.js.map +1 -0
- package/dist/tools/tasks/comments/index.d.ts +66 -0
- package/dist/tools/tasks/comments/index.d.ts.map +1 -0
- package/dist/tools/tasks/comments/index.js +99 -0
- package/dist/tools/tasks/comments/index.js.map +1 -0
- package/dist/tools/tasks/constants.d.ts +19 -0
- package/dist/tools/tasks/constants.d.ts.map +1 -0
- package/dist/tools/tasks/constants.js +82 -0
- package/dist/tools/tasks/constants.js.map +1 -0
- package/dist/tools/tasks/crud/TaskCreationService.d.ts +29 -0
- package/dist/tools/tasks/crud/TaskCreationService.d.ts.map +1 -0
- package/dist/tools/tasks/crud/TaskCreationService.js +274 -0
- package/dist/tools/tasks/crud/TaskCreationService.js.map +1 -0
- package/dist/tools/tasks/crud/TaskDeletionService.d.ts +19 -0
- package/dist/tools/tasks/crud/TaskDeletionService.d.ts.map +1 -0
- package/dist/tools/tasks/crud/TaskDeletionService.js +96 -0
- package/dist/tools/tasks/crud/TaskDeletionService.js.map +1 -0
- package/dist/tools/tasks/crud/TaskReadService.d.ts +19 -0
- package/dist/tools/tasks/crud/TaskReadService.d.ts.map +1 -0
- package/dist/tools/tasks/crud/TaskReadService.js +66 -0
- package/dist/tools/tasks/crud/TaskReadService.js.map +1 -0
- package/dist/tools/tasks/crud/TaskResponseFormatter.d.ts +18 -0
- package/dist/tools/tasks/crud/TaskResponseFormatter.d.ts.map +1 -0
- package/dist/tools/tasks/crud/TaskResponseFormatter.js +248 -0
- package/dist/tools/tasks/crud/TaskResponseFormatter.js.map +1 -0
- package/dist/tools/tasks/crud/TaskUpdateService.d.ts +33 -0
- package/dist/tools/tasks/crud/TaskUpdateService.d.ts.map +1 -0
- package/dist/tools/tasks/crud/TaskUpdateService.js +294 -0
- package/dist/tools/tasks/crud/TaskUpdateService.js.map +1 -0
- package/dist/tools/tasks/crud/index.d.ts +17 -0
- package/dist/tools/tasks/crud/index.d.ts.map +1 -0
- package/dist/tools/tasks/crud/index.js +20 -0
- package/dist/tools/tasks/crud/index.js.map +1 -0
- package/dist/tools/tasks/duplicate.d.ts +28 -0
- package/dist/tools/tasks/duplicate.d.ts.map +1 -0
- package/dist/tools/tasks/duplicate.js +41 -0
- package/dist/tools/tasks/duplicate.js.map +1 -0
- package/dist/tools/tasks/filtering/FilterExecutor.d.ts +39 -0
- package/dist/tools/tasks/filtering/FilterExecutor.d.ts.map +1 -0
- package/dist/tools/tasks/filtering/FilterExecutor.js +214 -0
- package/dist/tools/tasks/filtering/FilterExecutor.js.map +1 -0
- package/dist/tools/tasks/filtering/FilterValidator.d.ts +59 -0
- package/dist/tools/tasks/filtering/FilterValidator.d.ts.map +1 -0
- package/dist/tools/tasks/filtering/FilterValidator.js +257 -0
- package/dist/tools/tasks/filtering/FilterValidator.js.map +1 -0
- package/dist/tools/tasks/filtering/TaskFilteringOrchestrator.d.ts +78 -0
- package/dist/tools/tasks/filtering/TaskFilteringOrchestrator.d.ts.map +1 -0
- package/dist/tools/tasks/filtering/TaskFilteringOrchestrator.js +195 -0
- package/dist/tools/tasks/filtering/TaskFilteringOrchestrator.js.map +1 -0
- package/dist/tools/tasks/filtering/evaluators.d.ts +41 -0
- package/dist/tools/tasks/filtering/evaluators.d.ts.map +1 -0
- package/dist/tools/tasks/filtering/evaluators.js +224 -0
- package/dist/tools/tasks/filtering/evaluators.js.map +1 -0
- package/dist/tools/tasks/filtering/index.d.ts +11 -0
- package/dist/tools/tasks/filtering/index.d.ts.map +1 -0
- package/dist/tools/tasks/filtering/index.js +26 -0
- package/dist/tools/tasks/filtering/index.js.map +1 -0
- package/dist/tools/tasks/index.d.ts +9 -0
- package/dist/tools/tasks/index.d.ts.map +1 -0
- package/dist/tools/tasks/index.js +337 -0
- package/dist/tools/tasks/index.js.map +1 -0
- package/dist/tools/tasks/labels.d.ts +49 -0
- package/dist/tools/tasks/labels.d.ts.map +1 -0
- package/dist/tools/tasks/labels.js +223 -0
- package/dist/tools/tasks/labels.js.map +1 -0
- package/dist/tools/tasks/mark-read.d.ts +27 -0
- package/dist/tools/tasks/mark-read.d.ts.map +1 -0
- package/dist/tools/tasks/mark-read.js +38 -0
- package/dist/tools/tasks/mark-read.js.map +1 -0
- package/dist/tools/tasks/position.d.ts +53 -0
- package/dist/tools/tasks/position.d.ts.map +1 -0
- package/dist/tools/tasks/position.js +83 -0
- package/dist/tools/tasks/position.js.map +1 -0
- package/dist/tools/tasks/reminders.d.ts +56 -0
- package/dist/tools/tasks/reminders.d.ts.map +1 -0
- package/dist/tools/tasks/reminders.js +213 -0
- package/dist/tools/tasks/reminders.js.map +1 -0
- package/dist/tools/tasks/subtasks.d.ts +85 -0
- package/dist/tools/tasks/subtasks.d.ts.map +1 -0
- package/dist/tools/tasks/subtasks.js +286 -0
- package/dist/tools/tasks/subtasks.js.map +1 -0
- package/dist/tools/tasks/types/filters.d.ts +136 -0
- package/dist/tools/tasks/types/filters.d.ts.map +1 -0
- package/dist/tools/tasks/types/filters.js +7 -0
- package/dist/tools/tasks/types/filters.js.map +1 -0
- package/dist/tools/tasks/validation.d.ts +47 -0
- package/dist/tools/tasks/validation.d.ts.map +1 -0
- package/dist/tools/tasks/validation.js +131 -0
- package/dist/tools/tasks/validation.js.map +1 -0
- package/dist/tools/tasks-relations.d.ts +25 -0
- package/dist/tools/tasks-relations.d.ts.map +1 -0
- package/dist/tools/tasks-relations.js +271 -0
- package/dist/tools/tasks-relations.js.map +1 -0
- package/dist/tools/tasks.d.ts +6 -0
- package/dist/tools/tasks.d.ts.map +1 -0
- package/dist/tools/tasks.js +10 -0
- package/dist/tools/tasks.js.map +1 -0
- package/dist/tools/teams.d.ts +9 -0
- package/dist/tools/teams.d.ts.map +1 -0
- package/dist/tools/teams.js +255 -0
- package/dist/tools/teams.js.map +1 -0
- package/dist/tools/templates.d.ts +9 -0
- package/dist/tools/templates.d.ts.map +1 -0
- package/dist/tools/templates.js +450 -0
- package/dist/tools/templates.js.map +1 -0
- package/dist/tools/tokens.d.ts +37 -0
- package/dist/tools/tokens.d.ts.map +1 -0
- package/dist/tools/tokens.js +122 -0
- package/dist/tools/tokens.js.map +1 -0
- package/dist/tools/user-deletion.d.ts +41 -0
- package/dist/tools/user-deletion.d.ts.map +1 -0
- package/dist/tools/user-deletion.js +126 -0
- package/dist/tools/user-deletion.js.map +1 -0
- package/dist/tools/users.d.ts +9 -0
- package/dist/tools/users.d.ts.map +1 -0
- package/dist/tools/users.js +418 -0
- package/dist/tools/users.js.map +1 -0
- package/dist/tools/webhooks.d.ts +31 -0
- package/dist/tools/webhooks.d.ts.map +1 -0
- package/dist/tools/webhooks.js +414 -0
- package/dist/tools/webhooks.js.map +1 -0
- package/dist/transforms/base.d.ts +204 -0
- package/dist/transforms/base.d.ts.map +1 -0
- package/dist/transforms/base.js +175 -0
- package/dist/transforms/base.js.map +1 -0
- package/dist/transforms/field-selector.d.ts +27 -0
- package/dist/transforms/field-selector.d.ts.map +1 -0
- package/dist/transforms/field-selector.js +91 -0
- package/dist/transforms/field-selector.js.map +1 -0
- package/dist/transforms/index.d.ts +15 -0
- package/dist/transforms/index.d.ts.map +1 -0
- package/dist/transforms/index.js +50 -0
- package/dist/transforms/index.js.map +1 -0
- package/dist/transforms/size-calculator.d.ts +131 -0
- package/dist/transforms/size-calculator.d.ts.map +1 -0
- package/dist/transforms/size-calculator.js +284 -0
- package/dist/transforms/size-calculator.js.map +1 -0
- package/dist/transforms/task.d.ts +207 -0
- package/dist/transforms/task.d.ts.map +1 -0
- package/dist/transforms/task.js +259 -0
- package/dist/transforms/task.js.map +1 -0
- package/dist/types/errors.d.ts +65 -0
- package/dist/types/errors.d.ts.map +1 -0
- package/dist/types/errors.js +44 -0
- package/dist/types/errors.js.map +1 -0
- package/dist/types/filters.d.ts +149 -0
- package/dist/types/filters.d.ts.map +1 -0
- package/dist/types/filters.js +26 -0
- package/dist/types/filters.js.map +1 -0
- package/dist/types/index.d.ts +147 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +24 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/node-vikunja-extended.d.ts +36 -0
- package/dist/types/node-vikunja-extended.d.ts.map +1 -0
- package/dist/types/node-vikunja-extended.js +25 -0
- package/dist/types/node-vikunja-extended.js.map +1 -0
- package/dist/types/responses.d.ts +121 -0
- package/dist/types/responses.d.ts.map +1 -0
- package/dist/types/responses.js +26 -0
- package/dist/types/responses.js.map +1 -0
- package/dist/types/vikunja.d.ts +319 -0
- package/dist/types/vikunja.d.ts.map +1 -0
- package/dist/types/vikunja.js +7 -0
- package/dist/types/vikunja.js.map +1 -0
- package/dist/utils/auth-error-handler.d.ts +23 -0
- package/dist/utils/auth-error-handler.d.ts.map +1 -0
- package/dist/utils/auth-error-handler.js +162 -0
- package/dist/utils/auth-error-handler.js.map +1 -0
- package/dist/utils/composite-operation.d.ts +184 -0
- package/dist/utils/composite-operation.d.ts.map +1 -0
- package/dist/utils/composite-operation.js +293 -0
- package/dist/utils/composite-operation.js.map +1 -0
- package/dist/utils/error-handler.d.ts +39 -0
- package/dist/utils/error-handler.d.ts.map +1 -0
- package/dist/utils/error-handler.js +336 -0
- package/dist/utils/error-handler.js.map +1 -0
- package/dist/utils/filtering/ClientSideFilteringStrategy.d.ts +13 -0
- package/dist/utils/filtering/ClientSideFilteringStrategy.d.ts.map +1 -0
- package/dist/utils/filtering/ClientSideFilteringStrategy.js +129 -0
- package/dist/utils/filtering/ClientSideFilteringStrategy.js.map +1 -0
- package/dist/utils/filtering/FilteringContext.d.ts +40 -0
- package/dist/utils/filtering/FilteringContext.d.ts.map +1 -0
- package/dist/utils/filtering/FilteringContext.js +58 -0
- package/dist/utils/filtering/FilteringContext.js.map +1 -0
- package/dist/utils/filtering/HybridFilteringStrategy.d.ts +15 -0
- package/dist/utils/filtering/HybridFilteringStrategy.d.ts.map +1 -0
- package/dist/utils/filtering/HybridFilteringStrategy.js +55 -0
- package/dist/utils/filtering/HybridFilteringStrategy.js.map +1 -0
- package/dist/utils/filtering/RestCrossProjectFilteringStrategy.d.ts +42 -0
- package/dist/utils/filtering/RestCrossProjectFilteringStrategy.d.ts.map +1 -0
- package/dist/utils/filtering/RestCrossProjectFilteringStrategy.js +120 -0
- package/dist/utils/filtering/RestCrossProjectFilteringStrategy.js.map +1 -0
- package/dist/utils/filtering/ServerSideFilteringStrategy.d.ts +13 -0
- package/dist/utils/filtering/ServerSideFilteringStrategy.d.ts.map +1 -0
- package/dist/utils/filtering/ServerSideFilteringStrategy.js +88 -0
- package/dist/utils/filtering/ServerSideFilteringStrategy.js.map +1 -0
- package/dist/utils/filtering/TaskFilteringStrategy.d.ts +19 -0
- package/dist/utils/filtering/TaskFilteringStrategy.d.ts.map +1 -0
- package/dist/utils/filtering/TaskFilteringStrategy.js +10 -0
- package/dist/utils/filtering/TaskFilteringStrategy.js.map +1 -0
- package/dist/utils/filtering/index.d.ts +14 -0
- package/dist/utils/filtering/index.d.ts.map +1 -0
- package/dist/utils/filtering/index.js +22 -0
- package/dist/utils/filtering/index.js.map +1 -0
- package/dist/utils/filtering/types.d.ts +108 -0
- package/dist/utils/filtering/types.d.ts.map +1 -0
- package/dist/utils/filtering/types.js +6 -0
- package/dist/utils/filtering/types.js.map +1 -0
- package/dist/utils/filters.d.ts +70 -0
- package/dist/utils/filters.d.ts.map +1 -0
- package/dist/utils/filters.js +812 -0
- package/dist/utils/filters.js.map +1 -0
- package/dist/utils/http-error-detail.d.ts +28 -0
- package/dist/utils/http-error-detail.d.ts.map +1 -0
- package/dist/utils/http-error-detail.js +67 -0
- package/dist/utils/http-error-detail.js.map +1 -0
- package/dist/utils/label-bulk.d.ts +21 -0
- package/dist/utils/label-bulk.d.ts.map +1 -0
- package/dist/utils/label-bulk.js +51 -0
- package/dist/utils/label-bulk.js.map +1 -0
- package/dist/utils/logger.d.ts +20 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +66 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/memory.d.ts +73 -0
- package/dist/utils/memory.d.ts.map +1 -0
- package/dist/utils/memory.js +194 -0
- package/dist/utils/memory.js.map +1 -0
- package/dist/utils/performance/batch-processor.d.ts +77 -0
- package/dist/utils/performance/batch-processor.d.ts.map +1 -0
- package/dist/utils/performance/batch-processor.js +218 -0
- package/dist/utils/performance/batch-processor.js.map +1 -0
- package/dist/utils/performance/index.d.ts +42 -0
- package/dist/utils/performance/index.d.ts.map +1 -0
- package/dist/utils/performance/index.js +49 -0
- package/dist/utils/performance/index.js.map +1 -0
- package/dist/utils/performance/performance-monitor.d.ts +116 -0
- package/dist/utils/performance/performance-monitor.d.ts.map +1 -0
- package/dist/utils/performance/performance-monitor.js +307 -0
- package/dist/utils/performance/performance-monitor.js.map +1 -0
- package/dist/utils/read-only.d.ts +111 -0
- package/dist/utils/read-only.d.ts.map +1 -0
- package/dist/utils/read-only.js +503 -0
- package/dist/utils/read-only.js.map +1 -0
- package/dist/utils/response-factory.d.ts +81 -0
- package/dist/utils/response-factory.d.ts.map +1 -0
- package/dist/utils/response-factory.js +86 -0
- package/dist/utils/response-factory.js.map +1 -0
- package/dist/utils/retry.d.ts +160 -0
- package/dist/utils/retry.d.ts.map +1 -0
- package/dist/utils/retry.js +316 -0
- package/dist/utils/retry.js.map +1 -0
- package/dist/utils/security.d.ts +70 -0
- package/dist/utils/security.d.ts.map +1 -0
- package/dist/utils/security.js +358 -0
- package/dist/utils/security.js.map +1 -0
- package/dist/utils/simple-response.d.ts +75 -0
- package/dist/utils/simple-response.d.ts.map +1 -0
- package/dist/utils/simple-response.js +311 -0
- package/dist/utils/simple-response.js.map +1 -0
- package/dist/utils/storage-errors.d.ts +9 -0
- package/dist/utils/storage-errors.d.ts.map +1 -0
- package/dist/utils/storage-errors.js +20 -0
- package/dist/utils/storage-errors.js.map +1 -0
- package/dist/utils/task-rest-transport.d.ts +28 -0
- package/dist/utils/task-rest-transport.d.ts.map +1 -0
- package/dist/utils/task-rest-transport.js +33 -0
- package/dist/utils/task-rest-transport.js.map +1 -0
- package/dist/utils/unicode-fix.d.ts +19 -0
- package/dist/utils/unicode-fix.d.ts.map +1 -0
- package/dist/utils/unicode-fix.js +70 -0
- package/dist/utils/unicode-fix.js.map +1 -0
- package/dist/utils/validation.d.ts +75 -0
- package/dist/utils/validation.d.ts.map +1 -0
- package/dist/utils/validation.js +758 -0
- package/dist/utils/validation.js.map +1 -0
- package/dist/utils/vikunja-rest.d.ts +159 -0
- package/dist/utils/vikunja-rest.d.ts.map +1 -0
- package/dist/utils/vikunja-rest.js +378 -0
- package/dist/utils/vikunja-rest.js.map +1 -0
- package/docs/CONFIGURATION.md +957 -0
- package/docs/DOCKER-DESKTOP-MCP.md +207 -0
- package/docs/TOOLS.md +422 -0
- package/package.json +145 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tokens.js","sourceRoot":"","sources":["../../src/tools/tokens.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* User Self-Deletion Tool
|
|
3
|
+
*
|
|
4
|
+
* Covers the Vikunja OpenAPI spec's `/user/deletion/*` operations: request,
|
|
5
|
+
* confirm, and cancel the deletion of the CURRENTLY AUTHENTICATED account.
|
|
6
|
+
* This is the reserved slot the `userDeletion` deny-by-default module config
|
|
7
|
+
* key (see src/config/types.ts DANGEROUS_MODULE_KEYS) was set aside for —
|
|
8
|
+
* before this tool, the key existed but nothing was wired to it.
|
|
9
|
+
*
|
|
10
|
+
* Reserved behind TWO gates, both of which must allow the call (module
|
|
11
|
+
* config can only narrow auth, never expand it — see src/tools/index.ts,
|
|
12
|
+
* matching the existing `admin`/`users`/`export` precedent):
|
|
13
|
+
* 1. The deny-by-default `userDeletion` module config key — an operator
|
|
14
|
+
* must explicitly opt in before this tool is even registered.
|
|
15
|
+
* 2. JWT-only auth gating: per docs/VIKUNJA_API_ISSUES.md, ALL `/user/*`
|
|
16
|
+
* endpoints reject `tk_*` API tokens server-side and require a JWT
|
|
17
|
+
* session. API-token sessions never see this tool registered,
|
|
18
|
+
* regardless of the `userDeletion` config value.
|
|
19
|
+
*
|
|
20
|
+
* `request` and `confirm` additionally require an explicit `confirm: true`
|
|
21
|
+
* tool argument (mirroring `vikunja_admin`'s `delete-user` pattern) — both
|
|
22
|
+
* legs move the account irreversibly closer to deletion once Vikunja's
|
|
23
|
+
* email-confirmation flow completes. `cancel` is the safe "undo" leg and
|
|
24
|
+
* does NOT require `confirm: true`.
|
|
25
|
+
*
|
|
26
|
+
* SECRETS: `password` (request/cancel) and `token` (confirm, delivered by
|
|
27
|
+
* email — the caller supplies it, this tool never fetches or sees the
|
|
28
|
+
* email itself) are credentials. Neither is ever included in a response or
|
|
29
|
+
* error message here: success responses only echo the server's generic
|
|
30
|
+
* confirmation message (`models.Message.message`, which Vikunja itself
|
|
31
|
+
* never populates with the submitted credential), and the request body is
|
|
32
|
+
* never interpolated into any thrown error text. See src/utils/security.ts
|
|
33
|
+
* for the shared masking conventions — `logger.debug` below intentionally
|
|
34
|
+
* logs only the subcommand (never `args`), so neither secret can reach logs
|
|
35
|
+
* even incidentally.
|
|
36
|
+
*/
|
|
37
|
+
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
38
|
+
import type { AuthManager } from '../auth/AuthManager';
|
|
39
|
+
import type { VikunjaClientFactory } from '../client/VikunjaClientFactory';
|
|
40
|
+
export declare function registerUserDeletionTool(server: McpServer, authManager: AuthManager, _clientFactory?: VikunjaClientFactory): void;
|
|
41
|
+
//# sourceMappingURL=user-deletion.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"user-deletion.d.ts","sourceRoot":"","sources":["../../src/tools/user-deletion.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEzE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,gCAAgC,CAAC;AAY3E,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,SAAS,EACjB,WAAW,EAAE,WAAW,EACxB,cAAc,CAAC,EAAE,oBAAoB,GACpC,IAAI,CAsKN"}
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* User Self-Deletion Tool
|
|
4
|
+
*
|
|
5
|
+
* Covers the Vikunja OpenAPI spec's `/user/deletion/*` operations: request,
|
|
6
|
+
* confirm, and cancel the deletion of the CURRENTLY AUTHENTICATED account.
|
|
7
|
+
* This is the reserved slot the `userDeletion` deny-by-default module config
|
|
8
|
+
* key (see src/config/types.ts DANGEROUS_MODULE_KEYS) was set aside for —
|
|
9
|
+
* before this tool, the key existed but nothing was wired to it.
|
|
10
|
+
*
|
|
11
|
+
* Reserved behind TWO gates, both of which must allow the call (module
|
|
12
|
+
* config can only narrow auth, never expand it — see src/tools/index.ts,
|
|
13
|
+
* matching the existing `admin`/`users`/`export` precedent):
|
|
14
|
+
* 1. The deny-by-default `userDeletion` module config key — an operator
|
|
15
|
+
* must explicitly opt in before this tool is even registered.
|
|
16
|
+
* 2. JWT-only auth gating: per docs/VIKUNJA_API_ISSUES.md, ALL `/user/*`
|
|
17
|
+
* endpoints reject `tk_*` API tokens server-side and require a JWT
|
|
18
|
+
* session. API-token sessions never see this tool registered,
|
|
19
|
+
* regardless of the `userDeletion` config value.
|
|
20
|
+
*
|
|
21
|
+
* `request` and `confirm` additionally require an explicit `confirm: true`
|
|
22
|
+
* tool argument (mirroring `vikunja_admin`'s `delete-user` pattern) — both
|
|
23
|
+
* legs move the account irreversibly closer to deletion once Vikunja's
|
|
24
|
+
* email-confirmation flow completes. `cancel` is the safe "undo" leg and
|
|
25
|
+
* does NOT require `confirm: true`.
|
|
26
|
+
*
|
|
27
|
+
* SECRETS: `password` (request/cancel) and `token` (confirm, delivered by
|
|
28
|
+
* email — the caller supplies it, this tool never fetches or sees the
|
|
29
|
+
* email itself) are credentials. Neither is ever included in a response or
|
|
30
|
+
* error message here: success responses only echo the server's generic
|
|
31
|
+
* confirmation message (`models.Message.message`, which Vikunja itself
|
|
32
|
+
* never populates with the submitted credential), and the request body is
|
|
33
|
+
* never interpolated into any thrown error text. See src/utils/security.ts
|
|
34
|
+
* for the shared masking conventions — `logger.debug` below intentionally
|
|
35
|
+
* logs only the subcommand (never `args`), so neither secret can reach logs
|
|
36
|
+
* even incidentally.
|
|
37
|
+
*/
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.registerUserDeletionTool = registerUserDeletionTool;
|
|
40
|
+
const zod_1 = require("zod");
|
|
41
|
+
const types_1 = require("../types");
|
|
42
|
+
const logger_1 = require("../utils/logger");
|
|
43
|
+
const response_factory_1 = require("../utils/response-factory");
|
|
44
|
+
const vikunja_rest_1 = require("../utils/vikunja-rest");
|
|
45
|
+
const read_only_1 = require("../utils/read-only");
|
|
46
|
+
function registerUserDeletionTool(server, authManager, _clientFactory) {
|
|
47
|
+
server.tool('vikunja_user_deletion', (0, read_only_1.withReadOnlyNote)('vikunja_user_deletion', "Request, confirm, or cancel deletion of the CURRENTLY AUTHENTICATED Vikunja account. Reserved/deny-by-default: only registered when the 'userDeletion' module config key is explicitly enabled AND the session is JWT-authenticated (API-token sessions never see this tool, regardless of config). 'request' asks the server to start the deletion and sends a confirmation email; 'confirm' (given the token from that email) irreversibly proceeds with deletion; both require an explicit confirm: true argument. 'cancel' aborts an in-progress deletion request and does NOT require confirm: true — it is the safe undo."), {
|
|
48
|
+
subcommand: zod_1.z.enum(['request', 'confirm', 'cancel']),
|
|
49
|
+
// request / cancel
|
|
50
|
+
password: zod_1.z
|
|
51
|
+
.string()
|
|
52
|
+
.min(1)
|
|
53
|
+
.optional()
|
|
54
|
+
.describe('The account password. Required for request and cancel.'),
|
|
55
|
+
// confirm — the token Vikunja emailed to the account owner.
|
|
56
|
+
token: zod_1.z
|
|
57
|
+
.string()
|
|
58
|
+
.min(1)
|
|
59
|
+
.optional()
|
|
60
|
+
.describe('The deletion-confirmation token delivered by email. Required for confirm.'),
|
|
61
|
+
confirm: zod_1.z
|
|
62
|
+
.boolean()
|
|
63
|
+
.optional()
|
|
64
|
+
.describe('Must be true to perform request or confirm. Account deletion is scheduled and irreversible once the emailed token is confirmed. Not required for cancel.'),
|
|
65
|
+
}, (0, read_only_1.getToolAnnotations)('vikunja_user_deletion'), async (args) => {
|
|
66
|
+
if (!authManager.isAuthenticated()) {
|
|
67
|
+
throw new types_1.MCPError(types_1.ErrorCode.AUTH_REQUIRED, 'Authentication required. Please use vikunja_auth.connect first.');
|
|
68
|
+
}
|
|
69
|
+
if (authManager.getAuthType() !== 'jwt') {
|
|
70
|
+
throw new types_1.MCPError(types_1.ErrorCode.PERMISSION_DENIED, 'User deletion operations require JWT authentication. Please reconnect using vikunja_auth.connect with JWT authentication.');
|
|
71
|
+
}
|
|
72
|
+
const subcommand = args.subcommand;
|
|
73
|
+
(0, read_only_1.assertWriteAllowed)('vikunja_user_deletion', subcommand);
|
|
74
|
+
logger_1.logger.debug('User deletion tool called', { subcommand });
|
|
75
|
+
try {
|
|
76
|
+
switch (subcommand) {
|
|
77
|
+
case 'request': {
|
|
78
|
+
if (args.confirm !== true) {
|
|
79
|
+
throw new types_1.MCPError(types_1.ErrorCode.VALIDATION_ERROR, 'Requesting account deletion starts an irreversible process: Vikunja will email a confirmation token, and confirming it schedules the account for deletion. Pass confirm: true to proceed.');
|
|
80
|
+
}
|
|
81
|
+
if (!args.password) {
|
|
82
|
+
throw new types_1.MCPError(types_1.ErrorCode.VALIDATION_ERROR, 'password is required for the request subcommand');
|
|
83
|
+
}
|
|
84
|
+
const result = await (0, vikunja_rest_1.vikunjaRestRequest)(authManager, 'POST', '/user/deletion/request', { password: args.password });
|
|
85
|
+
logger_1.logger.info('Requested account deletion');
|
|
86
|
+
const aorpResult = (0, response_factory_1.createAorpResponse)('request', 'Account deletion requested. Vikunja has emailed a confirmation token — pass it to the confirm subcommand (with confirm: true) to proceed. The deletion is irreversible once confirmed; use the cancel subcommand beforehand to abort.', { serverMessage: result?.message ?? null }, { success: true });
|
|
87
|
+
return { content: [{ type: 'text', text: aorpResult.content }] };
|
|
88
|
+
}
|
|
89
|
+
case 'confirm': {
|
|
90
|
+
if (args.confirm !== true) {
|
|
91
|
+
throw new types_1.MCPError(types_1.ErrorCode.VALIDATION_ERROR, 'Confirming account deletion is irreversible: the account is scheduled for deletion once confirmed. Pass confirm: true to proceed.');
|
|
92
|
+
}
|
|
93
|
+
if (!args.token) {
|
|
94
|
+
throw new types_1.MCPError(types_1.ErrorCode.VALIDATION_ERROR, 'token is required for the confirm subcommand (the token Vikunja emailed after request)');
|
|
95
|
+
}
|
|
96
|
+
const result = await (0, vikunja_rest_1.vikunjaRestRequest)(authManager, 'POST', '/user/deletion/confirm', { token: args.token });
|
|
97
|
+
logger_1.logger.info('Confirmed account deletion');
|
|
98
|
+
const aorpResult = (0, response_factory_1.createAorpResponse)('confirm', 'Account deletion confirmed. The account is now scheduled for deletion; this is irreversible.', { serverMessage: result?.message ?? null }, { success: true });
|
|
99
|
+
return { content: [{ type: 'text', text: aorpResult.content }] };
|
|
100
|
+
}
|
|
101
|
+
case 'cancel': {
|
|
102
|
+
if (!args.password) {
|
|
103
|
+
throw new types_1.MCPError(types_1.ErrorCode.VALIDATION_ERROR, 'password is required for the cancel subcommand');
|
|
104
|
+
}
|
|
105
|
+
const result = await (0, vikunja_rest_1.vikunjaRestRequest)(authManager, 'POST', '/user/deletion/cancel', { password: args.password });
|
|
106
|
+
logger_1.logger.info('Canceled account deletion request');
|
|
107
|
+
const aorpResult = (0, response_factory_1.createAorpResponse)('cancel', 'Account deletion request canceled. The account will not be deleted.', { serverMessage: result?.message ?? null }, { success: true });
|
|
108
|
+
return { content: [{ type: 'text', text: aorpResult.content }] };
|
|
109
|
+
}
|
|
110
|
+
default:
|
|
111
|
+
throw new types_1.MCPError(types_1.ErrorCode.VALIDATION_ERROR, `Unknown subcommand: ${subcommand}`);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
catch (error) {
|
|
115
|
+
logger_1.logger.error('User deletion operation failed', { error, subcommand });
|
|
116
|
+
if (error instanceof types_1.MCPError) {
|
|
117
|
+
throw error;
|
|
118
|
+
}
|
|
119
|
+
if (error instanceof Error) {
|
|
120
|
+
throw new types_1.MCPError(types_1.ErrorCode.API_ERROR, `User deletion operation failed: ${error.message}`);
|
|
121
|
+
}
|
|
122
|
+
throw new types_1.MCPError(types_1.ErrorCode.INTERNAL_ERROR, 'An unexpected error occurred during user deletion operation');
|
|
123
|
+
}
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
//# sourceMappingURL=user-deletion.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"user-deletion.js","sourceRoot":"","sources":["../../src/tools/user-deletion.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Users Tool
|
|
3
|
+
* Handles user operations for Vikunja
|
|
4
|
+
*/
|
|
5
|
+
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
6
|
+
import type { AuthManager } from '../auth/AuthManager';
|
|
7
|
+
import type { VikunjaClientFactory } from '../client/VikunjaClientFactory';
|
|
8
|
+
export declare function registerUsersTool(server: McpServer, authManager: AuthManager, _clientFactory?: VikunjaClientFactory): void;
|
|
9
|
+
//# sourceMappingURL=users.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"users.d.ts","sourceRoot":"","sources":["../../src/tools/users.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEzE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,gCAAgC,CAAC;AAoH3E,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,WAAW,EAAE,cAAc,CAAC,EAAE,oBAAoB,GAAG,IAAI,CAkd1H"}
|
|
@@ -0,0 +1,418 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Users Tool
|
|
4
|
+
* Handles user operations for Vikunja
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.registerUsersTool = registerUsersTool;
|
|
8
|
+
const node_fs_1 = require("node:fs");
|
|
9
|
+
const node_path_1 = require("node:path");
|
|
10
|
+
const zod_1 = require("zod");
|
|
11
|
+
const types_1 = require("../types");
|
|
12
|
+
const auth_error_handler_1 = require("../utils/auth-error-handler");
|
|
13
|
+
const response_factory_1 = require("../utils/response-factory");
|
|
14
|
+
const vikunja_rest_1 = require("../utils/vikunja-rest");
|
|
15
|
+
const read_only_1 = require("../utils/read-only");
|
|
16
|
+
/**
|
|
17
|
+
* The exact set of avatar provider strings the Vikunja server accepts.
|
|
18
|
+
* The OpenAPI spec documents `avatar_provider` as a freeform `string` with
|
|
19
|
+
* valid values only spelled out in prose, so this list is instead sourced
|
|
20
|
+
* from the server's own validation in the Vikunja source
|
|
21
|
+
* (`~/Projects/vikunja/pkg/user/user.go`, the avatar-provider check ahead of
|
|
22
|
+
* `ErrInvalidAvatarProvider`). Validating client-side against the same list
|
|
23
|
+
* gives a clear Zod error instead of a round-trip 400.
|
|
24
|
+
*/
|
|
25
|
+
const AVATAR_PROVIDERS = [
|
|
26
|
+
'gravatar',
|
|
27
|
+
'upload',
|
|
28
|
+
'initials',
|
|
29
|
+
'marble',
|
|
30
|
+
'ldap',
|
|
31
|
+
'openid',
|
|
32
|
+
'default',
|
|
33
|
+
];
|
|
34
|
+
/**
|
|
35
|
+
* Type guard to check if an object is a valid user structure
|
|
36
|
+
*/
|
|
37
|
+
function isUserObject(obj) {
|
|
38
|
+
return obj !== null && typeof obj === 'object' && !Array.isArray(obj);
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Safely transforms a raw REST user object (v1.UserWithSettings or
|
|
42
|
+
* user.User) to our extended User interface
|
|
43
|
+
*/
|
|
44
|
+
function transformUser(rawUser) {
|
|
45
|
+
if (!isUserObject(rawUser)) {
|
|
46
|
+
throw new Error('Invalid user data received');
|
|
47
|
+
}
|
|
48
|
+
const user = rawUser;
|
|
49
|
+
const safeString = (value) => {
|
|
50
|
+
if (typeof value === 'string')
|
|
51
|
+
return value;
|
|
52
|
+
if (typeof value === 'number' || typeof value === 'boolean')
|
|
53
|
+
return String(value);
|
|
54
|
+
if (value !== null && typeof value === 'object') {
|
|
55
|
+
try {
|
|
56
|
+
return JSON.stringify(value);
|
|
57
|
+
}
|
|
58
|
+
catch {
|
|
59
|
+
return '[object Object]';
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
return value !== null && value !== undefined && typeof value !== 'object' && typeof value !== 'boolean' ?
|
|
63
|
+
(typeof value === 'string' || typeof value === 'number' ? value.toString() : '') : '';
|
|
64
|
+
};
|
|
65
|
+
// GET /user returns v1.UserWithSettings: language, timezone, week_start,
|
|
66
|
+
// frontend_settings, email_reminders_enabled, overdue_tasks_reminders_enabled,
|
|
67
|
+
// overdue_tasks_reminders_time and name are nested under a `settings`
|
|
68
|
+
// sub-object (models.UserGeneralSettings), NOT flat on the top-level user
|
|
69
|
+
// object. (id, username, email, created, updated remain top-level.)
|
|
70
|
+
// Search results (GET /users) return plain user.User with no `settings` key,
|
|
71
|
+
// so this safely falls back to an empty object for those.
|
|
72
|
+
const settings = isUserObject(user.settings) ? user.settings : {};
|
|
73
|
+
const result = {
|
|
74
|
+
id: Number(user.id) || 0,
|
|
75
|
+
username: safeString(user.username),
|
|
76
|
+
frontend_settings: (settings.frontend_settings && typeof settings.frontend_settings === 'object') ? settings.frontend_settings : {},
|
|
77
|
+
};
|
|
78
|
+
const userResult = {
|
|
79
|
+
id: result.id,
|
|
80
|
+
username: result.username,
|
|
81
|
+
frontend_settings: result.frontend_settings,
|
|
82
|
+
...(user.email ? { email: safeString(user.email) } : {}),
|
|
83
|
+
...(settings.name ? { name: safeString(settings.name) } : {}),
|
|
84
|
+
...(user.created ? { created: safeString(user.created) } : {}),
|
|
85
|
+
...(user.updated ? { updated: safeString(user.updated) } : {}),
|
|
86
|
+
...(settings.language ? { language: safeString(settings.language) } : {}),
|
|
87
|
+
...(settings.timezone ? { timezone: safeString(settings.timezone) } : {}),
|
|
88
|
+
...(settings.week_start !== undefined ? { week_start: Number(settings.week_start) } : {}),
|
|
89
|
+
...(settings.email_reminders_enabled !== undefined ? { email_reminders_enabled: Boolean(settings.email_reminders_enabled) } : {}),
|
|
90
|
+
...(settings.overdue_tasks_reminders_enabled !== undefined ? { overdue_tasks_reminders_enabled: Boolean(settings.overdue_tasks_reminders_enabled) } : {}),
|
|
91
|
+
...(settings.overdue_tasks_reminders_time ? { overdue_tasks_reminders_time: safeString(settings.overdue_tasks_reminders_time) } : {}),
|
|
92
|
+
};
|
|
93
|
+
return userResult;
|
|
94
|
+
}
|
|
95
|
+
function registerUsersTool(server, authManager, _clientFactory) {
|
|
96
|
+
server.tool('vikunja_users', (0, read_only_1.withReadOnlyNote)('vikunja_users', "Manage user profiles, search users, and update user settings. Use the 'timezones' subcommand to fetch this Vikunja instance's list of valid IANA time zone names before calling 'update-settings' with a timezone value — the server rejects unrecognized zone names, and the valid set is instance-dependent (depends on the OS Vikunja runs on). 'get-avatar'/'set-avatar' read and write the avatar *provider* setting (JSON — one of gravatar/upload/initials/marble/ldap/openid/default), not image bytes; 'upload-avatar' uploads an actual image file and only takes effect once the provider is 'upload' (which it also sets as a side effect)."), {
|
|
97
|
+
// Operation type
|
|
98
|
+
subcommand: zod_1.z.enum([
|
|
99
|
+
'current',
|
|
100
|
+
'search',
|
|
101
|
+
'settings',
|
|
102
|
+
'update-settings',
|
|
103
|
+
'timezones',
|
|
104
|
+
'get-avatar',
|
|
105
|
+
'set-avatar',
|
|
106
|
+
'upload-avatar',
|
|
107
|
+
]),
|
|
108
|
+
// Search parameters
|
|
109
|
+
search: zod_1.z.string().optional(),
|
|
110
|
+
page: zod_1.z.number().positive().optional(),
|
|
111
|
+
perPage: zod_1.z.number().positive().max(100).optional(),
|
|
112
|
+
// Settings update fields
|
|
113
|
+
name: zod_1.z.string().optional(),
|
|
114
|
+
language: zod_1.z.string().optional(),
|
|
115
|
+
timezone: zod_1.z.string().optional(),
|
|
116
|
+
weekStart: zod_1.z.number().min(0).max(6).optional(),
|
|
117
|
+
frontendSettings: zod_1.z.record(zod_1.z.unknown()).optional(),
|
|
118
|
+
// Notification preferences
|
|
119
|
+
emailRemindersEnabled: zod_1.z.boolean().optional(),
|
|
120
|
+
overdueTasksRemindersEnabled: zod_1.z.boolean().optional(),
|
|
121
|
+
overdueTasksRemindersTime: zod_1.z.string().optional(),
|
|
122
|
+
// Avatar settings (get-avatar/set-avatar/upload-avatar)
|
|
123
|
+
avatarProvider: zod_1.z.enum(AVATAR_PROVIDERS).optional(),
|
|
124
|
+
// Local file to upload, same contract as `vikunja_tasks attach`:
|
|
125
|
+
// `filePath` (absolute path readable by the MCP server process) takes
|
|
126
|
+
// precedence over `fileContent` (base64) when both are given.
|
|
127
|
+
filePath: zod_1.z.string().optional(),
|
|
128
|
+
fileContent: zod_1.z.string().optional(),
|
|
129
|
+
filename: zod_1.z.string().optional(),
|
|
130
|
+
}, (0, read_only_1.getToolAnnotations)('vikunja_users'), async (args) => {
|
|
131
|
+
if (!authManager.isAuthenticated()) {
|
|
132
|
+
throw new types_1.MCPError(types_1.ErrorCode.AUTH_REQUIRED, 'Authentication required. Please use vikunja_auth.connect first.');
|
|
133
|
+
}
|
|
134
|
+
// User operations require JWT authentication
|
|
135
|
+
if (authManager.getAuthType() !== 'jwt') {
|
|
136
|
+
throw new types_1.MCPError(types_1.ErrorCode.PERMISSION_DENIED, 'User operations require JWT authentication. Please reconnect using vikunja_auth.connect with JWT authentication.');
|
|
137
|
+
}
|
|
138
|
+
(0, read_only_1.assertWriteAllowed)('vikunja_users', args.subcommand);
|
|
139
|
+
try {
|
|
140
|
+
const subcommand = args.subcommand;
|
|
141
|
+
switch (subcommand) {
|
|
142
|
+
case 'current': {
|
|
143
|
+
const rawUser = await (0, vikunja_rest_1.vikunjaRestRequest)(authManager, 'GET', '/user');
|
|
144
|
+
// Safely transform the raw REST user response to our extended User
|
|
145
|
+
// interface. Extended properties may not be available from all Vikunja API versions
|
|
146
|
+
const enhancedUser = transformUser(rawUser);
|
|
147
|
+
const response = (0, types_1.createStandardResponse)('get-current-user', 'Current user retrieved successfully', { user: enhancedUser });
|
|
148
|
+
return {
|
|
149
|
+
content: [
|
|
150
|
+
{
|
|
151
|
+
type: 'text',
|
|
152
|
+
text: (0, response_factory_1.formatAorpAsMarkdown)(response),
|
|
153
|
+
},
|
|
154
|
+
],
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
case 'search': {
|
|
158
|
+
const params = {};
|
|
159
|
+
if (args.search !== undefined)
|
|
160
|
+
params.s = args.search;
|
|
161
|
+
if (args.page !== undefined)
|
|
162
|
+
params.page = args.page;
|
|
163
|
+
if (args.perPage !== undefined)
|
|
164
|
+
params.per_page = args.perPage;
|
|
165
|
+
// GET /users only accepts the `s` query param per the spec (no
|
|
166
|
+
// page/per_page) — the legacy client's UserSearchParams type includes
|
|
167
|
+
// pagination fields the real endpoint doesn't support, so the
|
|
168
|
+
// request only ever sent `s` server-side even before this
|
|
169
|
+
// migration. `params`/`paramsMetadata` still record whatever the
|
|
170
|
+
// caller passed for the response metadata below.
|
|
171
|
+
const query = new URLSearchParams();
|
|
172
|
+
if (params.s !== undefined)
|
|
173
|
+
query.set('s', params.s);
|
|
174
|
+
const queryString = query.toString();
|
|
175
|
+
const usersResult = await (0, vikunja_rest_1.vikunjaRestRequest)(authManager, 'GET', `/users${queryString ? `?${queryString}` : ''}`);
|
|
176
|
+
const users = usersResult ?? [];
|
|
177
|
+
const paramsMetadata = {};
|
|
178
|
+
if (args.search !== undefined)
|
|
179
|
+
paramsMetadata.search = args.search;
|
|
180
|
+
if (args.page !== undefined)
|
|
181
|
+
paramsMetadata.page = args.page;
|
|
182
|
+
if (args.perPage !== undefined)
|
|
183
|
+
paramsMetadata.perPage = args.perPage;
|
|
184
|
+
const response = (0, types_1.createStandardResponse)('search-users', `Found ${users.length} users`, { users: users.map(transformUser) }, { count: users.length, params: paramsMetadata });
|
|
185
|
+
return {
|
|
186
|
+
content: [
|
|
187
|
+
{
|
|
188
|
+
type: 'text',
|
|
189
|
+
text: (0, response_factory_1.formatAorpAsMarkdown)(response),
|
|
190
|
+
},
|
|
191
|
+
],
|
|
192
|
+
};
|
|
193
|
+
}
|
|
194
|
+
case 'settings': {
|
|
195
|
+
// Get current user first to get their settings
|
|
196
|
+
const rawUser = await (0, vikunja_rest_1.vikunjaRestRequest)(authManager, 'GET', '/user');
|
|
197
|
+
// Safely transform the raw REST user response to our extended User interface
|
|
198
|
+
const user = transformUser(rawUser);
|
|
199
|
+
// Handle the actual API response format gracefully
|
|
200
|
+
const settings = {
|
|
201
|
+
id: user.id,
|
|
202
|
+
username: user.username,
|
|
203
|
+
...(user.email && { email: user.email }),
|
|
204
|
+
...(user.name && { name: user.name }),
|
|
205
|
+
...(user.language && { language: user.language }),
|
|
206
|
+
...(user.timezone && { timezone: user.timezone }),
|
|
207
|
+
...(user.week_start !== undefined && { weekStart: user.week_start }),
|
|
208
|
+
frontendSettings: user.frontend_settings || {},
|
|
209
|
+
...(user.email_reminders_enabled !== undefined && { emailRemindersEnabled: user.email_reminders_enabled }),
|
|
210
|
+
...(user.overdue_tasks_reminders_enabled !== undefined && { overdueTasksRemindersEnabled: user.overdue_tasks_reminders_enabled }),
|
|
211
|
+
...(user.overdue_tasks_reminders_time && { overdueTasksRemindersTime: user.overdue_tasks_reminders_time }),
|
|
212
|
+
};
|
|
213
|
+
const response = (0, types_1.createStandardResponse)('get-user-settings', 'User settings retrieved successfully', { settings });
|
|
214
|
+
return {
|
|
215
|
+
content: [
|
|
216
|
+
{
|
|
217
|
+
type: 'text',
|
|
218
|
+
text: (0, response_factory_1.formatAorpAsMarkdown)(response),
|
|
219
|
+
},
|
|
220
|
+
],
|
|
221
|
+
};
|
|
222
|
+
}
|
|
223
|
+
case 'update-settings': {
|
|
224
|
+
if (!args.name &&
|
|
225
|
+
!args.language &&
|
|
226
|
+
!args.timezone &&
|
|
227
|
+
args.weekStart === undefined &&
|
|
228
|
+
!args.frontendSettings &&
|
|
229
|
+
args.emailRemindersEnabled === undefined &&
|
|
230
|
+
args.overdueTasksRemindersEnabled === undefined &&
|
|
231
|
+
args.overdueTasksRemindersTime === undefined) {
|
|
232
|
+
throw new types_1.MCPError(types_1.ErrorCode.VALIDATION_ERROR, 'At least one setting field is required');
|
|
233
|
+
}
|
|
234
|
+
const settings = {};
|
|
235
|
+
const affectedFields = [];
|
|
236
|
+
if (args.name !== undefined) {
|
|
237
|
+
settings.name = args.name;
|
|
238
|
+
affectedFields.push('name');
|
|
239
|
+
}
|
|
240
|
+
if (args.language !== undefined) {
|
|
241
|
+
settings.language = args.language;
|
|
242
|
+
affectedFields.push('language');
|
|
243
|
+
}
|
|
244
|
+
if (args.timezone !== undefined) {
|
|
245
|
+
settings.timezone = args.timezone;
|
|
246
|
+
affectedFields.push('timezone');
|
|
247
|
+
}
|
|
248
|
+
if (args.weekStart !== undefined) {
|
|
249
|
+
settings.week_start = args.weekStart;
|
|
250
|
+
affectedFields.push('weekStart');
|
|
251
|
+
}
|
|
252
|
+
if (args.frontendSettings !== undefined) {
|
|
253
|
+
settings.frontend_settings = args.frontendSettings;
|
|
254
|
+
affectedFields.push('frontendSettings');
|
|
255
|
+
}
|
|
256
|
+
if (args.emailRemindersEnabled !== undefined) {
|
|
257
|
+
settings.email_reminders_enabled = args.emailRemindersEnabled;
|
|
258
|
+
affectedFields.push('emailRemindersEnabled');
|
|
259
|
+
}
|
|
260
|
+
if (args.overdueTasksRemindersEnabled !== undefined) {
|
|
261
|
+
settings.overdue_tasks_reminders_enabled = args.overdueTasksRemindersEnabled;
|
|
262
|
+
affectedFields.push('overdueTasksRemindersEnabled');
|
|
263
|
+
}
|
|
264
|
+
if (args.overdueTasksRemindersTime !== undefined) {
|
|
265
|
+
settings.overdue_tasks_reminders_time = args.overdueTasksRemindersTime;
|
|
266
|
+
affectedFields.push('overdueTasksRemindersTime');
|
|
267
|
+
}
|
|
268
|
+
await (0, vikunja_rest_1.vikunjaRestRequest)(authManager, 'POST', '/user/settings/general', settings);
|
|
269
|
+
// Get updated user info
|
|
270
|
+
const rawUpdatedUser = await (0, vikunja_rest_1.vikunjaRestRequest)(authManager, 'GET', '/user');
|
|
271
|
+
// Safely transform the raw REST user response to our extended User interface
|
|
272
|
+
const updatedUser = transformUser(rawUpdatedUser);
|
|
273
|
+
const response = (0, types_1.createStandardResponse)('update-user-settings', 'User settings updated successfully', { user: updatedUser }, { affectedFields });
|
|
274
|
+
return {
|
|
275
|
+
content: [
|
|
276
|
+
{
|
|
277
|
+
type: 'text',
|
|
278
|
+
text: (0, response_factory_1.formatAorpAsMarkdown)(response),
|
|
279
|
+
},
|
|
280
|
+
],
|
|
281
|
+
};
|
|
282
|
+
}
|
|
283
|
+
case 'timezones': {
|
|
284
|
+
// GET /user/timezones. Not exposed via the legacy client's client
|
|
285
|
+
// (all new HTTP calls go through vikunjaRestRequest per
|
|
286
|
+
// docs/ENDPOINT-PLAYBOOK.md §3). The instance-dependent list of
|
|
287
|
+
// valid IANA time zone names this call returns is exactly what
|
|
288
|
+
// 'update-settings'' timezone argument needs to be validated
|
|
289
|
+
// against before being sent to POST /user/settings/general —
|
|
290
|
+
// Vikunja rejects unrecognized zone names there.
|
|
291
|
+
const timezones = (await (0, vikunja_rest_1.vikunjaRestRequest)(authManager, 'GET', '/user/timezones')) ?? [];
|
|
292
|
+
const response = (0, types_1.createStandardResponse)('get-user-timezones', `Retrieved ${timezones.length} available time zones`, { timezones }, { count: timezones.length });
|
|
293
|
+
return {
|
|
294
|
+
content: [
|
|
295
|
+
{
|
|
296
|
+
type: 'text',
|
|
297
|
+
text: (0, response_factory_1.formatAorpAsMarkdown)(response),
|
|
298
|
+
},
|
|
299
|
+
],
|
|
300
|
+
};
|
|
301
|
+
}
|
|
302
|
+
case 'get-avatar': {
|
|
303
|
+
// GET /user/settings/avatar returns v1.UserAvatarProvider
|
|
304
|
+
// ({avatar_provider}) — JSON, not image bytes. See the type
|
|
305
|
+
// comment above and docs/ENDPOINT-TAIL-RETRIAGE.md G5.
|
|
306
|
+
const raw = await (0, vikunja_rest_1.vikunjaRestRequest)(authManager, 'GET', '/user/settings/avatar');
|
|
307
|
+
const avatarProvider = raw?.avatar_provider ?? '';
|
|
308
|
+
const response = (0, types_1.createStandardResponse)('get-avatar-provider', 'Avatar provider retrieved successfully', { avatarProvider });
|
|
309
|
+
return {
|
|
310
|
+
content: [
|
|
311
|
+
{
|
|
312
|
+
type: 'text',
|
|
313
|
+
text: (0, response_factory_1.formatAorpAsMarkdown)(response),
|
|
314
|
+
},
|
|
315
|
+
],
|
|
316
|
+
};
|
|
317
|
+
}
|
|
318
|
+
case 'set-avatar': {
|
|
319
|
+
if (!args.avatarProvider) {
|
|
320
|
+
throw new types_1.MCPError(types_1.ErrorCode.VALIDATION_ERROR, `set-avatar requires avatarProvider (one of: ${AVATAR_PROVIDERS.join(', ')})`);
|
|
321
|
+
}
|
|
322
|
+
// POST /user/settings/avatar, body v1.UserAvatarProvider. Zod's
|
|
323
|
+
// enum check above already rejects anything outside
|
|
324
|
+
// AVATAR_PROVIDERS before the handler runs.
|
|
325
|
+
await (0, vikunja_rest_1.vikunjaRestRequest)(authManager, 'POST', '/user/settings/avatar', { avatar_provider: args.avatarProvider });
|
|
326
|
+
const response = (0, types_1.createStandardResponse)('set-avatar-provider', `Avatar provider set to '${args.avatarProvider}'` +
|
|
327
|
+
(args.avatarProvider === 'upload'
|
|
328
|
+
? " — call 'upload-avatar' with a file to complete the switch."
|
|
329
|
+
: ''), { avatarProvider: args.avatarProvider });
|
|
330
|
+
return {
|
|
331
|
+
content: [
|
|
332
|
+
{
|
|
333
|
+
type: 'text',
|
|
334
|
+
text: (0, response_factory_1.formatAorpAsMarkdown)(response),
|
|
335
|
+
},
|
|
336
|
+
],
|
|
337
|
+
};
|
|
338
|
+
}
|
|
339
|
+
case 'upload-avatar': {
|
|
340
|
+
// PUT /user/settings/avatar/upload, multipart/form-data, field
|
|
341
|
+
// name `avatar` (single file). This endpoint ALSO sets the
|
|
342
|
+
// avatar provider to 'upload' as a side effect on the server
|
|
343
|
+
// (see the Vikunja source's UploadAvatar handler) — the upload
|
|
344
|
+
// only actually shows up once the provider is 'upload', which
|
|
345
|
+
// this call itself guarantees going forward, but a *prior*
|
|
346
|
+
// 'gravatar'/'initials'/etc. provider is silently overwritten by
|
|
347
|
+
// it. Same file-input contract as `vikunja_tasks attach`:
|
|
348
|
+
// `filePath` (server-local path) or `fileContent` (base64),
|
|
349
|
+
// `filePath` wins when both are given.
|
|
350
|
+
const { filePath, fileContent, filename } = args;
|
|
351
|
+
let bytes;
|
|
352
|
+
let name;
|
|
353
|
+
let source;
|
|
354
|
+
if (filePath) {
|
|
355
|
+
try {
|
|
356
|
+
bytes = (0, node_fs_1.readFileSync)(filePath);
|
|
357
|
+
}
|
|
358
|
+
catch (err) {
|
|
359
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
360
|
+
throw new types_1.MCPError(types_1.ErrorCode.VALIDATION_ERROR, `upload-avatar: cannot read filePath ${filePath}: ${message}`);
|
|
361
|
+
}
|
|
362
|
+
name = filename || (0, node_path_1.basename)(filePath);
|
|
363
|
+
source = 'filePath';
|
|
364
|
+
}
|
|
365
|
+
else if (fileContent) {
|
|
366
|
+
const decoded = Buffer.from(fileContent, 'base64');
|
|
367
|
+
if (decoded.length === 0) {
|
|
368
|
+
throw new types_1.MCPError(types_1.ErrorCode.VALIDATION_ERROR, 'upload-avatar: decoded fileContent is empty (not valid base64 or empty input)');
|
|
369
|
+
}
|
|
370
|
+
bytes = decoded;
|
|
371
|
+
name = filename || 'avatar.png';
|
|
372
|
+
source = 'fileContent';
|
|
373
|
+
}
|
|
374
|
+
else {
|
|
375
|
+
throw new types_1.MCPError(types_1.ErrorCode.VALIDATION_ERROR, 'upload-avatar requires filePath or fileContent');
|
|
376
|
+
}
|
|
377
|
+
// Strip any directory component a caller might inject via `filename`.
|
|
378
|
+
name = (0, node_path_1.basename)(name);
|
|
379
|
+
const form = new FormData();
|
|
380
|
+
form.append('avatar', new Blob([bytes]), name);
|
|
381
|
+
const data = await (0, vikunja_rest_1.vikunjaRestMultipartRequest)(authManager, 'PUT', '/user/settings/avatar/upload', form);
|
|
382
|
+
const response = (0, types_1.createStandardResponse)('upload-avatar', `Avatar uploaded (${bytes.length} bytes) and provider set to 'upload'`, { filename: name, bytes: bytes.length, source, response: data });
|
|
383
|
+
return {
|
|
384
|
+
content: [
|
|
385
|
+
{
|
|
386
|
+
type: 'text',
|
|
387
|
+
text: (0, response_factory_1.formatAorpAsMarkdown)(response),
|
|
388
|
+
},
|
|
389
|
+
],
|
|
390
|
+
};
|
|
391
|
+
}
|
|
392
|
+
default:
|
|
393
|
+
throw new types_1.MCPError(types_1.ErrorCode.VALIDATION_ERROR, `Invalid subcommand: ${String(subcommand)}`);
|
|
394
|
+
}
|
|
395
|
+
}
|
|
396
|
+
catch (error) {
|
|
397
|
+
if (error instanceof types_1.MCPError) {
|
|
398
|
+
// A REST-layer 401/403 on a user endpoint is the documented
|
|
399
|
+
// Vikunja API quirk (docs/API_NOTES.md "User Endpoint
|
|
400
|
+
// Authentication"): the same token that works everywhere else can
|
|
401
|
+
// be rejected on `/user`/`/users`. Route it through the same
|
|
402
|
+
// friendly auth-error translation legacy-client-sourced exceptions
|
|
403
|
+
// used to get — `vikunjaRestRequest` throws `MCPError` with the
|
|
404
|
+
// HTTP status under `details.statusCode`, not a `.message` string
|
|
405
|
+
// `handleAuthError`'s pattern matching recognizes, so this has to
|
|
406
|
+
// be detected structurally rather than by message content.
|
|
407
|
+
const statusCode = error.details?.statusCode;
|
|
408
|
+
if (statusCode === 401 || statusCode === 403) {
|
|
409
|
+
(0, auth_error_handler_1.handleAuthError)(new Error(`${statusCode} ${error.message}`), `user.${args.subcommand}`, `User operation error: ${error.message}`);
|
|
410
|
+
}
|
|
411
|
+
throw error;
|
|
412
|
+
}
|
|
413
|
+
// Use consistent auth error handling
|
|
414
|
+
(0, auth_error_handler_1.handleAuthError)(error, `user.${args.subcommand}`, `User operation error: ${error instanceof Error ? error.message : String(error)}`);
|
|
415
|
+
}
|
|
416
|
+
});
|
|
417
|
+
}
|
|
418
|
+
//# sourceMappingURL=users.js.map
|