@massalabs/gossip-sdk 0.0.2-dev.20260316144414 → 0.0.2-dev.20260317085237

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/db/db.d.ts CHANGED
@@ -137,6 +137,7 @@ export interface Discussion {
137
137
  lastMessageContent: string | null;
138
138
  lastMessageTimestamp: Date | null;
139
139
  unreadCount: number;
140
+ pinned: boolean;
140
141
  killedNextRetryAt?: Date | null;
141
142
  saturatedRetryAt?: Date | null;
142
143
  saturatedRetryDone: boolean;
@@ -40,4 +40,12 @@ export const MIGRATIONS = [
40
40
  when: 1740000000000,
41
41
  statements: ['ALTER TABLE `messages` ADD COLUMN `editOf` text;'],
42
42
  },
43
+ {
44
+ idx: 2,
45
+ tag: '0002_discussions_pinned',
46
+ when: 1741000000000,
47
+ statements: [
48
+ 'ALTER TABLE `discussions` ADD COLUMN `pinned` integer NOT NULL DEFAULT 0;',
49
+ ],
50
+ },
43
51
  ];
@@ -277,6 +277,23 @@ export declare const discussions: import("drizzle-orm/sqlite-core").SQLiteTableW
277
277
  identity: undefined;
278
278
  generated: undefined;
279
279
  }, {}, {}>;
280
+ pinned: import("drizzle-orm/sqlite-core").SQLiteColumn<{
281
+ name: "pinned";
282
+ tableName: "discussions";
283
+ dataType: "boolean";
284
+ columnType: "SQLiteBoolean";
285
+ data: boolean;
286
+ driverParam: number;
287
+ notNull: true;
288
+ hasDefault: true;
289
+ isPrimaryKey: false;
290
+ isAutoincrement: false;
291
+ hasRuntimeDefault: false;
292
+ enumValues: undefined;
293
+ baseColumn: never;
294
+ identity: undefined;
295
+ generated: undefined;
296
+ }, {}, {}>;
280
297
  killedNextRetryAt: import("drizzle-orm/sqlite-core").SQLiteColumn<{
281
298
  name: "killedNextRetryAt";
282
299
  tableName: "discussions";
@@ -22,6 +22,7 @@ export const discussions = sqliteTable('discussions', {
22
22
  mode: 'timestamp_ms',
23
23
  }),
24
24
  unreadCount: integer('unreadCount').notNull().default(0),
25
+ pinned: integer('pinned', { mode: 'boolean' }).notNull().default(false),
25
26
  killedNextRetryAt: integer('killedNextRetryAt', { mode: 'timestamp_ms' }),
26
27
  saturatedRetryAt: integer('saturatedRetryAt', { mode: 'timestamp_ms' }),
27
28
  saturatedRetryDone: integer('saturatedRetryDone', { mode: 'boolean' })
@@ -98,4 +98,9 @@ export declare class DiscussionService {
98
98
  get(contactUserId: string): Promise<Discussion | undefined>;
99
99
  /** Update the custom name of a discussion */
100
100
  updateName(discussionId: number, name: string | undefined): Promise<UpdateDiscussionNameResult>;
101
+ /** Pin or unpin a discussion */
102
+ pin(discussionId: number, pinned: boolean): Promise<{
103
+ success: boolean;
104
+ message?: string;
105
+ }>;
101
106
  }
@@ -4,7 +4,7 @@
4
4
  * Class-based service for initializing, accepting, and managing discussions.
5
5
  */
6
6
  import { DiscussionDirection, MessageDirection, MessageStatus, MessageType, serializeSendAnnouncement, } from '../db/index.js';
7
- import { toDiscussion, toSortedDiscussions, updateDiscussionName, } from '../utils/discussions.js';
7
+ import { toDiscussion, toSortedDiscussions, updateDiscussionName, updateDiscussionPin, } from '../utils/discussions.js';
8
8
  import { encodeAnnouncementPayload, } from '../utils/announcementPayload.js';
9
9
  import { UserPublicKeys } from '../wasm/bindings.js';
10
10
  import { Logger } from '../utils/logs.js';
@@ -321,4 +321,8 @@ export class DiscussionService {
321
321
  updateName(discussionId, name) {
322
322
  return updateDiscussionName(discussionId, name, this.queries);
323
323
  }
324
+ /** Pin or unpin a discussion */
325
+ pin(discussionId, pinned) {
326
+ return updateDiscussionPin(discussionId, pinned, this.queries);
327
+ }
324
328
  }
@@ -10,6 +10,10 @@ import { Queries } from '../db/queries/index.js';
10
10
  export declare function toDiscussion(row: DiscussionRow): Discussion;
11
11
  /** Convert discussion rows to sorted Discussion[]. Most recent activity first. */
12
12
  export declare function toSortedDiscussions(rows: DiscussionRow[]): Discussion[];
13
+ export declare function updateDiscussionPin(discussionId: number, pinned: boolean, queries: Queries): Promise<{
14
+ success: boolean;
15
+ message?: string;
16
+ }>;
13
17
  export type UpdateDiscussionNameResult = {
14
18
  success: true;
15
19
  trimmedName: string | undefined;
@@ -21,6 +21,22 @@ export function toSortedDiscussions(rows) {
21
21
  return b.createdAt.getTime() - a.createdAt.getTime();
22
22
  });
23
23
  }
24
+ export async function updateDiscussionPin(discussionId, pinned, queries) {
25
+ try {
26
+ const discussion = await queries.discussions.getById(discussionId);
27
+ if (!discussion)
28
+ return { success: false, message: 'Discussion not found.' };
29
+ await queries.discussions.updateById(discussionId, { pinned });
30
+ return { success: true };
31
+ }
32
+ catch (e) {
33
+ console.error('updateDiscussionPin failed', e);
34
+ return {
35
+ success: false,
36
+ message: 'Failed to update pin. Please try again.',
37
+ };
38
+ }
39
+ }
24
40
  /**
25
41
  * Update the custom name of a discussion.
26
42
  * Pass an empty string or undefined to clear the custom name (will revert to contact name).
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@massalabs/gossip-sdk",
3
- "version": "0.0.2-dev.20260316144414",
3
+ "version": "0.0.2-dev.20260317085237",
4
4
  "description": "Gossip SDK for automation, chatbot, and integration use cases",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",