@collage-dam/mcp-server 0.1.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 (306) hide show
  1. package/.env.example +56 -0
  2. package/CHANGELOG.md +90 -0
  3. package/LICENSE +21 -0
  4. package/README.md +512 -0
  5. package/dist/client.d.ts +497 -0
  6. package/dist/client.d.ts.map +1 -0
  7. package/dist/client.js +1162 -0
  8. package/dist/client.js.map +1 -0
  9. package/dist/conventions/confirmation.d.ts +89 -0
  10. package/dist/conventions/confirmation.d.ts.map +1 -0
  11. package/dist/conventions/confirmation.js +132 -0
  12. package/dist/conventions/confirmation.js.map +1 -0
  13. package/dist/conventions/dry-run/batch-executor.d.ts +36 -0
  14. package/dist/conventions/dry-run/batch-executor.d.ts.map +1 -0
  15. package/dist/conventions/dry-run/batch-executor.js +89 -0
  16. package/dist/conventions/dry-run/batch-executor.js.map +1 -0
  17. package/dist/conventions/dry-run/diff-renderer.d.ts +34 -0
  18. package/dist/conventions/dry-run/diff-renderer.d.ts.map +1 -0
  19. package/dist/conventions/dry-run/diff-renderer.js +158 -0
  20. package/dist/conventions/dry-run/diff-renderer.js.map +1 -0
  21. package/dist/conventions/dry-run/index.d.ts +13 -0
  22. package/dist/conventions/dry-run/index.d.ts.map +1 -0
  23. package/dist/conventions/dry-run/index.js +10 -0
  24. package/dist/conventions/dry-run/index.js.map +1 -0
  25. package/dist/conventions/dry-run/mutating-tool.d.ts +64 -0
  26. package/dist/conventions/dry-run/mutating-tool.d.ts.map +1 -0
  27. package/dist/conventions/dry-run/mutating-tool.js +88 -0
  28. package/dist/conventions/dry-run/mutating-tool.js.map +1 -0
  29. package/dist/conventions/dry-run/summary.d.ts +66 -0
  30. package/dist/conventions/dry-run/summary.d.ts.map +1 -0
  31. package/dist/conventions/dry-run/summary.js +185 -0
  32. package/dist/conventions/dry-run/summary.js.map +1 -0
  33. package/dist/conventions/dry-run/types.d.ts +597 -0
  34. package/dist/conventions/dry-run/types.d.ts.map +1 -0
  35. package/dist/conventions/dry-run/types.js +108 -0
  36. package/dist/conventions/dry-run/types.js.map +1 -0
  37. package/dist/conventions/dry-run/with-dry-run.d.ts +66 -0
  38. package/dist/conventions/dry-run/with-dry-run.d.ts.map +1 -0
  39. package/dist/conventions/dry-run/with-dry-run.js +219 -0
  40. package/dist/conventions/dry-run/with-dry-run.js.map +1 -0
  41. package/dist/conventions/env.d.ts +49 -0
  42. package/dist/conventions/env.d.ts.map +1 -0
  43. package/dist/conventions/env.js +84 -0
  44. package/dist/conventions/env.js.map +1 -0
  45. package/dist/conventions/errors.d.ts +68 -0
  46. package/dist/conventions/errors.d.ts.map +1 -0
  47. package/dist/conventions/errors.js +81 -0
  48. package/dist/conventions/errors.js.map +1 -0
  49. package/dist/conventions/logger.d.ts +28 -0
  50. package/dist/conventions/logger.d.ts.map +1 -0
  51. package/dist/conventions/logger.js +105 -0
  52. package/dist/conventions/logger.js.map +1 -0
  53. package/dist/conventions/pagination.d.ts +37 -0
  54. package/dist/conventions/pagination.d.ts.map +1 -0
  55. package/dist/conventions/pagination.js +53 -0
  56. package/dist/conventions/pagination.js.map +1 -0
  57. package/dist/conventions/rate-limiter.d.ts +54 -0
  58. package/dist/conventions/rate-limiter.d.ts.map +1 -0
  59. package/dist/conventions/rate-limiter.js +143 -0
  60. package/dist/conventions/rate-limiter.js.map +1 -0
  61. package/dist/conventions/response-budget.d.ts +66 -0
  62. package/dist/conventions/response-budget.d.ts.map +1 -0
  63. package/dist/conventions/response-budget.js +89 -0
  64. package/dist/conventions/response-budget.js.map +1 -0
  65. package/dist/conventions/schema-version.d.ts +27 -0
  66. package/dist/conventions/schema-version.d.ts.map +1 -0
  67. package/dist/conventions/schema-version.js +29 -0
  68. package/dist/conventions/schema-version.js.map +1 -0
  69. package/dist/conventions/state-store-redis.d.ts +32 -0
  70. package/dist/conventions/state-store-redis.d.ts.map +1 -0
  71. package/dist/conventions/state-store-redis.js +77 -0
  72. package/dist/conventions/state-store-redis.js.map +1 -0
  73. package/dist/conventions/state-store.d.ts +46 -0
  74. package/dist/conventions/state-store.d.ts.map +1 -0
  75. package/dist/conventions/state-store.js +105 -0
  76. package/dist/conventions/state-store.js.map +1 -0
  77. package/dist/index.d.ts +5 -0
  78. package/dist/index.d.ts.map +1 -0
  79. package/dist/index.js +421 -0
  80. package/dist/index.js.map +1 -0
  81. package/dist/prompts/collection-audit.d.ts +13 -0
  82. package/dist/prompts/collection-audit.d.ts.map +1 -0
  83. package/dist/prompts/collection-audit.js +168 -0
  84. package/dist/prompts/collection-audit.js.map +1 -0
  85. package/dist/prompts/create-distribution.d.ts +15 -0
  86. package/dist/prompts/create-distribution.d.ts.map +1 -0
  87. package/dist/prompts/create-distribution.js +111 -0
  88. package/dist/prompts/create-distribution.js.map +1 -0
  89. package/dist/prompts/helpers.d.ts +20 -0
  90. package/dist/prompts/helpers.d.ts.map +1 -0
  91. package/dist/prompts/helpers.js +53 -0
  92. package/dist/prompts/helpers.js.map +1 -0
  93. package/dist/prompts/library-health-audit.d.ts +13 -0
  94. package/dist/prompts/library-health-audit.d.ts.map +1 -0
  95. package/dist/prompts/library-health-audit.js +131 -0
  96. package/dist/prompts/library-health-audit.js.map +1 -0
  97. package/dist/prompts/usage-insights.d.ts +13 -0
  98. package/dist/prompts/usage-insights.d.ts.map +1 -0
  99. package/dist/prompts/usage-insights.js +98 -0
  100. package/dist/prompts/usage-insights.js.map +1 -0
  101. package/dist/prompts/wrap-prompt-as-tool.d.ts +48 -0
  102. package/dist/prompts/wrap-prompt-as-tool.d.ts.map +1 -0
  103. package/dist/prompts/wrap-prompt-as-tool.js +61 -0
  104. package/dist/prompts/wrap-prompt-as-tool.js.map +1 -0
  105. package/dist/resources/asset-by-id.d.ts +4 -0
  106. package/dist/resources/asset-by-id.d.ts.map +1 -0
  107. package/dist/resources/asset-by-id.js +27 -0
  108. package/dist/resources/asset-by-id.js.map +1 -0
  109. package/dist/resources/collections.d.ts +5 -0
  110. package/dist/resources/collections.d.ts.map +1 -0
  111. package/dist/resources/collections.js +48 -0
  112. package/dist/resources/collections.js.map +1 -0
  113. package/dist/resources/custom-fields.d.ts +4 -0
  114. package/dist/resources/custom-fields.d.ts.map +1 -0
  115. package/dist/resources/custom-fields.js +30 -0
  116. package/dist/resources/custom-fields.js.map +1 -0
  117. package/dist/resources/folders.d.ts +5 -0
  118. package/dist/resources/folders.d.ts.map +1 -0
  119. package/dist/resources/folders.js +73 -0
  120. package/dist/resources/folders.js.map +1 -0
  121. package/dist/resources/helpers.d.ts +17 -0
  122. package/dist/resources/helpers.d.ts.map +1 -0
  123. package/dist/resources/helpers.js +59 -0
  124. package/dist/resources/helpers.js.map +1 -0
  125. package/dist/resources/portals.d.ts +5 -0
  126. package/dist/resources/portals.d.ts.map +1 -0
  127. package/dist/resources/portals.js +81 -0
  128. package/dist/resources/portals.js.map +1 -0
  129. package/dist/resources/recent-and-dashboard.d.ts +5 -0
  130. package/dist/resources/recent-and-dashboard.d.ts.map +1 -0
  131. package/dist/resources/recent-and-dashboard.js +42 -0
  132. package/dist/resources/recent-and-dashboard.js.map +1 -0
  133. package/dist/tools/asset-selection.d.ts +102 -0
  134. package/dist/tools/asset-selection.d.ts.map +1 -0
  135. package/dist/tools/asset-selection.js +133 -0
  136. package/dist/tools/asset-selection.js.map +1 -0
  137. package/dist/tools/audit/audit-folder-structure.d.ts +108 -0
  138. package/dist/tools/audit/audit-folder-structure.d.ts.map +1 -0
  139. package/dist/tools/audit/audit-folder-structure.js +260 -0
  140. package/dist/tools/audit/audit-folder-structure.js.map +1 -0
  141. package/dist/tools/audit/audit-naming-conventions.d.ts +83 -0
  142. package/dist/tools/audit/audit-naming-conventions.d.ts.map +1 -0
  143. package/dist/tools/audit/audit-naming-conventions.js +238 -0
  144. package/dist/tools/audit/audit-naming-conventions.js.map +1 -0
  145. package/dist/tools/audit/audit-tagging-hygiene.d.ts +77 -0
  146. package/dist/tools/audit/audit-tagging-hygiene.d.ts.map +1 -0
  147. package/dist/tools/audit/audit-tagging-hygiene.js +402 -0
  148. package/dist/tools/audit/audit-tagging-hygiene.js.map +1 -0
  149. package/dist/tools/audit/detect-duplicates.d.ts +62 -0
  150. package/dist/tools/audit/detect-duplicates.d.ts.map +1 -0
  151. package/dist/tools/audit/detect-duplicates.js +0 -0
  152. package/dist/tools/audit/detect-duplicates.js.map +1 -0
  153. package/dist/tools/audit/types.d.ts +526 -0
  154. package/dist/tools/audit/types.d.ts.map +1 -0
  155. package/dist/tools/audit/types.js +188 -0
  156. package/dist/tools/audit/types.js.map +1 -0
  157. package/dist/tools/bulk-move-assets.d.ts +78 -0
  158. package/dist/tools/bulk-move-assets.d.ts.map +1 -0
  159. package/dist/tools/bulk-move-assets.js +122 -0
  160. package/dist/tools/bulk-move-assets.js.map +1 -0
  161. package/dist/tools/bulk-normalize-filenames.d.ts +62 -0
  162. package/dist/tools/bulk-normalize-filenames.d.ts.map +1 -0
  163. package/dist/tools/bulk-normalize-filenames.js +237 -0
  164. package/dist/tools/bulk-normalize-filenames.js.map +1 -0
  165. package/dist/tools/bulk-rename-assets.d.ts +79 -0
  166. package/dist/tools/bulk-rename-assets.d.ts.map +1 -0
  167. package/dist/tools/bulk-rename-assets.js +139 -0
  168. package/dist/tools/bulk-rename-assets.js.map +1 -0
  169. package/dist/tools/bulk-tags.d.ts +107 -0
  170. package/dist/tools/bulk-tags.d.ts.map +1 -0
  171. package/dist/tools/bulk-tags.js +220 -0
  172. package/dist/tools/bulk-tags.js.map +1 -0
  173. package/dist/tools/client-adapters.d.ts +76 -0
  174. package/dist/tools/client-adapters.d.ts.map +1 -0
  175. package/dist/tools/client-adapters.js +648 -0
  176. package/dist/tools/client-adapters.js.map +1 -0
  177. package/dist/tools/collection-membership.d.ts +90 -0
  178. package/dist/tools/collection-membership.d.ts.map +1 -0
  179. package/dist/tools/collection-membership.js +195 -0
  180. package/dist/tools/collection-membership.js.map +1 -0
  181. package/dist/tools/create-collection.d.ts +63 -0
  182. package/dist/tools/create-collection.d.ts.map +1 -0
  183. package/dist/tools/create-collection.js +151 -0
  184. package/dist/tools/create-collection.js.map +1 -0
  185. package/dist/tools/create-folder.d.ts +46 -0
  186. package/dist/tools/create-folder.d.ts.map +1 -0
  187. package/dist/tools/create-folder.js +83 -0
  188. package/dist/tools/create-folder.js.map +1 -0
  189. package/dist/tools/create-share-link.d.ts +107 -0
  190. package/dist/tools/create-share-link.d.ts.map +1 -0
  191. package/dist/tools/create-share-link.js +239 -0
  192. package/dist/tools/create-share-link.js.map +1 -0
  193. package/dist/tools/get-asset-details.d.ts +401 -0
  194. package/dist/tools/get-asset-details.d.ts.map +1 -0
  195. package/dist/tools/get-asset-details.js +56 -0
  196. package/dist/tools/get-asset-details.js.map +1 -0
  197. package/dist/tools/get-collection.d.ts +126 -0
  198. package/dist/tools/get-collection.d.ts.map +1 -0
  199. package/dist/tools/get-collection.js +52 -0
  200. package/dist/tools/get-collection.js.map +1 -0
  201. package/dist/tools/get-embed-code.d.ts +195 -0
  202. package/dist/tools/get-embed-code.d.ts.map +1 -0
  203. package/dist/tools/get-embed-code.js +214 -0
  204. package/dist/tools/get-embed-code.js.map +1 -0
  205. package/dist/tools/insights/analyze-share-links.d.ts +159 -0
  206. package/dist/tools/insights/analyze-share-links.d.ts.map +1 -0
  207. package/dist/tools/insights/analyze-share-links.js +314 -0
  208. package/dist/tools/insights/analyze-share-links.js.map +1 -0
  209. package/dist/tools/insights/insight-cache.d.ts +36 -0
  210. package/dist/tools/insights/insight-cache.d.ts.map +1 -0
  211. package/dist/tools/insights/insight-cache.js +98 -0
  212. package/dist/tools/insights/insight-cache.js.map +1 -0
  213. package/dist/tools/insights/report-asset-activation.d.ts +149 -0
  214. package/dist/tools/insights/report-asset-activation.d.ts.map +1 -0
  215. package/dist/tools/insights/report-asset-activation.js +380 -0
  216. package/dist/tools/insights/report-asset-activation.js.map +1 -0
  217. package/dist/tools/insights/report-stale-assets.d.ts +120 -0
  218. package/dist/tools/insights/report-stale-assets.d.ts.map +1 -0
  219. package/dist/tools/insights/report-stale-assets.js +281 -0
  220. package/dist/tools/insights/report-stale-assets.js.map +1 -0
  221. package/dist/tools/insights/report-top-assets.d.ts +139 -0
  222. package/dist/tools/insights/report-top-assets.d.ts.map +1 -0
  223. package/dist/tools/insights/report-top-assets.js +407 -0
  224. package/dist/tools/insights/report-top-assets.js.map +1 -0
  225. package/dist/tools/list-categories.d.ts +127 -0
  226. package/dist/tools/list-categories.d.ts.map +1 -0
  227. package/dist/tools/list-categories.js +68 -0
  228. package/dist/tools/list-categories.js.map +1 -0
  229. package/dist/tools/list-collections.d.ts +127 -0
  230. package/dist/tools/list-collections.d.ts.map +1 -0
  231. package/dist/tools/list-collections.js +53 -0
  232. package/dist/tools/list-collections.js.map +1 -0
  233. package/dist/tools/list-custom-fields.d.ts +125 -0
  234. package/dist/tools/list-custom-fields.d.ts.map +1 -0
  235. package/dist/tools/list-custom-fields.js +51 -0
  236. package/dist/tools/list-custom-fields.js.map +1 -0
  237. package/dist/tools/list-share-links.d.ts +192 -0
  238. package/dist/tools/list-share-links.d.ts.map +1 -0
  239. package/dist/tools/list-share-links.js +92 -0
  240. package/dist/tools/list-share-links.js.map +1 -0
  241. package/dist/tools/list-workspaces.d.ts +88 -0
  242. package/dist/tools/list-workspaces.d.ts.map +1 -0
  243. package/dist/tools/list-workspaces.js +71 -0
  244. package/dist/tools/list-workspaces.js.map +1 -0
  245. package/dist/tools/move-asset.d.ts +48 -0
  246. package/dist/tools/move-asset.d.ts.map +1 -0
  247. package/dist/tools/move-asset.js +85 -0
  248. package/dist/tools/move-asset.js.map +1 -0
  249. package/dist/tools/rename-asset.d.ts +88 -0
  250. package/dist/tools/rename-asset.d.ts.map +1 -0
  251. package/dist/tools/rename-asset.js +100 -0
  252. package/dist/tools/rename-asset.js.map +1 -0
  253. package/dist/tools/rename-folder.d.ts +55 -0
  254. package/dist/tools/rename-folder.d.ts.map +1 -0
  255. package/dist/tools/rename-folder.js +101 -0
  256. package/dist/tools/rename-folder.js.map +1 -0
  257. package/dist/tools/revoke-share-link.d.ts +55 -0
  258. package/dist/tools/revoke-share-link.d.ts.map +1 -0
  259. package/dist/tools/revoke-share-link.js +77 -0
  260. package/dist/tools/revoke-share-link.js.map +1 -0
  261. package/dist/tools/search/facets.d.ts +34 -0
  262. package/dist/tools/search/facets.d.ts.map +1 -0
  263. package/dist/tools/search/facets.js +147 -0
  264. package/dist/tools/search/facets.js.map +1 -0
  265. package/dist/tools/search/filter-builder.d.ts +33 -0
  266. package/dist/tools/search/filter-builder.d.ts.map +1 -0
  267. package/dist/tools/search/filter-builder.js +111 -0
  268. package/dist/tools/search/filter-builder.js.map +1 -0
  269. package/dist/tools/search/search-assets.d.ts +41 -0
  270. package/dist/tools/search/search-assets.d.ts.map +1 -0
  271. package/dist/tools/search/search-assets.js +162 -0
  272. package/dist/tools/search/search-assets.js.map +1 -0
  273. package/dist/tools/search/search-collections.d.ts +35 -0
  274. package/dist/tools/search/search-collections.d.ts.map +1 -0
  275. package/dist/tools/search/search-collections.js +103 -0
  276. package/dist/tools/search/search-collections.js.map +1 -0
  277. package/dist/tools/search/types.d.ts +1047 -0
  278. package/dist/tools/search/types.d.ts.map +1 -0
  279. package/dist/tools/search/types.js +216 -0
  280. package/dist/tools/search/types.js.map +1 -0
  281. package/dist/tools/update-asset-metadata.d.ts +78 -0
  282. package/dist/tools/update-asset-metadata.d.ts.map +1 -0
  283. package/dist/tools/update-asset-metadata.js +203 -0
  284. package/dist/tools/update-asset-metadata.js.map +1 -0
  285. package/dist/tools/update-collection.d.ts +69 -0
  286. package/dist/tools/update-collection.d.ts.map +1 -0
  287. package/dist/tools/update-collection.js +142 -0
  288. package/dist/tools/update-collection.js.map +1 -0
  289. package/dist/tools/view-category-contents.d.ts +231 -0
  290. package/dist/tools/view-category-contents.d.ts.map +1 -0
  291. package/dist/tools/view-category-contents.js +97 -0
  292. package/dist/tools/view-category-contents.js.map +1 -0
  293. package/dist/types.d.ts +1326 -0
  294. package/dist/types.d.ts.map +1 -0
  295. package/dist/types.js +288 -0
  296. package/dist/types.js.map +1 -0
  297. package/dist/typesense.d.ts +84 -0
  298. package/dist/typesense.d.ts.map +1 -0
  299. package/dist/typesense.js +243 -0
  300. package/dist/typesense.js.map +1 -0
  301. package/docs/api-field-verification.md +244 -0
  302. package/docs/deployment-runbook.md +446 -0
  303. package/docs/security-review.md +195 -0
  304. package/docs/typesense-filter-schema.md +262 -0
  305. package/docs/verified-endpoints.md +38 -0
  306. package/package.json +72 -0
@@ -0,0 +1,237 @@
1
+ // ── bulk_normalize_filenames (T8, Phase 1.5) ─────────────────────────
2
+ //
3
+ // Mutating tool. Applies a deterministic filename normalisation function
4
+ // to many assets in a single confirmed call. Built on the shared
5
+ // `MutatingTool` base.
6
+ //
7
+ // Input shape:
8
+ // { asset_ids: string[], style: 'kebab-case' | 'snake_case' |
9
+ // 'lowercase' | 'no_spaces' | 'pascal_case' | 'camel_case' }
10
+ //
11
+ // The plan phase looks up each asset's current name via the client,
12
+ // computes the normalised target, and produces a per-asset diff. The
13
+ // caller can spot-check the preview before confirming, so the operation
14
+ // stays reversible-in-practice (each diff row shows the before name in
15
+ // case of accidental over-aggressive normalisation).
16
+ //
17
+ // Notable invariants:
18
+ // - File extensions are preserved verbatim (only the stem is
19
+ // normalised), since changing the extension on `.png → .PNG` is never
20
+ // what callers want and renaming a `.psd` to `.png` would mislead
21
+ // downstream tooling.
22
+ // - Empty stems after normalisation fall back to the original name and
23
+ // surface a `would_clear_name` risk flag (critical) so the caller
24
+ // doesn't end up with empty / all-dot filenames.
25
+ // - Two assets that normalise to the same target name surface a
26
+ // `duplicate_target` flag (critical).
27
+ import { z } from 'zod';
28
+ import { MutatingTool, } from '../conventions/dry-run/index.js';
29
+ import { createToolError } from '../conventions/errors.js';
30
+ import { IdSchema } from '../types.js';
31
+ // ── Input ────────────────────────────────────────────────────────────
32
+ export const NormalizeStyleSchema = z.enum([
33
+ 'kebab-case',
34
+ 'snake_case',
35
+ 'lowercase',
36
+ 'no_spaces',
37
+ 'PascalCase',
38
+ 'camelCase',
39
+ ]);
40
+ export const BulkNormalizeFilenamesInputSchema = z.object({
41
+ asset_ids: z.array(IdSchema).min(1).max(1000),
42
+ style: NormalizeStyleSchema,
43
+ });
44
+ export const BULK_NORMALIZE_FILENAMES_DESCRIPTION = 'Normalise asset filenames to a uniform style across many assets in ' +
45
+ 'a single confirmed call. Supported styles: kebab-case, snake_case, ' +
46
+ 'lowercase, no_spaces, PascalCase, camelCase. File extensions are ' +
47
+ 'preserved verbatim. Two-step preview/confirm flow.';
48
+ export class BulkNormalizeFilenamesTool extends MutatingTool {
49
+ name = 'bulk_normalize_filenames';
50
+ chunkSize = 50;
51
+ client;
52
+ constructor(deps) {
53
+ super(deps);
54
+ this.client = deps.client;
55
+ }
56
+ async plan(input) {
57
+ const changes = [];
58
+ let noopCount = 0;
59
+ let wouldClearCount = 0;
60
+ const targetOccurrences = new Map();
61
+ for (const rawId of input.asset_ids) {
62
+ const id = String(rawId);
63
+ const current = (await this.client.getCurrentName(id)) ?? '';
64
+ if (current.length === 0) {
65
+ // Surface an empty current name as a no-op + risk-flagged change so
66
+ // the caller can see which assets we couldn't read. We push the
67
+ // change anyway so the per-item ledger has a row for each input id.
68
+ wouldClearCount++;
69
+ changes.push({
70
+ id,
71
+ operation: 'update',
72
+ before: { name: '(unknown)' },
73
+ after: { name: '(unknown)' },
74
+ metadata: { new_name: null },
75
+ });
76
+ continue;
77
+ }
78
+ const next = normalizeFilename(current, input.style);
79
+ if (next === current)
80
+ noopCount++;
81
+ const stem = stripExtension(next).stem;
82
+ if (stem.length === 0)
83
+ wouldClearCount++;
84
+ targetOccurrences.set(next, (targetOccurrences.get(next) ?? 0) + 1);
85
+ changes.push({
86
+ id,
87
+ operation: 'update',
88
+ before: { name: current },
89
+ after: { name: next },
90
+ metadata: { new_name: next },
91
+ });
92
+ }
93
+ let duplicateTargetCount = 0;
94
+ for (const [, count] of targetOccurrences) {
95
+ if (count > 1)
96
+ duplicateTargetCount += count;
97
+ }
98
+ const riskFlags = [];
99
+ if (input.asset_ids.length === 0) {
100
+ riskFlags.push({
101
+ code: 'empty_input',
102
+ severity: 'warning',
103
+ message: 'bulk_normalize_filenames received zero asset ids',
104
+ count: 0,
105
+ });
106
+ }
107
+ if (noopCount > 0) {
108
+ riskFlags.push({
109
+ code: 'noop_normalize',
110
+ severity: 'info',
111
+ message: 'name already conforms to the target style (no-op)',
112
+ count: noopCount,
113
+ });
114
+ }
115
+ if (wouldClearCount > 0) {
116
+ riskFlags.push({
117
+ code: 'would_clear_name',
118
+ severity: 'critical',
119
+ message: 'normalisation would produce an empty name; original kept (review preview row)',
120
+ count: wouldClearCount,
121
+ });
122
+ }
123
+ if (duplicateTargetCount > 0) {
124
+ riskFlags.push({
125
+ code: 'duplicate_target',
126
+ severity: 'critical',
127
+ message: 'multiple assets normalise to the same target name; the resulting workspace will have name collisions',
128
+ count: duplicateTargetCount,
129
+ });
130
+ }
131
+ return {
132
+ changes,
133
+ riskFlags,
134
+ extraAggregates: {
135
+ normalized: input.asset_ids.length,
136
+ noops: noopCount,
137
+ would_clear: wouldClearCount,
138
+ duplicate_targets: duplicateTargetCount,
139
+ },
140
+ };
141
+ }
142
+ apply = async (change) => {
143
+ const before = change.before?.['name'] ?? '(unknown)';
144
+ const meta = (change.metadata ?? {});
145
+ const newName = typeof meta.new_name === 'string' && meta.new_name.length > 0
146
+ ? meta.new_name
147
+ : null;
148
+ if (newName === null) {
149
+ return {
150
+ ok: false,
151
+ error: createToolError('VALIDATION', `change ${change.id}: no valid target name (normalisation skipped or empty)`),
152
+ };
153
+ }
154
+ if (newName === before) {
155
+ // No-op rename: report success without round-tripping the API.
156
+ return {
157
+ ok: true,
158
+ result: { asset_id: change.id, before_name: before, after_name: newName },
159
+ };
160
+ }
161
+ const result = await this.client.renameAsset(change.id, newName);
162
+ if (!result.ok)
163
+ return { ok: false, error: result.error };
164
+ return {
165
+ ok: true,
166
+ result: { asset_id: change.id, before_name: before, after_name: newName },
167
+ };
168
+ };
169
+ }
170
+ export function buildBulkNormalizeFilenamesTool(deps) {
171
+ return new BulkNormalizeFilenamesTool(deps);
172
+ }
173
+ export function stripExtension(name) {
174
+ const dot = name.lastIndexOf('.');
175
+ if (dot <= 0 || dot === name.length - 1)
176
+ return { stem: name, extension: '' };
177
+ return { stem: name.slice(0, dot), extension: name.slice(dot) };
178
+ }
179
+ /**
180
+ * Normalise a single filename. Pure function; the file extension (the
181
+ * portion after the final `.`) is preserved verbatim, only the stem is
182
+ * normalised. If the resulting stem would be empty, the original name is
183
+ * returned unchanged (a `would_clear_name` flag is surfaced by the plan
184
+ * phase so the caller is informed).
185
+ */
186
+ export function normalizeFilename(name, style) {
187
+ const { stem, extension } = stripExtension(name);
188
+ const tokens = tokenize(stem);
189
+ if (tokens.length === 0)
190
+ return name;
191
+ let nextStem;
192
+ switch (style) {
193
+ case 'kebab-case':
194
+ nextStem = tokens.map((t) => t.toLowerCase()).join('-');
195
+ break;
196
+ case 'snake_case':
197
+ nextStem = tokens.map((t) => t.toLowerCase()).join('_');
198
+ break;
199
+ case 'lowercase':
200
+ nextStem = tokens.map((t) => t.toLowerCase()).join('-');
201
+ break;
202
+ case 'no_spaces':
203
+ // Preserve original casing but join on `-`; matches the regex
204
+ // `\S+` used by audit_naming_conventions.
205
+ nextStem = tokens.join('-');
206
+ break;
207
+ case 'PascalCase':
208
+ nextStem = tokens.map((t) => capitalize(t.toLowerCase())).join('');
209
+ break;
210
+ case 'camelCase':
211
+ nextStem = tokens
212
+ .map((t, i) => i === 0 ? t.toLowerCase() : capitalize(t.toLowerCase()))
213
+ .join('');
214
+ break;
215
+ }
216
+ if (nextStem.length === 0)
217
+ return name;
218
+ return `${nextStem}${extension}`;
219
+ }
220
+ /**
221
+ * Split a filename stem into tokens. Splits on whitespace, hyphens,
222
+ * underscores, dots, and the case boundary between a lowercase letter
223
+ * and an uppercase letter (so `camelCase` → ['camel', 'Case']). Empty
224
+ * tokens are dropped.
225
+ */
226
+ function tokenize(stem) {
227
+ const withBoundaries = stem.replace(/([a-z0-9])([A-Z])/g, '$1 $2');
228
+ return withBoundaries
229
+ .split(/[\s\-_.]+/)
230
+ .filter((t) => t.length > 0);
231
+ }
232
+ function capitalize(s) {
233
+ if (s.length === 0)
234
+ return s;
235
+ return s[0].toUpperCase() + s.slice(1);
236
+ }
237
+ //# sourceMappingURL=bulk-normalize-filenames.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bulk-normalize-filenames.js","sourceRoot":"","sources":["../../src/tools/bulk-normalize-filenames.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,79 @@
1
+ import { z } from 'zod';
2
+ import { MutatingTool, type ApplyFn, type MutatingToolDeps, type PlanResult } from '../conventions/dry-run/index.js';
3
+ import type { DryRunPlan } from '../conventions/dry-run/index.js';
4
+ import { type McpToolError } from '../conventions/errors.js';
5
+ export declare const BulkRenameAssetItemSchema: z.ZodObject<{
6
+ asset_id: z.ZodUnion<[z.ZodNumber, z.ZodString]>;
7
+ /** Current name; if absent the plan looks it up via the rename client. */
8
+ current_name: z.ZodOptional<z.ZodString>;
9
+ new_name: z.ZodString;
10
+ }, "strip", z.ZodTypeAny, {
11
+ asset_id: string | number;
12
+ new_name: string;
13
+ current_name?: string | undefined;
14
+ }, {
15
+ asset_id: string | number;
16
+ new_name: string;
17
+ current_name?: string | undefined;
18
+ }>;
19
+ export type BulkRenameAssetItem = z.infer<typeof BulkRenameAssetItemSchema>;
20
+ export declare const BulkRenameAssetsInputSchema: z.ZodObject<{
21
+ renames: z.ZodArray<z.ZodObject<{
22
+ asset_id: z.ZodUnion<[z.ZodNumber, z.ZodString]>;
23
+ /** Current name; if absent the plan looks it up via the rename client. */
24
+ current_name: z.ZodOptional<z.ZodString>;
25
+ new_name: z.ZodString;
26
+ }, "strip", z.ZodTypeAny, {
27
+ asset_id: string | number;
28
+ new_name: string;
29
+ current_name?: string | undefined;
30
+ }, {
31
+ asset_id: string | number;
32
+ new_name: string;
33
+ current_name?: string | undefined;
34
+ }>, "many">;
35
+ }, "strip", z.ZodTypeAny, {
36
+ renames: {
37
+ asset_id: string | number;
38
+ new_name: string;
39
+ current_name?: string | undefined;
40
+ }[];
41
+ }, {
42
+ renames: {
43
+ asset_id: string | number;
44
+ new_name: string;
45
+ current_name?: string | undefined;
46
+ }[];
47
+ }>;
48
+ export type BulkRenameAssetsInput = z.infer<typeof BulkRenameAssetsInputSchema>;
49
+ export declare const BULK_RENAME_ASSETS_DESCRIPTION: string;
50
+ export interface BulkRenameItemResult {
51
+ asset_id: string;
52
+ before_name: string;
53
+ after_name: string;
54
+ }
55
+ export interface BulkRenameClient {
56
+ /** Read the current name for diff display. Returns null when unavailable. */
57
+ getCurrentName(assetId: string): Promise<string | null>;
58
+ /** Perform the rename. */
59
+ renameAsset(assetId: string, newName: string): Promise<{
60
+ ok: true;
61
+ } | {
62
+ ok: false;
63
+ error: McpToolError;
64
+ }>;
65
+ }
66
+ export interface BulkRenameAssetsDeps extends MutatingToolDeps<BulkRenameAssetsInput> {
67
+ client: BulkRenameClient;
68
+ }
69
+ export declare class BulkRenameAssetsTool extends MutatingTool<BulkRenameAssetsInput, BulkRenameItemResult> {
70
+ readonly name = "bulk_rename_assets";
71
+ protected readonly chunkSize = 50;
72
+ private readonly client;
73
+ constructor(deps: BulkRenameAssetsDeps);
74
+ protected plan(input: BulkRenameAssetsInput): Promise<PlanResult>;
75
+ protected apply: ApplyFn<BulkRenameItemResult>;
76
+ }
77
+ export declare function buildBulkRenameAssetsTool(deps: BulkRenameAssetsDeps): BulkRenameAssetsTool;
78
+ export type BulkRenameAssetsPlan = DryRunPlan<BulkRenameAssetsInput>;
79
+ //# sourceMappingURL=bulk-rename-assets.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bulk-rename-assets.d.ts","sourceRoot":"","sources":["../../src/tools/bulk-rename-assets.ts"],"names":[],"mappings":"AAkBA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EACL,YAAY,EACZ,KAAK,OAAO,EACZ,KAAK,gBAAgB,EACrB,KAAK,UAAU,EAEhB,MAAM,iCAAiC,CAAC;AACzC,OAAO,KAAK,EAAgB,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAChF,OAAO,EAAmB,KAAK,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAK9E,eAAO,MAAM,yBAAyB;;IAEpC,0EAA0E;;;;;;;;;;;EAG1E,CAAC;AACH,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,yBAAyB,CAAC,CAAC;AAE5E,eAAO,MAAM,2BAA2B;;;QANtC,0EAA0E;;;;;;;;;;;;;;;;;;;;;;;;EAQ1E,CAAC;AACH,MAAM,MAAM,qBAAqB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,2BAA2B,CAAC,CAAC;AAEhF,eAAO,MAAM,8BAA8B,QAIoB,CAAC;AAIhE,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;CACpB;AAID,MAAM,WAAW,gBAAgB;IAC/B,6EAA6E;IAC7E,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IACxD,0BAA0B;IAC1B,WAAW,CACT,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,GACd,OAAO,CAAC;QAAE,EAAE,EAAE,IAAI,CAAA;KAAE,GAAG;QAAE,EAAE,EAAE,KAAK,CAAC;QAAC,KAAK,EAAE,YAAY,CAAA;KAAE,CAAC,CAAC;CAC/D;AAID,MAAM,WAAW,oBAAqB,SAAQ,gBAAgB,CAAC,qBAAqB,CAAC;IACnF,MAAM,EAAE,gBAAgB,CAAC;CAC1B;AAED,qBAAa,oBAAqB,SAAQ,YAAY,CACpD,qBAAqB,EACrB,oBAAoB,CACrB;IACC,QAAQ,CAAC,IAAI,wBAAwB;IACrC,mBAA4B,SAAS,MAAM;IAE3C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAmB;gBAE9B,IAAI,EAAE,oBAAoB;cAKtB,IAAI,CAAC,KAAK,EAAE,qBAAqB,GAAG,OAAO,CAAC,UAAU,CAAC;IA+EvE,SAAS,CAAC,KAAK,EAAE,OAAO,CAAC,oBAAoB,CAAC,CAmB5C;CACH;AAED,wBAAgB,yBAAyB,CACvC,IAAI,EAAE,oBAAoB,GACzB,oBAAoB,CAEtB;AAED,MAAM,MAAM,oBAAoB,GAAG,UAAU,CAAC,qBAAqB,CAAC,CAAC"}
@@ -0,0 +1,139 @@
1
+ // ── bulk_rename_assets (T6, Phase 1.5) ───────────────────────────────
2
+ //
3
+ // Mutating tool. Renames many assets in a single confirmed call. Built on
4
+ // top of the shared `MutatingTool` base (so the dry-run / confirmation /
5
+ // per-item-ledger framework wraps the operation automatically).
6
+ //
7
+ // Input is a list of explicit `{ asset_id, new_name, current_name? }`
8
+ // entries — same shape as `rename_asset`'s `RenameAssetItem`, just at the
9
+ // bulk surface. Selection-style (query / collection_id) does NOT belong
10
+ // here: rename is per-asset and needs a target name per asset, so callers
11
+ // must enumerate explicitly.
12
+ //
13
+ // Risk flags emitted in the plan phase:
14
+ // - `noop_rename` (info) — rename to identical name
15
+ // - `long_name` (warning) — new_name longer than 200 chars
16
+ // - `duplicate_target` (critical) — two items rename to the same name
17
+ // - `empty_input` (warning) — zero renames in input
18
+ import { z } from 'zod';
19
+ import { MutatingTool, } from '../conventions/dry-run/index.js';
20
+ import { createToolError } from '../conventions/errors.js';
21
+ import { IdSchema } from '../types.js';
22
+ // ── Input ────────────────────────────────────────────────────────────
23
+ export const BulkRenameAssetItemSchema = z.object({
24
+ asset_id: IdSchema,
25
+ /** Current name; if absent the plan looks it up via the rename client. */
26
+ current_name: z.string().min(1).optional(),
27
+ new_name: z.string().min(1).max(255),
28
+ });
29
+ export const BulkRenameAssetsInputSchema = z.object({
30
+ renames: z.array(BulkRenameAssetItemSchema).min(1).max(1000),
31
+ });
32
+ export const BULK_RENAME_ASSETS_DESCRIPTION = 'Rename many Collage assets in a single confirmed call. Each entry is ' +
33
+ '`{ asset_id, new_name, current_name? }`. Two-step: first call returns ' +
34
+ 'a preview + confirmation_token; second call (with the token) executes ' +
35
+ 'the renames in batches of 50 and returns a per-item ledger.';
36
+ export class BulkRenameAssetsTool extends MutatingTool {
37
+ name = 'bulk_rename_assets';
38
+ chunkSize = 50;
39
+ client;
40
+ constructor(deps) {
41
+ super(deps);
42
+ this.client = deps.client;
43
+ }
44
+ async plan(input) {
45
+ const changes = [];
46
+ let noopCount = 0;
47
+ let longNameCount = 0;
48
+ const nameOccurrences = new Map();
49
+ for (const item of input.renames) {
50
+ const id = String(item.asset_id);
51
+ const before = item.current_name ?? (await this.client.getCurrentName(id)) ?? '(unknown)';
52
+ const isNoop = before === item.new_name;
53
+ if (isNoop)
54
+ noopCount++;
55
+ if (item.new_name.length > 200)
56
+ longNameCount++;
57
+ nameOccurrences.set(item.new_name, (nameOccurrences.get(item.new_name) ?? 0) + 1);
58
+ changes.push({
59
+ id,
60
+ operation: 'update',
61
+ before: { name: before },
62
+ after: { name: item.new_name },
63
+ metadata: { new_name: item.new_name },
64
+ });
65
+ }
66
+ let duplicateTargetCount = 0;
67
+ for (const [, count] of nameOccurrences) {
68
+ if (count > 1)
69
+ duplicateTargetCount += count;
70
+ }
71
+ const riskFlags = [];
72
+ if (input.renames.length === 0) {
73
+ riskFlags.push({
74
+ code: 'empty_input',
75
+ severity: 'warning',
76
+ message: 'bulk_rename_assets received zero rename entries',
77
+ count: 0,
78
+ });
79
+ }
80
+ if (noopCount > 0) {
81
+ riskFlags.push({
82
+ code: 'noop_rename',
83
+ severity: 'info',
84
+ message: 'rename to identical name (no-op)',
85
+ count: noopCount,
86
+ });
87
+ }
88
+ if (longNameCount > 0) {
89
+ riskFlags.push({
90
+ code: 'long_name',
91
+ severity: 'warning',
92
+ message: 'name exceeds 200 characters',
93
+ count: longNameCount,
94
+ });
95
+ }
96
+ if (duplicateTargetCount > 0) {
97
+ riskFlags.push({
98
+ code: 'duplicate_target',
99
+ severity: 'critical',
100
+ message: 'multiple items rename to the same target name; the resulting workspace will have name collisions',
101
+ count: duplicateTargetCount,
102
+ });
103
+ }
104
+ return {
105
+ changes,
106
+ riskFlags,
107
+ extraAggregates: {
108
+ renames: input.renames.length,
109
+ noops: noopCount,
110
+ long_names: longNameCount,
111
+ duplicate_targets: duplicateTargetCount,
112
+ },
113
+ };
114
+ }
115
+ apply = async (change) => {
116
+ const before = change.before?.['name'] ?? '(unknown)';
117
+ const meta = (change.metadata ?? {});
118
+ const newName = typeof meta.new_name === 'string' && meta.new_name.length > 0
119
+ ? meta.new_name
120
+ : change.after?.['name'] ?? null;
121
+ if (newName === null) {
122
+ return {
123
+ ok: false,
124
+ error: createToolError('VALIDATION', `change ${change.id} missing new_name`),
125
+ };
126
+ }
127
+ const result = await this.client.renameAsset(change.id, newName);
128
+ if (!result.ok)
129
+ return { ok: false, error: result.error };
130
+ return {
131
+ ok: true,
132
+ result: { asset_id: change.id, before_name: before, after_name: newName },
133
+ };
134
+ };
135
+ }
136
+ export function buildBulkRenameAssetsTool(deps) {
137
+ return new BulkRenameAssetsTool(deps);
138
+ }
139
+ //# sourceMappingURL=bulk-rename-assets.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bulk-rename-assets.js","sourceRoot":"","sources":["../../src/tools/bulk-rename-assets.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,107 @@
1
+ import { z } from 'zod';
2
+ import { MutatingTool, type ApplyFn, type MutatingToolDeps, type PlanResult } from '../conventions/dry-run/index.js';
3
+ import type { DryRunPlan } from '../conventions/dry-run/index.js';
4
+ import { createToolError, type McpToolError } from '../conventions/errors.js';
5
+ import { type AssetSearchAdapter, type AssetSelection, type CollectionLookup } from './asset-selection.js';
6
+ export declare const BulkTagsInputSchema: z.ZodObject<{
7
+ selection: z.ZodEffects<z.ZodObject<{
8
+ query: z.ZodOptional<z.ZodString>;
9
+ ids: z.ZodOptional<z.ZodArray<z.ZodUnion<[z.ZodNumber, z.ZodString]>, "many">>;
10
+ collection_id: z.ZodOptional<z.ZodUnion<[z.ZodNumber, z.ZodString]>>;
11
+ }, "strip", z.ZodTypeAny, {
12
+ query?: string | undefined;
13
+ collection_id?: string | number | undefined;
14
+ ids?: (string | number)[] | undefined;
15
+ }, {
16
+ query?: string | undefined;
17
+ collection_id?: string | number | undefined;
18
+ ids?: (string | number)[] | undefined;
19
+ }>, {
20
+ query?: string | undefined;
21
+ collection_id?: string | number | undefined;
22
+ ids?: (string | number)[] | undefined;
23
+ }, {
24
+ query?: string | undefined;
25
+ collection_id?: string | number | undefined;
26
+ ids?: (string | number)[] | undefined;
27
+ }>;
28
+ tags: z.ZodArray<z.ZodString, "many">;
29
+ }, "strip", z.ZodTypeAny, {
30
+ tags: string[];
31
+ selection: {
32
+ query?: string | undefined;
33
+ collection_id?: string | number | undefined;
34
+ ids?: (string | number)[] | undefined;
35
+ };
36
+ }, {
37
+ tags: string[];
38
+ selection: {
39
+ query?: string | undefined;
40
+ collection_id?: string | number | undefined;
41
+ ids?: (string | number)[] | undefined;
42
+ };
43
+ }>;
44
+ export type BulkTagsInput = z.infer<typeof BulkTagsInputSchema>;
45
+ export declare const BULK_SET_TAGS_DESCRIPTION: string;
46
+ export declare const BULK_ADD_TAGS_DESCRIPTION: string;
47
+ export declare const BULK_REMOVE_TAGS_DESCRIPTION: string;
48
+ export interface BulkTagsItemResult {
49
+ asset_id: string;
50
+ before_tags: string[];
51
+ after_tags: string[];
52
+ }
53
+ export interface BulkTagsClient {
54
+ /**
55
+ * Read the current tag list for an asset. Returns null only if the asset
56
+ * itself can't be resolved (NOT_FOUND); empty array means "no tags".
57
+ */
58
+ getCurrentTags(assetId: string): Promise<{
59
+ ok: true;
60
+ tags: string[];
61
+ } | {
62
+ ok: false;
63
+ error: McpToolError;
64
+ }>;
65
+ /** Replace the tag set on an asset with the provided list. */
66
+ setTags(assetId: string, tags: string[]): Promise<{
67
+ ok: true;
68
+ } | {
69
+ ok: false;
70
+ error: McpToolError;
71
+ }>;
72
+ }
73
+ type BulkTagOp = 'set' | 'add' | 'remove';
74
+ export interface BulkTagsDeps extends MutatingToolDeps<BulkTagsInput> {
75
+ client: BulkTagsClient;
76
+ search: AssetSearchAdapter;
77
+ collections: CollectionLookup;
78
+ }
79
+ declare abstract class BulkTagsTool extends MutatingTool<BulkTagsInput, BulkTagsItemResult> {
80
+ protected readonly chunkSize = 50;
81
+ protected abstract readonly op: BulkTagOp;
82
+ protected readonly client: BulkTagsClient;
83
+ protected readonly search: AssetSearchAdapter;
84
+ protected readonly collections: CollectionLookup;
85
+ constructor(deps: BulkTagsDeps);
86
+ protected plan(input: BulkTagsInput): Promise<PlanResult>;
87
+ protected apply: ApplyFn<BulkTagsItemResult>;
88
+ }
89
+ export declare class BulkSetTagsTool extends BulkTagsTool {
90
+ readonly name = "bulk_set_tags";
91
+ protected readonly op: BulkTagOp;
92
+ }
93
+ export declare class BulkAddTagsTool extends BulkTagsTool {
94
+ readonly name = "bulk_add_tags";
95
+ protected readonly op: BulkTagOp;
96
+ }
97
+ export declare class BulkRemoveTagsTool extends BulkTagsTool {
98
+ readonly name = "bulk_remove_tags";
99
+ protected readonly op: BulkTagOp;
100
+ }
101
+ export declare function buildBulkSetTagsTool(deps: BulkTagsDeps): BulkSetTagsTool;
102
+ export declare function buildBulkAddTagsTool(deps: BulkTagsDeps): BulkAddTagsTool;
103
+ export declare function buildBulkRemoveTagsTool(deps: BulkTagsDeps): BulkRemoveTagsTool;
104
+ export type BulkTagsPlan = DryRunPlan<BulkTagsInput>;
105
+ export type { AssetSelection };
106
+ export { createToolError };
107
+ //# sourceMappingURL=bulk-tags.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bulk-tags.d.ts","sourceRoot":"","sources":["../../src/tools/bulk-tags.ts"],"names":[],"mappings":"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"}