@opencxh/domain 1.281.0 → 1.286.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,7 @@
1
+ import { SavedView } from '../saved-view/types';
1
2
  import { OwnerScope } from '../scope/types';
2
3
  import { DimensionId } from './dimensions';
3
- import { WidgetConfig } from './report';
4
+ import { FilterClause, WidgetConfig } from './report';
4
5
  /**
5
6
  * A dashboard SECTION, declaratively. The analytics frontend runs the right widget(s) for the viz and
6
7
  * renders the matching component. `title` and the parent def's `title` are i18n keys resolved against the
@@ -61,3 +62,17 @@ export interface DashboardConfig {
61
62
  createdAt?: number;
62
63
  updatedAt?: number;
63
64
  }
65
+ /** What a report view keeps: the window as the URL writes it (`30d`, `2026-08-01~2026-08-31`) and the filters. */
66
+ export interface ReportViewFilters {
67
+ period: string;
68
+ clauses: FilterClause[];
69
+ }
70
+ /**
71
+ * A saved report view: a preset dashboard with a period and filters, under a name. The shared
72
+ * `SavedView` shape; `layout` is always `"report"` and the dashboard rides in its own column,
73
+ * because the list of dashboards is discovered, not fixed.
74
+ */
75
+ export type ReportView = SavedView<ReportViewFilters, "report"> & {
76
+ dashboardKey: string;
77
+ };
78
+ export declare const REPORT_VIEW_LAYOUTS: readonly ["report"];
@@ -1,3 +1,4 @@
1
+ import { SlaMetric } from '../sla/types';
1
2
  import { DimensionId } from './dimensions';
2
3
  /**
3
4
  * Metric register — the declarative building block. Fixed in code as a typed `const` in the owning app
@@ -13,6 +14,15 @@ export type MetricAggregation = "sum" | "avg" | "rate" | "distinct" | "p50" | "p
13
14
  * conversations is more work, not better work, so its delta stays grey.
14
15
  */
15
16
  export type MetricPolarity = "higher" | "lower" | "neutral";
17
+ /**
18
+ * Where the goal for a metric lives. Only SLA targets today: the minutes an SLA
19
+ * profile sets for one of its metrics. A report shows the goal only when exactly
20
+ * one profile applies — picking between several would be a guess.
21
+ */
22
+ export type MetricTarget = {
23
+ kind: "sla";
24
+ metric: SlaMetric;
25
+ };
16
26
  export interface MetricDefinition {
17
27
  /**
18
28
  * Globally-unique, app-namespaced id: "<source>.<family>.<name>", e.g. "comms.reply_time.first",
@@ -42,4 +52,6 @@ export interface MetricDefinition {
42
52
  hidden?: boolean;
43
53
  /** Good direction for a delta. Omitted = the analytics app guesses from id and aggregation. */
44
54
  polarity?: MetricPolarity;
55
+ /** The goal this metric is measured against, if any (a duration metric against an SLA target). */
56
+ target?: MetricTarget;
45
57
  }
@@ -7,6 +7,11 @@ export interface EventAttendee {
7
7
  response?: AttendeeResponse;
8
8
  optional?: boolean;
9
9
  }
10
+ /**
11
+ * An online meeting on the event. **Without a `joinUrl` it is a request**: the calendar's own
12
+ * provider creates its native meeting (Teams, Meet) and the next sync fills in the link — so the
13
+ * UI never has to know which provider hosts the calendar.
14
+ */
10
15
  export interface EventConferencing {
11
16
  provider: "teams" | "meet" | "zoom" | "other";
12
17
  joinUrl: string;
@@ -8,6 +8,8 @@ export interface Inbox {
8
8
  teamId?: string;
9
9
  ticketEnabled?: boolean;
10
10
  ticketPrefix?: string;
11
+ /** Last ticket number issued; server-owned. */
12
+ ticketCounter?: number;
11
13
  /**
12
14
  * Hours a first reply may take in this inbox before a conversation counts as at risk.
13
15
  *
@@ -58,12 +58,6 @@ export interface InteractionSource {
58
58
  externalId?: string;
59
59
  };
60
60
  }
61
- export interface InteractionLink {
62
- url?: string;
63
- providerId?: string;
64
- externalId?: string;
65
- title: string;
66
- }
67
61
  export interface Interaction {
68
62
  id: string;
69
63
  organizationId: string;
@@ -116,7 +110,6 @@ export interface Interaction {
116
110
  partyKeys?: string[];
117
111
  source?: InteractionSource;
118
112
  tags: string[];
119
- links: InteractionLink[];
120
113
  externalIds?: string[];
121
114
  collaborators: string[];
122
115
  seenBy?: string[];
@@ -133,16 +126,6 @@ export interface Interaction {
133
126
  * analytics metric (firstResponseAt - createdAt). Absent = no reply yet.
134
127
  */
135
128
  firstResponseAt?: number;
136
- /**
137
- * Provider-side folder this thread is archived under (mail). Set by the sync (folder membership
138
- * of already-engaged threads) and by `folder.move`. Drives the Folders nav filter and the two-way
139
- * move. Absent = not in a specific folder (or a provider without folder capability).
140
- */
141
- folderRef?: {
142
- channelId: string;
143
- folderId: string;
144
- name: string;
145
- };
146
129
  /**
147
130
  * Epoch ms until which the interaction is snoozed. While `snoozedTill > now` the interaction is
148
131
  * filtered out of the list (its status is then "snoozed"). A cron job wakes expired snoozes: sets