@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.
- package/.env.example +56 -0
- package/CHANGELOG.md +90 -0
- package/LICENSE +21 -0
- package/README.md +512 -0
- package/dist/client.d.ts +497 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +1162 -0
- package/dist/client.js.map +1 -0
- package/dist/conventions/confirmation.d.ts +89 -0
- package/dist/conventions/confirmation.d.ts.map +1 -0
- package/dist/conventions/confirmation.js +132 -0
- package/dist/conventions/confirmation.js.map +1 -0
- package/dist/conventions/dry-run/batch-executor.d.ts +36 -0
- package/dist/conventions/dry-run/batch-executor.d.ts.map +1 -0
- package/dist/conventions/dry-run/batch-executor.js +89 -0
- package/dist/conventions/dry-run/batch-executor.js.map +1 -0
- package/dist/conventions/dry-run/diff-renderer.d.ts +34 -0
- package/dist/conventions/dry-run/diff-renderer.d.ts.map +1 -0
- package/dist/conventions/dry-run/diff-renderer.js +158 -0
- package/dist/conventions/dry-run/diff-renderer.js.map +1 -0
- package/dist/conventions/dry-run/index.d.ts +13 -0
- package/dist/conventions/dry-run/index.d.ts.map +1 -0
- package/dist/conventions/dry-run/index.js +10 -0
- package/dist/conventions/dry-run/index.js.map +1 -0
- package/dist/conventions/dry-run/mutating-tool.d.ts +64 -0
- package/dist/conventions/dry-run/mutating-tool.d.ts.map +1 -0
- package/dist/conventions/dry-run/mutating-tool.js +88 -0
- package/dist/conventions/dry-run/mutating-tool.js.map +1 -0
- package/dist/conventions/dry-run/summary.d.ts +66 -0
- package/dist/conventions/dry-run/summary.d.ts.map +1 -0
- package/dist/conventions/dry-run/summary.js +185 -0
- package/dist/conventions/dry-run/summary.js.map +1 -0
- package/dist/conventions/dry-run/types.d.ts +597 -0
- package/dist/conventions/dry-run/types.d.ts.map +1 -0
- package/dist/conventions/dry-run/types.js +108 -0
- package/dist/conventions/dry-run/types.js.map +1 -0
- package/dist/conventions/dry-run/with-dry-run.d.ts +66 -0
- package/dist/conventions/dry-run/with-dry-run.d.ts.map +1 -0
- package/dist/conventions/dry-run/with-dry-run.js +219 -0
- package/dist/conventions/dry-run/with-dry-run.js.map +1 -0
- package/dist/conventions/env.d.ts +49 -0
- package/dist/conventions/env.d.ts.map +1 -0
- package/dist/conventions/env.js +84 -0
- package/dist/conventions/env.js.map +1 -0
- package/dist/conventions/errors.d.ts +68 -0
- package/dist/conventions/errors.d.ts.map +1 -0
- package/dist/conventions/errors.js +81 -0
- package/dist/conventions/errors.js.map +1 -0
- package/dist/conventions/logger.d.ts +28 -0
- package/dist/conventions/logger.d.ts.map +1 -0
- package/dist/conventions/logger.js +105 -0
- package/dist/conventions/logger.js.map +1 -0
- package/dist/conventions/pagination.d.ts +37 -0
- package/dist/conventions/pagination.d.ts.map +1 -0
- package/dist/conventions/pagination.js +53 -0
- package/dist/conventions/pagination.js.map +1 -0
- package/dist/conventions/rate-limiter.d.ts +54 -0
- package/dist/conventions/rate-limiter.d.ts.map +1 -0
- package/dist/conventions/rate-limiter.js +143 -0
- package/dist/conventions/rate-limiter.js.map +1 -0
- package/dist/conventions/response-budget.d.ts +66 -0
- package/dist/conventions/response-budget.d.ts.map +1 -0
- package/dist/conventions/response-budget.js +89 -0
- package/dist/conventions/response-budget.js.map +1 -0
- package/dist/conventions/schema-version.d.ts +27 -0
- package/dist/conventions/schema-version.d.ts.map +1 -0
- package/dist/conventions/schema-version.js +29 -0
- package/dist/conventions/schema-version.js.map +1 -0
- package/dist/conventions/state-store-redis.d.ts +32 -0
- package/dist/conventions/state-store-redis.d.ts.map +1 -0
- package/dist/conventions/state-store-redis.js +77 -0
- package/dist/conventions/state-store-redis.js.map +1 -0
- package/dist/conventions/state-store.d.ts +46 -0
- package/dist/conventions/state-store.d.ts.map +1 -0
- package/dist/conventions/state-store.js +105 -0
- package/dist/conventions/state-store.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +421 -0
- package/dist/index.js.map +1 -0
- package/dist/prompts/collection-audit.d.ts +13 -0
- package/dist/prompts/collection-audit.d.ts.map +1 -0
- package/dist/prompts/collection-audit.js +168 -0
- package/dist/prompts/collection-audit.js.map +1 -0
- package/dist/prompts/create-distribution.d.ts +15 -0
- package/dist/prompts/create-distribution.d.ts.map +1 -0
- package/dist/prompts/create-distribution.js +111 -0
- package/dist/prompts/create-distribution.js.map +1 -0
- package/dist/prompts/helpers.d.ts +20 -0
- package/dist/prompts/helpers.d.ts.map +1 -0
- package/dist/prompts/helpers.js +53 -0
- package/dist/prompts/helpers.js.map +1 -0
- package/dist/prompts/library-health-audit.d.ts +13 -0
- package/dist/prompts/library-health-audit.d.ts.map +1 -0
- package/dist/prompts/library-health-audit.js +131 -0
- package/dist/prompts/library-health-audit.js.map +1 -0
- package/dist/prompts/usage-insights.d.ts +13 -0
- package/dist/prompts/usage-insights.d.ts.map +1 -0
- package/dist/prompts/usage-insights.js +98 -0
- package/dist/prompts/usage-insights.js.map +1 -0
- package/dist/prompts/wrap-prompt-as-tool.d.ts +48 -0
- package/dist/prompts/wrap-prompt-as-tool.d.ts.map +1 -0
- package/dist/prompts/wrap-prompt-as-tool.js +61 -0
- package/dist/prompts/wrap-prompt-as-tool.js.map +1 -0
- package/dist/resources/asset-by-id.d.ts +4 -0
- package/dist/resources/asset-by-id.d.ts.map +1 -0
- package/dist/resources/asset-by-id.js +27 -0
- package/dist/resources/asset-by-id.js.map +1 -0
- package/dist/resources/collections.d.ts +5 -0
- package/dist/resources/collections.d.ts.map +1 -0
- package/dist/resources/collections.js +48 -0
- package/dist/resources/collections.js.map +1 -0
- package/dist/resources/custom-fields.d.ts +4 -0
- package/dist/resources/custom-fields.d.ts.map +1 -0
- package/dist/resources/custom-fields.js +30 -0
- package/dist/resources/custom-fields.js.map +1 -0
- package/dist/resources/folders.d.ts +5 -0
- package/dist/resources/folders.d.ts.map +1 -0
- package/dist/resources/folders.js +73 -0
- package/dist/resources/folders.js.map +1 -0
- package/dist/resources/helpers.d.ts +17 -0
- package/dist/resources/helpers.d.ts.map +1 -0
- package/dist/resources/helpers.js +59 -0
- package/dist/resources/helpers.js.map +1 -0
- package/dist/resources/portals.d.ts +5 -0
- package/dist/resources/portals.d.ts.map +1 -0
- package/dist/resources/portals.js +81 -0
- package/dist/resources/portals.js.map +1 -0
- package/dist/resources/recent-and-dashboard.d.ts +5 -0
- package/dist/resources/recent-and-dashboard.d.ts.map +1 -0
- package/dist/resources/recent-and-dashboard.js +42 -0
- package/dist/resources/recent-and-dashboard.js.map +1 -0
- package/dist/tools/asset-selection.d.ts +102 -0
- package/dist/tools/asset-selection.d.ts.map +1 -0
- package/dist/tools/asset-selection.js +133 -0
- package/dist/tools/asset-selection.js.map +1 -0
- package/dist/tools/audit/audit-folder-structure.d.ts +108 -0
- package/dist/tools/audit/audit-folder-structure.d.ts.map +1 -0
- package/dist/tools/audit/audit-folder-structure.js +260 -0
- package/dist/tools/audit/audit-folder-structure.js.map +1 -0
- package/dist/tools/audit/audit-naming-conventions.d.ts +83 -0
- package/dist/tools/audit/audit-naming-conventions.d.ts.map +1 -0
- package/dist/tools/audit/audit-naming-conventions.js +238 -0
- package/dist/tools/audit/audit-naming-conventions.js.map +1 -0
- package/dist/tools/audit/audit-tagging-hygiene.d.ts +77 -0
- package/dist/tools/audit/audit-tagging-hygiene.d.ts.map +1 -0
- package/dist/tools/audit/audit-tagging-hygiene.js +402 -0
- package/dist/tools/audit/audit-tagging-hygiene.js.map +1 -0
- package/dist/tools/audit/detect-duplicates.d.ts +62 -0
- package/dist/tools/audit/detect-duplicates.d.ts.map +1 -0
- package/dist/tools/audit/detect-duplicates.js +0 -0
- package/dist/tools/audit/detect-duplicates.js.map +1 -0
- package/dist/tools/audit/types.d.ts +526 -0
- package/dist/tools/audit/types.d.ts.map +1 -0
- package/dist/tools/audit/types.js +188 -0
- package/dist/tools/audit/types.js.map +1 -0
- package/dist/tools/bulk-move-assets.d.ts +78 -0
- package/dist/tools/bulk-move-assets.d.ts.map +1 -0
- package/dist/tools/bulk-move-assets.js +122 -0
- package/dist/tools/bulk-move-assets.js.map +1 -0
- package/dist/tools/bulk-normalize-filenames.d.ts +62 -0
- package/dist/tools/bulk-normalize-filenames.d.ts.map +1 -0
- package/dist/tools/bulk-normalize-filenames.js +237 -0
- package/dist/tools/bulk-normalize-filenames.js.map +1 -0
- package/dist/tools/bulk-rename-assets.d.ts +79 -0
- package/dist/tools/bulk-rename-assets.d.ts.map +1 -0
- package/dist/tools/bulk-rename-assets.js +139 -0
- package/dist/tools/bulk-rename-assets.js.map +1 -0
- package/dist/tools/bulk-tags.d.ts +107 -0
- package/dist/tools/bulk-tags.d.ts.map +1 -0
- package/dist/tools/bulk-tags.js +220 -0
- package/dist/tools/bulk-tags.js.map +1 -0
- package/dist/tools/client-adapters.d.ts +76 -0
- package/dist/tools/client-adapters.d.ts.map +1 -0
- package/dist/tools/client-adapters.js +648 -0
- package/dist/tools/client-adapters.js.map +1 -0
- package/dist/tools/collection-membership.d.ts +90 -0
- package/dist/tools/collection-membership.d.ts.map +1 -0
- package/dist/tools/collection-membership.js +195 -0
- package/dist/tools/collection-membership.js.map +1 -0
- package/dist/tools/create-collection.d.ts +63 -0
- package/dist/tools/create-collection.d.ts.map +1 -0
- package/dist/tools/create-collection.js +151 -0
- package/dist/tools/create-collection.js.map +1 -0
- package/dist/tools/create-folder.d.ts +46 -0
- package/dist/tools/create-folder.d.ts.map +1 -0
- package/dist/tools/create-folder.js +83 -0
- package/dist/tools/create-folder.js.map +1 -0
- package/dist/tools/create-share-link.d.ts +107 -0
- package/dist/tools/create-share-link.d.ts.map +1 -0
- package/dist/tools/create-share-link.js +239 -0
- package/dist/tools/create-share-link.js.map +1 -0
- package/dist/tools/get-asset-details.d.ts +401 -0
- package/dist/tools/get-asset-details.d.ts.map +1 -0
- package/dist/tools/get-asset-details.js +56 -0
- package/dist/tools/get-asset-details.js.map +1 -0
- package/dist/tools/get-collection.d.ts +126 -0
- package/dist/tools/get-collection.d.ts.map +1 -0
- package/dist/tools/get-collection.js +52 -0
- package/dist/tools/get-collection.js.map +1 -0
- package/dist/tools/get-embed-code.d.ts +195 -0
- package/dist/tools/get-embed-code.d.ts.map +1 -0
- package/dist/tools/get-embed-code.js +214 -0
- package/dist/tools/get-embed-code.js.map +1 -0
- package/dist/tools/insights/analyze-share-links.d.ts +159 -0
- package/dist/tools/insights/analyze-share-links.d.ts.map +1 -0
- package/dist/tools/insights/analyze-share-links.js +314 -0
- package/dist/tools/insights/analyze-share-links.js.map +1 -0
- package/dist/tools/insights/insight-cache.d.ts +36 -0
- package/dist/tools/insights/insight-cache.d.ts.map +1 -0
- package/dist/tools/insights/insight-cache.js +98 -0
- package/dist/tools/insights/insight-cache.js.map +1 -0
- package/dist/tools/insights/report-asset-activation.d.ts +149 -0
- package/dist/tools/insights/report-asset-activation.d.ts.map +1 -0
- package/dist/tools/insights/report-asset-activation.js +380 -0
- package/dist/tools/insights/report-asset-activation.js.map +1 -0
- package/dist/tools/insights/report-stale-assets.d.ts +120 -0
- package/dist/tools/insights/report-stale-assets.d.ts.map +1 -0
- package/dist/tools/insights/report-stale-assets.js +281 -0
- package/dist/tools/insights/report-stale-assets.js.map +1 -0
- package/dist/tools/insights/report-top-assets.d.ts +139 -0
- package/dist/tools/insights/report-top-assets.d.ts.map +1 -0
- package/dist/tools/insights/report-top-assets.js +407 -0
- package/dist/tools/insights/report-top-assets.js.map +1 -0
- package/dist/tools/list-categories.d.ts +127 -0
- package/dist/tools/list-categories.d.ts.map +1 -0
- package/dist/tools/list-categories.js +68 -0
- package/dist/tools/list-categories.js.map +1 -0
- package/dist/tools/list-collections.d.ts +127 -0
- package/dist/tools/list-collections.d.ts.map +1 -0
- package/dist/tools/list-collections.js +53 -0
- package/dist/tools/list-collections.js.map +1 -0
- package/dist/tools/list-custom-fields.d.ts +125 -0
- package/dist/tools/list-custom-fields.d.ts.map +1 -0
- package/dist/tools/list-custom-fields.js +51 -0
- package/dist/tools/list-custom-fields.js.map +1 -0
- package/dist/tools/list-share-links.d.ts +192 -0
- package/dist/tools/list-share-links.d.ts.map +1 -0
- package/dist/tools/list-share-links.js +92 -0
- package/dist/tools/list-share-links.js.map +1 -0
- package/dist/tools/list-workspaces.d.ts +88 -0
- package/dist/tools/list-workspaces.d.ts.map +1 -0
- package/dist/tools/list-workspaces.js +71 -0
- package/dist/tools/list-workspaces.js.map +1 -0
- package/dist/tools/move-asset.d.ts +48 -0
- package/dist/tools/move-asset.d.ts.map +1 -0
- package/dist/tools/move-asset.js +85 -0
- package/dist/tools/move-asset.js.map +1 -0
- package/dist/tools/rename-asset.d.ts +88 -0
- package/dist/tools/rename-asset.d.ts.map +1 -0
- package/dist/tools/rename-asset.js +100 -0
- package/dist/tools/rename-asset.js.map +1 -0
- package/dist/tools/rename-folder.d.ts +55 -0
- package/dist/tools/rename-folder.d.ts.map +1 -0
- package/dist/tools/rename-folder.js +101 -0
- package/dist/tools/rename-folder.js.map +1 -0
- package/dist/tools/revoke-share-link.d.ts +55 -0
- package/dist/tools/revoke-share-link.d.ts.map +1 -0
- package/dist/tools/revoke-share-link.js +77 -0
- package/dist/tools/revoke-share-link.js.map +1 -0
- package/dist/tools/search/facets.d.ts +34 -0
- package/dist/tools/search/facets.d.ts.map +1 -0
- package/dist/tools/search/facets.js +147 -0
- package/dist/tools/search/facets.js.map +1 -0
- package/dist/tools/search/filter-builder.d.ts +33 -0
- package/dist/tools/search/filter-builder.d.ts.map +1 -0
- package/dist/tools/search/filter-builder.js +111 -0
- package/dist/tools/search/filter-builder.js.map +1 -0
- package/dist/tools/search/search-assets.d.ts +41 -0
- package/dist/tools/search/search-assets.d.ts.map +1 -0
- package/dist/tools/search/search-assets.js +162 -0
- package/dist/tools/search/search-assets.js.map +1 -0
- package/dist/tools/search/search-collections.d.ts +35 -0
- package/dist/tools/search/search-collections.d.ts.map +1 -0
- package/dist/tools/search/search-collections.js +103 -0
- package/dist/tools/search/search-collections.js.map +1 -0
- package/dist/tools/search/types.d.ts +1047 -0
- package/dist/tools/search/types.d.ts.map +1 -0
- package/dist/tools/search/types.js +216 -0
- package/dist/tools/search/types.js.map +1 -0
- package/dist/tools/update-asset-metadata.d.ts +78 -0
- package/dist/tools/update-asset-metadata.d.ts.map +1 -0
- package/dist/tools/update-asset-metadata.js +203 -0
- package/dist/tools/update-asset-metadata.js.map +1 -0
- package/dist/tools/update-collection.d.ts +69 -0
- package/dist/tools/update-collection.d.ts.map +1 -0
- package/dist/tools/update-collection.js +142 -0
- package/dist/tools/update-collection.js.map +1 -0
- package/dist/tools/view-category-contents.d.ts +231 -0
- package/dist/tools/view-category-contents.d.ts.map +1 -0
- package/dist/tools/view-category-contents.js +97 -0
- package/dist/tools/view-category-contents.js.map +1 -0
- package/dist/types.d.ts +1326 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +288 -0
- package/dist/types.js.map +1 -0
- package/dist/typesense.d.ts +84 -0
- package/dist/typesense.d.ts.map +1 -0
- package/dist/typesense.js +243 -0
- package/dist/typesense.js.map +1 -0
- package/docs/api-field-verification.md +244 -0
- package/docs/deployment-runbook.md +446 -0
- package/docs/security-review.md +195 -0
- package/docs/typesense-filter-schema.md +262 -0
- package/docs/verified-endpoints.md +38 -0
- 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"}
|
|
Binary file
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"detect-duplicates.js","sourceRoot":"","sources":["../../../src/tools/audit/detect-duplicates.ts"],"names":[],"mappings":"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"}
|