@cyvest/cyvest-vis 5.1.1 → 5.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -108,7 +108,7 @@ Access icon components for custom UIs:
108
108
  import { getObservableIcon, getInvestigationIcon, GlobeIcon, MailIcon } from "@cyvest/cyvest-vis";
109
109
 
110
110
  // Get icon by observable type
111
- const Icon = getObservableIcon("ipv4-addr"); // Returns GlobeIcon
111
+ const Icon = getObservableIcon("ipv4"); // Returns GlobeIcon
112
112
  <Icon size={24} color="#3b82f6" />
113
113
 
114
114
  // Or use icons directly
package/dist/index.cjs CHANGED
@@ -187,28 +187,6 @@ var MailIcon = ({
187
187
  ]
188
188
  }
189
189
  );
190
- var EnvelopeIcon = ({
191
- size = defaultSize,
192
- color = defaultColor,
193
- className
194
- }) => /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
195
- "svg",
196
- {
197
- width: size,
198
- height: size,
199
- viewBox: "0 0 24 24",
200
- fill: "none",
201
- stroke: color,
202
- strokeWidth: "2",
203
- strokeLinecap: "round",
204
- strokeLinejoin: "round",
205
- className,
206
- children: [
207
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { d: "M22 12h-6l-2 3h-4l-2-3H2" }),
208
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { d: "M5.45 5.11 2 12v6a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2v-6l-3.45-6.89A2 2 0 0 0 16.76 4H7.24a2 2 0 0 0-1.79 1.11z" })
209
- ]
210
- }
211
- );
212
190
  var FileIcon = ({
213
191
  size = defaultSize,
214
192
  color = defaultColor,
@@ -255,243 +233,6 @@ var HashIcon = ({
255
233
  ]
256
234
  }
257
235
  );
258
- var UserIcon = ({
259
- size = defaultSize,
260
- color = defaultColor,
261
- className
262
- }) => /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
263
- "svg",
264
- {
265
- width: size,
266
- height: size,
267
- viewBox: "0 0 24 24",
268
- fill: "none",
269
- stroke: color,
270
- strokeWidth: "2",
271
- strokeLinecap: "round",
272
- strokeLinejoin: "round",
273
- className,
274
- children: [
275
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("circle", { cx: "12", cy: "8", r: "5" }),
276
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { d: "M20 21a8 8 0 1 0-16 0" })
277
- ]
278
- }
279
- );
280
- var IdCardIcon = ({
281
- size = defaultSize,
282
- color = defaultColor,
283
- className
284
- }) => /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
285
- "svg",
286
- {
287
- width: size,
288
- height: size,
289
- viewBox: "0 0 24 24",
290
- fill: "none",
291
- stroke: color,
292
- strokeWidth: "2",
293
- strokeLinecap: "round",
294
- strokeLinejoin: "round",
295
- className,
296
- children: [
297
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("rect", { x: "2", y: "5", width: "20", height: "14", rx: "2" }),
298
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("circle", { cx: "8", cy: "12", r: "2" }),
299
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { d: "M14 10h4" }),
300
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { d: "M14 14h4" })
301
- ]
302
- }
303
- );
304
- var GearIcon = ({
305
- size = defaultSize,
306
- color = defaultColor,
307
- className
308
- }) => /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
309
- "svg",
310
- {
311
- width: size,
312
- height: size,
313
- viewBox: "0 0 24 24",
314
- fill: "none",
315
- stroke: color,
316
- strokeWidth: "2",
317
- strokeLinecap: "round",
318
- strokeLinejoin: "round",
319
- className,
320
- children: [
321
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("circle", { cx: "12", cy: "12", r: "3" }),
322
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { d: "M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 0 1 0 2.83 2 2 0 0 1-2.83 0l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 0 1-2 2 2 2 0 0 1-2-2v-.09A1.65 1.65 0 0 0 9 19.4a1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 0 1-2.83 0 2 2 0 0 1 0-2.83l.06-.06a1.65 1.65 0 0 0 .33-1.82 1.65 1.65 0 0 0-1.51-1H3a2 2 0 0 1-2-2 2 2 0 0 1 2-2h.09A1.65 1.65 0 0 0 4.6 9a1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 0 1 0-2.83 2 2 0 0 1 2.83 0l.06.06a1.65 1.65 0 0 0 1.82.33H9a1.65 1.65 0 0 0 1-1.51V3a2 2 0 0 1 2-2 2 2 0 0 1 2 2v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 0 1 2.83 0 2 2 0 0 1 0 2.83l-.06.06a1.65 1.65 0 0 0-.33 1.82V9a1.65 1.65 0 0 0 1.51 1H21a2 2 0 0 1 2 2 2 2 0 0 1-2 2h-.09a1.65 1.65 0 0 0-1.51 1z" })
323
- ]
324
- }
325
- );
326
- var AppIcon = ({
327
- size = defaultSize,
328
- color = defaultColor,
329
- className
330
- }) => /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
331
- "svg",
332
- {
333
- width: size,
334
- height: size,
335
- viewBox: "0 0 24 24",
336
- fill: "none",
337
- stroke: color,
338
- strokeWidth: "2",
339
- strokeLinecap: "round",
340
- strokeLinejoin: "round",
341
- className,
342
- children: [
343
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("rect", { x: "3", y: "3", width: "18", height: "18", rx: "2" }),
344
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { d: "M9 3v18" }),
345
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { d: "M3 9h18" })
346
- ]
347
- }
348
- );
349
- var RegistryIcon = ({
350
- size = defaultSize,
351
- color = defaultColor,
352
- className
353
- }) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
354
- "svg",
355
- {
356
- width: size,
357
- height: size,
358
- viewBox: "0 0 24 24",
359
- fill: "none",
360
- stroke: color,
361
- strokeWidth: "2",
362
- strokeLinecap: "round",
363
- strokeLinejoin: "round",
364
- className,
365
- children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { d: "m21 2-2 2m-7.61 7.61a5.5 5.5 0 1 1-7.778 7.778 5.5 5.5 0 0 1 7.777-7.777zm0 0L15.5 7.5m0 0 3 3L22 7l-3-3m-3.5 3.5L19 4" })
366
- }
367
- );
368
- var ThreatActorIcon = ({
369
- size = defaultSize,
370
- color = defaultColor,
371
- className
372
- }) => /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
373
- "svg",
374
- {
375
- width: size,
376
- height: size,
377
- viewBox: "0 0 24 24",
378
- fill: "none",
379
- stroke: color,
380
- strokeWidth: "2",
381
- strokeLinecap: "round",
382
- strokeLinejoin: "round",
383
- className,
384
- children: [
385
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("circle", { cx: "12", cy: "10", r: "7" }),
386
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("circle", { cx: "9", cy: "9", r: "1.5", fill: color }),
387
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("circle", { cx: "15", cy: "9", r: "1.5", fill: color }),
388
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { d: "M9 17v-2" }),
389
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { d: "M12 17v-2" }),
390
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { d: "M15 17v-2" })
391
- ]
392
- }
393
- );
394
- var BugIcon = ({
395
- size = defaultSize,
396
- color = defaultColor,
397
- className
398
- }) => /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
399
- "svg",
400
- {
401
- width: size,
402
- height: size,
403
- viewBox: "0 0 24 24",
404
- fill: "none",
405
- stroke: color,
406
- strokeWidth: "2",
407
- strokeLinecap: "round",
408
- strokeLinejoin: "round",
409
- className,
410
- children: [
411
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { d: "m8 2 1.88 1.88" }),
412
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { d: "M14.12 3.88 16 2" }),
413
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { d: "M9 7.13v-1a3.003 3.003 0 1 1 6 0v1" }),
414
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { d: "M12 20c-3.3 0-6-2.7-6-6v-3a4 4 0 0 1 4-4h4a4 4 0 0 1 4 4v3c0 3.3-2.7 6-6 6" }),
415
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { d: "M12 20v-9" }),
416
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { d: "M6.53 9C4.6 8.8 3 7.1 3 5" }),
417
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { d: "M6 13H2" }),
418
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { d: "M3 21c0-2.1 1.7-3.9 3.8-4" }),
419
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { d: "M20.97 5c0 2.1-1.6 3.8-3.5 4" }),
420
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { d: "M22 13h-4" }),
421
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { d: "M17.2 17c2.1.1 3.8 1.9 3.8 4" })
422
- ]
423
- }
424
- );
425
- var SwordIcon = ({
426
- size = defaultSize,
427
- color = defaultColor,
428
- className
429
- }) => /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
430
- "svg",
431
- {
432
- width: size,
433
- height: size,
434
- viewBox: "0 0 24 24",
435
- fill: "none",
436
- stroke: color,
437
- strokeWidth: "2",
438
- strokeLinecap: "round",
439
- strokeLinejoin: "round",
440
- className,
441
- children: [
442
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("polyline", { points: "14.5,17.5 3,6 3,3 6,3 17.5,14.5" }),
443
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("line", { x1: "13", y1: "19", x2: "19", y2: "13" }),
444
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("line", { x1: "16", y1: "16", x2: "20", y2: "20" }),
445
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("line", { x1: "19", y1: "21", x2: "21", y2: "19" })
446
- ]
447
- }
448
- );
449
- var TargetIcon = ({
450
- size = defaultSize,
451
- color = defaultColor,
452
- className
453
- }) => /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
454
- "svg",
455
- {
456
- width: size,
457
- height: size,
458
- viewBox: "0 0 24 24",
459
- fill: "none",
460
- stroke: color,
461
- strokeWidth: "2",
462
- strokeLinecap: "round",
463
- strokeLinejoin: "round",
464
- className,
465
- children: [
466
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("circle", { cx: "12", cy: "12", r: "10" }),
467
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("circle", { cx: "12", cy: "12", r: "6" }),
468
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("circle", { cx: "12", cy: "12", r: "2" })
469
- ]
470
- }
471
- );
472
- var AlertIcon = ({
473
- size = defaultSize,
474
- color = defaultColor,
475
- className
476
- }) => /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
477
- "svg",
478
- {
479
- width: size,
480
- height: size,
481
- viewBox: "0 0 24 24",
482
- fill: "none",
483
- stroke: color,
484
- strokeWidth: "2",
485
- strokeLinecap: "round",
486
- strokeLinejoin: "round",
487
- className,
488
- children: [
489
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { d: "M10.29 3.86 1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z" }),
490
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("line", { x1: "12", y1: "9", x2: "12", y2: "13" }),
491
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("line", { x1: "12", y1: "17", x2: "12.01", y2: "17" })
492
- ]
493
- }
494
- );
495
236
  var FlaskIcon = ({
496
237
  size = defaultSize,
497
238
  color = defaultColor,
@@ -515,76 +256,6 @@ var FlaskIcon = ({
515
256
  ]
516
257
  }
517
258
  );
518
- var CertificateIcon = ({
519
- size = defaultSize,
520
- color = defaultColor,
521
- className
522
- }) => /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
523
- "svg",
524
- {
525
- width: size,
526
- height: size,
527
- viewBox: "0 0 24 24",
528
- fill: "none",
529
- stroke: color,
530
- strokeWidth: "2",
531
- strokeLinecap: "round",
532
- strokeLinejoin: "round",
533
- className,
534
- children: [
535
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { d: "M12 15a3 3 0 1 0 0-6 3 3 0 0 0 0 6Z" }),
536
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { d: "M2 6a2 2 0 0 1 2-2h16a2 2 0 0 1 2 2v12a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V6Z" }),
537
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { d: "m9.5 15.5-3 3v3l3.5-1.5 3.5 1.5v-3l-3-3" })
538
- ]
539
- }
540
- );
541
- var WifiIcon = ({
542
- size = defaultSize,
543
- color = defaultColor,
544
- className
545
- }) => /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
546
- "svg",
547
- {
548
- width: size,
549
- height: size,
550
- viewBox: "0 0 24 24",
551
- fill: "none",
552
- stroke: color,
553
- strokeWidth: "2",
554
- strokeLinecap: "round",
555
- strokeLinejoin: "round",
556
- className,
557
- children: [
558
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { d: "M5 12.55a11 11 0 0 1 14.08 0" }),
559
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { d: "M1.42 9a16 16 0 0 1 21.16 0" }),
560
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { d: "M8.53 16.11a6 6 0 0 1 6.95 0" }),
561
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("line", { x1: "12", y1: "20", x2: "12.01", y2: "20" })
562
- ]
563
- }
564
- );
565
- var WorldIcon = ({
566
- size = defaultSize,
567
- color = defaultColor,
568
- className
569
- }) => /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
570
- "svg",
571
- {
572
- width: size,
573
- height: size,
574
- viewBox: "0 0 24 24",
575
- fill: "none",
576
- stroke: color,
577
- strokeWidth: "2",
578
- strokeLinecap: "round",
579
- strokeLinejoin: "round",
580
- className,
581
- children: [
582
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("circle", { cx: "12", cy: "12", r: "10" }),
583
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { d: "M12 2a14.5 14.5 0 0 0 0 20 14.5 14.5 0 0 0 0-20" }),
584
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { d: "M2 12h20" })
585
- ]
586
- }
587
- );
588
259
  var QuestionIcon = ({
589
260
  size = defaultSize,
590
261
  color = defaultColor,
@@ -676,40 +347,18 @@ var CrosshairIcon = ({
676
347
  }
677
348
  );
678
349
  var OBSERVABLE_ICON_MAP = {
679
- // Network
680
- "ipv4-addr": GlobeIcon,
681
- "ipv6-addr": GlobeIcon,
682
- "domain-name": DomainIcon,
350
+ // Network (canonical Python enum values)
351
+ ipv4: GlobeIcon,
352
+ ipv6: GlobeIcon,
353
+ domain: DomainIcon,
683
354
  url: LinkIcon,
684
- "autonomous-system": WorldIcon,
685
- "mac-addr": WifiIcon,
355
+ // Hash
356
+ hash: HashIcon,
686
357
  // Email
687
- "email-addr": MailIcon,
688
- "email-message": EnvelopeIcon,
358
+ email: MailIcon,
689
359
  // File
690
360
  file: FileIcon,
691
- "file-hash": HashIcon,
692
- "file:hash:md5": HashIcon,
693
- "file:hash:sha1": HashIcon,
694
- "file:hash:sha256": HashIcon,
695
- // User/Identity
696
- user: UserIcon,
697
- "user-account": UserIcon,
698
- identity: IdCardIcon,
699
- // Process/System
700
- process: GearIcon,
701
- software: AppIcon,
702
- "windows-registry-key": RegistryIcon,
703
- // Threat Intelligence
704
- "threat-actor": ThreatActorIcon,
705
- malware: BugIcon,
706
- "attack-pattern": SwordIcon,
707
- campaign: TargetIcon,
708
- indicator: AlertIcon,
709
- // Artifacts
710
361
  artifact: FlaskIcon,
711
- certificate: CertificateIcon,
712
- "x509-certificate": CertificateIcon,
713
362
  // Default
714
363
  unknown: QuestionIcon
715
364
  };
package/dist/index.d.cts CHANGED
@@ -15,7 +15,7 @@ interface ObservableNodeData extends Record<string, unknown> {
15
15
  label: string;
16
16
  /** Full observable value */
17
17
  fullValue: string;
18
- /** Observable type (e.g., "domain-name", "ipv4-addr") */
18
+ /** Observable type (e.g., "domain", "ipv4") */
19
19
  observableType: string;
20
20
  /** Security level */
21
21
  level: Level;
package/dist/index.d.ts CHANGED
@@ -15,7 +15,7 @@ interface ObservableNodeData extends Record<string, unknown> {
15
15
  label: string;
16
16
  /** Full observable value */
17
17
  fullValue: string;
18
- /** Observable type (e.g., "domain-name", "ipv4-addr") */
18
+ /** Observable type (e.g., "domain", "ipv4") */
19
19
  observableType: string;
20
20
  /** Security level */
21
21
  level: Level;
package/dist/index.js CHANGED
@@ -155,28 +155,6 @@ var MailIcon = ({
155
155
  ]
156
156
  }
157
157
  );
158
- var EnvelopeIcon = ({
159
- size = defaultSize,
160
- color = defaultColor,
161
- className
162
- }) => /* @__PURE__ */ jsxs(
163
- "svg",
164
- {
165
- width: size,
166
- height: size,
167
- viewBox: "0 0 24 24",
168
- fill: "none",
169
- stroke: color,
170
- strokeWidth: "2",
171
- strokeLinecap: "round",
172
- strokeLinejoin: "round",
173
- className,
174
- children: [
175
- /* @__PURE__ */ jsx("path", { d: "M22 12h-6l-2 3h-4l-2-3H2" }),
176
- /* @__PURE__ */ jsx("path", { d: "M5.45 5.11 2 12v6a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2v-6l-3.45-6.89A2 2 0 0 0 16.76 4H7.24a2 2 0 0 0-1.79 1.11z" })
177
- ]
178
- }
179
- );
180
158
  var FileIcon = ({
181
159
  size = defaultSize,
182
160
  color = defaultColor,
@@ -223,243 +201,6 @@ var HashIcon = ({
223
201
  ]
224
202
  }
225
203
  );
226
- var UserIcon = ({
227
- size = defaultSize,
228
- color = defaultColor,
229
- className
230
- }) => /* @__PURE__ */ jsxs(
231
- "svg",
232
- {
233
- width: size,
234
- height: size,
235
- viewBox: "0 0 24 24",
236
- fill: "none",
237
- stroke: color,
238
- strokeWidth: "2",
239
- strokeLinecap: "round",
240
- strokeLinejoin: "round",
241
- className,
242
- children: [
243
- /* @__PURE__ */ jsx("circle", { cx: "12", cy: "8", r: "5" }),
244
- /* @__PURE__ */ jsx("path", { d: "M20 21a8 8 0 1 0-16 0" })
245
- ]
246
- }
247
- );
248
- var IdCardIcon = ({
249
- size = defaultSize,
250
- color = defaultColor,
251
- className
252
- }) => /* @__PURE__ */ jsxs(
253
- "svg",
254
- {
255
- width: size,
256
- height: size,
257
- viewBox: "0 0 24 24",
258
- fill: "none",
259
- stroke: color,
260
- strokeWidth: "2",
261
- strokeLinecap: "round",
262
- strokeLinejoin: "round",
263
- className,
264
- children: [
265
- /* @__PURE__ */ jsx("rect", { x: "2", y: "5", width: "20", height: "14", rx: "2" }),
266
- /* @__PURE__ */ jsx("circle", { cx: "8", cy: "12", r: "2" }),
267
- /* @__PURE__ */ jsx("path", { d: "M14 10h4" }),
268
- /* @__PURE__ */ jsx("path", { d: "M14 14h4" })
269
- ]
270
- }
271
- );
272
- var GearIcon = ({
273
- size = defaultSize,
274
- color = defaultColor,
275
- className
276
- }) => /* @__PURE__ */ jsxs(
277
- "svg",
278
- {
279
- width: size,
280
- height: size,
281
- viewBox: "0 0 24 24",
282
- fill: "none",
283
- stroke: color,
284
- strokeWidth: "2",
285
- strokeLinecap: "round",
286
- strokeLinejoin: "round",
287
- className,
288
- children: [
289
- /* @__PURE__ */ jsx("circle", { cx: "12", cy: "12", r: "3" }),
290
- /* @__PURE__ */ jsx("path", { d: "M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 0 1 0 2.83 2 2 0 0 1-2.83 0l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 0 1-2 2 2 2 0 0 1-2-2v-.09A1.65 1.65 0 0 0 9 19.4a1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 0 1-2.83 0 2 2 0 0 1 0-2.83l.06-.06a1.65 1.65 0 0 0 .33-1.82 1.65 1.65 0 0 0-1.51-1H3a2 2 0 0 1-2-2 2 2 0 0 1 2-2h.09A1.65 1.65 0 0 0 4.6 9a1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 0 1 0-2.83 2 2 0 0 1 2.83 0l.06.06a1.65 1.65 0 0 0 1.82.33H9a1.65 1.65 0 0 0 1-1.51V3a2 2 0 0 1 2-2 2 2 0 0 1 2 2v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 0 1 2.83 0 2 2 0 0 1 0 2.83l-.06.06a1.65 1.65 0 0 0-.33 1.82V9a1.65 1.65 0 0 0 1.51 1H21a2 2 0 0 1 2 2 2 2 0 0 1-2 2h-.09a1.65 1.65 0 0 0-1.51 1z" })
291
- ]
292
- }
293
- );
294
- var AppIcon = ({
295
- size = defaultSize,
296
- color = defaultColor,
297
- className
298
- }) => /* @__PURE__ */ jsxs(
299
- "svg",
300
- {
301
- width: size,
302
- height: size,
303
- viewBox: "0 0 24 24",
304
- fill: "none",
305
- stroke: color,
306
- strokeWidth: "2",
307
- strokeLinecap: "round",
308
- strokeLinejoin: "round",
309
- className,
310
- children: [
311
- /* @__PURE__ */ jsx("rect", { x: "3", y: "3", width: "18", height: "18", rx: "2" }),
312
- /* @__PURE__ */ jsx("path", { d: "M9 3v18" }),
313
- /* @__PURE__ */ jsx("path", { d: "M3 9h18" })
314
- ]
315
- }
316
- );
317
- var RegistryIcon = ({
318
- size = defaultSize,
319
- color = defaultColor,
320
- className
321
- }) => /* @__PURE__ */ jsx(
322
- "svg",
323
- {
324
- width: size,
325
- height: size,
326
- viewBox: "0 0 24 24",
327
- fill: "none",
328
- stroke: color,
329
- strokeWidth: "2",
330
- strokeLinecap: "round",
331
- strokeLinejoin: "round",
332
- className,
333
- children: /* @__PURE__ */ jsx("path", { d: "m21 2-2 2m-7.61 7.61a5.5 5.5 0 1 1-7.778 7.778 5.5 5.5 0 0 1 7.777-7.777zm0 0L15.5 7.5m0 0 3 3L22 7l-3-3m-3.5 3.5L19 4" })
334
- }
335
- );
336
- var ThreatActorIcon = ({
337
- size = defaultSize,
338
- color = defaultColor,
339
- className
340
- }) => /* @__PURE__ */ jsxs(
341
- "svg",
342
- {
343
- width: size,
344
- height: size,
345
- viewBox: "0 0 24 24",
346
- fill: "none",
347
- stroke: color,
348
- strokeWidth: "2",
349
- strokeLinecap: "round",
350
- strokeLinejoin: "round",
351
- className,
352
- children: [
353
- /* @__PURE__ */ jsx("circle", { cx: "12", cy: "10", r: "7" }),
354
- /* @__PURE__ */ jsx("circle", { cx: "9", cy: "9", r: "1.5", fill: color }),
355
- /* @__PURE__ */ jsx("circle", { cx: "15", cy: "9", r: "1.5", fill: color }),
356
- /* @__PURE__ */ jsx("path", { d: "M9 17v-2" }),
357
- /* @__PURE__ */ jsx("path", { d: "M12 17v-2" }),
358
- /* @__PURE__ */ jsx("path", { d: "M15 17v-2" })
359
- ]
360
- }
361
- );
362
- var BugIcon = ({
363
- size = defaultSize,
364
- color = defaultColor,
365
- className
366
- }) => /* @__PURE__ */ jsxs(
367
- "svg",
368
- {
369
- width: size,
370
- height: size,
371
- viewBox: "0 0 24 24",
372
- fill: "none",
373
- stroke: color,
374
- strokeWidth: "2",
375
- strokeLinecap: "round",
376
- strokeLinejoin: "round",
377
- className,
378
- children: [
379
- /* @__PURE__ */ jsx("path", { d: "m8 2 1.88 1.88" }),
380
- /* @__PURE__ */ jsx("path", { d: "M14.12 3.88 16 2" }),
381
- /* @__PURE__ */ jsx("path", { d: "M9 7.13v-1a3.003 3.003 0 1 1 6 0v1" }),
382
- /* @__PURE__ */ jsx("path", { d: "M12 20c-3.3 0-6-2.7-6-6v-3a4 4 0 0 1 4-4h4a4 4 0 0 1 4 4v3c0 3.3-2.7 6-6 6" }),
383
- /* @__PURE__ */ jsx("path", { d: "M12 20v-9" }),
384
- /* @__PURE__ */ jsx("path", { d: "M6.53 9C4.6 8.8 3 7.1 3 5" }),
385
- /* @__PURE__ */ jsx("path", { d: "M6 13H2" }),
386
- /* @__PURE__ */ jsx("path", { d: "M3 21c0-2.1 1.7-3.9 3.8-4" }),
387
- /* @__PURE__ */ jsx("path", { d: "M20.97 5c0 2.1-1.6 3.8-3.5 4" }),
388
- /* @__PURE__ */ jsx("path", { d: "M22 13h-4" }),
389
- /* @__PURE__ */ jsx("path", { d: "M17.2 17c2.1.1 3.8 1.9 3.8 4" })
390
- ]
391
- }
392
- );
393
- var SwordIcon = ({
394
- size = defaultSize,
395
- color = defaultColor,
396
- className
397
- }) => /* @__PURE__ */ jsxs(
398
- "svg",
399
- {
400
- width: size,
401
- height: size,
402
- viewBox: "0 0 24 24",
403
- fill: "none",
404
- stroke: color,
405
- strokeWidth: "2",
406
- strokeLinecap: "round",
407
- strokeLinejoin: "round",
408
- className,
409
- children: [
410
- /* @__PURE__ */ jsx("polyline", { points: "14.5,17.5 3,6 3,3 6,3 17.5,14.5" }),
411
- /* @__PURE__ */ jsx("line", { x1: "13", y1: "19", x2: "19", y2: "13" }),
412
- /* @__PURE__ */ jsx("line", { x1: "16", y1: "16", x2: "20", y2: "20" }),
413
- /* @__PURE__ */ jsx("line", { x1: "19", y1: "21", x2: "21", y2: "19" })
414
- ]
415
- }
416
- );
417
- var TargetIcon = ({
418
- size = defaultSize,
419
- color = defaultColor,
420
- className
421
- }) => /* @__PURE__ */ jsxs(
422
- "svg",
423
- {
424
- width: size,
425
- height: size,
426
- viewBox: "0 0 24 24",
427
- fill: "none",
428
- stroke: color,
429
- strokeWidth: "2",
430
- strokeLinecap: "round",
431
- strokeLinejoin: "round",
432
- className,
433
- children: [
434
- /* @__PURE__ */ jsx("circle", { cx: "12", cy: "12", r: "10" }),
435
- /* @__PURE__ */ jsx("circle", { cx: "12", cy: "12", r: "6" }),
436
- /* @__PURE__ */ jsx("circle", { cx: "12", cy: "12", r: "2" })
437
- ]
438
- }
439
- );
440
- var AlertIcon = ({
441
- size = defaultSize,
442
- color = defaultColor,
443
- className
444
- }) => /* @__PURE__ */ jsxs(
445
- "svg",
446
- {
447
- width: size,
448
- height: size,
449
- viewBox: "0 0 24 24",
450
- fill: "none",
451
- stroke: color,
452
- strokeWidth: "2",
453
- strokeLinecap: "round",
454
- strokeLinejoin: "round",
455
- className,
456
- children: [
457
- /* @__PURE__ */ jsx("path", { d: "M10.29 3.86 1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z" }),
458
- /* @__PURE__ */ jsx("line", { x1: "12", y1: "9", x2: "12", y2: "13" }),
459
- /* @__PURE__ */ jsx("line", { x1: "12", y1: "17", x2: "12.01", y2: "17" })
460
- ]
461
- }
462
- );
463
204
  var FlaskIcon = ({
464
205
  size = defaultSize,
465
206
  color = defaultColor,
@@ -483,76 +224,6 @@ var FlaskIcon = ({
483
224
  ]
484
225
  }
485
226
  );
486
- var CertificateIcon = ({
487
- size = defaultSize,
488
- color = defaultColor,
489
- className
490
- }) => /* @__PURE__ */ jsxs(
491
- "svg",
492
- {
493
- width: size,
494
- height: size,
495
- viewBox: "0 0 24 24",
496
- fill: "none",
497
- stroke: color,
498
- strokeWidth: "2",
499
- strokeLinecap: "round",
500
- strokeLinejoin: "round",
501
- className,
502
- children: [
503
- /* @__PURE__ */ jsx("path", { d: "M12 15a3 3 0 1 0 0-6 3 3 0 0 0 0 6Z" }),
504
- /* @__PURE__ */ jsx("path", { d: "M2 6a2 2 0 0 1 2-2h16a2 2 0 0 1 2 2v12a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V6Z" }),
505
- /* @__PURE__ */ jsx("path", { d: "m9.5 15.5-3 3v3l3.5-1.5 3.5 1.5v-3l-3-3" })
506
- ]
507
- }
508
- );
509
- var WifiIcon = ({
510
- size = defaultSize,
511
- color = defaultColor,
512
- className
513
- }) => /* @__PURE__ */ jsxs(
514
- "svg",
515
- {
516
- width: size,
517
- height: size,
518
- viewBox: "0 0 24 24",
519
- fill: "none",
520
- stroke: color,
521
- strokeWidth: "2",
522
- strokeLinecap: "round",
523
- strokeLinejoin: "round",
524
- className,
525
- children: [
526
- /* @__PURE__ */ jsx("path", { d: "M5 12.55a11 11 0 0 1 14.08 0" }),
527
- /* @__PURE__ */ jsx("path", { d: "M1.42 9a16 16 0 0 1 21.16 0" }),
528
- /* @__PURE__ */ jsx("path", { d: "M8.53 16.11a6 6 0 0 1 6.95 0" }),
529
- /* @__PURE__ */ jsx("line", { x1: "12", y1: "20", x2: "12.01", y2: "20" })
530
- ]
531
- }
532
- );
533
- var WorldIcon = ({
534
- size = defaultSize,
535
- color = defaultColor,
536
- className
537
- }) => /* @__PURE__ */ jsxs(
538
- "svg",
539
- {
540
- width: size,
541
- height: size,
542
- viewBox: "0 0 24 24",
543
- fill: "none",
544
- stroke: color,
545
- strokeWidth: "2",
546
- strokeLinecap: "round",
547
- strokeLinejoin: "round",
548
- className,
549
- children: [
550
- /* @__PURE__ */ jsx("circle", { cx: "12", cy: "12", r: "10" }),
551
- /* @__PURE__ */ jsx("path", { d: "M12 2a14.5 14.5 0 0 0 0 20 14.5 14.5 0 0 0 0-20" }),
552
- /* @__PURE__ */ jsx("path", { d: "M2 12h20" })
553
- ]
554
- }
555
- );
556
227
  var QuestionIcon = ({
557
228
  size = defaultSize,
558
229
  color = defaultColor,
@@ -644,40 +315,18 @@ var CrosshairIcon = ({
644
315
  }
645
316
  );
646
317
  var OBSERVABLE_ICON_MAP = {
647
- // Network
648
- "ipv4-addr": GlobeIcon,
649
- "ipv6-addr": GlobeIcon,
650
- "domain-name": DomainIcon,
318
+ // Network (canonical Python enum values)
319
+ ipv4: GlobeIcon,
320
+ ipv6: GlobeIcon,
321
+ domain: DomainIcon,
651
322
  url: LinkIcon,
652
- "autonomous-system": WorldIcon,
653
- "mac-addr": WifiIcon,
323
+ // Hash
324
+ hash: HashIcon,
654
325
  // Email
655
- "email-addr": MailIcon,
656
- "email-message": EnvelopeIcon,
326
+ email: MailIcon,
657
327
  // File
658
328
  file: FileIcon,
659
- "file-hash": HashIcon,
660
- "file:hash:md5": HashIcon,
661
- "file:hash:sha1": HashIcon,
662
- "file:hash:sha256": HashIcon,
663
- // User/Identity
664
- user: UserIcon,
665
- "user-account": UserIcon,
666
- identity: IdCardIcon,
667
- // Process/System
668
- process: GearIcon,
669
- software: AppIcon,
670
- "windows-registry-key": RegistryIcon,
671
- // Threat Intelligence
672
- "threat-actor": ThreatActorIcon,
673
- malware: BugIcon,
674
- "attack-pattern": SwordIcon,
675
- campaign: TargetIcon,
676
- indicator: AlertIcon,
677
- // Artifacts
678
329
  artifact: FlaskIcon,
679
- certificate: CertificateIcon,
680
- "x509-certificate": CertificateIcon,
681
330
  // Default
682
331
  unknown: QuestionIcon
683
332
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cyvest/cyvest-vis",
3
- "version": "5.1.1",
3
+ "version": "5.1.3",
4
4
  "type": "module",
5
5
  "main": "dist/index.cjs",
6
6
  "module": "dist/index.js",
@@ -26,7 +26,7 @@
26
26
  "@dagrejs/dagre": "^1.1.8",
27
27
  "@xyflow/react": "^12.10.0",
28
28
  "d3-force": "^3.0.0",
29
- "@cyvest/cyvest-js": "5.1.1"
29
+ "@cyvest/cyvest-js": "5.1.3"
30
30
  },
31
31
  "devDependencies": {
32
32
  "@types/d3-force": "^3.0.10",
@@ -652,46 +652,21 @@ export const OBSERVABLE_ICON_MAP: Record<
652
652
  string,
653
653
  React.FC<IconProps>
654
654
  > = {
655
- // Network
656
- "ipv4-addr": GlobeIcon,
657
- "ipv6-addr": GlobeIcon,
658
- "domain-name": DomainIcon,
655
+ // Network (canonical Python enum values)
656
+ ipv4: GlobeIcon,
657
+ ipv6: GlobeIcon,
658
+ domain: DomainIcon,
659
659
  url: LinkIcon,
660
- "autonomous-system": WorldIcon,
661
- "mac-addr": WifiIcon,
660
+
661
+ // Hash
662
+ hash: HashIcon,
662
663
 
663
664
  // Email
664
- "email-addr": MailIcon,
665
- "email-message": EnvelopeIcon,
665
+ email: MailIcon,
666
666
 
667
667
  // File
668
668
  file: FileIcon,
669
- "file-hash": HashIcon,
670
- "file:hash:md5": HashIcon,
671
- "file:hash:sha1": HashIcon,
672
- "file:hash:sha256": HashIcon,
673
-
674
- // User/Identity
675
- user: UserIcon,
676
- "user-account": UserIcon,
677
- identity: IdCardIcon,
678
-
679
- // Process/System
680
- process: GearIcon,
681
- software: AppIcon,
682
- "windows-registry-key": RegistryIcon,
683
-
684
- // Threat Intelligence
685
- "threat-actor": ThreatActorIcon,
686
- malware: BugIcon,
687
- "attack-pattern": SwordIcon,
688
- campaign: TargetIcon,
689
- indicator: AlertIcon,
690
-
691
- // Artifacts
692
669
  artifact: FlaskIcon,
693
- certificate: CertificateIcon,
694
- "x509-certificate": CertificateIcon,
695
670
 
696
671
  // Default
697
672
  unknown: QuestionIcon,
package/src/types.ts CHANGED
@@ -23,7 +23,7 @@ export interface ObservableNodeData extends Record<string, unknown> {
23
23
  label: string;
24
24
  /** Full observable value */
25
25
  fullValue: string;
26
- /** Observable type (e.g., "domain-name", "ipv4-addr") */
26
+ /** Observable type (e.g., "domain", "ipv4") */
27
27
  observableType: string;
28
28
  /** Security level */
29
29
  level: Level;
@@ -11,12 +11,12 @@ import {
11
11
  describe("observables utils", () => {
12
12
  it("returns shapes based on root flag (all non-root nodes are circles)", () => {
13
13
  // All non-root nodes are now circles for a cleaner design
14
- expect(getObservableShape("domain-name", false)).toBe("circle");
15
- expect(getObservableShape("ipv6-addr", false)).toBe("circle");
14
+ expect(getObservableShape("domain", false)).toBe("circle");
15
+ expect(getObservableShape("ipv6", false)).toBe("circle");
16
16
  expect(getObservableShape("anything-else", false)).toBe("circle");
17
17
  // Root nodes get a rectangle (pill shape)
18
18
  expect(getObservableShape("anything-else", true)).toBe("rectangle");
19
- expect(getObservableShape("domain-name", true)).toBe("rectangle");
19
+ expect(getObservableShape("domain", true)).toBe("rectangle");
20
20
  });
21
21
 
22
22
  it("truncates long labels in the middle by default", () => {