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.
Files changed (582) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +123 -0
  3. package/dist/auth/AuthManager.d.ts +63 -0
  4. package/dist/auth/AuthManager.d.ts.map +1 -0
  5. package/dist/auth/AuthManager.js +137 -0
  6. package/dist/auth/AuthManager.js.map +1 -0
  7. package/dist/auth/index.d.ts +7 -0
  8. package/dist/auth/index.d.ts.map +1 -0
  9. package/dist/auth/index.js +14 -0
  10. package/dist/auth/index.js.map +1 -0
  11. package/dist/auth/permissions.d.ts +60 -0
  12. package/dist/auth/permissions.d.ts.map +1 -0
  13. package/dist/auth/permissions.js +173 -0
  14. package/dist/auth/permissions.js.map +1 -0
  15. package/dist/client/VikunjaClientFactory.d.ts +41 -0
  16. package/dist/client/VikunjaClientFactory.d.ts.map +1 -0
  17. package/dist/client/VikunjaClientFactory.js +58 -0
  18. package/dist/client/VikunjaClientFactory.js.map +1 -0
  19. package/dist/client.d.ts +70 -0
  20. package/dist/client.d.ts.map +1 -0
  21. package/dist/client.js +136 -0
  22. package/dist/client.js.map +1 -0
  23. package/dist/config/ConfigurationManager.d.ts +106 -0
  24. package/dist/config/ConfigurationManager.d.ts.map +1 -0
  25. package/dist/config/ConfigurationManager.js +509 -0
  26. package/dist/config/ConfigurationManager.js.map +1 -0
  27. package/dist/config/index.d.ts +9 -0
  28. package/dist/config/index.d.ts.map +1 -0
  29. package/dist/config/index.js +36 -0
  30. package/dist/config/index.js.map +1 -0
  31. package/dist/config/secrets.d.ts +33 -0
  32. package/dist/config/secrets.d.ts.map +1 -0
  33. package/dist/config/secrets.js +90 -0
  34. package/dist/config/secrets.js.map +1 -0
  35. package/dist/config/types.d.ts +1113 -0
  36. package/dist/config/types.d.ts.map +1 -0
  37. package/dist/config/types.js +189 -0
  38. package/dist/config/types.js.map +1 -0
  39. package/dist/formatters/BatchImportResponseFormatter.d.ts +89 -0
  40. package/dist/formatters/BatchImportResponseFormatter.d.ts.map +1 -0
  41. package/dist/formatters/BatchImportResponseFormatter.js +125 -0
  42. package/dist/formatters/BatchImportResponseFormatter.js.map +1 -0
  43. package/dist/index.d.ts +20 -0
  44. package/dist/index.d.ts.map +1 -0
  45. package/dist/index.js +130 -0
  46. package/dist/index.js.map +1 -0
  47. package/dist/middleware/direct-middleware.d.ts +9 -0
  48. package/dist/middleware/direct-middleware.d.ts.map +1 -0
  49. package/dist/middleware/direct-middleware.js +49 -0
  50. package/dist/middleware/direct-middleware.js.map +1 -0
  51. package/dist/middleware/index.d.ts +8 -0
  52. package/dist/middleware/index.d.ts.map +1 -0
  53. package/dist/middleware/index.js +21 -0
  54. package/dist/middleware/index.js.map +1 -0
  55. package/dist/middleware/simplified-rate-limit.d.ts +147 -0
  56. package/dist/middleware/simplified-rate-limit.d.ts.map +1 -0
  57. package/dist/middleware/simplified-rate-limit.js +533 -0
  58. package/dist/middleware/simplified-rate-limit.js.map +1 -0
  59. package/dist/parsers/CSVParser.d.ts +36 -0
  60. package/dist/parsers/CSVParser.d.ts.map +1 -0
  61. package/dist/parsers/CSVParser.js +69 -0
  62. package/dist/parsers/CSVParser.js.map +1 -0
  63. package/dist/parsers/InputParserFactory.d.ts +17 -0
  64. package/dist/parsers/InputParserFactory.d.ts.map +1 -0
  65. package/dist/parsers/InputParserFactory.js +137 -0
  66. package/dist/parsers/InputParserFactory.js.map +1 -0
  67. package/dist/parsers/JSONParser.d.ts +74 -0
  68. package/dist/parsers/JSONParser.d.ts.map +1 -0
  69. package/dist/parsers/JSONParser.js +69 -0
  70. package/dist/parsers/JSONParser.js.map +1 -0
  71. package/dist/services/EntityResolver.d.ts +92 -0
  72. package/dist/services/EntityResolver.d.ts.map +1 -0
  73. package/dist/services/EntityResolver.js +201 -0
  74. package/dist/services/EntityResolver.js.map +1 -0
  75. package/dist/services/TaskCreationService.d.ts +99 -0
  76. package/dist/services/TaskCreationService.d.ts.map +1 -0
  77. package/dist/services/TaskCreationService.js +392 -0
  78. package/dist/services/TaskCreationService.js.map +1 -0
  79. package/dist/storage/SimpleFilterStorage.d.ts +103 -0
  80. package/dist/storage/SimpleFilterStorage.d.ts.map +1 -0
  81. package/dist/storage/SimpleFilterStorage.js +350 -0
  82. package/dist/storage/SimpleFilterStorage.js.map +1 -0
  83. package/dist/storage/filtering/FilterSerializer.d.ts +45 -0
  84. package/dist/storage/filtering/FilterSerializer.d.ts.map +1 -0
  85. package/dist/storage/filtering/FilterSerializer.js +171 -0
  86. package/dist/storage/filtering/FilterSerializer.js.map +1 -0
  87. package/dist/storage/filtering/FilterValidator.d.ts +59 -0
  88. package/dist/storage/filtering/FilterValidator.d.ts.map +1 -0
  89. package/dist/storage/filtering/FilterValidator.js +183 -0
  90. package/dist/storage/filtering/FilterValidator.js.map +1 -0
  91. package/dist/storage/index.d.ts +61 -0
  92. package/dist/storage/index.d.ts.map +1 -0
  93. package/dist/storage/index.js +125 -0
  94. package/dist/storage/index.js.map +1 -0
  95. package/dist/storage/templateFileStore.d.ts +62 -0
  96. package/dist/storage/templateFileStore.d.ts.map +1 -0
  97. package/dist/storage/templateFileStore.js +151 -0
  98. package/dist/storage/templateFileStore.js.map +1 -0
  99. package/dist/tools/admin.d.ts +51 -0
  100. package/dist/tools/admin.d.ts.map +1 -0
  101. package/dist/tools/admin.js +207 -0
  102. package/dist/tools/admin.js.map +1 -0
  103. package/dist/tools/auth.d.ts +9 -0
  104. package/dist/tools/auth.d.ts.map +1 -0
  105. package/dist/tools/auth.js +175 -0
  106. package/dist/tools/auth.js.map +1 -0
  107. package/dist/tools/batch-import.d.ts +5 -0
  108. package/dist/tools/batch-import.d.ts.map +1 -0
  109. package/dist/tools/batch-import.js +153 -0
  110. package/dist/tools/batch-import.js.map +1 -0
  111. package/dist/tools/caldav-tokens.d.ts +45 -0
  112. package/dist/tools/caldav-tokens.d.ts.map +1 -0
  113. package/dist/tools/caldav-tokens.js +93 -0
  114. package/dist/tools/caldav-tokens.js.map +1 -0
  115. package/dist/tools/export.d.ts +14 -0
  116. package/dist/tools/export.d.ts.map +1 -0
  117. package/dist/tools/export.js +252 -0
  118. package/dist/tools/export.js.map +1 -0
  119. package/dist/tools/filters.d.ts +50 -0
  120. package/dist/tools/filters.d.ts.map +1 -0
  121. package/dist/tools/filters.js +512 -0
  122. package/dist/tools/filters.js.map +1 -0
  123. package/dist/tools/index.d.ts +53 -0
  124. package/dist/tools/index.d.ts.map +1 -0
  125. package/dist/tools/index.js +217 -0
  126. package/dist/tools/index.js.map +1 -0
  127. package/dist/tools/labels.d.ts +22 -0
  128. package/dist/tools/labels.d.ts.map +1 -0
  129. package/dist/tools/labels.js +206 -0
  130. package/dist/tools/labels.js.map +1 -0
  131. package/dist/tools/notifications.d.ts +17 -0
  132. package/dist/tools/notifications.d.ts.map +1 -0
  133. package/dist/tools/notifications.js +171 -0
  134. package/dist/tools/notifications.js.map +1 -0
  135. package/dist/tools/projects/backgrounds.d.ts +80 -0
  136. package/dist/tools/projects/backgrounds.d.ts.map +1 -0
  137. package/dist/tools/projects/backgrounds.js +154 -0
  138. package/dist/tools/projects/backgrounds.js.map +1 -0
  139. package/dist/tools/projects/buckets.d.ts +147 -0
  140. package/dist/tools/projects/buckets.d.ts.map +1 -0
  141. package/dist/tools/projects/buckets.js +291 -0
  142. package/dist/tools/projects/buckets.js.map +1 -0
  143. package/dist/tools/projects/crud.d.ts +145 -0
  144. package/dist/tools/projects/crud.d.ts.map +1 -0
  145. package/dist/tools/projects/crud.js +425 -0
  146. package/dist/tools/projects/crud.js.map +1 -0
  147. package/dist/tools/projects/duplicate.d.ts +41 -0
  148. package/dist/tools/projects/duplicate.d.ts.map +1 -0
  149. package/dist/tools/projects/duplicate.js +49 -0
  150. package/dist/tools/projects/duplicate.js.map +1 -0
  151. package/dist/tools/projects/hierarchy.d.ts +77 -0
  152. package/dist/tools/projects/hierarchy.d.ts.map +1 -0
  153. package/dist/tools/projects/hierarchy.js +300 -0
  154. package/dist/tools/projects/hierarchy.js.map +1 -0
  155. package/dist/tools/projects/index.d.ts +34 -0
  156. package/dist/tools/projects/index.d.ts.map +1 -0
  157. package/dist/tools/projects/index.js +522 -0
  158. package/dist/tools/projects/index.js.map +1 -0
  159. package/dist/tools/projects/permission.d.ts +26 -0
  160. package/dist/tools/projects/permission.d.ts.map +1 -0
  161. package/dist/tools/projects/permission.js +53 -0
  162. package/dist/tools/projects/permission.js.map +1 -0
  163. package/dist/tools/projects/response-formatter.d.ts +54 -0
  164. package/dist/tools/projects/response-formatter.d.ts.map +1 -0
  165. package/dist/tools/projects/response-formatter.js +139 -0
  166. package/dist/tools/projects/response-formatter.js.map +1 -0
  167. package/dist/tools/projects/sharing-access.d.ts +165 -0
  168. package/dist/tools/projects/sharing-access.d.ts.map +1 -0
  169. package/dist/tools/projects/sharing-access.js +450 -0
  170. package/dist/tools/projects/sharing-access.js.map +1 -0
  171. package/dist/tools/projects/sharing.d.ts +105 -0
  172. package/dist/tools/projects/sharing.d.ts.map +1 -0
  173. package/dist/tools/projects/sharing.js +258 -0
  174. package/dist/tools/projects/sharing.js.map +1 -0
  175. package/dist/tools/projects/validation.d.ts +51 -0
  176. package/dist/tools/projects/validation.d.ts.map +1 -0
  177. package/dist/tools/projects/validation.js +160 -0
  178. package/dist/tools/projects/validation.js.map +1 -0
  179. package/dist/tools/projects/views.d.ts +161 -0
  180. package/dist/tools/projects/views.d.ts.map +1 -0
  181. package/dist/tools/projects/views.js +234 -0
  182. package/dist/tools/projects/views.js.map +1 -0
  183. package/dist/tools/projects.d.ts +20 -0
  184. package/dist/tools/projects.d.ts.map +1 -0
  185. package/dist/tools/projects.js +66 -0
  186. package/dist/tools/projects.js.map +1 -0
  187. package/dist/tools/reactions.d.ts +25 -0
  188. package/dist/tools/reactions.d.ts.map +1 -0
  189. package/dist/tools/reactions.js +108 -0
  190. package/dist/tools/reactions.js.map +1 -0
  191. package/dist/tools/subscriptions.d.ts +23 -0
  192. package/dist/tools/subscriptions.d.ts.map +1 -0
  193. package/dist/tools/subscriptions.js +111 -0
  194. package/dist/tools/subscriptions.js.map +1 -0
  195. package/dist/tools/task-assignees.d.ts +13 -0
  196. package/dist/tools/task-assignees.d.ts.map +1 -0
  197. package/dist/tools/task-assignees.js +74 -0
  198. package/dist/tools/task-assignees.js.map +1 -0
  199. package/dist/tools/task-bulk.d.ts +13 -0
  200. package/dist/tools/task-bulk.d.ts.map +1 -0
  201. package/dist/tools/task-bulk.js +117 -0
  202. package/dist/tools/task-bulk.js.map +1 -0
  203. package/dist/tools/task-comments.d.ts +12 -0
  204. package/dist/tools/task-comments.d.ts.map +1 -0
  205. package/dist/tools/task-comments.js +65 -0
  206. package/dist/tools/task-comments.js.map +1 -0
  207. package/dist/tools/task-crud.d.ts +13 -0
  208. package/dist/tools/task-crud.d.ts.map +1 -0
  209. package/dist/tools/task-crud.js +168 -0
  210. package/dist/tools/task-crud.js.map +1 -0
  211. package/dist/tools/task-labels.d.ts +13 -0
  212. package/dist/tools/task-labels.d.ts.map +1 -0
  213. package/dist/tools/task-labels.js +64 -0
  214. package/dist/tools/task-labels.js.map +1 -0
  215. package/dist/tools/task-relations.d.ts +13 -0
  216. package/dist/tools/task-relations.d.ts.map +1 -0
  217. package/dist/tools/task-relations.js +74 -0
  218. package/dist/tools/task-relations.js.map +1 -0
  219. package/dist/tools/task-reminders.d.ts +13 -0
  220. package/dist/tools/task-reminders.d.ts.map +1 -0
  221. package/dist/tools/task-reminders.js +69 -0
  222. package/dist/tools/task-reminders.js.map +1 -0
  223. package/dist/tools/tasks/assignees/AssigneeOperationsService.d.ts +63 -0
  224. package/dist/tools/tasks/assignees/AssigneeOperationsService.d.ts.map +1 -0
  225. package/dist/tools/tasks/assignees/AssigneeOperationsService.js +152 -0
  226. package/dist/tools/tasks/assignees/AssigneeOperationsService.js.map +1 -0
  227. package/dist/tools/tasks/assignees/AssigneeResponseFormatter.d.ts +28 -0
  228. package/dist/tools/tasks/assignees/AssigneeResponseFormatter.d.ts.map +1 -0
  229. package/dist/tools/tasks/assignees/AssigneeResponseFormatter.js +73 -0
  230. package/dist/tools/tasks/assignees/AssigneeResponseFormatter.js.map +1 -0
  231. package/dist/tools/tasks/assignees/AssigneeValidationService.d.ts +46 -0
  232. package/dist/tools/tasks/assignees/AssigneeValidationService.d.ts.map +1 -0
  233. package/dist/tools/tasks/assignees/AssigneeValidationService.js +70 -0
  234. package/dist/tools/tasks/assignees/AssigneeValidationService.js.map +1 -0
  235. package/dist/tools/tasks/assignees/index.d.ts +52 -0
  236. package/dist/tools/tasks/assignees/index.d.ts.map +1 -0
  237. package/dist/tools/tasks/assignees/index.js +103 -0
  238. package/dist/tools/tasks/assignees/index.js.map +1 -0
  239. package/dist/tools/tasks/attach.d.ts +39 -0
  240. package/dist/tools/tasks/attach.d.ts.map +1 -0
  241. package/dist/tools/tasks/attach.js +90 -0
  242. package/dist/tools/tasks/attach.js.map +1 -0
  243. package/dist/tools/tasks/attachments.d.ts +67 -0
  244. package/dist/tools/tasks/attachments.d.ts.map +1 -0
  245. package/dist/tools/tasks/attachments.js +153 -0
  246. package/dist/tools/tasks/attachments.js.map +1 -0
  247. package/dist/tools/tasks/buckets.d.ts +41 -0
  248. package/dist/tools/tasks/buckets.d.ts.map +1 -0
  249. package/dist/tools/tasks/buckets.js +75 -0
  250. package/dist/tools/tasks/buckets.js.map +1 -0
  251. package/dist/tools/tasks/bulk/BatchProcessorFactory.d.ts +30 -0
  252. package/dist/tools/tasks/bulk/BatchProcessorFactory.d.ts.map +1 -0
  253. package/dist/tools/tasks/bulk/BatchProcessorFactory.js +69 -0
  254. package/dist/tools/tasks/bulk/BatchProcessorFactory.js.map +1 -0
  255. package/dist/tools/tasks/bulk/BulkOperationErrorHandler.d.ts +50 -0
  256. package/dist/tools/tasks/bulk/BulkOperationErrorHandler.d.ts.map +1 -0
  257. package/dist/tools/tasks/bulk/BulkOperationErrorHandler.js +183 -0
  258. package/dist/tools/tasks/bulk/BulkOperationErrorHandler.js.map +1 -0
  259. package/dist/tools/tasks/bulk/BulkOperationProcessor.d.ts +101 -0
  260. package/dist/tools/tasks/bulk/BulkOperationProcessor.d.ts.map +1 -0
  261. package/dist/tools/tasks/bulk/BulkOperationProcessor.js +416 -0
  262. package/dist/tools/tasks/bulk/BulkOperationProcessor.js.map +1 -0
  263. package/dist/tools/tasks/bulk/BulkOperationTypes.d.ts +50 -0
  264. package/dist/tools/tasks/bulk/BulkOperationTypes.d.ts.map +1 -0
  265. package/dist/tools/tasks/bulk/BulkOperationTypes.js +6 -0
  266. package/dist/tools/tasks/bulk/BulkOperationTypes.js.map +1 -0
  267. package/dist/tools/tasks/bulk/BulkOperationValidator.d.ts +53 -0
  268. package/dist/tools/tasks/bulk/BulkOperationValidator.d.ts.map +1 -0
  269. package/dist/tools/tasks/bulk/BulkOperationValidator.js +216 -0
  270. package/dist/tools/tasks/bulk/BulkOperationValidator.js.map +1 -0
  271. package/dist/tools/tasks/bulk/index.d.ts +9 -0
  272. package/dist/tools/tasks/bulk/index.d.ts.map +1 -0
  273. package/dist/tools/tasks/bulk/index.js +15 -0
  274. package/dist/tools/tasks/bulk/index.js.map +1 -0
  275. package/dist/tools/tasks/bulk-operations-simplified.d.ts +62 -0
  276. package/dist/tools/tasks/bulk-operations-simplified.d.ts.map +1 -0
  277. package/dist/tools/tasks/bulk-operations-simplified.js +416 -0
  278. package/dist/tools/tasks/bulk-operations-simplified.js.map +1 -0
  279. package/dist/tools/tasks/bulk-operations.d.ts +8 -0
  280. package/dist/tools/tasks/bulk-operations.d.ts.map +1 -0
  281. package/dist/tools/tasks/bulk-operations.js +13 -0
  282. package/dist/tools/tasks/bulk-operations.js.map +1 -0
  283. package/dist/tools/tasks/by-index.d.ts +36 -0
  284. package/dist/tools/tasks/by-index.d.ts.map +1 -0
  285. package/dist/tools/tasks/by-index.js +52 -0
  286. package/dist/tools/tasks/by-index.js.map +1 -0
  287. package/dist/tools/tasks/comments/CommentOperationsService.d.ts +44 -0
  288. package/dist/tools/tasks/comments/CommentOperationsService.d.ts.map +1 -0
  289. package/dist/tools/tasks/comments/CommentOperationsService.js +86 -0
  290. package/dist/tools/tasks/comments/CommentOperationsService.js.map +1 -0
  291. package/dist/tools/tasks/comments/CommentResponseFormatter.d.ts +41 -0
  292. package/dist/tools/tasks/comments/CommentResponseFormatter.d.ts.map +1 -0
  293. package/dist/tools/tasks/comments/CommentResponseFormatter.js +114 -0
  294. package/dist/tools/tasks/comments/CommentResponseFormatter.js.map +1 -0
  295. package/dist/tools/tasks/comments/CommentValidationService.d.ts +62 -0
  296. package/dist/tools/tasks/comments/CommentValidationService.d.ts.map +1 -0
  297. package/dist/tools/tasks/comments/CommentValidationService.js +105 -0
  298. package/dist/tools/tasks/comments/CommentValidationService.js.map +1 -0
  299. package/dist/tools/tasks/comments/index.d.ts +66 -0
  300. package/dist/tools/tasks/comments/index.d.ts.map +1 -0
  301. package/dist/tools/tasks/comments/index.js +99 -0
  302. package/dist/tools/tasks/comments/index.js.map +1 -0
  303. package/dist/tools/tasks/constants.d.ts +19 -0
  304. package/dist/tools/tasks/constants.d.ts.map +1 -0
  305. package/dist/tools/tasks/constants.js +82 -0
  306. package/dist/tools/tasks/constants.js.map +1 -0
  307. package/dist/tools/tasks/crud/TaskCreationService.d.ts +29 -0
  308. package/dist/tools/tasks/crud/TaskCreationService.d.ts.map +1 -0
  309. package/dist/tools/tasks/crud/TaskCreationService.js +274 -0
  310. package/dist/tools/tasks/crud/TaskCreationService.js.map +1 -0
  311. package/dist/tools/tasks/crud/TaskDeletionService.d.ts +19 -0
  312. package/dist/tools/tasks/crud/TaskDeletionService.d.ts.map +1 -0
  313. package/dist/tools/tasks/crud/TaskDeletionService.js +96 -0
  314. package/dist/tools/tasks/crud/TaskDeletionService.js.map +1 -0
  315. package/dist/tools/tasks/crud/TaskReadService.d.ts +19 -0
  316. package/dist/tools/tasks/crud/TaskReadService.d.ts.map +1 -0
  317. package/dist/tools/tasks/crud/TaskReadService.js +66 -0
  318. package/dist/tools/tasks/crud/TaskReadService.js.map +1 -0
  319. package/dist/tools/tasks/crud/TaskResponseFormatter.d.ts +18 -0
  320. package/dist/tools/tasks/crud/TaskResponseFormatter.d.ts.map +1 -0
  321. package/dist/tools/tasks/crud/TaskResponseFormatter.js +248 -0
  322. package/dist/tools/tasks/crud/TaskResponseFormatter.js.map +1 -0
  323. package/dist/tools/tasks/crud/TaskUpdateService.d.ts +33 -0
  324. package/dist/tools/tasks/crud/TaskUpdateService.d.ts.map +1 -0
  325. package/dist/tools/tasks/crud/TaskUpdateService.js +294 -0
  326. package/dist/tools/tasks/crud/TaskUpdateService.js.map +1 -0
  327. package/dist/tools/tasks/crud/index.d.ts +17 -0
  328. package/dist/tools/tasks/crud/index.d.ts.map +1 -0
  329. package/dist/tools/tasks/crud/index.js +20 -0
  330. package/dist/tools/tasks/crud/index.js.map +1 -0
  331. package/dist/tools/tasks/duplicate.d.ts +28 -0
  332. package/dist/tools/tasks/duplicate.d.ts.map +1 -0
  333. package/dist/tools/tasks/duplicate.js +41 -0
  334. package/dist/tools/tasks/duplicate.js.map +1 -0
  335. package/dist/tools/tasks/filtering/FilterExecutor.d.ts +39 -0
  336. package/dist/tools/tasks/filtering/FilterExecutor.d.ts.map +1 -0
  337. package/dist/tools/tasks/filtering/FilterExecutor.js +214 -0
  338. package/dist/tools/tasks/filtering/FilterExecutor.js.map +1 -0
  339. package/dist/tools/tasks/filtering/FilterValidator.d.ts +59 -0
  340. package/dist/tools/tasks/filtering/FilterValidator.d.ts.map +1 -0
  341. package/dist/tools/tasks/filtering/FilterValidator.js +257 -0
  342. package/dist/tools/tasks/filtering/FilterValidator.js.map +1 -0
  343. package/dist/tools/tasks/filtering/TaskFilteringOrchestrator.d.ts +78 -0
  344. package/dist/tools/tasks/filtering/TaskFilteringOrchestrator.d.ts.map +1 -0
  345. package/dist/tools/tasks/filtering/TaskFilteringOrchestrator.js +195 -0
  346. package/dist/tools/tasks/filtering/TaskFilteringOrchestrator.js.map +1 -0
  347. package/dist/tools/tasks/filtering/evaluators.d.ts +41 -0
  348. package/dist/tools/tasks/filtering/evaluators.d.ts.map +1 -0
  349. package/dist/tools/tasks/filtering/evaluators.js +224 -0
  350. package/dist/tools/tasks/filtering/evaluators.js.map +1 -0
  351. package/dist/tools/tasks/filtering/index.d.ts +11 -0
  352. package/dist/tools/tasks/filtering/index.d.ts.map +1 -0
  353. package/dist/tools/tasks/filtering/index.js +26 -0
  354. package/dist/tools/tasks/filtering/index.js.map +1 -0
  355. package/dist/tools/tasks/index.d.ts +9 -0
  356. package/dist/tools/tasks/index.d.ts.map +1 -0
  357. package/dist/tools/tasks/index.js +337 -0
  358. package/dist/tools/tasks/index.js.map +1 -0
  359. package/dist/tools/tasks/labels.d.ts +49 -0
  360. package/dist/tools/tasks/labels.d.ts.map +1 -0
  361. package/dist/tools/tasks/labels.js +223 -0
  362. package/dist/tools/tasks/labels.js.map +1 -0
  363. package/dist/tools/tasks/mark-read.d.ts +27 -0
  364. package/dist/tools/tasks/mark-read.d.ts.map +1 -0
  365. package/dist/tools/tasks/mark-read.js +38 -0
  366. package/dist/tools/tasks/mark-read.js.map +1 -0
  367. package/dist/tools/tasks/position.d.ts +53 -0
  368. package/dist/tools/tasks/position.d.ts.map +1 -0
  369. package/dist/tools/tasks/position.js +83 -0
  370. package/dist/tools/tasks/position.js.map +1 -0
  371. package/dist/tools/tasks/reminders.d.ts +56 -0
  372. package/dist/tools/tasks/reminders.d.ts.map +1 -0
  373. package/dist/tools/tasks/reminders.js +213 -0
  374. package/dist/tools/tasks/reminders.js.map +1 -0
  375. package/dist/tools/tasks/subtasks.d.ts +85 -0
  376. package/dist/tools/tasks/subtasks.d.ts.map +1 -0
  377. package/dist/tools/tasks/subtasks.js +286 -0
  378. package/dist/tools/tasks/subtasks.js.map +1 -0
  379. package/dist/tools/tasks/types/filters.d.ts +136 -0
  380. package/dist/tools/tasks/types/filters.d.ts.map +1 -0
  381. package/dist/tools/tasks/types/filters.js +7 -0
  382. package/dist/tools/tasks/types/filters.js.map +1 -0
  383. package/dist/tools/tasks/validation.d.ts +47 -0
  384. package/dist/tools/tasks/validation.d.ts.map +1 -0
  385. package/dist/tools/tasks/validation.js +131 -0
  386. package/dist/tools/tasks/validation.js.map +1 -0
  387. package/dist/tools/tasks-relations.d.ts +25 -0
  388. package/dist/tools/tasks-relations.d.ts.map +1 -0
  389. package/dist/tools/tasks-relations.js +271 -0
  390. package/dist/tools/tasks-relations.js.map +1 -0
  391. package/dist/tools/tasks.d.ts +6 -0
  392. package/dist/tools/tasks.d.ts.map +1 -0
  393. package/dist/tools/tasks.js +10 -0
  394. package/dist/tools/tasks.js.map +1 -0
  395. package/dist/tools/teams.d.ts +9 -0
  396. package/dist/tools/teams.d.ts.map +1 -0
  397. package/dist/tools/teams.js +255 -0
  398. package/dist/tools/teams.js.map +1 -0
  399. package/dist/tools/templates.d.ts +9 -0
  400. package/dist/tools/templates.d.ts.map +1 -0
  401. package/dist/tools/templates.js +450 -0
  402. package/dist/tools/templates.js.map +1 -0
  403. package/dist/tools/tokens.d.ts +37 -0
  404. package/dist/tools/tokens.d.ts.map +1 -0
  405. package/dist/tools/tokens.js +122 -0
  406. package/dist/tools/tokens.js.map +1 -0
  407. package/dist/tools/user-deletion.d.ts +41 -0
  408. package/dist/tools/user-deletion.d.ts.map +1 -0
  409. package/dist/tools/user-deletion.js +126 -0
  410. package/dist/tools/user-deletion.js.map +1 -0
  411. package/dist/tools/users.d.ts +9 -0
  412. package/dist/tools/users.d.ts.map +1 -0
  413. package/dist/tools/users.js +418 -0
  414. package/dist/tools/users.js.map +1 -0
  415. package/dist/tools/webhooks.d.ts +31 -0
  416. package/dist/tools/webhooks.d.ts.map +1 -0
  417. package/dist/tools/webhooks.js +414 -0
  418. package/dist/tools/webhooks.js.map +1 -0
  419. package/dist/transforms/base.d.ts +204 -0
  420. package/dist/transforms/base.d.ts.map +1 -0
  421. package/dist/transforms/base.js +175 -0
  422. package/dist/transforms/base.js.map +1 -0
  423. package/dist/transforms/field-selector.d.ts +27 -0
  424. package/dist/transforms/field-selector.d.ts.map +1 -0
  425. package/dist/transforms/field-selector.js +91 -0
  426. package/dist/transforms/field-selector.js.map +1 -0
  427. package/dist/transforms/index.d.ts +15 -0
  428. package/dist/transforms/index.d.ts.map +1 -0
  429. package/dist/transforms/index.js +50 -0
  430. package/dist/transforms/index.js.map +1 -0
  431. package/dist/transforms/size-calculator.d.ts +131 -0
  432. package/dist/transforms/size-calculator.d.ts.map +1 -0
  433. package/dist/transforms/size-calculator.js +284 -0
  434. package/dist/transforms/size-calculator.js.map +1 -0
  435. package/dist/transforms/task.d.ts +207 -0
  436. package/dist/transforms/task.d.ts.map +1 -0
  437. package/dist/transforms/task.js +259 -0
  438. package/dist/transforms/task.js.map +1 -0
  439. package/dist/types/errors.d.ts +65 -0
  440. package/dist/types/errors.d.ts.map +1 -0
  441. package/dist/types/errors.js +44 -0
  442. package/dist/types/errors.js.map +1 -0
  443. package/dist/types/filters.d.ts +149 -0
  444. package/dist/types/filters.d.ts.map +1 -0
  445. package/dist/types/filters.js +26 -0
  446. package/dist/types/filters.js.map +1 -0
  447. package/dist/types/index.d.ts +147 -0
  448. package/dist/types/index.d.ts.map +1 -0
  449. package/dist/types/index.js +24 -0
  450. package/dist/types/index.js.map +1 -0
  451. package/dist/types/node-vikunja-extended.d.ts +36 -0
  452. package/dist/types/node-vikunja-extended.d.ts.map +1 -0
  453. package/dist/types/node-vikunja-extended.js +25 -0
  454. package/dist/types/node-vikunja-extended.js.map +1 -0
  455. package/dist/types/responses.d.ts +121 -0
  456. package/dist/types/responses.d.ts.map +1 -0
  457. package/dist/types/responses.js +26 -0
  458. package/dist/types/responses.js.map +1 -0
  459. package/dist/types/vikunja.d.ts +319 -0
  460. package/dist/types/vikunja.d.ts.map +1 -0
  461. package/dist/types/vikunja.js +7 -0
  462. package/dist/types/vikunja.js.map +1 -0
  463. package/dist/utils/auth-error-handler.d.ts +23 -0
  464. package/dist/utils/auth-error-handler.d.ts.map +1 -0
  465. package/dist/utils/auth-error-handler.js +162 -0
  466. package/dist/utils/auth-error-handler.js.map +1 -0
  467. package/dist/utils/composite-operation.d.ts +184 -0
  468. package/dist/utils/composite-operation.d.ts.map +1 -0
  469. package/dist/utils/composite-operation.js +293 -0
  470. package/dist/utils/composite-operation.js.map +1 -0
  471. package/dist/utils/error-handler.d.ts +39 -0
  472. package/dist/utils/error-handler.d.ts.map +1 -0
  473. package/dist/utils/error-handler.js +336 -0
  474. package/dist/utils/error-handler.js.map +1 -0
  475. package/dist/utils/filtering/ClientSideFilteringStrategy.d.ts +13 -0
  476. package/dist/utils/filtering/ClientSideFilteringStrategy.d.ts.map +1 -0
  477. package/dist/utils/filtering/ClientSideFilteringStrategy.js +129 -0
  478. package/dist/utils/filtering/ClientSideFilteringStrategy.js.map +1 -0
  479. package/dist/utils/filtering/FilteringContext.d.ts +40 -0
  480. package/dist/utils/filtering/FilteringContext.d.ts.map +1 -0
  481. package/dist/utils/filtering/FilteringContext.js +58 -0
  482. package/dist/utils/filtering/FilteringContext.js.map +1 -0
  483. package/dist/utils/filtering/HybridFilteringStrategy.d.ts +15 -0
  484. package/dist/utils/filtering/HybridFilteringStrategy.d.ts.map +1 -0
  485. package/dist/utils/filtering/HybridFilteringStrategy.js +55 -0
  486. package/dist/utils/filtering/HybridFilteringStrategy.js.map +1 -0
  487. package/dist/utils/filtering/RestCrossProjectFilteringStrategy.d.ts +42 -0
  488. package/dist/utils/filtering/RestCrossProjectFilteringStrategy.d.ts.map +1 -0
  489. package/dist/utils/filtering/RestCrossProjectFilteringStrategy.js +120 -0
  490. package/dist/utils/filtering/RestCrossProjectFilteringStrategy.js.map +1 -0
  491. package/dist/utils/filtering/ServerSideFilteringStrategy.d.ts +13 -0
  492. package/dist/utils/filtering/ServerSideFilteringStrategy.d.ts.map +1 -0
  493. package/dist/utils/filtering/ServerSideFilteringStrategy.js +88 -0
  494. package/dist/utils/filtering/ServerSideFilteringStrategy.js.map +1 -0
  495. package/dist/utils/filtering/TaskFilteringStrategy.d.ts +19 -0
  496. package/dist/utils/filtering/TaskFilteringStrategy.d.ts.map +1 -0
  497. package/dist/utils/filtering/TaskFilteringStrategy.js +10 -0
  498. package/dist/utils/filtering/TaskFilteringStrategy.js.map +1 -0
  499. package/dist/utils/filtering/index.d.ts +14 -0
  500. package/dist/utils/filtering/index.d.ts.map +1 -0
  501. package/dist/utils/filtering/index.js +22 -0
  502. package/dist/utils/filtering/index.js.map +1 -0
  503. package/dist/utils/filtering/types.d.ts +108 -0
  504. package/dist/utils/filtering/types.d.ts.map +1 -0
  505. package/dist/utils/filtering/types.js +6 -0
  506. package/dist/utils/filtering/types.js.map +1 -0
  507. package/dist/utils/filters.d.ts +70 -0
  508. package/dist/utils/filters.d.ts.map +1 -0
  509. package/dist/utils/filters.js +812 -0
  510. package/dist/utils/filters.js.map +1 -0
  511. package/dist/utils/http-error-detail.d.ts +28 -0
  512. package/dist/utils/http-error-detail.d.ts.map +1 -0
  513. package/dist/utils/http-error-detail.js +67 -0
  514. package/dist/utils/http-error-detail.js.map +1 -0
  515. package/dist/utils/label-bulk.d.ts +21 -0
  516. package/dist/utils/label-bulk.d.ts.map +1 -0
  517. package/dist/utils/label-bulk.js +51 -0
  518. package/dist/utils/label-bulk.js.map +1 -0
  519. package/dist/utils/logger.d.ts +20 -0
  520. package/dist/utils/logger.d.ts.map +1 -0
  521. package/dist/utils/logger.js +66 -0
  522. package/dist/utils/logger.js.map +1 -0
  523. package/dist/utils/memory.d.ts +73 -0
  524. package/dist/utils/memory.d.ts.map +1 -0
  525. package/dist/utils/memory.js +194 -0
  526. package/dist/utils/memory.js.map +1 -0
  527. package/dist/utils/performance/batch-processor.d.ts +77 -0
  528. package/dist/utils/performance/batch-processor.d.ts.map +1 -0
  529. package/dist/utils/performance/batch-processor.js +218 -0
  530. package/dist/utils/performance/batch-processor.js.map +1 -0
  531. package/dist/utils/performance/index.d.ts +42 -0
  532. package/dist/utils/performance/index.d.ts.map +1 -0
  533. package/dist/utils/performance/index.js +49 -0
  534. package/dist/utils/performance/index.js.map +1 -0
  535. package/dist/utils/performance/performance-monitor.d.ts +116 -0
  536. package/dist/utils/performance/performance-monitor.d.ts.map +1 -0
  537. package/dist/utils/performance/performance-monitor.js +307 -0
  538. package/dist/utils/performance/performance-monitor.js.map +1 -0
  539. package/dist/utils/read-only.d.ts +111 -0
  540. package/dist/utils/read-only.d.ts.map +1 -0
  541. package/dist/utils/read-only.js +503 -0
  542. package/dist/utils/read-only.js.map +1 -0
  543. package/dist/utils/response-factory.d.ts +81 -0
  544. package/dist/utils/response-factory.d.ts.map +1 -0
  545. package/dist/utils/response-factory.js +86 -0
  546. package/dist/utils/response-factory.js.map +1 -0
  547. package/dist/utils/retry.d.ts +160 -0
  548. package/dist/utils/retry.d.ts.map +1 -0
  549. package/dist/utils/retry.js +316 -0
  550. package/dist/utils/retry.js.map +1 -0
  551. package/dist/utils/security.d.ts +70 -0
  552. package/dist/utils/security.d.ts.map +1 -0
  553. package/dist/utils/security.js +358 -0
  554. package/dist/utils/security.js.map +1 -0
  555. package/dist/utils/simple-response.d.ts +75 -0
  556. package/dist/utils/simple-response.d.ts.map +1 -0
  557. package/dist/utils/simple-response.js +311 -0
  558. package/dist/utils/simple-response.js.map +1 -0
  559. package/dist/utils/storage-errors.d.ts +9 -0
  560. package/dist/utils/storage-errors.d.ts.map +1 -0
  561. package/dist/utils/storage-errors.js +20 -0
  562. package/dist/utils/storage-errors.js.map +1 -0
  563. package/dist/utils/task-rest-transport.d.ts +28 -0
  564. package/dist/utils/task-rest-transport.d.ts.map +1 -0
  565. package/dist/utils/task-rest-transport.js +33 -0
  566. package/dist/utils/task-rest-transport.js.map +1 -0
  567. package/dist/utils/unicode-fix.d.ts +19 -0
  568. package/dist/utils/unicode-fix.d.ts.map +1 -0
  569. package/dist/utils/unicode-fix.js +70 -0
  570. package/dist/utils/unicode-fix.js.map +1 -0
  571. package/dist/utils/validation.d.ts +75 -0
  572. package/dist/utils/validation.d.ts.map +1 -0
  573. package/dist/utils/validation.js +758 -0
  574. package/dist/utils/validation.js.map +1 -0
  575. package/dist/utils/vikunja-rest.d.ts +159 -0
  576. package/dist/utils/vikunja-rest.d.ts.map +1 -0
  577. package/dist/utils/vikunja-rest.js +378 -0
  578. package/dist/utils/vikunja-rest.js.map +1 -0
  579. package/docs/CONFIGURATION.md +957 -0
  580. package/docs/DOCKER-DESKTOP-MCP.md +207 -0
  581. package/docs/TOOLS.md +422 -0
  582. 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":";AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;;AA8EH,sCA8NC;AAqBD,oCA+BC;AA7VD,uCAAkD;AAClD,2DAA8D;AAC9D,yEAAiE;AACjE,uDAAoE;AACpE,6CAAkD;AAClD,6DAA8D;AAC9D,mEAA4F;AAC5F,yEAAqE;AACrE,uCAA0C;AAU1C,4GAA4G;AAC5G,SAAS,OAAO,CAAC,KAAc,EAAE,eAAmC,EAAE,OAAe;IACnF,IAAI,KAAK,YAAY,gBAAQ,EAAE,CAAC;QAC9B,IAAI,eAAe,IAAI,KAAK,CAAC,OAAO,EAAE,UAAU,KAAK,GAAG,EAAE,CAAC;YACzD,MAAM,IAAI,gBAAQ,CAAC,iBAAS,CAAC,SAAS,EAAE,eAAe,CAAC,CAAC;QAC3D,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;IACD,MAAM,IAAA,iCAAiB,EAAC,KAAK,EAAE,OAAO,CAAC,CAAC;AAC1C,CAAC;AAED;;;;;GAKG;AACH,SAAS,mBAAmB,CAAC,IAAiB,EAAE,IAAY;IAC1D,MAAM,GAAG,GAAG,CAAC,IAAI,CAAC,aAAa,IAAI,EAAE,CAAyD,CAAC;IAC/F,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC;IACvB,OAAO,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;AACzC,CAAC;AA0BD;;;;;;;;;GASG;AACI,KAAK,UAAU,aAAa,CACjC,IAAuB,EACvB,WAAwB;IAExB,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;QACvB,MAAM,IAAI,gBAAQ,CAAC,iBAAS,CAAC,gBAAgB,EAAE,8CAA8C,CAAC,CAAC;IACjG,CAAC;IACD,IAAA,uBAAU,EAAC,IAAI,CAAC,YAAY,EAAE,cAAc,CAAC,CAAC;IAE9C,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;QAChB,MAAM,IAAI,gBAAQ,CAAC,iBAAS,CAAC,gBAAgB,EAAE,uCAAuC,CAAC,CAAC;IAC1F,CAAC;IACD,MAAM,cAAc,GAAG,IAAA,2BAAc,EAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAClD,MAAM,oBAAoB,GACxB,IAAI,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,IAAA,2BAAc,EAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAEhF,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;QACjB,IAAA,+BAAkB,EAAC,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;IAC9C,CAAC;IACD,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1C,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,IAAA,uBAAU,EAAC,EAAE,EAAE,UAAU,CAAC,CAAC,CAAC;IAC1D,CAAC;IACD,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAChD,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,IAAA,uBAAU,EAAC,EAAE,EAAE,aAAa,CAAC,CAAC,CAAC;IAChE,CAAC;IACD,IAAI,IAAI,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;QAChC,IAAA,uBAAU,EAAC,IAAI,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;IACxC,CAAC;IAED,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC;IACvC,IAAI,eAAmC,CAAC;IACxC,IAAI,aAAiC,CAAC;IAEtC,MAAM,EAAE,GAAG,IAAI,wCAAkB,EAAE,CAAC;IAEpC,EAAE,CAAC,OAAO,CAAyB;QACjC,IAAI,EAAE,gBAAgB;QACtB,OAAO,EAAE,KAAK,IAAI,EAAE;YAClB,IAAI,MAAmB,CAAC;YACxB,IAAI,CAAC;gBACH,MAAM,GAAG,MAAM,IAAA,oCAAc,EAAC,WAAW,EAAE,YAAY,CAAC,CAAC;YAC3D,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,KAAK,EAAE,eAAe,YAAY,YAAY,EAAE,+BAA+B,CAAC,CAAC;YAC3F,CAAC;YACD,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,CAAC,UAAU,KAAK,QAAQ,EAAE,CAAC;gBACrD,MAAM,IAAI,gBAAQ,CAChB,iBAAS,CAAC,SAAS,EACnB,eAAe,YAAY,8BAA8B,CAC1D,CAAC;YACJ,CAAC;YACD,eAAe,GAAG,MAAM,CAAC,UAAU,CAAC;YACpC,OAAO,MAAM,CAAC;QAChB,CAAC;KACF,CAAC,CAAC;IAEH,EAAE,CAAC,OAAO,CAAyB;QACjC,IAAI,EAAE,aAAa;QACnB,OAAO,EAAE,KAAK,IAAI,EAAE;YAClB,MAAM,SAAS,GAAG,eAAyB,CAAC;YAC5C,MAAM,OAAO,GAAgB,EAAE,KAAK,EAAE,cAAc,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC;YAC9E,IAAI,oBAAoB,KAAK,SAAS;gBAAE,OAAO,CAAC,WAAW,GAAG,oBAAoB,CAAC;YACnF,IAAI,IAAI,CAAC,OAAO,KAAK,SAAS;gBAAE,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC;YAChE,IAAI,IAAI,CAAC,QAAQ,KAAK,SAAS;gBAAE,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;YAElE,IAAI,OAAoB,CAAC;YACzB,IAAI,CAAC;gBACH,OAAO,GAAG,MAAM,IAAA,iCAAkB,EAChC,WAAW,EACX,KAAK,EACL,aAAa,SAAS,QAAQ,EAC9B,OAAO,CACR,CAAC;YACJ,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,KAAK,EAAE,SAAS,EAAE,0BAA0B,CAAC,CAAC;YACxD,CAAC;YACD,IAAI,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC;gBAChB,MAAM,IAAI,gBAAQ,CAChB,iBAAS,CAAC,SAAS,EACnB,0DAA0D,CAC3D,CAAC;YACJ,CAAC;YACD,aAAa,GAAG,OAAO,CAAC,EAAE,CAAC;YAC3B,OAAO,OAAO,CAAC;QACjB,CAAC;QACD,UAAU,EAAE,KAAK,IAAI,EAAE;YACrB,IAAI,aAAa,KAAK,SAAS;gBAAE,OAAO,SAAS,CAAC;YAClD,MAAM,IAAA,iCAAkB,EAAC,WAAW,EAAE,QAAQ,EAAE,UAAU,aAAa,EAAE,CAAC,CAAC;YAC3E,OAAO,SAAS,CAAC;QACnB,CAAC;KACF,CAAC,CAAC;IAEH,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1C,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC;QAC7B,EAAE,CAAC,OAAO,CAAuB;YAC/B,IAAI,EAAE,cAAc;YACpB,OAAO,EAAE,KAAK,IAAI,EAAE;gBAClB,MAAM,MAAM,GAAG,aAAuB,CAAC;gBACvC,gEAAgE;gBAChE,2DAA2D;gBAC3D,kEAAkE;gBAClE,6DAA6D;gBAC7D,mCAAmC;gBACnC,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;oBAC/B,MAAM,IAAA,iCAAkB,EAAC,WAAW,EAAE,KAAK,EAAE,UAAU,MAAM,SAAS,EAAE;wBACtE,QAAQ,EAAE,OAAO;qBAClB,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;SACF,CAAC,CAAC;IACL,CAAC;IAED,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAChD,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC;QACnC,EAAE,CAAC,OAAO,CAAuB;YAC/B,IAAI,EAAE,iBAAiB;YACvB,OAAO,EAAE,KAAK,IAAI,EAAE;gBAClB,MAAM,MAAM,GAAG,aAAuB,CAAC;gBACvC,kEAAkE;gBAClE,iEAAiE;gBACjE,8DAA8D;gBAC9D,6DAA6D;gBAC7D,mEAAmE;gBACnE,kEAAkE;gBAClE,KAAK,MAAM,MAAM,IAAI,WAAW,EAAE,CAAC;oBACjC,MAAM,IAAA,iCAAkB,EAAC,WAAW,EAAE,KAAK,EAAE,UAAU,MAAM,YAAY,EAAE;wBACzE,OAAO,EAAE,MAAM;qBAChB,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;SACF,CAAC,CAAC;IACL,CAAC;IAED,EAAE,CAAC,OAAO,CAAiC;QACzC,IAAI,EAAE,iBAAiB;QACvB,OAAO,EAAE,KAAK,IAAI,EAAE;YAClB,MAAM,OAAO,GAAG,aAAuB,CAAC;YACxC,IAAI,CAAC;gBACH,mEAAmE;gBACnE,kEAAkE;gBAClE,OAAO,MAAM,IAAA,iCAAkB,EAC7B,WAAW,EACX,KAAK,EACL,UAAU,YAAY,YAAY,EAClC;oBACE,OAAO,EAAE,YAAY;oBACrB,aAAa,EAAE,OAAO;oBACtB,aAAa,EAAE,SAAS;iBACK,CAChC,CAAC;YACJ,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,KAAK,EAAE,SAAS,EAAE,yCAAyC,CAAC,CAAC;YACvE,CAAC;QACH,CAAC;KACF,CAAC,CAAC;IAEH,IAAI,IAAI,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;QAChC,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;QAC/B,EAAE,CAAC,OAAO,CAAuB;YAC/B,IAAI,EAAE,YAAY;YAClB,OAAO,EAAE,KAAK,IAAI,EAAE;gBAClB,MAAM,MAAM,GAAG,aAAuB,CAAC;gBACvC,MAAM,SAAS,GAAG,eAAyB,CAAC;gBAC5C,mEAAmE;gBACnE,oEAAoE;gBACpE,kEAAkE;gBAClE,yDAAyD;gBACzD,MAAM,IAAA,uBAAa,EAAC,EAAE,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,WAAW,CAAC,CAAC;YACxE,CAAC;SACF,CAAC,CAAC;IACL,CAAC;IAED,EAAE,CAAC,OAAO,CAAqB;QAC7B,IAAI,EAAE,iBAAiB;QACvB,OAAO,EAAE,KAAK,IAAI,EAAE;YAClB,MAAM,OAAO,GAAG,aAAuB,CAAC;YACxC,IAAI,MAAmB,CAAC;YACxB,IAAI,CAAC;gBACH,MAAM,GAAG,MAAM,IAAA,oCAAc,EAAC,WAAW,EAAE,YAAY,CAAC,CAAC;YAC3D,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,KAAK,EAAE,SAAS,EAAE,mCAAmC,CAAC,CAAC;YACjE,CAAC;YACD,MAAM,QAAQ,GAAG,mBAAmB,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;YACxD,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,OAAO,CAAC,CAAC;YACrD,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,MAAM,IAAI,gBAAQ,CAChB,iBAAS,CAAC,cAAc,EACxB,WAAW,OAAO,sCAAsC,YAAY,eAAe;oBACjF,+DAA+D,CAClE,CAAC;YACJ,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;KACF,CAAC,CAAC;IAEH,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,KAAK,CAAC;IACpC,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;IAExC,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;QACf,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QAC3F,MAAM,IAAI,gBAAQ,CAChB,GAAG,YAAY,gBAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,iBAAS,CAAC,SAAS,EACxD,0BAA0B,GAAG,CAAC,OAAO,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,EACvF,EAAE,YAAY,EAAE,MAAM,EAAE,CACzB,CAAC;IACJ,CAAC;IAED,MAAM,QAAQ,GAAG,IAAA,yCAAsB,EACrC,gBAAgB,EAChB,mBAAmB,aAAa,MAAM,cAAc,wBAAwB,YAAY,EAAE,EAC1F;QACE,SAAS,EAAE,aAAa;QACxB,YAAY;QACZ,SAAS,EAAE,eAAe;QAC1B,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,MAAM;QACN,KAAK,EAAE,MAAM,CAAC,KAAK;KACpB,EACD,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,EACvC,IAAI,CAAC,SAAS,CACf,CAAC;IAEF,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAA,uCAAoB,EAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC;AACxF,CAAC;AAgBD;;;;GAIG;AACI,KAAK,UAAU,YAAY,CAAC,IAAsB,EAAE,WAAwB;IACjF,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;QACb,MAAM,IAAI,gBAAQ,CAAC,iBAAS,CAAC,gBAAgB,EAAE,qBAAqB,CAAC,CAAC;IACxE,CAAC;IACD,IAAA,uBAAU,EAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;IAE1B,IAAI,IAAiB,CAAC;IACtB,IAAI,CAAC;QACH,IAAI,GAAG,MAAM,IAAA,oCAAc,EAAC,WAAW,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;IACpD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,EAAE,QAAQ,IAAI,CAAC,EAAE,YAAY,EAAE,yBAAyB,CAAC,CAAC;IACzE,CAAC;IAED,MAAM,QAAQ,GAAqB,mBAAmB,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAClF,EAAE,EAAE,CAAC,CAAC,EAAE;QACR,KAAK,EAAE,CAAC,CAAC,KAAK;QACd,IAAI,EAAE,CAAC,CAAC,IAAI;QACZ,SAAS,EAAE,CAAC,CAAC,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;KAChF,CAAC,CAAC,CAAC;IAEJ,MAAM,QAAQ,GAAG,IAAA,yCAAsB,EACrC,eAAe,EACf,QAAQ,CAAC,MAAM,GAAG,CAAC;QACjB,CAAC,CAAC,SAAS,QAAQ,CAAC,MAAM,wBAAwB,IAAI,CAAC,EAAE,EAAE;QAC3D,CAAC,CAAC,6BAA6B,IAAI,CAAC,EAAE,EAAE,EAC1C,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,CAAC,MAAM,EAAE,EACrD,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,KAAK,EAAE,QAAQ,CAAC,MAAM,EAAE,EAC/D,IAAI,CAAC,SAAS,CACf,CAAC;IAEF,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAA,uCAAoB,EAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC;AACxF,CAAC"}