@opencxh/domain 1.75.0 → 1.81.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.
@@ -0,0 +1 @@
1
+ export * from './types';
@@ -0,0 +1,33 @@
1
+ import { Uri } from '../../platform/communication';
2
+ /** Kind of outbound message a draft will become when sent. */
3
+ export type DraftKind = "reply" | "forward";
4
+ export interface DraftRecipients {
5
+ to: Uri[];
6
+ cc?: Uri[];
7
+ bcc?: Uri[];
8
+ }
9
+ /**
10
+ * A shared, server-persisted message draft. Coupled to the activity it replies
11
+ * to (one draft per activity) so it surfaces on that message and can be resumed
12
+ * in the composer. Sending reuses the existing reply/compose flow; the draft is
13
+ * deleted afterwards. The AI assistant can also create/update drafts.
14
+ */
15
+ export interface Draft {
16
+ id: string;
17
+ organizationId: string;
18
+ interactionId: string;
19
+ /** The parent activity this draft replies to. Unique per activity. */
20
+ activityId: string;
21
+ kind: DraftKind;
22
+ /** Mailbox the draft will be sent from. */
23
+ channelId?: string;
24
+ /** Creator: a user id, or an assistant marker for AI-prepared drafts. */
25
+ authorId: string;
26
+ lastEditedBy: string;
27
+ subject?: string;
28
+ /** Sanitized HTML body. */
29
+ body: string;
30
+ recipients: DraftRecipients;
31
+ createdAt: number;
32
+ updatedAt: number;
33
+ }
@@ -86,6 +86,17 @@ export interface Interaction {
86
86
  updatedAt?: number;
87
87
  lastActivityAt?: number;
88
88
  lastActivityPreview?: ActivityPreview;
89
+ /**
90
+ * Provider-side folder waar deze thread onder gearchiveerd staat (mail).
91
+ * Gezet door de sync (folder-membership van already-engaged threads) en door
92
+ * `folder.move`. Drijft de Folders-nav-filter en de two-way move. Afwezig =
93
+ * niet in een specifieke folder (of provider zonder folder-capability).
94
+ */
95
+ folderRef?: {
96
+ channelId: string;
97
+ folderId: string;
98
+ name: string;
99
+ };
89
100
  /**
90
101
  * Epoch-ms tot wanneer de interactie gesnoozed is. Zolang `snoozedTill > now`
91
102
  * wordt de interactie uit de lijst gefilterd (status is dan "snoozed"). Een
@@ -11,6 +11,8 @@ export interface Task {
11
11
  id: string;
12
12
  organizationId: string;
13
13
  ownerScope: OwnerScope;
14
+ /** Parent task id when this is a subtask. Subtasks are exactly one level deep. */
15
+ parentId?: string;
14
16
  title: string;
15
17
  description?: string;
16
18
  status: TaskStatus;
package/dist/index.cjs CHANGED
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const l=140;function i(e){return e.replace(/<style[\s\S]*?<\/style>/gi," ").replace(/<script[\s\S]*?<\/script>/gi," ").replace(/<[^>]+>/g," ").replace(/&nbsp;/g," ").replace(/&amp;/g,"&").replace(/&lt;/g,"<").replace(/&gt;/g,">").replace(/&quot;/g,'"').replace(/&#39;/g,"'").replace(/\s+/g," ").trim()}function A(e){const t=e.trim();return t.length<=l?t:t.slice(0,l-1).trimEnd()+"…"}function E(e){if(!e||e<0)return"";const t=Math.floor(e/60),n=Math.floor(e%60);return`${t}:${n.toString().padStart(2,"0")}`}function I(e){switch(e.type){case"EMAIL_RECEIVED":case"EMAIL_SENT":{const t=e.payload,n=t.bodySnippet?.trim()||i(t.body??"");return t.subject?`${t.subject} — ${n}`:n}case"CHAT_MESSAGE_SENT":case"CHAT_MESSAGE_RECEIVED":return e.payload.text??"";case"CHAT_RENAMED":return`Hernoemd naar "${e.payload.newName}"`;case"CHAT_MEMBER_JOINED":return`${e.payload.members.map(t=>t.name).join(", ")} toegevoegd`;case"CHAT_MEMBER_LEFT":return`${e.payload.members.map(t=>t.name).join(", ")} verlaten`;case"CHAT_CALL_STARTED":return"Gesprek gestart";case"CHAT_CALL_ENDED":return`Gesprek beëindigd${e.payload.duration?` (${E(e.payload.duration)})`:""}`;case"CHAT_EVENT":return e.payload.text??e.payload.eventType;case"VOICE_CALL_STARTED":case"VIDEO_CALL_STARTED":return"Gesprek gestart";case"VOICE_CALL_ANSWERED":case"VIDEO_CALL_ANSWERED":return"Gesprek aangenomen";case"VOICE_CALL_HOLD":case"VIDEO_CALL_HOLD":return"In de wacht";case"VOICE_CALL_UNHOLD":case"VIDEO_CALL_UNHOLD":return"Hervat";case"VOICE_CALL_ENDED":case"VIDEO_CALL_ENDED":return`Gesprek beëindigd${e.payload.duration?` (${E(e.payload.duration)})`:""}`;case"VOICE_CALL_MISSED":case"VIDEO_CALL_MISSED":return"Gemiste oproep";case"VOICE_CALL_FAILED":case"VIDEO_CALL_FAILED":return"Gesprek mislukt";case"VOICE_CALL_VOICEMAIL":return e.payload.transcription?.trim()?e.payload.transcription:"Voicemail ontvangen";case"TRANSCRIPT_ADDED":return(e.payload.segments??[]).map(t=>t.text).join(" ");case"AI_MESSAGE_ADDED":return e.payload.output?.text??e.payload.input?.text??"";case"MEETING_SCHEDULED":return`Vergadering gepland: ${e.payload.title}`;case"MEETING_STARTED":return`Vergadering gestart: ${e.payload.title}`;case"MEETING_ENDED":return`Vergadering beëindigd${e.payload.duration?` (${E(e.payload.duration)})`:""}`;case"MEETING_PARTICIPANT_JOINED":return`${e.payload.name} deelgenomen`;case"MEETING_PARTICIPANT_LEFT":return`${e.payload.name} verlaten`;case"COMMENT_ADDED":return e.payload.text??"";case"FILE_UPLOADED":return`Bestand: ${e.payload.fileName}`;case"INTERACTION_CREATED":return"Interactie aangemaakt";case"INTERACTION_STATUS_CHANGED":return`Status: ${e.payload.fromStatus} → ${e.payload.toStatus}`;case"INTERACTION_ASSIGNED":return"Interactie toegewezen";default:return""}}function T(e){return{activityId:e.id,type:e.type,snippet:A(I(e)),authorName:e.author?.name??"",direction:e.direction,createdAt:e.createdAt??Date.now()}}function _(e,t){const n=e.settings?.signatures?.[t];return!n||!n.enabled||!n.body||n.body.trim()===""?null:n}function g(e){return e.endpoints??[]}const f=e=>!!e.assignedUserId||!!e.assignedInboxId,D=e=>e.status==="closed",S=e=>({urgent:10,high:5,normal:2,low:1})[e.priority]||0,L=(e,t=30)=>e.title?.length<=t?e.title:`${e.title.substring(0,t)}...`;function C(e,t){return e.lastActivityAt?!(e.seenBy??[]).includes(t):!1}function u(e,t){const n=new Set(e.disabledIntents??[]),r=e.intentOverrides??{},s=t.intents.filter(a=>!n.has(a.intent)).map(a=>R(a,r[a.intent]));if(!e.extraIntents||e.extraIntents.length===0)return s;const o=new Set(s.map(a=>a.intent));for(const a of e.extraIntents)o.has(a.intent)||(s.push(a),o.add(a.intent));return s}function p(e,t){const n={};for(const r of e.intents){if(!r.togglable)continue;const s=t?.[r.intent];n[r.intent]=s??r.defaultEnabled??!0}return n}function N(e,t){const n=p(e,t);return Object.entries(n).filter(([,r])=>!r).map(([r])=>r)}function R(e,t){return t?{intent:t.intent??e.intent,targetSchemes:t.targetSchemes??e.targetSchemes,transport:t.transport??e.transport}:e}function O(e,t){const n=[];for(const r of e){if(!r.enabled)continue;const s=t[r.providerId];if(s)for(const o of u(r,s))n.push({channel:r,description:s,capability:o})}return n}function b(e,t){return t.filter(n=>n.capability.intent===e)}function d(e,t){return t.filter(n=>n.capability.targetSchemes.includes(e))}function M(e,t){return d(e.scheme,t)}function P(e,t,n){const r=[];for(const s of e)for(const o of n)o.capability.intent===t&&o.capability.targetSchemes.includes(s.scheme)&&r.push({channelIntent:o,endpoint:s});return r}var c=(e=>(e.MAILTO="mailto",e.SIP="sip",e.TEL="tel",e.WEBHOOK="webhook",e.USERNAME="username",e.ID="id",e.CUSTOM="custom",e.URL="url",e.TELEGRAM="telegram",e.WHATSAPP="whatsapp",e.MESSENGER="messenger",e.INSTAGRAM="instagram",e.VIBER="viber",e.SMS="sms",e.FAX="fax",e.TEAMS="teams",e.CALENDAR="calendar",e))(c||{});const V="message_window",y="message_templates",G={FROM:"from",TO:"to",CC:"cc",BCC:"bcc",ORGANIZER:"organizer",PRESENTER:"presenter",ATTENDEE:"attendee",OWNER:"owner",MEMBER:"member",GUEST:"guest",HOST:"host",PARTICIPANT:"participant"},m=(e,t)=>({intent:e,...t}),U={ok:!1,code:"UNSUPPORTED",message:"Provider does not support this op"},H="installation-id";exports.CommunicationScheme=c;exports.INSTALLATION_HEADER=H;exports.InteractionParticipantRole=G;exports.PROVIDER_FEATURE_MESSAGE_TEMPLATES=y;exports.PROVIDER_FEATURE_MESSAGE_WINDOW=V;exports.UNSUPPORTED=U;exports.buildActivityPreview=T;exports.buildChannelIntents=O;exports.defineIntent=m;exports.disabledIntentsFromCapabilities=N;exports.filterByEndpoint=M;exports.filterByIntent=b;exports.filterByTargetScheme=d;exports.getContactEndpoints=g;exports.getShortTitle=L;exports.getUrgencyScore=S;exports.isAssigned=f;exports.isClosed=D;exports.isInteractionUnseen=C;exports.matchContactToIntents=P;exports.resolveAccountCapabilities=p;exports.resolveChannelIntents=u;exports.resolveSignature=_;exports.stripHtml=i;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const l=140;function i(e){return e.replace(/<style[\s\S]*?<\/style>/gi," ").replace(/<script[\s\S]*?<\/script>/gi," ").replace(/<[^>]+>/g," ").replace(/&nbsp;/g," ").replace(/&amp;/g,"&").replace(/&lt;/g,"<").replace(/&gt;/g,">").replace(/&quot;/g,'"').replace(/&#39;/g,"'").replace(/\s+/g," ").trim()}function A(e){const t=e.trim();return t.length<=l?t:t.slice(0,l-1).trimEnd()+"…"}function E(e){if(!e||e<0)return"";const t=Math.floor(e/60),n=Math.floor(e%60);return`${t}:${n.toString().padStart(2,"0")}`}function I(e){switch(e.type){case"EMAIL_RECEIVED":case"EMAIL_SENT":{const t=e.payload,n=t.bodySnippet?.trim()||i(t.body??"");return t.subject?`${t.subject} — ${n}`:n}case"CHAT_MESSAGE_SENT":case"CHAT_MESSAGE_RECEIVED":return e.payload.text??"";case"CHAT_RENAMED":return`Hernoemd naar "${e.payload.newName}"`;case"CHAT_MEMBER_JOINED":return`${e.payload.members.map(t=>t.name).join(", ")} toegevoegd`;case"CHAT_MEMBER_LEFT":return`${e.payload.members.map(t=>t.name).join(", ")} verlaten`;case"CHAT_CALL_STARTED":return"Gesprek gestart";case"CHAT_CALL_ENDED":return`Gesprek beëindigd${e.payload.duration?` (${E(e.payload.duration)})`:""}`;case"CHAT_EVENT":return e.payload.text??e.payload.eventType;case"VOICE_CALL_STARTED":case"VIDEO_CALL_STARTED":return"Gesprek gestart";case"VOICE_CALL_ANSWERED":case"VIDEO_CALL_ANSWERED":return"Gesprek aangenomen";case"VOICE_CALL_HOLD":case"VIDEO_CALL_HOLD":return"In de wacht";case"VOICE_CALL_UNHOLD":case"VIDEO_CALL_UNHOLD":return"Hervat";case"VOICE_CALL_ENDED":case"VIDEO_CALL_ENDED":return`Gesprek beëindigd${e.payload.duration?` (${E(e.payload.duration)})`:""}`;case"VOICE_CALL_MISSED":case"VIDEO_CALL_MISSED":return"Gemiste oproep";case"VOICE_CALL_FAILED":case"VIDEO_CALL_FAILED":return"Gesprek mislukt";case"VOICE_CALL_VOICEMAIL":return e.payload.transcription?.trim()?e.payload.transcription:"Voicemail ontvangen";case"TRANSCRIPT_ADDED":return(e.payload.segments??[]).map(t=>t.text).join(" ");case"AI_MESSAGE_ADDED":return e.payload.output?.text??e.payload.input?.text??"";case"MEETING_SCHEDULED":return`Vergadering gepland: ${e.payload.title}`;case"MEETING_STARTED":return`Vergadering gestart: ${e.payload.title}`;case"MEETING_ENDED":return`Vergadering beëindigd${e.payload.duration?` (${E(e.payload.duration)})`:""}`;case"MEETING_PARTICIPANT_JOINED":return`${e.payload.name} deelgenomen`;case"MEETING_PARTICIPANT_LEFT":return`${e.payload.name} verlaten`;case"COMMENT_ADDED":return e.payload.text??"";case"FILE_UPLOADED":return`Bestand: ${e.payload.fileName}`;case"INTERACTION_CREATED":return"Interactie aangemaakt";case"INTERACTION_STATUS_CHANGED":return`Status: ${e.payload.fromStatus} → ${e.payload.toStatus}`;case"INTERACTION_ASSIGNED":return"Interactie toegewezen";default:return""}}function T(e){return{activityId:e.id,type:e.type,snippet:A(I(e)),authorName:e.author?.name??"",direction:e.direction,createdAt:e.createdAt??Date.now()}}function _(e,t){const n=e.settings?.signatures?.[t];return!n||!n.enabled||!n.body||n.body.trim()===""?null:n}function g(e){return e.endpoints??[]}const D=e=>!!e.assignedUserId||!!e.assignedInboxId,f=e=>e.status==="closed",S=e=>({urgent:10,high:5,normal:2,low:1})[e.priority]||0,L=(e,t=30)=>e.title?.length<=t?e.title:`${e.title.substring(0,t)}...`;function N(e,t){return e.lastActivityAt?!(e.seenBy??[]).includes(t):!1}function u(e,t){const n=new Set(e.disabledIntents??[]),r=e.intentOverrides??{},s=t.intents.filter(a=>!n.has(a.intent)).map(a=>C(a,r[a.intent]));if(!e.extraIntents||e.extraIntents.length===0)return s;const o=new Set(s.map(a=>a.intent));for(const a of e.extraIntents)o.has(a.intent)||(s.push(a),o.add(a.intent));return s}function d(e,t){const n={};for(const r of e.intents){if(!r.togglable)continue;const s=t?.[r.intent];n[r.intent]=s??r.defaultEnabled??!0}return n}function R(e,t){const n=d(e,t);return Object.entries(n).filter(([,r])=>!r).map(([r])=>r)}function C(e,t){return t?{intent:t.intent??e.intent,targetSchemes:t.targetSchemes??e.targetSchemes,transport:t.transport??e.transport}:e}function O(e,t){const n=[];for(const r of e){if(!r.enabled)continue;const s=t[r.providerId];if(s)for(const o of u(r,s))n.push({channel:r,description:s,capability:o})}return n}function M(e,t){return t.filter(n=>n.capability.intent===e)}function p(e,t){return t.filter(n=>n.capability.targetSchemes.includes(e))}function b(e,t){return p(e.scheme,t)}function P(e,t,n){const r=[];for(const s of e)for(const o of n)o.capability.intent===t&&o.capability.targetSchemes.includes(s.scheme)&&r.push({channelIntent:o,endpoint:s});return r}var c=(e=>(e.MAILTO="mailto",e.SIP="sip",e.TEL="tel",e.WEBHOOK="webhook",e.USERNAME="username",e.ID="id",e.CUSTOM="custom",e.URL="url",e.TELEGRAM="telegram",e.WHATSAPP="whatsapp",e.MESSENGER="messenger",e.INSTAGRAM="instagram",e.VIBER="viber",e.SMS="sms",e.FAX="fax",e.TEAMS="teams",e.CALENDAR="calendar",e))(c||{});const G="message_window",V="message_templates",y={FROM:"from",TO:"to",CC:"cc",BCC:"bcc",ORGANIZER:"organizer",PRESENTER:"presenter",ATTENDEE:"attendee",OWNER:"owner",MEMBER:"member",GUEST:"guest",HOST:"host",PARTICIPANT:"participant"},m=(e,t)=>({intent:e,...t}),U="folder_management",H={ok:!1,code:"UNSUPPORTED",message:"Provider does not support this op"},h="installation-id";exports.CommunicationScheme=c;exports.FEATURE_FOLDER_MANAGEMENT=U;exports.INSTALLATION_HEADER=h;exports.InteractionParticipantRole=y;exports.PROVIDER_FEATURE_MESSAGE_TEMPLATES=V;exports.PROVIDER_FEATURE_MESSAGE_WINDOW=G;exports.UNSUPPORTED=H;exports.buildActivityPreview=T;exports.buildChannelIntents=O;exports.defineIntent=m;exports.disabledIntentsFromCapabilities=R;exports.filterByEndpoint=b;exports.filterByIntent=M;exports.filterByTargetScheme=p;exports.getContactEndpoints=g;exports.getShortTitle=L;exports.getUrgencyScore=S;exports.isAssigned=D;exports.isClosed=f;exports.isInteractionUnseen=N;exports.matchContactToIntents=P;exports.resolveAccountCapabilities=d;exports.resolveChannelIntents=u;exports.resolveSignature=_;exports.stripHtml=i;
package/dist/index.d.ts CHANGED
@@ -10,6 +10,7 @@ export * from './entities/channel';
10
10
  export * from './entities/communication';
11
11
  export * from './entities/contact';
12
12
  export * from './entities/calendar-event';
13
+ export * from './entities/draft';
13
14
  export * from './entities/inbox';
14
15
  export * from './entities/interaction';
15
16
  export * from './entities/task';
package/dist/index.js CHANGED
@@ -126,7 +126,7 @@ function c(e, t) {
126
126
  }
127
127
  return n;
128
128
  }
129
- function C(e, t) {
129
+ function R(e, t) {
130
130
  const n = c(e, t);
131
131
  return Object.entries(n).filter(([, r]) => !r).map(([r]) => r);
132
132
  }
@@ -137,7 +137,7 @@ function A(e, t) {
137
137
  transport: t.transport ?? e.transport
138
138
  } : e;
139
139
  }
140
- function O(e, t) {
140
+ function C(e, t) {
141
141
  const n = [];
142
142
  for (const r of e) {
143
143
  if (!r.enabled) continue;
@@ -148,7 +148,7 @@ function O(e, t) {
148
148
  }
149
149
  return n;
150
150
  }
151
- function R(e, t) {
151
+ function O(e, t) {
152
152
  return t.filter((n) => n.capability.intent === e);
153
153
  }
154
154
  function i(e, t) {
@@ -182,20 +182,21 @@ const P = "message_window", V = "message_templates", G = {
182
182
  // Voice/conference
183
183
  HOST: "host",
184
184
  PARTICIPANT: "participant"
185
- }, H = (e, t) => ({ intent: e, ...t }), $ = { ok: !1, code: "UNSUPPORTED", message: "Provider does not support this op" }, y = "installation-id";
185
+ }, H = (e, t) => ({ intent: e, ...t }), $ = "folder_management", y = { ok: !1, code: "UNSUPPORTED", message: "Provider does not support this op" }, U = "installation-id";
186
186
  export {
187
187
  I as CommunicationScheme,
188
- y as INSTALLATION_HEADER,
188
+ $ as FEATURE_FOLDER_MANAGEMENT,
189
+ U as INSTALLATION_HEADER,
189
190
  G as InteractionParticipantRole,
190
191
  V as PROVIDER_FEATURE_MESSAGE_TEMPLATES,
191
192
  P as PROVIDER_FEATURE_MESSAGE_WINDOW,
192
- $ as UNSUPPORTED,
193
+ y as UNSUPPORTED,
193
194
  _ as buildActivityPreview,
194
- O as buildChannelIntents,
195
+ C as buildChannelIntents,
195
196
  H as defineIntent,
196
- C as disabledIntentsFromCapabilities,
197
+ R as disabledIntentsFromCapabilities,
197
198
  M as filterByEndpoint,
198
- R as filterByIntent,
199
+ O as filterByIntent,
199
200
  i as filterByTargetScheme,
200
201
  g as getContactEndpoints,
201
202
  N as getShortTitle,
@@ -432,7 +432,66 @@ export type ServerOp = {
432
432
  kind: "contact.fetch";
433
433
  channelId: string;
434
434
  externalId: string;
435
+ } | {
436
+ kind: "folder.list";
437
+ channelId: string;
438
+ } | {
439
+ kind: "folder.messages";
440
+ channelId: string;
441
+ folderId: string;
442
+ cursor?: string;
443
+ limit?: number;
444
+ } | {
445
+ kind: "folder.import";
446
+ channelId: string;
447
+ externalThreadId: string;
448
+ folderId?: string;
449
+ folderName?: string;
450
+ } | {
451
+ kind: "folder.move";
452
+ channelId: string;
453
+ interactionId: string;
454
+ folderId: string;
455
+ folderName?: string;
435
456
  };
457
+ /**
458
+ * Folder-DTO's — transport-shapes voor de generieke folder-capability.
459
+ * Bewust géén persisted entities: de folder-tree en previews worden live
460
+ * bij de provider opgehaald (TTL-cached client-side), nooit bulk-opgeslagen.
461
+ * Providers mappen hun eigen model hierop: Outlook `mailFolders`,
462
+ * Gmail `labels`, IMAP `folders`.
463
+ */
464
+ export interface FolderNode {
465
+ id: string;
466
+ name: string;
467
+ parentId?: string;
468
+ unreadCount?: number;
469
+ kind?: "system" | "user";
470
+ }
471
+ export interface FolderMessagePreview {
472
+ externalThreadId: string;
473
+ externalMessageId: string;
474
+ subject: string;
475
+ from: {
476
+ email: string;
477
+ name?: string;
478
+ };
479
+ receivedAt: number;
480
+ snippet: string;
481
+ hasAttachments: boolean;
482
+ unread?: boolean;
483
+ }
484
+ export interface FolderMessagePage {
485
+ items: FolderMessagePreview[];
486
+ /** Opaque provider-cursor (bv. Graph `@odata.nextLink`). Afwezig = laatste pagina. */
487
+ nextCursor?: string;
488
+ }
489
+ /**
490
+ * Well-known `ProviderFeature.name` voor de folder-capability. Een provider die
491
+ * folder.list/messages/import/move ondersteunt zet `{ name: FEATURE_FOLDER_MANAGEMENT, value: true }`
492
+ * in `describe().features`; de client toont dan de Folders-nav voor dat channel.
493
+ */
494
+ export declare const FEATURE_FOLDER_MANAGEMENT = "folder_management";
436
495
  /**
437
496
  * Result-shape voor `IProvider.dispatch` en de comm-server `dispatchToProvider`-
438
497
  * helper. Discriminated op `ok`. Bewust niet strict-null-discriminated zodat
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@opencxh/domain",
3
- "version": "1.75.0",
3
+ "version": "1.81.0",
4
4
  "type": "module",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/index.js",