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,258 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Project Link Sharing Module
|
|
4
|
+
*
|
|
5
|
+
* Handles link sharing operations for projects: `create-share`,
|
|
6
|
+
* `list-shares`, `get-share`, `delete-share`, `auth-share`.
|
|
7
|
+
*
|
|
8
|
+
* Migrated off the legacy client (Wave D domain migration, tracking issue #28)
|
|
9
|
+
* onto `vikunjaRestRequest` + types generated from the vendored OpenAPI
|
|
10
|
+
* spec. the legacy client's `LinkSharing` type is stale — it models
|
|
11
|
+
* `right`/`label`/`password_enabled`/`expires`, none of which the real API
|
|
12
|
+
* accepts or returns; the spec's `models.LinkSharing` uses `permission` and
|
|
13
|
+
* `name`, and has no `expires`/`password_enabled`/`shares` field at all. See
|
|
14
|
+
* docs/API_NOTES.md "Project Sharing" and docs/API-COVERAGE.md.
|
|
15
|
+
*
|
|
16
|
+
* Endpoints (verified against docs/vikunja-openapi.json):
|
|
17
|
+
* - PUT /projects/{project}/shares create
|
|
18
|
+
* - GET /projects/{project}/shares list
|
|
19
|
+
* - GET /projects/{project}/shares/{share} get
|
|
20
|
+
* - DELETE /projects/{project}/shares/{share} delete
|
|
21
|
+
* - POST /shares/{share}/auth auth
|
|
22
|
+
*/
|
|
23
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
24
|
+
exports.createProjectShare = createProjectShare;
|
|
25
|
+
exports.listProjectShares = listProjectShares;
|
|
26
|
+
exports.getProjectShare = getProjectShare;
|
|
27
|
+
exports.deleteProjectShare = deleteProjectShare;
|
|
28
|
+
exports.authProjectShare = authProjectShare;
|
|
29
|
+
const types_1 = require("../../types");
|
|
30
|
+
const vikunja_rest_1 = require("../../utils/vikunja-rest");
|
|
31
|
+
const error_handler_1 = require("../../utils/error-handler");
|
|
32
|
+
const validation_1 = require("./validation");
|
|
33
|
+
const permission_1 = require("./permission");
|
|
34
|
+
const response_formatter_1 = require("./response-formatter");
|
|
35
|
+
const response_factory_1 = require("../../utils/response-factory");
|
|
36
|
+
/**
|
|
37
|
+
* Re-throws a REST-layer 404 as a friendlier "project not found" message;
|
|
38
|
+
* everything else is re-thrown unchanged (MCPError as-is, anything else
|
|
39
|
+
* through `transformApiError`).
|
|
40
|
+
*/
|
|
41
|
+
function rethrowProjectNotFound(error, projectId, context) {
|
|
42
|
+
if (error instanceof types_1.MCPError) {
|
|
43
|
+
if (error.details?.statusCode === 404) {
|
|
44
|
+
throw new types_1.MCPError(types_1.ErrorCode.NOT_FOUND, `Project with ID ${projectId} not found`);
|
|
45
|
+
}
|
|
46
|
+
throw error;
|
|
47
|
+
}
|
|
48
|
+
throw (0, error_handler_1.transformApiError)(error, context);
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Creates a new link share for a project
|
|
52
|
+
*/
|
|
53
|
+
async function createProjectShare(args, authManager) {
|
|
54
|
+
const { projectId, right, name, password, verbosity, useOptimizedFormat, useAorp } = args;
|
|
55
|
+
try {
|
|
56
|
+
(0, validation_1.validateId)(projectId, 'project id');
|
|
57
|
+
const numericRight = (0, permission_1.resolvePermission)(right);
|
|
58
|
+
// Verify the project exists before writing (verify-then-apply) so a
|
|
59
|
+
// missing project produces a friendly NOT_FOUND rather than whatever
|
|
60
|
+
// the shares endpoint itself happens to return for an absent project.
|
|
61
|
+
await (0, vikunja_rest_1.vikunjaRestRequest)(authManager, 'GET', `/projects/${projectId}`);
|
|
62
|
+
// models.LinkSharing's request shape is {permission, name, password}.
|
|
63
|
+
const body = {
|
|
64
|
+
permission: numericRight,
|
|
65
|
+
};
|
|
66
|
+
if (name !== undefined) {
|
|
67
|
+
body.name = name.trim();
|
|
68
|
+
}
|
|
69
|
+
if (password !== undefined) {
|
|
70
|
+
body.password = password;
|
|
71
|
+
}
|
|
72
|
+
const createdShare = await (0, vikunja_rest_1.vikunjaRestRequest)(authManager, 'PUT', `/projects/${projectId}/shares`, body);
|
|
73
|
+
const result = (0, response_formatter_1.createProjectResponse)('create_project_share', `Share created successfully for project ID ${projectId}`, { share: createdShare }, {
|
|
74
|
+
projectId,
|
|
75
|
+
shareRight: right,
|
|
76
|
+
hasPassword: !!password
|
|
77
|
+
}, verbosity, useOptimizedFormat, useAorp);
|
|
78
|
+
return {
|
|
79
|
+
content: [
|
|
80
|
+
{
|
|
81
|
+
type: 'text',
|
|
82
|
+
text: (0, response_factory_1.formatAorpAsMarkdown)(result.response),
|
|
83
|
+
}
|
|
84
|
+
]
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
catch (error) {
|
|
88
|
+
if (error instanceof types_1.MCPError && error.code === types_1.ErrorCode.VALIDATION_ERROR) {
|
|
89
|
+
throw error;
|
|
90
|
+
}
|
|
91
|
+
rethrowProjectNotFound(error, projectId, 'Failed to create share');
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Lists all link shares for a project
|
|
96
|
+
*/
|
|
97
|
+
async function listProjectShares(args, authManager) {
|
|
98
|
+
const { projectId, page = 1, perPage = 50, verbosity, useOptimizedFormat, useAorp } = args;
|
|
99
|
+
try {
|
|
100
|
+
(0, validation_1.validateId)(projectId, 'project id');
|
|
101
|
+
// Verify the project exists first (same verify-then-apply shape as create).
|
|
102
|
+
await (0, vikunja_rest_1.vikunjaRestRequest)(authManager, 'GET', `/projects/${projectId}`);
|
|
103
|
+
const params = new URLSearchParams();
|
|
104
|
+
if (page !== 1)
|
|
105
|
+
params.set('page', String(page));
|
|
106
|
+
if (perPage !== 50)
|
|
107
|
+
params.set('per_page', String(perPage));
|
|
108
|
+
const query = params.toString();
|
|
109
|
+
const shares = await (0, vikunja_rest_1.vikunjaRestRequest)(authManager, 'GET', `/projects/${projectId}/shares${query ? `?${query}` : ''}`);
|
|
110
|
+
const shareList = Array.isArray(shares) ? shares : [];
|
|
111
|
+
const result = (0, response_formatter_1.createProjectResponse)('list_project_shares', `Retrieved ${shareList.length} shares for project ${projectId}`, { shares: shareList }, {
|
|
112
|
+
projectId,
|
|
113
|
+
page,
|
|
114
|
+
perPage,
|
|
115
|
+
count: shareList.length,
|
|
116
|
+
totalShares: shareList.length
|
|
117
|
+
}, verbosity, useOptimizedFormat, useAorp);
|
|
118
|
+
return {
|
|
119
|
+
content: [
|
|
120
|
+
{
|
|
121
|
+
type: 'text',
|
|
122
|
+
text: (0, response_factory_1.formatAorpAsMarkdown)(result.response),
|
|
123
|
+
}
|
|
124
|
+
]
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
catch (error) {
|
|
128
|
+
if (error instanceof types_1.MCPError && error.code === types_1.ErrorCode.VALIDATION_ERROR) {
|
|
129
|
+
throw error;
|
|
130
|
+
}
|
|
131
|
+
rethrowProjectNotFound(error, projectId, 'Failed to list shares');
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Gets a specific link share by ID
|
|
136
|
+
*/
|
|
137
|
+
async function getProjectShare(args, authManager) {
|
|
138
|
+
const { shareId, projectId, verbosity, useOptimizedFormat, useAorp } = args;
|
|
139
|
+
try {
|
|
140
|
+
if (!shareId || typeof shareId !== 'string' || shareId.trim().length === 0) {
|
|
141
|
+
throw new types_1.MCPError(types_1.ErrorCode.VALIDATION_ERROR, 'Share ID must be a non-empty string');
|
|
142
|
+
}
|
|
143
|
+
if (!projectId || typeof projectId !== 'number' || projectId <= 0) {
|
|
144
|
+
throw new types_1.MCPError(types_1.ErrorCode.VALIDATION_ERROR, 'Project ID is required');
|
|
145
|
+
}
|
|
146
|
+
const share = await (0, vikunja_rest_1.vikunjaRestRequest)(authManager, 'GET', `/projects/${projectId}/shares/${Number(shareId)}`);
|
|
147
|
+
const shareDisplayName = share.name || `Share #${shareId}`;
|
|
148
|
+
const result = (0, response_formatter_1.createProjectResponse)('get_project_share', `Retrieved link share: ${shareDisplayName}`, { share }, { shareId }, verbosity, useOptimizedFormat, useAorp);
|
|
149
|
+
return {
|
|
150
|
+
content: [
|
|
151
|
+
{
|
|
152
|
+
type: 'text',
|
|
153
|
+
text: (0, response_factory_1.formatAorpAsMarkdown)(result.response),
|
|
154
|
+
}
|
|
155
|
+
]
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
catch (error) {
|
|
159
|
+
if (error instanceof types_1.MCPError) {
|
|
160
|
+
if (error.details?.statusCode === 404) {
|
|
161
|
+
throw new types_1.MCPError(types_1.ErrorCode.NOT_FOUND, `Share with ID ${shareId} not found for project ${projectId}`);
|
|
162
|
+
}
|
|
163
|
+
throw error;
|
|
164
|
+
}
|
|
165
|
+
throw (0, error_handler_1.transformApiError)(error, 'Failed to get share');
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Deletes a link share
|
|
170
|
+
*/
|
|
171
|
+
async function deleteProjectShare(args, authManager) {
|
|
172
|
+
const { shareId, projectId, verbosity, useOptimizedFormat, useAorp } = args;
|
|
173
|
+
try {
|
|
174
|
+
if (!shareId || typeof shareId !== 'string' || shareId.trim().length === 0) {
|
|
175
|
+
throw new types_1.MCPError(types_1.ErrorCode.VALIDATION_ERROR, 'Share ID must be a non-empty string');
|
|
176
|
+
}
|
|
177
|
+
if (!projectId || typeof projectId !== 'number' || projectId <= 0) {
|
|
178
|
+
throw new types_1.MCPError(types_1.ErrorCode.VALIDATION_ERROR, 'Project ID is required');
|
|
179
|
+
}
|
|
180
|
+
// Get share details before deletion so the response can report the
|
|
181
|
+
// share's name and project id.
|
|
182
|
+
const share = await (0, vikunja_rest_1.vikunjaRestRequest)(authManager, 'GET', `/projects/${projectId}/shares/${Number(shareId)}`);
|
|
183
|
+
await (0, vikunja_rest_1.vikunjaRestRequest)(authManager, 'DELETE', `/projects/${projectId}/shares/${Number(shareId)}`);
|
|
184
|
+
const result = (0, response_formatter_1.createProjectResponse)('delete_project_share', `Share with ID ${shareId} deleted successfully`, {
|
|
185
|
+
deleted: true,
|
|
186
|
+
shareId,
|
|
187
|
+
shareName: share.name,
|
|
188
|
+
projectId,
|
|
189
|
+
}, {
|
|
190
|
+
projectId,
|
|
191
|
+
shareId,
|
|
192
|
+
shareName: share.name
|
|
193
|
+
}, verbosity, useOptimizedFormat, useAorp);
|
|
194
|
+
return {
|
|
195
|
+
content: [
|
|
196
|
+
{
|
|
197
|
+
type: 'text',
|
|
198
|
+
text: (0, response_factory_1.formatAorpAsMarkdown)(result.response),
|
|
199
|
+
}
|
|
200
|
+
]
|
|
201
|
+
};
|
|
202
|
+
}
|
|
203
|
+
catch (error) {
|
|
204
|
+
if (error instanceof types_1.MCPError) {
|
|
205
|
+
if (error.details?.statusCode === 404) {
|
|
206
|
+
throw new types_1.MCPError(types_1.ErrorCode.NOT_FOUND, `Share with ID ${shareId} not found for project ${projectId}`);
|
|
207
|
+
}
|
|
208
|
+
throw error;
|
|
209
|
+
}
|
|
210
|
+
throw (0, error_handler_1.transformApiError)(error, 'Failed to delete share');
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* Authenticates access to a shared project
|
|
215
|
+
*/
|
|
216
|
+
async function authProjectShare(args, authManager) {
|
|
217
|
+
const { shareHash, password, verbosity, useOptimizedFormat, useAorp } = args;
|
|
218
|
+
try {
|
|
219
|
+
if (!shareHash || typeof shareHash !== 'string' || shareHash.trim().length === 0) {
|
|
220
|
+
throw new types_1.MCPError(types_1.ErrorCode.VALIDATION_ERROR, 'Share hash must be a non-empty string');
|
|
221
|
+
}
|
|
222
|
+
// v1.LinkShareAuth: {password}. Unauthenticated endpoint (no share-scoped
|
|
223
|
+
// JWT needed yet — this call obtains one), but vikunjaRestRequest is
|
|
224
|
+
// still used since it uses the same host/breaker/retry plumbing as every
|
|
225
|
+
// other authenticated call; the session's Authorization header is simply
|
|
226
|
+
// unused server-side for this specific route.
|
|
227
|
+
const authResult = await (0, vikunja_rest_1.vikunjaRestRequest)(authManager, 'POST', `/shares/${shareHash}/auth`, { password: password || '' });
|
|
228
|
+
const result = (0, response_formatter_1.createProjectResponse)('auth_project_share', `Successfully authenticated to share`, { auth: authResult }, {
|
|
229
|
+
shareHash,
|
|
230
|
+
hasPassword: !!password,
|
|
231
|
+
authenticated: true
|
|
232
|
+
}, verbosity, useOptimizedFormat, useAorp);
|
|
233
|
+
return {
|
|
234
|
+
content: [
|
|
235
|
+
{
|
|
236
|
+
type: 'text',
|
|
237
|
+
text: (0, response_factory_1.formatAorpAsMarkdown)(result.response),
|
|
238
|
+
}
|
|
239
|
+
]
|
|
240
|
+
};
|
|
241
|
+
}
|
|
242
|
+
catch (error) {
|
|
243
|
+
if (error instanceof types_1.MCPError) {
|
|
244
|
+
if (error.code === types_1.ErrorCode.VALIDATION_ERROR) {
|
|
245
|
+
throw error;
|
|
246
|
+
}
|
|
247
|
+
if (error.details?.statusCode === 401) {
|
|
248
|
+
throw new types_1.MCPError(types_1.ErrorCode.VALIDATION_ERROR, `Invalid password for share`);
|
|
249
|
+
}
|
|
250
|
+
if (error.details?.statusCode === 404) {
|
|
251
|
+
throw new types_1.MCPError(types_1.ErrorCode.NOT_FOUND, `Share with hash ${shareHash} not found`);
|
|
252
|
+
}
|
|
253
|
+
throw error;
|
|
254
|
+
}
|
|
255
|
+
throw (0, error_handler_1.transformApiError)(error, 'Failed to authenticate to share');
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
//# sourceMappingURL=sharing.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sharing.js","sourceRoot":"","sources":["../../../src/tools/projects/sharing.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Project Validation Module
|
|
3
|
+
* Handles all validation logic for project operations
|
|
4
|
+
*/
|
|
5
|
+
import type { components } from '../../types/generated/vikunja-openapi';
|
|
6
|
+
import { validateId as validateSharedId } from '../../utils/validation';
|
|
7
|
+
type Project = components['schemas']['models.Project'];
|
|
8
|
+
/**
|
|
9
|
+
* Maximum allowed depth for project hierarchy to prevent excessive nesting
|
|
10
|
+
*/
|
|
11
|
+
export declare const MAX_PROJECT_DEPTH = 10;
|
|
12
|
+
/**
|
|
13
|
+
* Validates that an ID is a positive integer
|
|
14
|
+
*/
|
|
15
|
+
export declare const validateId: typeof validateSharedId;
|
|
16
|
+
/**
|
|
17
|
+
* Validates that a hex color is in the correct format (#RRGGBB)
|
|
18
|
+
*/
|
|
19
|
+
export declare function validateHexColor(hexColor: string): void;
|
|
20
|
+
/**
|
|
21
|
+
* Calculates the depth of a project in the hierarchy
|
|
22
|
+
*/
|
|
23
|
+
export declare function calculateProjectDepth(projectId: number, allProjects: Project[]): number;
|
|
24
|
+
/**
|
|
25
|
+
* Gets the maximum depth of a project's subtree
|
|
26
|
+
*
|
|
27
|
+
* Cycle detection is path-based (an "ancestors in the current DFS branch"
|
|
28
|
+
* set, popped on backtrack) rather than a single set shared across the
|
|
29
|
+
* whole traversal. A global set would flag legitimate non-cyclic data —
|
|
30
|
+
* e.g. two sibling branches that happen to reach the same (duplicate or
|
|
31
|
+
* corrupted) id — as a false-positive cycle. Path-based detection still
|
|
32
|
+
* catches every genuine cycle: a real cycle always revisits a node that is
|
|
33
|
+
* its own ancestor somewhere along a single branch.
|
|
34
|
+
*/
|
|
35
|
+
export declare function getMaxSubtreeDepth(projectId: number, allProjects: Project[]): number;
|
|
36
|
+
/**
|
|
37
|
+
* Validates move constraints for a project: self-parenting, circular
|
|
38
|
+
* references, and the resulting depth of the moved project's subtree once
|
|
39
|
+
* it is reparented.
|
|
40
|
+
*/
|
|
41
|
+
export declare function validateMoveConstraints(projectId: number, newParentId: number | undefined, allProjects: Project[]): void;
|
|
42
|
+
/**
|
|
43
|
+
* Validates project create/update data
|
|
44
|
+
*/
|
|
45
|
+
export declare function validateProjectData(data: {
|
|
46
|
+
title?: string;
|
|
47
|
+
hexColor?: string;
|
|
48
|
+
parentProjectId?: number;
|
|
49
|
+
}, allProjects?: Project[]): void;
|
|
50
|
+
export {};
|
|
51
|
+
//# sourceMappingURL=validation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../../src/tools/projects/validation.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uCAAuC,CAAC;AACxE,OAAO,EAAE,UAAU,IAAI,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAKxE,KAAK,OAAO,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC,gBAAgB,CAAC,CAAC;AAEvD;;GAEG;AACH,eAAO,MAAM,iBAAiB,KAAK,CAAC;AAEpC;;GAEG;AACH,eAAO,MAAM,UAAU,yBAAmB,CAAC;AAE3C;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAQvD;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,GAAG,MAAM,CAwBvF;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,GAAG,MAAM,CAiCpF;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CACrC,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,GAAG,SAAS,EAC/B,WAAW,EAAE,OAAO,EAAE,GACrB,IAAI,CA+CN;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE;IACxC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B,EAAE,WAAW,CAAC,EAAE,OAAO,EAAE,GAAG,IAAI,CA0ChC"}
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Project Validation Module
|
|
4
|
+
* Handles all validation logic for project operations
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.validateId = exports.MAX_PROJECT_DEPTH = void 0;
|
|
8
|
+
exports.validateHexColor = validateHexColor;
|
|
9
|
+
exports.calculateProjectDepth = calculateProjectDepth;
|
|
10
|
+
exports.getMaxSubtreeDepth = getMaxSubtreeDepth;
|
|
11
|
+
exports.validateMoveConstraints = validateMoveConstraints;
|
|
12
|
+
exports.validateProjectData = validateProjectData;
|
|
13
|
+
const types_1 = require("../../types");
|
|
14
|
+
const validation_1 = require("../../utils/validation");
|
|
15
|
+
/**
|
|
16
|
+
* Maximum allowed depth for project hierarchy to prevent excessive nesting
|
|
17
|
+
*/
|
|
18
|
+
exports.MAX_PROJECT_DEPTH = 10;
|
|
19
|
+
/**
|
|
20
|
+
* Validates that an ID is a positive integer
|
|
21
|
+
*/
|
|
22
|
+
exports.validateId = validation_1.validateId;
|
|
23
|
+
/**
|
|
24
|
+
* Validates that a hex color is in the correct format (#RRGGBB)
|
|
25
|
+
*/
|
|
26
|
+
function validateHexColor(hexColor) {
|
|
27
|
+
// Validates hex color in format #RRGGBB (6 hex digits)
|
|
28
|
+
if (!/^#[0-9A-Fa-f]{6}$/.test(hexColor)) {
|
|
29
|
+
throw new types_1.MCPError(types_1.ErrorCode.VALIDATION_ERROR, 'Invalid hex color format. Expected format: #RRGGBB (e.g., #4287f5, #FF0000, #00ff00)');
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Calculates the depth of a project in the hierarchy
|
|
34
|
+
*/
|
|
35
|
+
function calculateProjectDepth(projectId, allProjects) {
|
|
36
|
+
let depth = 0;
|
|
37
|
+
let currentId = projectId;
|
|
38
|
+
const visitedIds = new Set();
|
|
39
|
+
while (currentId !== undefined) {
|
|
40
|
+
if (visitedIds.has(currentId)) {
|
|
41
|
+
throw new types_1.MCPError(types_1.ErrorCode.INTERNAL_ERROR, 'Circular reference detected in project hierarchy');
|
|
42
|
+
}
|
|
43
|
+
visitedIds.add(currentId);
|
|
44
|
+
const project = allProjects.find((p) => p.id === currentId);
|
|
45
|
+
if (!project) {
|
|
46
|
+
break;
|
|
47
|
+
}
|
|
48
|
+
currentId = typeof project.parent_project_id === 'number' ? project.parent_project_id : undefined;
|
|
49
|
+
depth++;
|
|
50
|
+
}
|
|
51
|
+
return depth;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Gets the maximum depth of a project's subtree
|
|
55
|
+
*
|
|
56
|
+
* Cycle detection is path-based (an "ancestors in the current DFS branch"
|
|
57
|
+
* set, popped on backtrack) rather than a single set shared across the
|
|
58
|
+
* whole traversal. A global set would flag legitimate non-cyclic data —
|
|
59
|
+
* e.g. two sibling branches that happen to reach the same (duplicate or
|
|
60
|
+
* corrupted) id — as a false-positive cycle. Path-based detection still
|
|
61
|
+
* catches every genuine cycle: a real cycle always revisits a node that is
|
|
62
|
+
* its own ancestor somewhere along a single branch.
|
|
63
|
+
*/
|
|
64
|
+
function getMaxSubtreeDepth(projectId, allProjects) {
|
|
65
|
+
function dfs(currentId, currentDepth, path) {
|
|
66
|
+
if (path.has(currentId)) {
|
|
67
|
+
throw new types_1.MCPError(types_1.ErrorCode.INTERNAL_ERROR, 'Circular reference detected in project hierarchy');
|
|
68
|
+
}
|
|
69
|
+
if (currentDepth > exports.MAX_PROJECT_DEPTH) {
|
|
70
|
+
throw new types_1.MCPError(types_1.ErrorCode.VALIDATION_ERROR, `Project hierarchy depth exceeds maximum allowed depth of ${exports.MAX_PROJECT_DEPTH}`);
|
|
71
|
+
}
|
|
72
|
+
path.add(currentId);
|
|
73
|
+
let maxDepth = currentDepth;
|
|
74
|
+
const children = allProjects.filter((p) => p.parent_project_id === currentId);
|
|
75
|
+
for (const child of children) {
|
|
76
|
+
if (child.id === undefined) {
|
|
77
|
+
continue; // Skip children without valid IDs
|
|
78
|
+
}
|
|
79
|
+
const childDepth = dfs(child.id, currentDepth + 1, path);
|
|
80
|
+
maxDepth = Math.max(maxDepth, childDepth);
|
|
81
|
+
}
|
|
82
|
+
path.delete(currentId);
|
|
83
|
+
return maxDepth;
|
|
84
|
+
}
|
|
85
|
+
return dfs(projectId, 0, new Set());
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Validates move constraints for a project: self-parenting, circular
|
|
89
|
+
* references, and the resulting depth of the moved project's subtree once
|
|
90
|
+
* it is reparented.
|
|
91
|
+
*/
|
|
92
|
+
function validateMoveConstraints(projectId, newParentId, allProjects) {
|
|
93
|
+
if (newParentId === projectId) {
|
|
94
|
+
throw new types_1.MCPError(types_1.ErrorCode.VALIDATION_ERROR, 'Cannot move a project to be its own parent');
|
|
95
|
+
}
|
|
96
|
+
// Check if moving would create a circular reference. Reassigning
|
|
97
|
+
// projectId's parent_project_id to newParentId and then walking
|
|
98
|
+
// projectId's own descendants (via child links) will revisit projectId
|
|
99
|
+
// itself if newParentId is one of projectId's descendants — the moved
|
|
100
|
+
// project's own (updated) record shows up as "a child of" whichever node
|
|
101
|
+
// in its old subtree it would now be parented under.
|
|
102
|
+
const updatedProjects = allProjects.map((p) => p.id === projectId ? { ...p, parent_project_id: newParentId } : p);
|
|
103
|
+
let subtreeDepth;
|
|
104
|
+
try {
|
|
105
|
+
subtreeDepth = getMaxSubtreeDepth(projectId, updatedProjects);
|
|
106
|
+
}
|
|
107
|
+
catch (error) {
|
|
108
|
+
if (error instanceof types_1.MCPError && error.code === types_1.ErrorCode.INTERNAL_ERROR) {
|
|
109
|
+
throw new types_1.MCPError(types_1.ErrorCode.VALIDATION_ERROR, 'Move would create a circular reference in project hierarchy');
|
|
110
|
+
}
|
|
111
|
+
throw error;
|
|
112
|
+
}
|
|
113
|
+
// Moving under a new parent can push the project's subtree past the
|
|
114
|
+
// maximum allowed depth even when neither the project's own subtree nor
|
|
115
|
+
// the new parent's ancestor chain is individually too deep. newParentId's
|
|
116
|
+
// depth is computed against the original (pre-move) hierarchy — by this
|
|
117
|
+
// point it's confirmed not to be a descendant of projectId, so it can't
|
|
118
|
+
// have been affected by the reparenting.
|
|
119
|
+
if (newParentId !== undefined) {
|
|
120
|
+
const newParentDepth = calculateProjectDepth(newParentId, allProjects);
|
|
121
|
+
const resultingDepth = newParentDepth + 1 + subtreeDepth;
|
|
122
|
+
if (resultingDepth > exports.MAX_PROJECT_DEPTH) {
|
|
123
|
+
throw new types_1.MCPError(types_1.ErrorCode.VALIDATION_ERROR, `Moving this project would exceed the maximum depth of ${exports.MAX_PROJECT_DEPTH} levels`);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Validates project create/update data
|
|
129
|
+
*/
|
|
130
|
+
function validateProjectData(data, allProjects) {
|
|
131
|
+
if (data.title !== undefined) {
|
|
132
|
+
if (typeof data.title !== 'string' || data.title.trim().length === 0) {
|
|
133
|
+
throw new types_1.MCPError(types_1.ErrorCode.VALIDATION_ERROR, 'Project title must be a non-empty string');
|
|
134
|
+
}
|
|
135
|
+
if (data.title.length > 250) {
|
|
136
|
+
throw new types_1.MCPError(types_1.ErrorCode.VALIDATION_ERROR, 'Project title must not exceed 250 characters');
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
if (data.hexColor !== undefined) {
|
|
140
|
+
validateHexColor(data.hexColor);
|
|
141
|
+
}
|
|
142
|
+
// parentProjectId === 0 is Vikunja's own "no parent / root project"
|
|
143
|
+
// sentinel, never a real project id to validate — the caller-facing Zod
|
|
144
|
+
// schema already enforces `.positive()` for a genuinely *supplied*
|
|
145
|
+
// parentProjectId, so a 0 reaching here only ever comes from
|
|
146
|
+
// updateProject's merge-preserve default (buildProjectUpdatePayload
|
|
147
|
+
// resolving an omitted parentProjectId to the current project's own
|
|
148
|
+
// parent_project_id, which is 0 for a root project — see
|
|
149
|
+
// ENDPOINT-PLAYBOOK.md §4). Treating it as "must be a positive integer
|
|
150
|
+
// AND must exist in allProjects" broke every no-op update of a
|
|
151
|
+
// already-root-level project.
|
|
152
|
+
if (data.parentProjectId !== undefined && data.parentProjectId !== 0 && allProjects) {
|
|
153
|
+
(0, exports.validateId)(data.parentProjectId, 'parentProjectId');
|
|
154
|
+
const parentProject = allProjects.find((p) => p.id === data.parentProjectId);
|
|
155
|
+
if (!parentProject) {
|
|
156
|
+
throw new types_1.MCPError(types_1.ErrorCode.VALIDATION_ERROR, `Parent project with ID ${data.parentProjectId} not found`);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
//# sourceMappingURL=validation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.js","sourceRoot":"","sources":["../../../src/tools/projects/validation.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAwBH,4CAQC;AAKD,sDAwBC;AAaD,gDAiCC;AAOD,0DAmDC;AAKD,kDA8CC;AAtND,uCAAkD;AAElD,uDAAwE;AAOxE;;GAEG;AACU,QAAA,iBAAiB,GAAG,EAAE,CAAC;AAEpC;;GAEG;AACU,QAAA,UAAU,GAAG,uBAAgB,CAAC;AAE3C;;GAEG;AACH,SAAgB,gBAAgB,CAAC,QAAgB;IAC/C,uDAAuD;IACvD,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;QACxC,MAAM,IAAI,gBAAQ,CAChB,iBAAS,CAAC,gBAAgB,EAC1B,sFAAsF,CACvF,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAgB,qBAAqB,CAAC,SAAiB,EAAE,WAAsB;IAC7E,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,SAAS,GAAuB,SAAS,CAAC;IAC9C,MAAM,UAAU,GAAG,IAAI,GAAG,EAAU,CAAC;IAErC,OAAO,SAAS,KAAK,SAAS,EAAE,CAAC;QAC/B,IAAI,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;YAC9B,MAAM,IAAI,gBAAQ,CAChB,iBAAS,CAAC,cAAc,EACxB,kDAAkD,CACnD,CAAC;QACJ,CAAC;QACD,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAE1B,MAAM,OAAO,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,SAAS,CAAC,CAAC;QAC5D,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM;QACR,CAAC;QAED,SAAS,GAAG,OAAO,OAAO,CAAC,iBAAiB,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC,CAAC,SAAS,CAAC;QAClG,KAAK,EAAE,CAAC;IACV,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;;;;;;;GAUG;AACH,SAAgB,kBAAkB,CAAC,SAAiB,EAAE,WAAsB;IAC1E,SAAS,GAAG,CAAC,SAAiB,EAAE,YAAoB,EAAE,IAAiB;QACrE,IAAI,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;YACxB,MAAM,IAAI,gBAAQ,CAChB,iBAAS,CAAC,cAAc,EACxB,kDAAkD,CACnD,CAAC;QACJ,CAAC;QAED,IAAI,YAAY,GAAG,yBAAiB,EAAE,CAAC;YACrC,MAAM,IAAI,gBAAQ,CAChB,iBAAS,CAAC,gBAAgB,EAC1B,4DAA4D,yBAAiB,EAAE,CAChF,CAAC;QACJ,CAAC;QAED,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACpB,IAAI,QAAQ,GAAG,YAAY,CAAC;QAE5B,MAAM,QAAQ,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,iBAAiB,KAAK,SAAS,CAAC,CAAC;QAC9E,KAAK,MAAM,KAAK,IAAI,QAAQ,EAAE,CAAC;YAC7B,IAAI,KAAK,CAAC,EAAE,KAAK,SAAS,EAAE,CAAC;gBAC3B,SAAS,CAAC,kCAAkC;YAC9C,CAAC;YACD,MAAM,UAAU,GAAG,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,YAAY,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC;YACzD,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;QAC5C,CAAC;QAED,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QACvB,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,OAAO,GAAG,CAAC,SAAS,EAAE,CAAC,EAAE,IAAI,GAAG,EAAU,CAAC,CAAC;AAC9C,CAAC;AAED;;;;GAIG;AACH,SAAgB,uBAAuB,CACrC,SAAiB,EACjB,WAA+B,EAC/B,WAAsB;IAEtB,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;QAC9B,MAAM,IAAI,gBAAQ,CAChB,iBAAS,CAAC,gBAAgB,EAC1B,4CAA4C,CAC7C,CAAC;IACJ,CAAC;IAED,iEAAiE;IACjE,gEAAgE;IAChE,uEAAuE;IACvE,sEAAsE;IACtE,yEAAyE;IACzE,qDAAqD;IACrD,MAAM,eAAe,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAC5C,CAAC,CAAC,EAAE,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,iBAAiB,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC,CACrD,CAAC;IAEf,IAAI,YAAoB,CAAC;IACzB,IAAI,CAAC;QACH,YAAY,GAAG,kBAAkB,CAAC,SAAS,EAAE,eAAe,CAAC,CAAC;IAChE,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,gBAAQ,IAAI,KAAK,CAAC,IAAI,KAAK,iBAAS,CAAC,cAAc,EAAE,CAAC;YACzE,MAAM,IAAI,gBAAQ,CAChB,iBAAS,CAAC,gBAAgB,EAC1B,6DAA6D,CAC9D,CAAC;QACJ,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;IAED,oEAAoE;IACpE,wEAAwE;IACxE,0EAA0E;IAC1E,wEAAwE;IACxE,wEAAwE;IACxE,yCAAyC;IACzC,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;QAC9B,MAAM,cAAc,GAAG,qBAAqB,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;QACvE,MAAM,cAAc,GAAG,cAAc,GAAG,CAAC,GAAG,YAAY,CAAC;QACzD,IAAI,cAAc,GAAG,yBAAiB,EAAE,CAAC;YACvC,MAAM,IAAI,gBAAQ,CAChB,iBAAS,CAAC,gBAAgB,EAC1B,yDAAyD,yBAAiB,SAAS,CACpF,CAAC;QACJ,CAAC;IACH,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAgB,mBAAmB,CAAC,IAInC,EAAE,WAAuB;IACxB,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;QAC7B,IAAI,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACrE,MAAM,IAAI,gBAAQ,CAChB,iBAAS,CAAC,gBAAgB,EAC1B,0CAA0C,CAC3C,CAAC;QACJ,CAAC;QAED,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC;YAC5B,MAAM,IAAI,gBAAQ,CAChB,iBAAS,CAAC,gBAAgB,EAC1B,8CAA8C,CAC/C,CAAC;QACJ,CAAC;IACH,CAAC;IAED,IAAI,IAAI,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;QAChC,gBAAgB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAClC,CAAC;IAED,oEAAoE;IACpE,wEAAwE;IACxE,mEAAmE;IACnE,6DAA6D;IAC7D,oEAAoE;IACpE,oEAAoE;IACpE,yDAAyD;IACzD,uEAAuE;IACvE,+DAA+D;IAC/D,8BAA8B;IAC9B,IAAI,IAAI,CAAC,eAAe,KAAK,SAAS,IAAI,IAAI,CAAC,eAAe,KAAK,CAAC,IAAI,WAAW,EAAE,CAAC;QACpF,IAAA,kBAAU,EAAC,IAAI,CAAC,eAAe,EAAE,iBAAiB,CAAC,CAAC;QAEpD,MAAM,aAAa,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,eAAe,CAAC,CAAC;QAC7E,IAAI,CAAC,aAAa,EAAE,CAAC;YACnB,MAAM,IAAI,gBAAQ,CAChB,iBAAS,CAAC,gBAAgB,EAC1B,0BAA0B,IAAI,CAAC,eAAe,YAAY,CAC3D,CAAC;QACJ,CAAC;IACH,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Project view operations
|
|
3
|
+
*
|
|
4
|
+
* Implements `list-views`, `get-view`, `create-view`, `update-view`,
|
|
5
|
+
* `delete-view`, and the `set-done-bucket` composite, against Vikunja's
|
|
6
|
+
* project view endpoints (`/projects/{project}/views[/{id}]`). legacy client
|
|
7
|
+
* has no support for project views at all, so — like `buckets.ts` — this
|
|
8
|
+
* calls the Vikunja REST API directly via the shared `vikunja-rest` helper.
|
|
9
|
+
*
|
|
10
|
+
* `POST /projects/{project}/views/{id}` replaces the entire ProjectView
|
|
11
|
+
* resource (see docs/ENDPOINT-PLAYBOOK.md §4), so `update-view` and
|
|
12
|
+
* `set-done-bucket` both fetch the current view first and merge requested
|
|
13
|
+
* changes onto it (`buildViewUpdatePayload`) rather than sending a bare
|
|
14
|
+
* partial object — the same fetch-merge-POST pattern as
|
|
15
|
+
* `buildProjectUpdatePayload` in `crud.ts`.
|
|
16
|
+
*/
|
|
17
|
+
import type { AuthManager } from '../../auth/AuthManager';
|
|
18
|
+
import type { components } from '../../types/generated/vikunja-openapi';
|
|
19
|
+
type VikunjaProjectView = components['schemas']['models.ProjectView'];
|
|
20
|
+
type ViewKind = 'list' | 'gantt' | 'table' | 'kanban';
|
|
21
|
+
type BucketConfigurationMode = 'none' | 'manual' | 'filter';
|
|
22
|
+
export interface ListViewsArgs {
|
|
23
|
+
/** Project whose views should be listed. */
|
|
24
|
+
id?: number;
|
|
25
|
+
/** Session id for response tracking. */
|
|
26
|
+
sessionId?: string;
|
|
27
|
+
}
|
|
28
|
+
export interface GetViewArgs {
|
|
29
|
+
/** Project the view belongs to. */
|
|
30
|
+
id?: number;
|
|
31
|
+
/** Id of the view to fetch. */
|
|
32
|
+
viewId?: number;
|
|
33
|
+
/** Session id for response tracking. */
|
|
34
|
+
sessionId?: string;
|
|
35
|
+
}
|
|
36
|
+
export interface CreateViewArgs {
|
|
37
|
+
/** Project the new view should belong to. */
|
|
38
|
+
id?: number;
|
|
39
|
+
/** Title of the new view. */
|
|
40
|
+
title?: string;
|
|
41
|
+
/** Kind of view to create (`list`, `gantt`, `table`, or `kanban`). */
|
|
42
|
+
viewKind?: ViewKind;
|
|
43
|
+
/** Bucket configuration mode. Only meaningful for kanban-style views. */
|
|
44
|
+
bucketConfigurationMode?: BucketConfigurationMode;
|
|
45
|
+
/** Session id for response tracking. */
|
|
46
|
+
sessionId?: string;
|
|
47
|
+
}
|
|
48
|
+
export interface UpdateViewArgs {
|
|
49
|
+
/** Project the view belongs to. */
|
|
50
|
+
id?: number;
|
|
51
|
+
/** Id of the view to update. */
|
|
52
|
+
viewId?: number;
|
|
53
|
+
/** New title, if changing. */
|
|
54
|
+
title?: string;
|
|
55
|
+
/** New view kind, if changing. */
|
|
56
|
+
viewKind?: ViewKind;
|
|
57
|
+
/** New bucket configuration mode, if changing. */
|
|
58
|
+
bucketConfigurationMode?: BucketConfigurationMode;
|
|
59
|
+
/** New done-bucket id, if changing. Also settable via `set-done-bucket`. */
|
|
60
|
+
doneBucketId?: number;
|
|
61
|
+
/** New default-bucket id, if changing. */
|
|
62
|
+
defaultBucketId?: number;
|
|
63
|
+
/** Session id for response tracking. */
|
|
64
|
+
sessionId?: string;
|
|
65
|
+
}
|
|
66
|
+
export interface DeleteViewArgs {
|
|
67
|
+
/** Project the view belongs to. */
|
|
68
|
+
id?: number;
|
|
69
|
+
/** Id of the view to delete. */
|
|
70
|
+
viewId?: number;
|
|
71
|
+
/** Session id for response tracking. */
|
|
72
|
+
sessionId?: string;
|
|
73
|
+
}
|
|
74
|
+
export interface SetDoneBucketArgs {
|
|
75
|
+
/** Project whose Kanban view's done bucket should be set. */
|
|
76
|
+
id?: number;
|
|
77
|
+
/** Optional Kanban view id. Auto-resolved from the project when omitted. */
|
|
78
|
+
viewId?: number;
|
|
79
|
+
/** Id of the bucket that should become the done bucket. */
|
|
80
|
+
bucketId?: number;
|
|
81
|
+
/** Session id for response tracking. */
|
|
82
|
+
sessionId?: string;
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Builds a project view update payload by merging the current view with
|
|
86
|
+
* requested field changes, so fields the caller didn't mention survive the
|
|
87
|
+
* full-model-replace `POST /projects/{project}/views/{id}` round trip.
|
|
88
|
+
*/
|
|
89
|
+
export declare function buildViewUpdatePayload(currentView: VikunjaProjectView, updates: {
|
|
90
|
+
title?: string;
|
|
91
|
+
viewKind?: ViewKind;
|
|
92
|
+
bucketConfigurationMode?: BucketConfigurationMode;
|
|
93
|
+
doneBucketId?: number;
|
|
94
|
+
defaultBucketId?: number;
|
|
95
|
+
}): VikunjaProjectView;
|
|
96
|
+
/**
|
|
97
|
+
* Lists the views of a project.
|
|
98
|
+
*/
|
|
99
|
+
export declare function listViews(args: ListViewsArgs, authManager: AuthManager): Promise<{
|
|
100
|
+
content: Array<{
|
|
101
|
+
type: 'text';
|
|
102
|
+
text: string;
|
|
103
|
+
}>;
|
|
104
|
+
}>;
|
|
105
|
+
/**
|
|
106
|
+
* Gets a single project view by id.
|
|
107
|
+
*/
|
|
108
|
+
export declare function getView(args: GetViewArgs, authManager: AuthManager): Promise<{
|
|
109
|
+
content: Array<{
|
|
110
|
+
type: 'text';
|
|
111
|
+
text: string;
|
|
112
|
+
}>;
|
|
113
|
+
}>;
|
|
114
|
+
/**
|
|
115
|
+
* Creates a new view on a project.
|
|
116
|
+
*/
|
|
117
|
+
export declare function createView(args: CreateViewArgs, authManager: AuthManager): Promise<{
|
|
118
|
+
content: Array<{
|
|
119
|
+
type: 'text';
|
|
120
|
+
text: string;
|
|
121
|
+
}>;
|
|
122
|
+
}>;
|
|
123
|
+
/**
|
|
124
|
+
* Updates a project view. `POST /projects/{project}/views/{id}` is a
|
|
125
|
+
* full-model-replace endpoint, so the current view is fetched first and
|
|
126
|
+
* merged with the requested changes (see `buildViewUpdatePayload`).
|
|
127
|
+
*/
|
|
128
|
+
export declare function updateView(args: UpdateViewArgs, authManager: AuthManager): Promise<{
|
|
129
|
+
content: Array<{
|
|
130
|
+
type: 'text';
|
|
131
|
+
text: string;
|
|
132
|
+
}>;
|
|
133
|
+
}>;
|
|
134
|
+
/**
|
|
135
|
+
* Deletes a project view.
|
|
136
|
+
*/
|
|
137
|
+
export declare function deleteView(args: DeleteViewArgs, authManager: AuthManager): Promise<{
|
|
138
|
+
content: Array<{
|
|
139
|
+
type: 'text';
|
|
140
|
+
text: string;
|
|
141
|
+
}>;
|
|
142
|
+
}>;
|
|
143
|
+
/**
|
|
144
|
+
* Composite: sets a Kanban view's done bucket.
|
|
145
|
+
*
|
|
146
|
+
* `models.Bucket` has no `is_done_bucket` field of its own (see
|
|
147
|
+
* docs/API_NOTES.md "Kanban 'Done' Bucket") — the done bucket is a property
|
|
148
|
+
* of the ProjectView (`done_bucket_id`), not the bucket. This is the only
|
|
149
|
+
* way to *set* it (list-buckets can only read it). Steps: resolve the
|
|
150
|
+
* project's Kanban view (or use an explicit `viewId`), fetch-merge-POST the
|
|
151
|
+
* `done_bucket_id` change onto it, then verify the response reflects the
|
|
152
|
+
* requested bucket before reporting success.
|
|
153
|
+
*/
|
|
154
|
+
export declare function setDoneBucket(args: SetDoneBucketArgs, authManager: AuthManager): Promise<{
|
|
155
|
+
content: Array<{
|
|
156
|
+
type: 'text';
|
|
157
|
+
text: string;
|
|
158
|
+
}>;
|
|
159
|
+
}>;
|
|
160
|
+
export {};
|
|
161
|
+
//# sourceMappingURL=views.d.ts.map
|