@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,77 @@
1
+ import { z } from 'zod';
2
+ import { type McpToolError } from '../../conventions/errors.js';
3
+ import { type AuditReport } from './types.js';
4
+ export declare const AUDIT_TAGGING_HYGIENE_DESCRIPTION: string;
5
+ export declare const AuditTaggingHygieneInputSchema: z.ZodObject<{
6
+ /**
7
+ * Tags applied to fewer than this many assets are flagged as
8
+ * `low_coverage_tags`. Must be >= 2 (a tag with coverage = 1 is an
9
+ * orphan, reported separately). Defaults to 3.
10
+ */
11
+ min_coverage: z.ZodDefault<z.ZodNumber>;
12
+ /**
13
+ * Maximum number of asset IDs to include per finding's
14
+ * `sample_asset_ids`. Defaults to 10. The full count is always
15
+ * reported in `count`.
16
+ */
17
+ sample_limit: z.ZodDefault<z.ZodNumber>;
18
+ }, "strip", z.ZodTypeAny, {
19
+ min_coverage: number;
20
+ sample_limit: number;
21
+ }, {
22
+ min_coverage?: number | undefined;
23
+ sample_limit?: number | undefined;
24
+ }>;
25
+ export type AuditTaggingHygieneInput = z.input<typeof AuditTaggingHygieneInputSchema>;
26
+ export type AuditTaggingHygieneInputResolved = z.output<typeof AuditTaggingHygieneInputSchema>;
27
+ /**
28
+ * Minimal asset shape consumed by the audit. The enumerator adapter is
29
+ * responsible for projecting the full `DigitalAsset` into this shape, so
30
+ * the audit stays decoupled from the live API response schema (and tests
31
+ * can supply fixtures without constructing full assets).
32
+ */
33
+ export interface AuditAsset {
34
+ id: string;
35
+ tags: string[];
36
+ }
37
+ /**
38
+ * Narrow surface the audit depends on for fetching every asset in the
39
+ * current workspace scope. Implementations may paginate internally; the
40
+ * audit only sees a flat array.
41
+ *
42
+ * Returning a typed `McpToolError` (rather than throwing) keeps failure
43
+ * routing inside the canonical error taxonomy.
44
+ */
45
+ export interface AssetEnumerator {
46
+ enumerateAssets(): Promise<{
47
+ ok: true;
48
+ assets: AuditAsset[];
49
+ } | {
50
+ ok: false;
51
+ error: McpToolError;
52
+ }>;
53
+ }
54
+ export interface AuditTaggingHygieneDeps {
55
+ enumerator: AssetEnumerator;
56
+ }
57
+ export type AuditTaggingHygieneOutcome = {
58
+ ok: true;
59
+ report: AuditReport;
60
+ } | {
61
+ ok: false;
62
+ error: McpToolError;
63
+ };
64
+ export declare class AuditTaggingHygieneTool {
65
+ private readonly deps;
66
+ readonly name = "audit_tagging_hygiene";
67
+ readonly description: string;
68
+ constructor(deps: AuditTaggingHygieneDeps);
69
+ run(rawInput?: AuditTaggingHygieneInput): Promise<AuditTaggingHygieneOutcome>;
70
+ }
71
+ export declare function buildAuditTaggingHygieneTool(deps: AuditTaggingHygieneDeps): AuditTaggingHygieneTool;
72
+ /**
73
+ * Build the full audit report from a flat list of assets. Pure function,
74
+ * exported for direct test access.
75
+ */
76
+ export declare function buildReport(assets: ReadonlyArray<AuditAsset>, input: AuditTaggingHygieneInputResolved): AuditReport;
77
+ //# sourceMappingURL=audit-tagging-hygiene.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audit-tagging-hygiene.d.ts","sourceRoot":"","sources":["../../../src/tools/audit/audit-tagging-hygiene.ts"],"names":[],"mappings":"AAgCA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAmB,KAAK,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAEjF,OAAO,EAKL,KAAK,WAAW,EAEjB,MAAM,YAAY,CAAC;AAIpB,eAAO,MAAM,iCAAiC,QAKuB,CAAC;AAQtE,eAAO,MAAM,8BAA8B;IACzC;;;;OAIG;;IAEH;;;;OAIG;;;;;;;;EAEH,CAAC;AACH,MAAM,MAAM,wBAAwB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,8BAA8B,CAAC,CAAC;AACtF,MAAM,MAAM,gCAAgC,GAC1C,CAAC,CAAC,MAAM,CAAC,OAAO,8BAA8B,CAAC,CAAC;AAIlD;;;;;GAKG;AACH,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,EAAE,CAAC;CAChB;AAID;;;;;;;GAOG;AACH,MAAM,WAAW,eAAe;IAC9B,eAAe,IAAI,OAAO,CACtB;QAAE,EAAE,EAAE,IAAI,CAAC;QAAC,MAAM,EAAE,UAAU,EAAE,CAAA;KAAE,GAClC;QAAE,EAAE,EAAE,KAAK,CAAC;QAAC,KAAK,EAAE,YAAY,CAAA;KAAE,CACrC,CAAC;CACH;AAID,MAAM,WAAW,uBAAuB;IACtC,UAAU,EAAE,eAAe,CAAC;CAC7B;AAED,MAAM,MAAM,0BAA0B,GAClC;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,MAAM,EAAE,WAAW,CAAA;CAAE,GACjC;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,YAAY,CAAA;CAAE,CAAC;AAEvC,qBAAa,uBAAuB;IAItB,OAAO,CAAC,QAAQ,CAAC,IAAI;IAHjC,QAAQ,CAAC,IAAI,2BAA2B;IACxC,QAAQ,CAAC,WAAW,SAAqC;gBAE5B,IAAI,EAAE,uBAAuB;IAEpD,GAAG,CAAC,QAAQ,GAAE,wBAA6B,GAAG,OAAO,CAAC,0BAA0B,CAAC;CAsBxF;AAED,wBAAgB,4BAA4B,CAC1C,IAAI,EAAE,uBAAuB,GAC5B,uBAAuB,CAEzB;AAID;;;GAGG;AACH,wBAAgB,WAAW,CACzB,MAAM,EAAE,aAAa,CAAC,UAAU,CAAC,EACjC,KAAK,EAAE,gCAAgC,GACtC,WAAW,CAeb"}
@@ -0,0 +1,402 @@
1
+ // ── audit_tagging_hygiene (T3) ───────────────────────────────────────
2
+ //
3
+ // Read-only audit tool. Walks the assets in scope, detects four classes of
4
+ // tagging-hygiene problems, scores them, and emits structured next-step
5
+ // hints that point at the existing `bulk_*_tags` mutating tools.
6
+ //
7
+ // IMPORTANT: this tool is read-only. It does NOT extend `MutatingTool` and
8
+ // does NOT participate in the dry-run / confirmation handshake. Callers
9
+ // take an audit report, decide which findings to act on, and invoke the
10
+ // suggested mutating tool with the suggested args — that mutating tool
11
+ // then runs its own preview/confirm flow.
12
+ //
13
+ // Detected categories:
14
+ // - untagged_assets — assets with zero tags
15
+ // - inconsistent_casing — same tag name appearing in multiple casings
16
+ // on the same workspace (e.g. "Marketing" and
17
+ // "marketing")
18
+ // - orphan_tags — tags applied to <= 1 asset
19
+ // - low_coverage_tags — tags applied to fewer than `min_coverage`
20
+ // assets (default 3); orphans are reported
21
+ // separately and excluded from this bucket
22
+ //
23
+ // Scoring: deterministic, computed by `computeAuditScore` over findings.
24
+ // See `types.ts` for the formula.
25
+ //
26
+ // Response budget: findings are accumulated, then the full report is
27
+ // serialised; if it exceeds `HARD_CAP_TOKENS` we drop low-severity
28
+ // findings first (info < warning < critical) and shrink each finding's
29
+ // `sample_asset_ids` to a smaller cap, marking `truncated: true`. We
30
+ // always preserve at least one finding from each surviving category so
31
+ // the caller still sees the shape of the problem.
32
+ import { z } from 'zod';
33
+ import { createToolError } from '../../conventions/errors.js';
34
+ import { estimateTokens, HARD_CAP_TOKENS } from '../../conventions/response-budget.js';
35
+ import { computeAuditScore, summarizeFindings, } from './types.js';
36
+ // ── Tool description ─────────────────────────────────────────────────
37
+ export const AUDIT_TAGGING_HYGIENE_DESCRIPTION = 'Read-only audit of tagging hygiene across the workspace. Detects ' +
38
+ 'untagged assets, inconsistent tag casing, orphan tags, and ' +
39
+ 'low-coverage tags. Returns a 0-100 score, structured findings, and ' +
40
+ 'next-step hints pointing at the existing bulk_set_tags / ' +
41
+ 'bulk_add_tags / bulk_remove_tags tools. Does not mutate anything.';
42
+ // ── Input schema ─────────────────────────────────────────────────────
43
+ const DEFAULT_MIN_COVERAGE = 3;
44
+ const DEFAULT_SAMPLE_LIMIT = 10;
45
+ const REDUCED_SAMPLE_LIMIT = 3;
46
+ export const AuditTaggingHygieneInputSchema = z.object({
47
+ /**
48
+ * Tags applied to fewer than this many assets are flagged as
49
+ * `low_coverage_tags`. Must be >= 2 (a tag with coverage = 1 is an
50
+ * orphan, reported separately). Defaults to 3.
51
+ */
52
+ min_coverage: z.number().int().min(2).max(1000).default(DEFAULT_MIN_COVERAGE),
53
+ /**
54
+ * Maximum number of asset IDs to include per finding's
55
+ * `sample_asset_ids`. Defaults to 10. The full count is always
56
+ * reported in `count`.
57
+ */
58
+ sample_limit: z.number().int().min(1).max(100).default(DEFAULT_SAMPLE_LIMIT),
59
+ });
60
+ export class AuditTaggingHygieneTool {
61
+ deps;
62
+ name = 'audit_tagging_hygiene';
63
+ description = AUDIT_TAGGING_HYGIENE_DESCRIPTION;
64
+ constructor(deps) {
65
+ this.deps = deps;
66
+ }
67
+ async run(rawInput = {}) {
68
+ let parsed;
69
+ try {
70
+ parsed = AuditTaggingHygieneInputSchema.parse(rawInput);
71
+ }
72
+ catch (err) {
73
+ return {
74
+ ok: false,
75
+ error: createToolError('VALIDATION', err instanceof Error ? err.message : 'invalid input'),
76
+ };
77
+ }
78
+ const enumerated = await this.deps.enumerator.enumerateAssets();
79
+ if (!enumerated.ok) {
80
+ return { ok: false, error: enumerated.error };
81
+ }
82
+ const report = buildReport(enumerated.assets, parsed);
83
+ return { ok: true, report };
84
+ }
85
+ }
86
+ export function buildAuditTaggingHygieneTool(deps) {
87
+ return new AuditTaggingHygieneTool(deps);
88
+ }
89
+ // ── Detection + scoring (pure) ───────────────────────────────────────
90
+ /**
91
+ * Build the full audit report from a flat list of assets. Pure function,
92
+ * exported for direct test access.
93
+ */
94
+ export function buildReport(assets, input) {
95
+ const findings = detectFindings(assets, input);
96
+ const nextSteps = buildNextSteps(findings);
97
+ const score = computeAuditScore(findings);
98
+ const summary = summarizeFindings(findings, assets.length);
99
+ const initial = {
100
+ score,
101
+ summary_counts: summary,
102
+ findings,
103
+ next_steps: nextSteps,
104
+ truncated: false,
105
+ };
106
+ return enforceResponseBudget(initial);
107
+ }
108
+ function detectFindings(assets, input) {
109
+ const drafts = [];
110
+ const assetById = new Map();
111
+ for (const a of assets)
112
+ assetById.set(a.id, a);
113
+ // ── Untagged ──
114
+ const untagged = assets.filter((a) => a.tags.length === 0);
115
+ if (untagged.length > 0) {
116
+ const criticalThreshold = Math.max(1, Math.ceil(assets.length * 0.25));
117
+ drafts.push({
118
+ category: 'untagged_assets',
119
+ severity: untagged.length >= criticalThreshold ? 'critical' : 'warning',
120
+ count: untagged.length,
121
+ sample_asset_ids: untagged.slice(0, input.sample_limit).map((a) => a.id),
122
+ affected_asset_ids: untagged.map((a) => a.id),
123
+ message: untagged.length === 1
124
+ ? '1 asset has no tags.'
125
+ : `${untagged.length} assets have no tags.`,
126
+ });
127
+ }
128
+ // ── Tag coverage map (case-sensitive for inconsistency detection) ──
129
+ const tagToAssets = new Map();
130
+ for (const asset of assets) {
131
+ for (const tag of asset.tags) {
132
+ let bucket = tagToAssets.get(tag);
133
+ if (bucket === undefined) {
134
+ bucket = [];
135
+ tagToAssets.set(tag, bucket);
136
+ }
137
+ bucket.push(asset.id);
138
+ }
139
+ }
140
+ // ── Inconsistent casing ──
141
+ // Group case-sensitive tag names by their lowercased form. Any group with
142
+ // > 1 distinct casing is a finding. The suggested fix is to consolidate
143
+ // every variant onto the most-used casing.
144
+ const casingGroups = new Map();
145
+ for (const tag of tagToAssets.keys()) {
146
+ const key = tag.toLowerCase();
147
+ let group = casingGroups.get(key);
148
+ if (group === undefined) {
149
+ group = [];
150
+ casingGroups.set(key, group);
151
+ }
152
+ group.push(tag);
153
+ }
154
+ const casingReplacements = new Map(); // straggler -> canonical
155
+ for (const [, variants] of casingGroups) {
156
+ if (variants.length < 2)
157
+ continue;
158
+ // Choose canonical = variant with highest asset count, ties broken
159
+ // by lexicographic order for determinism.
160
+ const sorted = [...variants].sort((a, b) => {
161
+ const ca = tagToAssets.get(a)?.length ?? 0;
162
+ const cb = tagToAssets.get(b)?.length ?? 0;
163
+ if (cb !== ca)
164
+ return cb - ca;
165
+ return a.localeCompare(b);
166
+ });
167
+ const canonical = sorted[0];
168
+ const stragglers = sorted.slice(1);
169
+ for (const s of stragglers)
170
+ casingReplacements.set(s, canonical);
171
+ // Affected assets: every asset that has any non-canonical variant.
172
+ const affectedSet = new Set();
173
+ for (const variant of stragglers) {
174
+ const ids = tagToAssets.get(variant) ?? [];
175
+ for (const id of ids)
176
+ affectedSet.add(id);
177
+ }
178
+ // Build the per-asset target tag set: replace every straggler with
179
+ // canonical, deduplicating while preserving original order.
180
+ const setTargets = new Map();
181
+ for (const id of affectedSet) {
182
+ const asset = assetById.get(id);
183
+ if (asset === undefined)
184
+ continue;
185
+ const next = [];
186
+ const seen = new Set();
187
+ for (const tag of asset.tags) {
188
+ const replacement = casingReplacements.get(tag) ?? tag;
189
+ if (!seen.has(replacement)) {
190
+ seen.add(replacement);
191
+ next.push(replacement);
192
+ }
193
+ }
194
+ setTargets.set(id, next);
195
+ }
196
+ const affectedIds = [...affectedSet];
197
+ drafts.push({
198
+ category: 'inconsistent_casing',
199
+ severity: 'warning',
200
+ count: affectedIds.length,
201
+ sample_asset_ids: affectedIds.slice(0, input.sample_limit),
202
+ affected_asset_ids: affectedIds,
203
+ tags: variants,
204
+ set_tag_targets: setTargets,
205
+ message: `Tag "${canonical.toLowerCase()}" appears in ${variants.length} different casings (${variants.map((v) => `"${v}"`).join(', ')}); consolidate onto "${canonical}".`,
206
+ });
207
+ }
208
+ // ── Orphan + low-coverage tags ──
209
+ const orphanTags = [];
210
+ const orphanAssetIds = new Set();
211
+ const lowCoverageTags = [];
212
+ const lowCoverageAssetIds = new Set();
213
+ for (const [tag, ids] of tagToAssets) {
214
+ if (ids.length <= 1) {
215
+ orphanTags.push(tag);
216
+ for (const id of ids)
217
+ orphanAssetIds.add(id);
218
+ }
219
+ else if (ids.length < input.min_coverage) {
220
+ lowCoverageTags.push(tag);
221
+ for (const id of ids)
222
+ lowCoverageAssetIds.add(id);
223
+ }
224
+ }
225
+ if (orphanTags.length > 0) {
226
+ const ids = [...orphanAssetIds];
227
+ drafts.push({
228
+ category: 'orphan_tags',
229
+ severity: 'info',
230
+ count: orphanTags.length,
231
+ sample_asset_ids: ids.slice(0, input.sample_limit),
232
+ affected_asset_ids: ids,
233
+ tags: orphanTags,
234
+ message: orphanTags.length === 1
235
+ ? `1 tag is applied to a single asset (orphan): "${orphanTags[0]}".`
236
+ : `${orphanTags.length} tags are each applied to a single asset (orphans).`,
237
+ });
238
+ }
239
+ if (lowCoverageTags.length > 0) {
240
+ const ids = [...lowCoverageAssetIds];
241
+ drafts.push({
242
+ category: 'low_coverage_tags',
243
+ severity: 'info',
244
+ count: lowCoverageTags.length,
245
+ sample_asset_ids: ids.slice(0, input.sample_limit),
246
+ affected_asset_ids: ids,
247
+ tags: lowCoverageTags,
248
+ message: `${lowCoverageTags.length} tag${lowCoverageTags.length === 1 ? '' : 's'} appear on fewer than ${input.min_coverage} assets.`,
249
+ });
250
+ }
251
+ // Promote drafts to findings with stable IDs.
252
+ return drafts.map((d, idx) => {
253
+ const meta = { affected_asset_ids: d.affected_asset_ids };
254
+ if (d.tags !== undefined)
255
+ meta.tags = d.tags;
256
+ if (d.set_tag_targets !== undefined) {
257
+ meta.set_tag_targets = Object.fromEntries(d.set_tag_targets);
258
+ }
259
+ const finding = {
260
+ id: `${d.category}:${idx}`,
261
+ category: d.category,
262
+ severity: d.severity,
263
+ count: d.count,
264
+ sample_asset_ids: d.sample_asset_ids,
265
+ message: d.message,
266
+ meta,
267
+ };
268
+ return finding;
269
+ });
270
+ }
271
+ function buildNextSteps(findings) {
272
+ const steps = [];
273
+ for (const finding of findings) {
274
+ const meta = (finding.meta ?? undefined);
275
+ const targets = meta?.affected_asset_ids ?? [];
276
+ if (targets.length === 0)
277
+ continue;
278
+ switch (finding.category) {
279
+ case 'untagged_assets':
280
+ // We cannot suggest concrete tags without LLM input — but we can
281
+ // still hand the caller the asset list pre-targeted at
282
+ // `bulk_add_tags`, leaving `suggested_tags` empty so the caller
283
+ // (or a higher-level prompt flow) supplies them.
284
+ steps.push({
285
+ action: 'add_tags',
286
+ tool: 'bulk_add_tags',
287
+ target_asset_ids: targets,
288
+ reason: 'These assets have no tags. Use bulk_add_tags to apply your standard tag set.',
289
+ finding_id: finding.id,
290
+ });
291
+ break;
292
+ case 'inconsistent_casing': {
293
+ // For each affected asset, the desired tag set is precomputed in
294
+ // `set_tag_targets`. Group assets by serialised target tag set so
295
+ // assets with identical targets share a single hint.
296
+ const groups = new Map();
297
+ const targetMap = meta?.set_tag_targets ?? {};
298
+ for (const id of targets) {
299
+ const tags = targetMap[id] ?? [];
300
+ const key = JSON.stringify(tags);
301
+ let bucket = groups.get(key);
302
+ if (bucket === undefined) {
303
+ bucket = [];
304
+ groups.set(key, bucket);
305
+ }
306
+ bucket.push(id);
307
+ }
308
+ for (const [key, ids] of groups) {
309
+ const tags = JSON.parse(key);
310
+ steps.push({
311
+ action: 'set_tags',
312
+ tool: 'bulk_set_tags',
313
+ target_asset_ids: ids,
314
+ suggested_tags: tags,
315
+ reason: 'Consolidate tag casing variants onto a single canonical form via bulk_set_tags.',
316
+ finding_id: finding.id,
317
+ });
318
+ }
319
+ break;
320
+ }
321
+ case 'orphan_tags':
322
+ case 'low_coverage_tags': {
323
+ const tags = meta?.tags ?? [];
324
+ if (tags.length === 0)
325
+ break;
326
+ steps.push({
327
+ action: 'remove_tags',
328
+ tool: 'bulk_remove_tags',
329
+ target_asset_ids: targets,
330
+ suggested_tags: tags,
331
+ reason: finding.category === 'orphan_tags'
332
+ ? 'These tags are applied to a single asset each. Either standardise them across more assets or remove them via bulk_remove_tags.'
333
+ : 'These tags fall below the coverage threshold. Consider removing them via bulk_remove_tags or expanding their application.',
334
+ finding_id: finding.id,
335
+ });
336
+ break;
337
+ }
338
+ default:
339
+ break;
340
+ }
341
+ }
342
+ return steps;
343
+ }
344
+ // ── Response-budget enforcement ──────────────────────────────────────
345
+ /**
346
+ * If the serialised report exceeds {@link HARD_CAP_TOKENS}, progressively
347
+ * shrink it until it fits, then mark it as truncated.
348
+ *
349
+ * Strategy (in order):
350
+ * 1. Reduce every finding's `sample_asset_ids` cap to
351
+ * {@link REDUCED_SAMPLE_LIMIT} and trim each next-step's
352
+ * `target_asset_ids` to the same.
353
+ * 2. Drop low-severity findings (info first, then warning) and their
354
+ * paired next-steps until the report fits or only critical findings
355
+ * remain.
356
+ * 3. If even the critical-only report exceeds budget, accept the
357
+ * overflow but flag truncated=true so the caller knows the report
358
+ * is exceptional.
359
+ */
360
+ function enforceResponseBudget(report) {
361
+ if (estimateTokens(JSON.stringify(report)) <= HARD_CAP_TOKENS) {
362
+ return report;
363
+ }
364
+ // Step 1: shrink samples + next-step target lists.
365
+ let trimmed = {
366
+ ...report,
367
+ findings: report.findings.map((f) => ({
368
+ ...f,
369
+ sample_asset_ids: f.sample_asset_ids.slice(0, REDUCED_SAMPLE_LIMIT),
370
+ })),
371
+ next_steps: report.next_steps.map((s) => ({
372
+ ...s,
373
+ target_asset_ids: s.target_asset_ids.slice(0, REDUCED_SAMPLE_LIMIT),
374
+ })),
375
+ truncated: true,
376
+ truncation_reason: 'Findings sample lists were trimmed to fit the response budget.',
377
+ };
378
+ if (estimateTokens(JSON.stringify(trimmed)) <= HARD_CAP_TOKENS) {
379
+ return trimmed;
380
+ }
381
+ // Step 2: drop info-severity findings, then warnings, recomputing each pass.
382
+ for (const dropping of ['info', 'warning']) {
383
+ const keptFindings = trimmed.findings.filter((f) => f.severity !== dropping);
384
+ const keptIds = new Set(keptFindings.map((f) => f.id));
385
+ const keptSteps = trimmed.next_steps.filter((s) => s.finding_id === undefined || keptIds.has(s.finding_id));
386
+ trimmed = {
387
+ ...trimmed,
388
+ findings: keptFindings,
389
+ next_steps: keptSteps,
390
+ truncation_reason: `Dropped ${dropping}-severity findings to fit the response budget.`,
391
+ };
392
+ if (estimateTokens(JSON.stringify(trimmed)) <= HARD_CAP_TOKENS) {
393
+ return trimmed;
394
+ }
395
+ }
396
+ // Step 3: even critical-only doesn't fit — return as-is, flagged truncated.
397
+ return {
398
+ ...trimmed,
399
+ truncation_reason: 'Report exceeded the response budget even after dropping non-critical findings; consider narrowing scope.',
400
+ };
401
+ }
402
+ //# sourceMappingURL=audit-tagging-hygiene.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audit-tagging-hygiene.js","sourceRoot":"","sources":["../../../src/tools/audit/audit-tagging-hygiene.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,62 @@
1
+ import { z } from 'zod';
2
+ import { type McpToolError } from '../../conventions/errors.js';
3
+ import { type AuditReport } from './types.js';
4
+ export declare const DETECT_DUPLICATES_DESCRIPTION: string;
5
+ export declare const DetectDuplicatesInputSchema: z.ZodObject<{
6
+ /**
7
+ * When true, skip the filename+size secondary pass and only report
8
+ * hash-based duplicates. Defaults to false (run both passes).
9
+ */
10
+ hash_only: z.ZodDefault<z.ZodBoolean>;
11
+ /** Maximum number of duplicate groups to report. Defaults to 100. */
12
+ max_groups: z.ZodDefault<z.ZodNumber>;
13
+ /** Per-finding asset id sample cap. Defaults to 10. */
14
+ sample_limit: z.ZodDefault<z.ZodNumber>;
15
+ }, "strip", z.ZodTypeAny, {
16
+ sample_limit: number;
17
+ hash_only: boolean;
18
+ max_groups: number;
19
+ }, {
20
+ sample_limit?: number | undefined;
21
+ hash_only?: boolean | undefined;
22
+ max_groups?: number | undefined;
23
+ }>;
24
+ export type DetectDuplicatesInput = z.input<typeof DetectDuplicatesInputSchema>;
25
+ export type DetectDuplicatesInputResolved = z.output<typeof DetectDuplicatesInputSchema>;
26
+ export interface DuplicateAuditAsset {
27
+ id: string;
28
+ display_file_name: string;
29
+ /** Content hash (md5/sha256/etag). Empty / undefined when upstream lacks one. */
30
+ file_hash?: string | null;
31
+ /** File size in bytes. Optional. */
32
+ file_size?: number | null;
33
+ }
34
+ export interface DuplicateEnumerator {
35
+ enumerateAssets(): Promise<{
36
+ ok: true;
37
+ assets: DuplicateAuditAsset[];
38
+ } | {
39
+ ok: false;
40
+ error: McpToolError;
41
+ }>;
42
+ }
43
+ export interface DetectDuplicatesDeps {
44
+ enumerator: DuplicateEnumerator;
45
+ }
46
+ export type DetectDuplicatesOutcome = {
47
+ ok: true;
48
+ report: AuditReport;
49
+ } | {
50
+ ok: false;
51
+ error: McpToolError;
52
+ };
53
+ export declare class DetectDuplicatesTool {
54
+ private readonly deps;
55
+ readonly name = "detect_duplicates";
56
+ readonly description: string;
57
+ constructor(deps: DetectDuplicatesDeps);
58
+ run(rawInput?: DetectDuplicatesInput): Promise<DetectDuplicatesOutcome>;
59
+ }
60
+ export declare function buildDetectDuplicatesTool(deps: DetectDuplicatesDeps): DetectDuplicatesTool;
61
+ export declare function buildReport(assets: ReadonlyArray<DuplicateAuditAsset>, input: DetectDuplicatesInputResolved): AuditReport;
62
+ //# sourceMappingURL=detect-duplicates.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detect-duplicates.d.ts","sourceRoot":"","sources":["../../../src/tools/audit/detect-duplicates.ts"],"names":[],"mappings":"AAwBA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAmB,KAAK,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAEjF,OAAO,EAIL,KAAK,WAAW,EAEjB,MAAM,YAAY,CAAC;AAIpB,eAAO,MAAM,6BAA6B,QAM4B,CAAC;AAQvE,eAAO,MAAM,2BAA2B;IACtC;;;OAGG;;IAEH,qEAAqE;;IAErE,uDAAuD;;;;;;;;;;EAEvD,CAAC;AACH,MAAM,MAAM,qBAAqB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,2BAA2B,CAAC,CAAC;AAChF,MAAM,MAAM,6BAA6B,GAAG,CAAC,CAAC,MAAM,CAClD,OAAO,2BAA2B,CACnC,CAAC;AAIF,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,iBAAiB,EAAE,MAAM,CAAC;IAC1B,iFAAiF;IACjF,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,oCAAoC;IACpC,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAED,MAAM,WAAW,mBAAmB;IAClC,eAAe,IAAI,OAAO,CACtB;QAAE,EAAE,EAAE,IAAI,CAAC;QAAC,MAAM,EAAE,mBAAmB,EAAE,CAAA;KAAE,GAC3C;QAAE,EAAE,EAAE,KAAK,CAAC;QAAC,KAAK,EAAE,YAAY,CAAA;KAAE,CACrC,CAAC;CACH;AAID,MAAM,WAAW,oBAAoB;IACnC,UAAU,EAAE,mBAAmB,CAAC;CACjC;AAED,MAAM,MAAM,uBAAuB,GAC/B;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,MAAM,EAAE,WAAW,CAAA;CAAE,GACjC;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,YAAY,CAAA;CAAE,CAAC;AAEvC,qBAAa,oBAAoB;IAInB,OAAO,CAAC,QAAQ,CAAC,IAAI;IAHjC,QAAQ,CAAC,IAAI,uBAAuB;IACpC,QAAQ,CAAC,WAAW,SAAiC;gBAExB,IAAI,EAAE,oBAAoB;IAEjD,GAAG,CAAC,QAAQ,GAAE,qBAA0B,GAAG,OAAO,CAAC,uBAAuB,CAAC;CAoBlF;AAED,wBAAgB,yBAAyB,CACvC,IAAI,EAAE,oBAAoB,GACzB,oBAAoB,CAEtB;AAWD,wBAAgB,WAAW,CACzB,MAAM,EAAE,aAAa,CAAC,mBAAmB,CAAC,EAC1C,KAAK,EAAE,6BAA6B,GACnC,WAAW,CAiHb"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detect-duplicates.js","sourceRoot":"","sources":["../../../src/tools/audit/detect-duplicates.ts"],"names":[],"mappings":"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"}