@iveri/contracts 0.6.0 → 0.8.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/README.md +30 -6
- package/dist/cjs/api/identity/access-token-payload.interface.d.ts +53 -0
- package/dist/cjs/api/identity/access-token-payload.interface.d.ts.map +1 -0
- package/dist/cjs/api/identity/access-token-payload.interface.js +3 -0
- package/dist/cjs/api/identity/access-token-payload.interface.js.map +1 -0
- package/dist/cjs/api/identity/auth.type.d.ts +21 -0
- package/dist/cjs/api/identity/auth.type.d.ts.map +1 -1
- package/dist/cjs/api/identity/index.d.ts +2 -0
- package/dist/cjs/api/identity/index.d.ts.map +1 -1
- package/dist/cjs/api/identity/index.js +2 -0
- package/dist/cjs/api/identity/index.js.map +1 -1
- package/dist/cjs/api/identity/principal-type.enum.d.ts +19 -0
- package/dist/cjs/api/identity/principal-type.enum.d.ts.map +1 -0
- package/dist/cjs/api/identity/principal-type.enum.js +23 -0
- package/dist/cjs/api/identity/principal-type.enum.js.map +1 -0
- package/dist/cjs/api/unibox/canned-reply.type.d.ts +49 -0
- package/dist/cjs/api/unibox/canned-reply.type.d.ts.map +1 -0
- package/dist/cjs/api/unibox/canned-reply.type.js +3 -0
- package/dist/cjs/api/unibox/canned-reply.type.js.map +1 -0
- package/dist/cjs/api/unibox/channel-platform.enum.d.ts +32 -0
- package/dist/cjs/api/unibox/channel-platform.enum.d.ts.map +1 -0
- package/dist/cjs/api/unibox/channel-platform.enum.js +36 -0
- package/dist/cjs/api/unibox/channel-platform.enum.js.map +1 -0
- package/dist/cjs/api/unibox/channel.type.d.ts +110 -0
- package/dist/cjs/api/unibox/channel.type.d.ts.map +1 -0
- package/dist/cjs/api/unibox/channel.type.js +3 -0
- package/dist/cjs/api/unibox/channel.type.js.map +1 -0
- package/dist/cjs/api/unibox/contact.type.d.ts +102 -0
- package/dist/cjs/api/unibox/contact.type.d.ts.map +1 -0
- package/dist/cjs/api/unibox/contact.type.js +3 -0
- package/dist/cjs/api/unibox/contact.type.js.map +1 -0
- package/dist/cjs/api/unibox/conversation-status.enum.d.ts +39 -0
- package/dist/cjs/api/unibox/conversation-status.enum.d.ts.map +1 -0
- package/dist/cjs/api/unibox/conversation-status.enum.js +43 -0
- package/dist/cjs/api/unibox/conversation-status.enum.js.map +1 -0
- package/dist/cjs/api/unibox/conversation.type.d.ts +134 -0
- package/dist/cjs/api/unibox/conversation.type.d.ts.map +1 -0
- package/dist/cjs/api/unibox/conversation.type.js +3 -0
- package/dist/cjs/api/unibox/conversation.type.js.map +1 -0
- package/dist/cjs/api/unibox/index.d.ts +13 -0
- package/dist/cjs/api/unibox/index.d.ts.map +1 -0
- package/dist/cjs/api/unibox/index.js +29 -0
- package/dist/cjs/api/unibox/index.js.map +1 -0
- package/dist/cjs/api/unibox/message-author-type.enum.d.ts +26 -0
- package/dist/cjs/api/unibox/message-author-type.enum.d.ts.map +1 -0
- package/dist/cjs/api/unibox/message-author-type.enum.js +30 -0
- package/dist/cjs/api/unibox/message-author-type.enum.js.map +1 -0
- package/dist/cjs/api/unibox/message-content-type.enum.d.ts +29 -0
- package/dist/cjs/api/unibox/message-content-type.enum.d.ts.map +1 -0
- package/dist/cjs/api/unibox/message-content-type.enum.js +33 -0
- package/dist/cjs/api/unibox/message-content-type.enum.js.map +1 -0
- package/dist/cjs/api/unibox/message-direction.enum.d.ts +23 -0
- package/dist/cjs/api/unibox/message-direction.enum.d.ts.map +1 -0
- package/dist/cjs/api/unibox/message-direction.enum.js +27 -0
- package/dist/cjs/api/unibox/message-direction.enum.js.map +1 -0
- package/dist/cjs/api/unibox/message-status.enum.d.ts +40 -0
- package/dist/cjs/api/unibox/message-status.enum.d.ts.map +1 -0
- package/dist/cjs/api/unibox/message-status.enum.js +44 -0
- package/dist/cjs/api/unibox/message-status.enum.js.map +1 -0
- package/dist/cjs/api/unibox/message.type.d.ts +120 -0
- package/dist/cjs/api/unibox/message.type.d.ts.map +1 -0
- package/dist/cjs/api/unibox/message.type.js +3 -0
- package/dist/cjs/api/unibox/message.type.js.map +1 -0
- package/dist/cjs/api/unibox/team.type.d.ts +50 -0
- package/dist/cjs/api/unibox/team.type.d.ts.map +1 -0
- package/dist/cjs/api/unibox/team.type.js +3 -0
- package/dist/cjs/api/unibox/team.type.js.map +1 -0
- package/dist/cjs/enum/user-permission.enum.d.ts +48 -1
- package/dist/cjs/enum/user-permission.enum.d.ts.map +1 -1
- package/dist/cjs/enum/user-permission.enum.js +54 -0
- package/dist/cjs/enum/user-permission.enum.js.map +1 -1
- package/dist/esm/api/identity/access-token-payload.interface.d.ts +53 -0
- package/dist/esm/api/identity/access-token-payload.interface.d.ts.map +1 -0
- package/dist/esm/api/identity/access-token-payload.interface.js +2 -0
- package/dist/esm/api/identity/access-token-payload.interface.js.map +1 -0
- package/dist/esm/api/identity/auth.type.d.ts +21 -0
- package/dist/esm/api/identity/auth.type.d.ts.map +1 -1
- package/dist/esm/api/identity/index.d.ts +2 -0
- package/dist/esm/api/identity/index.d.ts.map +1 -1
- package/dist/esm/api/identity/index.js +2 -0
- package/dist/esm/api/identity/index.js.map +1 -1
- package/dist/esm/api/identity/principal-type.enum.d.ts +19 -0
- package/dist/esm/api/identity/principal-type.enum.d.ts.map +1 -0
- package/dist/esm/api/identity/principal-type.enum.js +20 -0
- package/dist/esm/api/identity/principal-type.enum.js.map +1 -0
- package/dist/esm/api/unibox/canned-reply.type.d.ts +49 -0
- package/dist/esm/api/unibox/canned-reply.type.d.ts.map +1 -0
- package/dist/esm/api/unibox/canned-reply.type.js +2 -0
- package/dist/esm/api/unibox/canned-reply.type.js.map +1 -0
- package/dist/esm/api/unibox/channel-platform.enum.d.ts +32 -0
- package/dist/esm/api/unibox/channel-platform.enum.d.ts.map +1 -0
- package/dist/esm/api/unibox/channel-platform.enum.js +33 -0
- package/dist/esm/api/unibox/channel-platform.enum.js.map +1 -0
- package/dist/esm/api/unibox/channel.type.d.ts +110 -0
- package/dist/esm/api/unibox/channel.type.d.ts.map +1 -0
- package/dist/esm/api/unibox/channel.type.js +2 -0
- package/dist/esm/api/unibox/channel.type.js.map +1 -0
- package/dist/esm/api/unibox/contact.type.d.ts +102 -0
- package/dist/esm/api/unibox/contact.type.d.ts.map +1 -0
- package/dist/esm/api/unibox/contact.type.js +2 -0
- package/dist/esm/api/unibox/contact.type.js.map +1 -0
- package/dist/esm/api/unibox/conversation-status.enum.d.ts +39 -0
- package/dist/esm/api/unibox/conversation-status.enum.d.ts.map +1 -0
- package/dist/esm/api/unibox/conversation-status.enum.js +40 -0
- package/dist/esm/api/unibox/conversation-status.enum.js.map +1 -0
- package/dist/esm/api/unibox/conversation.type.d.ts +134 -0
- package/dist/esm/api/unibox/conversation.type.d.ts.map +1 -0
- package/dist/esm/api/unibox/conversation.type.js +2 -0
- package/dist/esm/api/unibox/conversation.type.js.map +1 -0
- package/dist/esm/api/unibox/index.d.ts +13 -0
- package/dist/esm/api/unibox/index.d.ts.map +1 -0
- package/dist/esm/api/unibox/index.js +13 -0
- package/dist/esm/api/unibox/index.js.map +1 -0
- package/dist/esm/api/unibox/message-author-type.enum.d.ts +26 -0
- package/dist/esm/api/unibox/message-author-type.enum.d.ts.map +1 -0
- package/dist/esm/api/unibox/message-author-type.enum.js +27 -0
- package/dist/esm/api/unibox/message-author-type.enum.js.map +1 -0
- package/dist/esm/api/unibox/message-content-type.enum.d.ts +29 -0
- package/dist/esm/api/unibox/message-content-type.enum.d.ts.map +1 -0
- package/dist/esm/api/unibox/message-content-type.enum.js +30 -0
- package/dist/esm/api/unibox/message-content-type.enum.js.map +1 -0
- package/dist/esm/api/unibox/message-direction.enum.d.ts +23 -0
- package/dist/esm/api/unibox/message-direction.enum.d.ts.map +1 -0
- package/dist/esm/api/unibox/message-direction.enum.js +24 -0
- package/dist/esm/api/unibox/message-direction.enum.js.map +1 -0
- package/dist/esm/api/unibox/message-status.enum.d.ts +40 -0
- package/dist/esm/api/unibox/message-status.enum.d.ts.map +1 -0
- package/dist/esm/api/unibox/message-status.enum.js +41 -0
- package/dist/esm/api/unibox/message-status.enum.js.map +1 -0
- package/dist/esm/api/unibox/message.type.d.ts +120 -0
- package/dist/esm/api/unibox/message.type.d.ts.map +1 -0
- package/dist/esm/api/unibox/message.type.js +2 -0
- package/dist/esm/api/unibox/message.type.js.map +1 -0
- package/dist/esm/api/unibox/team.type.d.ts +50 -0
- package/dist/esm/api/unibox/team.type.d.ts.map +1 -0
- package/dist/esm/api/unibox/team.type.js +2 -0
- package/dist/esm/api/unibox/team.type.js.map +1 -0
- package/dist/esm/enum/user-permission.enum.d.ts +48 -1
- package/dist/esm/enum/user-permission.enum.d.ts.map +1 -1
- package/dist/esm/enum/user-permission.enum.js +54 -0
- package/dist/esm/enum/user-permission.enum.js.map +1 -1
- package/package.json +9 -1
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* What kind of thing a message carries.
|
|
3
|
+
*
|
|
4
|
+
* A small closed set that every platform can be normalized into, rather than a union of what each
|
|
5
|
+
* one supports. A per-platform vocabulary would put "is this an Instagram story reply or a
|
|
6
|
+
* WhatsApp interactive button" in front of the inbox UI, and the inbox's whole promise is that it
|
|
7
|
+
* does not care.
|
|
8
|
+
*/
|
|
9
|
+
export declare enum MessageContentType {
|
|
10
|
+
TEXT = "text",
|
|
11
|
+
IMAGE = "image",
|
|
12
|
+
VIDEO = "video",
|
|
13
|
+
AUDIO = "audio",
|
|
14
|
+
/** A file — PDF, spreadsheet, anything not one of the media types above. */
|
|
15
|
+
DOCUMENT = "document",
|
|
16
|
+
LOCATION = "location",
|
|
17
|
+
/** A sticker or a bare emoji reaction, kept distinct so it can be rendered small. */
|
|
18
|
+
STICKER = "sticker",
|
|
19
|
+
/**
|
|
20
|
+
* Something arrived that this version cannot represent.
|
|
21
|
+
*
|
|
22
|
+
* **A first-class member, not an error.** A message we cannot render is still evidence that
|
|
23
|
+
* the contact said something, and dropping it leaves an agent replying to a gap. The raw
|
|
24
|
+
* provider payload is retained on the message so the same row can be re-read once a
|
|
25
|
+
* normalizer learns the type.
|
|
26
|
+
*/
|
|
27
|
+
UNSUPPORTED = "unsupported"
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=message-content-type.enum.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"message-content-type.enum.d.ts","sourceRoot":"","sources":["../../../../src/api/unibox/message-content-type.enum.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,oBAAY,kBAAkB;IAC1B,IAAI,SAAS;IACb,KAAK,UAAU;IACf,KAAK,UAAU;IACf,KAAK,UAAU;IACf,4EAA4E;IAC5E,QAAQ,aAAa;IACrB,QAAQ,aAAa;IACrB,qFAAqF;IACrF,OAAO,YAAY;IAEnB;;;;;;;OAOG;IACH,WAAW,gBAAgB;CAC9B"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* What kind of thing a message carries.
|
|
3
|
+
*
|
|
4
|
+
* A small closed set that every platform can be normalized into, rather than a union of what each
|
|
5
|
+
* one supports. A per-platform vocabulary would put "is this an Instagram story reply or a
|
|
6
|
+
* WhatsApp interactive button" in front of the inbox UI, and the inbox's whole promise is that it
|
|
7
|
+
* does not care.
|
|
8
|
+
*/
|
|
9
|
+
export var MessageContentType;
|
|
10
|
+
(function (MessageContentType) {
|
|
11
|
+
MessageContentType["TEXT"] = "text";
|
|
12
|
+
MessageContentType["IMAGE"] = "image";
|
|
13
|
+
MessageContentType["VIDEO"] = "video";
|
|
14
|
+
MessageContentType["AUDIO"] = "audio";
|
|
15
|
+
/** A file — PDF, spreadsheet, anything not one of the media types above. */
|
|
16
|
+
MessageContentType["DOCUMENT"] = "document";
|
|
17
|
+
MessageContentType["LOCATION"] = "location";
|
|
18
|
+
/** A sticker or a bare emoji reaction, kept distinct so it can be rendered small. */
|
|
19
|
+
MessageContentType["STICKER"] = "sticker";
|
|
20
|
+
/**
|
|
21
|
+
* Something arrived that this version cannot represent.
|
|
22
|
+
*
|
|
23
|
+
* **A first-class member, not an error.** A message we cannot render is still evidence that
|
|
24
|
+
* the contact said something, and dropping it leaves an agent replying to a gap. The raw
|
|
25
|
+
* provider payload is retained on the message so the same row can be re-read once a
|
|
26
|
+
* normalizer learns the type.
|
|
27
|
+
*/
|
|
28
|
+
MessageContentType["UNSUPPORTED"] = "unsupported";
|
|
29
|
+
})(MessageContentType || (MessageContentType = {}));
|
|
30
|
+
//# sourceMappingURL=message-content-type.enum.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"message-content-type.enum.js","sourceRoot":"","sources":["../../../../src/api/unibox/message-content-type.enum.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,MAAM,CAAN,IAAY,kBAoBX;AApBD,WAAY,kBAAkB;IAC1B,mCAAa,CAAA;IACb,qCAAe,CAAA;IACf,qCAAe,CAAA;IACf,qCAAe,CAAA;IACf,4EAA4E;IAC5E,2CAAqB,CAAA;IACrB,2CAAqB,CAAA;IACrB,qFAAqF;IACrF,yCAAmB,CAAA;IAEnB;;;;;;;OAOG;IACH,iDAA2B,CAAA;AAC/B,CAAC,EApBW,kBAAkB,KAAlB,kBAAkB,QAoB7B"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Which way a message travelled.
|
|
3
|
+
*
|
|
4
|
+
* Separate from {@link MessageAuthorType} on purpose, because they answer different questions and
|
|
5
|
+
* the mapping is not one-to-one. A `SYSTEM` note ("conversation assigned to Dana") is outbound in
|
|
6
|
+
* neither sense — it was never sent anywhere — so it is `INTERNAL`, and collapsing the two fields
|
|
7
|
+
* would make every internal note look like something a customer received.
|
|
8
|
+
*/
|
|
9
|
+
export declare enum MessageDirection {
|
|
10
|
+
/** From the contact to us, through a provider. */
|
|
11
|
+
INBOUND = "inbound",
|
|
12
|
+
/** From us to the contact, through Conduit. */
|
|
13
|
+
OUTBOUND = "outbound",
|
|
14
|
+
/**
|
|
15
|
+
* Never left Unibox. Assignment notes, status changes, private agent comments.
|
|
16
|
+
*
|
|
17
|
+
* Rendered in the thread because context is what makes a handover work, but structurally
|
|
18
|
+
* distinct: an internal message has no delivery status and no provider message id, and a bug
|
|
19
|
+
* that sent one would be a customer reading our internal notes.
|
|
20
|
+
*/
|
|
21
|
+
INTERNAL = "internal"
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=message-direction.enum.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"message-direction.enum.d.ts","sourceRoot":"","sources":["../../../../src/api/unibox/message-direction.enum.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,oBAAY,gBAAgB;IACxB,kDAAkD;IAClD,OAAO,YAAY;IAEnB,+CAA+C;IAC/C,QAAQ,aAAa;IAErB;;;;;;OAMG;IACH,QAAQ,aAAa;CACxB"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Which way a message travelled.
|
|
3
|
+
*
|
|
4
|
+
* Separate from {@link MessageAuthorType} on purpose, because they answer different questions and
|
|
5
|
+
* the mapping is not one-to-one. A `SYSTEM` note ("conversation assigned to Dana") is outbound in
|
|
6
|
+
* neither sense — it was never sent anywhere — so it is `INTERNAL`, and collapsing the two fields
|
|
7
|
+
* would make every internal note look like something a customer received.
|
|
8
|
+
*/
|
|
9
|
+
export var MessageDirection;
|
|
10
|
+
(function (MessageDirection) {
|
|
11
|
+
/** From the contact to us, through a provider. */
|
|
12
|
+
MessageDirection["INBOUND"] = "inbound";
|
|
13
|
+
/** From us to the contact, through Conduit. */
|
|
14
|
+
MessageDirection["OUTBOUND"] = "outbound";
|
|
15
|
+
/**
|
|
16
|
+
* Never left Unibox. Assignment notes, status changes, private agent comments.
|
|
17
|
+
*
|
|
18
|
+
* Rendered in the thread because context is what makes a handover work, but structurally
|
|
19
|
+
* distinct: an internal message has no delivery status and no provider message id, and a bug
|
|
20
|
+
* that sent one would be a customer reading our internal notes.
|
|
21
|
+
*/
|
|
22
|
+
MessageDirection["INTERNAL"] = "internal";
|
|
23
|
+
})(MessageDirection || (MessageDirection = {}));
|
|
24
|
+
//# sourceMappingURL=message-direction.enum.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"message-direction.enum.js","sourceRoot":"","sources":["../../../../src/api/unibox/message-direction.enum.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,MAAM,CAAN,IAAY,gBAeX;AAfD,WAAY,gBAAgB;IACxB,kDAAkD;IAClD,uCAAmB,CAAA;IAEnB,+CAA+C;IAC/C,yCAAqB,CAAA;IAErB;;;;;;OAMG;IACH,yCAAqB,CAAA;AACzB,CAAC,EAfW,gBAAgB,KAAhB,gBAAgB,QAe3B"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* How far an **outbound** message got.
|
|
3
|
+
*
|
|
4
|
+
* Inbound and internal messages are always {@link MessageStatus.RECEIVED} and
|
|
5
|
+
* {@link MessageStatus.NONE} respectively — the states below describe our side of a send, and a
|
|
6
|
+
* message that arrived has no send to describe.
|
|
7
|
+
*
|
|
8
|
+
* The three post-send states mirror what the messaging platforms report back through their status
|
|
9
|
+
* webhooks, and they arrive **through the inbound pipeline** (§11): a provider telling us a
|
|
10
|
+
* message was read is just another webhook. Nothing polls for them.
|
|
11
|
+
*/
|
|
12
|
+
export declare enum MessageStatus {
|
|
13
|
+
/** Not applicable — an internal note. */
|
|
14
|
+
NONE = "none",
|
|
15
|
+
/** Inbound. It is here; there was nothing to send. */
|
|
16
|
+
RECEIVED = "received",
|
|
17
|
+
/**
|
|
18
|
+
* Written down and handed to Conduit, which answered `202`.
|
|
19
|
+
*
|
|
20
|
+
* The important state to read correctly: it means Conduit has accepted responsibility, not
|
|
21
|
+
* that the provider has seen it. An inbox that renders this as a delivered tick is lying at
|
|
22
|
+
* exactly the moment a provider outage matters.
|
|
23
|
+
*/
|
|
24
|
+
QUEUED = "queued",
|
|
25
|
+
/** The provider accepted it. */
|
|
26
|
+
SENT = "sent",
|
|
27
|
+
/** The provider says it reached the contact's device. */
|
|
28
|
+
DELIVERED = "delivered",
|
|
29
|
+
/** The contact opened it. Not every platform reports this. */
|
|
30
|
+
READ = "read",
|
|
31
|
+
/**
|
|
32
|
+
* It will not be sent. Terminal.
|
|
33
|
+
*
|
|
34
|
+
* Set when Conduit dead-letters the dispatch, or when the send is refused outright — an
|
|
35
|
+
* inactive channel, a closed messaging window. `failureReason` carries the why, because
|
|
36
|
+
* "failed" alone sends an agent to ask an engineer.
|
|
37
|
+
*/
|
|
38
|
+
FAILED = "failed"
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=message-status.enum.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"message-status.enum.d.ts","sourceRoot":"","sources":["../../../../src/api/unibox/message-status.enum.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,oBAAY,aAAa;IACrB,yCAAyC;IACzC,IAAI,SAAS;IAEb,sDAAsD;IACtD,QAAQ,aAAa;IAErB;;;;;;OAMG;IACH,MAAM,WAAW;IAEjB,gCAAgC;IAChC,IAAI,SAAS;IAEb,yDAAyD;IACzD,SAAS,cAAc;IAEvB,8DAA8D;IAC9D,IAAI,SAAS;IAEb;;;;;;OAMG;IACH,MAAM,WAAW;CACpB"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* How far an **outbound** message got.
|
|
3
|
+
*
|
|
4
|
+
* Inbound and internal messages are always {@link MessageStatus.RECEIVED} and
|
|
5
|
+
* {@link MessageStatus.NONE} respectively — the states below describe our side of a send, and a
|
|
6
|
+
* message that arrived has no send to describe.
|
|
7
|
+
*
|
|
8
|
+
* The three post-send states mirror what the messaging platforms report back through their status
|
|
9
|
+
* webhooks, and they arrive **through the inbound pipeline** (§11): a provider telling us a
|
|
10
|
+
* message was read is just another webhook. Nothing polls for them.
|
|
11
|
+
*/
|
|
12
|
+
export var MessageStatus;
|
|
13
|
+
(function (MessageStatus) {
|
|
14
|
+
/** Not applicable — an internal note. */
|
|
15
|
+
MessageStatus["NONE"] = "none";
|
|
16
|
+
/** Inbound. It is here; there was nothing to send. */
|
|
17
|
+
MessageStatus["RECEIVED"] = "received";
|
|
18
|
+
/**
|
|
19
|
+
* Written down and handed to Conduit, which answered `202`.
|
|
20
|
+
*
|
|
21
|
+
* The important state to read correctly: it means Conduit has accepted responsibility, not
|
|
22
|
+
* that the provider has seen it. An inbox that renders this as a delivered tick is lying at
|
|
23
|
+
* exactly the moment a provider outage matters.
|
|
24
|
+
*/
|
|
25
|
+
MessageStatus["QUEUED"] = "queued";
|
|
26
|
+
/** The provider accepted it. */
|
|
27
|
+
MessageStatus["SENT"] = "sent";
|
|
28
|
+
/** The provider says it reached the contact's device. */
|
|
29
|
+
MessageStatus["DELIVERED"] = "delivered";
|
|
30
|
+
/** The contact opened it. Not every platform reports this. */
|
|
31
|
+
MessageStatus["READ"] = "read";
|
|
32
|
+
/**
|
|
33
|
+
* It will not be sent. Terminal.
|
|
34
|
+
*
|
|
35
|
+
* Set when Conduit dead-letters the dispatch, or when the send is refused outright — an
|
|
36
|
+
* inactive channel, a closed messaging window. `failureReason` carries the why, because
|
|
37
|
+
* "failed" alone sends an agent to ask an engineer.
|
|
38
|
+
*/
|
|
39
|
+
MessageStatus["FAILED"] = "failed";
|
|
40
|
+
})(MessageStatus || (MessageStatus = {}));
|
|
41
|
+
//# sourceMappingURL=message-status.enum.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"message-status.enum.js","sourceRoot":"","sources":["../../../../src/api/unibox/message-status.enum.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,MAAM,CAAN,IAAY,aAiCX;AAjCD,WAAY,aAAa;IACrB,yCAAyC;IACzC,8BAAa,CAAA;IAEb,sDAAsD;IACtD,sCAAqB,CAAA;IAErB;;;;;;OAMG;IACH,kCAAiB,CAAA;IAEjB,gCAAgC;IAChC,8BAAa,CAAA;IAEb,yDAAyD;IACzD,wCAAuB,CAAA;IAEvB,8DAA8D;IAC9D,8BAAa,CAAA;IAEb;;;;;;OAMG;IACH,kCAAiB,CAAA;AACrB,CAAC,EAjCW,aAAa,KAAb,aAAa,QAiCxB"}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
import type { CursorPage } from '../../type/cursor-page.type.js';
|
|
2
|
+
import type { IsoDateTime } from '../../type/iso-date-time.type.js';
|
|
3
|
+
import type { Nullable } from '../../type/nil.type.js';
|
|
4
|
+
import type { UUID } from '../../type/uuid.type.js';
|
|
5
|
+
import type { MessageAuthorType } from './message-author-type.enum.js';
|
|
6
|
+
import type { MessageContentType } from './message-content-type.enum.js';
|
|
7
|
+
import type { MessageDirection } from './message-direction.enum.js';
|
|
8
|
+
import type { MessageStatus } from './message-status.enum.js';
|
|
9
|
+
/** A file attached to a message. Media is referenced by provider URL until `iveri-files-api` exists. */
|
|
10
|
+
export interface MessageAttachment {
|
|
11
|
+
contentType: MessageContentType;
|
|
12
|
+
/**
|
|
13
|
+
* Where the media lives.
|
|
14
|
+
*
|
|
15
|
+
* Today this is the provider's own URL, which for most platforms is short-lived and requires
|
|
16
|
+
* the channel's credentials to fetch — so it is not something a browser can render directly.
|
|
17
|
+
* Re-hosting is `iveri-files-api`'s job (build-order step 10 territory), and this field is
|
|
18
|
+
* what will point at it instead.
|
|
19
|
+
*/
|
|
20
|
+
url: Nullable<string>;
|
|
21
|
+
/** The provider's media id, which is what a re-host job would need to fetch it. */
|
|
22
|
+
externalMediaId: Nullable<string>;
|
|
23
|
+
fileName: Nullable<string>;
|
|
24
|
+
mimeType: Nullable<string>;
|
|
25
|
+
sizeBytes: Nullable<number>;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* One message in a conversation.
|
|
29
|
+
*
|
|
30
|
+
* Immutable once written, apart from `status` and its timestamps. An inbox is a record of what was
|
|
31
|
+
* said, and an editable one is not evidence of anything — which matters the first time a customer
|
|
32
|
+
* disputes what they were told.
|
|
33
|
+
*/
|
|
34
|
+
export interface Message {
|
|
35
|
+
id: UUID;
|
|
36
|
+
conversationId: UUID;
|
|
37
|
+
direction: MessageDirection;
|
|
38
|
+
authorType: MessageAuthorType;
|
|
39
|
+
/** The agent who wrote it. Null for anything not authored by a human. */
|
|
40
|
+
authorUserId: Nullable<UUID>;
|
|
41
|
+
contentType: MessageContentType;
|
|
42
|
+
/** The text, or a caption on a media message. Null when there was none. */
|
|
43
|
+
text: Nullable<string>;
|
|
44
|
+
attachments: MessageAttachment[];
|
|
45
|
+
status: MessageStatus;
|
|
46
|
+
/** Why a `FAILED` message failed, in words an agent can act on. Null otherwise. */
|
|
47
|
+
failureReason: Nullable<string>;
|
|
48
|
+
/**
|
|
49
|
+
* The provider's own message id.
|
|
50
|
+
*
|
|
51
|
+
* Inbound, this is the **idempotency key**: Conduit is at-least-once by design and a
|
|
52
|
+
* redelivered webhook must not produce a second message. Outbound, it arrives with the
|
|
53
|
+
* provider's acceptance and is what a later status webhook is matched against.
|
|
54
|
+
*/
|
|
55
|
+
externalMessageId: Nullable<string>;
|
|
56
|
+
/**
|
|
57
|
+
* The Conduit dispatch this send was submitted as.
|
|
58
|
+
*
|
|
59
|
+
* Kept so a dead letter in Conduit's outbound DLQ can be traced back to the message an agent
|
|
60
|
+
* is looking at. Conduit puts `x-conduit-dispatch-id` on every send for the same reason from
|
|
61
|
+
* the other end.
|
|
62
|
+
*/
|
|
63
|
+
dispatchId: Nullable<UUID>;
|
|
64
|
+
/**
|
|
65
|
+
* When the message was said, according to the provider — not when we stored it.
|
|
66
|
+
*
|
|
67
|
+
* These differ by however long a provider queued a webhook, which after an outage is hours.
|
|
68
|
+
* Ordering the thread by arrival would then shuffle a conversation into nonsense, so this is
|
|
69
|
+
* what the thread sorts on.
|
|
70
|
+
*/
|
|
71
|
+
sentAt: IsoDateTime;
|
|
72
|
+
deliveredAt: Nullable<IsoDateTime>;
|
|
73
|
+
readAt: Nullable<IsoDateTime>;
|
|
74
|
+
createdAt: IsoDateTime;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* `GET /api/v1/conversations/:id/messages`. Cursor-paged, **newest first**.
|
|
78
|
+
*
|
|
79
|
+
* Newest first because that is what a thread opens to, and because paging backwards through
|
|
80
|
+
* history is the direction a scroll actually goes. The client reverses a page to render it.
|
|
81
|
+
*/
|
|
82
|
+
export type MessagesPage = CursorPage<Message>;
|
|
83
|
+
/** Query for `GET /api/v1/conversations/:id/messages`. */
|
|
84
|
+
export interface GetMessagesQuery {
|
|
85
|
+
limit?: number;
|
|
86
|
+
/** Opaque cursor from the previous page's `nextCursor`. Never parse it. */
|
|
87
|
+
before?: Nullable<string>;
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* `POST /api/v1/conversations/:id/messages` — an agent replying.
|
|
91
|
+
*
|
|
92
|
+
* Note what is absent: no channel, no recipient, no provider fields. The conversation already
|
|
93
|
+
* knows which channel it is on and who the contact is, and letting a caller restate either would
|
|
94
|
+
* be a way to send a message to one person through another person's thread.
|
|
95
|
+
*/
|
|
96
|
+
export interface SendMessageBody {
|
|
97
|
+
/** The reply text. Required for `TEXT`; a caption otherwise. */
|
|
98
|
+
text?: Nullable<string>;
|
|
99
|
+
contentType?: Nullable<MessageContentType>;
|
|
100
|
+
attachments?: Nullable<MessageAttachment[]>;
|
|
101
|
+
/**
|
|
102
|
+
* The caller's idempotency key, scoped to the conversation.
|
|
103
|
+
*
|
|
104
|
+
* **Strongly recommended, and forwarded to Conduit as its dispatch key.** Without one, an
|
|
105
|
+
* agent double-clicking Send messages the customer twice — and unlike an inbound duplicate,
|
|
106
|
+
* which is evidence, an outbound duplicate is a mistake the customer sees.
|
|
107
|
+
*/
|
|
108
|
+
idempotencyKey?: Nullable<string>;
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* `POST /api/v1/conversations/:id/notes` — a private note in the thread.
|
|
112
|
+
*
|
|
113
|
+
* A separate endpoint from sending rather than a flag on {@link SendMessageBody}, because the
|
|
114
|
+
* difference between "the customer reads this" and "only we read this" must not be one boolean
|
|
115
|
+
* away from being wrong. It also carries a different permission: writing a note is not sending.
|
|
116
|
+
*/
|
|
117
|
+
export interface AddNoteBody {
|
|
118
|
+
text: string;
|
|
119
|
+
}
|
|
120
|
+
//# sourceMappingURL=message.type.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"message.type.d.ts","sourceRoot":"","sources":["../../../../src/api/unibox/message.type.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAC;AACjE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAC;AACpE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,yBAAyB,CAAC;AAEpD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AACvE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AACzE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AACpE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAE9D,wGAAwG;AACxG,MAAM,WAAW,iBAAiB;IAC9B,WAAW,EAAE,kBAAkB,CAAC;IAEhC;;;;;;;OAOG;IACH,GAAG,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;IAEtB,mFAAmF;IACnF,eAAe,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;IAElC,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC3B,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC3B,SAAS,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;CAC/B;AAED;;;;;;GAMG;AACH,MAAM,WAAW,OAAO;IACpB,EAAE,EAAE,IAAI,CAAC;IAET,cAAc,EAAE,IAAI,CAAC;IAErB,SAAS,EAAE,gBAAgB,CAAC;IAE5B,UAAU,EAAE,iBAAiB,CAAC;IAE9B,yEAAyE;IACzE,YAAY,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC;IAE7B,WAAW,EAAE,kBAAkB,CAAC;IAEhC,2EAA2E;IAC3E,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;IAEvB,WAAW,EAAE,iBAAiB,EAAE,CAAC;IAEjC,MAAM,EAAE,aAAa,CAAC;IAEtB,mFAAmF;IACnF,aAAa,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;IAEhC;;;;;;OAMG;IACH,iBAAiB,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;IAEpC;;;;;;OAMG;IACH,UAAU,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC;IAE3B;;;;;;OAMG;IACH,MAAM,EAAE,WAAW,CAAC;IAEpB,WAAW,EAAE,QAAQ,CAAC,WAAW,CAAC,CAAC;IACnC,MAAM,EAAE,QAAQ,CAAC,WAAW,CAAC,CAAC;IAE9B,SAAS,EAAE,WAAW,CAAC;CAC1B;AAED;;;;;GAKG;AACH,MAAM,MAAM,YAAY,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC;AAE/C,0DAA0D;AAC1D,MAAM,WAAW,gBAAgB;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf,2EAA2E;IAC3E,MAAM,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;CAC7B;AAED;;;;;;GAMG;AACH,MAAM,WAAW,eAAe;IAC5B,gEAAgE;IAChE,IAAI,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;IAExB,WAAW,CAAC,EAAE,QAAQ,CAAC,kBAAkB,CAAC,CAAC;IAE3C,WAAW,CAAC,EAAE,QAAQ,CAAC,iBAAiB,EAAE,CAAC,CAAC;IAE5C;;;;;;OAMG;IACH,cAAc,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;CACrC;AAED;;;;;;GAMG;AACH,MAAM,WAAW,WAAW;IACxB,IAAI,EAAE,MAAM,CAAC;CAChB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"message.type.js","sourceRoot":"","sources":["../../../../src/api/unibox/message.type.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import type { IsoDateTime } from '../../type/iso-date-time.type.js';
|
|
2
|
+
import type { Nullable } from '../../type/nil.type.js';
|
|
3
|
+
import type { Paginated } from '../../type/paginated.type.js';
|
|
4
|
+
import type { UUID } from '../../type/uuid.type.js';
|
|
5
|
+
/**
|
|
6
|
+
* A group of agents work is routed to — Support, Sales, Billing.
|
|
7
|
+
*
|
|
8
|
+
* **A team is not a role and not a membership.** Identity owns who exists and what they may do;
|
|
9
|
+
* this owns who is expected to answer what. Keeping them apart is what lets an agent be moved
|
|
10
|
+
* between teams without touching their permissions, which is the operation that actually happens
|
|
11
|
+
* weekly.
|
|
12
|
+
*
|
|
13
|
+
* `memberUserIds` names users in `iveri-identity-api`, so it is a loose reference with no foreign
|
|
14
|
+
* key. A user removed there leaves a stale id here; Unibox filters those out when resolving a
|
|
15
|
+
* team rather than pretending it can prevent them.
|
|
16
|
+
*/
|
|
17
|
+
export interface Team {
|
|
18
|
+
id: UUID;
|
|
19
|
+
name: string;
|
|
20
|
+
description: Nullable<string>;
|
|
21
|
+
/** Identity user ids. Order is not meaningful. */
|
|
22
|
+
memberUserIds: UUID[];
|
|
23
|
+
/**
|
|
24
|
+
* Conversations on these channels are routed to this team when nothing else claims them.
|
|
25
|
+
*
|
|
26
|
+
* Empty means the team takes no automatic routing and is assignment-only. Deliberately a list
|
|
27
|
+
* on the team rather than a team id on the channel: a channel routed to two teams during a
|
|
28
|
+
* handover period is a real thing customers ask for, and the other direction cannot express it.
|
|
29
|
+
*/
|
|
30
|
+
channelIds: UUID[];
|
|
31
|
+
createdAt: IsoDateTime;
|
|
32
|
+
updatedAt: IsoDateTime;
|
|
33
|
+
}
|
|
34
|
+
/** `GET /api/v1/teams`. Offset-paged; a tenant has a handful. */
|
|
35
|
+
export type TeamsPage = Paginated<Team>;
|
|
36
|
+
/** `POST /api/v1/teams`. */
|
|
37
|
+
export interface CreateTeamBody {
|
|
38
|
+
name: string;
|
|
39
|
+
description?: Nullable<string>;
|
|
40
|
+
memberUserIds?: Nullable<UUID[]>;
|
|
41
|
+
channelIds?: Nullable<UUID[]>;
|
|
42
|
+
}
|
|
43
|
+
/** `PATCH /api/v1/teams/:id`. Both id lists replace wholesale; omit to leave alone, `[]` clears. */
|
|
44
|
+
export interface UpdateTeamBody {
|
|
45
|
+
name?: string;
|
|
46
|
+
description?: Nullable<string>;
|
|
47
|
+
memberUserIds?: Nullable<UUID[]>;
|
|
48
|
+
channelIds?: Nullable<UUID[]>;
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=team.type.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"team.type.d.ts","sourceRoot":"","sources":["../../../../src/api/unibox/team.type.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAC;AACpE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAC;AAC9D,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,yBAAyB,CAAC;AAEpD;;;;;;;;;;;GAWG;AACH,MAAM,WAAW,IAAI;IACjB,EAAE,EAAE,IAAI,CAAC;IAET,IAAI,EAAE,MAAM,CAAC;IAEb,WAAW,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;IAE9B,kDAAkD;IAClD,aAAa,EAAE,IAAI,EAAE,CAAC;IAEtB;;;;;;OAMG;IACH,UAAU,EAAE,IAAI,EAAE,CAAC;IAEnB,SAAS,EAAE,WAAW,CAAC;IACvB,SAAS,EAAE,WAAW,CAAC;CAC1B;AAED,iEAAiE;AACjE,MAAM,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;AAExC,4BAA4B;AAC5B,MAAM,WAAW,cAAc;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC/B,aAAa,CAAC,EAAE,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;IACjC,UAAU,CAAC,EAAE,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;CACjC;AAED,oGAAoG;AACpG,MAAM,WAAW,cAAc;IAC3B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC/B,aAAa,CAAC,EAAE,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;IACjC,UAAU,CAAC,EAAE,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;CACjC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"team.type.js","sourceRoot":"","sources":["../../../../src/api/unibox/team.type.ts"],"names":[],"mappings":""}
|
|
@@ -128,7 +128,54 @@ export declare enum UserPermission {
|
|
|
128
128
|
*/
|
|
129
129
|
CONDUIT_DISPATCH_SEND = "conduit:dispatch:send",
|
|
130
130
|
/** Redrive a dead-lettered dispatch, or cancel one still pending. */
|
|
131
|
-
CONDUIT_DISPATCH_OPERATE = "conduit:dispatch:operate"
|
|
131
|
+
CONDUIT_DISPATCH_OPERATE = "conduit:dispatch:operate",
|
|
132
|
+
/** Read connected messaging accounts. Never exposes a channel's ingest secret. */
|
|
133
|
+
UNIBOX_CHANNEL_READ = "unibox:channel:read",
|
|
134
|
+
/**
|
|
135
|
+
* Connect, amend or disconnect a messaging account, and rotate its ingest secret.
|
|
136
|
+
*
|
|
137
|
+
* A single manage permission for the same reason as `CONDUIT_CONNECTION_MANAGE`: the
|
|
138
|
+
* dangerous act is holding the credential that lets anything post messages into a tenant's
|
|
139
|
+
* inbox, and create/update/delete carry that identically.
|
|
140
|
+
*/
|
|
141
|
+
UNIBOX_CHANNEL_MANAGE = "unibox:channel:manage",
|
|
142
|
+
/** Read contacts. Personal data — closer to a data-export permission than a config one. */
|
|
143
|
+
UNIBOX_CONTACT_READ = "unibox:contact:read",
|
|
144
|
+
/** Create, amend or delete a contact record. */
|
|
145
|
+
UNIBOX_CONTACT_MANAGE = "unibox:contact:manage",
|
|
146
|
+
/**
|
|
147
|
+
* Read the inbox and every message in it.
|
|
148
|
+
*
|
|
149
|
+
* **There is deliberately no separate `unibox:message:read`.** A conversation with its
|
|
150
|
+
* messages hidden is an empty row, so a permission that granted one without the other would
|
|
151
|
+
* describe a screen nobody can use — and the reverse would be a way to read a customer's
|
|
152
|
+
* messages while appearing to have no access to the inbox.
|
|
153
|
+
*/
|
|
154
|
+
UNIBOX_CONVERSATION_READ = "unibox:conversation:read",
|
|
155
|
+
/** Change a conversation's status — close, snooze, reopen — and write internal notes. */
|
|
156
|
+
UNIBOX_CONVERSATION_MANAGE = "unibox:conversation:manage",
|
|
157
|
+
/**
|
|
158
|
+
* Assign a conversation to an agent or a team, and take over from the AI.
|
|
159
|
+
*
|
|
160
|
+
* Separate from `UNIBOX_CONVERSATION_MANAGE` because assignment decides whose work this is.
|
|
161
|
+
* A supervisor routing a queue and an agent closing their own conversations are different
|
|
162
|
+
* jobs, and a tenant that wants only the first to reassign should be able to say so.
|
|
163
|
+
*/
|
|
164
|
+
UNIBOX_CONVERSATION_ASSIGN = "unibox:conversation:assign",
|
|
165
|
+
/**
|
|
166
|
+
* Send a message to a contact.
|
|
167
|
+
*
|
|
168
|
+
* The sharpest permission in this service, and the reason there is no `unibox:message:*`
|
|
169
|
+
* read counterpart. Everything else here moves rows around inside our own database; this one
|
|
170
|
+
* reaches a real person on their phone, through a paid channel, and cannot be taken back.
|
|
171
|
+
*/
|
|
172
|
+
UNIBOX_MESSAGE_SEND = "unibox:message:send",
|
|
173
|
+
UNIBOX_TEAM_READ = "unibox:team:read",
|
|
174
|
+
/** Create teams and change who is in them. Routing, not permissions — identity owns those. */
|
|
175
|
+
UNIBOX_TEAM_MANAGE = "unibox:team:manage",
|
|
176
|
+
UNIBOX_CANNED_REPLY_READ = "unibox:canned-reply:read",
|
|
177
|
+
/** Author the saved replies every agent in the tenant will send. */
|
|
178
|
+
UNIBOX_CANNED_REPLY_MANAGE = "unibox:canned-reply:manage"
|
|
132
179
|
}
|
|
133
180
|
/**
|
|
134
181
|
* Every member, for seeding the owner role and validating custom-role input.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"user-permission.enum.d.ts","sourceRoot":"","sources":["../../../src/enum/user-permission.enum.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AACH,oBAAY,cAAc;IAItB,WAAW,gBAAgB;IAC3B,aAAa,kBAAkB;IAC/B,sFAAsF;IACtF,aAAa,kBAAkB;IAG/B,SAAS,cAAc;IACvB,WAAW,gBAAgB;IAC3B,WAAW,gBAAgB;IAC3B,WAAW,gBAAgB;IAG3B,eAAe,oBAAoB;IACnC,6EAA6E;IAC7E,iBAAiB,sBAAsB;IACvC;;;OAGG;IACH,sBAAsB,2BAA2B;IAGjD,SAAS,cAAc;IACvB,WAAW,gBAAgB;IAC3B,WAAW,gBAAgB;IAC3B,WAAW,gBAAgB;IAG3B,YAAY,iBAAiB;IAC7B,aAAa,kBAAkB;IAC/B,cAAc,mBAAmB;IAKjC,qEAAqE;IACrE,qBAAqB,0BAA0B;IAC/C,uBAAuB,4BAA4B;IACnD,uBAAuB,4BAA4B;IACnD,uBAAuB,4BAA4B;IAGnD;;;;OAIG;IACH,oBAAoB,yBAAyB;IAC7C,sBAAsB,2BAA2B;IAGjD;;;;OAIG;IACH,sBAAsB,2BAA2B;IAGjD,qBAAqB,0BAA0B;IAC/C,yFAAyF;IACzF,uBAAuB,4BAA4B;IAGnD,mEAAmE;IACnE,wBAAwB,6BAA6B;IACrD;;;;;;;OAOG;IACH,0BAA0B,+BAA+B;IAGzD,kBAAkB,uBAAuB;IACzC,2DAA2D;IAC3D,oBAAoB,yBAAyB;IAG7C;;;;;OAKG;IACH,qBAAqB,0BAA0B;IAC/C;;;;;;OAMG;IACH,wBAAwB,6BAA6B;IAGrD,wFAAwF;IACxF,sBAAsB,2BAA2B;IACjD;;;;;;;;OAQG;IACH,wBAAwB,6BAA6B;IAGrD,sEAAsE;IACtE,uBAAuB,4BAA4B;IACnD;;;;;OAKG;IACH,yBAAyB,8BAA8B;IAGvD;;;;;OAKG;IACH,qBAAqB,0BAA0B;IAC/C;;;;;;;OAOG;IACH,qBAAqB,0BAA0B;IAC/C,qEAAqE;IACrE,wBAAwB,6BAA6B;
|
|
1
|
+
{"version":3,"file":"user-permission.enum.d.ts","sourceRoot":"","sources":["../../../src/enum/user-permission.enum.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AACH,oBAAY,cAAc;IAItB,WAAW,gBAAgB;IAC3B,aAAa,kBAAkB;IAC/B,sFAAsF;IACtF,aAAa,kBAAkB;IAG/B,SAAS,cAAc;IACvB,WAAW,gBAAgB;IAC3B,WAAW,gBAAgB;IAC3B,WAAW,gBAAgB;IAG3B,eAAe,oBAAoB;IACnC,6EAA6E;IAC7E,iBAAiB,sBAAsB;IACvC;;;OAGG;IACH,sBAAsB,2BAA2B;IAGjD,SAAS,cAAc;IACvB,WAAW,gBAAgB;IAC3B,WAAW,gBAAgB;IAC3B,WAAW,gBAAgB;IAG3B,YAAY,iBAAiB;IAC7B,aAAa,kBAAkB;IAC/B,cAAc,mBAAmB;IAKjC,qEAAqE;IACrE,qBAAqB,0BAA0B;IAC/C,uBAAuB,4BAA4B;IACnD,uBAAuB,4BAA4B;IACnD,uBAAuB,4BAA4B;IAGnD;;;;OAIG;IACH,oBAAoB,yBAAyB;IAC7C,sBAAsB,2BAA2B;IAGjD;;;;OAIG;IACH,sBAAsB,2BAA2B;IAGjD,qBAAqB,0BAA0B;IAC/C,yFAAyF;IACzF,uBAAuB,4BAA4B;IAGnD,mEAAmE;IACnE,wBAAwB,6BAA6B;IACrD;;;;;;;OAOG;IACH,0BAA0B,+BAA+B;IAGzD,kBAAkB,uBAAuB;IACzC,2DAA2D;IAC3D,oBAAoB,yBAAyB;IAG7C;;;;;OAKG;IACH,qBAAqB,0BAA0B;IAC/C;;;;;;OAMG;IACH,wBAAwB,6BAA6B;IAGrD,wFAAwF;IACxF,sBAAsB,2BAA2B;IACjD;;;;;;;;OAQG;IACH,wBAAwB,6BAA6B;IAGrD,sEAAsE;IACtE,uBAAuB,4BAA4B;IACnD;;;;;OAKG;IACH,yBAAyB,8BAA8B;IAGvD;;;;;OAKG;IACH,qBAAqB,0BAA0B;IAC/C;;;;;;;OAOG;IACH,qBAAqB,0BAA0B;IAC/C,qEAAqE;IACrE,wBAAwB,6BAA6B;IAKrD,kFAAkF;IAClF,mBAAmB,wBAAwB;IAC3C;;;;;;OAMG;IACH,qBAAqB,0BAA0B;IAG/C,2FAA2F;IAC3F,mBAAmB,wBAAwB;IAC3C,gDAAgD;IAChD,qBAAqB,0BAA0B;IAG/C;;;;;;;OAOG;IACH,wBAAwB,6BAA6B;IACrD,yFAAyF;IACzF,0BAA0B,+BAA+B;IACzD;;;;;;OAMG;IACH,0BAA0B,+BAA+B;IAGzD;;;;;;OAMG;IACH,mBAAmB,wBAAwB;IAG3C,gBAAgB,qBAAqB;IACrC,8FAA8F;IAC9F,kBAAkB,uBAAuB;IAGzC,wBAAwB,6BAA6B;IACrD,oEAAoE;IACpE,0BAA0B,+BAA+B;CAC5D;AAED;;;;;GAKG;AACH,eAAO,MAAM,oBAAoB,EAAE,SAAS,cAAc,EAAiD,CAAC"}
|
|
@@ -147,6 +147,60 @@ export var UserPermission;
|
|
|
147
147
|
UserPermission["CONDUIT_DISPATCH_SEND"] = "conduit:dispatch:send";
|
|
148
148
|
/** Redrive a dead-lettered dispatch, or cancel one still pending. */
|
|
149
149
|
UserPermission["CONDUIT_DISPATCH_OPERATE"] = "conduit:dispatch:operate";
|
|
150
|
+
// ══ unibox-api ═══════════════════════════════════════════════════════════
|
|
151
|
+
// ── Channel ─────────────────────────────────────────────────────────────
|
|
152
|
+
/** Read connected messaging accounts. Never exposes a channel's ingest secret. */
|
|
153
|
+
UserPermission["UNIBOX_CHANNEL_READ"] = "unibox:channel:read";
|
|
154
|
+
/**
|
|
155
|
+
* Connect, amend or disconnect a messaging account, and rotate its ingest secret.
|
|
156
|
+
*
|
|
157
|
+
* A single manage permission for the same reason as `CONDUIT_CONNECTION_MANAGE`: the
|
|
158
|
+
* dangerous act is holding the credential that lets anything post messages into a tenant's
|
|
159
|
+
* inbox, and create/update/delete carry that identically.
|
|
160
|
+
*/
|
|
161
|
+
UserPermission["UNIBOX_CHANNEL_MANAGE"] = "unibox:channel:manage";
|
|
162
|
+
// ── Contact ─────────────────────────────────────────────────────────────
|
|
163
|
+
/** Read contacts. Personal data — closer to a data-export permission than a config one. */
|
|
164
|
+
UserPermission["UNIBOX_CONTACT_READ"] = "unibox:contact:read";
|
|
165
|
+
/** Create, amend or delete a contact record. */
|
|
166
|
+
UserPermission["UNIBOX_CONTACT_MANAGE"] = "unibox:contact:manage";
|
|
167
|
+
// ── Conversation ────────────────────────────────────────────────────────
|
|
168
|
+
/**
|
|
169
|
+
* Read the inbox and every message in it.
|
|
170
|
+
*
|
|
171
|
+
* **There is deliberately no separate `unibox:message:read`.** A conversation with its
|
|
172
|
+
* messages hidden is an empty row, so a permission that granted one without the other would
|
|
173
|
+
* describe a screen nobody can use — and the reverse would be a way to read a customer's
|
|
174
|
+
* messages while appearing to have no access to the inbox.
|
|
175
|
+
*/
|
|
176
|
+
UserPermission["UNIBOX_CONVERSATION_READ"] = "unibox:conversation:read";
|
|
177
|
+
/** Change a conversation's status — close, snooze, reopen — and write internal notes. */
|
|
178
|
+
UserPermission["UNIBOX_CONVERSATION_MANAGE"] = "unibox:conversation:manage";
|
|
179
|
+
/**
|
|
180
|
+
* Assign a conversation to an agent or a team, and take over from the AI.
|
|
181
|
+
*
|
|
182
|
+
* Separate from `UNIBOX_CONVERSATION_MANAGE` because assignment decides whose work this is.
|
|
183
|
+
* A supervisor routing a queue and an agent closing their own conversations are different
|
|
184
|
+
* jobs, and a tenant that wants only the first to reassign should be able to say so.
|
|
185
|
+
*/
|
|
186
|
+
UserPermission["UNIBOX_CONVERSATION_ASSIGN"] = "unibox:conversation:assign";
|
|
187
|
+
// ── Message ─────────────────────────────────────────────────────────────
|
|
188
|
+
/**
|
|
189
|
+
* Send a message to a contact.
|
|
190
|
+
*
|
|
191
|
+
* The sharpest permission in this service, and the reason there is no `unibox:message:*`
|
|
192
|
+
* read counterpart. Everything else here moves rows around inside our own database; this one
|
|
193
|
+
* reaches a real person on their phone, through a paid channel, and cannot be taken back.
|
|
194
|
+
*/
|
|
195
|
+
UserPermission["UNIBOX_MESSAGE_SEND"] = "unibox:message:send";
|
|
196
|
+
// ── Team ────────────────────────────────────────────────────────────────
|
|
197
|
+
UserPermission["UNIBOX_TEAM_READ"] = "unibox:team:read";
|
|
198
|
+
/** Create teams and change who is in them. Routing, not permissions — identity owns those. */
|
|
199
|
+
UserPermission["UNIBOX_TEAM_MANAGE"] = "unibox:team:manage";
|
|
200
|
+
// ── Canned reply ────────────────────────────────────────────────────────
|
|
201
|
+
UserPermission["UNIBOX_CANNED_REPLY_READ"] = "unibox:canned-reply:read";
|
|
202
|
+
/** Author the saved replies every agent in the tenant will send. */
|
|
203
|
+
UserPermission["UNIBOX_CANNED_REPLY_MANAGE"] = "unibox:canned-reply:manage";
|
|
150
204
|
})(UserPermission || (UserPermission = {}));
|
|
151
205
|
/**
|
|
152
206
|
* Every member, for seeding the owner role and validating custom-role input.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"user-permission.enum.js","sourceRoot":"","sources":["../../../src/enum/user-permission.enum.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,CAAN,IAAY,
|
|
1
|
+
{"version":3,"file":"user-permission.enum.js","sourceRoot":"","sources":["../../../src/enum/user-permission.enum.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,CAAN,IAAY,cA+MX;AA/MD,WAAY,cAAc;IACtB,4EAA4E;IAE5E,2EAA2E;IAC3E,6CAA2B,CAAA;IAC3B,iDAA+B,CAAA;IAC/B,sFAAsF;IACtF,iDAA+B,CAAA;IAE/B,2EAA2E;IAC3E,yCAAuB,CAAA;IACvB,6CAA2B,CAAA;IAC3B,6CAA2B,CAAA;IAC3B,6CAA2B,CAAA;IAE3B,2EAA2E;IAC3E,qDAAmC,CAAA;IACnC,6EAA6E;IAC7E,yDAAuC,CAAA;IACvC;;;OAGG;IACH,mEAAiD,CAAA;IAEjD,2EAA2E;IAC3E,yCAAuB,CAAA;IACvB,6CAA2B,CAAA;IAC3B,6CAA2B,CAAA;IAC3B,6CAA2B,CAAA;IAE3B,2EAA2E;IAC3E,+CAA6B,CAAA;IAC7B,iDAA+B,CAAA;IAC/B,mDAAiC,CAAA;IAEjC,4EAA4E;IAE5E,2EAA2E;IAC3E,qEAAqE;IACrE,iEAA+C,CAAA;IAC/C,qEAAmD,CAAA;IACnD,qEAAmD,CAAA;IACnD,qEAAmD,CAAA;IAEnD,2EAA2E;IAC3E;;;;OAIG;IACH,+DAA6C,CAAA;IAC7C,mEAAiD,CAAA;IAEjD,2EAA2E;IAC3E;;;;OAIG;IACH,mEAAiD,CAAA;IAEjD,2EAA2E;IAC3E,iEAA+C,CAAA;IAC/C,yFAAyF;IACzF,qEAAmD,CAAA;IAEnD,2EAA2E;IAC3E,mEAAmE;IACnE,uEAAqD,CAAA;IACrD;;;;;;;OAOG;IACH,2EAAyD,CAAA;IAEzD,2EAA2E;IAC3E,2DAAyC,CAAA;IACzC,2DAA2D;IAC3D,+DAA6C,CAAA;IAE7C,2EAA2E;IAC3E;;;;;OAKG;IACH,iEAA+C,CAAA;IAC/C;;;;;;OAMG;IACH,uEAAqD,CAAA;IAErD,2EAA2E;IAC3E,wFAAwF;IACxF,mEAAiD,CAAA;IACjD;;;;;;;;OAQG;IACH,uEAAqD,CAAA;IAErD,2EAA2E;IAC3E,sEAAsE;IACtE,qEAAmD,CAAA;IACnD;;;;;OAKG;IACH,yEAAuD,CAAA;IAEvD,2EAA2E;IAC3E;;;;;OAKG;IACH,iEAA+C,CAAA;IAC/C;;;;;;;OAOG;IACH,iEAA+C,CAAA;IAC/C,qEAAqE;IACrE,uEAAqD,CAAA;IAErD,4EAA4E;IAE5E,2EAA2E;IAC3E,kFAAkF;IAClF,6DAA2C,CAAA;IAC3C;;;;;;OAMG;IACH,iEAA+C,CAAA;IAE/C,2EAA2E;IAC3E,2FAA2F;IAC3F,6DAA2C,CAAA;IAC3C,gDAAgD;IAChD,iEAA+C,CAAA;IAE/C,2EAA2E;IAC3E;;;;;;;OAOG;IACH,uEAAqD,CAAA;IACrD,yFAAyF;IACzF,2EAAyD,CAAA;IACzD;;;;;;OAMG;IACH,2EAAyD,CAAA;IAEzD,2EAA2E;IAC3E;;;;;;OAMG;IACH,6DAA2C,CAAA;IAE3C,2EAA2E;IAC3E,uDAAqC,CAAA;IACrC,8FAA8F;IAC9F,2DAAyC,CAAA;IAEzC,2EAA2E;IAC3E,uEAAqD,CAAA;IACrD,oEAAoE;IACpE,2EAAyD,CAAA;AAC7D,CAAC,EA/MW,cAAc,KAAd,cAAc,QA+MzB;AAED;;;;;GAKG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAA8B,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@iveri/contracts",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.8.0",
|
|
4
4
|
"description": "Wire contracts shared by every Iveri backend and frontend. Zero runtime dependencies.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
@@ -34,6 +34,11 @@
|
|
|
34
34
|
"import": "./dist/esm/api/identity/index.js",
|
|
35
35
|
"require": "./dist/cjs/api/identity/index.js"
|
|
36
36
|
},
|
|
37
|
+
"./unibox": {
|
|
38
|
+
"types": "./dist/cjs/api/unibox/index.d.ts",
|
|
39
|
+
"import": "./dist/esm/api/unibox/index.js",
|
|
40
|
+
"require": "./dist/cjs/api/unibox/index.js"
|
|
41
|
+
},
|
|
37
42
|
"./package.json": "./package.json"
|
|
38
43
|
},
|
|
39
44
|
"typesVersions": {
|
|
@@ -43,6 +48,9 @@
|
|
|
43
48
|
],
|
|
44
49
|
"identity": [
|
|
45
50
|
"./dist/cjs/api/identity/index.d.ts"
|
|
51
|
+
],
|
|
52
|
+
"unibox": [
|
|
53
|
+
"./dist/cjs/api/unibox/index.d.ts"
|
|
46
54
|
]
|
|
47
55
|
}
|
|
48
56
|
},
|