@connexum/agent-standards 0.0.0-stage → 0.1.0-beta.2
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/README.md +32 -2
- package/catalogue/catalogue.json +115 -0
- package/catalogue/fit.json +707 -0
- package/dist/applicability.d.ts +13 -0
- package/dist/applicability.d.ts.map +1 -0
- package/dist/applicability.js +50 -0
- package/dist/applicability.js.map +1 -0
- package/dist/catalogue.d.ts +5 -0
- package/dist/catalogue.d.ts.map +1 -0
- package/dist/catalogue.js +17 -0
- package/dist/catalogue.js.map +1 -0
- package/dist/fit.d.ts +122 -0
- package/dist/fit.d.ts.map +1 -0
- package/dist/fit.js +163 -0
- package/dist/fit.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +38 -0
- package/dist/index.js.map +1 -0
- package/dist/score.d.ts +17 -0
- package/dist/score.d.ts.map +1 -0
- package/dist/score.js +55 -0
- package/dist/score.js.map +1 -0
- package/dist/types.d.ts +92 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/package.json +15 -4
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"applicability.d.ts","sourceRoot":"","sources":["../src/applicability.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAA;AAKjF,+HAA+H;AAC/H,wBAAgB,YAAY,CAAC,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,YAAY,GAAG,MAAM,GAAG,IAAI,CAGhF;AAED,oHAAoH;AACpH,wBAAgB,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,YAAY,GAAG,OAAO,CASlE;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,YAAY,GAAG,sBAAsB,EAAE,CAS7E"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.boundPackFor = boundPackFor;
|
|
4
|
+
exports.fits = fits;
|
|
5
|
+
exports.applicability = applicability;
|
|
6
|
+
const catalogue_js_1 = require("./catalogue.js");
|
|
7
|
+
const norm = (s) => s.trim().toLowerCase();
|
|
8
|
+
const normPack = (s) => norm(s).replace(/@.*$/, '').replace(/_/g, '-');
|
|
9
|
+
/** The pack bound on the agent that carries this framework, if any (ids as My-CC publishes them; version suffixes ignored). */
|
|
10
|
+
function boundPackFor(fw, profile) {
|
|
11
|
+
const ids = fw.packIds.map(normPack);
|
|
12
|
+
return profile.boundPacks.find((p) => ids.includes(normPack(p))) ?? null;
|
|
13
|
+
}
|
|
14
|
+
/** Does the framework fit this agent's industry, data, regions or tools? (Only used when its pack is not bound.) */
|
|
15
|
+
function fits(fw, profile) {
|
|
16
|
+
const f = fw.fits ?? {};
|
|
17
|
+
const classes = profile.dataClasses.map(norm);
|
|
18
|
+
const regions = profile.regions.map(norm);
|
|
19
|
+
if (f.industries && !f.industries.map(norm).includes(norm(profile.industry ?? '')))
|
|
20
|
+
return false;
|
|
21
|
+
if (f.dataClasses && !f.dataClasses.some((c) => classes.includes(norm(c))))
|
|
22
|
+
return false;
|
|
23
|
+
if (f.dataClassesAbsent && f.dataClassesAbsent.some((c) => classes.includes(norm(c))))
|
|
24
|
+
return false;
|
|
25
|
+
if (f.regions && !f.regions.some((r) => regions.includes(norm(r))))
|
|
26
|
+
return false;
|
|
27
|
+
if (f.mcp !== undefined && Boolean(profile.mcp ?? profile.tools.length > 0) !== f.mcp)
|
|
28
|
+
return false;
|
|
29
|
+
return true;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Which frameworks apply to this agent, and how: 'always' (OWASP LLM, OWASP Agentic, My-CC runtime), 'installed' (its
|
|
33
|
+
* My-CC pack is bound to the agent), 'recommended' (it fits the industry, data or regions but no pack is bound; documented,
|
|
34
|
+
* not scored), 'not_applicable' (does not fit; omitted with the reason). Practice frameworks are My-CC checks with no pack:
|
|
35
|
+
* applicable when they fit.
|
|
36
|
+
*/
|
|
37
|
+
function applicability(profile) {
|
|
38
|
+
return (0, catalogue_js_1.loadCatalogue)().frameworks.map((fw) => {
|
|
39
|
+
const bound = boundPackFor(fw, profile);
|
|
40
|
+
const base = { framework: fw.id, name: fw.name, packIds: fw.packIds, boundPack: bound };
|
|
41
|
+
if (fw.kind === 'always')
|
|
42
|
+
return { ...base, status: 'always', why: 'applies to every agent' };
|
|
43
|
+
if (bound)
|
|
44
|
+
return { ...base, status: 'installed', why: `pack ${bound} is bound to the agent` };
|
|
45
|
+
if (fits(fw, profile))
|
|
46
|
+
return { ...base, status: fw.kind === 'practice' ? 'always' : 'recommended', why: fw.why ?? 'fits this agent' };
|
|
47
|
+
return { ...base, status: 'not_applicable', why: fw.notFit ?? 'does not fit this agent' };
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=applicability.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"applicability.js","sourceRoot":"","sources":["../src/applicability.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { Catalogue, Framework } from './types.js';
|
|
2
|
+
/** The catalogue shipped with the package (catalogue/catalogue.json); the Python twin reads the same file. */
|
|
3
|
+
export declare function loadCatalogue(): Catalogue;
|
|
4
|
+
export declare function frameworkById(id: string): Framework | undefined;
|
|
5
|
+
//# sourceMappingURL=catalogue.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"catalogue.d.ts","sourceRoot":"","sources":["../src/catalogue.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AAGtD,8GAA8G;AAC9G,wBAAgB,aAAa,IAAI,SAAS,CAKzC;AACD,wBAAgB,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,CAA+D"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.loadCatalogue = loadCatalogue;
|
|
4
|
+
exports.frameworkById = frameworkById;
|
|
5
|
+
const node_fs_1 = require("node:fs");
|
|
6
|
+
const node_path_1 = require("node:path");
|
|
7
|
+
let cached = null;
|
|
8
|
+
/** The catalogue shipped with the package (catalogue/catalogue.json); the Python twin reads the same file. */
|
|
9
|
+
function loadCatalogue() {
|
|
10
|
+
if (cached)
|
|
11
|
+
return cached;
|
|
12
|
+
const raw = (0, node_fs_1.readFileSync)((0, node_path_1.join)(__dirname, '..', 'catalogue', 'catalogue.json'), 'utf8');
|
|
13
|
+
cached = JSON.parse(raw);
|
|
14
|
+
return cached;
|
|
15
|
+
}
|
|
16
|
+
function frameworkById(id) { return loadCatalogue().frameworks.find((f) => f.id === id); }
|
|
17
|
+
//# sourceMappingURL=catalogue.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"catalogue.js","sourceRoot":"","sources":["../src/catalogue.ts"],"names":[],"mappings":";;AAMA,sCAKC;AACD,sCAA+H;AAZ/H,qCAAsC;AACtC,yCAAgC;AAGhC,IAAI,MAAM,GAAqB,IAAI,CAAA;AACnC,8GAA8G;AAC9G,SAAgB,aAAa;IAC3B,IAAI,MAAM;QAAE,OAAO,MAAM,CAAA;IACzB,MAAM,GAAG,GAAG,IAAA,sBAAY,EAAC,IAAA,gBAAI,EAAC,SAAS,EAAE,IAAI,EAAE,WAAW,EAAE,gBAAgB,CAAC,EAAE,MAAM,CAAC,CAAA;IACtF,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAc,CAAA;IACrC,OAAO,MAAM,CAAA;AACf,CAAC;AACD,SAAgB,aAAa,CAAC,EAAU,IAA2B,OAAO,aAAa,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAA,CAAC,CAAC"}
|
package/dist/fit.d.ts
ADDED
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
interface FitCatalogue {
|
|
2
|
+
version: string;
|
|
3
|
+
note: string;
|
|
4
|
+
industries: Array<{
|
|
5
|
+
id: string;
|
|
6
|
+
signals: string[];
|
|
7
|
+
}>;
|
|
8
|
+
related: Record<string, string[]>;
|
|
9
|
+
everySector: string[];
|
|
10
|
+
regionSectors: Record<string, string>;
|
|
11
|
+
regions: Array<[string, string]>;
|
|
12
|
+
capabilities: Array<{
|
|
13
|
+
id: string;
|
|
14
|
+
label: string;
|
|
15
|
+
requirement: string[];
|
|
16
|
+
agent: string[];
|
|
17
|
+
dataClass?: string;
|
|
18
|
+
impliedBy?: string[];
|
|
19
|
+
}>;
|
|
20
|
+
lawTypes: string[];
|
|
21
|
+
overlaps: Array<{
|
|
22
|
+
id: string;
|
|
23
|
+
label: string;
|
|
24
|
+
patterns: string[];
|
|
25
|
+
}>;
|
|
26
|
+
}
|
|
27
|
+
export declare function loadFitCatalogue(): FitCatalogue;
|
|
28
|
+
/** What the scan reads about an agent, on any stack. */
|
|
29
|
+
export interface AgentSignals {
|
|
30
|
+
agentId: string;
|
|
31
|
+
purpose?: string;
|
|
32
|
+
tools?: string[];
|
|
33
|
+
dataClasses?: string[];
|
|
34
|
+
text?: string[];
|
|
35
|
+
regions?: string[];
|
|
36
|
+
declaredIndustry?: string | null;
|
|
37
|
+
boundPacks?: string[];
|
|
38
|
+
capabilities?: string[];
|
|
39
|
+
}
|
|
40
|
+
/** A pack as My-CC publishes it (the fields the fit reads). */
|
|
41
|
+
export interface PackInput {
|
|
42
|
+
id: string;
|
|
43
|
+
name: string;
|
|
44
|
+
vertical: string | null;
|
|
45
|
+
jurisdiction: string | null;
|
|
46
|
+
region: string | null;
|
|
47
|
+
type: string;
|
|
48
|
+
crossIndustry?: boolean;
|
|
49
|
+
requirements: Array<{
|
|
50
|
+
id: string;
|
|
51
|
+
text: string;
|
|
52
|
+
enforcement?: string | null;
|
|
53
|
+
}>;
|
|
54
|
+
}
|
|
55
|
+
export interface IndustryInference {
|
|
56
|
+
industries: string[];
|
|
57
|
+
declared: boolean;
|
|
58
|
+
evidence: Record<string, string[]>;
|
|
59
|
+
why: string;
|
|
60
|
+
}
|
|
61
|
+
export type PackLevel = 'installed' | 'required' | 'recommended' | 'not_needed';
|
|
62
|
+
export type ReqLevel = 'required' | 'recommended' | 'not_needed';
|
|
63
|
+
export interface RequirementFit {
|
|
64
|
+
id: string;
|
|
65
|
+
text: string;
|
|
66
|
+
level: ReqLevel;
|
|
67
|
+
why: string;
|
|
68
|
+
}
|
|
69
|
+
export interface PackFitResult {
|
|
70
|
+
packId: string;
|
|
71
|
+
agentId: string;
|
|
72
|
+
level: PackLevel;
|
|
73
|
+
why: string;
|
|
74
|
+
requirements: RequirementFit[];
|
|
75
|
+
}
|
|
76
|
+
/** The agent's sector(s) from what the scan reads. A declared industry wins. An industry needs two distinct signals and at least half the top score. */
|
|
77
|
+
export declare function inferIndustry(s: AgentSignals): IndustryInference;
|
|
78
|
+
/** The agent's capabilities: from its data classes, from what the scan reads, or supplied. */
|
|
79
|
+
export declare function inferCapabilities(s: AgentSignals): string[];
|
|
80
|
+
export declare function regionKey(jurisdiction: string | null | undefined): string;
|
|
81
|
+
/** Does this agent need this pack, and which of its requirements? */
|
|
82
|
+
export declare function packFit(pack: PackInput, s: AgentSignals, pre?: {
|
|
83
|
+
industry?: IndustryInference;
|
|
84
|
+
capabilities?: string[];
|
|
85
|
+
}): PackFitResult;
|
|
86
|
+
export interface FleetPackFit {
|
|
87
|
+
packId: string;
|
|
88
|
+
installed: string[];
|
|
89
|
+
required: string[];
|
|
90
|
+
recommended: string[];
|
|
91
|
+
notNeeded: string[];
|
|
92
|
+
scanned: boolean;
|
|
93
|
+
requirements: Array<{
|
|
94
|
+
id: string;
|
|
95
|
+
text: string;
|
|
96
|
+
required: string[];
|
|
97
|
+
recommended: string[];
|
|
98
|
+
notNeeded: string[];
|
|
99
|
+
topics: string[];
|
|
100
|
+
alsoIn: string[];
|
|
101
|
+
}>;
|
|
102
|
+
byAgent: Record<string, {
|
|
103
|
+
level: PackLevel;
|
|
104
|
+
why: string;
|
|
105
|
+
requirements: Record<string, {
|
|
106
|
+
level: ReqLevel;
|
|
107
|
+
why: string;
|
|
108
|
+
}>;
|
|
109
|
+
}>;
|
|
110
|
+
}
|
|
111
|
+
/** Every pack against every agent: which agents need it, at which level, and each requirement per agent. */
|
|
112
|
+
export declare function fleetFit(packs: PackInput[], agents: AgentSignals[]): FleetPackFit[];
|
|
113
|
+
/** Which shared control areas a requirement covers (minimum necessary, audit, consent, ...), for overlaps across packs. */
|
|
114
|
+
export declare function overlapTopics(text: string): string[];
|
|
115
|
+
/** The type My-CC's catalogue implies for a pack (law, contract, certification, best practice, framework). */
|
|
116
|
+
export declare function packType(p: {
|
|
117
|
+
name: string;
|
|
118
|
+
framework?: string | null;
|
|
119
|
+
subcategory?: string | null;
|
|
120
|
+
}): string;
|
|
121
|
+
export {};
|
|
122
|
+
//# sourceMappingURL=fit.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fit.d.ts","sourceRoot":"","sources":["../src/fit.ts"],"names":[],"mappings":"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"}
|
package/dist/fit.js
ADDED
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.loadFitCatalogue = loadFitCatalogue;
|
|
4
|
+
exports.inferIndustry = inferIndustry;
|
|
5
|
+
exports.inferCapabilities = inferCapabilities;
|
|
6
|
+
exports.regionKey = regionKey;
|
|
7
|
+
exports.packFit = packFit;
|
|
8
|
+
exports.fleetFit = fleetFit;
|
|
9
|
+
exports.overlapTopics = overlapTopics;
|
|
10
|
+
exports.packType = packType;
|
|
11
|
+
const node_fs_1 = require("node:fs");
|
|
12
|
+
const node_path_1 = require("node:path");
|
|
13
|
+
let cached = null;
|
|
14
|
+
function loadFitCatalogue() { return (cached ??= JSON.parse((0, node_fs_1.readFileSync)((0, node_path_1.join)(__dirname, '..', 'catalogue', 'fit.json'), 'utf8'))); }
|
|
15
|
+
const rx = (p) => new RegExp(p, 'i');
|
|
16
|
+
function haystack(s) { return [s.purpose ?? '', ...(s.tools ?? []), ...(s.dataClasses ?? []), ...(s.text ?? [])].join(' \n '); }
|
|
17
|
+
/** The agent's sector(s) from what the scan reads. A declared industry wins. An industry needs two distinct signals and at least half the top score. */
|
|
18
|
+
function inferIndustry(s) {
|
|
19
|
+
const cat = loadFitCatalogue();
|
|
20
|
+
if (s.declaredIndustry)
|
|
21
|
+
return { industries: [s.declaredIndustry, ...(cat.related[s.declaredIndustry] ?? [])], declared: true, evidence: {}, why: `declared: ${s.declaredIndustry}` };
|
|
22
|
+
const h = haystack(s);
|
|
23
|
+
const evidence = {};
|
|
24
|
+
for (const ind of cat.industries) {
|
|
25
|
+
const hits = ind.signals.map((p) => h.match(rx(p))?.[0]?.toLowerCase()).filter((x) => Boolean(x));
|
|
26
|
+
if (hits.length)
|
|
27
|
+
evidence[ind.id] = [...new Set(hits)];
|
|
28
|
+
}
|
|
29
|
+
const scored = Object.entries(evidence).filter(([, v]) => v.length >= 2).sort((a, b) => b[1].length - a[1].length);
|
|
30
|
+
if (!scored.length)
|
|
31
|
+
return { industries: [], declared: false, evidence, why: 'no sector signal in the purpose, tools or data; only cross-industry packs apply' };
|
|
32
|
+
const top = scored[0][1].length;
|
|
33
|
+
const picked = scored.filter(([, v]) => v.length * 2 >= top).map(([k]) => k);
|
|
34
|
+
const withRelated = [...new Set(picked.flatMap((k) => [k, ...(cat.related[k] ?? [])]))];
|
|
35
|
+
return { industries: withRelated, declared: false, evidence, why: picked.map((k) => `${k} (${evidence[k].join(', ')})`).join('; ') };
|
|
36
|
+
}
|
|
37
|
+
/** The agent's capabilities: from its data classes, from what the scan reads, or supplied. */
|
|
38
|
+
function inferCapabilities(s) {
|
|
39
|
+
const cat = loadFitCatalogue();
|
|
40
|
+
const h = haystack(s);
|
|
41
|
+
const classes = (s.dataClasses ?? []).map((c) => c.toLowerCase());
|
|
42
|
+
const out = new Set(s.capabilities ?? []);
|
|
43
|
+
for (const c of cat.capabilities)
|
|
44
|
+
if ((c.dataClass && classes.includes(c.dataClass)) || c.agent.some((p) => rx(p).test(h)))
|
|
45
|
+
out.add(c.id);
|
|
46
|
+
for (const c of cat.capabilities)
|
|
47
|
+
if (c.impliedBy?.some((i) => out.has(i)))
|
|
48
|
+
out.add(c.id);
|
|
49
|
+
return [...out];
|
|
50
|
+
}
|
|
51
|
+
function regionKey(jurisdiction) {
|
|
52
|
+
const j = (jurisdiction ?? 'global').trim();
|
|
53
|
+
for (const [p, k] of loadFitCatalogue().regions)
|
|
54
|
+
if (rx(p).test(j))
|
|
55
|
+
return k;
|
|
56
|
+
return 'other';
|
|
57
|
+
}
|
|
58
|
+
function regionFits(packRegion, agentRegions) {
|
|
59
|
+
if (packRegion === 'global')
|
|
60
|
+
return true;
|
|
61
|
+
if (packRegion === 'us')
|
|
62
|
+
return agentRegions.some((r) => r === 'us' || r.startsWith('us-'));
|
|
63
|
+
return agentRegions.includes(packRegion);
|
|
64
|
+
}
|
|
65
|
+
const normPack = (s) => s.trim().toLowerCase().replace(/@.*$/, '').replace(/_/g, '-');
|
|
66
|
+
/** Does this agent need this pack, and which of its requirements? */
|
|
67
|
+
function packFit(pack, s, pre) {
|
|
68
|
+
const cat = loadFitCatalogue();
|
|
69
|
+
const ind = pre?.industry ?? inferIndustry(s);
|
|
70
|
+
const caps = pre?.capabilities ?? inferCapabilities(s);
|
|
71
|
+
const regions = (s.regions?.length ? s.regions : ['us']).map((r) => r.toLowerCase());
|
|
72
|
+
const pr = regionKey(pack.jurisdiction ?? pack.region);
|
|
73
|
+
const bound = (s.boundPacks ?? []).some((b) => normPack(b) === normPack(pack.id));
|
|
74
|
+
const sector = pack.vertical ?? '';
|
|
75
|
+
const regionSector = cat.regionSectors[sector];
|
|
76
|
+
let level;
|
|
77
|
+
let why;
|
|
78
|
+
const isLaw = cat.lawTypes.includes(pack.type);
|
|
79
|
+
if (bound) {
|
|
80
|
+
level = 'installed';
|
|
81
|
+
why = 'bound to the agent in My-CC';
|
|
82
|
+
}
|
|
83
|
+
else if (!regionFits(pr, regions)) {
|
|
84
|
+
level = 'not_needed';
|
|
85
|
+
why = `applies in ${pack.jurisdiction ?? pack.region ?? pr}; this agent's people are in ${regions.join(', ')}`;
|
|
86
|
+
}
|
|
87
|
+
else if (regionSector || cat.everySector.includes(sector) || pack.crossIndustry || ind.industries.includes(sector)) {
|
|
88
|
+
level = isLaw ? 'required' : 'recommended';
|
|
89
|
+
why = regionSector ? `regional pack for ${pack.jurisdiction ?? sector}, where this agent's people are` : cat.everySector.includes(sector) || pack.crossIndustry ? `${sector || 'cross-industry'}: applies to every agent${isLaw ? ' where in force' : ''}` : `sector ${sector} matches this agent (${ind.why})`;
|
|
90
|
+
}
|
|
91
|
+
else {
|
|
92
|
+
level = 'not_needed';
|
|
93
|
+
why = `sector ${sector || 'unknown'}; this agent is ${ind.industries.length ? ind.industries.join(', ') : 'not in a regulated sector'}`;
|
|
94
|
+
}
|
|
95
|
+
const requirements = pack.requirements.map((r) => {
|
|
96
|
+
if (level === 'not_needed')
|
|
97
|
+
return { id: r.id, text: r.text, level: 'not_needed', why: 'the pack is not needed by this agent' };
|
|
98
|
+
const needs = cat.capabilities.find((c) => c.requirement.some((p) => rx(p).test(r.text)) && !caps.includes(c.id));
|
|
99
|
+
if (needs)
|
|
100
|
+
return { id: r.id, text: r.text, level: 'not_needed', why: `needs ${needs.label}; this agent has none` };
|
|
101
|
+
if (r.enforcement === 'block' || r.enforcement === 'human-attestation')
|
|
102
|
+
return level === 'recommended' ? { id: r.id, text: r.text, level: 'recommended', why: `recommended for this agent; My-CC enforces it as ${r.enforcement} once the pack is installed` } : { id: r.id, text: r.text, level: 'required', why: `My-CC enforcement: ${r.enforcement}` };
|
|
103
|
+
if (r.enforcement)
|
|
104
|
+
return { id: r.id, text: r.text, level: 'recommended', why: `My-CC enforcement: ${r.enforcement}` };
|
|
105
|
+
return level === 'installed' || level === 'required' ? { id: r.id, text: r.text, level: 'required', why: level === 'installed' ? 'the pack is bound to this agent' : `${pack.type}: in force where this agent operates` } : { id: r.id, text: r.text, level: 'recommended', why: `${pack.type}: recommended for this agent` };
|
|
106
|
+
});
|
|
107
|
+
// A law is required only when the scan found on the agent what the law regulates: at least one requirement of the
|
|
108
|
+
// pack touches a capability the agent HAS (PHI, privileged material, parts, billing, ...). A sector or region match
|
|
109
|
+
// without that evidence is a recommendation, never a requirement. Requirements needing a capability the agent lacks
|
|
110
|
+
// are not needed either way (set above).
|
|
111
|
+
const subject = [...new Set(pack.requirements.flatMap((r) => cat.capabilities.filter((c) => caps.includes(c.id) && c.requirement.some((p) => rx(p).test(r.text))).map((c) => c.label)))];
|
|
112
|
+
if (level === 'required' && !subject.length) {
|
|
113
|
+
const lacks = [...new Set(requirements.filter((r) => r.why.startsWith('needs ')).map((r) => r.why.replace(/^needs /, '').replace(/; this agent has none$/, '')))];
|
|
114
|
+
level = 'recommended';
|
|
115
|
+
why = `${why}; recommended, not required: the scan found nothing on this agent that the pack regulates${lacks.length ? ` (it covers ${lacks.join(', ')})` : ''}`;
|
|
116
|
+
for (const r of requirements)
|
|
117
|
+
if (r.level === 'required') {
|
|
118
|
+
r.level = 'recommended';
|
|
119
|
+
r.why = r.why.startsWith('My-CC enforcement') ? `recommended for this agent; ${r.why.replace('My-CC enforcement: ', 'My-CC enforces it as ')} once the pack is installed` : 'recommended: the pack is a recommendation for this agent';
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
else if (level === 'required')
|
|
123
|
+
why = `${why}; the agent has ${subject.join(', ')}`;
|
|
124
|
+
return { packId: pack.id, agentId: s.agentId, level, why, requirements };
|
|
125
|
+
}
|
|
126
|
+
/** Every pack against every agent: which agents need it, at which level, and each requirement per agent. */
|
|
127
|
+
function fleetFit(packs, agents) {
|
|
128
|
+
const pre = new Map(agents.map((a) => [a.agentId, { industry: inferIndustry(a), capabilities: inferCapabilities(a) }]));
|
|
129
|
+
const all = packs.map((p) => ({ p, fits: agents.map((a) => packFit(p, a, pre.get(a.agentId))) }));
|
|
130
|
+
const fitted = all.filter((x) => x.fits.some((f) => f.level !== 'not_needed'));
|
|
131
|
+
const topicIndex = new Map();
|
|
132
|
+
for (const { p } of fitted)
|
|
133
|
+
for (const r of p.requirements)
|
|
134
|
+
for (const t of overlapTopics(r.text)) {
|
|
135
|
+
if (!topicIndex.has(t))
|
|
136
|
+
topicIndex.set(t, new Set());
|
|
137
|
+
topicIndex.get(t).add(p.id);
|
|
138
|
+
}
|
|
139
|
+
return all.map(({ p, fits }) => {
|
|
140
|
+
const ids = (l) => fits.filter((f) => f.level === l).map((f) => f.agentId);
|
|
141
|
+
return {
|
|
142
|
+
packId: p.id, installed: ids('installed'), required: ids('required'), recommended: ids('recommended'), notNeeded: ids('not_needed'), scanned: fits.some((f) => f.level !== 'not_needed'),
|
|
143
|
+
requirements: p.requirements.map((r, i) => { const at = (l) => fits.filter((f) => f.requirements[i].level === l).map((f) => f.agentId); const topics = overlapTopics(r.text); const alsoIn = [...new Set(topics.flatMap((t) => [...(topicIndex.get(t) ?? [])]))].filter((x) => x !== p.id).sort(); return { id: r.id, text: r.text, required: at('required'), recommended: at('recommended'), notNeeded: at('not_needed'), topics, alsoIn }; }),
|
|
144
|
+
byAgent: Object.fromEntries(fits.map((f) => [f.agentId, { level: f.level, why: f.why, requirements: Object.fromEntries(f.requirements.map((r) => [r.id, { level: r.level, why: r.why }])) }])),
|
|
145
|
+
};
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
/** Which shared control areas a requirement covers (minimum necessary, audit, consent, ...), for overlaps across packs. */
|
|
149
|
+
function overlapTopics(text) { return loadFitCatalogue().overlaps.filter((o) => o.patterns.some((p) => rx(p).test(text))).map((o) => o.id); }
|
|
150
|
+
/** The type My-CC's catalogue implies for a pack (law, contract, certification, best practice, framework). */
|
|
151
|
+
function packType(p) {
|
|
152
|
+
const n = `${p.name} ${p.framework ?? ''} ${p.subcategory ?? ''}`.toLowerCase();
|
|
153
|
+
if (/tenant|contract|baseline/.test(n))
|
|
154
|
+
return 'Contract';
|
|
155
|
+
if (/iso|certification|aiuc/.test(n))
|
|
156
|
+
return 'Certification';
|
|
157
|
+
if (/owasp|best practice|guidance|identity|mcp/.test(n))
|
|
158
|
+
return 'Best practice';
|
|
159
|
+
if (/framework|rmf|nist/.test(n))
|
|
160
|
+
return 'Framework';
|
|
161
|
+
return 'Law or regulation';
|
|
162
|
+
}
|
|
163
|
+
//# sourceMappingURL=fit.js.map
|
package/dist/fit.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fit.js","sourceRoot":"","sources":["../src/fit.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export * from './types.js';
|
|
2
|
+
export { loadCatalogue, frameworkById } from './catalogue.js';
|
|
3
|
+
export { applicability, fits, boundPackFor } from './applicability.js';
|
|
4
|
+
export { scoreAgent, standardsLines } from './score.js';
|
|
5
|
+
export { loadFitCatalogue, inferIndustry, inferCapabilities, regionKey, packFit, fleetFit, packType, overlapTopics, type AgentSignals, type PackInput, type IndustryInference, type PackLevel, type ReqLevel, type RequirementFit, type PackFitResult, type FleetPackFit } from './fit.js';
|
|
6
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAA;AAC1B,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAA;AAC7D,OAAO,EAAE,aAAa,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AACtE,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AACvD,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,iBAAiB,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,aAAa,EAAE,KAAK,YAAY,EAAE,KAAK,SAAS,EAAE,KAAK,iBAAiB,EAAE,KAAK,SAAS,EAAE,KAAK,QAAQ,EAAE,KAAK,cAAc,EAAE,KAAK,aAAa,EAAE,KAAK,YAAY,EAAE,MAAM,UAAU,CAAA"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
exports.overlapTopics = exports.packType = exports.fleetFit = exports.packFit = exports.regionKey = exports.inferCapabilities = exports.inferIndustry = exports.loadFitCatalogue = exports.standardsLines = exports.scoreAgent = exports.boundPackFor = exports.fits = exports.applicability = exports.frameworkById = exports.loadCatalogue = void 0;
|
|
18
|
+
__exportStar(require("./types.js"), exports);
|
|
19
|
+
var catalogue_js_1 = require("./catalogue.js");
|
|
20
|
+
Object.defineProperty(exports, "loadCatalogue", { enumerable: true, get: function () { return catalogue_js_1.loadCatalogue; } });
|
|
21
|
+
Object.defineProperty(exports, "frameworkById", { enumerable: true, get: function () { return catalogue_js_1.frameworkById; } });
|
|
22
|
+
var applicability_js_1 = require("./applicability.js");
|
|
23
|
+
Object.defineProperty(exports, "applicability", { enumerable: true, get: function () { return applicability_js_1.applicability; } });
|
|
24
|
+
Object.defineProperty(exports, "fits", { enumerable: true, get: function () { return applicability_js_1.fits; } });
|
|
25
|
+
Object.defineProperty(exports, "boundPackFor", { enumerable: true, get: function () { return applicability_js_1.boundPackFor; } });
|
|
26
|
+
var score_js_1 = require("./score.js");
|
|
27
|
+
Object.defineProperty(exports, "scoreAgent", { enumerable: true, get: function () { return score_js_1.scoreAgent; } });
|
|
28
|
+
Object.defineProperty(exports, "standardsLines", { enumerable: true, get: function () { return score_js_1.standardsLines; } });
|
|
29
|
+
var fit_js_1 = require("./fit.js");
|
|
30
|
+
Object.defineProperty(exports, "loadFitCatalogue", { enumerable: true, get: function () { return fit_js_1.loadFitCatalogue; } });
|
|
31
|
+
Object.defineProperty(exports, "inferIndustry", { enumerable: true, get: function () { return fit_js_1.inferIndustry; } });
|
|
32
|
+
Object.defineProperty(exports, "inferCapabilities", { enumerable: true, get: function () { return fit_js_1.inferCapabilities; } });
|
|
33
|
+
Object.defineProperty(exports, "regionKey", { enumerable: true, get: function () { return fit_js_1.regionKey; } });
|
|
34
|
+
Object.defineProperty(exports, "packFit", { enumerable: true, get: function () { return fit_js_1.packFit; } });
|
|
35
|
+
Object.defineProperty(exports, "fleetFit", { enumerable: true, get: function () { return fit_js_1.fleetFit; } });
|
|
36
|
+
Object.defineProperty(exports, "packType", { enumerable: true, get: function () { return fit_js_1.packType; } });
|
|
37
|
+
Object.defineProperty(exports, "overlapTopics", { enumerable: true, get: function () { return fit_js_1.overlapTopics; } });
|
|
38
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,6CAA0B;AAC1B,+CAA6D;AAApD,6GAAA,aAAa,OAAA;AAAE,6GAAA,aAAa,OAAA;AACrC,uDAAsE;AAA7D,iHAAA,aAAa,OAAA;AAAE,wGAAA,IAAI,OAAA;AAAE,gHAAA,YAAY,OAAA;AAC1C,uCAAuD;AAA9C,sGAAA,UAAU,OAAA;AAAE,0GAAA,cAAc,OAAA;AACnC,mCAA0R;AAAjR,0GAAA,gBAAgB,OAAA;AAAE,uGAAA,aAAa,OAAA;AAAE,2GAAA,iBAAiB,OAAA;AAAE,mGAAA,SAAS,OAAA;AAAE,iGAAA,OAAO,OAAA;AAAE,kGAAA,QAAQ,OAAA;AAAE,kGAAA,QAAQ,OAAA;AAAE,uGAAA,aAAa,OAAA"}
|
package/dist/score.d.ts
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { AgentProfile, Evidence, StandardsReport } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Score the agent: every applicable framework's controls against the evidence the runtime supplied. A scored framework
|
|
4
|
+
* ('always' or 'installed') counts pass / total; an unknown fact is 'not_checked' and counts in the total, never as a
|
|
5
|
+
* pass. A recommended framework lists its controls as 'not_scored' so the gap is documented. The overall score is the
|
|
6
|
+
* pass share across scored frameworks, 0 to 100.
|
|
7
|
+
*/
|
|
8
|
+
export declare function scoreAgent(profile: AgentProfile, evidence: Evidence): StandardsReport;
|
|
9
|
+
/** The standards one per line for an agent folder: installed (pack bound), recommended (fits), or not applicable. */
|
|
10
|
+
export declare function standardsLines(profile: AgentProfile): Array<{
|
|
11
|
+
id: string;
|
|
12
|
+
name: string;
|
|
13
|
+
state: 'installed' | 'recommended' | 'always' | 'not_applicable';
|
|
14
|
+
why: string;
|
|
15
|
+
packIds: string[];
|
|
16
|
+
}>;
|
|
17
|
+
//# sourceMappingURL=score.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"score.d.ts","sourceRoot":"","sources":["../src/score.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,eAAe,EAAyC,MAAM,YAAY,CAAA;AAShH;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,QAAQ,GAAG,eAAe,CAuBrF;AAED,qHAAqH;AACrH,wBAAgB,cAAc,CAAC,OAAO,EAAE,YAAY,GAAG,KAAK,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,WAAW,GAAG,aAAa,GAAG,QAAQ,GAAG,gBAAgB,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,CAE3L"}
|
package/dist/score.js
ADDED
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.scoreAgent = scoreAgent;
|
|
4
|
+
exports.standardsLines = standardsLines;
|
|
5
|
+
const catalogue_js_1 = require("./catalogue.js");
|
|
6
|
+
const applicability_js_1 = require("./applicability.js");
|
|
7
|
+
const norm = (s) => s.trim().toLowerCase();
|
|
8
|
+
function controlApplies(c, profile) {
|
|
9
|
+
if (!c.onlyWith?.dataClasses)
|
|
10
|
+
return true;
|
|
11
|
+
const classes = profile.dataClasses.map(norm);
|
|
12
|
+
return c.onlyWith.dataClasses.some((d) => classes.includes(norm(d)));
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Score the agent: every applicable framework's controls against the evidence the runtime supplied. A scored framework
|
|
16
|
+
* ('always' or 'installed') counts pass / total; an unknown fact is 'not_checked' and counts in the total, never as a
|
|
17
|
+
* pass. A recommended framework lists its controls as 'not_scored' so the gap is documented. The overall score is the
|
|
18
|
+
* pass share across scored frameworks, 0 to 100.
|
|
19
|
+
*/
|
|
20
|
+
function scoreAgent(profile, evidence) {
|
|
21
|
+
const cat = (0, catalogue_js_1.loadCatalogue)();
|
|
22
|
+
const missing = new Set();
|
|
23
|
+
const frameworks = [];
|
|
24
|
+
const omitted = [];
|
|
25
|
+
for (const app of (0, applicability_js_1.applicability)(profile)) {
|
|
26
|
+
const fw = cat.frameworks.find((f) => f.id === app.framework);
|
|
27
|
+
if (app.status === 'not_applicable') {
|
|
28
|
+
omitted.push({ framework: fw.id, name: fw.name, why: app.why });
|
|
29
|
+
continue;
|
|
30
|
+
}
|
|
31
|
+
const scored = app.status === 'always' || app.status === 'installed';
|
|
32
|
+
const checks = fw.controls.filter((c) => controlApplies(c, profile)).map((c) => {
|
|
33
|
+
const fact = evidence[c.evidence];
|
|
34
|
+
const base = { id: c.id, framework: fw.id, frameworkName: fw.name, control: c.control, writesTo: c.writesTo, evidence: c.evidence };
|
|
35
|
+
if (!scored)
|
|
36
|
+
return { ...base, result: 'not_scored', detail: `documented: ${app.why}; bind the pack to score it` };
|
|
37
|
+
if (fact === true)
|
|
38
|
+
return { ...base, result: 'pass', detail: cat.evidence[c.evidence] ?? c.evidence };
|
|
39
|
+
if (fact === false)
|
|
40
|
+
return { ...base, result: 'fail', detail: `missing: ${cat.evidence[c.evidence] ?? c.evidence}` };
|
|
41
|
+
missing.add(c.evidence);
|
|
42
|
+
return { ...base, result: 'not_checked', detail: `no evidence supplied for ${c.evidence}` };
|
|
43
|
+
});
|
|
44
|
+
frameworks.push({ framework: fw.id, name: fw.name, authority: fw.authority, status: app.status, scored, why: app.why, pass: checks.filter((c) => c.result === 'pass').length, total: scored ? checks.length : 0, notChecked: checks.filter((c) => c.result === 'not_checked').length, checks });
|
|
45
|
+
}
|
|
46
|
+
const scoredFw = frameworks.filter((f) => f.scored);
|
|
47
|
+
const pass = scoredFw.reduce((n, f) => n + f.pass, 0);
|
|
48
|
+
const total = scoredFw.reduce((n, f) => n + f.total, 0);
|
|
49
|
+
return { catalogueVersion: cat.version, agentId: profile.agentId ?? null, score: total ? Math.round((pass / total) * 100) : 0, scoredFrameworks: scoredFw.length, frameworks, omitted, evidenceMissing: [...missing].sort() };
|
|
50
|
+
}
|
|
51
|
+
/** The standards one per line for an agent folder: installed (pack bound), recommended (fits), or not applicable. */
|
|
52
|
+
function standardsLines(profile) {
|
|
53
|
+
return (0, applicability_js_1.applicability)(profile).map((a) => ({ id: a.framework, name: a.name, state: a.status, why: a.why, packIds: a.packIds }));
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=score.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"score.js","sourceRoot":"","sources":["../src/score.ts"],"names":[],"mappings":"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"}
|