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,213 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Reminder operations for tasks
|
|
4
|
+
*
|
|
5
|
+
* Reminders have no dedicated Vikunja sub-resource endpoint — they "ride on"
|
|
6
|
+
* the full task-update endpoint (`POST /tasks/{id}`, a full-model-replace).
|
|
7
|
+
* These operations therefore fetch the task, merge the `reminders` array,
|
|
8
|
+
* and POST the whole task back via the shared
|
|
9
|
+
* `src/utils/task-rest-transport.ts` helper, rather than the legacy client's
|
|
10
|
+
* `getTask`/`updateTask` (see that file's doc comment for why this is a
|
|
11
|
+
* standalone helper instead of a change to `TaskUpdateService.ts`).
|
|
12
|
+
*/
|
|
13
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
14
|
+
exports.addReminder = addReminder;
|
|
15
|
+
exports.removeReminder = removeReminder;
|
|
16
|
+
exports.listReminders = listReminders;
|
|
17
|
+
const types_1 = require("../../types");
|
|
18
|
+
const task_rest_transport_1 = require("../../utils/task-rest-transport");
|
|
19
|
+
const validation_1 = require("./validation");
|
|
20
|
+
const response_factory_1 = require("../../utils/response-factory");
|
|
21
|
+
/**
|
|
22
|
+
* Add a reminder to a task
|
|
23
|
+
*/
|
|
24
|
+
async function addReminder(args, authManager) {
|
|
25
|
+
try {
|
|
26
|
+
if (!args.id) {
|
|
27
|
+
throw new types_1.MCPError(types_1.ErrorCode.VALIDATION_ERROR, 'Task id is required for add-reminder operation');
|
|
28
|
+
}
|
|
29
|
+
(0, validation_1.validateId)(args.id, 'id');
|
|
30
|
+
if (!args.reminderDate) {
|
|
31
|
+
throw new types_1.MCPError(types_1.ErrorCode.VALIDATION_ERROR, 'reminderDate is required for add-reminder operation');
|
|
32
|
+
}
|
|
33
|
+
(0, validation_1.validateDateString)(args.reminderDate, 'reminderDate');
|
|
34
|
+
// Get current task to preserve existing reminders
|
|
35
|
+
const currentTask = await (0, task_rest_transport_1.getTaskViaRest)(authManager, args.id);
|
|
36
|
+
// Vikunja stores an absolute reminder under the `reminder` key
|
|
37
|
+
// (models.TaskReminder). Preserve any existing reminders (absolute or
|
|
38
|
+
// relative) verbatim. `reminder` is typed optional in the spec, but a
|
|
39
|
+
// reminder with no date is meaningless — filter out the (unexpected)
|
|
40
|
+
// case rather than passing `undefined` through.
|
|
41
|
+
const existingReminders = (currentTask.reminders ?? [])
|
|
42
|
+
.filter((r) => r.reminder !== undefined)
|
|
43
|
+
.map((r) => ({
|
|
44
|
+
reminder: r.reminder,
|
|
45
|
+
...(r.relative_period !== undefined ? { relative_period: r.relative_period } : {}),
|
|
46
|
+
...(r.relative_to !== undefined ? { relative_to: r.relative_to } : {}),
|
|
47
|
+
}));
|
|
48
|
+
const updatedReminders = [...existingReminders, { reminder: args.reminderDate }];
|
|
49
|
+
// Update task with new reminders array — full-model-replace, so the
|
|
50
|
+
// fetched task is spread and only `reminders` is overlaid.
|
|
51
|
+
await (0, task_rest_transport_1.updateTaskViaRest)(authManager, args.id, {
|
|
52
|
+
...currentTask,
|
|
53
|
+
reminders: updatedReminders,
|
|
54
|
+
});
|
|
55
|
+
// Create proper AORP response
|
|
56
|
+
const aorpResult = (0, response_factory_1.createAorpFromData)('add-reminder', `Reminder added successfully for ${args.reminderDate}`, true, `Reminder added successfully for ${args.reminderDate}`);
|
|
57
|
+
return {
|
|
58
|
+
content: [
|
|
59
|
+
{
|
|
60
|
+
type: 'text',
|
|
61
|
+
text: (0, response_factory_1.formatAorpAsMarkdown)(aorpResult),
|
|
62
|
+
},
|
|
63
|
+
],
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
catch (error) {
|
|
67
|
+
if (error instanceof types_1.MCPError) {
|
|
68
|
+
throw error;
|
|
69
|
+
}
|
|
70
|
+
throw new types_1.MCPError(types_1.ErrorCode.API_ERROR, `Failed to add reminder: ${error instanceof Error ? error.message : String(error)}`);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Remove a reminder from a task.
|
|
75
|
+
*
|
|
76
|
+
* Vikunja's API (models.TaskReminder) has no `id` field, so reminders cannot
|
|
77
|
+
* be identified the way `remove-reminder` used to (filtering by a nonexistent
|
|
78
|
+
* `reminder.id`, which always threw "not found" against a real server).
|
|
79
|
+
* Callers must instead identify the reminder to remove by its exact
|
|
80
|
+
* `reminder` date string (as shown by `list-reminders`) and/or its
|
|
81
|
+
* zero-based positional `reminderIndex` in that same listing.
|
|
82
|
+
*/
|
|
83
|
+
async function removeReminder(args, authManager) {
|
|
84
|
+
try {
|
|
85
|
+
if (!args.id) {
|
|
86
|
+
throw new types_1.MCPError(types_1.ErrorCode.VALIDATION_ERROR, 'Task id is required for remove-reminder operation');
|
|
87
|
+
}
|
|
88
|
+
(0, validation_1.validateId)(args.id, 'id');
|
|
89
|
+
const hasReminderDate = args.reminderDate !== undefined;
|
|
90
|
+
const hasReminderIndex = args.reminderIndex !== undefined;
|
|
91
|
+
if (!hasReminderDate && !hasReminderIndex) {
|
|
92
|
+
throw new types_1.MCPError(types_1.ErrorCode.VALIDATION_ERROR, 'Either reminderDate or reminderIndex is required for remove-reminder operation');
|
|
93
|
+
}
|
|
94
|
+
if (hasReminderDate) {
|
|
95
|
+
(0, validation_1.validateDateString)(args.reminderDate, 'reminderDate');
|
|
96
|
+
}
|
|
97
|
+
if (hasReminderIndex &&
|
|
98
|
+
(!Number.isInteger(args.reminderIndex) || args.reminderIndex < 0)) {
|
|
99
|
+
throw new types_1.MCPError(types_1.ErrorCode.VALIDATION_ERROR, 'reminderIndex must be a non-negative integer');
|
|
100
|
+
}
|
|
101
|
+
// Get current task
|
|
102
|
+
const currentTask = await (0, task_rest_transport_1.getTaskViaRest)(authManager, args.id);
|
|
103
|
+
// Vikunja stores reminders under the `reminder` key (models.TaskReminder
|
|
104
|
+
// has no `id` field), the same field addReminder writes. `reminder` is
|
|
105
|
+
// typed optional in the spec, but a reminder with no date is
|
|
106
|
+
// meaningless — filter out the (unexpected) case rather than passing
|
|
107
|
+
// `undefined` through.
|
|
108
|
+
const existingReminders = (currentTask.reminders ?? [])
|
|
109
|
+
.filter((r) => r.reminder !== undefined)
|
|
110
|
+
.map((r) => ({
|
|
111
|
+
reminder: r.reminder,
|
|
112
|
+
...(r.relative_period !== undefined ? { relative_period: r.relative_period } : {}),
|
|
113
|
+
...(r.relative_to !== undefined ? { relative_to: r.relative_to } : {}),
|
|
114
|
+
}));
|
|
115
|
+
if (existingReminders.length === 0) {
|
|
116
|
+
throw new types_1.MCPError(types_1.ErrorCode.VALIDATION_ERROR, 'Task has no reminders to remove');
|
|
117
|
+
}
|
|
118
|
+
let targetIndex;
|
|
119
|
+
if (hasReminderIndex) {
|
|
120
|
+
targetIndex = args.reminderIndex;
|
|
121
|
+
if (targetIndex >= existingReminders.length) {
|
|
122
|
+
throw new types_1.MCPError(types_1.ErrorCode.VALIDATION_ERROR, `reminderIndex ${targetIndex} not found in task (task has ${existingReminders.length} reminder(s))`);
|
|
123
|
+
}
|
|
124
|
+
if (hasReminderDate && existingReminders[targetIndex]?.reminder !== args.reminderDate) {
|
|
125
|
+
throw new types_1.MCPError(types_1.ErrorCode.VALIDATION_ERROR, `Reminder at index ${targetIndex} does not match reminderDate ${args.reminderDate}`);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
else {
|
|
129
|
+
targetIndex = existingReminders.findIndex((r) => r.reminder === args.reminderDate);
|
|
130
|
+
if (targetIndex === -1) {
|
|
131
|
+
throw new types_1.MCPError(types_1.ErrorCode.VALIDATION_ERROR, `Reminder with date ${args.reminderDate} not found in task`);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
const removedReminder = existingReminders[targetIndex];
|
|
135
|
+
const updatedReminders = existingReminders.filter((_, i) => i !== targetIndex);
|
|
136
|
+
// Update task with filtered reminders — full-model-replace.
|
|
137
|
+
await (0, task_rest_transport_1.updateTaskViaRest)(authManager, args.id, {
|
|
138
|
+
...currentTask,
|
|
139
|
+
reminders: updatedReminders,
|
|
140
|
+
});
|
|
141
|
+
// Create proper AORP response
|
|
142
|
+
const removedDescription = removedReminder?.reminder ?? `index ${targetIndex}`;
|
|
143
|
+
const aorpResult = (0, response_factory_1.createAorpFromData)('remove-reminder', `Reminder ${removedDescription} removed successfully`, true, `Reminder ${removedDescription} removed successfully`);
|
|
144
|
+
return {
|
|
145
|
+
content: [
|
|
146
|
+
{
|
|
147
|
+
type: 'text',
|
|
148
|
+
text: (0, response_factory_1.formatAorpAsMarkdown)(aorpResult),
|
|
149
|
+
},
|
|
150
|
+
],
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
catch (error) {
|
|
154
|
+
if (error instanceof types_1.MCPError) {
|
|
155
|
+
throw error;
|
|
156
|
+
}
|
|
157
|
+
throw new types_1.MCPError(types_1.ErrorCode.API_ERROR, `Failed to remove reminder: ${error instanceof Error ? error.message : String(error)}`);
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* List all reminders for a task
|
|
162
|
+
*/
|
|
163
|
+
async function listReminders(args, authManager) {
|
|
164
|
+
try {
|
|
165
|
+
if (!args.id) {
|
|
166
|
+
throw new types_1.MCPError(types_1.ErrorCode.VALIDATION_ERROR, 'Task id is required for list-reminders operation');
|
|
167
|
+
}
|
|
168
|
+
(0, validation_1.validateId)(args.id, 'id');
|
|
169
|
+
// Get task with reminders
|
|
170
|
+
const task = await (0, task_rest_transport_1.getTaskViaRest)(authManager, args.id);
|
|
171
|
+
// Vikunja stores reminders under the `reminder` key (models.TaskReminder
|
|
172
|
+
// has no `id` field). See addReminder and removeReminder for the same
|
|
173
|
+
// field-name handling.
|
|
174
|
+
const reminders = (task.reminders ?? []).map((r) => ({
|
|
175
|
+
reminder: r.reminder,
|
|
176
|
+
...(r.relative_period !== undefined ? { relative_period: r.relative_period } : {}),
|
|
177
|
+
...(r.relative_to !== undefined ? { relative_to: r.relative_to } : {}),
|
|
178
|
+
}));
|
|
179
|
+
const summary = `Found ${reminders.length} reminder(s) for task "${task.title}"`;
|
|
180
|
+
// Surface the identifiers (reminderIndex / reminderDate) callers need
|
|
181
|
+
// to pass to remove-reminder, since the API exposes no reminder id.
|
|
182
|
+
const reminderLines = reminders
|
|
183
|
+
.map((r, index) => {
|
|
184
|
+
const parts = [`reminder: ${r.reminder}`];
|
|
185
|
+
if (r.relative_period !== undefined) {
|
|
186
|
+
parts.push(`relative_period: ${r.relative_period}`);
|
|
187
|
+
}
|
|
188
|
+
if (r.relative_to !== undefined) {
|
|
189
|
+
parts.push(`relative_to: ${r.relative_to}`);
|
|
190
|
+
}
|
|
191
|
+
return `- reminderIndex ${index}: ${parts.join(', ')}`;
|
|
192
|
+
})
|
|
193
|
+
.join('\n');
|
|
194
|
+
const details = reminderLines ? `${summary}\n\n${reminderLines}` : summary;
|
|
195
|
+
// Create proper AORP response
|
|
196
|
+
const aorpResult = (0, response_factory_1.createAorpFromData)('list-reminders', summary, true, details);
|
|
197
|
+
return {
|
|
198
|
+
content: [
|
|
199
|
+
{
|
|
200
|
+
type: 'text',
|
|
201
|
+
text: (0, response_factory_1.formatAorpAsMarkdown)(aorpResult),
|
|
202
|
+
},
|
|
203
|
+
],
|
|
204
|
+
};
|
|
205
|
+
}
|
|
206
|
+
catch (error) {
|
|
207
|
+
if (error instanceof types_1.MCPError) {
|
|
208
|
+
throw error;
|
|
209
|
+
}
|
|
210
|
+
throw new types_1.MCPError(types_1.ErrorCode.API_ERROR, `Failed to list reminders: ${error instanceof Error ? error.message : String(error)}`);
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
//# sourceMappingURL=reminders.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reminders.js","sourceRoot":"","sources":["../../../src/tools/tasks/reminders.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Subtask composites for `vikunja_tasks`.
|
|
3
|
+
*
|
|
4
|
+
* Vikunja has no first-class "subtask" resource — a subtask is a plain task
|
|
5
|
+
* connected to its parent by a `models.TaskRelation` with `relation_kind:
|
|
6
|
+
* "subtask"` (see `src/tools/tasks-relations.ts`, the direction semantics
|
|
7
|
+
* this module relies on).
|
|
8
|
+
*
|
|
9
|
+
* Direction, per `models.TaskRelation`'s field docs (`task_id`: "the ID of
|
|
10
|
+
* the 'base' task, the task which has a relation to another"; `other_task_id`:
|
|
11
|
+
* "the ID of the other task, the task which is being related"): a relation
|
|
12
|
+
* created as `PUT /tasks/{parentId}/relations` with body `{task_id: parentId,
|
|
13
|
+
* other_task_id: childId, relation_kind: "subtask"}` stores the child under
|
|
14
|
+
* the *parent's* `related_tasks["subtask"]` — Vikunja mirrors the inverse
|
|
15
|
+
* relation (`"parenttask"`) onto the child automatically server-side. So the
|
|
16
|
+
* base task of the PUT must be the parent, not the new child.
|
|
17
|
+
*
|
|
18
|
+
* `create-subtask` (composite-first, docs/ENDPOINT-PLAYBOOK.md §1): resolves
|
|
19
|
+
* the parent task to inherit its project, creates the new task in that
|
|
20
|
+
* project, optionally attaches labels/assignees and places it in a Kanban
|
|
21
|
+
* bucket (reusing the `set-bucket` code path), creates the parent -> child
|
|
22
|
+
* `subtask` relation, then re-reads the parent to verify the relation
|
|
23
|
+
* actually landed. Built on `CompositeOperation`
|
|
24
|
+
* (`src/utils/composite-operation.ts`) — best-effort by default (a failure
|
|
25
|
+
* after the task was created is reported honestly, including the orphaned
|
|
26
|
+
* task id, rather than silently rolled back); `atomic: true` opts into
|
|
27
|
+
* best-effort rollback (deleting the created task) per the helper's design.
|
|
28
|
+
*
|
|
29
|
+
* `list-subtasks` is a read composite: one `GET /tasks/{id}` call, filtered
|
|
30
|
+
* to the `"subtask"` slice of `related_tasks` and summarized.
|
|
31
|
+
*/
|
|
32
|
+
import type { AuthManager } from '../../auth/AuthManager';
|
|
33
|
+
type McpResponse = {
|
|
34
|
+
content: Array<{
|
|
35
|
+
type: 'text';
|
|
36
|
+
text: string;
|
|
37
|
+
}>;
|
|
38
|
+
};
|
|
39
|
+
export interface CreateSubtaskArgs {
|
|
40
|
+
/** Id of the existing task the new task becomes a subtask of. Its project is inherited. */
|
|
41
|
+
parentTaskId?: number;
|
|
42
|
+
title?: string;
|
|
43
|
+
description?: string;
|
|
44
|
+
dueDate?: string;
|
|
45
|
+
priority?: number;
|
|
46
|
+
labels?: number[];
|
|
47
|
+
assignees?: number[];
|
|
48
|
+
/** Optional Kanban bucket to place the new subtask into, via the existing `set-bucket` path. */
|
|
49
|
+
bucketId?: number;
|
|
50
|
+
/**
|
|
51
|
+
* Opt into atomic rollback: if any later step fails, previously-succeeded
|
|
52
|
+
* steps are compensated in reverse order (the created task is deleted).
|
|
53
|
+
* Default `false` (best-effort) — see
|
|
54
|
+
* docs/ENDPOINT-PLAYBOOK.md §5 / `CompositeOperation`'s design rule (a).
|
|
55
|
+
* This is best-effort compensation against a live API, not a real
|
|
56
|
+
* transaction: side effects of intermediate writes (e.g. any webhook the
|
|
57
|
+
* task-create step fires) are not undone by the rollback.
|
|
58
|
+
*/
|
|
59
|
+
atomic?: boolean;
|
|
60
|
+
sessionId?: string;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Composite: create a new task as a subtask of an existing task.
|
|
64
|
+
*
|
|
65
|
+
* Steps: resolve-parent (inherit project) -> create-task (compensatable:
|
|
66
|
+
* delete on rollback) -> apply-labels / apply-assignees (only when supplied)
|
|
67
|
+
* -> create-relation (parent -subtask-> child) -> set-bucket (only when
|
|
68
|
+
* `bucketId` supplied, reuses `setTaskBucket`) -> verify-relation (re-reads
|
|
69
|
+
* the parent's `related_tasks` to confirm the child actually appears under
|
|
70
|
+
* `"subtask"`).
|
|
71
|
+
*/
|
|
72
|
+
export declare function createSubtask(args: CreateSubtaskArgs, authManager: AuthManager): Promise<McpResponse>;
|
|
73
|
+
export interface ListSubtasksArgs {
|
|
74
|
+
/** Id of the task whose subtasks should be listed. */
|
|
75
|
+
id?: number;
|
|
76
|
+
sessionId?: string;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Read composite: lists a task's subtasks in one call — the `"subtask"`
|
|
80
|
+
* slice of `GET /tasks/{id}`'s `related_tasks` map, summarized to
|
|
81
|
+
* id/title/done/assignees rather than the full related `Task` objects.
|
|
82
|
+
*/
|
|
83
|
+
export declare function listSubtasks(args: ListSubtasksArgs, authManager: AuthManager): Promise<McpResponse>;
|
|
84
|
+
export {};
|
|
85
|
+
//# sourceMappingURL=subtasks.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"subtasks.d.ts","sourceRoot":"","sources":["../../../src/tools/tasks/subtasks.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAiB1D,KAAK,WAAW,GAAG;IAAE,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAAE,CAAC;AAyBtE,MAAM,WAAW,iBAAiB;IAChC,2FAA2F;IAC3F,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,gGAAgG;IAChG,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;;;;;;OAQG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;;;GASG;AACH,wBAAsB,aAAa,CACjC,IAAI,EAAE,iBAAiB,EACvB,WAAW,EAAE,WAAW,GACvB,OAAO,CAAC,WAAW,CAAC,CA2NtB;AAED,MAAM,WAAW,gBAAgB;IAC/B,sDAAsD;IACtD,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAUD;;;;GAIG;AACH,wBAAsB,YAAY,CAAC,IAAI,EAAE,gBAAgB,EAAE,WAAW,EAAE,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC,CA+BzG"}
|
|
@@ -0,0 +1,286 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Subtask composites for `vikunja_tasks`.
|
|
4
|
+
*
|
|
5
|
+
* Vikunja has no first-class "subtask" resource — a subtask is a plain task
|
|
6
|
+
* connected to its parent by a `models.TaskRelation` with `relation_kind:
|
|
7
|
+
* "subtask"` (see `src/tools/tasks-relations.ts`, the direction semantics
|
|
8
|
+
* this module relies on).
|
|
9
|
+
*
|
|
10
|
+
* Direction, per `models.TaskRelation`'s field docs (`task_id`: "the ID of
|
|
11
|
+
* the 'base' task, the task which has a relation to another"; `other_task_id`:
|
|
12
|
+
* "the ID of the other task, the task which is being related"): a relation
|
|
13
|
+
* created as `PUT /tasks/{parentId}/relations` with body `{task_id: parentId,
|
|
14
|
+
* other_task_id: childId, relation_kind: "subtask"}` stores the child under
|
|
15
|
+
* the *parent's* `related_tasks["subtask"]` — Vikunja mirrors the inverse
|
|
16
|
+
* relation (`"parenttask"`) onto the child automatically server-side. So the
|
|
17
|
+
* base task of the PUT must be the parent, not the new child.
|
|
18
|
+
*
|
|
19
|
+
* `create-subtask` (composite-first, docs/ENDPOINT-PLAYBOOK.md §1): resolves
|
|
20
|
+
* the parent task to inherit its project, creates the new task in that
|
|
21
|
+
* project, optionally attaches labels/assignees and places it in a Kanban
|
|
22
|
+
* bucket (reusing the `set-bucket` code path), creates the parent -> child
|
|
23
|
+
* `subtask` relation, then re-reads the parent to verify the relation
|
|
24
|
+
* actually landed. Built on `CompositeOperation`
|
|
25
|
+
* (`src/utils/composite-operation.ts`) — best-effort by default (a failure
|
|
26
|
+
* after the task was created is reported honestly, including the orphaned
|
|
27
|
+
* task id, rather than silently rolled back); `atomic: true` opts into
|
|
28
|
+
* best-effort rollback (deleting the created task) per the helper's design.
|
|
29
|
+
*
|
|
30
|
+
* `list-subtasks` is a read composite: one `GET /tasks/{id}` call, filtered
|
|
31
|
+
* to the `"subtask"` slice of `related_tasks` and summarized.
|
|
32
|
+
*/
|
|
33
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
34
|
+
exports.createSubtask = createSubtask;
|
|
35
|
+
exports.listSubtasks = listSubtasks;
|
|
36
|
+
const types_1 = require("../../types");
|
|
37
|
+
const vikunja_rest_1 = require("../../utils/vikunja-rest");
|
|
38
|
+
const task_rest_transport_1 = require("../../utils/task-rest-transport");
|
|
39
|
+
const validation_1 = require("../../utils/validation");
|
|
40
|
+
const validation_2 = require("./validation");
|
|
41
|
+
const error_handler_1 = require("../../utils/error-handler");
|
|
42
|
+
const response_factory_1 = require("../../utils/response-factory");
|
|
43
|
+
const composite_operation_1 = require("../../utils/composite-operation");
|
|
44
|
+
const buckets_1 = require("./buckets");
|
|
45
|
+
/** Re-throws a 404 as a friendly not-found MCPError; everything else passes through `transformApiError`. */
|
|
46
|
+
function rethrow(error, notFoundMessage, context) {
|
|
47
|
+
if (error instanceof types_1.MCPError) {
|
|
48
|
+
if (notFoundMessage && error.details?.statusCode === 404) {
|
|
49
|
+
throw new types_1.MCPError(types_1.ErrorCode.NOT_FOUND, notFoundMessage);
|
|
50
|
+
}
|
|
51
|
+
throw error;
|
|
52
|
+
}
|
|
53
|
+
throw (0, error_handler_1.transformApiError)(error, context);
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Reads one relation-kind slice out of a task's `related_tasks` map.
|
|
57
|
+
* `related_tasks` (`models.RelatedTaskMap`) is a map of relation kind ->
|
|
58
|
+
* `Task[]`, not a flat array — see the same pattern in
|
|
59
|
+
* `src/tools/tasks-relations.ts`'s `relations` subcommand.
|
|
60
|
+
*/
|
|
61
|
+
function extractRelatedTasks(task, kind) {
|
|
62
|
+
const map = (task.related_tasks ?? {});
|
|
63
|
+
const list = map[kind];
|
|
64
|
+
return Array.isArray(list) ? list : [];
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Composite: create a new task as a subtask of an existing task.
|
|
68
|
+
*
|
|
69
|
+
* Steps: resolve-parent (inherit project) -> create-task (compensatable:
|
|
70
|
+
* delete on rollback) -> apply-labels / apply-assignees (only when supplied)
|
|
71
|
+
* -> create-relation (parent -subtask-> child) -> set-bucket (only when
|
|
72
|
+
* `bucketId` supplied, reuses `setTaskBucket`) -> verify-relation (re-reads
|
|
73
|
+
* the parent's `related_tasks` to confirm the child actually appears under
|
|
74
|
+
* `"subtask"`).
|
|
75
|
+
*/
|
|
76
|
+
async function createSubtask(args, authManager) {
|
|
77
|
+
if (!args.parentTaskId) {
|
|
78
|
+
throw new types_1.MCPError(types_1.ErrorCode.VALIDATION_ERROR, 'parentTaskId is required to create a subtask');
|
|
79
|
+
}
|
|
80
|
+
(0, validation_1.validateId)(args.parentTaskId, 'parentTaskId');
|
|
81
|
+
if (!args.title) {
|
|
82
|
+
throw new types_1.MCPError(types_1.ErrorCode.VALIDATION_ERROR, 'title is required to create a subtask');
|
|
83
|
+
}
|
|
84
|
+
const sanitizedTitle = (0, validation_1.sanitizeString)(args.title);
|
|
85
|
+
const sanitizedDescription = args.description !== undefined ? (0, validation_1.sanitizeString)(args.description) : undefined;
|
|
86
|
+
if (args.dueDate) {
|
|
87
|
+
(0, validation_2.validateDateString)(args.dueDate, 'dueDate');
|
|
88
|
+
}
|
|
89
|
+
if (args.labels && args.labels.length > 0) {
|
|
90
|
+
args.labels.forEach((id) => (0, validation_1.validateId)(id, 'label ID'));
|
|
91
|
+
}
|
|
92
|
+
if (args.assignees && args.assignees.length > 0) {
|
|
93
|
+
args.assignees.forEach((id) => (0, validation_1.validateId)(id, 'assignee ID'));
|
|
94
|
+
}
|
|
95
|
+
if (args.bucketId !== undefined) {
|
|
96
|
+
(0, validation_1.validateId)(args.bucketId, 'bucketId');
|
|
97
|
+
}
|
|
98
|
+
const parentTaskId = args.parentTaskId;
|
|
99
|
+
let parentProjectId;
|
|
100
|
+
let createdTaskId;
|
|
101
|
+
const op = new composite_operation_1.CompositeOperation();
|
|
102
|
+
op.addStep({
|
|
103
|
+
name: 'resolve-parent',
|
|
104
|
+
execute: async () => {
|
|
105
|
+
let parent;
|
|
106
|
+
try {
|
|
107
|
+
parent = await (0, task_rest_transport_1.getTaskViaRest)(authManager, parentTaskId);
|
|
108
|
+
}
|
|
109
|
+
catch (error) {
|
|
110
|
+
rethrow(error, `Parent task ${parentTaskId} not found`, 'Failed to resolve parent task');
|
|
111
|
+
}
|
|
112
|
+
if (!parent || typeof parent.project_id !== 'number') {
|
|
113
|
+
throw new types_1.MCPError(types_1.ErrorCode.NOT_FOUND, `Parent task ${parentTaskId} not found or has no project`);
|
|
114
|
+
}
|
|
115
|
+
parentProjectId = parent.project_id;
|
|
116
|
+
return parent;
|
|
117
|
+
},
|
|
118
|
+
});
|
|
119
|
+
op.addStep({
|
|
120
|
+
name: 'create-task',
|
|
121
|
+
execute: async () => {
|
|
122
|
+
const projectId = parentProjectId;
|
|
123
|
+
const newTask = { title: sanitizedTitle, project_id: projectId };
|
|
124
|
+
if (sanitizedDescription !== undefined)
|
|
125
|
+
newTask.description = sanitizedDescription;
|
|
126
|
+
if (args.dueDate !== undefined)
|
|
127
|
+
newTask.due_date = args.dueDate;
|
|
128
|
+
if (args.priority !== undefined)
|
|
129
|
+
newTask.priority = args.priority;
|
|
130
|
+
let created;
|
|
131
|
+
try {
|
|
132
|
+
created = await (0, vikunja_rest_1.vikunjaRestRequest)(authManager, 'PUT', `/projects/${projectId}/tasks`, newTask);
|
|
133
|
+
}
|
|
134
|
+
catch (error) {
|
|
135
|
+
rethrow(error, undefined, 'Failed to create subtask');
|
|
136
|
+
}
|
|
137
|
+
if (!created.id) {
|
|
138
|
+
throw new types_1.MCPError(types_1.ErrorCode.API_ERROR, 'Subtask was created but Vikunja did not return a task id');
|
|
139
|
+
}
|
|
140
|
+
createdTaskId = created.id;
|
|
141
|
+
return created;
|
|
142
|
+
},
|
|
143
|
+
compensate: async () => {
|
|
144
|
+
if (createdTaskId === undefined)
|
|
145
|
+
return undefined;
|
|
146
|
+
await (0, vikunja_rest_1.vikunjaRestRequest)(authManager, 'DELETE', `/tasks/${createdTaskId}`);
|
|
147
|
+
return undefined;
|
|
148
|
+
},
|
|
149
|
+
});
|
|
150
|
+
if (args.labels && args.labels.length > 0) {
|
|
151
|
+
const labelIds = args.labels;
|
|
152
|
+
op.addStep({
|
|
153
|
+
name: 'apply-labels',
|
|
154
|
+
execute: async () => {
|
|
155
|
+
const taskId = createdTaskId;
|
|
156
|
+
// Additive per-label endpoint (PUT /tasks/{taskID}/labels, body
|
|
157
|
+
// {label_id}) — same as apply-label / TaskCreationService.
|
|
158
|
+
// Intentionally sequential: label attach order should not matter,
|
|
159
|
+
// but keeping it simple avoids a Promise.all partial-failure
|
|
160
|
+
// ordering surprise across labels.
|
|
161
|
+
for (const labelId of labelIds) {
|
|
162
|
+
await (0, vikunja_rest_1.vikunjaRestRequest)(authManager, 'PUT', `/tasks/${taskId}/labels`, {
|
|
163
|
+
label_id: labelId,
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
},
|
|
167
|
+
});
|
|
168
|
+
}
|
|
169
|
+
if (args.assignees && args.assignees.length > 0) {
|
|
170
|
+
const assigneeIds = args.assignees;
|
|
171
|
+
op.addStep({
|
|
172
|
+
name: 'apply-assignees',
|
|
173
|
+
execute: async () => {
|
|
174
|
+
const taskId = createdTaskId;
|
|
175
|
+
// Additive per-user endpoint (PUT /tasks/{taskID}/assignees, body
|
|
176
|
+
// {user_id}) — never the bulk endpoint, which REPLACES the whole
|
|
177
|
+
// assignee list (see TaskCreationService.addAssigneesToTask).
|
|
178
|
+
// Sequential on purpose (post-#89 pattern sweep, mirrors the
|
|
179
|
+
// apply-labels step above): concurrent per-user writes to the same
|
|
180
|
+
// task risk "database is locked" 500s on SQLite-backed instances.
|
|
181
|
+
for (const userId of assigneeIds) {
|
|
182
|
+
await (0, vikunja_rest_1.vikunjaRestRequest)(authManager, 'PUT', `/tasks/${taskId}/assignees`, {
|
|
183
|
+
user_id: userId,
|
|
184
|
+
});
|
|
185
|
+
}
|
|
186
|
+
},
|
|
187
|
+
});
|
|
188
|
+
}
|
|
189
|
+
op.addStep({
|
|
190
|
+
name: 'create-relation',
|
|
191
|
+
execute: async () => {
|
|
192
|
+
const childId = createdTaskId;
|
|
193
|
+
try {
|
|
194
|
+
// Base task (task_id) of the relation must be the PARENT — see the
|
|
195
|
+
// module doc comment for the direction semantics this depends on.
|
|
196
|
+
return await (0, vikunja_rest_1.vikunjaRestRequest)(authManager, 'PUT', `/tasks/${parentTaskId}/relations`, {
|
|
197
|
+
task_id: parentTaskId,
|
|
198
|
+
other_task_id: childId,
|
|
199
|
+
relation_kind: 'subtask',
|
|
200
|
+
});
|
|
201
|
+
}
|
|
202
|
+
catch (error) {
|
|
203
|
+
rethrow(error, undefined, 'Failed to relate subtask to parent task');
|
|
204
|
+
}
|
|
205
|
+
},
|
|
206
|
+
});
|
|
207
|
+
if (args.bucketId !== undefined) {
|
|
208
|
+
const bucketId = args.bucketId;
|
|
209
|
+
op.addStep({
|
|
210
|
+
name: 'set-bucket',
|
|
211
|
+
execute: async () => {
|
|
212
|
+
const taskId = createdTaskId;
|
|
213
|
+
const projectId = parentProjectId;
|
|
214
|
+
// Reuses the existing set-bucket path (Kanban view auto-resolution
|
|
215
|
+
// + the bucket-placement write) rather than duplicating it. Its own
|
|
216
|
+
// formatted MCP response is discarded — only the side effect (the
|
|
217
|
+
// task landing in the bucket) matters to this composite.
|
|
218
|
+
await (0, buckets_1.setTaskBucket)({ id: taskId, bucketId, projectId }, authManager);
|
|
219
|
+
},
|
|
220
|
+
});
|
|
221
|
+
}
|
|
222
|
+
op.addStep({
|
|
223
|
+
name: 'verify-relation',
|
|
224
|
+
execute: async () => {
|
|
225
|
+
const childId = createdTaskId;
|
|
226
|
+
let parent;
|
|
227
|
+
try {
|
|
228
|
+
parent = await (0, task_rest_transport_1.getTaskViaRest)(authManager, parentTaskId);
|
|
229
|
+
}
|
|
230
|
+
catch (error) {
|
|
231
|
+
rethrow(error, undefined, 'Failed to verify subtask relation');
|
|
232
|
+
}
|
|
233
|
+
const subtasks = extractRelatedTasks(parent, 'subtask');
|
|
234
|
+
const found = subtasks.some((t) => t.id === childId);
|
|
235
|
+
if (!found) {
|
|
236
|
+
throw new types_1.MCPError(types_1.ErrorCode.INTERNAL_ERROR, `Subtask ${childId} was created and related to parent ${parentTaskId} but did not ` +
|
|
237
|
+
`appear under the parent's "subtask" relations on verification`);
|
|
238
|
+
}
|
|
239
|
+
return true;
|
|
240
|
+
},
|
|
241
|
+
});
|
|
242
|
+
const atomic = args.atomic ?? false;
|
|
243
|
+
const result = await op.run({ atomic });
|
|
244
|
+
if (!result.ok) {
|
|
245
|
+
const err = result.error instanceof Error ? result.error : new Error(String(result.error));
|
|
246
|
+
throw new types_1.MCPError(err instanceof types_1.MCPError ? err.code : types_1.ErrorCode.API_ERROR, `create-subtask failed: ${err.message}${result.guidance ? `\n${result.guidance}` : ''}`, { vikunjaError: result });
|
|
247
|
+
}
|
|
248
|
+
const response = (0, response_factory_1.createStandardResponse)('create-subtask', `Created subtask ${createdTaskId} ("${sanitizedTitle}") under parent task ${parentTaskId}`, {
|
|
249
|
+
subtaskId: createdTaskId,
|
|
250
|
+
parentTaskId,
|
|
251
|
+
projectId: parentProjectId,
|
|
252
|
+
bucketId: args.bucketId,
|
|
253
|
+
atomic,
|
|
254
|
+
trace: result.steps,
|
|
255
|
+
}, { timestamp: new Date().toISOString() }, args.sessionId);
|
|
256
|
+
return { content: [{ type: 'text', text: (0, response_factory_1.formatAorpAsMarkdown)(response) }] };
|
|
257
|
+
}
|
|
258
|
+
/**
|
|
259
|
+
* Read composite: lists a task's subtasks in one call — the `"subtask"`
|
|
260
|
+
* slice of `GET /tasks/{id}`'s `related_tasks` map, summarized to
|
|
261
|
+
* id/title/done/assignees rather than the full related `Task` objects.
|
|
262
|
+
*/
|
|
263
|
+
async function listSubtasks(args, authManager) {
|
|
264
|
+
if (!args.id) {
|
|
265
|
+
throw new types_1.MCPError(types_1.ErrorCode.VALIDATION_ERROR, 'Task ID is required');
|
|
266
|
+
}
|
|
267
|
+
(0, validation_1.validateId)(args.id, 'id');
|
|
268
|
+
let task;
|
|
269
|
+
try {
|
|
270
|
+
task = await (0, task_rest_transport_1.getTaskViaRest)(authManager, args.id);
|
|
271
|
+
}
|
|
272
|
+
catch (error) {
|
|
273
|
+
rethrow(error, `Task ${args.id} not found`, 'Failed to list subtasks');
|
|
274
|
+
}
|
|
275
|
+
const subtasks = extractRelatedTasks(task, 'subtask').map((t) => ({
|
|
276
|
+
id: t.id,
|
|
277
|
+
title: t.title,
|
|
278
|
+
done: t.done,
|
|
279
|
+
assignees: (t.assignees ?? []).map((a) => ({ id: a.id, username: a.username })),
|
|
280
|
+
}));
|
|
281
|
+
const response = (0, response_factory_1.createStandardResponse)('list-subtasks', subtasks.length > 0
|
|
282
|
+
? `Found ${subtasks.length} subtask(s) for task ${args.id}`
|
|
283
|
+
: `Found 0 subtasks for task ${args.id}`, { taskId: args.id, subtasks, count: subtasks.length }, { timestamp: new Date().toISOString(), count: subtasks.length }, args.sessionId);
|
|
284
|
+
return { content: [{ type: 'text', text: (0, response_factory_1.formatAorpAsMarkdown)(response) }] };
|
|
285
|
+
}
|
|
286
|
+
//# sourceMappingURL=subtasks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"subtasks.js","sourceRoot":"","sources":["../../../src/tools/tasks/subtasks.ts"],"names":[],"mappings":"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"}
|