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,153 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Attachments read-side subcommands of `vikunja_tasks`.
|
|
4
|
+
*
|
|
5
|
+
* Complements `attach.ts`'s upload path (`PUT /tasks/{id}/attachments`) with:
|
|
6
|
+
* - `list-attachments`: `GET /tasks/{id}/attachments` (page/per_page).
|
|
7
|
+
* - `get-attachment-info`: metadata for one attachment. The spec has no
|
|
8
|
+
* single-attachment metadata endpoint — `GET
|
|
9
|
+
* /tasks/{id}/attachments/{attachmentID}` returns the raw file bytes,
|
|
10
|
+
* not JSON — so this is derived by fetching the list and finding the
|
|
11
|
+
* matching id, the same fetch-list-and-filter shape `vikunja_webhooks`
|
|
12
|
+
* uses for its `get` subcommand (no per-id GET exists there either).
|
|
13
|
+
* - `delete-attachment`: `DELETE /tasks/{id}/attachments/{attachmentID}`.
|
|
14
|
+
* - `download-attachment`: per the OpenAPI spec, `GET
|
|
15
|
+
* /tasks/{id}/attachments/{attachmentID}` produces
|
|
16
|
+
* `application/octet-stream`. MCP has no binary/file-delivery channel
|
|
17
|
+
* (see docs/API_NOTES.md's "MCP-Specific Limitations"), so this cannot
|
|
18
|
+
* fetch and hand back the file itself. Honesty over pretending
|
|
19
|
+
* (docs/ENDPOINT-PLAYBOOK.md §7): it returns the direct download URL and
|
|
20
|
+
* the auth header the caller needs to fetch it themselves — the same
|
|
21
|
+
* shape as `vikunja_download_user_export` in `src/tools/export.ts`.
|
|
22
|
+
*/
|
|
23
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
24
|
+
exports.listAttachments = listAttachments;
|
|
25
|
+
exports.getAttachmentInfo = getAttachmentInfo;
|
|
26
|
+
exports.deleteAttachment = deleteAttachment;
|
|
27
|
+
exports.downloadAttachment = downloadAttachment;
|
|
28
|
+
const types_1 = require("../../types");
|
|
29
|
+
const validation_1 = require("../../utils/validation");
|
|
30
|
+
const response_factory_1 = require("../../utils/response-factory");
|
|
31
|
+
const vikunja_rest_1 = require("../../utils/vikunja-rest");
|
|
32
|
+
function requireTaskId(args, op) {
|
|
33
|
+
if (args.id === undefined || args.id === null) {
|
|
34
|
+
throw new types_1.MCPError(types_1.ErrorCode.VALIDATION_ERROR, `Task id is required for ${op}`);
|
|
35
|
+
}
|
|
36
|
+
(0, validation_1.validateId)(args.id, 'id');
|
|
37
|
+
return args.id;
|
|
38
|
+
}
|
|
39
|
+
function requireAttachmentId(args, op) {
|
|
40
|
+
if (args.attachmentId === undefined || args.attachmentId === null) {
|
|
41
|
+
throw new types_1.MCPError(types_1.ErrorCode.VALIDATION_ERROR, `attachmentId is required for ${op}`);
|
|
42
|
+
}
|
|
43
|
+
(0, validation_1.validateId)(args.attachmentId, 'attachmentId');
|
|
44
|
+
return args.attachmentId;
|
|
45
|
+
}
|
|
46
|
+
function buildPaginationQuery(args) {
|
|
47
|
+
if (args.page !== undefined)
|
|
48
|
+
(0, validation_1.validateId)(args.page, 'page');
|
|
49
|
+
if (args.perPage !== undefined)
|
|
50
|
+
(0, validation_1.validateId)(args.perPage, 'perPage');
|
|
51
|
+
const params = new URLSearchParams();
|
|
52
|
+
if (args.page !== undefined)
|
|
53
|
+
params.set('page', String(args.page));
|
|
54
|
+
if (args.perPage !== undefined)
|
|
55
|
+
params.set('per_page', String(args.perPage));
|
|
56
|
+
const qs = params.toString();
|
|
57
|
+
return qs ? `?${qs}` : '';
|
|
58
|
+
}
|
|
59
|
+
async function fetchAttachments(authManager, taskId, args) {
|
|
60
|
+
const items = await (0, vikunja_rest_1.vikunjaRestRequest)(authManager, 'GET', `/tasks/${taskId}/attachments${buildPaginationQuery(args)}`);
|
|
61
|
+
return Array.isArray(items) ? items : [];
|
|
62
|
+
}
|
|
63
|
+
function summarizeAttachment(attachment) {
|
|
64
|
+
return {
|
|
65
|
+
id: attachment.id ?? null,
|
|
66
|
+
filename: attachment.file?.name ?? null,
|
|
67
|
+
size: attachment.file?.size ?? null,
|
|
68
|
+
mime: attachment.file?.mime ?? null,
|
|
69
|
+
created: attachment.created ?? null,
|
|
70
|
+
createdBy: attachment.created_by
|
|
71
|
+
? {
|
|
72
|
+
id: attachment.created_by.id ?? null,
|
|
73
|
+
username: attachment.created_by.username ?? null,
|
|
74
|
+
name: attachment.created_by.name ?? null,
|
|
75
|
+
}
|
|
76
|
+
: null,
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Lists a task's attachments (`GET /tasks/{id}/attachments`).
|
|
81
|
+
*/
|
|
82
|
+
async function listAttachments(args, authManager) {
|
|
83
|
+
const taskId = requireTaskId(args, 'list-attachments operation');
|
|
84
|
+
const attachments = await fetchAttachments(authManager, taskId, args);
|
|
85
|
+
const response = (0, response_factory_1.createStandardResponse)('list-attachments', `Task ${taskId} has ${attachments.length} attachment(s)`, {
|
|
86
|
+
taskId,
|
|
87
|
+
attachments: attachments.map(summarizeAttachment),
|
|
88
|
+
count: attachments.length,
|
|
89
|
+
}, {
|
|
90
|
+
timestamp: new Date().toISOString(),
|
|
91
|
+
count: attachments.length,
|
|
92
|
+
...(args.page !== undefined ? { page: args.page } : {}),
|
|
93
|
+
...(args.perPage !== undefined ? { perPage: args.perPage } : {}),
|
|
94
|
+
}, args.sessionId);
|
|
95
|
+
return { content: [{ type: 'text', text: (0, response_factory_1.formatAorpAsMarkdown)(response) }] };
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Retrieves metadata (file name, size, mime, created, author) for a single
|
|
99
|
+
* attachment. There is no dedicated single-attachment metadata endpoint in
|
|
100
|
+
* the spec, so this fetches the list and picks out the matching id.
|
|
101
|
+
*/
|
|
102
|
+
async function getAttachmentInfo(args, authManager) {
|
|
103
|
+
const taskId = requireTaskId(args, 'get-attachment-info operation');
|
|
104
|
+
const attachmentId = requireAttachmentId(args, 'get-attachment-info operation');
|
|
105
|
+
const attachments = await fetchAttachments(authManager, taskId, args);
|
|
106
|
+
const attachment = attachments.find((a) => a.id === attachmentId);
|
|
107
|
+
if (!attachment) {
|
|
108
|
+
throw new types_1.MCPError(types_1.ErrorCode.NOT_FOUND, `Attachment ${attachmentId} not found on task ${taskId}` +
|
|
109
|
+
(args.page !== undefined || args.perPage !== undefined
|
|
110
|
+
? ' on the requested page — pass a different page/perPage to search elsewhere'
|
|
111
|
+
: ' on the default page — pass page/perPage to search further pages if the task has many attachments'));
|
|
112
|
+
}
|
|
113
|
+
const response = (0, response_factory_1.createStandardResponse)('get-attachment-info', `Retrieved metadata for attachment ${attachmentId} on task ${taskId}`, { taskId, ...summarizeAttachment(attachment) }, { timestamp: new Date().toISOString() }, args.sessionId);
|
|
114
|
+
return { content: [{ type: 'text', text: (0, response_factory_1.formatAorpAsMarkdown)(response) }] };
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Deletes an attachment (`DELETE /tasks/{id}/attachments/{attachmentID}`).
|
|
118
|
+
*/
|
|
119
|
+
async function deleteAttachment(args, authManager) {
|
|
120
|
+
const taskId = requireTaskId(args, 'delete-attachment operation');
|
|
121
|
+
const attachmentId = requireAttachmentId(args, 'delete-attachment operation');
|
|
122
|
+
await (0, vikunja_rest_1.vikunjaRestRequest)(authManager, 'DELETE', `/tasks/${taskId}/attachments/${attachmentId}`);
|
|
123
|
+
const response = (0, response_factory_1.createStandardResponse)('delete-attachment', `Deleted attachment ${attachmentId} from task ${taskId}`, { taskId, attachmentId, deleted: true }, { timestamp: new Date().toISOString(), affectedFields: ['attachments'] }, args.sessionId);
|
|
124
|
+
return { content: [{ type: 'text', text: (0, response_factory_1.formatAorpAsMarkdown)(response) }] };
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Returns the direct download URL for an attachment plus auth guidance,
|
|
128
|
+
* instead of pretending this tool can deliver the binary file itself. See
|
|
129
|
+
* the module doc comment for why: `GET
|
|
130
|
+
* /tasks/{id}/attachments/{attachmentID}` returns
|
|
131
|
+
* `application/octet-stream`, and MCP has no binary content channel.
|
|
132
|
+
*/
|
|
133
|
+
function downloadAttachment(args, authManager) {
|
|
134
|
+
const taskId = requireTaskId(args, 'download-attachment operation');
|
|
135
|
+
const attachmentId = requireAttachmentId(args, 'download-attachment operation');
|
|
136
|
+
const session = authManager.getSession();
|
|
137
|
+
const baseUrl = (0, vikunja_rest_1.resolveBaseUrl)(session.apiUrl);
|
|
138
|
+
const query = args.previewSize ? `?preview_size=${encodeURIComponent(args.previewSize)}` : '';
|
|
139
|
+
const downloadUrl = `${baseUrl}/tasks/${taskId}/attachments/${attachmentId}${query}`;
|
|
140
|
+
const response = (0, response_factory_1.createStandardResponse)('download-attachment', 'This endpoint returns application/octet-stream (the raw file bytes) per the ' +
|
|
141
|
+
'Vikunja API spec, and the MCP protocol has no channel to deliver binary ' +
|
|
142
|
+
'content through this tool. Fetch downloadUrl yourself with an ' +
|
|
143
|
+
'`Authorization: Bearer <token>` header, using the same token this server ' +
|
|
144
|
+
'is configured with, to retrieve the file.', {
|
|
145
|
+
taskId,
|
|
146
|
+
attachmentId,
|
|
147
|
+
downloadUrl,
|
|
148
|
+
authHeader: 'Authorization: Bearer <your Vikunja API token>',
|
|
149
|
+
deliveredThroughThisTool: false,
|
|
150
|
+
}, { timestamp: new Date().toISOString() }, args.sessionId);
|
|
151
|
+
return { content: [{ type: 'text', text: (0, response_factory_1.formatAorpAsMarkdown)(response) }] };
|
|
152
|
+
}
|
|
153
|
+
//# sourceMappingURL=attachments.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"attachments.js","sourceRoot":"","sources":["../../../src/tools/tasks/attachments.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Task Kanban bucket operations
|
|
3
|
+
*
|
|
4
|
+
* Implements `set-bucket`, which moves a task into a Kanban bucket (column)
|
|
5
|
+
* of its project's Kanban view. This is the operation behind a "move card to
|
|
6
|
+
* the Doing column" workflow.
|
|
7
|
+
*
|
|
8
|
+
* legacy client does not expose the Kanban view endpoints, so this calls the
|
|
9
|
+
* Vikunja REST API directly via the shared `vikunja-rest` helper.
|
|
10
|
+
*/
|
|
11
|
+
import type { AuthManager } from '../../auth/AuthManager';
|
|
12
|
+
export interface SetTaskBucketArgs {
|
|
13
|
+
/** Id of the task to move. */
|
|
14
|
+
id?: number;
|
|
15
|
+
/** Id of the destination Kanban bucket. */
|
|
16
|
+
bucketId?: number;
|
|
17
|
+
/** Optional Kanban view id. Auto-resolved from the project when omitted. */
|
|
18
|
+
viewId?: number;
|
|
19
|
+
/** Optional project id. Auto-resolved from the task when omitted. */
|
|
20
|
+
projectId?: number;
|
|
21
|
+
/** Session id for response tracking. */
|
|
22
|
+
sessionId?: string;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Moves a task into a Kanban bucket.
|
|
26
|
+
*
|
|
27
|
+
* Resolution order when optional ids are omitted:
|
|
28
|
+
* - projectId: fetched from the task itself
|
|
29
|
+
* - viewId: resolved to the project's Kanban view
|
|
30
|
+
*
|
|
31
|
+
* @param args - Task id, destination bucket id, and optional view/project ids
|
|
32
|
+
* @param authManager - Active auth manager holding session credentials
|
|
33
|
+
* @returns MCP response describing the move
|
|
34
|
+
*/
|
|
35
|
+
export declare function setTaskBucket(args: SetTaskBucketArgs, authManager: AuthManager): Promise<{
|
|
36
|
+
content: Array<{
|
|
37
|
+
type: 'text';
|
|
38
|
+
text: string;
|
|
39
|
+
}>;
|
|
40
|
+
}>;
|
|
41
|
+
//# sourceMappingURL=buckets.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"buckets.d.ts","sourceRoot":"","sources":["../../../src/tools/tasks/buckets.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAM1D,MAAM,WAAW,iBAAiB;IAChC,8BAA8B;IAC9B,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,2CAA2C;IAC3C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,4EAA4E;IAC5E,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,qEAAqE;IACrE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,wCAAwC;IACxC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAQD;;;;;;;;;;GAUG;AACH,wBAAsB,aAAa,CACjC,IAAI,EAAE,iBAAiB,EACvB,WAAW,EAAE,WAAW,GACvB,OAAO,CAAC;IAAE,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAAE,CAAC,CAsE7D"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Task Kanban bucket operations
|
|
4
|
+
*
|
|
5
|
+
* Implements `set-bucket`, which moves a task into a Kanban bucket (column)
|
|
6
|
+
* of its project's Kanban view. This is the operation behind a "move card to
|
|
7
|
+
* the Doing column" workflow.
|
|
8
|
+
*
|
|
9
|
+
* legacy client does not expose the Kanban view endpoints, so this calls the
|
|
10
|
+
* Vikunja REST API directly via the shared `vikunja-rest` helper.
|
|
11
|
+
*/
|
|
12
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
|
+
exports.setTaskBucket = setTaskBucket;
|
|
14
|
+
const types_1 = require("../../types");
|
|
15
|
+
const validation_1 = require("../../utils/validation");
|
|
16
|
+
const response_factory_1 = require("../../utils/response-factory");
|
|
17
|
+
const vikunja_rest_1 = require("../../utils/vikunja-rest");
|
|
18
|
+
/**
|
|
19
|
+
* Moves a task into a Kanban bucket.
|
|
20
|
+
*
|
|
21
|
+
* Resolution order when optional ids are omitted:
|
|
22
|
+
* - projectId: fetched from the task itself
|
|
23
|
+
* - viewId: resolved to the project's Kanban view
|
|
24
|
+
*
|
|
25
|
+
* @param args - Task id, destination bucket id, and optional view/project ids
|
|
26
|
+
* @param authManager - Active auth manager holding session credentials
|
|
27
|
+
* @returns MCP response describing the move
|
|
28
|
+
*/
|
|
29
|
+
async function setTaskBucket(args, authManager) {
|
|
30
|
+
if (!args.id) {
|
|
31
|
+
throw new types_1.MCPError(types_1.ErrorCode.VALIDATION_ERROR, 'Task id is required for set-bucket operation');
|
|
32
|
+
}
|
|
33
|
+
if (args.bucketId === undefined || args.bucketId === null) {
|
|
34
|
+
throw new types_1.MCPError(types_1.ErrorCode.VALIDATION_ERROR, 'bucketId is required for set-bucket operation');
|
|
35
|
+
}
|
|
36
|
+
(0, validation_1.validateId)(args.id, 'id');
|
|
37
|
+
(0, validation_1.validateId)(args.bucketId, 'bucketId');
|
|
38
|
+
if (args.viewId !== undefined)
|
|
39
|
+
(0, validation_1.validateId)(args.viewId, 'viewId');
|
|
40
|
+
if (args.projectId !== undefined)
|
|
41
|
+
(0, validation_1.validateId)(args.projectId, 'projectId');
|
|
42
|
+
// Resolve the project id from the task when the caller did not supply it.
|
|
43
|
+
let projectId = args.projectId;
|
|
44
|
+
if (projectId === undefined) {
|
|
45
|
+
const task = await (0, vikunja_rest_1.vikunjaRestRequest)(authManager, 'GET', `/tasks/${args.id}`);
|
|
46
|
+
if (!task || typeof task.project_id !== 'number') {
|
|
47
|
+
throw new types_1.MCPError(types_1.ErrorCode.NOT_FOUND, `Could not resolve the project of task ${args.id}`);
|
|
48
|
+
}
|
|
49
|
+
projectId = task.project_id;
|
|
50
|
+
}
|
|
51
|
+
// Resolve the Kanban view id when the caller did not supply it.
|
|
52
|
+
const viewId = args.viewId !== undefined ? args.viewId : await (0, vikunja_rest_1.resolveKanbanViewId)(authManager, projectId);
|
|
53
|
+
// Place the task into the bucket. Vikunja's bucket-task endpoint expects the
|
|
54
|
+
// TaskBucket payload; bucket_id is also part of the URL but is sent in the
|
|
55
|
+
// body as the API model requires it.
|
|
56
|
+
await (0, vikunja_rest_1.vikunjaRestRequest)(authManager, 'POST', `/projects/${projectId}/views/${viewId}/buckets/${args.bucketId}/tasks`, { task_id: args.id, bucket_id: args.bucketId });
|
|
57
|
+
const response = (0, response_factory_1.createStandardResponse)('set-task-bucket', `Task ${args.id} moved to bucket ${args.bucketId}`, {
|
|
58
|
+
taskId: args.id,
|
|
59
|
+
bucketId: args.bucketId,
|
|
60
|
+
viewId,
|
|
61
|
+
projectId,
|
|
62
|
+
}, {
|
|
63
|
+
timestamp: new Date().toISOString(),
|
|
64
|
+
affectedFields: ['bucket_id'],
|
|
65
|
+
}, args.sessionId);
|
|
66
|
+
return {
|
|
67
|
+
content: [
|
|
68
|
+
{
|
|
69
|
+
type: 'text',
|
|
70
|
+
text: (0, response_factory_1.formatAorpAsMarkdown)(response),
|
|
71
|
+
},
|
|
72
|
+
],
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=buckets.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"buckets.js","sourceRoot":"","sources":["../../../src/tools/tasks/buckets.ts"],"names":[],"mappings":";AAAA;;;;;;;;;GASG;;AAsCH,sCAyEC;AA5GD,uCAAkD;AAClD,uDAAoD;AACpD,mEAA4F;AAC5F,2DAAmF;AAqBnF;;;;;;;;;;GAUG;AACI,KAAK,UAAU,aAAa,CACjC,IAAuB,EACvB,WAAwB;IAExB,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;QACb,MAAM,IAAI,gBAAQ,CAAC,iBAAS,CAAC,gBAAgB,EAAE,8CAA8C,CAAC,CAAC;IACjG,CAAC;IACD,IAAI,IAAI,CAAC,QAAQ,KAAK,SAAS,IAAI,IAAI,CAAC,QAAQ,KAAK,IAAI,EAAE,CAAC;QAC1D,MAAM,IAAI,gBAAQ,CAChB,iBAAS,CAAC,gBAAgB,EAC1B,+CAA+C,CAChD,CAAC;IACJ,CAAC;IACD,IAAA,uBAAU,EAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;IAC1B,IAAA,uBAAU,EAAC,IAAI,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;IACtC,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS;QAAE,IAAA,uBAAU,EAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IACjE,IAAI,IAAI,CAAC,SAAS,KAAK,SAAS;QAAE,IAAA,uBAAU,EAAC,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;IAE1E,0EAA0E;IAC1E,IAAI,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;IAC/B,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;QAC5B,MAAM,IAAI,GAAG,MAAM,IAAA,iCAAkB,EACnC,WAAW,EACX,KAAK,EACL,UAAU,IAAI,CAAC,EAAE,EAAE,CACpB,CAAC;QACF,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,CAAC,UAAU,KAAK,QAAQ,EAAE,CAAC;YACjD,MAAM,IAAI,gBAAQ,CAChB,iBAAS,CAAC,SAAS,EACnB,yCAAyC,IAAI,CAAC,EAAE,EAAE,CACnD,CAAC;QACJ,CAAC;QACD,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC;IAC9B,CAAC;IAED,gEAAgE;IAChE,MAAM,MAAM,GACV,IAAI,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,IAAA,kCAAmB,EAAC,WAAW,EAAE,SAAS,CAAC,CAAC;IAE9F,6EAA6E;IAC7E,2EAA2E;IAC3E,qCAAqC;IACrC,MAAM,IAAA,iCAAkB,EACtB,WAAW,EACX,MAAM,EACN,aAAa,SAAS,UAAU,MAAM,YAAY,IAAI,CAAC,QAAQ,QAAQ,EACvE,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,CAAC,QAAQ,EAAE,CAC/C,CAAC;IAEF,MAAM,QAAQ,GAAG,IAAA,yCAAsB,EACrC,iBAAiB,EACjB,QAAQ,IAAI,CAAC,EAAE,oBAAoB,IAAI,CAAC,QAAQ,EAAE,EAClD;QACE,MAAM,EAAE,IAAI,CAAC,EAAE;QACf,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,MAAM;QACN,SAAS;KACV,EACD;QACE,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACnC,cAAc,EAAE,CAAC,WAAW,CAAC;KAC9B,EACD,IAAI,CAAC,SAAS,CACf,CAAC;IAEF,OAAO;QACL,OAAO,EAAE;YACP;gBACE,IAAI,EAAE,MAAe;gBACrB,IAAI,EAAE,IAAA,uCAAoB,EAAC,QAAQ,CAAC;aACrC;SACF;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Factory for creating and managing batch processors for bulk operations
|
|
3
|
+
*/
|
|
4
|
+
import { BatchProcessor, type BatchResult } from '../../../utils/performance/batch-processor';
|
|
5
|
+
/**
|
|
6
|
+
* Factory for selecting appropriate batch processor based on operation type
|
|
7
|
+
*/
|
|
8
|
+
export declare const batchProcessorFactory: {
|
|
9
|
+
/**
|
|
10
|
+
* Get the appropriate batch processor for an operation type
|
|
11
|
+
*/
|
|
12
|
+
getProcessor(operationType: string): BatchProcessor;
|
|
13
|
+
/**
|
|
14
|
+
* Process items in batches using the appropriate processor
|
|
15
|
+
*/
|
|
16
|
+
processBatches<T>(items: number[], processor: (item: number, index: number) => Promise<T>, operationType: string): Promise<BatchResult<T>>;
|
|
17
|
+
/**
|
|
18
|
+
* Get the create batch processor specifically
|
|
19
|
+
*/
|
|
20
|
+
getCreateProcessor(): BatchProcessor;
|
|
21
|
+
/**
|
|
22
|
+
* Get the update batch processor specifically
|
|
23
|
+
*/
|
|
24
|
+
getUpdateProcessor(): BatchProcessor;
|
|
25
|
+
/**
|
|
26
|
+
* Get the delete batch processor specifically
|
|
27
|
+
*/
|
|
28
|
+
getDeleteProcessor(): BatchProcessor;
|
|
29
|
+
};
|
|
30
|
+
//# sourceMappingURL=BatchProcessorFactory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BatchProcessorFactory.d.ts","sourceRoot":"","sources":["../../../../src/tools/tasks/bulk/BatchProcessorFactory.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,cAAc,EAAE,KAAK,WAAW,EAAE,MAAM,4CAA4C,CAAC;AAwB9F;;GAEG;AACH,eAAO,MAAM,qBAAqB;IAChC;;OAEG;gCACyB,MAAM,GAAG,cAAc;IAUnD;;OAEG;mBACkB,CAAC,SACb,MAAM,EAAE,aACJ,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,iBACvC,MAAM,GACpB,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;IAK1B;;OAEG;0BACmB,cAAc;IAIpC;;OAEG;0BACmB,cAAc;IAIpC;;OAEG;0BACmB,cAAc;CAGrC,CAAC"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Factory for creating and managing batch processors for bulk operations
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.batchProcessorFactory = void 0;
|
|
7
|
+
const batch_processor_1 = require("../../../utils/performance/batch-processor");
|
|
8
|
+
// Batch processors with optimized settings for different operation types
|
|
9
|
+
const updateBatchProcessor = new batch_processor_1.BatchProcessor({
|
|
10
|
+
maxConcurrency: 5,
|
|
11
|
+
batchSize: 10,
|
|
12
|
+
enableMetrics: true,
|
|
13
|
+
batchDelay: 0,
|
|
14
|
+
});
|
|
15
|
+
const deleteBatchProcessor = new batch_processor_1.BatchProcessor({
|
|
16
|
+
maxConcurrency: 3,
|
|
17
|
+
batchSize: 5,
|
|
18
|
+
enableMetrics: true,
|
|
19
|
+
batchDelay: 100,
|
|
20
|
+
});
|
|
21
|
+
const createBatchProcessor = new batch_processor_1.BatchProcessor({
|
|
22
|
+
maxConcurrency: 8,
|
|
23
|
+
batchSize: 15,
|
|
24
|
+
enableMetrics: true,
|
|
25
|
+
batchDelay: 0,
|
|
26
|
+
});
|
|
27
|
+
/**
|
|
28
|
+
* Factory for selecting appropriate batch processor based on operation type
|
|
29
|
+
*/
|
|
30
|
+
exports.batchProcessorFactory = {
|
|
31
|
+
/**
|
|
32
|
+
* Get the appropriate batch processor for an operation type
|
|
33
|
+
*/
|
|
34
|
+
getProcessor(operationType) {
|
|
35
|
+
if (operationType.includes('delete')) {
|
|
36
|
+
return deleteBatchProcessor;
|
|
37
|
+
}
|
|
38
|
+
if (operationType.includes('create')) {
|
|
39
|
+
return createBatchProcessor;
|
|
40
|
+
}
|
|
41
|
+
return updateBatchProcessor;
|
|
42
|
+
},
|
|
43
|
+
/**
|
|
44
|
+
* Process items in batches using the appropriate processor
|
|
45
|
+
*/
|
|
46
|
+
async processBatches(items, processor, operationType) {
|
|
47
|
+
const batchProcessor = this.getProcessor(operationType);
|
|
48
|
+
return await batchProcessor.processBatches(items, processor);
|
|
49
|
+
},
|
|
50
|
+
/**
|
|
51
|
+
* Get the create batch processor specifically
|
|
52
|
+
*/
|
|
53
|
+
getCreateProcessor() {
|
|
54
|
+
return createBatchProcessor;
|
|
55
|
+
},
|
|
56
|
+
/**
|
|
57
|
+
* Get the update batch processor specifically
|
|
58
|
+
*/
|
|
59
|
+
getUpdateProcessor() {
|
|
60
|
+
return updateBatchProcessor;
|
|
61
|
+
},
|
|
62
|
+
/**
|
|
63
|
+
* Get the delete batch processor specifically
|
|
64
|
+
*/
|
|
65
|
+
getDeleteProcessor() {
|
|
66
|
+
return deleteBatchProcessor;
|
|
67
|
+
}
|
|
68
|
+
};
|
|
69
|
+
//# sourceMappingURL=BatchProcessorFactory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BatchProcessorFactory.js","sourceRoot":"","sources":["../../../../src/tools/tasks/bulk/BatchProcessorFactory.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAEH,gFAA8F;AAE9F,yEAAyE;AACzE,MAAM,oBAAoB,GAAG,IAAI,gCAAc,CAAC;IAC9C,cAAc,EAAE,CAAC;IACjB,SAAS,EAAE,EAAE;IACb,aAAa,EAAE,IAAI;IACnB,UAAU,EAAE,CAAC;CACd,CAAC,CAAC;AAEH,MAAM,oBAAoB,GAAG,IAAI,gCAAc,CAAC;IAC9C,cAAc,EAAE,CAAC;IACjB,SAAS,EAAE,CAAC;IACZ,aAAa,EAAE,IAAI;IACnB,UAAU,EAAE,GAAG;CAChB,CAAC,CAAC;AAEH,MAAM,oBAAoB,GAAG,IAAI,gCAAc,CAAC;IAC9C,cAAc,EAAE,CAAC;IACjB,SAAS,EAAE,EAAE;IACb,aAAa,EAAE,IAAI;IACnB,UAAU,EAAE,CAAC;CACd,CAAC,CAAC;AAEH;;GAEG;AACU,QAAA,qBAAqB,GAAG;IACnC;;OAEG;IACH,YAAY,CAAC,aAAqB;QAChC,IAAI,aAAa,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;YACrC,OAAO,oBAAoB,CAAC;QAC9B,CAAC;QACD,IAAI,aAAa,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;YACrC,OAAO,oBAAoB,CAAC;QAC9B,CAAC;QACD,OAAO,oBAAoB,CAAC;IAC9B,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,cAAc,CAClB,KAAe,EACf,SAAsD,EACtD,aAAqB;QAErB,MAAM,cAAc,GAAG,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC,CAAC;QACxD,OAAO,MAAM,cAAc,CAAC,cAAc,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;IAC/D,CAAC;IAED;;OAEG;IACH,kBAAkB;QAChB,OAAO,oBAAoB,CAAC;IAC9B,CAAC;IAED;;OAEG;IACH,kBAAkB;QAChB,OAAO,oBAAoB,CAAC;IAC9B,CAAC;IAED;;OAEG;IACH,kBAAkB;QAChB,OAAO,oBAAoB,CAAC;IAC9B,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Error handling and fallback logic for bulk operations
|
|
3
|
+
*/
|
|
4
|
+
import type { Task, VikunjaClient } from 'node-vikunja';
|
|
5
|
+
import type { BulkUpdateArgs } from './BulkOperationValidator';
|
|
6
|
+
import type { BatchResult } from '../../../utils/performance/batch-processor';
|
|
7
|
+
/**
|
|
8
|
+
* Handles fallback logic when bulk APIs fail
|
|
9
|
+
*/
|
|
10
|
+
export declare const bulkOperationErrorHandler: {
|
|
11
|
+
/**
|
|
12
|
+
* Handle bulk update fallback when main API fails
|
|
13
|
+
*/
|
|
14
|
+
handleBulkUpdateFallback(args: BulkUpdateArgs, taskIds: number[], bulkError: Error): Promise<{
|
|
15
|
+
content: Array<{
|
|
16
|
+
type: "text";
|
|
17
|
+
text: string;
|
|
18
|
+
}>;
|
|
19
|
+
}>;
|
|
20
|
+
/**
|
|
21
|
+
* Update a single task as part of fallback logic
|
|
22
|
+
*/
|
|
23
|
+
updateIndividualTask(client: VikunjaClient, taskId: number, args: BulkUpdateArgs): Promise<Task>;
|
|
24
|
+
/**
|
|
25
|
+
* Handle fields that require separate API calls (assignees, labels)
|
|
26
|
+
*/
|
|
27
|
+
handleSpecialFields(client: VikunjaClient, taskId: number, args: BulkUpdateArgs, _updatedTask: Task): Promise<void>;
|
|
28
|
+
/**
|
|
29
|
+
* Handle assignee updates with proper error handling
|
|
30
|
+
*/
|
|
31
|
+
handleAssigneeUpdate(client: VikunjaClient, taskId: number, newAssigneeIds: number[]): Promise<void>;
|
|
32
|
+
/**
|
|
33
|
+
* Process update results and handle various failure scenarios
|
|
34
|
+
*/
|
|
35
|
+
processUpdateResults(args: BulkUpdateArgs, taskIds: number[], updateResult: BatchResult<Task>): Promise<{
|
|
36
|
+
content: Array<{
|
|
37
|
+
type: "text";
|
|
38
|
+
text: string;
|
|
39
|
+
}>;
|
|
40
|
+
}>;
|
|
41
|
+
/**
|
|
42
|
+
* Handle various types of update failures
|
|
43
|
+
*/
|
|
44
|
+
handleUpdateFailures(args: BulkUpdateArgs, failures: Array<{
|
|
45
|
+
index: number;
|
|
46
|
+
error: unknown;
|
|
47
|
+
originalItem: unknown;
|
|
48
|
+
}>, successCount: number): void;
|
|
49
|
+
};
|
|
50
|
+
//# sourceMappingURL=BulkOperationErrorHandler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BulkOperationErrorHandler.d.ts","sourceRoot":"","sources":["../../../../src/tools/tasks/bulk/BulkOperationErrorHandler.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,KAAK,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAQxD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,4CAA4C,CAAC;AAE9E;;GAEG;AACH,eAAO,MAAM,yBAAyB;IACpC;;OAEG;mCAEK,cAAc,WACX,MAAM,EAAE,aACN,KAAK,GACf,OAAO,CAAC;QAAE,OAAO,EAAE,KAAK,CAAC;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAA;SAAE,CAAC,CAAA;KAAE,CAAC;IAqB9D;;OAEG;iCAEO,aAAa,UACb,MAAM,QACR,cAAc,GACnB,OAAO,CAAC,IAAI,CAAC;IAgBhB;;OAEG;gCAEO,aAAa,UACb,MAAM,QACR,cAAc,gBACN,IAAI,GACjB,OAAO,CAAC,IAAI,CAAC;IAkBhB;;OAEG;iCAEO,aAAa,UACb,MAAM,kBACE,MAAM,EAAE,GACvB,OAAO,CAAC,IAAI,CAAC;IAwDhB;;OAEG;+BAEK,cAAc,WACX,MAAM,EAAE,gBACH,WAAW,CAAC,IAAI,CAAC,GAC9B,OAAO,CAAC;QAAE,OAAO,EAAE,KAAK,CAAC;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAA;SAAE,CAAC,CAAA;KAAE,CAAC;IA0D9D;;OAEG;+BAEK,cAAc,YACV,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,OAAO,CAAC;QAAC,YAAY,EAAE,OAAO,CAAA;KAAE,CAAC,gBAC3D,MAAM,GACnB,IAAI;CAqCR,CAAC"}
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Error handling and fallback logic for bulk operations
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.bulkOperationErrorHandler = void 0;
|
|
7
|
+
const types_1 = require("../../../types");
|
|
8
|
+
const client_1 = require("../../../client");
|
|
9
|
+
const logger_1 = require("../../../utils/logger");
|
|
10
|
+
const response_factory_1 = require("../../../utils/response-factory");
|
|
11
|
+
const auth_error_handler_1 = require("../../../utils/auth-error-handler");
|
|
12
|
+
const retry_1 = require("../../../utils/retry");
|
|
13
|
+
const index_1 = require("./index");
|
|
14
|
+
const constants_1 = require("../constants");
|
|
15
|
+
const validation_1 = require("../validation");
|
|
16
|
+
/**
|
|
17
|
+
* Handles fallback logic when bulk APIs fail
|
|
18
|
+
*/
|
|
19
|
+
exports.bulkOperationErrorHandler = {
|
|
20
|
+
/**
|
|
21
|
+
* Handle bulk update fallback when main API fails
|
|
22
|
+
*/
|
|
23
|
+
async handleBulkUpdateFallback(args, taskIds, bulkError) {
|
|
24
|
+
logger_1.logger.warn('Bulk update API failed, falling back to individual updates', {
|
|
25
|
+
error: bulkError instanceof Error ? bulkError.message : String(bulkError),
|
|
26
|
+
field: args.field,
|
|
27
|
+
});
|
|
28
|
+
const client = await (0, client_1.getClientFromContext)();
|
|
29
|
+
// Perform bulk update using individual task updates as fallback
|
|
30
|
+
const updateResult = await index_1.BatchProcessorFactory.processBatches(taskIds, async (taskId) => {
|
|
31
|
+
return await this.updateIndividualTask(client, taskId, args);
|
|
32
|
+
}, 'bulk_update_individual_fallback');
|
|
33
|
+
// Process results and handle failures
|
|
34
|
+
return await this.processUpdateResults(args, taskIds, updateResult);
|
|
35
|
+
},
|
|
36
|
+
/**
|
|
37
|
+
* Update a single task as part of fallback logic
|
|
38
|
+
*/
|
|
39
|
+
async updateIndividualTask(client, taskId, args) {
|
|
40
|
+
// Fetch current task to preserve required fields
|
|
41
|
+
const currentTask = await client.tasks.getTask(taskId);
|
|
42
|
+
// Apply field update using shared utility
|
|
43
|
+
const updateData = (0, validation_1.applyFieldUpdate)({ ...currentTask }, args.field, args.value);
|
|
44
|
+
// Update the task
|
|
45
|
+
const updatedTask = await client.tasks.updateTask(taskId, updateData);
|
|
46
|
+
// Handle special fields that require separate API calls
|
|
47
|
+
await this.handleSpecialFields(client, taskId, args, updatedTask);
|
|
48
|
+
return updatedTask;
|
|
49
|
+
},
|
|
50
|
+
/**
|
|
51
|
+
* Handle fields that require separate API calls (assignees, labels)
|
|
52
|
+
*/
|
|
53
|
+
async handleSpecialFields(client, taskId, args, _updatedTask) {
|
|
54
|
+
if (args.field === 'assignees' && Array.isArray(args.value)) {
|
|
55
|
+
await this.handleAssigneeUpdate(client, taskId, args.value);
|
|
56
|
+
}
|
|
57
|
+
if (args.field === 'labels' && Array.isArray(args.value)) {
|
|
58
|
+
await (0, retry_1.withRetry)(() => client.tasks.updateTaskLabels(taskId, {
|
|
59
|
+
label_ids: args.value,
|
|
60
|
+
}), {
|
|
61
|
+
...retry_1.RETRY_CONFIG.AUTH_ERRORS,
|
|
62
|
+
shouldRetry: (error) => (0, auth_error_handler_1.isAuthenticationError)(error)
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
},
|
|
66
|
+
/**
|
|
67
|
+
* Handle assignee updates with proper error handling
|
|
68
|
+
*/
|
|
69
|
+
async handleAssigneeUpdate(client, taskId, newAssigneeIds) {
|
|
70
|
+
try {
|
|
71
|
+
// Replace all assignees with the new list
|
|
72
|
+
const currentTaskWithAssignees = await client.tasks.getTask(taskId);
|
|
73
|
+
const currentAssigneeIds = currentTaskWithAssignees.assignees?.map((a) => a.id) || [];
|
|
74
|
+
// Add new assignees first to avoid leaving task unassigned.
|
|
75
|
+
// Use the ADDITIVE single-assign endpoint per user: node-vikunja's
|
|
76
|
+
// bulkAssignUsersToTask sends `{ user_ids }` to Vikunja's bulk endpoint,
|
|
77
|
+
// which expects `{ assignees }` and REPLACES the whole list, silently
|
|
78
|
+
// unassigning everyone on the field mismatch (upstream issue #15).
|
|
79
|
+
if (newAssigneeIds.length > 0) {
|
|
80
|
+
await Promise.all(newAssigneeIds.map((userId) => (0, retry_1.withRetry)(() => client.tasks.assignUserToTask(taskId, userId), {
|
|
81
|
+
...retry_1.RETRY_CONFIG.AUTH_ERRORS,
|
|
82
|
+
shouldRetry: (error) => (0, auth_error_handler_1.isAuthenticationError)(error)
|
|
83
|
+
})));
|
|
84
|
+
}
|
|
85
|
+
// Remove old assignees only after new ones are successfully added
|
|
86
|
+
for (const userId of currentAssigneeIds) {
|
|
87
|
+
try {
|
|
88
|
+
await (0, retry_1.withRetry)(() => client.tasks.removeUserFromTask(taskId, userId), {
|
|
89
|
+
...retry_1.RETRY_CONFIG.AUTH_ERRORS,
|
|
90
|
+
shouldRetry: (error) => (0, auth_error_handler_1.isAuthenticationError)(error)
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
catch (removeError) {
|
|
94
|
+
if ((0, auth_error_handler_1.isAuthenticationError)(removeError)) {
|
|
95
|
+
throw new types_1.MCPError(types_1.ErrorCode.API_ERROR, `${constants_1.AUTH_ERROR_MESSAGES.ASSIGNEE_REMOVE_PARTIAL} (Retried ${retry_1.RETRY_CONFIG.AUTH_ERRORS.maxRetries} times)`);
|
|
96
|
+
}
|
|
97
|
+
throw removeError;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
catch (assigneeError) {
|
|
102
|
+
if ((0, auth_error_handler_1.isAuthenticationError)(assigneeError)) {
|
|
103
|
+
throw new types_1.MCPError(types_1.ErrorCode.API_ERROR, `${constants_1.AUTH_ERROR_MESSAGES.ASSIGNEE_BULK_UPDATE} (Retried ${retry_1.RETRY_CONFIG.AUTH_ERRORS.maxRetries} times)`);
|
|
104
|
+
}
|
|
105
|
+
throw assigneeError;
|
|
106
|
+
}
|
|
107
|
+
},
|
|
108
|
+
/**
|
|
109
|
+
* Process update results and handle various failure scenarios
|
|
110
|
+
*/
|
|
111
|
+
async processUpdateResults(args, taskIds, updateResult) {
|
|
112
|
+
const failures = updateResult.failed;
|
|
113
|
+
const successCount = updateResult.successful.length;
|
|
114
|
+
if (failures.length > 0) {
|
|
115
|
+
this.handleUpdateFailures(args, failures, successCount);
|
|
116
|
+
}
|
|
117
|
+
// Use successful tasks from the update operation, or fetch fresh if needed
|
|
118
|
+
let updatedTasks = updateResult.successful;
|
|
119
|
+
let failedFetches = 0;
|
|
120
|
+
if (updatedTasks.length < successCount) {
|
|
121
|
+
const fetchResult = await index_1.BatchProcessorFactory.processBatches(taskIds, async (taskId) => {
|
|
122
|
+
const client = await (0, client_1.getClientFromContext)();
|
|
123
|
+
return await client.tasks.getTask(taskId);
|
|
124
|
+
}, 'bulk_update_final_fetch');
|
|
125
|
+
updatedTasks = fetchResult.successful;
|
|
126
|
+
failedFetches = fetchResult.failed.length;
|
|
127
|
+
}
|
|
128
|
+
const response = (0, types_1.createStandardResponse)('update-task', `Successfully updated ${taskIds.length} tasks${failedFetches > 0 ? ` (${failedFetches} tasks could not be fetched after update)` : ''}`, { tasks: updatedTasks }, {
|
|
129
|
+
timestamp: new Date().toISOString(),
|
|
130
|
+
affectedFields: args.field ? [args.field] : [],
|
|
131
|
+
count: taskIds.length,
|
|
132
|
+
...(failedFetches > 0 && { fetchErrors: failedFetches }),
|
|
133
|
+
performanceMetrics: {
|
|
134
|
+
totalDuration: updateResult.metrics.totalDuration,
|
|
135
|
+
operationsPerSecond: updateResult.metrics.operationsPerSecond,
|
|
136
|
+
apiCallsUsed: updateResult.metrics.successfulOperations + updateResult.metrics.failedOperations,
|
|
137
|
+
},
|
|
138
|
+
});
|
|
139
|
+
logger_1.logger.info('Bulk update completed', {
|
|
140
|
+
taskCount: taskIds.length,
|
|
141
|
+
field: args.field,
|
|
142
|
+
});
|
|
143
|
+
return {
|
|
144
|
+
content: [
|
|
145
|
+
{
|
|
146
|
+
type: 'text',
|
|
147
|
+
text: (0, response_factory_1.formatAorpAsMarkdown)(response), // createStandardResponse returns AORP object, format as markdown
|
|
148
|
+
},
|
|
149
|
+
],
|
|
150
|
+
};
|
|
151
|
+
},
|
|
152
|
+
/**
|
|
153
|
+
* Handle various types of update failures
|
|
154
|
+
*/
|
|
155
|
+
handleUpdateFailures(args, failures, successCount) {
|
|
156
|
+
const failedIds = failures.map((f) => f.originalItem);
|
|
157
|
+
// Check if all failures are due to assignee auth errors
|
|
158
|
+
if (args.field === 'assignees') {
|
|
159
|
+
const authFailures = failures.filter((f) => {
|
|
160
|
+
const error = f.error;
|
|
161
|
+
return (error instanceof types_1.MCPError &&
|
|
162
|
+
error.message.includes('Assignee operations may have authentication issues'));
|
|
163
|
+
});
|
|
164
|
+
if (authFailures.length === failures.length) {
|
|
165
|
+
throw new types_1.MCPError(types_1.ErrorCode.API_ERROR, 'Assignee operations may have authentication issues with certain Vikunja API versions. ' +
|
|
166
|
+
'This is a known limitation that prevents bulk updating assignees.');
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
// If some succeeded, report partial success
|
|
170
|
+
if (successCount > 0) {
|
|
171
|
+
logger_1.logger.warn('Bulk update partially failed', {
|
|
172
|
+
successCount,
|
|
173
|
+
failedCount: failures.length,
|
|
174
|
+
failedIds,
|
|
175
|
+
});
|
|
176
|
+
}
|
|
177
|
+
else {
|
|
178
|
+
// All failed
|
|
179
|
+
throw new types_1.MCPError(types_1.ErrorCode.API_ERROR, `Bulk update failed. Could not update any tasks. Failed IDs: ${failedIds.join(', ')}`);
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
};
|
|
183
|
+
//# sourceMappingURL=BulkOperationErrorHandler.js.map
|