@ampsec/platform-client 87.5.2 → 87.6.1

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.
@@ -1,6 +1,6 @@
1
1
  import { z } from 'zod';
2
2
  import { FlowSpecStatusKind } from '../flows.dto';
3
- export declare const _PlatformFlowSpecUpsertDto: z.ZodObject<z.objectUtil.extendShape<Omit<z.objectUtil.extendShape<{
3
+ export declare const _PlatformFlowSpecUpsertDto: z.ZodEffects<z.ZodObject<z.objectUtil.extendShape<Omit<z.objectUtil.extendShape<{
4
4
  id: z.ZodString;
5
5
  createdAt: z.ZodString;
6
6
  updatedAt: z.ZodString;
@@ -121,6 +121,16 @@ export declare const _PlatformFlowSpecUpsertDto: z.ZodObject<z.objectUtil.extend
121
121
  value?: number | undefined;
122
122
  units?: string | undefined;
123
123
  }>>;
124
+ skipWaitingPeriod: z.ZodOptional<z.ZodObject<{
125
+ enabled: z.ZodBoolean;
126
+ ignoreBusinessHours: z.ZodDefault<z.ZodBoolean>;
127
+ }, "strip", z.ZodTypeAny, {
128
+ enabled: boolean;
129
+ ignoreBusinessHours: boolean;
130
+ }, {
131
+ enabled: boolean;
132
+ ignoreBusinessHours?: boolean | undefined;
133
+ }>>;
124
134
  training: z.ZodOptional<z.ZodObject<{
125
135
  subject: z.ZodOptional<z.ZodString>;
126
136
  context: z.ZodOptional<z.ZodString>;
@@ -862,6 +872,416 @@ export declare const _PlatformFlowSpecUpsertDto: z.ZodObject<z.objectUtil.extend
862
872
  value?: number | undefined;
863
873
  units?: string | undefined;
864
874
  } | undefined;
875
+ skipWaitingPeriod?: {
876
+ enabled: boolean;
877
+ ignoreBusinessHours: boolean;
878
+ } | undefined;
879
+ training?: {
880
+ context?: string | undefined;
881
+ subject?: string | undefined;
882
+ } | undefined;
883
+ triage?: {
884
+ message: string;
885
+ yesAction: {
886
+ actionId: string | null;
887
+ findingStatus?: import("..").FindingStatus | null | undefined;
888
+ responseMessage?: string | undefined;
889
+ actionDescriptionContext?: string | undefined;
890
+ };
891
+ noAction: {
892
+ actionId: string | null;
893
+ findingStatus?: import("..").FindingStatus | null | undefined;
894
+ responseMessage?: string | undefined;
895
+ actionDescriptionContext?: string | undefined;
896
+ };
897
+ } | undefined;
898
+ reminderInterval?: {
899
+ minutes: number;
900
+ value?: number | undefined;
901
+ units?: string | undefined;
902
+ } | undefined;
903
+ escalation?: {
904
+ interval: {
905
+ minutes: number;
906
+ value?: number | undefined;
907
+ units?: string | undefined;
908
+ };
909
+ engagementChannelConnectorIds: string[];
910
+ redirection?: {
911
+ kind: import("../flows.dto").EngagementRedirectionKind.SLACK_CHANNEL;
912
+ channelId: string;
913
+ includeUser: boolean;
914
+ } | {
915
+ kind: import("../flows.dto").EngagementRedirectionKind.TEAMS_CHANNEL;
916
+ channelId: string;
917
+ includeUser: boolean;
918
+ } | {
919
+ kind: import("../flows.dto").EngagementRedirectionKind.EMAIL_CHANNEL;
920
+ channelId: string;
921
+ includeUser: boolean;
922
+ } | undefined;
923
+ } | undefined;
924
+ escalationToManager?: {
925
+ interval: {
926
+ minutes: number;
927
+ value?: number | undefined;
928
+ units?: string | undefined;
929
+ };
930
+ engagementChannelConnectorIds: string[];
931
+ redirection?: {
932
+ kind: import("../flows.dto").EngagementRedirectionKind.SLACK_CHANNEL;
933
+ channelId: string;
934
+ includeUser: boolean;
935
+ } | {
936
+ kind: import("../flows.dto").EngagementRedirectionKind.TEAMS_CHANNEL;
937
+ channelId: string;
938
+ includeUser: boolean;
939
+ } | {
940
+ kind: import("../flows.dto").EngagementRedirectionKind.EMAIL_CHANNEL;
941
+ channelId: string;
942
+ includeUser: boolean;
943
+ } | undefined;
944
+ } | undefined;
945
+ rewards?: {
946
+ minutes: number;
947
+ isUpperBound: boolean;
948
+ points: number;
949
+ value?: number | undefined;
950
+ units?: string | undefined;
951
+ }[] | undefined;
952
+ customMessage?: {
953
+ template?: string | undefined;
954
+ append?: boolean | undefined;
955
+ } | undefined;
956
+ prependCustomMessage?: {
957
+ template?: string | undefined;
958
+ } | undefined;
959
+ messageTitle?: string | undefined;
960
+ additionalContext?: {
961
+ data?: string | undefined;
962
+ } | undefined;
963
+ securityTip?: {
964
+ subject?: import("../flows.dto").SecurityTipSubject | undefined;
965
+ isConfigured?: boolean | undefined;
966
+ } | undefined;
967
+ scheduleConfig?: {
968
+ required: boolean;
969
+ } | undefined;
970
+ }, {
971
+ filter: {
972
+ cohorts: ({
973
+ inclusive: boolean;
974
+ value: string;
975
+ id: string;
976
+ displayValue: string;
977
+ kind: import("../flows.dto").CohortKind;
978
+ } | undefined)[];
979
+ custom?: Record<string, unknown> | undefined;
980
+ };
981
+ name: string;
982
+ status: FlowSpecStatusKind;
983
+ description: string;
984
+ tid: string;
985
+ triggerFilter: {
986
+ trigger: {
987
+ id: string;
988
+ displayValue: string;
989
+ eventType: string;
990
+ cid?: string | undefined;
991
+ }[];
992
+ custom?: Record<string, unknown> | undefined;
993
+ };
994
+ engagementChannelCids: string[];
995
+ id?: string | undefined;
996
+ createdAt?: string | undefined;
997
+ updatedAt?: string | undefined;
998
+ deletedAt?: string | null | undefined;
999
+ actions?: {
1000
+ includeInstructions?: boolean | undefined;
1001
+ getInstructionsAction?: {
1002
+ includeCustomInstructions?: boolean | undefined;
1003
+ customInstructions?: string | undefined;
1004
+ includeOnlyCustomInstructions?: boolean | undefined;
1005
+ } | undefined;
1006
+ includeMarkComplete?: boolean | undefined;
1007
+ expirationActionId?: string | undefined;
1008
+ expirationAction?: {
1009
+ actionId: string | null;
1010
+ findingStatus?: import("..").FindingStatus | null | undefined;
1011
+ responseMessage?: string | undefined;
1012
+ actionDescriptionContext?: string | undefined;
1013
+ } | undefined;
1014
+ simpleTriageYesActId?: string | undefined;
1015
+ simpleTriageNoActId?: string | undefined;
1016
+ resolveNowActionId?: string | undefined;
1017
+ resolveNowAction?: {
1018
+ actionId: string | null;
1019
+ findingStatus?: import("..").FindingStatus | null | undefined;
1020
+ responseMessage?: string | undefined;
1021
+ actionDescriptionContext?: string | undefined;
1022
+ } | undefined;
1023
+ scheduleResolutionAction?: {
1024
+ actionId: string | null;
1025
+ findingStatus?: import("..").FindingStatus | null | undefined;
1026
+ responseMessage?: string | undefined;
1027
+ actionDescriptionContext?: string | undefined;
1028
+ } | undefined;
1029
+ launchAction?: {
1030
+ actionId: string | null;
1031
+ findingStatus?: import("..").FindingStatus | null | undefined;
1032
+ responseMessage?: string | undefined;
1033
+ actionDescriptionContext?: string | undefined;
1034
+ } | undefined;
1035
+ launchActionsV2?: {
1036
+ id: string;
1037
+ actions: {
1038
+ actionId: string | null;
1039
+ }[];
1040
+ findingStatus: import("..").FindingStatus | null;
1041
+ } | undefined;
1042
+ actionButtons?: {
1043
+ id: string;
1044
+ actions: {
1045
+ actionId: string | null;
1046
+ }[];
1047
+ findingStatus: import("..").FindingStatus | null;
1048
+ actionLabel: string;
1049
+ }[] | undefined;
1050
+ } | undefined;
1051
+ redirection?: {
1052
+ kind: import("../flows.dto").EngagementRedirectionKind.SLACK_CHANNEL;
1053
+ channelId: string;
1054
+ includeUser?: boolean | undefined;
1055
+ } | {
1056
+ kind: import("../flows.dto").EngagementRedirectionKind.TEAMS_CHANNEL;
1057
+ channelId: string;
1058
+ includeUser?: boolean | undefined;
1059
+ } | {
1060
+ kind: import("../flows.dto").EngagementRedirectionKind.EMAIL_CHANNEL;
1061
+ channelId: string;
1062
+ includeUser?: boolean | undefined;
1063
+ } | undefined;
1064
+ fslStrategy?: "STANDARD" | undefined;
1065
+ tone?: {
1066
+ kind?: string | undefined;
1067
+ } | undefined;
1068
+ targetResolution?: {
1069
+ minutes: number;
1070
+ value?: number | undefined;
1071
+ units?: string | undefined;
1072
+ } | undefined;
1073
+ delayEngagement?: {
1074
+ minutes: number;
1075
+ value?: number | undefined;
1076
+ units?: string | undefined;
1077
+ } | undefined;
1078
+ skipWaitingPeriod?: {
1079
+ enabled: boolean;
1080
+ ignoreBusinessHours?: boolean | undefined;
1081
+ } | undefined;
1082
+ training?: {
1083
+ context?: string | undefined;
1084
+ subject?: string | undefined;
1085
+ } | undefined;
1086
+ triage?: {
1087
+ message: string;
1088
+ yesAction: {
1089
+ actionId: string | null;
1090
+ findingStatus?: import("..").FindingStatus | null | undefined;
1091
+ responseMessage?: string | undefined;
1092
+ actionDescriptionContext?: string | undefined;
1093
+ };
1094
+ noAction: {
1095
+ actionId: string | null;
1096
+ findingStatus?: import("..").FindingStatus | null | undefined;
1097
+ responseMessage?: string | undefined;
1098
+ actionDescriptionContext?: string | undefined;
1099
+ };
1100
+ } | undefined;
1101
+ reminderInterval?: {
1102
+ minutes: number;
1103
+ value?: number | undefined;
1104
+ units?: string | undefined;
1105
+ } | undefined;
1106
+ escalation?: {
1107
+ interval: {
1108
+ minutes: number;
1109
+ value?: number | undefined;
1110
+ units?: string | undefined;
1111
+ };
1112
+ engagementChannelConnectorIds: string[];
1113
+ redirection?: {
1114
+ kind: import("../flows.dto").EngagementRedirectionKind.SLACK_CHANNEL;
1115
+ channelId: string;
1116
+ includeUser?: boolean | undefined;
1117
+ } | {
1118
+ kind: import("../flows.dto").EngagementRedirectionKind.TEAMS_CHANNEL;
1119
+ channelId: string;
1120
+ includeUser?: boolean | undefined;
1121
+ } | {
1122
+ kind: import("../flows.dto").EngagementRedirectionKind.EMAIL_CHANNEL;
1123
+ channelId: string;
1124
+ includeUser?: boolean | undefined;
1125
+ } | undefined;
1126
+ } | undefined;
1127
+ escalationToManager?: {
1128
+ interval: {
1129
+ minutes: number;
1130
+ value?: number | undefined;
1131
+ units?: string | undefined;
1132
+ };
1133
+ engagementChannelConnectorIds: string[];
1134
+ redirection?: {
1135
+ kind: import("../flows.dto").EngagementRedirectionKind.SLACK_CHANNEL;
1136
+ channelId: string;
1137
+ includeUser?: boolean | undefined;
1138
+ } | {
1139
+ kind: import("../flows.dto").EngagementRedirectionKind.TEAMS_CHANNEL;
1140
+ channelId: string;
1141
+ includeUser?: boolean | undefined;
1142
+ } | {
1143
+ kind: import("../flows.dto").EngagementRedirectionKind.EMAIL_CHANNEL;
1144
+ channelId: string;
1145
+ includeUser?: boolean | undefined;
1146
+ } | undefined;
1147
+ } | undefined;
1148
+ rewards?: {
1149
+ minutes: number;
1150
+ isUpperBound: boolean;
1151
+ points: number;
1152
+ value?: number | undefined;
1153
+ units?: string | undefined;
1154
+ }[] | undefined;
1155
+ customMessage?: {
1156
+ template?: string | undefined;
1157
+ append?: boolean | undefined;
1158
+ } | undefined;
1159
+ prependCustomMessage?: {
1160
+ template?: string | undefined;
1161
+ } | undefined;
1162
+ messageTitle?: string | undefined;
1163
+ additionalContext?: {
1164
+ data?: string | undefined;
1165
+ } | undefined;
1166
+ securityTip?: {
1167
+ subject?: import("../flows.dto").SecurityTipSubject | undefined;
1168
+ isConfigured?: boolean | undefined;
1169
+ } | undefined;
1170
+ scheduleConfig?: {
1171
+ required: boolean;
1172
+ } | undefined;
1173
+ }>, {
1174
+ filter: {
1175
+ cohorts: ({
1176
+ inclusive: boolean;
1177
+ value: string;
1178
+ id: string;
1179
+ displayValue: string;
1180
+ kind: import("../flows.dto").CohortKind;
1181
+ } | undefined)[];
1182
+ custom?: Record<string, unknown> | undefined;
1183
+ };
1184
+ name: string;
1185
+ status: FlowSpecStatusKind;
1186
+ description: string;
1187
+ tid: string;
1188
+ fslStrategy: "STANDARD";
1189
+ triggerFilter: {
1190
+ trigger: {
1191
+ id: string;
1192
+ displayValue: string;
1193
+ eventType: string;
1194
+ cid?: string | undefined;
1195
+ }[];
1196
+ custom?: Record<string, unknown> | undefined;
1197
+ };
1198
+ engagementChannelCids: string[];
1199
+ id?: string | undefined;
1200
+ createdAt?: string | undefined;
1201
+ updatedAt?: string | undefined;
1202
+ deletedAt?: string | null | undefined;
1203
+ actions?: {
1204
+ includeInstructions?: boolean | undefined;
1205
+ getInstructionsAction?: {
1206
+ includeCustomInstructions?: boolean | undefined;
1207
+ customInstructions?: string | undefined;
1208
+ includeOnlyCustomInstructions?: boolean | undefined;
1209
+ } | undefined;
1210
+ includeMarkComplete?: boolean | undefined;
1211
+ expirationActionId?: string | undefined;
1212
+ expirationAction?: {
1213
+ actionId: string | null;
1214
+ findingStatus?: import("..").FindingStatus | null | undefined;
1215
+ responseMessage?: string | undefined;
1216
+ actionDescriptionContext?: string | undefined;
1217
+ } | undefined;
1218
+ simpleTriageYesActId?: string | undefined;
1219
+ simpleTriageNoActId?: string | undefined;
1220
+ resolveNowActionId?: string | undefined;
1221
+ resolveNowAction?: {
1222
+ actionId: string | null;
1223
+ findingStatus?: import("..").FindingStatus | null | undefined;
1224
+ responseMessage?: string | undefined;
1225
+ actionDescriptionContext?: string | undefined;
1226
+ } | undefined;
1227
+ scheduleResolutionAction?: {
1228
+ actionId: string | null;
1229
+ findingStatus?: import("..").FindingStatus | null | undefined;
1230
+ responseMessage?: string | undefined;
1231
+ actionDescriptionContext?: string | undefined;
1232
+ } | undefined;
1233
+ launchAction?: {
1234
+ actionId: string | null;
1235
+ findingStatus?: import("..").FindingStatus | null | undefined;
1236
+ responseMessage?: string | undefined;
1237
+ actionDescriptionContext?: string | undefined;
1238
+ } | undefined;
1239
+ launchActionsV2?: {
1240
+ id: string;
1241
+ actions: {
1242
+ actionId: string | null;
1243
+ }[];
1244
+ findingStatus: import("..").FindingStatus | null;
1245
+ } | undefined;
1246
+ actionButtons?: {
1247
+ id: string;
1248
+ actions: {
1249
+ actionId: string | null;
1250
+ }[];
1251
+ findingStatus: import("..").FindingStatus | null;
1252
+ actionLabel: string;
1253
+ }[] | undefined;
1254
+ } | undefined;
1255
+ redirection?: {
1256
+ kind: import("../flows.dto").EngagementRedirectionKind.SLACK_CHANNEL;
1257
+ channelId: string;
1258
+ includeUser: boolean;
1259
+ } | {
1260
+ kind: import("../flows.dto").EngagementRedirectionKind.TEAMS_CHANNEL;
1261
+ channelId: string;
1262
+ includeUser: boolean;
1263
+ } | {
1264
+ kind: import("../flows.dto").EngagementRedirectionKind.EMAIL_CHANNEL;
1265
+ channelId: string;
1266
+ includeUser: boolean;
1267
+ } | undefined;
1268
+ tone?: {
1269
+ kind?: string | undefined;
1270
+ } | undefined;
1271
+ targetResolution?: {
1272
+ minutes: number;
1273
+ value?: number | undefined;
1274
+ units?: string | undefined;
1275
+ } | undefined;
1276
+ delayEngagement?: {
1277
+ minutes: number;
1278
+ value?: number | undefined;
1279
+ units?: string | undefined;
1280
+ } | undefined;
1281
+ skipWaitingPeriod?: {
1282
+ enabled: boolean;
1283
+ ignoreBusinessHours: boolean;
1284
+ } | undefined;
865
1285
  training?: {
866
1286
  context?: string | undefined;
867
1287
  subject?: string | undefined;
@@ -1061,6 +1481,10 @@ export declare const _PlatformFlowSpecUpsertDto: z.ZodObject<z.objectUtil.extend
1061
1481
  value?: number | undefined;
1062
1482
  units?: string | undefined;
1063
1483
  } | undefined;
1484
+ skipWaitingPeriod?: {
1485
+ enabled: boolean;
1486
+ ignoreBusinessHours?: boolean | undefined;
1487
+ } | undefined;
1064
1488
  training?: {
1065
1489
  context?: string | undefined;
1066
1490
  subject?: string | undefined;
@@ -1275,6 +1699,16 @@ export declare const _PlatformFlowSpecDto: z.ZodObject<z.objectUtil.extendShape<
1275
1699
  value?: number | undefined;
1276
1700
  units?: string | undefined;
1277
1701
  }>>;
1702
+ skipWaitingPeriod: z.ZodOptional<z.ZodObject<{
1703
+ enabled: z.ZodBoolean;
1704
+ ignoreBusinessHours: z.ZodDefault<z.ZodBoolean>;
1705
+ }, "strip", z.ZodTypeAny, {
1706
+ enabled: boolean;
1707
+ ignoreBusinessHours: boolean;
1708
+ }, {
1709
+ enabled: boolean;
1710
+ ignoreBusinessHours?: boolean | undefined;
1711
+ }>>;
1278
1712
  training: z.ZodOptional<z.ZodObject<{
1279
1713
  subject: z.ZodOptional<z.ZodString>;
1280
1714
  context: z.ZodOptional<z.ZodString>;
@@ -2011,6 +2445,10 @@ export declare const _PlatformFlowSpecDto: z.ZodObject<z.objectUtil.extendShape<
2011
2445
  value?: number | undefined;
2012
2446
  units?: string | undefined;
2013
2447
  } | undefined;
2448
+ skipWaitingPeriod?: {
2449
+ enabled: boolean;
2450
+ ignoreBusinessHours: boolean;
2451
+ } | undefined;
2014
2452
  training?: {
2015
2453
  context?: string | undefined;
2016
2454
  subject?: string | undefined;
@@ -2218,6 +2656,10 @@ export declare const _PlatformFlowSpecDto: z.ZodObject<z.objectUtil.extendShape<
2218
2656
  value?: number | undefined;
2219
2657
  units?: string | undefined;
2220
2658
  } | undefined;
2659
+ skipWaitingPeriod?: {
2660
+ enabled: boolean;
2661
+ ignoreBusinessHours?: boolean | undefined;
2662
+ } | undefined;
2221
2663
  training?: {
2222
2664
  context?: string | undefined;
2223
2665
  subject?: string | undefined;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ampsec/platform-client",
3
- "version": "87.5.2",
3
+ "version": "87.6.1",
4
4
  "description": "",
5
5
  "main": "build/src/index.js",
6
6
  "runkitExampleFilename": "example/main.js",
@@ -19,4 +19,5 @@ export enum Category {
19
19
  COMPLIANCE_TRAINING = 'COMPLIANCE_TRAINING',
20
20
  AI_SERVICE_RISK = 'AI_SERVICE_RISK',
21
21
  NEW_HIRE = 'NEW_HIRE',
22
+ ATTRIBUTION = 'ATTRIBUTION',
22
23
  }
@@ -27,6 +27,10 @@ export const FINDING_BUCKET_KEYS = {
27
27
  * AI SERVICE RISK
28
28
  */
29
29
  AI_SERVICE_RISK: 'AI_SERVICE_RISK',
30
+ /**
31
+ * ATTRIBUTION (e.g. Axonius)
32
+ */
33
+ ATTRIBUTION: 'ATTRIBUTION',
30
34
  /**
31
35
  * OTHER
32
36
  */
@@ -67,6 +67,9 @@ export enum FindingKind {
67
67
 
68
68
  // NEW_HIRE
69
69
  NEW_HIRE = 'NEW_HIRE',
70
+
71
+ // ATTRIBUTION (e.g. Axonius; extend with specific kinds as needed)
72
+ ATTRIBUTION = 'ATTRIBUTION',
70
73
  }
71
74
 
72
75
  export const lookupFindingOutcomeByKind = (kind: FindingKind): FindingOutcome => {
@@ -115,6 +118,7 @@ export const lookupFindingOutcomeByKind = (kind: FindingKind): FindingOutcome =>
115
118
  case FindingKind.AI_SERVICE_UNTRACKED:
116
119
  case FindingKind.AI_SERVICE_UNAPPROVED:
117
120
  case FindingKind.NEW_HIRE:
121
+ case FindingKind.ATTRIBUTION:
118
122
  default: {
119
123
  return FindingOutcome.REMEDIATION;
120
124
  }
@@ -179,6 +183,9 @@ export const lookupFindingKindByCategory = (category: string): FindingKind[] =>
179
183
  case Category.NEW_HIRE: {
180
184
  return [FindingKind.NEW_HIRE];
181
185
  }
186
+ case Category.ATTRIBUTION: {
187
+ return [FindingKind.ATTRIBUTION];
188
+ }
182
189
  default: {
183
190
  return [];
184
191
  }
@@ -232,6 +239,7 @@ export const lookupFindingSeverityByKind = (kind: string): FindingSeverity | und
232
239
  case FindingKind.AI_SERVICE_UNAPPROVED:
233
240
  return FindingSeverity.HIGH;
234
241
  case FindingKind.NEW_HIRE:
242
+ case FindingKind.ATTRIBUTION:
235
243
  return FindingSeverity.INFO;
236
244
  default:
237
245
  return undefined;
@@ -366,6 +374,14 @@ export const lookupFindingScoreByCategoryKindAndSeverity = (category: Category,
366
374
  return 0;
367
375
  }
368
376
  }
377
+ case Category.ATTRIBUTION: {
378
+ switch (kind) {
379
+ case FindingKind.ATTRIBUTION:
380
+ return 2;
381
+ default:
382
+ return 0;
383
+ }
384
+ }
369
385
 
370
386
  default: {
371
387
  return 0;
@@ -389,6 +405,8 @@ export const lookupFindingDisplayValueByKind = (kind: string): string => {
389
405
  return 'ai_service_unapproved';
390
406
  case FindingKind.NEW_HIRE:
391
407
  return 'new_hire';
408
+ case FindingKind.ATTRIBUTION:
409
+ return 'attribution';
392
410
  default:
393
411
  return kind.toLowerCase();
394
412
  }
@@ -442,6 +460,8 @@ export const lookupFindingDescriptionByKind = (kind: string): string => {
442
460
  return 'Detected use of an AI service that has not been approved';
443
461
  case FindingKind.NEW_HIRE:
444
462
  return 'New hire employee detected';
463
+ case FindingKind.ATTRIBUTION:
464
+ return 'Attribution or coverage gap detected for a user or device';
445
465
  default:
446
466
  return '';
447
467
  }
@@ -633,6 +653,9 @@ export const generateInsights = (category: string, kind: string) => {
633
653
  case FindingKind.NEW_HIRE:
634
654
  rule.kind = SaasComponentKind.NEW_HIRE;
635
655
  break;
656
+ case FindingKind.ATTRIBUTION:
657
+ rule.kind = SaasComponentKind.ATTRIBUTION;
658
+ break;
636
659
  default:
637
660
  break;
638
661
  }
@@ -52,4 +52,8 @@ export enum SaasComponentKind {
52
52
  // NEW HIRE
53
53
  // ********
54
54
  NEW_HIRE = 'NEW_HIRE',
55
+
56
+ // ATTRIBUTION (e.g. Axonius)
57
+ // *************************
58
+ ATTRIBUTION = 'ATTRIBUTION',
55
59
  }
@@ -300,6 +300,12 @@ export const _FlowSpecDto = _BaseDto.merge(
300
300
  tone: _FlowTone.optional(),
301
301
  targetResolution: _FlowInterval.optional(),
302
302
  delayEngagement: _FlowInterval.optional(),
303
+ skipWaitingPeriod: z
304
+ .object({
305
+ enabled: z.boolean(),
306
+ ignoreBusinessHours: z.boolean().default(true),
307
+ })
308
+ .optional(),
303
309
  training: z.object({subject: z.string().optional(), context: z.string().optional()}).optional(),
304
310
  triage: z.object({message: z.string(), yesAction: _FlowActionDetails, noAction: _FlowActionDetails}).optional(),
305
311
  reminderInterval: _FlowInterval.optional(),
@@ -331,7 +337,18 @@ export const _FlowSpecDto = _BaseDto.merge(
331
337
  );
332
338
  export type FlowSpecDto = z.infer<typeof _FlowSpecDto>;
333
339
 
334
- export const _FlowSpecUpsertDto = _FlowSpecDto.omit({activity: true}).merge(_BaseUpsertDto);
340
+ export const _FlowSpecUpsertDto = _FlowSpecDto
341
+ .omit({activity: true})
342
+ .merge(_BaseUpsertDto)
343
+ .superRefine((dto, ctx) => {
344
+ if (dto.delayEngagement && dto.skipWaitingPeriod?.enabled) {
345
+ ctx.addIssue({
346
+ code: z.ZodIssueCode.custom,
347
+ path: ['skipWaitingPeriod'],
348
+ message: 'skipWaitingPeriod cannot be enabled when delayEngagement is set',
349
+ });
350
+ }
351
+ });
335
352
  export type FlowSpecUpsertDto = z.infer<typeof _FlowSpecUpsertDto>;
336
353
 
337
354
  export const _FlowSpecFilter = _FlowSpecDto.omit({triggerFilter: true, filter: true}).partial().merge(_PaginationFilter).merge(_SortFilter);