@opencxh/domain 1.76.0 → 1.82.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.
- package/dist/entities/draft/index.d.ts +1 -0
- package/dist/entities/draft/types.d.ts +33 -0
- package/dist/entities/interaction/types.d.ts +18 -0
- package/dist/index.cjs +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.js +11 -9
- package/dist/platform/api.d.ts +2 -0
- package/dist/platform/communication.d.ts +84 -0
- package/package.json +1 -1
|
@@ -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
|
+
}
|
|
@@ -15,6 +15,13 @@ export interface InteractionSearchQuery {
|
|
|
15
15
|
scheme?: string;
|
|
16
16
|
resource?: string;
|
|
17
17
|
};
|
|
18
|
+
/**
|
|
19
|
+
* Free-text term. Matched case-insensitively (substring) in-memory over the
|
|
20
|
+
* interaction's title, remoteParty/participants (resource + displayName),
|
|
21
|
+
* tags, ticketId and last-activity snippet — the datastore has no full-text
|
|
22
|
+
* operator, so `status`/`since` bound the scan first, then this filters.
|
|
23
|
+
*/
|
|
24
|
+
text?: string;
|
|
18
25
|
status?: string;
|
|
19
26
|
/** Only interactions with activity since this epoch-ms; null = no lower bound. */
|
|
20
27
|
since?: number | null;
|
|
@@ -86,6 +93,17 @@ export interface Interaction {
|
|
|
86
93
|
updatedAt?: number;
|
|
87
94
|
lastActivityAt?: number;
|
|
88
95
|
lastActivityPreview?: ActivityPreview;
|
|
96
|
+
/**
|
|
97
|
+
* Provider-side folder waar deze thread onder gearchiveerd staat (mail).
|
|
98
|
+
* Gezet door de sync (folder-membership van already-engaged threads) en door
|
|
99
|
+
* `folder.move`. Drijft de Folders-nav-filter en de two-way move. Afwezig =
|
|
100
|
+
* niet in een specifieke folder (of provider zonder folder-capability).
|
|
101
|
+
*/
|
|
102
|
+
folderRef?: {
|
|
103
|
+
channelId: string;
|
|
104
|
+
folderId: string;
|
|
105
|
+
name: string;
|
|
106
|
+
};
|
|
89
107
|
/**
|
|
90
108
|
* Epoch-ms tot wanneer de interactie gesnoozed is. Zolang `snoozedTill > now`
|
|
91
109
|
* wordt de interactie uit de lijst gefilterd (status is dan "snoozed"). Een
|
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(/ /g," ").replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,'"').replace(/'/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
|
|
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(/ /g," ").replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,'"').replace(/'/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,R=(e,t=30)=>e.title?.length<=t?e.title:`${e.title.substring(0,t)}...`;function L(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 c(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=c(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 d(e,t){return t.filter(n=>n.capability.targetSchemes.includes(e))}function b(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 p=(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))(p||{});const G="message_window",U="message_templates",V={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}),y="folder_management",H="remote_search",h={ok:!1,code:"UNSUPPORTED",message:"Provider does not support this op"},$="installation-id";exports.CommunicationScheme=p;exports.FEATURE_FOLDER_MANAGEMENT=y;exports.FEATURE_REMOTE_SEARCH=H;exports.INSTALLATION_HEADER=$;exports.InteractionParticipantRole=V;exports.PROVIDER_FEATURE_MESSAGE_TEMPLATES=U;exports.PROVIDER_FEATURE_MESSAGE_WINDOW=G;exports.UNSUPPORTED=h;exports.buildActivityPreview=T;exports.buildChannelIntents=O;exports.defineIntent=m;exports.disabledIntentsFromCapabilities=N;exports.filterByEndpoint=b;exports.filterByIntent=M;exports.filterByTargetScheme=d;exports.getContactEndpoints=g;exports.getShortTitle=R;exports.getUrgencyScore=S;exports.isAssigned=D;exports.isClosed=f;exports.isInteractionUnseen=L;exports.matchContactToIntents=P;exports.resolveAccountCapabilities=c;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
|
|
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
|
|
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
|
|
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,22 @@ 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" },
|
|
185
|
+
}, H = (e, t) => ({ intent: e, ...t }), $ = "folder_management", y = "remote_search", U = { ok: !1, code: "UNSUPPORTED", message: "Provider does not support this op" }, m = "installation-id";
|
|
186
186
|
export {
|
|
187
187
|
I as CommunicationScheme,
|
|
188
|
-
|
|
188
|
+
$ as FEATURE_FOLDER_MANAGEMENT,
|
|
189
|
+
y as FEATURE_REMOTE_SEARCH,
|
|
190
|
+
m as INSTALLATION_HEADER,
|
|
189
191
|
G as InteractionParticipantRole,
|
|
190
192
|
V as PROVIDER_FEATURE_MESSAGE_TEMPLATES,
|
|
191
193
|
P as PROVIDER_FEATURE_MESSAGE_WINDOW,
|
|
192
|
-
|
|
194
|
+
U as UNSUPPORTED,
|
|
193
195
|
_ as buildActivityPreview,
|
|
194
|
-
|
|
196
|
+
C as buildChannelIntents,
|
|
195
197
|
H as defineIntent,
|
|
196
|
-
|
|
198
|
+
R as disabledIntentsFromCapabilities,
|
|
197
199
|
M as filterByEndpoint,
|
|
198
|
-
|
|
200
|
+
O as filterByIntent,
|
|
199
201
|
i as filterByTargetScheme,
|
|
200
202
|
g as getContactEndpoints,
|
|
201
203
|
N as getShortTitle,
|
package/dist/platform/api.d.ts
CHANGED
|
@@ -432,7 +432,91 @@ export type ServerOp = {
|
|
|
432
432
|
kind: "contact.fetch";
|
|
433
433
|
channelId: string;
|
|
434
434
|
externalId: string;
|
|
435
|
+
} | {
|
|
436
|
+
kind: "mailbox.search";
|
|
437
|
+
channelId: string;
|
|
438
|
+
query: string;
|
|
439
|
+
cursor?: string;
|
|
440
|
+
limit?: number;
|
|
441
|
+
} | {
|
|
442
|
+
kind: "folder.list";
|
|
443
|
+
channelId: string;
|
|
444
|
+
} | {
|
|
445
|
+
kind: "folder.messages";
|
|
446
|
+
channelId: string;
|
|
447
|
+
folderId: string;
|
|
448
|
+
cursor?: string;
|
|
449
|
+
limit?: number;
|
|
450
|
+
} | {
|
|
451
|
+
kind: "folder.import";
|
|
452
|
+
channelId: string;
|
|
453
|
+
externalThreadId: string;
|
|
454
|
+
folderId?: string;
|
|
455
|
+
folderName?: string;
|
|
456
|
+
} | {
|
|
457
|
+
kind: "folder.move";
|
|
458
|
+
channelId: string;
|
|
459
|
+
interactionId: string;
|
|
460
|
+
folderId: string;
|
|
461
|
+
folderName?: string;
|
|
435
462
|
};
|
|
463
|
+
/**
|
|
464
|
+
* Folder-DTO's — transport-shapes voor de generieke folder-capability.
|
|
465
|
+
* Bewust géén persisted entities: de folder-tree en previews worden live
|
|
466
|
+
* bij de provider opgehaald (TTL-cached client-side), nooit bulk-opgeslagen.
|
|
467
|
+
* Providers mappen hun eigen model hierop: Outlook `mailFolders`,
|
|
468
|
+
* Gmail `labels`, IMAP `folders`.
|
|
469
|
+
*/
|
|
470
|
+
export interface FolderNode {
|
|
471
|
+
id: string;
|
|
472
|
+
name: string;
|
|
473
|
+
parentId?: string;
|
|
474
|
+
unreadCount?: number;
|
|
475
|
+
kind?: "system" | "user";
|
|
476
|
+
}
|
|
477
|
+
export interface FolderMessagePreview {
|
|
478
|
+
externalThreadId: string;
|
|
479
|
+
externalMessageId: string;
|
|
480
|
+
subject: string;
|
|
481
|
+
from: {
|
|
482
|
+
email: string;
|
|
483
|
+
name?: string;
|
|
484
|
+
};
|
|
485
|
+
receivedAt: number;
|
|
486
|
+
snippet: string;
|
|
487
|
+
hasAttachments: boolean;
|
|
488
|
+
unread?: boolean;
|
|
489
|
+
}
|
|
490
|
+
export interface FolderMessagePage {
|
|
491
|
+
items: FolderMessagePreview[];
|
|
492
|
+
/** Opaque provider-cursor (bv. Graph `@odata.nextLink`). Afwezig = laatste pagina. */
|
|
493
|
+
nextCursor?: string;
|
|
494
|
+
}
|
|
495
|
+
/**
|
|
496
|
+
* Een zoekbare externe bron (channel) voor de client-fan-out. Retourneerd door
|
|
497
|
+
* `GET /search/sources`: elke door de user toegankelijke, ingeschakelde channel
|
|
498
|
+
* waarvan de provider `FEATURE_REMOTE_SEARCH` declareert. De client vuurt per
|
|
499
|
+
* bron parallel een `POST /search/mailbox` af (non-blocking).
|
|
500
|
+
*/
|
|
501
|
+
export interface MailboxSearchSource {
|
|
502
|
+
channelId: string;
|
|
503
|
+
providerId: string;
|
|
504
|
+
displayName: string;
|
|
505
|
+
}
|
|
506
|
+
/**
|
|
507
|
+
* Well-known `ProviderFeature.name` voor de folder-capability. Een provider die
|
|
508
|
+
* folder.list/messages/import/move ondersteunt zet `{ name: FEATURE_FOLDER_MANAGEMENT, value: true }`
|
|
509
|
+
* in `describe().features`; de client toont dan de Folders-nav voor dat channel.
|
|
510
|
+
*/
|
|
511
|
+
export declare const FEATURE_FOLDER_MANAGEMENT = "folder_management";
|
|
512
|
+
/**
|
|
513
|
+
* Well-known `ProviderFeature.name` voor de remote-search-capability. Een provider
|
|
514
|
+
* die `mailbox.search` ondersteunt (de externe bron zelf doorzoeken, bv. Outlook
|
|
515
|
+
* Graph `$search` of IMAP `SEARCH`) zet `{ name: FEATURE_REMOTE_SEARCH, value: true }`
|
|
516
|
+
* in `describe().features`. De comm-server neemt de channels van zo'n provider mee
|
|
517
|
+
* in `GET /search/sources`; de client fan-out er parallel op via `POST /search/mailbox`.
|
|
518
|
+
*/
|
|
519
|
+
export declare const FEATURE_REMOTE_SEARCH = "remote_search";
|
|
436
520
|
/**
|
|
437
521
|
* Result-shape voor `IProvider.dispatch` en de comm-server `dispatchToProvider`-
|
|
438
522
|
* helper. Discriminated op `ok`. Bewust niet strict-null-discriminated zodat
|