@trii/types 2.10.744 → 2.10.746

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.
@@ -69,3 +69,21 @@ export interface IUpdateTicketResolutionTypeDto {
69
69
  fieldDefinitionIds?: string[] | null;
70
70
  layoutIds?: string[] | null;
71
71
  }
72
+ /** Body of GET /categories/{id}/usages. */
73
+ export interface ICategoryUsages {
74
+ subcategoryCount: number;
75
+ requestTypeCount: number;
76
+ fieldCount: number;
77
+ layoutCount: number;
78
+ activeTicketCount: number;
79
+ }
80
+ /** Body of GET /resolution-types/{id}/usages. */
81
+ export interface IResolutionTypeUsages {
82
+ ticketCount: number;
83
+ }
84
+ /** One rejected reference in a 422 from the resolution-type write endpoints. */
85
+ export interface IResolutionTypeReferenceProblem {
86
+ fieldName: 'fieldDefinitionIds' | 'layoutIds';
87
+ code: 'REFERENCE_NOT_FOUND' | 'REFERENCE_DISABLED';
88
+ message: string;
89
+ }
@@ -150,3 +150,12 @@ export interface ITicketMetricGroup {
150
150
  label: string;
151
151
  value: number;
152
152
  }
153
+ /** The stored value of a FILE custom field. The blob lives under
154
+ * tickets/{ticketId}/files/ and is written through media-api. */
155
+ export interface ITicketFileValue {
156
+ url: string;
157
+ storageKey: string;
158
+ fileName: string;
159
+ mimeType: string;
160
+ sizeBytes: number;
161
+ }
@@ -1,6 +1,8 @@
1
1
  import { ChannelType } from "../Common/Channels/ChannelType";
2
- import { ITicketDateRange, ITicketMetricGroup, ITicketMetricPoint, TicketPropertyValue } from "./Common";
2
+ import { ITicketDateRange, ITicketMetricGroup, ITicketMetricPoint, TicketPriority, TicketPropertyValue } from "./Common";
3
3
  import { ITicketFilter } from "./Api";
4
+ import type { SlaStatus } from "./Sla";
5
+ import type { AgentAvailabilityStatus } from "./Routing";
4
6
  export declare enum TicketAnalyticsAudience {
5
7
  AGENT = "AGENT",
6
8
  SUPERVISOR = "SUPERVISOR",
@@ -484,3 +486,98 @@ export interface ITicketDashboardMetrics {
484
486
  byCategory: ITicketMetricGroup[];
485
487
  byAssignee: ITicketMetricGroup[];
486
488
  }
489
+ export interface IAgentDashboardQueueItem {
490
+ ticketId: string;
491
+ number: number;
492
+ title: string;
493
+ priority: TicketPriority;
494
+ statusId: string;
495
+ statusLabel: string;
496
+ dueAt?: Date;
497
+ /**
498
+ * PENDING / BREACHED / NOT_APPLICABLE are the only values this backend can
499
+ * derive from dueAt — MET and PAUSED need real SLA cycles, which are not
500
+ * persisted yet. "At risk" is NOT a SlaStatus value: the domain models it as a
501
+ * separate warning threshold, which is why it is a boolean of its own.
502
+ */
503
+ slaStatus: SlaStatus;
504
+ slaAtRisk: boolean;
505
+ createdAt: Date;
506
+ updatedAt?: Date;
507
+ }
508
+ export interface IAgentDashboardCapacity {
509
+ maximum: number;
510
+ occupied: number;
511
+ freePercentage: number;
512
+ inProgress: number;
513
+ waitingCustomer: number;
514
+ new: number;
515
+ }
516
+ export interface IAgentDashboardQualityGoal {
517
+ actual: number;
518
+ target: number;
519
+ }
520
+ /**
521
+ * The agent's PERSONAL dashboard. Not to be confused with
522
+ * ITicketDashboardMetrics, which is the space-wide aggregate: everything here is
523
+ * filtered by the acting agent.
524
+ */
525
+ export interface IAgentDashboardMetrics {
526
+ range: {
527
+ from: Date;
528
+ to: Date;
529
+ };
530
+ activeLoad: number;
531
+ resolvedCount: number;
532
+ resolvedChangePercentage?: number;
533
+ receivedCount: number;
534
+ awaitingResponseCount: number;
535
+ averageFirstResponseMinutes: number;
536
+ averageResolutionMinutes: number;
537
+ slaAttentionCount: number;
538
+ slaBreachedCount: number;
539
+ slaAtRiskCount: number;
540
+ priorityQueue: IAgentDashboardQueueItem[];
541
+ capacity: IAgentDashboardCapacity;
542
+ loadByPriority: {
543
+ priority: TicketPriority;
544
+ count: number;
545
+ }[];
546
+ availabilityStatus: AgentAvailabilityStatus;
547
+ resolutionRhythm: {
548
+ series: ITicketMetricPoint[];
549
+ changePercentage?: number;
550
+ };
551
+ qualityGoals: {
552
+ firstResponseSla: IAgentDashboardQualityGoal;
553
+ resolutionSla: IAgentDashboardQualityGoal;
554
+ assignmentAcceptanceRate: IAgentDashboardQualityGoal;
555
+ };
556
+ csatScore: IAgentDashboardQualityGoal;
557
+ warnings: string[];
558
+ }
559
+ /** A metric of the catalog, plus the dimensions a query MUST supply for it. */
560
+ export interface IMetricCatalogEntry extends ITicketMetricDefinition {
561
+ requiredDimensions?: TicketAnalyticsDimension[];
562
+ }
563
+ export type IWidgetPresetQuery = Omit<ITicketMetricQuery, 'filter'>;
564
+ export type WidgetPresetCategory = 'kpi' | 'trend' | 'breakdown' | 'sla';
565
+ /**
566
+ * A ready-made widget the user can drop on a dashboard. `queries` drops `filter`
567
+ * on purpose: the preset defines WHAT is measured, the dashboard defines over
568
+ * which slice.
569
+ */
570
+ export interface IWidgetPreset {
571
+ key: string;
572
+ label: string;
573
+ description: string;
574
+ category: WidgetPresetCategory;
575
+ audiences: TicketAnalyticsAudience[];
576
+ defaultSize: {
577
+ width: number;
578
+ height: number;
579
+ };
580
+ widget: Omit<ITicketWidgetConfiguration, 'id' | 'position' | 'queries'> & {
581
+ queries: IWidgetPresetQuery[];
582
+ };
583
+ }
@@ -1,6 +1,7 @@
1
1
  import { ITicketAuditedEntity, TicketPropertyValue } from './Common';
2
2
  import { TicketConditionOperator } from './Workflow';
3
3
  import { TicketDataClassification, TicketMaskingStrategy } from './Security';
4
+ import type { TicketLayoutVisibility } from './Layouts';
4
5
  export declare enum TicketFieldType {
5
6
  SHORT_TEXT = "SHORT_TEXT",
6
7
  LONG_TEXT = "LONG_TEXT",
@@ -135,3 +136,100 @@ export interface IUpdateTicketFieldDefinitionDto extends Partial<Omit<ICreateTic
135
136
  sortable?: boolean;
136
137
  exportable?: boolean;
137
138
  }
139
+ export interface ITicketFormField {
140
+ fieldNameKey: string;
141
+ order: number;
142
+ column: number;
143
+ width: number;
144
+ visible: boolean;
145
+ /**
146
+ * One EDIT layout serves both the read and the edit screen, so `visible` is
147
+ * not enough to tell them apart: `visibility` is what says whether the field
148
+ * shows only on create, only on edit, or only on read.
149
+ */
150
+ visibility?: TicketLayoutVisibility;
151
+ labelOverride?: string;
152
+ placeholderOverride?: string;
153
+ /** Resolved by the field scope, not by the layout: the very same values
154
+ * validation will apply on save. */
155
+ required: boolean;
156
+ readOnly: boolean;
157
+ hidden: boolean;
158
+ /** The full definition travels with the field so the client does not have to
159
+ * fetch /fields separately and rebuild the form from two sources. */
160
+ definition: ITicketFieldDefinition;
161
+ }
162
+ export interface ITicketFormSection {
163
+ id: string;
164
+ title?: string;
165
+ description?: string;
166
+ order: number;
167
+ columns?: number;
168
+ collapsible?: boolean;
169
+ collapsedByDefault?: boolean;
170
+ fields: ITicketFormField[];
171
+ }
172
+ /**
173
+ * A resolved ticket form: which fields apply, and how they are arranged.
174
+ *
175
+ * The split is the point: the field SCOPE decides membership, the layout decides
176
+ * presentation. A field in scope that the layout does not mention is appended
177
+ * anyway; one the layout still lists but that no longer applies is not rendered.
178
+ * That is why a space with no layouts still has a working form.
179
+ */
180
+ export interface ITicketFormSchema {
181
+ viewType: string;
182
+ /** Absent when no layout applies: the form is served anyway, in default order. */
183
+ layoutId?: string;
184
+ sections: ITicketFormSection[];
185
+ /** In scope but missing from the layout; appended at the end. Diagnostic:
186
+ * reveals layouts that fell behind the field configuration. */
187
+ appendedFieldNameKeys: string[];
188
+ /** Present in the layout but out of scope. Not rendered; same diagnostic value. */
189
+ ignoredLayoutFieldNameKeys: string[];
190
+ }
191
+ /** Body of GET /fields/{id}/usages. */
192
+ export interface IFieldUsages {
193
+ requestTypes: {
194
+ id: string;
195
+ name: string;
196
+ }[];
197
+ referencedByFields: {
198
+ id: string;
199
+ nameKey: string;
200
+ label: string;
201
+ }[];
202
+ /** Real usage in tickets: an indexed total plus a bounded sample of the
203
+ * most-recently-touched ones, so a small set gives concrete references and a
204
+ * large one just shows a few plus the count. */
205
+ tickets: {
206
+ count: number;
207
+ sample: {
208
+ id: string;
209
+ number: number;
210
+ title: string;
211
+ }[];
212
+ };
213
+ layouts: {
214
+ supported: false;
215
+ };
216
+ }
217
+ /** Body of GET /layouts/{id}/usages. */
218
+ export interface ITicketLayoutUsages {
219
+ categories: {
220
+ id: string;
221
+ name: string;
222
+ }[];
223
+ requestTypes: {
224
+ id: string;
225
+ name: string;
226
+ }[];
227
+ resolutionTypes: {
228
+ id: string;
229
+ name: string;
230
+ }[];
231
+ views: {
232
+ id: string;
233
+ name: string;
234
+ }[];
235
+ }
@@ -390,3 +390,46 @@ export interface ICreateAgentChannelCapacityDto {
390
390
  reservedCapacity?: number;
391
391
  }
392
392
  export type IUpdateAgentChannelCapacityDto = Partial<Omit<ICreateAgentChannelCapacityDto, "userId" | "channelType">>;
393
+ export interface IEscalationPolicyUsageRef {
394
+ id: string;
395
+ name: string;
396
+ enabled: boolean;
397
+ }
398
+ /** Body of GET /routing/escalation-policies/{id}/usages. */
399
+ export interface IEscalationPolicyUsage {
400
+ queues: IEscalationPolicyUsageRef[];
401
+ }
402
+ export interface IEscalationPolicyUsageSummary {
403
+ queuesCount: number;
404
+ }
405
+ /** Mirror of TicketSkillWarningCode; only one member is needed today. */
406
+ export declare enum EscalationPolicyWarningCode {
407
+ DISABLED_BUT_REFERENCED = "DISABLED_BUT_REFERENCED"
408
+ }
409
+ /** List/get view: the base DTO plus a usage summary and warnings. */
410
+ export interface ITicketEscalationPolicyWithUsage extends ITicketEscalationPolicy {
411
+ usage: IEscalationPolicyUsageSummary;
412
+ warnings: EscalationPolicyWarningCode[];
413
+ }
414
+ export interface ICreateAgentSkillDto {
415
+ userId: string;
416
+ skillId: string;
417
+ proficiency?: number;
418
+ priority?: number;
419
+ enabled?: boolean;
420
+ validFrom?: string;
421
+ validUntil?: string;
422
+ }
423
+ /** `channelType` null means "the agent's global capacity", not "unknown". */
424
+ export interface ICreateAgentCapacityDto {
425
+ userId: string;
426
+ channelType?: number | null;
427
+ maximumConcurrent: number;
428
+ reservedCapacity?: number;
429
+ enabled?: boolean;
430
+ }
431
+ export interface IListAgentSkillsFilters {
432
+ userId?: string;
433
+ skillId?: string;
434
+ enabled?: boolean;
435
+ }
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.TicketSkillWarningCode = exports.TicketAssignmentEndReason = exports.TicketEscalationActionType = exports.TicketEscalationTrigger = exports.TicketSkillRelaxationMode = exports.TicketQueueOrderDirection = exports.TicketQueueOrderCriterion = exports.TicketRoutingConditionGroupOperator = exports.AgentAvailabilityStatus = exports.TicketRoutingStatus = exports.TicketRoutingStrategy = void 0;
3
+ exports.EscalationPolicyWarningCode = exports.TicketSkillWarningCode = exports.TicketAssignmentEndReason = exports.TicketEscalationActionType = exports.TicketEscalationTrigger = exports.TicketSkillRelaxationMode = exports.TicketQueueOrderDirection = exports.TicketQueueOrderCriterion = exports.TicketRoutingConditionGroupOperator = exports.AgentAvailabilityStatus = exports.TicketRoutingStatus = exports.TicketRoutingStrategy = void 0;
4
4
  var TicketRoutingStrategy;
5
5
  (function (TicketRoutingStrategy) {
6
6
  TicketRoutingStrategy["ROUND_ROBIN"] = "ROUND_ROBIN";
@@ -91,3 +91,8 @@ var TicketSkillWarningCode;
91
91
  TicketSkillWarningCode["DISABLED_BUT_REFERENCED"] = "DISABLED_BUT_REFERENCED";
92
92
  TicketSkillWarningCode["REQUIRED_BY_QUEUE_BUT_UNMET"] = "REQUIRED_BY_QUEUE_BUT_UNMET";
93
93
  })(TicketSkillWarningCode || (exports.TicketSkillWarningCode = TicketSkillWarningCode = {}));
94
+ /** Mirror of TicketSkillWarningCode; only one member is needed today. */
95
+ var EscalationPolicyWarningCode;
96
+ (function (EscalationPolicyWarningCode) {
97
+ EscalationPolicyWarningCode["DISABLED_BUT_REFERENCED"] = "DISABLED_BUT_REFERENCED";
98
+ })(EscalationPolicyWarningCode || (exports.EscalationPolicyWarningCode = EscalationPolicyWarningCode = {}));
@@ -140,7 +140,7 @@ export interface ICreateTicketRequestTypeDto {
140
140
  description?: string;
141
141
  categoryId: string;
142
142
  icon?: string;
143
- formId: string;
143
+ formId?: string;
144
144
  formVersion?: number;
145
145
  workflowId?: string;
146
146
  defaultPriority?: TicketPriority;
@@ -536,7 +536,7 @@ export interface ICustomerRequestTypeView {
536
536
  name: string;
537
537
  description?: string;
538
538
  icon?: string;
539
- formId: string;
539
+ formId?: string;
540
540
  formVersion?: number;
541
541
  defaultPriority?: TicketPriority;
542
542
  category: ICustomerRequestTypeCategoryView;
@@ -644,3 +644,27 @@ export interface ICustomerTicketActionDto {
644
644
  attachmentIds?: string[];
645
645
  formSubmissionId?: string;
646
646
  }
647
+ /**
648
+ * Confirmation that an uploaded file became an attachment of the ticket.
649
+ *
650
+ * An allowlist over ITicketAttachment, and note the two absences:
651
+ *
652
+ * - `storageKey` is the blob layout tickets-api and media-api agree on. It is
653
+ * internal plumbing, and a client that learned to build one could address
654
+ * blobs of tickets it never saw.
655
+ * - `downloadUrl` is omitted because there is NO customer read path for
656
+ * attachments yet: ICustomerTicketView has no attachments field, and the url
657
+ * the agent surface hands out is an unsigned blob url that only resolves with
658
+ * a container SAS this surface has never discussed. Returning one would be
659
+ * offering a link that 403s.
660
+ *
661
+ * `createdBy` is absent too, for a duller reason: on this path it is the nil
662
+ * uuid marker, which says nothing to anyone.
663
+ */
664
+ export interface ICustomerTicketAttachmentView {
665
+ id: string;
666
+ fileName: string;
667
+ mimeType: string;
668
+ sizeBytes: number;
669
+ createdAt: Date;
670
+ }
@@ -391,3 +391,38 @@ export interface ISlaWarningEvent {
391
391
  escalationPolicyId?: string;
392
392
  notificationTemplateId?: string;
393
393
  }
394
+ /** Body of GET /business-calendars/{id}/usages. */
395
+ export interface IBusinessCalendarUsages {
396
+ slaPolicies: {
397
+ id: string;
398
+ name: string;
399
+ }[];
400
+ }
401
+ /** One row of the bulk usage count for a list of calendars. */
402
+ export interface IBusinessCalendarUsageCount {
403
+ businessCalendarId: string;
404
+ count: number;
405
+ }
406
+ /** Body of GET /sla/metric-definitions/{id}/usages. */
407
+ export interface IMetricDefinitionUsages {
408
+ slaPolicies: {
409
+ id: string;
410
+ name: string;
411
+ }[];
412
+ }
413
+ /** List item of GET /sla/metric-definitions: the published definition plus how
414
+ * many policies reference it, so the list can warn before a delete. */
415
+ export interface ISlaMetricDefinitionListItem extends ISlaMetricDefinition {
416
+ usageCount: number;
417
+ }
418
+ export interface ISlaPolicyValidationIssue {
419
+ code: string;
420
+ severity: 'ERROR' | 'WARNING';
421
+ message: string;
422
+ path?: string;
423
+ }
424
+ /** Body of POST /sla/policies/validate. Issues with severity WARNING do not
425
+ * block the save; ERROR ones do. */
426
+ export interface IValidateSlaPolicyResponse {
427
+ issues: ISlaPolicyValidationIssue[];
428
+ }
@@ -134,3 +134,8 @@ export interface ITicketInboundEvent {
134
134
  [key: string]: string | number | boolean | null;
135
135
  };
136
136
  }
137
+ /** Body of GET /tickets/{id}/collaboration. `chatId` is an opaque reference to a
138
+ * chat group of another service, not a tickets uuid. */
139
+ export interface ITicketCollaboration {
140
+ chatId: string | null;
141
+ }
@@ -145,3 +145,35 @@ export interface ITicketFormSubmissionReference {
145
145
  submittedAt: Date;
146
146
  submittedBy: string;
147
147
  }
148
+ /** Body of GET /approval-definitions/{id}/usages. */
149
+ export interface IApprovalDefinitionUsages {
150
+ categories: {
151
+ id: string;
152
+ name: string;
153
+ }[];
154
+ /**
155
+ * `transitions` and `macros` ARE resolvable: an APPROVAL_COMPLETED transition
156
+ * condition stores the approvalProcessDefinitionId it gates on, and a
157
+ * START_APPROVAL macro action stores its definitionId.
158
+ *
159
+ * `workflows` stays unsupported because a "workflow" is the status+transition
160
+ * graph, not a stored entity that references a definition on its own — the
161
+ * relationship materializes as the transitions above. `automations` stays
162
+ * unsupported because no automation entity references an approval definition
163
+ * in this schema.
164
+ */
165
+ workflows: {
166
+ supported: false;
167
+ };
168
+ transitions: {
169
+ id: string;
170
+ name: string;
171
+ }[];
172
+ automations: {
173
+ supported: false;
174
+ };
175
+ macros: {
176
+ id: string;
177
+ name: string;
178
+ }[];
179
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@trii/types",
3
- "version": "2.10.744",
3
+ "version": "2.10.746",
4
4
  "description": "Types definitions for Trii projects - ",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",