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,416 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Simplified bulk operations for tasks (~250 lines)
|
|
4
|
+
*
|
|
5
|
+
* This superseded the old bulk/ implementation (BulkOperationProcessor,
|
|
6
|
+
* BulkOperationErrorHandler, BatchProcessorFactory), which was dead code -
|
|
7
|
+
* unreachable from src/tools/index.ts or src/tools/tasks/index.ts - and has
|
|
8
|
+
* since been deleted. Only BulkOperationValidator survives from that folder,
|
|
9
|
+
* reused here for its field/value validation.
|
|
10
|
+
*/
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.bulkUpdateTasks = bulkUpdateTasks;
|
|
13
|
+
exports.bulkDeleteTasks = bulkDeleteTasks;
|
|
14
|
+
exports.bulkCreateTasks = bulkCreateTasks;
|
|
15
|
+
const index_1 = require("../../index");
|
|
16
|
+
const vikunja_rest_1 = require("../../utils/vikunja-rest");
|
|
17
|
+
const task_rest_transport_1 = require("../../utils/task-rest-transport");
|
|
18
|
+
const retry_1 = require("../../utils/retry");
|
|
19
|
+
const label_bulk_1 = require("../../utils/label-bulk");
|
|
20
|
+
const batch_processor_1 = require("../../utils/performance/batch-processor");
|
|
21
|
+
const validation_1 = require("./validation");
|
|
22
|
+
const response_factory_1 = require("../../utils/response-factory");
|
|
23
|
+
const constants_1 = require("./constants");
|
|
24
|
+
const BulkOperationValidator_1 = require("./bulk/BulkOperationValidator");
|
|
25
|
+
// ==================== BATCH PROCESSORS ====================
|
|
26
|
+
const processors = {
|
|
27
|
+
update: new batch_processor_1.BatchProcessor({ maxConcurrency: 5, batchSize: 10, enableMetrics: true, batchDelay: 0 }),
|
|
28
|
+
delete: new batch_processor_1.BatchProcessor({ maxConcurrency: 3, batchSize: 5, enableMetrics: true, batchDelay: 100 }),
|
|
29
|
+
create: new batch_processor_1.BatchProcessor({ maxConcurrency: 8, batchSize: 15, enableMetrics: true, batchDelay: 0 }),
|
|
30
|
+
};
|
|
31
|
+
// ==================== VALIDATION WRAPPERS ====================
|
|
32
|
+
// Re-use validation logic from BulkOperationValidator to eliminate duplication
|
|
33
|
+
const validateBulkUpdate = (args) => {
|
|
34
|
+
BulkOperationValidator_1.bulkOperationValidator.validateBulkUpdate(args);
|
|
35
|
+
BulkOperationValidator_1.bulkOperationValidator.preprocessFieldValue(args);
|
|
36
|
+
BulkOperationValidator_1.bulkOperationValidator.validateFieldConstraints(args);
|
|
37
|
+
};
|
|
38
|
+
const validateBulkCreate = (args) => BulkOperationValidator_1.bulkOperationValidator.validateBulkCreate(args);
|
|
39
|
+
const validateBulkDelete = (args) => BulkOperationValidator_1.bulkOperationValidator.validateBulkDelete(args);
|
|
40
|
+
const successResponse = (op, msg, tasks, meta) => ({
|
|
41
|
+
content: [{ type: 'text', text: (0, response_factory_1.formatAorpAsMarkdown)((0, index_1.createStandardResponse)(op, msg, { tasks }, { timestamp: new Date().toISOString(), ...meta })) }]
|
|
42
|
+
});
|
|
43
|
+
/**
|
|
44
|
+
* Resolve bulk-update field value for Vikunja's updateTask payload.
|
|
45
|
+
* Native bulk API used a numeric repeat_mode map; keep that conversion when merging.
|
|
46
|
+
*/
|
|
47
|
+
function resolveBulkUpdateValue(field, value) {
|
|
48
|
+
if (field === 'repeat_mode' && typeof value === 'string') {
|
|
49
|
+
return constants_1.REPEAT_MODE_MAP[value] ?? value;
|
|
50
|
+
}
|
|
51
|
+
return value;
|
|
52
|
+
}
|
|
53
|
+
// ==================== BULK UPDATE ====================
|
|
54
|
+
/**
|
|
55
|
+
* Bulk-update.
|
|
56
|
+
*
|
|
57
|
+
* Scalar fields go through Vikunja's native `POST /tasks/bulk` in ONE request.
|
|
58
|
+
* The endpoint's real contract (see `models.BulkTask` in the generated OpenAPI
|
|
59
|
+
* types) is `{ task_ids, fields: string[], values: models.Task }` — the server
|
|
60
|
+
* applies exactly the listed fields and preserves everything else. The old
|
|
61
|
+
* belief that the endpoint full-replaces tasks came from node-vikunja's stale
|
|
62
|
+
* `{ task_ids, field, value }` type (democratize-technology/vikunja-mcp#46):
|
|
63
|
+
* with that malformed payload the server sees `fields: null` and applies a
|
|
64
|
+
* zero-value task. A single request also sidesteps the `database is locked`
|
|
65
|
+
* partial failures that concurrent per-task updates hit on SQLite-backed
|
|
66
|
+
* instances (democratize-technology/vikunja-mcp#79).
|
|
67
|
+
*
|
|
68
|
+
* Two server-side caveats handled here — source-verified against
|
|
69
|
+
* go-vikunja/vikunja's `pkg/models/tasks.go` and `task_assignees.go`, not
|
|
70
|
+
* just observed live behavior:
|
|
71
|
+
* - **Assignees**: `updateSingleTask()` calls `updateTaskAssignees(s,
|
|
72
|
+
* t.Assignees, a)` *before* the `fields`-allowlist gate is even evaluated,
|
|
73
|
+
* reconciling to whatever `values.assignees` decoded to. A scalar-only
|
|
74
|
+
* bulk request never sets that field, so it decodes to `nil`, which trips
|
|
75
|
+
* the unconditional full-delete branch in `task_assignees.go` for every
|
|
76
|
+
* task in `task_ids` — regardless of what `fields` lists. So assignees are
|
|
77
|
+
* snapshotted first and restored afterwards (see below).
|
|
78
|
+
* - **Labels**: genuinely inert, not merely unscoped — the label-sync call
|
|
79
|
+
* in that same `updateSingleTask()` is literally commented out upstream
|
|
80
|
+
* (`// Maybe FIXME:`, an acknowledged, unresolved refactor need), for both
|
|
81
|
+
* `POST /tasks/bulk` and single-task `POST /tasks/{id}`. So labels always
|
|
82
|
+
* use the dedicated per-task label endpoint, not because the bulk
|
|
83
|
+
* endpoint clears them, but because it never touches them at all.
|
|
84
|
+
*/
|
|
85
|
+
async function bulkUpdateTasks(args, authManager) {
|
|
86
|
+
try {
|
|
87
|
+
validateBulkUpdate(args);
|
|
88
|
+
// Validation ensures taskIds exists
|
|
89
|
+
const taskIds = args.taskIds ?? [];
|
|
90
|
+
const fieldValue = resolveBulkUpdateValue(args.field, args.value);
|
|
91
|
+
const perTaskUpdate = async () => {
|
|
92
|
+
const updateResult = await processors.update.processBatches(taskIds, async (taskId) => {
|
|
93
|
+
const current = await (0, vikunja_rest_1.vikunjaRestRequest)(authManager, 'GET', `/tasks/${taskId}`);
|
|
94
|
+
// Spread current task so fields not being changed survive Vikunja's full replace
|
|
95
|
+
const update = (0, validation_1.applyFieldUpdate)({ ...current }, args.field, fieldValue);
|
|
96
|
+
const updated = await (0, vikunja_rest_1.vikunjaRestRequest)(authManager, 'POST', `/tasks/${taskId}`, update);
|
|
97
|
+
if (args.field === 'assignees' && Array.isArray(args.value)) {
|
|
98
|
+
const currentTask = await (0, task_rest_transport_1.getTaskViaRest)(authManager, taskId);
|
|
99
|
+
const currentAssignees = (currentTask.assignees ?? [])
|
|
100
|
+
.map((a) => a.id)
|
|
101
|
+
.filter((id) => typeof id === 'number');
|
|
102
|
+
if (args.value.length > 0) {
|
|
103
|
+
try {
|
|
104
|
+
// Per-user additive assign (PUT /tasks/{taskID}/assignees, body
|
|
105
|
+
// { user_id }, models.TaskAssginee) instead of the bulk endpoint,
|
|
106
|
+
// which REPLACES the whole list and would silently unassign
|
|
107
|
+
// everyone (democratize-technology/vikunja-mcp#15). Sequential
|
|
108
|
+
// on purpose (post-#89 pattern sweep, mirrors the removal loop
|
|
109
|
+
// directly below): concurrent per-user writes to the same task
|
|
110
|
+
// risk "database is locked" 500s on SQLite-backed instances.
|
|
111
|
+
for (const userId of args.value) {
|
|
112
|
+
await (0, retry_1.withRetry)(() => (0, vikunja_rest_1.vikunjaRestRequest)(authManager, 'PUT', `/tasks/${taskId}/assignees`, { user_id: userId }), { ...index_1.RETRY_CONFIG.AUTH_ERRORS, shouldRetry: index_1.isAuthenticationError });
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
catch (assigneeError) {
|
|
116
|
+
if ((0, index_1.isAuthenticationError)(assigneeError))
|
|
117
|
+
throw new index_1.MCPError(index_1.ErrorCode.API_ERROR, 'Assignee operations may have authentication issues');
|
|
118
|
+
throw assigneeError;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
// DELETE /tasks/{taskID}/assignees/{userID} per the OpenAPI spec — no body.
|
|
122
|
+
for (const userId of currentAssignees) {
|
|
123
|
+
try {
|
|
124
|
+
await (0, retry_1.withRetry)(() => (0, vikunja_rest_1.vikunjaRestRequest)(authManager, 'DELETE', `/tasks/${taskId}/assignees/${userId}`), { ...index_1.RETRY_CONFIG.AUTH_ERRORS, shouldRetry: index_1.isAuthenticationError });
|
|
125
|
+
}
|
|
126
|
+
catch (e) {
|
|
127
|
+
if ((0, index_1.isAuthenticationError)(e))
|
|
128
|
+
throw new index_1.MCPError(index_1.ErrorCode.API_ERROR, `${constants_1.AUTH_ERROR_MESSAGES.ASSIGNEE_REMOVE_PARTIAL} (Retried ${index_1.RETRY_CONFIG.AUTH_ERRORS.maxRetries} times)`);
|
|
129
|
+
throw e;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
// Labels are never applied by Vikunja's task update payload; persist them
|
|
134
|
+
// explicitly via setTaskLabels (correct labels payload shape) — re-impl #49.
|
|
135
|
+
if (args.field === 'labels' && Array.isArray(args.value)) {
|
|
136
|
+
await (0, retry_1.withRetry)(() => (0, label_bulk_1.setTaskLabels)(authManager, taskId, args.value), { ...index_1.RETRY_CONFIG.AUTH_ERRORS, shouldRetry: index_1.isAuthenticationError });
|
|
137
|
+
}
|
|
138
|
+
return updated;
|
|
139
|
+
});
|
|
140
|
+
if (updateResult.failed.length > 0 && updateResult.successful.length === 0) {
|
|
141
|
+
const firstError = updateResult.failed[0]?.error;
|
|
142
|
+
// Preserve MCPError instances with auth messages
|
|
143
|
+
if (firstError instanceof index_1.MCPError && firstError.message.includes('authentication'))
|
|
144
|
+
throw firstError;
|
|
145
|
+
throw new index_1.MCPError(index_1.ErrorCode.API_ERROR, `Bulk update failed. Could not update any tasks. Failed IDs: ${updateResult.failed.map(f => f.originalItem).join(', ')}`);
|
|
146
|
+
}
|
|
147
|
+
// Report partial failure honestly (mirrors bulkDeleteTasks) instead of
|
|
148
|
+
// claiming every task was updated.
|
|
149
|
+
if (updateResult.failed.length > 0) {
|
|
150
|
+
const failedIds = updateResult.failed.map(f => f.originalItem);
|
|
151
|
+
return successResponse('update-task', `Bulk update partially completed. Successfully updated ${updateResult.successful.length} tasks. Failed task IDs: ${failedIds.join(', ')}`, updateResult.successful, {
|
|
152
|
+
count: updateResult.successful.length, failedCount: updateResult.failed.length, failedIds, affectedFields: [args.field], success: false,
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
return successResponse('update-task', `Successfully updated ${taskIds.length} tasks`, updateResult.successful, {
|
|
156
|
+
count: taskIds.length, affectedFields: [args.field], performanceMetrics: {
|
|
157
|
+
totalDuration: updateResult.metrics.totalDuration, operationsPerSecond: updateResult.metrics.operationsPerSecond,
|
|
158
|
+
apiCallsUsed: updateResult.metrics.successfulOperations + updateResult.metrics.failedOperations,
|
|
159
|
+
},
|
|
160
|
+
});
|
|
161
|
+
};
|
|
162
|
+
// Assignees and labels have their own endpoints; the native bulk endpoint
|
|
163
|
+
// does not handle them.
|
|
164
|
+
if (args.field === 'assignees' || args.field === 'labels') {
|
|
165
|
+
return await perTaskUpdate();
|
|
166
|
+
}
|
|
167
|
+
try {
|
|
168
|
+
// Snapshot assignees first. Verified mechanism (not just observed
|
|
169
|
+
// behavior): `updateTaskAssignees` runs before the `fields` gate and
|
|
170
|
+
// reconciles to `values.assignees`, which is `nil` for a scalar-only
|
|
171
|
+
// bulk request, triggering a full delete (`task_assignees.go`'s
|
|
172
|
+
// full-delete branch) for every task in `task_ids`, regardless of
|
|
173
|
+
// `fields`.
|
|
174
|
+
const preFetch = await processors.update.processBatches(taskIds, async (id) => await (0, vikunja_rest_1.vikunjaRestRequest)(authManager, 'GET', `/tasks/${id}`));
|
|
175
|
+
const assigneesByTask = new Map();
|
|
176
|
+
for (const t of preFetch.successful) {
|
|
177
|
+
if (!t?.id)
|
|
178
|
+
continue;
|
|
179
|
+
const ids = (t.assignees ?? []).map((a) => a.id).filter((id) => typeof id === 'number');
|
|
180
|
+
if (ids.length > 0)
|
|
181
|
+
assigneesByTask.set(t.id, ids);
|
|
182
|
+
}
|
|
183
|
+
const payload = {
|
|
184
|
+
task_ids: taskIds,
|
|
185
|
+
fields: [args.field],
|
|
186
|
+
values: { [args.field]: fieldValue },
|
|
187
|
+
};
|
|
188
|
+
const result = await (0, vikunja_rest_1.vikunjaRestRequest)(authManager, 'POST', '/tasks/bulk', payload);
|
|
189
|
+
// 2.x echoes { task_ids, fields, values, tasks }; tolerate a bare Task[] too.
|
|
190
|
+
// The honesty check below is derived from THIS array — the server's own
|
|
191
|
+
// account of what it updated — never from the requested taskIds.
|
|
192
|
+
const updatedTasks = Array.isArray(result) ? result : (result?.tasks ?? []);
|
|
193
|
+
// Sanity-check the server actually applied the value — guards against
|
|
194
|
+
// running into an older server that ignores fields/values.
|
|
195
|
+
const verifiable = ['priority', 'done', 'project_id'].includes(args.field);
|
|
196
|
+
const applied = updatedTasks.length > 0 && (!verifiable || updatedTasks.every((t) => t[args.field] === fieldValue));
|
|
197
|
+
if (!applied) {
|
|
198
|
+
throw new index_1.MCPError(index_1.ErrorCode.API_ERROR, 'Native bulk update did not apply the requested value');
|
|
199
|
+
}
|
|
200
|
+
// A server that silently drops a subset of the requested IDs
|
|
201
|
+
// (permissions, partial bulk transaction) must not be reported as a
|
|
202
|
+
// full success. Match the server-returned IDs against what was asked for.
|
|
203
|
+
const returnedIds = new Set(updatedTasks.map((t) => t.id).filter((id) => typeof id === 'number'));
|
|
204
|
+
const missingIds = taskIds.filter((id) => !returnedIds.has(id));
|
|
205
|
+
// Re-add the assignees the bulk endpoint cleared. This is a
|
|
206
|
+
// restore-to-snapshot, not a general assign flow: `userIds` is the
|
|
207
|
+
// task's own complete pre-update assignee list, so ONE
|
|
208
|
+
// `POST /tasks/{taskID}/assignees/bulk` (`models.BulkAssignees`,
|
|
209
|
+
// REPLACE semantics) call per task sets it back to exactly that list —
|
|
210
|
+
// safe here precisely because the whole set is known, unlike the
|
|
211
|
+
// additive per-user `PUT /assignees` loop used everywhere else for
|
|
212
|
+
// general assign/unassign (where replace semantics would silently
|
|
213
|
+
// unassign everyone else — upstream issue democratize-technology/
|
|
214
|
+
// vikunja-mcp#15; see the PARKED note in docs/ENDPOINT-TAIL-RETRIAGE.md
|
|
215
|
+
// line ~87). Sequential across tasks on purpose: concurrent writes 500
|
|
216
|
+
// with "database is locked" on SQLite backends. Failures are collected
|
|
217
|
+
// (not just logged) so a lost assignee is surfaced to the caller
|
|
218
|
+
// rather than silently swallowed — same {taskId, userId} failure
|
|
219
|
+
// surface as before (PR #95's assigneeRestoreFailures contract),
|
|
220
|
+
// just populated per-task instead of per-user-per-task.
|
|
221
|
+
const assigneeRestoreFailures = [];
|
|
222
|
+
for (const [taskId, userIds] of assigneesByTask) {
|
|
223
|
+
const body = { assignees: userIds.map((userId) => ({ id: userId })) };
|
|
224
|
+
try {
|
|
225
|
+
await (0, vikunja_rest_1.vikunjaRestRequest)(authManager, 'POST', `/tasks/${taskId}/assignees/bulk`, body);
|
|
226
|
+
}
|
|
227
|
+
catch (e) {
|
|
228
|
+
index_1.logger.warn('Could not restore assignees after bulk update', { taskId, userIds, error: e instanceof Error ? e.message : String(e) });
|
|
229
|
+
for (const userId of userIds) {
|
|
230
|
+
assigneeRestoreFailures.push({ taskId, userId });
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
// Re-fetch when assignees were restored so the response reflects them.
|
|
235
|
+
// This is presentation only — it does not feed the honesty check above,
|
|
236
|
+
// which stays fixed to what POST /tasks/bulk itself returned.
|
|
237
|
+
const responseTasks = assigneesByTask.size > 0
|
|
238
|
+
? (await processors.update.processBatches(taskIds, async (id) => await (0, vikunja_rest_1.vikunjaRestRequest)(authManager, 'GET', `/tasks/${id}`))).successful
|
|
239
|
+
: updatedTasks;
|
|
240
|
+
if (missingIds.length > 0 || assigneeRestoreFailures.length > 0) {
|
|
241
|
+
const messages = [
|
|
242
|
+
missingIds.length > 0
|
|
243
|
+
? `Bulk update partially completed. Successfully updated ${updatedTasks.length} tasks. Failed task IDs: ${missingIds.join(', ')}`
|
|
244
|
+
: `Successfully updated ${updatedTasks.length} tasks`,
|
|
245
|
+
];
|
|
246
|
+
if (assigneeRestoreFailures.length > 0) {
|
|
247
|
+
const restoreFailedTaskIds = [...new Set(assigneeRestoreFailures.map((f) => f.taskId))];
|
|
248
|
+
messages.push(`Assignee restoration failed for task(s): ${restoreFailedTaskIds.join(', ')}.`);
|
|
249
|
+
}
|
|
250
|
+
return successResponse('update-task', messages.join(' '), responseTasks, {
|
|
251
|
+
count: updatedTasks.length,
|
|
252
|
+
affectedFields: [args.field],
|
|
253
|
+
success: false,
|
|
254
|
+
...(missingIds.length > 0 && { failedCount: missingIds.length, failedIds: missingIds }),
|
|
255
|
+
...(assigneeRestoreFailures.length > 0 && { assigneeRestoreFailures }),
|
|
256
|
+
});
|
|
257
|
+
}
|
|
258
|
+
return successResponse('update-task', `Successfully updated ${taskIds.length} tasks`, responseTasks, { count: taskIds.length, affectedFields: [args.field] });
|
|
259
|
+
}
|
|
260
|
+
catch (nativeError) {
|
|
261
|
+
if (nativeError instanceof index_1.MCPError && nativeError.message.includes('authentication'))
|
|
262
|
+
throw nativeError;
|
|
263
|
+
index_1.logger.warn('Native bulk update failed; falling back to per-task merge', { error: nativeError instanceof Error ? nativeError.message : String(nativeError), field: args.field });
|
|
264
|
+
return await perTaskUpdate();
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
catch (error) {
|
|
268
|
+
if (error instanceof index_1.MCPError)
|
|
269
|
+
throw error;
|
|
270
|
+
if (error instanceof Error && (error.message.includes('fetch failed') || error.message.includes('ECONNREFUSED') || error.message.includes('ENOTFOUND')))
|
|
271
|
+
throw (0, index_1.handleFetchError)(error, 'bulk update tasks');
|
|
272
|
+
throw (0, index_1.transformApiError)(error, 'Failed to bulk update tasks');
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
// ==================== BULK DELETE ====================
|
|
276
|
+
async function bulkDeleteTasks(args, authManager) {
|
|
277
|
+
try {
|
|
278
|
+
validateBulkDelete(args);
|
|
279
|
+
// Validation ensures taskIds exists
|
|
280
|
+
const taskIds = args.taskIds ?? [];
|
|
281
|
+
const fetchResult = await processors.delete.processBatches(taskIds, async (id) => await (0, vikunja_rest_1.vikunjaRestRequest)(authManager, 'GET', `/tasks/${id}`));
|
|
282
|
+
const deletionResult = await processors.delete.processBatches(taskIds, async (id) => { await (0, vikunja_rest_1.vikunjaRestRequest)(authManager, 'DELETE', `/tasks/${id}`); return { taskId: id, deleted: true }; });
|
|
283
|
+
if (deletionResult.failed.length > 0) {
|
|
284
|
+
const failedIds = deletionResult.failed.map(f => f.originalItem);
|
|
285
|
+
if (deletionResult.successful.length > 0) {
|
|
286
|
+
return successResponse('delete-task', `Bulk delete partially completed. Successfully deleted ${deletionResult.successful.length} tasks. Failed to delete task IDs: ${failedIds.join(', ')}`, [], {
|
|
287
|
+
count: deletionResult.successful.length, failedCount: deletionResult.failed.length, failedIds, previousState: fetchResult.successful, success: false,
|
|
288
|
+
});
|
|
289
|
+
}
|
|
290
|
+
throw new index_1.MCPError(index_1.ErrorCode.API_ERROR, `Bulk delete failed. Could not delete any tasks. Failed IDs: ${failedIds.join(', ')}`);
|
|
291
|
+
}
|
|
292
|
+
return successResponse('delete-task', `Successfully deleted ${taskIds.length} tasks`, [], { count: taskIds.length, deletedTaskIds: taskIds, previousState: fetchResult.successful });
|
|
293
|
+
}
|
|
294
|
+
catch (error) {
|
|
295
|
+
if (error instanceof index_1.MCPError)
|
|
296
|
+
throw error;
|
|
297
|
+
if (error instanceof Error && (error.message.includes('fetch failed') || error.message.includes('ECONNREFUSED') || error.message.includes('ENOTFOUND')))
|
|
298
|
+
throw (0, index_1.handleFetchError)(error, 'bulk delete tasks');
|
|
299
|
+
throw (0, index_1.transformApiError)(error, 'Failed to bulk delete tasks');
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
// ==================== BULK CREATE ====================
|
|
303
|
+
async function bulkCreateTasks(args, authManager) {
|
|
304
|
+
try {
|
|
305
|
+
validateBulkCreate(args);
|
|
306
|
+
}
|
|
307
|
+
catch (error) {
|
|
308
|
+
// Preserve validation errors
|
|
309
|
+
if (error instanceof index_1.MCPError)
|
|
310
|
+
throw error;
|
|
311
|
+
throw error;
|
|
312
|
+
}
|
|
313
|
+
try {
|
|
314
|
+
// Validation ensures projectId and tasks exist
|
|
315
|
+
const projectId = args.projectId ?? 0;
|
|
316
|
+
const tasks = args.tasks ?? [];
|
|
317
|
+
const creationResult = await processors.create.processBatches(tasks.map((_, i) => i), async (index) => {
|
|
318
|
+
const t = tasks[index];
|
|
319
|
+
if (!t)
|
|
320
|
+
throw new Error(`Task data at index ${index} is undefined`);
|
|
321
|
+
const newTask = { title: t.title, project_id: projectId };
|
|
322
|
+
if (t.description !== undefined)
|
|
323
|
+
newTask.description = t.description;
|
|
324
|
+
if (t.dueDate !== undefined)
|
|
325
|
+
newTask.due_date = t.dueDate;
|
|
326
|
+
if (t.priority !== undefined)
|
|
327
|
+
newTask.priority = t.priority;
|
|
328
|
+
if (t.repeatAfter !== undefined || t.repeatMode !== undefined) {
|
|
329
|
+
const rc = (0, validation_1.convertRepeatConfiguration)(t.repeatAfter, t.repeatMode);
|
|
330
|
+
if (rc.repeat_after !== undefined)
|
|
331
|
+
newTask.repeat_after = rc.repeat_after;
|
|
332
|
+
if (rc.repeat_mode !== undefined)
|
|
333
|
+
newTask.repeat_mode = rc.repeat_mode;
|
|
334
|
+
}
|
|
335
|
+
// PUT /projects/{id}/tasks per the OpenAPI spec (models.Task body).
|
|
336
|
+
const created = await (0, vikunja_rest_1.vikunjaRestRequest)(authManager, 'PUT', `/projects/${projectId}/tasks`, newTask);
|
|
337
|
+
if (!created.id)
|
|
338
|
+
return created;
|
|
339
|
+
// Narrow type - id is guaranteed to exist after early return
|
|
340
|
+
const createdId = created.id;
|
|
341
|
+
try {
|
|
342
|
+
const labels = t.labels;
|
|
343
|
+
if (labels && labels.length > 0)
|
|
344
|
+
await (0, retry_1.withRetry)(() => (0, label_bulk_1.setTaskLabels)(authManager, createdId, labels), { maxRetries: index_1.RETRY_CONFIG.AUTH_ERRORS.maxRetries ?? 3, timeout: (index_1.RETRY_CONFIG.AUTH_ERRORS.initialDelay ?? 1000) + (index_1.RETRY_CONFIG.AUTH_ERRORS.maxDelay ?? 10000), shouldRetry: index_1.isAuthenticationError });
|
|
345
|
+
const assignees = t.assignees;
|
|
346
|
+
if (assignees && assignees.length > 0) {
|
|
347
|
+
try {
|
|
348
|
+
// Per-user additive assign (PUT /tasks/{taskID}/assignees, body
|
|
349
|
+
// { user_id }, models.TaskAssginee) instead of the bulk endpoint,
|
|
350
|
+
// which REPLACES the list and would silently unassign everyone
|
|
351
|
+
// (democratize-technology/vikunja-mcp#15). Sequential on
|
|
352
|
+
// purpose (post-#89 pattern sweep): concurrent per-user writes
|
|
353
|
+
// to the same task risk "database is locked" 500s on
|
|
354
|
+
// SQLite-backed instances.
|
|
355
|
+
for (const userId of assignees) {
|
|
356
|
+
await (0, retry_1.withRetry)(() => (0, vikunja_rest_1.vikunjaRestRequest)(authManager, 'PUT', `/tasks/${createdId}/assignees`, { user_id: userId }), { maxRetries: index_1.RETRY_CONFIG.AUTH_ERRORS.maxRetries ?? 3, timeout: (index_1.RETRY_CONFIG.AUTH_ERRORS.initialDelay ?? 1000) + (index_1.RETRY_CONFIG.AUTH_ERRORS.maxDelay ?? 10000), shouldRetry: index_1.isAuthenticationError });
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
catch (assigneeError) {
|
|
360
|
+
if ((0, index_1.isAuthenticationError)(assigneeError)) {
|
|
361
|
+
throw new index_1.MCPError(index_1.ErrorCode.API_ERROR, 'Assignee operations may have authentication issues');
|
|
362
|
+
}
|
|
363
|
+
// Wrap assignee errors to distinguish from createTask errors
|
|
364
|
+
if (assigneeError instanceof Error) {
|
|
365
|
+
const wrappedError = new index_1.MCPError(index_1.ErrorCode.API_ERROR, assigneeError.message);
|
|
366
|
+
wrappedError.isLabelAssigneeError = true;
|
|
367
|
+
throw wrappedError;
|
|
368
|
+
}
|
|
369
|
+
throw assigneeError;
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
return await (0, vikunja_rest_1.vikunjaRestRequest)(authManager, 'GET', `/tasks/${createdId}`);
|
|
373
|
+
}
|
|
374
|
+
catch (updateError) {
|
|
375
|
+
// Clean up the created task since labels/assignees failed
|
|
376
|
+
try {
|
|
377
|
+
await (0, vikunja_rest_1.vikunjaRestRequest)(authManager, 'DELETE', `/tasks/${createdId}`);
|
|
378
|
+
}
|
|
379
|
+
catch (deleteError) {
|
|
380
|
+
index_1.logger.error('Cleanup failed', deleteError);
|
|
381
|
+
}
|
|
382
|
+
// Wrap label errors to distinguish from createTask errors
|
|
383
|
+
if (updateError instanceof Error && !(updateError instanceof index_1.MCPError)) {
|
|
384
|
+
const wrappedError = new index_1.MCPError(index_1.ErrorCode.API_ERROR, updateError.message);
|
|
385
|
+
wrappedError.isLabelAssigneeError = true;
|
|
386
|
+
throw wrappedError;
|
|
387
|
+
}
|
|
388
|
+
throw updateError;
|
|
389
|
+
}
|
|
390
|
+
});
|
|
391
|
+
const failedTasks = creationResult.failed.map(f => ({ index: f.originalItem, error: f.error instanceof Error ? f.error.message : String(f.error) }));
|
|
392
|
+
if (failedTasks.length > 0 && creationResult.successful.length === 0) {
|
|
393
|
+
const firstError = creationResult.failed[0]?.error;
|
|
394
|
+
// Preserve MCPError instances with auth messages or label/assignee marker
|
|
395
|
+
if (firstError instanceof index_1.MCPError && (firstError.message.includes('authentication') || firstError.isLabelAssigneeError === true))
|
|
396
|
+
throw firstError;
|
|
397
|
+
// Transform all other errors (including API errors) into generic bulk create error
|
|
398
|
+
throw new index_1.MCPError(index_1.ErrorCode.API_ERROR, `Bulk create failed. Could not create any tasks`);
|
|
399
|
+
}
|
|
400
|
+
return successResponse('create-tasks', failedTasks.length > 0 ? `Bulk create partially completed. Successfully created ${creationResult.successful.length} tasks, ${failedTasks.length} failed.` : `Successfully created ${creationResult.successful.length} tasks`, creationResult.successful, {
|
|
401
|
+
count: creationResult.successful.length, success: failedTasks.length === 0, ...(failedTasks.length > 0 && { failedCount: failedTasks.length, failures: failedTasks }),
|
|
402
|
+
});
|
|
403
|
+
}
|
|
404
|
+
catch (error) {
|
|
405
|
+
// Preserve MCPError instances from validation
|
|
406
|
+
if (error instanceof index_1.MCPError)
|
|
407
|
+
throw error;
|
|
408
|
+
// Preserve fetch/connection errors
|
|
409
|
+
if (error instanceof Error && (error.message.includes('fetch failed') || error.message.includes('ECONNREFUSED') || error.message.includes('ENOTFOUND'))) {
|
|
410
|
+
throw (0, index_1.handleFetchError)(error, 'bulk create tasks');
|
|
411
|
+
}
|
|
412
|
+
// Transform all other errors into generic bulk create error
|
|
413
|
+
throw new index_1.MCPError(index_1.ErrorCode.API_ERROR, 'Bulk create failed. Could not create any tasks');
|
|
414
|
+
}
|
|
415
|
+
}
|
|
416
|
+
//# sourceMappingURL=bulk-operations-simplified.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bulk-operations-simplified.js","sourceRoot":"","sources":["../../../src/tools/tasks/bulk-operations-simplified.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bulk operations for tasks with performance optimizations
|
|
3
|
+
*
|
|
4
|
+
* This file maintains backward compatibility while using the simplified implementation.
|
|
5
|
+
*/
|
|
6
|
+
export { bulkUpdateTasks, bulkDeleteTasks, bulkCreateTasks } from './bulk-operations-simplified';
|
|
7
|
+
export type { BulkUpdateArgs, BulkDeleteArgs, BulkCreateArgs, BulkCreateTaskData } from './bulk/BulkOperationValidator';
|
|
8
|
+
//# sourceMappingURL=bulk-operations.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bulk-operations.d.ts","sourceRoot":"","sources":["../../../src/tools/tasks/bulk-operations.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAGjG,YAAY,EACV,cAAc,EACd,cAAc,EACd,cAAc,EACd,kBAAkB,EACnB,MAAM,+BAA+B,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Bulk operations for tasks with performance optimizations
|
|
4
|
+
*
|
|
5
|
+
* This file maintains backward compatibility while using the simplified implementation.
|
|
6
|
+
*/
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.bulkCreateTasks = exports.bulkDeleteTasks = exports.bulkUpdateTasks = void 0;
|
|
9
|
+
var bulk_operations_simplified_1 = require("./bulk-operations-simplified");
|
|
10
|
+
Object.defineProperty(exports, "bulkUpdateTasks", { enumerable: true, get: function () { return bulk_operations_simplified_1.bulkUpdateTasks; } });
|
|
11
|
+
Object.defineProperty(exports, "bulkDeleteTasks", { enumerable: true, get: function () { return bulk_operations_simplified_1.bulkDeleteTasks; } });
|
|
12
|
+
Object.defineProperty(exports, "bulkCreateTasks", { enumerable: true, get: function () { return bulk_operations_simplified_1.bulkCreateTasks; } });
|
|
13
|
+
//# sourceMappingURL=bulk-operations.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bulk-operations.js","sourceRoot":"","sources":["../../../src/tools/tasks/bulk-operations.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;AAEH,2EAAiG;AAAxF,6HAAA,eAAe,OAAA;AAAE,6HAAA,eAAe,OAAA;AAAE,6HAAA,eAAe,OAAA"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Task by-index lookup
|
|
3
|
+
*
|
|
4
|
+
* Implements `get-by-index`, which resolves a task by its human-facing
|
|
5
|
+
* per-project index (`GET /projects/{project}/tasks/by-index/{index}`) —
|
|
6
|
+
* useful for resolving references like "PROJ-42" to a canonical task
|
|
7
|
+
* object. Per the spec, task indexes are reassigned when a task moves
|
|
8
|
+
* between projects, so long-lived references should use the returned
|
|
9
|
+
* task's numeric `id` instead of re-resolving by index later.
|
|
10
|
+
*
|
|
11
|
+
* legacy client does not expose this endpoint, so this calls the Vikunja
|
|
12
|
+
* REST API directly via the shared `vikunja-rest` helper.
|
|
13
|
+
*/
|
|
14
|
+
import type { AuthManager } from '../../auth/AuthManager';
|
|
15
|
+
export interface GetTaskByIndexArgs {
|
|
16
|
+
/** Numeric id of the project the task's index is scoped to. */
|
|
17
|
+
projectId?: number;
|
|
18
|
+
/** The task's per-project index (e.g. the "42" in "PROJ-42"). */
|
|
19
|
+
index?: number;
|
|
20
|
+
/** Session id for response tracking. */
|
|
21
|
+
sessionId?: string;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Looks up a task by its per-project index.
|
|
25
|
+
*
|
|
26
|
+
* @param args - Project id and per-project task index
|
|
27
|
+
* @param authManager - Active auth manager holding session credentials
|
|
28
|
+
* @returns MCP response containing the resolved task
|
|
29
|
+
*/
|
|
30
|
+
export declare function getTaskByIndex(args: GetTaskByIndexArgs, authManager: AuthManager): Promise<{
|
|
31
|
+
content: Array<{
|
|
32
|
+
type: 'text';
|
|
33
|
+
text: string;
|
|
34
|
+
}>;
|
|
35
|
+
}>;
|
|
36
|
+
//# sourceMappingURL=by-index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"by-index.d.ts","sourceRoot":"","sources":["../../../src/tools/tasks/by-index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAM1D,MAAM,WAAW,kBAAkB;IACjC,+DAA+D;IAC/D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iEAAiE;IACjE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,wCAAwC;IACxC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;GAMG;AACH,wBAAsB,cAAc,CAClC,IAAI,EAAE,kBAAkB,EACxB,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,CA0C7D"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Task by-index lookup
|
|
4
|
+
*
|
|
5
|
+
* Implements `get-by-index`, which resolves a task by its human-facing
|
|
6
|
+
* per-project index (`GET /projects/{project}/tasks/by-index/{index}`) —
|
|
7
|
+
* useful for resolving references like "PROJ-42" to a canonical task
|
|
8
|
+
* object. Per the spec, task indexes are reassigned when a task moves
|
|
9
|
+
* between projects, so long-lived references should use the returned
|
|
10
|
+
* task's numeric `id` instead of re-resolving by index later.
|
|
11
|
+
*
|
|
12
|
+
* legacy client does not expose this endpoint, so this calls the Vikunja
|
|
13
|
+
* REST API directly via the shared `vikunja-rest` helper.
|
|
14
|
+
*/
|
|
15
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
16
|
+
exports.getTaskByIndex = getTaskByIndex;
|
|
17
|
+
const types_1 = require("../../types");
|
|
18
|
+
const validation_1 = require("../../utils/validation");
|
|
19
|
+
const response_factory_1 = require("../../utils/response-factory");
|
|
20
|
+
const vikunja_rest_1 = require("../../utils/vikunja-rest");
|
|
21
|
+
/**
|
|
22
|
+
* Looks up a task by its per-project index.
|
|
23
|
+
*
|
|
24
|
+
* @param args - Project id and per-project task index
|
|
25
|
+
* @param authManager - Active auth manager holding session credentials
|
|
26
|
+
* @returns MCP response containing the resolved task
|
|
27
|
+
*/
|
|
28
|
+
async function getTaskByIndex(args, authManager) {
|
|
29
|
+
if (args.projectId === undefined || args.projectId === null) {
|
|
30
|
+
throw new types_1.MCPError(types_1.ErrorCode.VALIDATION_ERROR, 'projectId is required for get-by-index operation');
|
|
31
|
+
}
|
|
32
|
+
if (args.index === undefined || args.index === null) {
|
|
33
|
+
throw new types_1.MCPError(types_1.ErrorCode.VALIDATION_ERROR, 'index is required for get-by-index operation');
|
|
34
|
+
}
|
|
35
|
+
(0, validation_1.validateId)(args.projectId, 'projectId');
|
|
36
|
+
(0, validation_1.validateId)(args.index, 'index');
|
|
37
|
+
const task = await (0, vikunja_rest_1.vikunjaRestRequest)(authManager, 'GET', `/projects/${args.projectId}/tasks/by-index/${args.index}`);
|
|
38
|
+
const response = (0, response_factory_1.createStandardResponse)('get-task-by-index', `Resolved task at index ${args.index} in project ${args.projectId}`, { task }, {
|
|
39
|
+
timestamp: new Date().toISOString(),
|
|
40
|
+
projectId: args.projectId,
|
|
41
|
+
index: args.index,
|
|
42
|
+
}, args.sessionId);
|
|
43
|
+
return {
|
|
44
|
+
content: [
|
|
45
|
+
{
|
|
46
|
+
type: 'text',
|
|
47
|
+
text: (0, response_factory_1.formatAorpAsMarkdown)(response),
|
|
48
|
+
},
|
|
49
|
+
],
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=by-index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"by-index.js","sourceRoot":"","sources":["../../../src/tools/tasks/by-index.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;GAYG;;AAwBH,wCA6CC;AAlED,uCAAkD;AAClD,uDAAoD;AACpD,mEAA4F;AAC5F,2DAA8D;AAW9D;;;;;;GAMG;AACI,KAAK,UAAU,cAAc,CAClC,IAAwB,EACxB,WAAwB;IAExB,IAAI,IAAI,CAAC,SAAS,KAAK,SAAS,IAAI,IAAI,CAAC,SAAS,KAAK,IAAI,EAAE,CAAC;QAC5D,MAAM,IAAI,gBAAQ,CAChB,iBAAS,CAAC,gBAAgB,EAC1B,kDAAkD,CACnD,CAAC;IACJ,CAAC;IACD,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS,IAAI,IAAI,CAAC,KAAK,KAAK,IAAI,EAAE,CAAC;QACpD,MAAM,IAAI,gBAAQ,CAChB,iBAAS,CAAC,gBAAgB,EAC1B,8CAA8C,CAC/C,CAAC;IACJ,CAAC;IACD,IAAA,uBAAU,EAAC,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;IACxC,IAAA,uBAAU,EAAC,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAEhC,MAAM,IAAI,GAAG,MAAM,IAAA,iCAAkB,EACnC,WAAW,EACX,KAAK,EACL,aAAa,IAAI,CAAC,SAAS,mBAAmB,IAAI,CAAC,KAAK,EAAE,CAC3D,CAAC;IAEF,MAAM,QAAQ,GAAG,IAAA,yCAAsB,EACrC,mBAAmB,EACnB,0BAA0B,IAAI,CAAC,KAAK,eAAe,IAAI,CAAC,SAAS,EAAE,EACnE,EAAE,IAAI,EAAE,EACR;QACE,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACnC,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,KAAK,EAAE,IAAI,CAAC,KAAK;KAClB,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,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Comment operations service
|
|
3
|
+
* Handles core business logic for task comment management
|
|
4
|
+
*/
|
|
5
|
+
import type { Message, TaskComment } from '../../../types/vikunja';
|
|
6
|
+
import type { AuthManager } from '../../../auth/AuthManager';
|
|
7
|
+
/**
|
|
8
|
+
* Service for managing task comment operations
|
|
9
|
+
*/
|
|
10
|
+
export declare const CommentOperationsService: {
|
|
11
|
+
/**
|
|
12
|
+
* Create a new comment on a task via `PUT /tasks/{taskID}/comments`. The
|
|
13
|
+
* request body is `models.TaskComment`, which per the spec carries only
|
|
14
|
+
* `comment` as a writable field (`task_id` comes from the URL, not the
|
|
15
|
+
* body).
|
|
16
|
+
*/
|
|
17
|
+
createComment(authManager: AuthManager, taskId: number, commentText: string): Promise<TaskComment>;
|
|
18
|
+
/**
|
|
19
|
+
* Fetch all comments for a task via `GET /tasks/{taskID}/comments`.
|
|
20
|
+
*/
|
|
21
|
+
fetchTaskComments(authManager: AuthManager, taskId: number): Promise<TaskComment[]>;
|
|
22
|
+
/**
|
|
23
|
+
* Fetch a single comment on a task via
|
|
24
|
+
* `GET /tasks/{taskID}/comments/{commentID}`.
|
|
25
|
+
*/
|
|
26
|
+
getComment(authManager: AuthManager, taskId: number, commentId: number): Promise<TaskComment>;
|
|
27
|
+
/**
|
|
28
|
+
* Update an existing comment on a task via
|
|
29
|
+
* `POST /tasks/{taskID}/comments/{commentID}`. The spec omits an explicit
|
|
30
|
+
* body schema for this endpoint's parameters, but its behavior mirrors the
|
|
31
|
+
* create endpoint's `models.TaskComment` — only `comment` is sent.
|
|
32
|
+
*/
|
|
33
|
+
updateComment(authManager: AuthManager, taskId: number, commentId: number, commentText: string): Promise<TaskComment>;
|
|
34
|
+
/**
|
|
35
|
+
* Delete a comment from a task via
|
|
36
|
+
* `DELETE /tasks/{taskID}/comments/{commentID}`.
|
|
37
|
+
*/
|
|
38
|
+
deleteComment(authManager: AuthManager, taskId: number, commentId: number): Promise<Message>;
|
|
39
|
+
/**
|
|
40
|
+
* Get comment count from comments array
|
|
41
|
+
*/
|
|
42
|
+
getCommentCount(comments: TaskComment[]): number;
|
|
43
|
+
};
|
|
44
|
+
//# sourceMappingURL=CommentOperationsService.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CommentOperationsService.d.ts","sourceRoot":"","sources":["../../../../src/tools/tasks/comments/CommentOperationsService.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACnE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AA4B7D;;GAEG;AACH,eAAO,MAAM,wBAAwB;IACnC;;;;;OAKG;+BAEY,WAAW,UAChB,MAAM,eACD,MAAM,GAClB,OAAO,CAAC,WAAW,CAAC;IAUvB;;OAEG;mCACkC,WAAW,UAAU,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IASzF;;;OAGG;4BAEY,WAAW,UAChB,MAAM,aACH,MAAM,GAChB,OAAO,CAAC,WAAW,CAAC;IASvB;;;;;OAKG;+BAEY,WAAW,UAChB,MAAM,aACH,MAAM,eACJ,MAAM,GAClB,OAAO,CAAC,WAAW,CAAC;IAUvB;;;OAGG;+BAEY,WAAW,UAChB,MAAM,aACH,MAAM,GAChB,OAAO,CAAC,OAAO,CAAC;IASnB;;OAEG;8BACuB,WAAW,EAAE,GAAG,MAAM;CAGjD,CAAC"}
|