@x12i/memorix-retrieval 1.29.0 → 1.31.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 (81) hide show
  1. package/catalox-seeds/inputs/entity-descriptors/assets.json +142 -34
  2. package/catalox-seeds/inputs/entity-descriptors/subnets.json +104 -11
  3. package/catalox-seeds/inputs/entity-descriptors/vulnerabilities-groups.json +9 -3
  4. package/catalox-seeds/inputs/entity-descriptors/vulnerabilities.json +121 -6
  5. package/catalox-seeds/inputs/item-descriptors/asset-detail-item.json +0 -1
  6. package/catalox-seeds/inputs/item-descriptors/vulnerability-detail-item.json +1 -0
  7. package/catalox-seeds/inputs/list-descriptors/assets-main-list.json +0 -2
  8. package/catalox-seeds/inputs/list-descriptors/vulnerabilities-main-list.json +2 -0
  9. package/catalox-seeds/memorix-retrieval-descriptors.manifest.json +628 -47
  10. package/dist/analysis/analyze-vulnerability-coverage.d.ts +101 -0
  11. package/dist/analysis/analyze-vulnerability-coverage.d.ts.map +1 -0
  12. package/dist/analysis/analyze-vulnerability-coverage.js +150 -0
  13. package/dist/analysis/analyze-vulnerability-coverage.js.map +1 -0
  14. package/dist/analysis/count-assets-with-vulnerabilities.d.ts +89 -0
  15. package/dist/analysis/count-assets-with-vulnerabilities.d.ts.map +1 -0
  16. package/dist/analysis/count-assets-with-vulnerabilities.js +143 -0
  17. package/dist/analysis/count-assets-with-vulnerabilities.js.map +1 -0
  18. package/dist/analysis/derive-subnet-ip.d.ts +18 -0
  19. package/dist/analysis/derive-subnet-ip.d.ts.map +1 -0
  20. package/dist/analysis/derive-subnet-ip.js +32 -0
  21. package/dist/analysis/derive-subnet-ip.js.map +1 -0
  22. package/dist/descriptors/content-type-labels.d.ts.map +1 -1
  23. package/dist/descriptors/content-type-labels.js +4 -5
  24. package/dist/descriptors/content-type-labels.js.map +1 -1
  25. package/dist/descriptors/descriptor-types.d.ts +48 -0
  26. package/dist/descriptors/descriptor-types.d.ts.map +1 -1
  27. package/dist/explorer/collection-inventory.d.ts.map +1 -1
  28. package/dist/explorer/collection-inventory.js +11 -12
  29. package/dist/explorer/collection-inventory.js.map +1 -1
  30. package/dist/explorer/discover-inventory-object-types.d.ts +23 -0
  31. package/dist/explorer/discover-inventory-object-types.d.ts.map +1 -0
  32. package/dist/explorer/discover-inventory-object-types.js +79 -0
  33. package/dist/explorer/discover-inventory-object-types.js.map +1 -0
  34. package/dist/explorer/reconciled-catalog.d.ts +2 -0
  35. package/dist/explorer/reconciled-catalog.d.ts.map +1 -1
  36. package/dist/explorer/reconciled-catalog.js +121 -20
  37. package/dist/explorer/reconciled-catalog.js.map +1 -1
  38. package/dist/explorer/unified-inventory.d.ts +5 -1
  39. package/dist/explorer/unified-inventory.d.ts.map +1 -1
  40. package/dist/explorer/unified-inventory.js +31 -3
  41. package/dist/explorer/unified-inventory.js.map +1 -1
  42. package/dist/index.d.ts +2 -1
  43. package/dist/index.d.ts.map +1 -1
  44. package/dist/index.js +2 -1
  45. package/dist/index.js.map +1 -1
  46. package/dist/mongo/env.d.ts +1 -0
  47. package/dist/mongo/env.d.ts.map +1 -1
  48. package/dist/mongo/env.js +9 -1
  49. package/dist/mongo/env.js.map +1 -1
  50. package/dist/retrieval/fetch-narratives.d.ts +5 -0
  51. package/dist/retrieval/fetch-narratives.d.ts.map +1 -1
  52. package/dist/retrieval/fetch-narratives.js +99 -9
  53. package/dist/retrieval/fetch-narratives.js.map +1 -1
  54. package/dist/tests/analyze-vulnerability-coverage.test.d.ts +2 -0
  55. package/dist/tests/analyze-vulnerability-coverage.test.d.ts.map +1 -0
  56. package/dist/tests/analyze-vulnerability-coverage.test.js +66 -0
  57. package/dist/tests/analyze-vulnerability-coverage.test.js.map +1 -0
  58. package/dist/tests/count-assets-with-vulnerabilities.test.d.ts +2 -0
  59. package/dist/tests/count-assets-with-vulnerabilities.test.d.ts.map +1 -0
  60. package/dist/tests/count-assets-with-vulnerabilities.test.js +95 -0
  61. package/dist/tests/count-assets-with-vulnerabilities.test.js.map +1 -0
  62. package/dist/tests/derive-subnet-ip.test.d.ts +2 -0
  63. package/dist/tests/derive-subnet-ip.test.d.ts.map +1 -0
  64. package/dist/tests/derive-subnet-ip.test.js +17 -0
  65. package/dist/tests/derive-subnet-ip.test.js.map +1 -0
  66. package/dist/tests/discover-inventory-object-types.test.d.ts +2 -0
  67. package/dist/tests/discover-inventory-object-types.test.d.ts.map +1 -0
  68. package/dist/tests/discover-inventory-object-types.test.js +48 -0
  69. package/dist/tests/discover-inventory-object-types.test.js.map +1 -0
  70. package/dist/tests/entity-graph.test.js +16 -2
  71. package/dist/tests/entity-graph.test.js.map +1 -1
  72. package/dist/tests/env.test.js +1 -1
  73. package/dist/tests/env.test.js.map +1 -1
  74. package/dist/tests/fetch-narratives.test.js +192 -6
  75. package/dist/tests/fetch-narratives.test.js.map +1 -1
  76. package/dist/tests/fixtures.d.ts.map +1 -1
  77. package/dist/tests/fixtures.js +6 -0
  78. package/dist/tests/fixtures.js.map +1 -1
  79. package/dist/tests/reconciled-catalog.test.js +76 -0
  80. package/dist/tests/reconciled-catalog.test.js.map +1 -1
  81. package/package.json +2 -2
@@ -282,6 +282,12 @@
282
282
  "snapshot.capturedAt",
283
283
  "data.lastSeen"
284
284
  ]
285
+ },
286
+ "scoped": {
287
+ "postfix": "scoped",
288
+ "collection": "assets-scoped",
289
+ "dataRoot": "data",
290
+ "isCanonical": false
285
291
  }
286
292
  },
287
293
  "properties": {
@@ -289,7 +295,7 @@
289
295
  "label": "IP Address",
290
296
  "source": {
291
297
  "contentType": "snapshots",
292
- "path": "data.ip_address"
298
+ "path": "data.assetIp"
293
299
  },
294
300
  "humanReadable": true,
295
301
  "sortable": true,
@@ -298,31 +304,31 @@
298
304
  "item": true,
299
305
  "valueType": "string"
300
306
  },
301
- "subnetIp": {
302
- "label": "Subnet IP",
307
+ "subnetCidrs": {
308
+ "label": "Subnet CIDRs",
303
309
  "source": {
304
310
  "contentType": "snapshots",
305
- "path": "data.subnetIp"
311
+ "path": "data.subnetCidrs"
306
312
  },
307
313
  "humanReadable": true,
308
- "sortable": true,
314
+ "sortable": false,
309
315
  "filterable": true,
310
- "list": true,
316
+ "list": false,
311
317
  "item": true,
312
- "valueType": "string"
318
+ "valueType": "array"
313
319
  },
314
- "subnetCidr": {
315
- "label": "Subnet CIDR",
320
+ "subnets": {
321
+ "label": "Resolved Subnets",
316
322
  "source": {
317
323
  "contentType": "snapshots",
318
- "path": "data.subnetCidr"
324
+ "path": "data.subnets"
319
325
  },
320
- "humanReadable": true,
321
- "sortable": true,
322
- "filterable": true,
326
+ "humanReadable": false,
327
+ "sortable": false,
328
+ "filterable": false,
323
329
  "list": false,
324
330
  "item": true,
325
- "valueType": "string"
331
+ "valueType": "array"
326
332
  },
327
333
  "source": {
328
334
  "label": "Source",
@@ -402,19 +408,6 @@
402
408
  "item": true,
403
409
  "valueType": "datetime"
404
410
  },
405
- "hasVulnerabilities": {
406
- "label": "Has Vulnerabilities",
407
- "source": {
408
- "contentType": "snapshots",
409
- "path": "data.hasVulnerabilities"
410
- },
411
- "humanReadable": true,
412
- "sortable": true,
413
- "filterable": true,
414
- "list": true,
415
- "item": true,
416
- "valueType": "boolean"
417
- },
418
411
  "criticalVulnerabilities": {
419
412
  "label": "Critical Vulnerabilities",
420
413
  "source": {
@@ -533,21 +526,168 @@
533
526
  "valueType": "object"
534
527
  }
535
528
  },
529
+ "associatedProperties": [
530
+ {
531
+ "name": "associatedData",
532
+ "contentType": "snapshots",
533
+ "kind": "associated",
534
+ "valueShape": "array<object>",
535
+ "linkedObjectType": "subnets",
536
+ "linkedContentType": "snapshots",
537
+ "description": "Subnet snapshot payloads copied from subnets-snapshots.data when asset data.subnetCidrs matches subnet data.cidr. Each item includes linked recordId.",
538
+ "managed": true,
539
+ "refreshRuleKey": "assets.subnets.snapshots.by-cidr",
540
+ "sourceCollection": "subnets-snapshots"
541
+ },
542
+ {
543
+ "name": "associatedDiscovery",
544
+ "contentType": "snapshots",
545
+ "kind": "associated",
546
+ "valueShape": "array<object>",
547
+ "linkedObjectType": "subnets",
548
+ "linkedContentType": "discovery",
549
+ "description": "Subnet discovery payloads copied from subnets-discovery.data when asset data.subnetCidrs matches subnet data.cidr.",
550
+ "managed": true,
551
+ "refreshRuleKey": "assets.subnets.discovery.by-cidr",
552
+ "sourceCollection": "subnets-discovery"
553
+ },
554
+ {
555
+ "name": "associatedSiblings",
556
+ "contentType": "snapshots",
557
+ "kind": "associated",
558
+ "valueShape": "array<object>",
559
+ "linkedObjectType": "assets",
560
+ "linkedContentType": "snapshots",
561
+ "description": "Root-level self-association: other asset snapshot data payloads sharing a data.subnetCidr value. Each item includes linked recordId. Capped at 99 items.",
562
+ "managed": true,
563
+ "refreshRuleKey": "assets.assets.snapshots.by-cidr",
564
+ "sourceCollection": "assets-snapshots"
565
+ },
566
+ {
567
+ "name": "associatedTopology",
568
+ "contentType": "snapshots",
569
+ "kind": "associated",
570
+ "valueShape": "array<object>",
571
+ "linkedObjectType": "subnets",
572
+ "linkedContentType": "snapshots",
573
+ "description": "Normalized subnet topology objects derived from associatedData and canonical subnet lookup. Each item includes kind, source, cidr, zone, vr, and exposure/reachability fields. subnetId is omitted.",
574
+ "managed": true,
575
+ "refreshRuleKey": "assets.associated-topology.by-associated-data",
576
+ "sourceCollection": "subnets-snapshots"
577
+ },
578
+ {
579
+ "name": "associatedSubnets",
580
+ "contentType": "snapshots",
581
+ "kind": "associated",
582
+ "valueShape": "array<object>",
583
+ "linkedObjectType": "subnets",
584
+ "linkedContentType": "snapshots",
585
+ "description": "Explicit subnet snapshot payloads copied from subnets-snapshots.data when asset data.subnetCidrs matches subnet data.cidr.",
586
+ "managed": true,
587
+ "refreshRuleKey": "assets.subnets.snapshots.explicit.by-cidr",
588
+ "sourceCollection": "subnets-snapshots"
589
+ },
590
+ {
591
+ "name": "associatedSubnetsDiscovery",
592
+ "contentType": "snapshots",
593
+ "kind": "associated",
594
+ "valueShape": "array<object>",
595
+ "linkedObjectType": "subnets",
596
+ "linkedContentType": "discovery",
597
+ "description": "Explicit subnet discovery payloads copied from subnets-discovery when asset data.subnetCidrs matches subnet CIDR.",
598
+ "managed": true,
599
+ "refreshRuleKey": "assets.subnets.discovery.explicit.by-cidr",
600
+ "sourceCollection": "subnets-discovery"
601
+ },
602
+ {
603
+ "name": "associatedSubnetsAnalysis",
604
+ "contentType": "snapshots",
605
+ "kind": "associated",
606
+ "valueShape": "array<object>",
607
+ "linkedObjectType": "subnets",
608
+ "linkedContentType": "analysis",
609
+ "description": "Explicit subnet analysis payloads copied from subnets-analysis when asset data.subnetCidrs matches subnet CIDR.",
610
+ "managed": true,
611
+ "refreshRuleKey": "assets.subnets.analysis.explicit.by-cidr",
612
+ "sourceCollection": "subnets-analysis"
613
+ }
614
+ ],
615
+ "processing": {
616
+ "entityRoutes": [
617
+ {
618
+ "routeKey": "subnets-to-assets",
619
+ "parentObjectType": "subnets",
620
+ "childObjectType": "assets",
621
+ "relationshipName": "assetSubnet",
622
+ "direction": "parentToChild",
623
+ "source": {
624
+ "contentType": "snapshots",
625
+ "path": "data.subnetCidrs"
626
+ },
627
+ "target": {
628
+ "contentType": "snapshots",
629
+ "path": "data.cidr"
630
+ }
631
+ }
632
+ ],
633
+ "resolvers": [
634
+ {
635
+ "processorId": "assets.subnet-cidr",
636
+ "resolverType": "subnet-cidr",
637
+ "kind": "function",
638
+ "config": {
639
+ "mode": "resolve",
640
+ "assetIpPaths": [
641
+ "data.assetIps",
642
+ "data.assetIp"
643
+ ],
644
+ "canonicalCollection": {
645
+ "db": "neo-memorix-entities",
646
+ "collection": "subnets-snapshots"
647
+ }
648
+ }
649
+ }
650
+ ],
651
+ "associatedContent": {
652
+ "rollParentSnapshots": true,
653
+ "excludePostfixes": [
654
+ "raw"
655
+ ]
656
+ }
657
+ },
658
+ "narratives": {
659
+ "has-vulnerabilities": {
660
+ "label": "Has vulnerabilities",
661
+ "kind": "having-signal",
662
+ "sourceRef": "assetVulnerabilities",
663
+ "targetEntity": "vulnerabilities"
664
+ },
665
+ "has-medium-vulnerabilities": {
666
+ "kind": "association-common-property",
667
+ "sourceRef": "assetVulnerabilities",
668
+ "targetEntity": "vulnerabilities",
669
+ "property": "severity",
670
+ "value": "medium"
671
+ }
672
+ },
536
673
  "relations": {
537
674
  "assetSubnet": {
538
675
  "type": "manyToOne",
539
676
  "source": {
540
677
  "contentType": "snapshots",
541
- "path": "data.subnetCidr"
678
+ "path": "data.subnetCidrs"
542
679
  },
543
680
  "target": {
544
681
  "contentType": "snapshots",
545
682
  "path": "data.cidr"
546
683
  },
547
- "defaultMode": "record",
684
+ "defaultMode": "array",
685
+ "defaultArrayProperty": "associatedData",
548
686
  "targetFields": [
549
687
  "cidr",
550
- "subnetIp",
688
+ "networkAddress",
689
+ "prefixLength",
690
+ "mask",
551
691
  "zone",
552
692
  "vr"
553
693
  ],
@@ -557,7 +697,7 @@
557
697
  "type": "oneToMany",
558
698
  "source": {
559
699
  "contentType": "snapshots",
560
- "path": "data.ip_address"
700
+ "path": "data.assetIps"
561
701
  },
562
702
  "target": {
563
703
  "contentType": "snapshots",
@@ -621,14 +761,9 @@
621
761
  "collection": "subnets-snapshots",
622
762
  "isCanonical": true
623
763
  },
624
- "core": {
625
- "postfix": "core",
626
- "collection": "subnets-core",
627
- "isCanonical": false
628
- },
629
- "inferences": {
630
- "postfix": "inferences",
631
- "collection": "subnets-inferences",
764
+ "discovery": {
765
+ "postfix": "discovery",
766
+ "collection": "subnets-discovery",
632
767
  "isCanonical": false
633
768
  },
634
769
  "scoped": {
@@ -642,6 +777,18 @@
642
777
  "isCanonical": false
643
778
  }
644
779
  },
780
+ "rootProperties": {
781
+ "possiblePaths": {
782
+ "label": "Possible Paths",
783
+ "source": {
784
+ "contentType": "snapshots",
785
+ "path": "possiblePaths"
786
+ },
787
+ "valueShape": "object",
788
+ "description": "Subnet-specific topology path facts stored at the snapshot root.",
789
+ "managed": true
790
+ }
791
+ },
645
792
  "properties": {
646
793
  "recordId": {
647
794
  "label": "Record ID",
@@ -669,11 +816,11 @@
669
816
  "item": true,
670
817
  "valueType": "string"
671
818
  },
672
- "subnetIp": {
673
- "label": "Subnet network address",
819
+ "networkAddress": {
820
+ "label": "Network Address",
674
821
  "source": {
675
822
  "contentType": "snapshots",
676
- "path": "data.subnetIp"
823
+ "path": "data.networkAddress"
677
824
  },
678
825
  "humanReadable": true,
679
826
  "sortable": true,
@@ -682,6 +829,32 @@
682
829
  "item": true,
683
830
  "valueType": "string"
684
831
  },
832
+ "prefixLength": {
833
+ "label": "Prefix Length",
834
+ "source": {
835
+ "contentType": "snapshots",
836
+ "path": "data.prefixLength"
837
+ },
838
+ "humanReadable": true,
839
+ "sortable": true,
840
+ "filterable": true,
841
+ "list": false,
842
+ "item": true,
843
+ "valueType": "number"
844
+ },
845
+ "mask": {
846
+ "label": "Subnet Mask",
847
+ "source": {
848
+ "contentType": "snapshots",
849
+ "path": "data.mask"
850
+ },
851
+ "humanReadable": true,
852
+ "sortable": true,
853
+ "filterable": true,
854
+ "list": false,
855
+ "item": true,
856
+ "valueType": "string"
857
+ },
685
858
  "zone": {
686
859
  "label": "Zone",
687
860
  "source": {
@@ -852,6 +1025,68 @@
852
1025
  "valueType": "string"
853
1026
  }
854
1027
  },
1028
+ "associatedProperties": [
1029
+ {
1030
+ "name": "associatedChildren",
1031
+ "contentType": "snapshots",
1032
+ "kind": "associated",
1033
+ "valueShape": "array<object>",
1034
+ "linkedObjectType": "assets",
1035
+ "linkedContentType": "snapshots",
1036
+ "description": "Asset snapshot data payloads whose data.subnetCidrs contains this subnet data.cidr. Each item includes linked recordId. Capped at 99 items.",
1037
+ "managed": true,
1038
+ "refreshRuleKey": "subnets.assets.snapshots.by-cidr",
1039
+ "sourceCollection": "assets-snapshots"
1040
+ }
1041
+ ],
1042
+ "processing": {
1043
+ "entityRoutes": [
1044
+ {
1045
+ "routeKey": "zones-to-subnets",
1046
+ "parentObjectType": "topology-zones",
1047
+ "childObjectType": "subnets",
1048
+ "relationshipName": "subnetZone",
1049
+ "direction": "parentToChild",
1050
+ "source": {
1051
+ "contentType": "snapshots",
1052
+ "path": "data.zone"
1053
+ },
1054
+ "target": {
1055
+ "contentType": "snapshots",
1056
+ "path": "data.name"
1057
+ }
1058
+ }
1059
+ ],
1060
+ "insightStages": [
1061
+ {
1062
+ "processorId": "network.cidr-topology-path-resolver",
1063
+ "kind": "function",
1064
+ "inputKind": "cidr",
1065
+ "outputKind": "cidr-path-facts",
1066
+ "writeToInsights": false,
1067
+ "sources": {
1068
+ "topologyDb": "memorix-knowledge",
1069
+ "topologyCollection": "topology-raw"
1070
+ }
1071
+ },
1072
+ {
1073
+ "processorId": "network.cidr-zone-path-insights",
1074
+ "kind": "function",
1075
+ "inputKind": "cidr-path-facts",
1076
+ "outputKind": "insights",
1077
+ "writeToInsights": true,
1078
+ "sources": {
1079
+ "zonesCollection": "topology-zones-snapshots"
1080
+ }
1081
+ }
1082
+ ],
1083
+ "associatedContent": {
1084
+ "rollParentSnapshots": true,
1085
+ "excludePostfixes": [
1086
+ "raw"
1087
+ ]
1088
+ }
1089
+ },
855
1090
  "relations": {},
856
1091
  "schemaVersion": "memorix.objectTypeDescriptor.v2",
857
1092
  "objectType": "subnets"
@@ -933,6 +1168,19 @@
933
1168
  "item": true,
934
1169
  "valueType": "string"
935
1170
  },
1171
+ "subnetIp": {
1172
+ "label": "Subnet IP",
1173
+ "source": {
1174
+ "contentType": "snapshots",
1175
+ "path": "data.subnetIp"
1176
+ },
1177
+ "humanReadable": true,
1178
+ "sortable": true,
1179
+ "filterable": true,
1180
+ "list": true,
1181
+ "item": true,
1182
+ "valueType": "string"
1183
+ },
936
1184
  "assetType": {
937
1185
  "label": "Asset Type",
938
1186
  "source": {
@@ -1233,6 +1481,160 @@
1233
1481
  "valueType": "object"
1234
1482
  }
1235
1483
  },
1484
+ "associatedProperties": [
1485
+ {
1486
+ "name": "associatedData",
1487
+ "contentType": "snapshots",
1488
+ "kind": "associated",
1489
+ "valueShape": "array<object>",
1490
+ "linkedObjectType": "vulnerabilities-groups",
1491
+ "linkedContentType": "snapshots",
1492
+ "description": "Vulnerability group snapshot payloads copied from vulnerabilities-groups-snapshots.data when data.vulnerabilityName matches group data.name.",
1493
+ "managed": true,
1494
+ "refreshRuleKey": "vulnerabilities.vulnerability-groups.snapshots.by-name",
1495
+ "sourceCollection": "vulnerabilities-groups-snapshots"
1496
+ },
1497
+ {
1498
+ "name": "associatedDiscovery",
1499
+ "contentType": "snapshots",
1500
+ "kind": "associated",
1501
+ "valueShape": "array<object>",
1502
+ "linkedObjectType": "vulnerabilities-groups",
1503
+ "linkedContentType": "discovery",
1504
+ "description": "Vulnerability group discovery payloads copied from vulnerabilities-groups-discovery.data via group name bridge.",
1505
+ "managed": true,
1506
+ "refreshRuleKey": "vulnerabilities.vulnerability-groups.discovery.by-name",
1507
+ "sourceCollection": "vulnerabilities-groups-discovery"
1508
+ },
1509
+ {
1510
+ "name": "associatedAnalysis",
1511
+ "contentType": "snapshots",
1512
+ "kind": "associated",
1513
+ "valueShape": "array<object>",
1514
+ "linkedObjectType": "vulnerabilities-groups",
1515
+ "linkedContentType": "analysis",
1516
+ "description": "Vulnerability group analysis payloads copied from vulnerabilities-groups-analysis.data via group name bridge.",
1517
+ "managed": true,
1518
+ "refreshRuleKey": "vulnerabilities.vulnerability-groups.analysis.by-name",
1519
+ "sourceCollection": "vulnerabilities-groups-analysis"
1520
+ },
1521
+ {
1522
+ "name": "associatedAssets",
1523
+ "contentType": "snapshots",
1524
+ "kind": "associated",
1525
+ "valueShape": "array<object>",
1526
+ "linkedObjectType": "assets",
1527
+ "linkedContentType": "snapshots",
1528
+ "description": "Optional asset snapshot payloads copied from assets-snapshots.data when data.assetIp exactly matches asset data.assetIps, data.assetIp, or legacy data.ip_address. At most one item per vulnerability.",
1529
+ "managed": true,
1530
+ "refreshRuleKey": "vulnerabilities.assets.snapshots.by-assetIp",
1531
+ "sourceCollection": "assets-snapshots"
1532
+ },
1533
+ {
1534
+ "name": "associatedTopology",
1535
+ "contentType": "snapshots",
1536
+ "kind": "associated",
1537
+ "valueShape": "array<object>",
1538
+ "linkedObjectType": "subnets",
1539
+ "linkedContentType": "snapshots",
1540
+ "description": "Normalized subnet topology objects from associatedData roll-down and canonical subnet lookup by data.assetIp. May contain both associatedData and subnetLookup sources for the same CIDR.",
1541
+ "managed": true,
1542
+ "refreshRuleKey": "vulnerabilities.associated-topology.by-associated-data-and-subnet-lookup",
1543
+ "sourceCollection": "subnets-snapshots"
1544
+ },
1545
+ {
1546
+ "name": "associatedVulnerabilityGroup",
1547
+ "contentType": "snapshots",
1548
+ "kind": "associated",
1549
+ "valueShape": "array<object>",
1550
+ "linkedObjectType": "vulnerabilities-groups",
1551
+ "linkedContentType": "snapshots",
1552
+ "description": "Explicit vulnerability group snapshot payloads copied from vulnerabilities-groups-snapshots.data when data.vulnerabilityName matches group data.name.",
1553
+ "managed": true,
1554
+ "refreshRuleKey": "vulnerabilities.vulnerability-groups.snapshots.explicit.by-name",
1555
+ "sourceCollection": "vulnerabilities-groups-snapshots"
1556
+ },
1557
+ {
1558
+ "name": "associatedVulnerabilityGroupDiscovery",
1559
+ "contentType": "snapshots",
1560
+ "kind": "associated",
1561
+ "valueShape": "array<object>",
1562
+ "linkedObjectType": "vulnerabilities-groups",
1563
+ "linkedContentType": "discovery",
1564
+ "description": "Explicit vulnerability group discovery payloads copied from vulnerabilities-groups-discovery via group name bridge.",
1565
+ "managed": true,
1566
+ "refreshRuleKey": "vulnerabilities.vulnerability-groups.discovery.explicit.by-name",
1567
+ "sourceCollection": "vulnerabilities-groups-discovery"
1568
+ },
1569
+ {
1570
+ "name": "associatedVulnerabilityGroupAnalysis",
1571
+ "contentType": "snapshots",
1572
+ "kind": "associated",
1573
+ "valueShape": "array<object>",
1574
+ "linkedObjectType": "vulnerabilities-groups",
1575
+ "linkedContentType": "analysis",
1576
+ "description": "Explicit vulnerability group analysis payloads copied from vulnerabilities-groups-analysis via group name bridge.",
1577
+ "managed": true,
1578
+ "refreshRuleKey": "vulnerabilities.vulnerability-groups.analysis.explicit.by-name",
1579
+ "sourceCollection": "vulnerabilities-groups-analysis"
1580
+ }
1581
+ ],
1582
+ "processing": {
1583
+ "entityRoutes": [
1584
+ {
1585
+ "routeKey": "groups-to-vulnerabilities",
1586
+ "parentObjectType": "vulnerabilities-groups",
1587
+ "childObjectType": "vulnerabilities",
1588
+ "relationshipName": "vulnerabilityGroup",
1589
+ "direction": "parentToChild",
1590
+ "source": {
1591
+ "contentType": "snapshots",
1592
+ "path": "data.vulnerabilityName"
1593
+ },
1594
+ "target": {
1595
+ "contentType": "snapshots",
1596
+ "path": "data.name"
1597
+ },
1598
+ "prerequisites": [
1599
+ {
1600
+ "parentObjectType": "vulnerabilities-groups",
1601
+ "parentContentPostfix": "analysis",
1602
+ "lifecycleProcess": "entity-insights-processed",
1603
+ "onMissing": "defer"
1604
+ }
1605
+ ]
1606
+ },
1607
+ {
1608
+ "routeKey": "assets-to-vulnerabilities",
1609
+ "parentObjectType": "assets",
1610
+ "childObjectType": "vulnerabilities",
1611
+ "relationshipName": "affectedAsset",
1612
+ "direction": "parentToChild",
1613
+ "source": {
1614
+ "contentType": "snapshots",
1615
+ "path": "data.assetIp"
1616
+ },
1617
+ "target": {
1618
+ "contentType": "snapshots",
1619
+ "path": "data.assetIps"
1620
+ }
1621
+ }
1622
+ ],
1623
+ "associatedContent": {
1624
+ "rollParentSnapshots": true,
1625
+ "excludePostfixes": [
1626
+ "raw"
1627
+ ]
1628
+ }
1629
+ },
1630
+ "narratives": {
1631
+ "has-assets": {
1632
+ "label": "Has assets",
1633
+ "kind": "having-signal",
1634
+ "sourceRef": "affectedAsset",
1635
+ "targetEntity": "assets"
1636
+ }
1637
+ },
1236
1638
  "relations": {
1237
1639
  "affectedAsset": {
1238
1640
  "type": "manyToOne",
@@ -1242,9 +1644,10 @@
1242
1644
  },
1243
1645
  "target": {
1244
1646
  "contentType": "snapshots",
1245
- "path": "data.assetIp"
1647
+ "path": "data.assetIps"
1246
1648
  },
1247
- "defaultMode": "extendFields",
1649
+ "defaultMode": "array",
1650
+ "defaultArrayProperty": "associatedAssets",
1248
1651
  "targetFields": [
1249
1652
  "ipAddress",
1250
1653
  "hostName",
@@ -1253,12 +1656,190 @@
1253
1656
  "potentialImpactLevel"
1254
1657
  ],
1255
1658
  "targetObjectType": "assets"
1659
+ },
1660
+ "vulnerabilityGroup": {
1661
+ "type": "manyToOne",
1662
+ "source": {
1663
+ "contentType": "snapshots",
1664
+ "path": "data.vulnerabilityName"
1665
+ },
1666
+ "target": {
1667
+ "contentType": "snapshots",
1668
+ "path": "data.name"
1669
+ },
1670
+ "defaultMode": "array",
1671
+ "defaultArrayProperty": "associatedData",
1672
+ "targetFields": [
1673
+ "name",
1674
+ "severity",
1675
+ "pluginId",
1676
+ "cveId",
1677
+ "vulnerability_family"
1678
+ ],
1679
+ "targetObjectType": "vulnerabilities-groups"
1256
1680
  }
1257
1681
  },
1258
1682
  "schemaVersion": "memorix.objectTypeDescriptor.v2",
1259
1683
  "objectType": "vulnerabilities"
1260
1684
  }
1261
1685
  },
1686
+ {
1687
+ "catalogId": "memorix-object-type-descriptors",
1688
+ "scope": {
1689
+ "domains": [
1690
+ "network",
1691
+ "vulnerabilities"
1692
+ ],
1693
+ "agents": [
1694
+ "neo"
1695
+ ]
1696
+ },
1697
+ "data": {
1698
+ "id": "vulnerabilities-groups",
1699
+ "defaultListDescriptorId": "vulnerabilities-groups-main-list",
1700
+ "defaultItemDescriptorId": "vulnerabilities-group-detail-item",
1701
+ "target": "entity",
1702
+ "collectionPrefix": "vulnerabilities-groups",
1703
+ "identity": {
1704
+ "allowedIdFields": [
1705
+ "recordId",
1706
+ "recordId"
1707
+ ],
1708
+ "requiredExactlyOne": true,
1709
+ "defaultIdField": "recordId"
1710
+ },
1711
+ "defaults": {
1712
+ "canonicalContentType": "snapshots",
1713
+ "dataRoot": "data",
1714
+ "effectiveDatePath": "capturedAt",
1715
+ "fallbackEffectiveDatePaths": [
1716
+ "modifiedAt",
1717
+ "createdAt",
1718
+ "data.enrichment.enrichedAt"
1719
+ ]
1720
+ },
1721
+ "contentTypes": {
1722
+ "snapshots": {
1723
+ "postfix": "snapshots",
1724
+ "collection": "vulnerabilities-groups-snapshots",
1725
+ "dataRoot": "data",
1726
+ "isCanonical": true
1727
+ },
1728
+ "discovery": {
1729
+ "postfix": "discovery",
1730
+ "collection": "vulnerabilities-groups-discovery",
1731
+ "dataRoot": "data",
1732
+ "isCanonical": false
1733
+ },
1734
+ "analysis": {
1735
+ "postfix": "analysis",
1736
+ "collection": "vulnerabilities-groups-analysis",
1737
+ "dataRoot": "data",
1738
+ "isCanonical": false
1739
+ }
1740
+ },
1741
+ "properties": {
1742
+ "name": {
1743
+ "label": "Group Name",
1744
+ "source": {
1745
+ "contentType": "snapshots",
1746
+ "path": "data.name"
1747
+ },
1748
+ "humanReadable": true,
1749
+ "sortable": true,
1750
+ "filterable": true,
1751
+ "list": true,
1752
+ "item": true,
1753
+ "valueType": "string"
1754
+ },
1755
+ "pluginId": {
1756
+ "label": "Plugin ID",
1757
+ "source": {
1758
+ "contentType": "snapshots",
1759
+ "path": "data.pluginId"
1760
+ },
1761
+ "humanReadable": true,
1762
+ "sortable": true,
1763
+ "filterable": true,
1764
+ "list": true,
1765
+ "item": true,
1766
+ "valueType": "number"
1767
+ },
1768
+ "cveId": {
1769
+ "label": "CVE",
1770
+ "source": {
1771
+ "contentType": "snapshots",
1772
+ "path": "data.cveId"
1773
+ },
1774
+ "humanReadable": true,
1775
+ "sortable": true,
1776
+ "filterable": true,
1777
+ "list": true,
1778
+ "item": true,
1779
+ "valueType": "string"
1780
+ },
1781
+ "severity": {
1782
+ "label": "Severity",
1783
+ "source": {
1784
+ "contentType": "snapshots",
1785
+ "path": "data.severity"
1786
+ },
1787
+ "humanReadable": true,
1788
+ "sortable": true,
1789
+ "filterable": true,
1790
+ "list": true,
1791
+ "item": true,
1792
+ "valueType": "string"
1793
+ },
1794
+ "compositeScore": {
1795
+ "label": "Composite Score",
1796
+ "source": {
1797
+ "contentType": "snapshots",
1798
+ "path": "enrichment.compositeScore"
1799
+ },
1800
+ "humanReadable": true,
1801
+ "sortable": true,
1802
+ "filterable": true,
1803
+ "list": true,
1804
+ "item": true,
1805
+ "valueType": "number"
1806
+ }
1807
+ },
1808
+ "associatedProperties": [],
1809
+ "processing": {
1810
+ "associatedContent": {
1811
+ "rollParentSnapshots": false,
1812
+ "excludePostfixes": [
1813
+ "raw"
1814
+ ]
1815
+ }
1816
+ },
1817
+ "relations": {
1818
+ "groupVulnerabilities": {
1819
+ "type": "oneToMany",
1820
+ "source": {
1821
+ "contentType": "snapshots",
1822
+ "path": "data.name"
1823
+ },
1824
+ "target": {
1825
+ "contentType": "snapshots",
1826
+ "path": "data.vulnerabilityName"
1827
+ },
1828
+ "defaultMode": "array",
1829
+ "defaultArrayProperty": "vulnerabilities",
1830
+ "targetFields": [
1831
+ "assetIp",
1832
+ "severity",
1833
+ "cveId",
1834
+ "pluginName"
1835
+ ],
1836
+ "targetObjectType": "vulnerabilities"
1837
+ }
1838
+ },
1839
+ "schemaVersion": "memorix.objectTypeDescriptor.v2",
1840
+ "objectType": "vulnerabilities-groups"
1841
+ }
1842
+ },
1262
1843
  {
1263
1844
  "catalogId": "memorix-object-type-descriptors",
1264
1845
  "scope": {
@@ -1497,7 +2078,6 @@
1497
2078
  "agentType",
1498
2079
  "xdrOperationalStatus",
1499
2080
  "xdrAgentStatus",
1500
- "hasVulnerabilities",
1501
2081
  "criticalVulnerabilities",
1502
2082
  "highVulnerabilities",
1503
2083
  "potentialImpactLevel",
@@ -1514,7 +2094,6 @@
1514
2094
  "agentType",
1515
2095
  "xdrOperationalStatus",
1516
2096
  "xdrAgentStatus",
1517
- "hasVulnerabilities",
1518
2097
  "criticalVulnerabilities",
1519
2098
  "highVulnerabilities",
1520
2099
  "potentialImpactLevel",
@@ -1587,6 +2166,7 @@
1587
2166
  "fields": [
1588
2167
  "vulnerabilityId",
1589
2168
  "assetIp",
2169
+ "subnetIp",
1590
2170
  "pluginName",
1591
2171
  "pluginFamily",
1592
2172
  "severity",
@@ -1603,6 +2183,7 @@
1603
2183
  "allowedSorts": [
1604
2184
  "vulnerabilityId",
1605
2185
  "assetIp",
2186
+ "subnetIp",
1606
2187
  "pluginName",
1607
2188
  "pluginFamily",
1608
2189
  "severity",
@@ -1884,7 +2465,6 @@
1884
2465
  "id": "vulnerabilitySummary",
1885
2466
  "title": "Vulnerability Summary",
1886
2467
  "fields": [
1887
- "hasVulnerabilities",
1888
2468
  "criticalVulnerabilities",
1889
2469
  "highVulnerabilities",
1890
2470
  "mediumVulnerabilities",
@@ -2076,6 +2656,7 @@
2076
2656
  "title": "Affected Asset",
2077
2657
  "fields": [
2078
2658
  "assetIp",
2659
+ "subnetIp",
2079
2660
  "assetType",
2080
2661
  "assetZone",
2081
2662
  "assetHostname",