@opencxh/domain 1.221.0 → 1.224.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.
@@ -510,6 +510,24 @@ export type ServerOp = {
510
510
  channelId: string;
511
511
  interactionId: string;
512
512
  body: NoteBody;
513
+ }
514
+ /**
515
+ * Put an emoji on a message at the provider, or take it off.
516
+ *
517
+ * Only dispatched to a provider that declares the `message_reactions` feature — everywhere
518
+ * else the reaction stays ours alone, which is the honest outcome for a channel whose
519
+ * protocol has no such thing (mail).
520
+ *
521
+ * `emoji` is the literal character. Providers that speak their own vocabulary translate at
522
+ * their own edge; a reaction means the same thing on every channel and should read the same.
523
+ */
524
+ | {
525
+ kind: "message.react";
526
+ channelId: string;
527
+ activityId: string;
528
+ emoji: string;
529
+ /** `true` sets it, `false` removes it. */
530
+ on: boolean;
513
531
  } | {
514
532
  kind: "message.forward";
515
533
  channelId: string;
@@ -640,6 +658,13 @@ export declare const FEATURE_FOLDER_MANAGEMENT = "folder_management";
640
658
  * channels in `GET /search/sources`; the client fans out via `POST /search/mailbox`.
641
659
  */
642
660
  export declare const FEATURE_REMOTE_SEARCH = "remote_search";
661
+ /**
662
+ * Well-known `ProviderFeature.name` for per-message emoji reactions. A provider that can both
663
+ * report the reactions on a message and set one on the user's behalf declares it true; the
664
+ * comm-server then dispatches `message.react` there. Everywhere else the reaction is ours
665
+ * alone, which is the honest outcome for a protocol that has no such thing (mail).
666
+ */
667
+ export declare const FEATURE_MESSAGE_REACTIONS = "message_reactions";
643
668
  /**
644
669
  * Result shape for `IProvider.dispatch` and the comm-server
645
670
  * `dispatchToProvider` helper, discriminated on `ok`. Deliberately not
@@ -84,6 +84,15 @@ export interface DocumentCapability {
84
84
  title: string;
85
85
  /** Someone else holds the lock, or a write-back would drop content, or it is read-only. */
86
86
  readOnly: boolean;
87
+ /**
88
+ * Is the document parsed and answerable, or still loading?
89
+ *
90
+ * A separate field because the page knows what the file *is* (name, kind, which operations
91
+ * apply) the moment it opens, while the engine needs a second or two to parse it. Without the
92
+ * distinction a consumer cannot tell "no content" from "not yet", and a model told the first
93
+ * reports an empty document.
94
+ */
95
+ ready: boolean;
87
96
  /** What a write-back would lose, from the editor's own `unsupportedFeatures`. */
88
97
  blocked: string[];
89
98
  /** The subset of {@link DOCUMENT_OPERATIONS} this mounted editor actually implements. */
@@ -18,7 +18,7 @@ export declare const APP_PERMISSIONS: {
18
18
  readonly "app-store": readonly ["app.publish", "app.read", "app.write", "setting.read", "setting.write"];
19
19
  readonly assist: readonly ["board.read"];
20
20
  readonly automations: readonly ["sync.read", "sync.write", "webhook.read", "webhook.write"];
21
- readonly communication: readonly ["account.read", "account.write", "activity-type.read", "activity.read", "activity.write", "attachment.read", "attribute.read", "attribute.write", "calendar.read", "calendar.write", "channel.read", "channel.write", "custom-field.read", "custom-field.write", "folder.read", "folder.write", "inbox.read", "inbox.write", "interaction.read", "interaction.write", "reminder.read", "template.read", "template.write", "topic.read", "topic.write"];
21
+ readonly communication: readonly ["account.read", "account.write", "activity-type.read", "activity.read", "activity.write", "attachment.read", "attribute.read", "attribute.write", "calendar.read", "calendar.write", "channel.read", "channel.write", "custom-field.read", "custom-field.write", "folder.read", "folder.write", "inbox.read", "inbox.write", "interaction.read", "interaction.write", "reaction.read", "reaction.write", "reminder.read", "template.read", "template.write", "topic.read", "topic.write"];
22
22
  readonly context: readonly ["kind.read", "kind.write", "memory.read", "memory.write"];
23
23
  readonly crm: readonly ["company.read", "company.write", "contact.read", "contact.write"];
24
24
  readonly "eylo-voip": readonly ["account.read", "account.write", "callflow.read", "callflow.write", "channel.read", "channel.write", "contact.read", "contact.write", "device.read", "device.write", "group.read", "group.write", "interaction.read", "interaction.write", "media.read", "media.write", "menu.read", "menu.write", "phone-number.read", "phone-number.write", "recording.read", "recording.write", "sip.read", "temporal-rule.read", "temporal-rule.write", "user.read", "user.write", "vmbox.read", "vmbox.write", "webhook.read", "webhook.write"];
@@ -161,6 +161,30 @@ export interface Relation {
161
161
  createdBy: string;
162
162
  createdAt?: number;
163
163
  }
164
+ /**
165
+ * One resource a single person keeps in reach, stored by apps/context.
166
+ *
167
+ * **Private by construction.** `userId` comes from the session, never from the body, so a pin is
168
+ * not an org-wide fact about the resource — which is exactly why it is not a {@link Relation}:
169
+ * relations are merged into `/resource/related` and would surface everyone's pins in a customer
170
+ * file. Nothing reads another user's pins.
171
+ *
172
+ * `label` and `icon` are **snapshots**, used cold: a pinned conversation from three months ago is
173
+ * not in any list the screen loaded, so without them the row has no name. Whoever renders it
174
+ * lets the live value win when the resource is at hand.
175
+ */
176
+ export interface Pin {
177
+ id: string;
178
+ organizationId: string;
179
+ userId: string;
180
+ /** `<kind>:<ref>` — the same key vocabulary as {@link ResourceSummary} and {@link Relation}. */
181
+ scopeKey: string;
182
+ /** Title snapshot. See the note above. */
183
+ label: string;
184
+ /** Icon hint the owning app understands (comms stores the channel scheme). */
185
+ icon?: string;
186
+ createdAt?: number;
187
+ }
164
188
  /**
165
189
  * What the hub asks one app. `scopeKey` is already authorized — the answering app must not
166
190
  * re-gate it, but it must filter its own rows for the stamped acting identity.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@opencxh/domain",
3
- "version": "1.221.0",
3
+ "version": "1.224.0",
4
4
  "type": "module",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/index.js",