renma 0.8.1 → 0.10.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 (61) hide show
  1. package/CHANGELOG.md +32 -1
  2. package/dist/catalog-conflicts.d.ts +4 -0
  3. package/dist/catalog-conflicts.d.ts.map +1 -0
  4. package/dist/catalog-conflicts.js +86 -0
  5. package/dist/catalog-conflicts.js.map +1 -0
  6. package/dist/catalog-lifecycle.d.ts +4 -0
  7. package/dist/catalog-lifecycle.d.ts.map +1 -0
  8. package/dist/catalog-lifecycle.js +150 -0
  9. package/dist/catalog-lifecycle.js.map +1 -0
  10. package/dist/catalog.d.ts.map +1 -1
  11. package/dist/catalog.js +147 -0
  12. package/dist/catalog.js.map +1 -1
  13. package/dist/commands/ci-report.d.ts +5 -0
  14. package/dist/commands/ci-report.d.ts.map +1 -1
  15. package/dist/commands/ci-report.js +77 -2
  16. package/dist/commands/ci-report.js.map +1 -1
  17. package/dist/commands/diff.d.ts +4 -0
  18. package/dist/commands/diff.d.ts.map +1 -1
  19. package/dist/commands/diff.js +57 -8
  20. package/dist/commands/diff.js.map +1 -1
  21. package/dist/commands/readiness.d.ts +5 -1
  22. package/dist/commands/readiness.d.ts.map +1 -1
  23. package/dist/commands/readiness.js +66 -2
  24. package/dist/commands/readiness.js.map +1 -1
  25. package/dist/context-language-diagnostics.d.ts +2 -0
  26. package/dist/context-language-diagnostics.d.ts.map +1 -0
  27. package/dist/context-language-diagnostics.js +2 -0
  28. package/dist/context-language-diagnostics.js.map +1 -0
  29. package/dist/context-language.d.ts +20 -0
  30. package/dist/context-language.d.ts.map +1 -0
  31. package/dist/context-language.js +105 -0
  32. package/dist/context-language.js.map +1 -0
  33. package/dist/diagnostic-ids.d.ts +5 -0
  34. package/dist/diagnostic-ids.d.ts.map +1 -1
  35. package/dist/diagnostic-ids.js +5 -0
  36. package/dist/diagnostic-ids.js.map +1 -1
  37. package/dist/scanner.d.ts.map +1 -1
  38. package/dist/scanner.js +81 -0
  39. package/dist/scanner.js.map +1 -1
  40. package/dist/security-diagnostics.d.ts.map +1 -1
  41. package/dist/security-diagnostics.js +2 -266
  42. package/dist/security-diagnostics.js.map +1 -1
  43. package/dist/security-diff.d.ts +54 -0
  44. package/dist/security-diff.d.ts.map +1 -0
  45. package/dist/security-diff.js +78 -0
  46. package/dist/security-diff.js.map +1 -0
  47. package/dist/security-policy-inventory.d.ts +55 -0
  48. package/dist/security-policy-inventory.d.ts.map +1 -0
  49. package/dist/security-policy-inventory.js +172 -0
  50. package/dist/security-policy-inventory.js.map +1 -0
  51. package/dist/security-policy.d.ts +32 -0
  52. package/dist/security-policy.d.ts.map +1 -0
  53. package/dist/security-policy.js +237 -0
  54. package/dist/security-policy.js.map +1 -0
  55. package/dist/security-posture.d.ts +35 -0
  56. package/dist/security-posture.d.ts.map +1 -0
  57. package/dist/security-posture.js +108 -0
  58. package/dist/security-posture.js.map +1 -0
  59. package/dist/types.d.ts +2 -0
  60. package/dist/types.d.ts.map +1 -1
  61. package/package.json +1 -1
@@ -0,0 +1,55 @@
1
+ import { type SecurityPolicy } from "./security-policy.js";
2
+ import type { Artifact, ArtifactKind, SecurityConfig } from "./types.js";
3
+ type InventoryArtifactKind = ArtifactKind;
4
+ export interface PolicyBooleanCounts {
5
+ true: number;
6
+ false: number;
7
+ unspecified: number;
8
+ }
9
+ export interface SecurityPolicyInventorySummary {
10
+ totalPolicyAssets: number;
11
+ assetsWithPolicyMetadata: number;
12
+ assetsMissingPolicyMetadata: number;
13
+ assetKinds: Record<InventoryArtifactKind, number>;
14
+ networkAllowed: PolicyBooleanCounts;
15
+ externalUploadAllowed: PolicyBooleanCounts;
16
+ secretsAllowed: PolicyBooleanCounts;
17
+ humanApprovalRequired: PolicyBooleanCounts;
18
+ approvedNetworkDestinationCount: number;
19
+ approvedUploadDestinationCount: number;
20
+ forbiddenInputCount: number;
21
+ disallowedCommandCount: number;
22
+ securityProfiles: {
23
+ referenced: number;
24
+ resolved: number;
25
+ missing: number;
26
+ cyclic: number;
27
+ none: number;
28
+ names: Array<{
29
+ name: string;
30
+ count: number;
31
+ }>;
32
+ };
33
+ topApprovedNetworkDestinations: Array<{
34
+ destination: string;
35
+ count: number;
36
+ }>;
37
+ topApprovedUploadDestinations: Array<{
38
+ destination: string;
39
+ count: number;
40
+ }>;
41
+ topForbiddenInputs: Array<{
42
+ input: string;
43
+ count: number;
44
+ }>;
45
+ missingPolicyAssets: Array<{
46
+ path: string;
47
+ kind: ArtifactKind;
48
+ }>;
49
+ }
50
+ export declare function summarizeSecurityPolicyInventory(artifacts: Artifact[], config?: SecurityConfig): SecurityPolicyInventorySummary;
51
+ export declare function zeroSecurityPolicyInventorySummary(): SecurityPolicyInventorySummary;
52
+ export declare function isPolicyInventoryArtifact(artifact: Artifact, hasLocalMetadata?: boolean): boolean;
53
+ export declare function hasLocalSecurityPolicyMetadata(policy: SecurityPolicy): boolean;
54
+ export {};
55
+ //# sourceMappingURL=security-policy-inventory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"security-policy-inventory.d.ts","sourceRoot":"","sources":["../src/security-policy-inventory.ts"],"names":[],"mappings":"AAAA,OAAO,EAML,KAAK,cAAc,EACpB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEzE,KAAK,qBAAqB,GAAG,YAAY,CAAC;AAE1C,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,8BAA8B;IAC7C,iBAAiB,EAAE,MAAM,CAAC;IAC1B,wBAAwB,EAAE,MAAM,CAAC;IACjC,2BAA2B,EAAE,MAAM,CAAC;IACpC,UAAU,EAAE,MAAM,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC;IAClD,cAAc,EAAE,mBAAmB,CAAC;IACpC,qBAAqB,EAAE,mBAAmB,CAAC;IAC3C,cAAc,EAAE,mBAAmB,CAAC;IACpC,qBAAqB,EAAE,mBAAmB,CAAC;IAC3C,+BAA+B,EAAE,MAAM,CAAC;IACxC,8BAA8B,EAAE,MAAM,CAAC;IACvC,mBAAmB,EAAE,MAAM,CAAC;IAC5B,sBAAsB,EAAE,MAAM,CAAC;IAC/B,gBAAgB,EAAE;QAChB,UAAU,EAAE,MAAM,CAAC;QACnB,QAAQ,EAAE,MAAM,CAAC;QACjB,OAAO,EAAE,MAAM,CAAC;QAChB,MAAM,EAAE,MAAM,CAAC;QACf,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,KAAK,CAAC;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;KAC/C,CAAC;IACF,8BAA8B,EAAE,KAAK,CAAC;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC9E,6BAA6B,EAAE,KAAK,CAAC;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC7E,kBAAkB,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC5D,mBAAmB,EAAE,KAAK,CAAC;QACzB,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,YAAY,CAAC;KACpB,CAAC,CAAC;CACJ;AAmCD,wBAAgB,gCAAgC,CAC9C,SAAS,EAAE,QAAQ,EAAE,EACrB,MAAM,CAAC,EAAE,cAAc,GACtB,8BAA8B,CAwEhC;AAED,wBAAgB,kCAAkC,IAAI,8BAA8B,CA2BnF;AAED,wBAAgB,yBAAyB,CACvC,QAAQ,EAAE,QAAQ,EAClB,gBAAgB,UAEf,GACA,OAAO,CAET;AAED,wBAAgB,8BAA8B,CAC5C,MAAM,EAAE,cAAc,GACrB,OAAO,CAIT"}
@@ -0,0 +1,172 @@
1
+ import { applySecurityConfig, effectiveAllowedDataClass, effectiveAllowedDataList, parseSecurityPolicy, securityProfileChain, } from "./security-policy.js";
2
+ const POLICY_INVENTORY_KINDS = new Set([
3
+ "skill",
4
+ "context",
5
+ "agent",
6
+ "profile",
7
+ "reference",
8
+ "example",
9
+ "config",
10
+ ]);
11
+ const ASSET_KINDS = [
12
+ "skill",
13
+ "context",
14
+ "agent",
15
+ "profile",
16
+ "reference",
17
+ "example",
18
+ "config",
19
+ "unknown",
20
+ ];
21
+ const LOCAL_POLICY_METADATA_FIELDS = new Set([
22
+ "allowedData",
23
+ "networkAllowed",
24
+ "externalUploadAllowed",
25
+ "secretsAllowed",
26
+ "humanApprovalRequired",
27
+ "securityProfile",
28
+ "forbiddenInputs",
29
+ "approvedNetworkDestinations",
30
+ "approvedUploadDestinations",
31
+ ]);
32
+ export function summarizeSecurityPolicyInventory(artifacts, config) {
33
+ const summary = zeroSecurityPolicyInventorySummary();
34
+ const networkDestinations = new Map();
35
+ const uploadDestinations = new Map();
36
+ const forbiddenInputs = new Map();
37
+ const profileNames = new Map();
38
+ for (const artifact of artifacts) {
39
+ const parsedPolicy = parseSecurityPolicy(artifact.content);
40
+ const hasMetadata = hasLocalSecurityPolicyMetadata(parsedPolicy);
41
+ if (!isPolicyInventoryArtifact(artifact, hasMetadata))
42
+ continue;
43
+ const policy = applySecurityConfig(parsedPolicy, config);
44
+ summary.totalPolicyAssets += 1;
45
+ summary.assetKinds[artifact.kind] += 1;
46
+ if (hasMetadata) {
47
+ summary.assetsWithPolicyMetadata += 1;
48
+ }
49
+ if (isMissingPolicyMetadataAsset(artifact, parsedPolicy, policy)) {
50
+ summary.assetsMissingPolicyMetadata += 1;
51
+ summary.missingPolicyAssets.push({
52
+ path: artifact.path,
53
+ kind: artifact.kind,
54
+ });
55
+ }
56
+ countPolicyBoolean(summary.networkAllowed, policy.networkAllowed);
57
+ countPolicyBoolean(summary.externalUploadAllowed, policy.externalUploadAllowed);
58
+ countPolicyBoolean(summary.secretsAllowed, policy.secretsAllowed);
59
+ countPolicyBoolean(summary.humanApprovalRequired, policy.humanApprovalRequired);
60
+ summary.approvedNetworkDestinationCount += addUniqueCounts(networkDestinations, policy.approvedNetworkDestinations);
61
+ summary.approvedUploadDestinationCount += addUniqueCounts(uploadDestinations, policy.approvedUploadDestinations);
62
+ summary.forbiddenInputCount += addUniqueCounts(forbiddenInputs, policy.forbiddenInputs);
63
+ summary.disallowedCommandCount += uniqueStrings(policy.disallowedCommands).length;
64
+ countSecurityProfile(summary, profileNames, parsedPolicy, config);
65
+ }
66
+ summary.securityProfiles.names = topCounts(profileNames, "name");
67
+ summary.topApprovedNetworkDestinations = topCounts(networkDestinations, "destination");
68
+ summary.topApprovedUploadDestinations = topCounts(uploadDestinations, "destination");
69
+ summary.topForbiddenInputs = topCounts(forbiddenInputs, "input");
70
+ summary.missingPolicyAssets.sort((left, right) => left.path.localeCompare(right.path));
71
+ return summary;
72
+ }
73
+ export function zeroSecurityPolicyInventorySummary() {
74
+ return {
75
+ totalPolicyAssets: 0,
76
+ assetsWithPolicyMetadata: 0,
77
+ assetsMissingPolicyMetadata: 0,
78
+ assetKinds: zeroAssetKinds(),
79
+ networkAllowed: zeroPolicyBooleanCounts(),
80
+ externalUploadAllowed: zeroPolicyBooleanCounts(),
81
+ secretsAllowed: zeroPolicyBooleanCounts(),
82
+ humanApprovalRequired: zeroPolicyBooleanCounts(),
83
+ approvedNetworkDestinationCount: 0,
84
+ approvedUploadDestinationCount: 0,
85
+ forbiddenInputCount: 0,
86
+ disallowedCommandCount: 0,
87
+ securityProfiles: {
88
+ referenced: 0,
89
+ resolved: 0,
90
+ missing: 0,
91
+ cyclic: 0,
92
+ none: 0,
93
+ names: [],
94
+ },
95
+ topApprovedNetworkDestinations: [],
96
+ topApprovedUploadDestinations: [],
97
+ topForbiddenInputs: [],
98
+ missingPolicyAssets: [],
99
+ };
100
+ }
101
+ export function isPolicyInventoryArtifact(artifact, hasLocalMetadata = hasLocalSecurityPolicyMetadata(parseSecurityPolicy(artifact.content))) {
102
+ return POLICY_INVENTORY_KINDS.has(artifact.kind) || hasLocalMetadata;
103
+ }
104
+ export function hasLocalSecurityPolicyMetadata(policy) {
105
+ return [...LOCAL_POLICY_METADATA_FIELDS].some((field) => policy.declared.has(field));
106
+ }
107
+ function isMissingPolicyMetadataAsset(artifact, parsedPolicy, effectivePolicy) {
108
+ return ((artifact.kind === "skill" || artifact.kind === "context") &&
109
+ effectiveAllowedDataClass(effectivePolicy) === undefined &&
110
+ effectiveAllowedDataList(effectivePolicy).length === 0 &&
111
+ !hasLocalSecurityPolicyMetadata(parsedPolicy));
112
+ }
113
+ function zeroAssetKinds() {
114
+ return Object.fromEntries(ASSET_KINDS.map((kind) => [kind, 0]));
115
+ }
116
+ function zeroPolicyBooleanCounts() {
117
+ return {
118
+ true: 0,
119
+ false: 0,
120
+ unspecified: 0,
121
+ };
122
+ }
123
+ function countPolicyBoolean(counts, value) {
124
+ if (value === true) {
125
+ counts.true += 1;
126
+ }
127
+ else if (value === false) {
128
+ counts.false += 1;
129
+ }
130
+ else {
131
+ counts.unspecified += 1;
132
+ }
133
+ }
134
+ function addUniqueCounts(counts, values) {
135
+ const uniqueValues = uniqueStrings(values);
136
+ for (const value of uniqueValues) {
137
+ counts.set(value, (counts.get(value) ?? 0) + 1);
138
+ }
139
+ return uniqueValues.length;
140
+ }
141
+ function countSecurityProfile(summary, profileNames, policy, config) {
142
+ if (policy.securityProfile === undefined) {
143
+ summary.securityProfiles.none += 1;
144
+ return;
145
+ }
146
+ summary.securityProfiles.referenced += 1;
147
+ profileNames.set(policy.securityProfile, (profileNames.get(policy.securityProfile) ?? 0) + 1);
148
+ const chain = securityProfileChain(policy.securityProfile, config);
149
+ if (chain.missingProfile !== undefined) {
150
+ summary.securityProfiles.missing += 1;
151
+ }
152
+ else if (chain.cycle !== undefined) {
153
+ summary.securityProfiles.cyclic += 1;
154
+ }
155
+ else {
156
+ summary.securityProfiles.resolved += 1;
157
+ }
158
+ }
159
+ function topCounts(counts, key) {
160
+ return [...counts.entries()]
161
+ .map(([name, count]) => ({ [key]: name, count }))
162
+ .sort((left, right) => {
163
+ if (left.count !== right.count)
164
+ return right.count - left.count;
165
+ return left[key].localeCompare(right[key]);
166
+ })
167
+ .slice(0, 10);
168
+ }
169
+ function uniqueStrings(values) {
170
+ return [...new Set(values)];
171
+ }
172
+ //# sourceMappingURL=security-policy-inventory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"security-policy-inventory.js","sourceRoot":"","sources":["../src/security-policy-inventory.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ import type { SecurityConfig } from "./types.js";
2
+ export interface SecurityPolicy {
3
+ networkAllowed?: boolean;
4
+ externalUploadAllowed?: boolean;
5
+ secretsAllowed?: boolean;
6
+ humanApprovalRequired?: boolean;
7
+ securityProfile?: string;
8
+ allowedDataClass?: string;
9
+ allowedData: string[];
10
+ forbiddenInputs: string[];
11
+ approvedNetworkDestinations: string[];
12
+ approvedUploadDestinations: string[];
13
+ disallowedCommands: string[];
14
+ declared: Set<string>;
15
+ lineByField: Map<string, number>;
16
+ }
17
+ export interface SecurityProfileChainItem {
18
+ name: string;
19
+ profile: NonNullable<SecurityConfig["profiles"]>[string];
20
+ }
21
+ export interface SecurityProfileChain {
22
+ profiles: SecurityProfileChainItem[];
23
+ missingProfile?: string;
24
+ cycle?: string[];
25
+ }
26
+ export declare function parseSecurityPolicy(content: string): SecurityPolicy;
27
+ export declare function applySecurityConfig(policy: SecurityPolicy, config?: SecurityConfig): SecurityPolicy;
28
+ export declare function securityProfileChain(name: string | undefined, config: SecurityConfig | undefined): SecurityProfileChain;
29
+ export declare function effectiveAllowedDataClass(policy: SecurityPolicy): string | undefined;
30
+ export declare function effectiveAllowedDataList(policy: SecurityPolicy): string[];
31
+ export declare function isSecurityPolicyLine(line: string): boolean;
32
+ //# sourceMappingURL=security-policy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"security-policy.d.ts","sourceRoot":"","sources":["../src/security-policy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD,MAAM,WAAW,cAAc;IAC7B,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,2BAA2B,EAAE,MAAM,EAAE,CAAC;IACtC,0BAA0B,EAAE,MAAM,EAAE,CAAC;IACrC,kBAAkB,EAAE,MAAM,EAAE,CAAC;IAC7B,QAAQ,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACtB,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAClC;AAED,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,WAAW,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;CAC1D;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,wBAAwB,EAAE,CAAC;IACrC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;CAClB;AAuBD,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,cAAc,CAyFnE;AAED,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,cAAc,EACtB,MAAM,CAAC,EAAE,cAAc,GACtB,cAAc,CA0EhB;AAED,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,MAAM,GAAG,SAAS,EACxB,MAAM,EAAE,cAAc,GAAG,SAAS,GACjC,oBAAoB,CA6BtB;AAED,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,cAAc,GACrB,MAAM,GAAG,SAAS,CAEpB;AAED,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM,EAAE,CAEzE;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAW1D"}
@@ -0,0 +1,237 @@
1
+ const BOOLEAN_POLICY_FIELDS = new Map([
2
+ ["network_allowed", "networkAllowed"],
3
+ ["external_upload_allowed", "externalUploadAllowed"],
4
+ ["secrets_allowed", "secretsAllowed"],
5
+ ["requires_human_approval", "humanApprovalRequired"],
6
+ ]);
7
+ const DESTINATION_POLICY_FIELDS = new Set(["approved_network_destinations"]);
8
+ const UPLOAD_DESTINATION_POLICY_FIELDS = new Set([
9
+ "approved_upload_destinations",
10
+ ]);
11
+ const ALLOWED_DATA_POLICY_FIELDS = new Set(["allowed_data"]);
12
+ const FORBIDDEN_INPUT_POLICY_FIELDS = new Set(["forbidden_inputs"]);
13
+ const SECURITY_PROFILE_POLICY_FIELDS = new Set(["security_profile"]);
14
+ export function parseSecurityPolicy(content) {
15
+ const policy = {
16
+ allowedData: [],
17
+ forbiddenInputs: [],
18
+ approvedNetworkDestinations: [],
19
+ approvedUploadDestinations: [],
20
+ disallowedCommands: [],
21
+ declared: new Set(),
22
+ lineByField: new Map(),
23
+ };
24
+ const lines = content.split(/\r?\n/);
25
+ const frontmatterEnd = lines[0]?.trim() === "---"
26
+ ? lines.findIndex((line, index) => index > 0 && line.trim() === "---")
27
+ : -1;
28
+ const scanEnd = frontmatterEnd > 0 ? frontmatterEnd : Math.min(lines.length, 80);
29
+ for (let index = 0; index < scanEnd; index += 1) {
30
+ const line = lines[index] ?? "";
31
+ const match = line.match(/^\s*([A-Za-z_][A-Za-z0-9_]*):\s*(.*?)\s*$/);
32
+ if (!match) {
33
+ continue;
34
+ }
35
+ const rawKey = match[1] ?? "";
36
+ const rawValue = match[2] ?? "";
37
+ const key = rawKey.trim();
38
+ const value = rawValue.trim();
39
+ const blockList = value.length === 0
40
+ ? parseBlockList(lines, index, scanEnd)
41
+ : { values: [], nextIndex: index + 1 };
42
+ const booleanField = BOOLEAN_POLICY_FIELDS.get(key);
43
+ if (booleanField !== undefined) {
44
+ const parsed = parseBoolean(value);
45
+ if (parsed !== undefined) {
46
+ policy[booleanField] = parsed;
47
+ policy.declared.add(booleanField);
48
+ policy.lineByField.set(booleanField, index + 1);
49
+ }
50
+ continue;
51
+ }
52
+ if (DESTINATION_POLICY_FIELDS.has(key)) {
53
+ const destinations = policyListValues(value, blockList);
54
+ policy.approvedNetworkDestinations.push(...destinations);
55
+ policy.declared.add("approvedNetworkDestinations");
56
+ policy.lineByField.set("approvedNetworkDestinations", index + 1);
57
+ if (consumesBlockList(value, blockList))
58
+ index = blockList.nextIndex - 1;
59
+ continue;
60
+ }
61
+ if (UPLOAD_DESTINATION_POLICY_FIELDS.has(key)) {
62
+ const destinations = policyListValues(value, blockList);
63
+ policy.approvedUploadDestinations.push(...destinations);
64
+ policy.declared.add("approvedUploadDestinations");
65
+ policy.lineByField.set("approvedUploadDestinations", index + 1);
66
+ if (consumesBlockList(value, blockList))
67
+ index = blockList.nextIndex - 1;
68
+ continue;
69
+ }
70
+ if (ALLOWED_DATA_POLICY_FIELDS.has(key)) {
71
+ const values = policyListValues(value, blockList);
72
+ policy.allowedData.push(...values);
73
+ policy.declared.add("allowedData");
74
+ policy.lineByField.set("allowedData", index + 1);
75
+ if (consumesBlockList(value, blockList))
76
+ index = blockList.nextIndex - 1;
77
+ continue;
78
+ }
79
+ if (FORBIDDEN_INPUT_POLICY_FIELDS.has(key)) {
80
+ policy.forbiddenInputs.push(...policyListValues(value, blockList));
81
+ policy.declared.add("forbiddenInputs");
82
+ policy.lineByField.set("forbiddenInputs", index + 1);
83
+ if (consumesBlockList(value, blockList))
84
+ index = blockList.nextIndex - 1;
85
+ continue;
86
+ }
87
+ if (SECURITY_PROFILE_POLICY_FIELDS.has(key)) {
88
+ policy.securityProfile = value;
89
+ policy.declared.add("securityProfile");
90
+ policy.lineByField.set("securityProfile", index + 1);
91
+ }
92
+ }
93
+ return policy;
94
+ }
95
+ export function applySecurityConfig(policy, config) {
96
+ if (config === undefined)
97
+ return policy;
98
+ const declared = new Set(policy.declared);
99
+ const lineByField = new Map(policy.lineByField);
100
+ const resolved = {
101
+ ...policy,
102
+ allowedData: [...policy.allowedData],
103
+ forbiddenInputs: [...policy.forbiddenInputs],
104
+ approvedNetworkDestinations: [...policy.approvedNetworkDestinations],
105
+ approvedUploadDestinations: [...policy.approvedUploadDestinations],
106
+ disallowedCommands: [...policy.disallowedCommands],
107
+ declared,
108
+ lineByField,
109
+ };
110
+ const chain = securityProfileChain(policy.securityProfile, config);
111
+ for (const item of chain.profiles) {
112
+ const profile = item.profile;
113
+ if (!declared.has("networkAllowed") &&
114
+ profile.networkAllowed !== undefined) {
115
+ resolved.networkAllowed = profile.networkAllowed;
116
+ }
117
+ if (!declared.has("externalUploadAllowed") &&
118
+ profile.externalUploadAllowed !== undefined) {
119
+ resolved.externalUploadAllowed = profile.externalUploadAllowed;
120
+ }
121
+ if (!declared.has("secretsAllowed") &&
122
+ profile.secretsAllowed !== undefined) {
123
+ resolved.secretsAllowed = profile.secretsAllowed;
124
+ }
125
+ if (!declared.has("humanApprovalRequired") &&
126
+ profile.humanApprovalRequired !== undefined) {
127
+ resolved.humanApprovalRequired = profile.humanApprovalRequired;
128
+ }
129
+ if (!declared.has("allowedData") &&
130
+ profile.allowedDataClass !== undefined) {
131
+ resolved.allowedDataClass = profile.allowedDataClass;
132
+ }
133
+ if (!declared.has("allowedData")) {
134
+ resolved.allowedData.push(...profile.allowedData);
135
+ }
136
+ if (!declared.has("forbiddenInputs")) {
137
+ resolved.forbiddenInputs.push(...profile.forbiddenInputs);
138
+ }
139
+ resolved.approvedNetworkDestinations.push(...profile.approvedDomains);
140
+ resolved.approvedUploadDestinations.push(...profile.approvedUploadDomains);
141
+ resolved.disallowedCommands.push(...profile.disallowedCommands);
142
+ }
143
+ resolved.approvedNetworkDestinations.push(...config.approvedDomains);
144
+ resolved.approvedUploadDestinations.push(...config.approvedUploadDomains);
145
+ resolved.disallowedCommands.push(...config.disallowedCommands);
146
+ resolved.allowedData = uniqueStrings(resolved.allowedData);
147
+ resolved.forbiddenInputs = uniqueStrings(resolved.forbiddenInputs);
148
+ resolved.approvedNetworkDestinations = uniqueStrings(resolved.approvedNetworkDestinations);
149
+ resolved.approvedUploadDestinations = uniqueStrings(resolved.approvedUploadDestinations);
150
+ resolved.disallowedCommands = uniqueStrings(resolved.disallowedCommands);
151
+ return resolved;
152
+ }
153
+ export function securityProfileChain(name, config) {
154
+ if (name === undefined)
155
+ return { profiles: [] };
156
+ if (config === undefined)
157
+ return { profiles: [], missingProfile: name };
158
+ const profiles = [];
159
+ const seen = new Set();
160
+ const path = [];
161
+ let current = name;
162
+ while (current !== undefined) {
163
+ if (seen.has(current)) {
164
+ return {
165
+ profiles: [],
166
+ cycle: [...path.slice(path.indexOf(current)), current],
167
+ };
168
+ }
169
+ seen.add(current);
170
+ path.push(current);
171
+ const profile = config.profiles?.[current];
172
+ if (profile === undefined) {
173
+ return { profiles: [], missingProfile: current };
174
+ }
175
+ profiles.push({ name: current, profile });
176
+ current = profile.securityProfile;
177
+ }
178
+ return { profiles: profiles.reverse() };
179
+ }
180
+ export function effectiveAllowedDataClass(policy) {
181
+ return policy.allowedDataClass ?? policy.allowedData[0];
182
+ }
183
+ export function effectiveAllowedDataList(policy) {
184
+ return policy.allowedData;
185
+ }
186
+ export function isSecurityPolicyLine(line) {
187
+ const key = line.match(/^\s*([A-Za-z_][A-Za-z0-9_]*):/)?.[1];
188
+ return (key !== undefined &&
189
+ (BOOLEAN_POLICY_FIELDS.has(key) ||
190
+ DESTINATION_POLICY_FIELDS.has(key) ||
191
+ UPLOAD_DESTINATION_POLICY_FIELDS.has(key) ||
192
+ ALLOWED_DATA_POLICY_FIELDS.has(key) ||
193
+ FORBIDDEN_INPUT_POLICY_FIELDS.has(key) ||
194
+ SECURITY_PROFILE_POLICY_FIELDS.has(key)));
195
+ }
196
+ function parseBlockList(lines, startIndex, scanEnd) {
197
+ const values = [];
198
+ let index = startIndex + 1;
199
+ for (; index < scanEnd; index += 1) {
200
+ const line = lines[index] ?? "";
201
+ if (line.trim().length === 0)
202
+ break;
203
+ const match = line.match(/^\s*-\s*(.*?)\s*$/);
204
+ if (!match)
205
+ break;
206
+ values.push(...parseList(match[1] ?? ""));
207
+ }
208
+ return { values, nextIndex: index };
209
+ }
210
+ function policyListValues(value, blockList) {
211
+ return value.length > 0 ? parseList(value) : blockList.values;
212
+ }
213
+ function consumesBlockList(value, blockList) {
214
+ return value.length === 0 && blockList.values.length > 0;
215
+ }
216
+ function uniqueStrings(values) {
217
+ return [...new Set(values)];
218
+ }
219
+ function parseBoolean(value) {
220
+ const normalized = value.toLowerCase();
221
+ if (["true", "yes", "allowed", "allow", "1"].includes(normalized)) {
222
+ return true;
223
+ }
224
+ if (["false", "no", "denied", "deny", "0"].includes(normalized)) {
225
+ return false;
226
+ }
227
+ return undefined;
228
+ }
229
+ function parseList(value) {
230
+ return value
231
+ .replace(/^\[/, "")
232
+ .replace(/\]$/, "")
233
+ .split(",")
234
+ .map((item) => item.trim().replace(/^["']|["']$/g, ""))
235
+ .filter((item) => item.length > 0);
236
+ }
237
+ //# sourceMappingURL=security-policy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"security-policy.js","sourceRoot":"","sources":["../src/security-policy.ts"],"names":[],"mappings":"AA6BA,MAAM,qBAAqB,GAAG,IAAI,GAAG,CAA+B;IAClE,CAAC,iBAAiB,EAAE,gBAAgB,CAAC;IACrC,CAAC,yBAAyB,EAAE,uBAAuB,CAAC;IACpD,CAAC,iBAAiB,EAAE,gBAAgB,CAAC;IACrC,CAAC,yBAAyB,EAAE,uBAAuB,CAAC;CACrD,CAAC,CAAC;AAEH,MAAM,yBAAyB,GAAG,IAAI,GAAG,CAAC,CAAC,+BAA+B,CAAC,CAAC,CAAC;AAC7E,MAAM,gCAAgC,GAAG,IAAI,GAAG,CAAC;IAC/C,8BAA8B;CAC/B,CAAC,CAAC;AAEH,MAAM,0BAA0B,GAAG,IAAI,GAAG,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC;AAC7D,MAAM,6BAA6B,GAAG,IAAI,GAAG,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC;AACpE,MAAM,8BAA8B,GAAG,IAAI,GAAG,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC;AAOrE,MAAM,UAAU,mBAAmB,CAAC,OAAe;IACjD,MAAM,MAAM,GAAmB;QAC7B,WAAW,EAAE,EAAE;QACf,eAAe,EAAE,EAAE;QACnB,2BAA2B,EAAE,EAAE;QAC/B,0BAA0B,EAAE,EAAE;QAC9B,kBAAkB,EAAE,EAAE;QACtB,QAAQ,EAAE,IAAI,GAAG,EAAE;QACnB,WAAW,EAAE,IAAI,GAAG,EAAE;KACvB,CAAC;IAEF,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACrC,MAAM,cAAc,GAClB,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,KAAK;QACxB,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,GAAG,CAAC,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,KAAK,CAAC;QACtE,CAAC,CAAC,CAAC,CAAC,CAAC;IACT,MAAM,OAAO,GACX,cAAc,GAAG,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAEnE,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,OAAO,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QAChD,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;QAChC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,2CAA2C,CAAC,CAAC;QACtE,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,SAAS;QACX,CAAC;QAED,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAC9B,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAChC,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC;QAC1B,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC;QAC9B,MAAM,SAAS,GACb,KAAK,CAAC,MAAM,KAAK,CAAC;YAChB,CAAC,CAAC,cAAc,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,CAAC;YACvC,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,SAAS,EAAE,KAAK,GAAG,CAAC,EAAE,CAAC;QAE3C,MAAM,YAAY,GAAG,qBAAqB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACpD,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;YAC/B,MAAM,MAAM,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;YACnC,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;gBACxB,MAAM,CAAC,YAAY,CAAyB,GAAG,MAAM,CAAC;gBACvD,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;gBAClC,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,YAAY,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;YAClD,CAAC;YACD,SAAS;QACX,CAAC;QAED,IAAI,yBAAyB,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YACvC,MAAM,YAAY,GAAG,gBAAgB,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;YACxD,MAAM,CAAC,2BAA2B,CAAC,IAAI,CAAC,GAAG,YAAY,CAAC,CAAC;YACzD,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;YACnD,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,6BAA6B,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;YACjE,IAAI,iBAAiB,CAAC,KAAK,EAAE,SAAS,CAAC;gBAAE,KAAK,GAAG,SAAS,CAAC,SAAS,GAAG,CAAC,CAAC;YACzE,SAAS;QACX,CAAC;QAED,IAAI,gCAAgC,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YAC9C,MAAM,YAAY,GAAG,gBAAgB,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;YACxD,MAAM,CAAC,0BAA0B,CAAC,IAAI,CAAC,GAAG,YAAY,CAAC,CAAC;YACxD,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;YAClD,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,4BAA4B,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;YAChE,IAAI,iBAAiB,CAAC,KAAK,EAAE,SAAS,CAAC;gBAAE,KAAK,GAAG,SAAS,CAAC,SAAS,GAAG,CAAC,CAAC;YACzE,SAAS;QACX,CAAC;QAED,IAAI,0BAA0B,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YACxC,MAAM,MAAM,GAAG,gBAAgB,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;YAClD,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,CAAC;YACnC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;YACnC,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,aAAa,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;YACjD,IAAI,iBAAiB,CAAC,KAAK,EAAE,SAAS,CAAC;gBAAE,KAAK,GAAG,SAAS,CAAC,SAAS,GAAG,CAAC,CAAC;YACzE,SAAS;QACX,CAAC;QAED,IAAI,6BAA6B,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YAC3C,MAAM,CAAC,eAAe,CAAC,IAAI,CAAC,GAAG,gBAAgB,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC;YACnE,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;YACvC,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,iBAAiB,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;YACrD,IAAI,iBAAiB,CAAC,KAAK,EAAE,SAAS,CAAC;gBAAE,KAAK,GAAG,SAAS,CAAC,SAAS,GAAG,CAAC,CAAC;YACzE,SAAS;QACX,CAAC;QAED,IAAI,8BAA8B,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YAC5C,MAAM,CAAC,eAAe,GAAG,KAAK,CAAC;YAC/B,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;YACvC,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,iBAAiB,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;QACvD,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,mBAAmB,CACjC,MAAsB,EACtB,MAAuB;IAEvB,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,MAAM,CAAC;IAExC,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC1C,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IAChD,MAAM,QAAQ,GAAmB;QAC/B,GAAG,MAAM;QACT,WAAW,EAAE,CAAC,GAAG,MAAM,CAAC,WAAW,CAAC;QACpC,eAAe,EAAE,CAAC,GAAG,MAAM,CAAC,eAAe,CAAC;QAC5C,2BAA2B,EAAE,CAAC,GAAG,MAAM,CAAC,2BAA2B,CAAC;QACpE,0BAA0B,EAAE,CAAC,GAAG,MAAM,CAAC,0BAA0B,CAAC;QAClE,kBAAkB,EAAE,CAAC,GAAG,MAAM,CAAC,kBAAkB,CAAC;QAClD,QAAQ;QACR,WAAW;KACZ,CAAC;IAEF,MAAM,KAAK,GAAG,oBAAoB,CAAC,MAAM,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC;IACnE,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;QAClC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;QAC7B,IACE,CAAC,QAAQ,CAAC,GAAG,CAAC,gBAAgB,CAAC;YAC/B,OAAO,CAAC,cAAc,KAAK,SAAS,EACpC,CAAC;YACD,QAAQ,CAAC,cAAc,GAAG,OAAO,CAAC,cAAc,CAAC;QACnD,CAAC;QACD,IACE,CAAC,QAAQ,CAAC,GAAG,CAAC,uBAAuB,CAAC;YACtC,OAAO,CAAC,qBAAqB,KAAK,SAAS,EAC3C,CAAC;YACD,QAAQ,CAAC,qBAAqB,GAAG,OAAO,CAAC,qBAAqB,CAAC;QACjE,CAAC;QACD,IACE,CAAC,QAAQ,CAAC,GAAG,CAAC,gBAAgB,CAAC;YAC/B,OAAO,CAAC,cAAc,KAAK,SAAS,EACpC,CAAC;YACD,QAAQ,CAAC,cAAc,GAAG,OAAO,CAAC,cAAc,CAAC;QACnD,CAAC;QACD,IACE,CAAC,QAAQ,CAAC,GAAG,CAAC,uBAAuB,CAAC;YACtC,OAAO,CAAC,qBAAqB,KAAK,SAAS,EAC3C,CAAC;YACD,QAAQ,CAAC,qBAAqB,GAAG,OAAO,CAAC,qBAAqB,CAAC;QACjE,CAAC;QACD,IACE,CAAC,QAAQ,CAAC,GAAG,CAAC,aAAa,CAAC;YAC5B,OAAO,CAAC,gBAAgB,KAAK,SAAS,EACtC,CAAC;YACD,QAAQ,CAAC,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,CAAC;QACvD,CAAC;QACD,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE,CAAC;YACjC,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;QACpD,CAAC;QACD,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,iBAAiB,CAAC,EAAE,CAAC;YACrC,QAAQ,CAAC,eAAe,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;QAC5D,CAAC;QACD,QAAQ,CAAC,2BAA2B,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;QACtE,QAAQ,CAAC,0BAA0B,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAAC;QAC3E,QAAQ,CAAC,kBAAkB,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAAC;IAClE,CAAC;IAED,QAAQ,CAAC,2BAA2B,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,eAAe,CAAC,CAAC;IACrE,QAAQ,CAAC,0BAA0B,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,qBAAqB,CAAC,CAAC;IAC1E,QAAQ,CAAC,kBAAkB,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,kBAAkB,CAAC,CAAC;IAC/D,QAAQ,CAAC,WAAW,GAAG,aAAa,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;IAC3D,QAAQ,CAAC,eAAe,GAAG,aAAa,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC;IACnE,QAAQ,CAAC,2BAA2B,GAAG,aAAa,CAClD,QAAQ,CAAC,2BAA2B,CACrC,CAAC;IACF,QAAQ,CAAC,0BAA0B,GAAG,aAAa,CACjD,QAAQ,CAAC,0BAA0B,CACpC,CAAC;IACF,QAAQ,CAAC,kBAAkB,GAAG,aAAa,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAC;IAEzE,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,oBAAoB,CAClC,IAAwB,EACxB,MAAkC;IAElC,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;IAChD,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC;IAExE,MAAM,QAAQ,GAA+B,EAAE,CAAC;IAChD,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,MAAM,IAAI,GAAa,EAAE,CAAC;IAC1B,IAAI,OAAO,GAAuB,IAAI,CAAC;IAEvC,OAAO,OAAO,KAAK,SAAS,EAAE,CAAC;QAC7B,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;YACtB,OAAO;gBACL,QAAQ,EAAE,EAAE;gBACZ,KAAK,EAAE,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,EAAE,OAAO,CAAC;aACvD,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAClB,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAEnB,MAAM,OAAO,GACX,MAAM,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,CAAC;QAC7B,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;YAC1B,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,cAAc,EAAE,OAAO,EAAE,CAAC;QACnD,CAAC;QACD,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;QAC1C,OAAO,GAAG,OAAO,CAAC,eAAe,CAAC;IACpC,CAAC;IAED,OAAO,EAAE,QAAQ,EAAE,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC;AAC1C,CAAC;AAED,MAAM,UAAU,yBAAyB,CACvC,MAAsB;IAEtB,OAAO,MAAM,CAAC,gBAAgB,IAAI,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;AAC1D,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,MAAsB;IAC7D,OAAO,MAAM,CAAC,WAAW,CAAC;AAC5B,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,IAAY;IAC/C,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,+BAA+B,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAC7D,OAAO,CACL,GAAG,KAAK,SAAS;QACjB,CAAC,qBAAqB,CAAC,GAAG,CAAC,GAAG,CAAC;YAC7B,yBAAyB,CAAC,GAAG,CAAC,GAAG,CAAC;YAClC,gCAAgC,CAAC,GAAG,CAAC,GAAG,CAAC;YACzC,0BAA0B,CAAC,GAAG,CAAC,GAAG,CAAC;YACnC,6BAA6B,CAAC,GAAG,CAAC,GAAG,CAAC;YACtC,8BAA8B,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAC3C,CAAC;AACJ,CAAC;AAED,SAAS,cAAc,CACrB,KAAe,EACf,UAAkB,EAClB,OAAe;IAEf,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,IAAI,KAAK,GAAG,UAAU,GAAG,CAAC,CAAC;IAC3B,OAAO,KAAK,GAAG,OAAO,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QACnC,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;QAChC,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC;YAAE,MAAM;QAEpC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC;QAC9C,IAAI,CAAC,KAAK;YAAE,MAAM;QAElB,MAAM,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IAC5C,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;AACtC,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAa,EAAE,SAA0B;IACjE,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC;AAChE,CAAC;AAED,SAAS,iBAAiB,CAAC,KAAa,EAAE,SAA0B;IAClE,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,SAAS,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;AAC3D,CAAC;AAED,SAAS,aAAa,CAAC,MAAgB;IACrC,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;AAC9B,CAAC;AAED,SAAS,YAAY,CAAC,KAAa;IACjC,MAAM,UAAU,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;IACvC,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,GAAG,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;QAClE,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;QAChE,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,SAAS,CAAC,KAAa;IAC9B,OAAO,KAAK;SACT,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC;SAClB,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC;SAClB,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;SACtD,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AACvC,CAAC"}
@@ -0,0 +1,35 @@
1
+ import type { RiskClass, Severity } from "./types.js";
2
+ export interface SecurityPostureSummary {
3
+ totalSecurityFindings: number;
4
+ riskClasses: {
5
+ violation: number;
6
+ suspicious: number;
7
+ advisory: number;
8
+ unclassified: number;
9
+ };
10
+ severities: {
11
+ critical: number;
12
+ high: number;
13
+ medium: number;
14
+ low: number;
15
+ };
16
+ highOrCritical: number;
17
+ topFindingIds: Array<{
18
+ id: string;
19
+ count: number;
20
+ riskClass?: RiskClass | undefined;
21
+ maxSeverity: Severity;
22
+ }>;
23
+ }
24
+ export interface SecurityPostureFindingLike {
25
+ id: string;
26
+ severity: string;
27
+ riskClass?: string | undefined;
28
+ }
29
+ export declare function summarizeSecurityPosture(findings: SecurityPostureFindingLike[]): SecurityPostureSummary;
30
+ export declare function isSecurityFinding(finding: SecurityPostureFindingLike): boolean;
31
+ export declare function normalizeRiskClass(value: string | undefined): RiskClass | undefined;
32
+ export declare function normalizeSeverity(value: string | undefined): Severity | undefined;
33
+ export declare function compareSeverity(left: Severity, right: Severity): number;
34
+ export declare function zeroSecurityPostureSummary(): SecurityPostureSummary;
35
+ //# sourceMappingURL=security-posture.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"security-posture.d.ts","sourceRoot":"","sources":["../src/security-posture.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAetD,MAAM,WAAW,sBAAsB;IACrC,qBAAqB,EAAE,MAAM,CAAC;IAC9B,WAAW,EAAE;QACX,SAAS,EAAE,MAAM,CAAC;QAClB,UAAU,EAAE,MAAM,CAAC;QACnB,QAAQ,EAAE,MAAM,CAAC;QACjB,YAAY,EAAE,MAAM,CAAC;KACtB,CAAC;IACF,UAAU,EAAE;QACV,QAAQ,EAAE,MAAM,CAAC;QACjB,IAAI,EAAE,MAAM,CAAC;QACb,MAAM,EAAE,MAAM,CAAC;QACf,GAAG,EAAE,MAAM,CAAC;KACb,CAAC;IACF,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,KAAK,CAAC;QACnB,EAAE,EAAE,MAAM,CAAC;QACX,KAAK,EAAE,MAAM,CAAC;QACd,SAAS,CAAC,EAAE,SAAS,GAAG,SAAS,CAAC;QAClC,WAAW,EAAE,QAAQ,CAAC;KACvB,CAAC,CAAC;CACJ;AAED,MAAM,WAAW,0BAA0B;IACzC,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAChC;AASD,wBAAgB,wBAAwB,CACtC,QAAQ,EAAE,0BAA0B,EAAE,GACrC,sBAAsB,CAgExB;AAED,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,0BAA0B,GAClC,OAAO,CAKT;AAED,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,MAAM,GAAG,SAAS,GACxB,SAAS,GAAG,SAAS,CAKvB;AAED,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,MAAM,GAAG,SAAS,GACxB,QAAQ,GAAG,SAAS,CAUtB;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,GAAG,MAAM,CAEvE;AAED,wBAAgB,0BAA0B,IAAI,sBAAsB,CAkBnE"}