@x12i/memorix-descriptors 1.21.0 → 1.23.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 (96) hide show
  1. package/README.md +36 -0
  2. package/dist/admin/create-admin.d.ts +1 -0
  3. package/dist/admin/create-admin.d.ts.map +1 -1
  4. package/dist/admin/create-admin.js +2 -0
  5. package/dist/admin/create-admin.js.map +1 -1
  6. package/dist/collections/content-type-defaults.js +1 -1
  7. package/dist/collections/content-type-defaults.js.map +1 -1
  8. package/dist/collections/content-type-vocabulary.d.ts +21 -0
  9. package/dist/collections/content-type-vocabulary.d.ts.map +1 -0
  10. package/dist/collections/content-type-vocabulary.js +66 -0
  11. package/dist/collections/content-type-vocabulary.js.map +1 -0
  12. package/dist/collections/mongo-env.d.ts +2 -0
  13. package/dist/collections/mongo-env.d.ts.map +1 -1
  14. package/dist/collections/mongo-env.js +7 -1
  15. package/dist/collections/mongo-env.js.map +1 -1
  16. package/dist/having-narratives/derive-common-property.d.ts +19 -0
  17. package/dist/having-narratives/derive-common-property.d.ts.map +1 -0
  18. package/dist/having-narratives/derive-common-property.js +87 -0
  19. package/dist/having-narratives/derive-common-property.js.map +1 -0
  20. package/dist/having-narratives/discover-signals.d.ts +19 -0
  21. package/dist/having-narratives/discover-signals.d.ts.map +1 -0
  22. package/dist/having-narratives/discover-signals.js +298 -0
  23. package/dist/having-narratives/discover-signals.js.map +1 -0
  24. package/dist/having-narratives/meta-narratives.d.ts +15 -0
  25. package/dist/having-narratives/meta-narratives.d.ts.map +1 -0
  26. package/dist/having-narratives/meta-narratives.js +50 -0
  27. package/dist/having-narratives/meta-narratives.js.map +1 -0
  28. package/dist/having-narratives/narrative-keys.d.ts +18 -0
  29. package/dist/having-narratives/narrative-keys.d.ts.map +1 -0
  30. package/dist/having-narratives/narrative-keys.js +131 -0
  31. package/dist/having-narratives/narrative-keys.js.map +1 -0
  32. package/dist/having-narratives/record-predicates.d.ts +11 -0
  33. package/dist/having-narratives/record-predicates.d.ts.map +1 -0
  34. package/dist/having-narratives/record-predicates.js +58 -0
  35. package/dist/having-narratives/record-predicates.js.map +1 -0
  36. package/dist/index.d.ts +14 -3
  37. package/dist/index.d.ts.map +1 -1
  38. package/dist/index.js +13 -2
  39. package/dist/index.js.map +1 -1
  40. package/dist/migration/enrich-root-properties.d.ts +12 -0
  41. package/dist/migration/enrich-root-properties.d.ts.map +1 -0
  42. package/dist/migration/enrich-root-properties.js +110 -0
  43. package/dist/migration/enrich-root-properties.js.map +1 -0
  44. package/dist/migration/generate-descriptors.d.ts +5 -2
  45. package/dist/migration/generate-descriptors.d.ts.map +1 -1
  46. package/dist/migration/generate-descriptors.js +5 -3
  47. package/dist/migration/generate-descriptors.js.map +1 -1
  48. package/dist/migration/object-type-specs.js +1 -1
  49. package/dist/migration/object-type-specs.js.map +1 -1
  50. package/dist/migration/plan.d.ts.map +1 -1
  51. package/dist/migration/plan.js +3 -1
  52. package/dist/migration/plan.js.map +1 -1
  53. package/dist/root-properties/compute-catalog.d.ts +20 -0
  54. package/dist/root-properties/compute-catalog.d.ts.map +1 -0
  55. package/dist/root-properties/compute-catalog.js +71 -0
  56. package/dist/root-properties/compute-catalog.js.map +1 -0
  57. package/dist/root-properties/constants.d.ts +7 -0
  58. package/dist/root-properties/constants.d.ts.map +1 -0
  59. package/dist/root-properties/constants.js +59 -0
  60. package/dist/root-properties/constants.js.map +1 -0
  61. package/dist/root-properties/inference.d.ts +31 -0
  62. package/dist/root-properties/inference.d.ts.map +1 -0
  63. package/dist/root-properties/inference.js +121 -0
  64. package/dist/root-properties/inference.js.map +1 -0
  65. package/dist/root-properties/scan-catalog.d.ts +20 -0
  66. package/dist/root-properties/scan-catalog.d.ts.map +1 -0
  67. package/dist/root-properties/scan-catalog.js +136 -0
  68. package/dist/root-properties/scan-catalog.js.map +1 -0
  69. package/dist/seeds/default-seed-spec.d.ts.map +1 -1
  70. package/dist/seeds/default-seed-spec.js +6 -1
  71. package/dist/seeds/default-seed-spec.js.map +1 -1
  72. package/dist/store/descriptor-normalize.d.ts.map +1 -1
  73. package/dist/store/descriptor-normalize.js +8 -0
  74. package/dist/store/descriptor-normalize.js.map +1 -1
  75. package/dist/types/canonical-v2.d.ts +9 -1
  76. package/dist/types/canonical-v2.d.ts.map +1 -1
  77. package/dist/types/canonical-v2.js.map +1 -1
  78. package/dist/types/descriptors.d.ts +183 -0
  79. package/dist/types/descriptors.d.ts.map +1 -1
  80. package/dist/types/index.d.ts +1 -1
  81. package/dist/types/index.d.ts.map +1 -1
  82. package/dist/types/index.js.map +1 -1
  83. package/dist/validation/canonical-contamination.js +7 -1
  84. package/dist/validation/canonical-contamination.js.map +1 -1
  85. package/dist/validation/canonical-v2-validation.d.ts.map +1 -1
  86. package/dist/validation/canonical-v2-validation.js +29 -0
  87. package/dist/validation/canonical-v2-validation.js.map +1 -1
  88. package/dist/validation/descriptor-validation.d.ts +11 -1
  89. package/dist/validation/descriptor-validation.d.ts.map +1 -1
  90. package/dist/validation/descriptor-validation.js +160 -0
  91. package/dist/validation/descriptor-validation.js.map +1 -1
  92. package/dist/validation/processing-validation.d.ts +3 -0
  93. package/dist/validation/processing-validation.d.ts.map +1 -0
  94. package/dist/validation/processing-validation.js +121 -0
  95. package/dist/validation/processing-validation.js.map +1 -0
  96. package/package.json +2 -2
@@ -0,0 +1,298 @@
1
+ import { discoverMetaNarrativeSignals } from "./meta-narratives.js";
2
+ import { buildHasKey, normalizeEntityTargetSlug, pluralizeSlug, singularizeSlug, toKebab, } from "./narrative-keys.js";
3
+ import { discoverRecordPredicateSignals } from "./record-predicates.js";
4
+ export const NARRATIVE_SYNC_DETECTED_BY = "entity-pipeline.narrative-sync";
5
+ const DEFAULT_IGNORED_COMMON_VALUES = [
6
+ "",
7
+ "unknown",
8
+ "none",
9
+ "n/a",
10
+ "na",
11
+ "null",
12
+ "undefined",
13
+ "not_applicable",
14
+ ];
15
+ const SECURITY_OPS_PROPERTY_PATTERNS = [
16
+ "severity",
17
+ "status",
18
+ "risk",
19
+ "risk-level",
20
+ "priority",
21
+ "priority-score",
22
+ "priority-level",
23
+ "known-exploited",
24
+ "exploitability",
25
+ "exploitability-level",
26
+ "exposure",
27
+ "outside-exposure-class",
28
+ "reachability",
29
+ "internal-reachability-class",
30
+ "agent-status",
31
+ "operational-status",
32
+ "remote-access-adjacent",
33
+ "partner-link-adjacent",
34
+ "dmz-adjacent",
35
+ "zone-class",
36
+ "vr",
37
+ ];
38
+ function contentPostfixLabel(postfix) {
39
+ return postfix.charAt(0).toUpperCase() + postfix.slice(1);
40
+ }
41
+ function buildHasLabel(target) {
42
+ return `Has ${contentPostfixLabel(target)}`;
43
+ }
44
+ function propertySlug(propertyKey) {
45
+ const slug = toKebab(propertyKey).replace(/^xdr-/, "");
46
+ if (slug === "operational-status")
47
+ return "operational-status";
48
+ if (slug === "agent-status")
49
+ return "agent-status";
50
+ return slug;
51
+ }
52
+ function propertyLabel(propertyKey, descriptor) {
53
+ return descriptor?.label?.replace(/^XDR\s+/i, "") ?? contentPostfixLabel(propertySlug(propertyKey));
54
+ }
55
+ function propertySearchText(propertyKey, descriptor) {
56
+ return [propertyKey, descriptor.label, descriptor.source?.path]
57
+ .filter((value) => typeof value === "string")
58
+ .map((value) => toKebab(value).replace(/\./g, "-"))
59
+ .join(" ");
60
+ }
61
+ function classifyCommonProperty(propertyKey, descriptor) {
62
+ if (descriptor.valueType === "boolean")
63
+ return "boolean";
64
+ if (descriptor.valueType === "enum")
65
+ return "enum";
66
+ const text = propertySearchText(propertyKey, descriptor);
67
+ return SECURITY_OPS_PROPERTY_PATTERNS.some((pattern) => text.includes(pattern))
68
+ ? "security-ops"
69
+ : undefined;
70
+ }
71
+ function propertyPathFromDescriptor(propertyKey, descriptor) {
72
+ return descriptor.source?.path ?? propertyKey;
73
+ }
74
+ function linkedCommonPropertyLabel(targetEntity, propertyKey, propertyDescriptor) {
75
+ const target = normalizeEntityTargetSlug(targetEntity);
76
+ const propSlug = propertySlug(propertyKey);
77
+ return {
78
+ key: buildHasKey(`${target}-with-${propSlug}`),
79
+ label: `Has ${contentPostfixLabel(target)} With ${propertyLabel(propertyKey, propertyDescriptor)}`,
80
+ };
81
+ }
82
+ function associatedPropertyTargetLabel(propertyName, linkedObjectType, linkedContentType) {
83
+ if (linkedObjectType) {
84
+ const entityPlural = normalizeEntityTargetSlug(linkedObjectType);
85
+ const contentSuffix = linkedContentType && linkedContentType !== "snapshots"
86
+ ? `-${toKebab(linkedContentType)}`
87
+ : "";
88
+ return {
89
+ key: buildHasKey(`${entityPlural}${contentSuffix}`),
90
+ label: buildHasLabel(linkedContentType && linkedContentType !== "snapshots"
91
+ ? `${singularizeSlug(entityPlural)} ${linkedContentType}`
92
+ : entityPlural),
93
+ };
94
+ }
95
+ const stripped = propertyName.replace(/^associated/, "");
96
+ const kebab = toKebab(stripped || propertyName);
97
+ return {
98
+ key: buildHasKey(pluralizeSlug(kebab)),
99
+ label: buildHasLabel(pluralizeSlug(kebab)),
100
+ };
101
+ }
102
+ function relationTargetLabel(targetEntity) {
103
+ const slug = normalizeEntityTargetSlug(targetEntity);
104
+ return {
105
+ key: buildHasKey(slug),
106
+ label: buildHasLabel(slug),
107
+ };
108
+ }
109
+ function rootPropertyLabel(rootName, descriptor) {
110
+ return {
111
+ key: buildHasKey(toKebab(rootName)),
112
+ label: descriptor?.label ? `Has ${descriptor.label}` : buildHasLabel(toKebab(rootName)),
113
+ };
114
+ }
115
+ function sideContentLabel(postfix) {
116
+ return {
117
+ key: buildHasKey(postfix),
118
+ label: buildHasLabel(postfix),
119
+ };
120
+ }
121
+ function isCanonicalPostfix(descriptor, postfix) {
122
+ const canonical = descriptor.defaults.canonicalContentType;
123
+ for (const [key, ct] of Object.entries(descriptor.contentTypes)) {
124
+ const ctPostfix = (ct.postfix ?? key).toLowerCase();
125
+ if (ctPostfix === postfix.toLowerCase()) {
126
+ return key === canonical || ct.isCanonical === true;
127
+ }
128
+ }
129
+ return false;
130
+ }
131
+ function defaultExcludedPostfixes() {
132
+ return new Set(["core", "raw", "snapshots", "scoped", "legacy"]);
133
+ }
134
+ function targetEntityHasContentType(linkedObjectType, linkedContentType, descriptorByEntity) {
135
+ if (!linkedObjectType || !linkedContentType || linkedContentType === "snapshots")
136
+ return true;
137
+ const targetDescriptor = descriptorByEntity.get(linkedObjectType);
138
+ if (!targetDescriptor)
139
+ return false;
140
+ const wanted = linkedContentType.toLowerCase();
141
+ return Object.entries(targetDescriptor.contentTypes).some(([key, ct]) => {
142
+ const postfix = (ct.postfix ?? key).toLowerCase();
143
+ return postfix === wanted;
144
+ });
145
+ }
146
+ function isAssociatedPropertyBlocked(prop, descriptorByEntity) {
147
+ if (!prop.linkedContentType || prop.linkedContentType === "snapshots")
148
+ return false;
149
+ return !targetEntityHasContentType(prop.linkedObjectType, prop.linkedContentType, descriptorByEntity);
150
+ }
151
+ function mergeAssociatedPropertySignal(signalByKey, signal) {
152
+ const existing = signalByKey.get(signal.key);
153
+ if (!existing) {
154
+ signalByKey.set(signal.key, { ...signal, sourceRefs: [signal.sourceRef] });
155
+ return;
156
+ }
157
+ if (existing.kind !== "associated-property" || signal.kind !== "associated-property")
158
+ return;
159
+ const refs = new Set([...(existing.sourceRefs ?? [existing.sourceRef]), signal.sourceRef]);
160
+ existing.sourceRefs = [...refs];
161
+ if (signal.blocked)
162
+ existing.blocked = true;
163
+ }
164
+ /**
165
+ * Discover auto-generated "having X" narrative signals from entity descriptor metadata.
166
+ * No hand-authored narrative definitions are required.
167
+ */
168
+ export function discoverHavingNarrativeSignals(descriptor, allDescriptors = []) {
169
+ const signalByKey = new Map();
170
+ const descriptorByEntity = new Map([descriptor, ...allDescriptors].map((entry) => [entry.entityName, entry]));
171
+ function push(signal) {
172
+ if (signal.kind === "associated-property") {
173
+ mergeAssociatedPropertySignal(signalByKey, signal);
174
+ return;
175
+ }
176
+ if (!signalByKey.has(signal.key)) {
177
+ signalByKey.set(signal.key, signal);
178
+ }
179
+ }
180
+ for (const prop of descriptor.associatedProperties ?? []) {
181
+ const { key, label } = associatedPropertyTargetLabel(prop.name, prop.linkedObjectType, prop.linkedContentType);
182
+ push({
183
+ key,
184
+ label,
185
+ kind: "associated-property",
186
+ sourceRef: prop.name,
187
+ linkedContentType: prop.linkedContentType,
188
+ targetEntity: prop.linkedObjectType,
189
+ blocked: isAssociatedPropertyBlocked(prop, descriptorByEntity),
190
+ minItems: 1,
191
+ });
192
+ }
193
+ for (const [relationKey, relation] of Object.entries(descriptor.relations ?? {})) {
194
+ const { key, label } = relationTargetLabel(relation.targetEntity);
195
+ push({
196
+ key,
197
+ label,
198
+ kind: "relation",
199
+ sourceRef: relationKey,
200
+ targetEntity: relation.targetEntity,
201
+ minItems: 1,
202
+ });
203
+ const targetDescriptor = descriptorByEntity.get(relation.targetEntity);
204
+ const targetFields = relation.targetFields ?? [];
205
+ for (const targetField of targetFields) {
206
+ const targetProperty = targetDescriptor?.properties?.[targetField];
207
+ const family = targetProperty && classifyCommonProperty(targetField, targetProperty);
208
+ if (!family)
209
+ continue;
210
+ const linked = linkedCommonPropertyLabel(relation.targetEntity, targetField, targetProperty);
211
+ push({
212
+ key: linked.key,
213
+ label: linked.label,
214
+ kind: "linked-common-property",
215
+ sourceRef: relationKey,
216
+ relationKey,
217
+ targetEntity: relation.targetEntity,
218
+ propertyKey: targetField,
219
+ targetPropertyKey: targetField,
220
+ targetPropertyPath: targetProperty
221
+ ? propertyPathFromDescriptor(targetField, targetProperty)
222
+ : targetField,
223
+ propertyFamily: family,
224
+ ignoredValues: DEFAULT_IGNORED_COMMON_VALUES,
225
+ minItems: 1,
226
+ });
227
+ }
228
+ }
229
+ for (const [rootName, rootDescriptor] of Object.entries(descriptor.rootProperties ?? {})) {
230
+ const { key, label } = rootPropertyLabel(rootName, rootDescriptor);
231
+ push({
232
+ key,
233
+ label,
234
+ kind: "root-property",
235
+ sourceRef: rootName,
236
+ rootPath: rootDescriptor.source?.path ?? rootName,
237
+ minItems: 1,
238
+ });
239
+ }
240
+ const excluded = new Set([
241
+ ...defaultExcludedPostfixes(),
242
+ ...(descriptor.processing?.associatedContent?.excludePostfixes ?? []).map((p) => p.toLowerCase()),
243
+ ]);
244
+ for (const [contentKey, ct] of Object.entries(descriptor.contentTypes)) {
245
+ const postfix = (ct.postfix ?? contentKey).toLowerCase();
246
+ if (excluded.has(postfix))
247
+ continue;
248
+ if (isCanonicalPostfix(descriptor, postfix))
249
+ continue;
250
+ const { key, label } = sideContentLabel(postfix);
251
+ push({
252
+ key,
253
+ label,
254
+ kind: "side-content",
255
+ sourceRef: postfix,
256
+ contentPostfix: postfix,
257
+ minItems: 1,
258
+ });
259
+ }
260
+ for (const [propertyKey, propertyDescriptor] of Object.entries(descriptor.properties ?? {})) {
261
+ const family = classifyCommonProperty(propertyKey, propertyDescriptor);
262
+ if (!family)
263
+ continue;
264
+ const propSlug = propertySlug(propertyKey);
265
+ push({
266
+ key: buildHasKey(propSlug),
267
+ label: `Has ${propertyLabel(propertyKey, propertyDescriptor)}`,
268
+ kind: "common-property",
269
+ sourceRef: propertyKey,
270
+ propertyKey,
271
+ propertyPath: propertyPathFromDescriptor(propertyKey, propertyDescriptor),
272
+ propertyFamily: family,
273
+ ignoredValues: DEFAULT_IGNORED_COMMON_VALUES,
274
+ minItems: 1,
275
+ });
276
+ }
277
+ for (const predicate of discoverRecordPredicateSignals(descriptor.entityName)) {
278
+ push(predicate);
279
+ }
280
+ for (const meta of discoverMetaNarrativeSignals(descriptor.entityName)) {
281
+ push(meta);
282
+ }
283
+ return [...signalByKey.values()].sort((a, b) => a.key.localeCompare(b.key));
284
+ }
285
+ export function havingNarrativeSummaryFromSignal(signal, entityName, target) {
286
+ return {
287
+ entity: entityName,
288
+ key: signal.key,
289
+ label: signal.label,
290
+ target,
291
+ detectionMethod: signal.blocked ? "blocked-signal" : "having-signal",
292
+ generated: true,
293
+ signalKind: signal.kind,
294
+ propertyFamily: signal.propertyFamily,
295
+ blocked: signal.blocked,
296
+ };
297
+ }
298
+ //# sourceMappingURL=discover-signals.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discover-signals.js","sourceRoot":"","sources":["../../src/having-narratives/discover-signals.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import type { MemorixHavingNarrativeSignal } from "../types/descriptors.js";
2
+ export type MetaNarrativeRuleId = "asset-critical-or-high-vulns" | "asset-exploited-critical" | "asset-exposed-critical";
3
+ export type MetaNarrativeRule = {
4
+ id: MetaNarrativeRuleId;
5
+ key: string;
6
+ label: string;
7
+ entityName: string;
8
+ requireAny?: string[];
9
+ requireAll?: string[];
10
+ };
11
+ declare const META_RULES: MetaNarrativeRule[];
12
+ export declare function discoverMetaNarrativeSignals(entityName: string): MemorixHavingNarrativeSignal[];
13
+ export declare function evaluateMetaNarrative(ruleId: MetaNarrativeRuleId, evaluated: Record<string, boolean>): boolean;
14
+ export { META_RULES };
15
+ //# sourceMappingURL=meta-narratives.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"meta-narratives.d.ts","sourceRoot":"","sources":["../../src/having-narratives/meta-narratives.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,yBAAyB,CAAC;AAG5E,MAAM,MAAM,mBAAmB,GAC3B,8BAA8B,GAC9B,0BAA0B,GAC1B,wBAAwB,CAAC;AAE7B,MAAM,MAAM,iBAAiB,GAAG;IAC9B,EAAE,EAAE,mBAAmB,CAAC;IACxB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;CACvB,CAAC;AAEF,QAAA,MAAM,UAAU,EAAE,iBAAiB,EAsBlC,CAAC;AAEF,wBAAgB,4BAA4B,CAAC,UAAU,EAAE,MAAM,GAAG,4BAA4B,EAAE,CAS/F;AAED,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,mBAAmB,EAC3B,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACjC,OAAO,CAWT;AAED,OAAO,EAAE,UAAU,EAAE,CAAC"}
@@ -0,0 +1,50 @@
1
+ import { buildHasKey } from "./narrative-keys.js";
2
+ const META_RULES = [
3
+ {
4
+ id: "asset-critical-or-high-vulns",
5
+ key: buildHasKey("critical-or-high-vulnerabilities"),
6
+ label: "Has Critical Or High Vulnerabilities",
7
+ entityName: "assets",
8
+ requireAny: ["has-critical-vulnerabilities", "has-high-vulnerabilities"],
9
+ },
10
+ {
11
+ id: "asset-exploited-critical",
12
+ key: buildHasKey("exploited-critical-vulnerabilities"),
13
+ label: "Has Exploited Critical Vulnerabilities",
14
+ entityName: "assets",
15
+ requireAll: ["has-critical-vulnerabilities", "has-known-exploited-vulnerabilities"],
16
+ },
17
+ {
18
+ id: "asset-exposed-critical",
19
+ key: buildHasKey("exposed-critical-asset"),
20
+ label: "Has Exposed Critical Asset",
21
+ entityName: "assets",
22
+ requireAll: ["has-external-adjacent-subnets", "has-critical-vulnerabilities"],
23
+ },
24
+ ];
25
+ export function discoverMetaNarrativeSignals(entityName) {
26
+ return META_RULES.filter((rule) => rule.entityName === entityName).map((rule) => ({
27
+ key: rule.key,
28
+ label: rule.label,
29
+ kind: "meta",
30
+ sourceRef: rule.id,
31
+ metaRuleId: rule.id,
32
+ minItems: 1,
33
+ }));
34
+ }
35
+ export function evaluateMetaNarrative(ruleId, evaluated) {
36
+ const rule = META_RULES.find((entry) => entry.id === ruleId);
37
+ if (!rule)
38
+ return false;
39
+ if (rule.requireAll?.length) {
40
+ if (!rule.requireAll.every((key) => evaluated[key]))
41
+ return false;
42
+ }
43
+ if (rule.requireAny?.length) {
44
+ if (!rule.requireAny.some((key) => evaluated[key]))
45
+ return false;
46
+ }
47
+ return true;
48
+ }
49
+ export { META_RULES };
50
+ //# sourceMappingURL=meta-narratives.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"meta-narratives.js","sourceRoot":"","sources":["../../src/having-narratives/meta-narratives.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAgBlD,MAAM,UAAU,GAAwB;IACtC;QACE,EAAE,EAAE,8BAA8B;QAClC,GAAG,EAAE,WAAW,CAAC,kCAAkC,CAAC;QACpD,KAAK,EAAE,sCAAsC;QAC7C,UAAU,EAAE,QAAQ;QACpB,UAAU,EAAE,CAAC,8BAA8B,EAAE,0BAA0B,CAAC;KACzE;IACD;QACE,EAAE,EAAE,0BAA0B;QAC9B,GAAG,EAAE,WAAW,CAAC,oCAAoC,CAAC;QACtD,KAAK,EAAE,wCAAwC;QAC/C,UAAU,EAAE,QAAQ;QACpB,UAAU,EAAE,CAAC,8BAA8B,EAAE,qCAAqC,CAAC;KACpF;IACD;QACE,EAAE,EAAE,wBAAwB;QAC5B,GAAG,EAAE,WAAW,CAAC,wBAAwB,CAAC;QAC1C,KAAK,EAAE,4BAA4B;QACnC,UAAU,EAAE,QAAQ;QACpB,UAAU,EAAE,CAAC,+BAA+B,EAAE,8BAA8B,CAAC;KAC9E;CACF,CAAC;AAEF,MAAM,UAAU,4BAA4B,CAAC,UAAkB;IAC7D,OAAO,UAAU,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,KAAK,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QAChF,GAAG,EAAE,IAAI,CAAC,GAAG;QACb,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,IAAI,EAAE,MAAe;QACrB,SAAS,EAAE,IAAI,CAAC,EAAE;QAClB,UAAU,EAAE,IAAI,CAAC,EAAE;QACnB,QAAQ,EAAE,CAAC;KACZ,CAAC,CAAC,CAAC;AACN,CAAC;AAED,MAAM,UAAU,qBAAqB,CACnC,MAA2B,EAC3B,SAAkC;IAElC,MAAM,IAAI,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,MAAM,CAAC,CAAC;IAC7D,IAAI,CAAC,IAAI;QAAE,OAAO,KAAK,CAAC;IAExB,IAAI,IAAI,CAAC,UAAU,EAAE,MAAM,EAAE,CAAC;QAC5B,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;YAAE,OAAO,KAAK,CAAC;IACpE,CAAC;IACD,IAAI,IAAI,CAAC,UAAU,EAAE,MAAM,EAAE,CAAC;QAC5B,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;YAAE,OAAO,KAAK,CAAC;IACnE,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,OAAO,EAAE,UAAU,EAAE,CAAC"}
@@ -0,0 +1,18 @@
1
+ export declare const NARRATIVE_KEY_RE: RegExp;
2
+ export declare const COMMON_PROPERTY_FIELDS: Set<string>;
3
+ /** Boolean adjacency fields — emit at most one tag per field per target. */
4
+ export declare const BOOLEAN_ADJACENCY_FIELDS: Set<string>;
5
+ /** Zone-name fields — separate from adjacency class tags. */
6
+ export declare const ZONE_NAME_FIELDS: Set<string>;
7
+ export declare const IGNORED_COMMON_VALUES: Set<string>;
8
+ export declare function toKebab(value: string): string;
9
+ export declare function pluralizeSlug(value: string): string;
10
+ export declare function singularizeSlug(value: string): string;
11
+ export declare function entitySlug(entityName: string): string;
12
+ export declare function buildHasKey(target: string): string;
13
+ export declare function commonPropertyValueToSlug(value: unknown): string | undefined;
14
+ export declare function buildDerivedCommonPropertyKey(targetSlug: string, field: string, value: unknown): string | undefined;
15
+ export declare function targetSlugFromSignalParts(targetEntity?: string, sourceRef?: string): string | undefined;
16
+ export declare function vulnerabilityGroupTargetSlug(): string;
17
+ export declare function normalizeEntityTargetSlug(entityName: string): string;
18
+ //# sourceMappingURL=narrative-keys.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"narrative-keys.d.ts","sourceRoot":"","sources":["../../src/having-narratives/narrative-keys.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,gBAAgB,QAAuB,CAAC;AAErD,eAAO,MAAM,sBAAsB,aA2BjC,CAAC;AAEH,4EAA4E;AAC5E,eAAO,MAAM,wBAAwB,aAInC,CAAC;AAEH,6DAA6D;AAC7D,eAAO,MAAM,gBAAgB,aAA0B,CAAC;AAExD,eAAO,MAAM,qBAAqB,aAUhC,CAAC;AAEH,wBAAgB,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAQ7C;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAOnD;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAKrD;AAED,wBAAgB,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAErD;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAMlD;AAED,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAO5E;AAED,wBAAgB,6BAA6B,CAC3C,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,OAAO,GACb,MAAM,GAAG,SAAS,CAQpB;AAED,wBAAgB,yBAAyB,CACvC,YAAY,CAAC,EAAE,MAAM,EACrB,SAAS,CAAC,EAAE,MAAM,GACjB,MAAM,GAAG,SAAS,CAMpB;AAED,wBAAgB,4BAA4B,IAAI,MAAM,CAErD;AAED,wBAAgB,yBAAyB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAIpE"}
@@ -0,0 +1,131 @@
1
+ export const NARRATIVE_KEY_RE = /^[a-z][a-z0-9_-]*$/;
2
+ export const COMMON_PROPERTY_FIELDS = new Set([
3
+ "severity",
4
+ "riskLevel",
5
+ "risk",
6
+ "priority",
7
+ "priorityLevel",
8
+ "priorityScore",
9
+ "status",
10
+ "operationalStatus",
11
+ "xdrOperationalStatus",
12
+ "agentStatus",
13
+ "xdrAgentStatus",
14
+ "agentType",
15
+ "knownExploited",
16
+ "isKnownExploited",
17
+ "exploitabilityLevel",
18
+ "zone",
19
+ "zoneClass",
20
+ "vr",
21
+ "outsideExposureClass",
22
+ "internalReachabilityClass",
23
+ "remoteAccessAdjacent",
24
+ "partnerLinkAdjacent",
25
+ "dmzAdjacent",
26
+ "vulnerability_family",
27
+ "vulnerability_type",
28
+ "potentialImpactLevel",
29
+ ]);
30
+ /** Boolean adjacency fields — emit at most one tag per field per target. */
31
+ export const BOOLEAN_ADJACENCY_FIELDS = new Set([
32
+ "remoteAccessAdjacent",
33
+ "partnerLinkAdjacent",
34
+ "dmzAdjacent",
35
+ ]);
36
+ /** Zone-name fields — separate from adjacency class tags. */
37
+ export const ZONE_NAME_FIELDS = new Set(["zone", "vr"]);
38
+ export const IGNORED_COMMON_VALUES = new Set([
39
+ "",
40
+ "unknown",
41
+ "none",
42
+ "n/a",
43
+ "na",
44
+ "null",
45
+ "undefined",
46
+ "not-applicable",
47
+ "not_applicable",
48
+ ]);
49
+ export function toKebab(value) {
50
+ return String(value)
51
+ .trim()
52
+ .replace(/([a-z0-9])([A-Z])/g, "$1-$2")
53
+ .replace(/_/g, "-")
54
+ .replace(/[^a-zA-Z0-9]+/g, "-")
55
+ .replace(/^-+|-+$/g, "")
56
+ .toLowerCase();
57
+ }
58
+ export function pluralizeSlug(value) {
59
+ if (value.endsWith("analysis"))
60
+ return value;
61
+ if (value.endsWith("discovery"))
62
+ return value;
63
+ if (value.endsWith("ies"))
64
+ return value;
65
+ if (value.endsWith("s"))
66
+ return value;
67
+ if (value.endsWith("y"))
68
+ return `${value.slice(0, -1)}ies`;
69
+ return `${value}s`;
70
+ }
71
+ export function singularizeSlug(value) {
72
+ if (value.endsWith("ies"))
73
+ return `${value.slice(0, -3)}y`;
74
+ if (value.endsWith("ses"))
75
+ return value.slice(0, -2);
76
+ if (value.endsWith("s") && value.length > 1)
77
+ return value.slice(0, -1);
78
+ return value;
79
+ }
80
+ export function entitySlug(entityName) {
81
+ return toKebab(entityName);
82
+ }
83
+ export function buildHasKey(target) {
84
+ const key = `has-${toKebab(target)}`;
85
+ if (!NARRATIVE_KEY_RE.test(key)) {
86
+ throw new Error(`Invalid generated narrative key: ${key}`);
87
+ }
88
+ return key;
89
+ }
90
+ export function commonPropertyValueToSlug(value) {
91
+ if (typeof value === "boolean")
92
+ return undefined;
93
+ if (typeof value === "number")
94
+ return undefined;
95
+ if (typeof value !== "string")
96
+ return undefined;
97
+ const slug = toKebab(value);
98
+ if (IGNORED_COMMON_VALUES.has(slug))
99
+ return undefined;
100
+ return slug;
101
+ }
102
+ export function buildDerivedCommonPropertyKey(targetSlug, field, value) {
103
+ if (typeof value === "boolean") {
104
+ if (!value)
105
+ return undefined;
106
+ return buildHasKey(`${toKebab(field)}-${targetSlug}`);
107
+ }
108
+ const valueSlug = commonPropertyValueToSlug(value);
109
+ if (!valueSlug)
110
+ return undefined;
111
+ return buildHasKey(`${valueSlug}-${targetSlug}`);
112
+ }
113
+ export function targetSlugFromSignalParts(targetEntity, sourceRef) {
114
+ if (targetEntity)
115
+ return pluralizeSlug(entitySlug(targetEntity));
116
+ if (!sourceRef)
117
+ return undefined;
118
+ const stripped = sourceRef.replace(/^associated/, "");
119
+ const slug = toKebab(stripped || sourceRef);
120
+ return slug ? pluralizeSlug(slug) : undefined;
121
+ }
122
+ export function vulnerabilityGroupTargetSlug() {
123
+ return "vulnerability-groups";
124
+ }
125
+ export function normalizeEntityTargetSlug(entityName) {
126
+ const slug = entitySlug(entityName);
127
+ if (slug === "vulnerabilities-groups")
128
+ return vulnerabilityGroupTargetSlug();
129
+ return pluralizeSlug(slug);
130
+ }
131
+ //# sourceMappingURL=narrative-keys.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"narrative-keys.js","sourceRoot":"","sources":["../../src/having-narratives/narrative-keys.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { MemorixHavingNarrativeSignal } from "../types/descriptors.js";
2
+ export type RecordPredicateId = "vuln-empty-associated-assets" | "vuln-scan-only-host" | "vuln-critical-orphan" | "vuln-high-orphan";
3
+ export type RecordPredicateDefinition = {
4
+ id: RecordPredicateId;
5
+ key: string;
6
+ label: string;
7
+ entityName: string;
8
+ };
9
+ export declare function discoverRecordPredicateSignals(entityName: string): MemorixHavingNarrativeSignal[];
10
+ export declare function evaluateRecordPredicate(record: Record<string, unknown>, predicateId: RecordPredicateId): boolean;
11
+ //# sourceMappingURL=record-predicates.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"record-predicates.d.ts","sourceRoot":"","sources":["../../src/having-narratives/record-predicates.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,yBAAyB,CAAC;AAG5E,MAAM,MAAM,iBAAiB,GACzB,8BAA8B,GAC9B,qBAAqB,GACrB,sBAAsB,GACtB,kBAAkB,CAAC;AAEvB,MAAM,MAAM,yBAAyB,GAAG;IACtC,EAAE,EAAE,iBAAiB,CAAC;IACtB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AA6BF,wBAAgB,8BAA8B,CAC5C,UAAU,EAAE,MAAM,GACjB,4BAA4B,EAAE,CAWhC;AAED,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,WAAW,EAAE,iBAAiB,GAC7B,OAAO,CAuBT"}
@@ -0,0 +1,58 @@
1
+ const VULNERABILITY_PREDICATES = [
2
+ {
3
+ id: "vuln-empty-associated-assets",
4
+ key: "has-no-inventory-asset",
5
+ label: "Has No Inventory Asset",
6
+ entityName: "vulnerabilities",
7
+ },
8
+ {
9
+ id: "vuln-scan-only-host",
10
+ key: "has-scan-only-host",
11
+ label: "Has Scan-Only Host",
12
+ entityName: "vulnerabilities",
13
+ },
14
+ {
15
+ id: "vuln-critical-orphan",
16
+ key: "has-critical-orphan",
17
+ label: "Has Critical Orphan Finding",
18
+ entityName: "vulnerabilities",
19
+ },
20
+ {
21
+ id: "vuln-high-orphan",
22
+ key: "has-high-orphan",
23
+ label: "Has High Orphan Finding",
24
+ entityName: "vulnerabilities",
25
+ },
26
+ ];
27
+ export function discoverRecordPredicateSignals(entityName) {
28
+ return VULNERABILITY_PREDICATES.filter((entry) => entry.entityName === entityName).map((entry) => ({
29
+ key: entry.key,
30
+ label: entry.label,
31
+ kind: "record-predicate",
32
+ sourceRef: entry.id,
33
+ predicateId: entry.id,
34
+ minItems: 1,
35
+ }));
36
+ }
37
+ export function evaluateRecordPredicate(record, predicateId) {
38
+ const associatedAssets = record.associatedAssets;
39
+ const hasInventoryAsset = Array.isArray(associatedAssets) && associatedAssets.length > 0;
40
+ const assetIp = record.data?.assetIp ?? record.assetIp;
41
+ const hasHost = assetIp !== undefined && assetIp !== null && String(assetIp).trim() !== "";
42
+ const severity = String(record.data?.severity ?? record.severity ?? "")
43
+ .trim()
44
+ .toLowerCase();
45
+ switch (predicateId) {
46
+ case "vuln-empty-associated-assets":
47
+ return hasHost && !hasInventoryAsset;
48
+ case "vuln-scan-only-host":
49
+ return hasHost && !hasInventoryAsset;
50
+ case "vuln-critical-orphan":
51
+ return hasHost && !hasInventoryAsset && severity === "critical";
52
+ case "vuln-high-orphan":
53
+ return hasHost && !hasInventoryAsset && severity === "high";
54
+ default:
55
+ return false;
56
+ }
57
+ }
58
+ //# sourceMappingURL=record-predicates.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"record-predicates.js","sourceRoot":"","sources":["../../src/having-narratives/record-predicates.ts"],"names":[],"mappings":"AAgBA,MAAM,wBAAwB,GAAgC;IAC5D;QACE,EAAE,EAAE,8BAA8B;QAClC,GAAG,EAAE,wBAAwB;QAC7B,KAAK,EAAE,wBAAwB;QAC/B,UAAU,EAAE,iBAAiB;KAC9B;IACD;QACE,EAAE,EAAE,qBAAqB;QACzB,GAAG,EAAE,oBAAoB;QACzB,KAAK,EAAE,oBAAoB;QAC3B,UAAU,EAAE,iBAAiB;KAC9B;IACD;QACE,EAAE,EAAE,sBAAsB;QAC1B,GAAG,EAAE,qBAAqB;QAC1B,KAAK,EAAE,6BAA6B;QACpC,UAAU,EAAE,iBAAiB;KAC9B;IACD;QACE,EAAE,EAAE,kBAAkB;QACtB,GAAG,EAAE,iBAAiB;QACtB,KAAK,EAAE,yBAAyB;QAChC,UAAU,EAAE,iBAAiB;KAC9B;CACF,CAAC;AAEF,MAAM,UAAU,8BAA8B,CAC5C,UAAkB;IAElB,OAAO,wBAAwB,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,UAAU,KAAK,UAAU,CAAC,CAAC,GAAG,CACpF,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QACV,GAAG,EAAE,KAAK,CAAC,GAAG;QACd,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,IAAI,EAAE,kBAA2B;QACjC,SAAS,EAAE,KAAK,CAAC,EAAE;QACnB,WAAW,EAAE,KAAK,CAAC,EAAE;QACrB,QAAQ,EAAE,CAAC;KACZ,CAAC,CACH,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,uBAAuB,CACrC,MAA+B,EAC/B,WAA8B;IAE9B,MAAM,gBAAgB,GAAG,MAAM,CAAC,gBAAgB,CAAC;IACjD,MAAM,iBAAiB,GAAG,KAAK,CAAC,OAAO,CAAC,gBAAgB,CAAC,IAAI,gBAAgB,CAAC,MAAM,GAAG,CAAC,CAAC;IACzF,MAAM,OAAO,GAAI,MAAM,CAAC,IAA4C,EAAE,OAAO,IAAI,MAAM,CAAC,OAAO,CAAC;IAChG,MAAM,OAAO,GAAG,OAAO,KAAK,SAAS,IAAI,OAAO,KAAK,IAAI,IAAI,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC;IAC3F,MAAM,QAAQ,GAAG,MAAM,CACpB,MAAM,CAAC,IAA4C,EAAE,QAAQ,IAAI,MAAM,CAAC,QAAQ,IAAI,EAAE,CACxF;SACE,IAAI,EAAE;SACN,WAAW,EAAE,CAAC;IAEjB,QAAQ,WAAW,EAAE,CAAC;QACpB,KAAK,8BAA8B;YACjC,OAAO,OAAO,IAAI,CAAC,iBAAiB,CAAC;QACvC,KAAK,qBAAqB;YACxB,OAAO,OAAO,IAAI,CAAC,iBAAiB,CAAC;QACvC,KAAK,sBAAsB;YACzB,OAAO,OAAO,IAAI,CAAC,iBAAiB,IAAI,QAAQ,KAAK,UAAU,CAAC;QAClE,KAAK,kBAAkB;YACrB,OAAO,OAAO,IAAI,CAAC,iBAAiB,IAAI,QAAQ,KAAK,MAAM,CAAC;QAC9D;YACE,OAAO,KAAK,CAAC;IACjB,CAAC;AACH,CAAC"}