@anuma/sdk 1.1.6 → 1.2.1

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.
@@ -2468,84 +2468,50 @@ async function getMessagesPageOp(ctx, convId, opts) {
2468
2468
  )
2469
2469
  );
2470
2470
  }
2471
- function narrowSkeletonRow(raw) {
2472
- return {
2473
- id: raw.id,
2474
- message_id: raw.message_id,
2475
- conversation_id: raw.conversation_id,
2476
- role: raw.role,
2477
- created_at: raw.created_at,
2478
- parent_message_id: raw.parent_message_id ?? null,
2479
- model: raw.model ?? null,
2480
- content: raw.content ?? null
2481
- };
2482
- }
2483
- async function fetchThreadSkeletonRawPaged(collection, convId, pageSize = SKELETON_PAGE_SIZE) {
2484
- const all = [];
2485
- let cursor;
2486
- for (; ; ) {
2487
- const clauses = [import_watermelondb.Q.where("conversation_id", convId)];
2488
- if (cursor) {
2489
- clauses.push(
2490
- import_watermelondb.Q.or(
2491
- import_watermelondb.Q.where("message_id", import_watermelondb.Q.gt(cursor.messageId)),
2492
- import_watermelondb.Q.and(import_watermelondb.Q.where("message_id", cursor.messageId), import_watermelondb.Q.where("id", import_watermelondb.Q.gt(cursor.id)))
2493
- )
2494
- );
2495
- }
2496
- const page = await collection.query(...clauses, import_watermelondb.Q.sortBy("message_id", import_watermelondb.Q.asc), import_watermelondb.Q.sortBy("id", import_watermelondb.Q.asc), import_watermelondb.Q.take(pageSize)).unsafeFetchRaw();
2497
- if (page.length === 0) break;
2498
- for (const raw of page) all.push(narrowSkeletonRow(raw));
2499
- if (page.length < pageSize) break;
2500
- const last = all[all.length - 1];
2501
- cursor = { messageId: last.message_id, id: last.id };
2502
- }
2503
- return all;
2504
- }
2505
- function collectArtifactIndices(rows, roleById) {
2506
- const indices = [];
2507
- for (let i = 0; i < rows.length; i++) {
2508
- const row = rows[i];
2509
- if (row.role !== "user" || !row.parent_message_id) continue;
2510
- if (roleById.get(row.parent_message_id) === "user") indices.push(i);
2511
- }
2512
- return indices;
2513
- }
2514
- async function decryptArtifactContent(skeletons, rows, artifactIndices, ctx) {
2515
- const address = ctx.walletAddress;
2516
- if (artifactIndices.length === 0 || !address) {
2517
- for (const i of artifactIndices) skeletons[i].content = rows[i].content ?? void 0;
2518
- return;
2519
- }
2520
- if (ctx.signMessage) {
2521
- try {
2522
- await requestEncryptionKey(address, ctx.signMessage, ctx.embeddedWalletSigner);
2523
- } catch (error) {
2524
- getLogger().warn("Failed to request encryption key for skeleton decryption:", error);
2525
- }
2526
- }
2527
- await Promise.all(
2528
- artifactIndices.map(async (i) => {
2529
- skeletons[i].content = await decryptField(rows[i].content ?? "", address);
2530
- })
2531
- );
2532
- }
2533
2471
  async function getMessageSkeletonsOp(ctx, convId) {
2534
- const rows = await fetchThreadSkeletonRawPaged(ctx.messagesCollection, convId);
2472
+ const results = await ctx.messagesCollection.query(import_watermelondb.Q.where("conversation_id", convId), import_watermelondb.Q.sortBy("message_id", import_watermelondb.Q.asc)).fetch();
2535
2473
  const roleById = /* @__PURE__ */ new Map();
2536
- for (const row of rows) roleById.set(row.id, row.role);
2537
- const skeletons = rows.map((row) => ({
2538
- uniqueId: row.id,
2539
- messageId: row.message_id,
2540
- conversationId: String(row.conversation_id),
2541
- role: row.role,
2542
- createdAt: new Date(row.created_at),
2474
+ for (const msg of results) {
2475
+ roleById.set(msg.id, msg.role);
2476
+ }
2477
+ const skeletons = results.map((msg) => ({
2478
+ uniqueId: msg.id,
2479
+ messageId: msg.messageId,
2480
+ conversationId: String(msg._getRaw("conversation_id")),
2481
+ role: msg.role,
2482
+ createdAt: msg.createdAt,
2543
2483
  // WatermelonDB surfaces unset text columns as null at runtime — normalize
2544
2484
  // to undefined so `parentMessageId ?? undefined` keying works everywhere.
2545
- parentMessageId: row.parent_message_id ?? void 0,
2546
- model: row.model ?? void 0
2485
+ parentMessageId: msg.parentMessageId ?? void 0,
2486
+ model: msg.model ?? void 0
2547
2487
  }));
2548
- await decryptArtifactContent(skeletons, rows, collectArtifactIndices(rows, roleById), ctx);
2488
+ const artifactIndices = [];
2489
+ for (let i = 0; i < results.length; i++) {
2490
+ const msg = results[i];
2491
+ if (msg.role !== "user" || !msg.parentMessageId) continue;
2492
+ if (roleById.get(msg.parentMessageId) === "user") {
2493
+ artifactIndices.push(i);
2494
+ }
2495
+ }
2496
+ const address = ctx.walletAddress;
2497
+ if (artifactIndices.length > 0 && address) {
2498
+ if (ctx.signMessage) {
2499
+ try {
2500
+ await requestEncryptionKey(address, ctx.signMessage, ctx.embeddedWalletSigner);
2501
+ } catch (error) {
2502
+ getLogger().warn("Failed to request encryption key for skeleton decryption:", error);
2503
+ }
2504
+ }
2505
+ await Promise.all(
2506
+ artifactIndices.map(async (i) => {
2507
+ skeletons[i].content = await decryptField(results[i].content, address);
2508
+ })
2509
+ );
2510
+ } else {
2511
+ for (const i of artifactIndices) {
2512
+ skeletons[i].content = results[i].content;
2513
+ }
2514
+ }
2549
2515
  return skeletons;
2550
2516
  }
2551
2517
  async function clearMessagesOp(ctx, convId) {
@@ -2936,7 +2902,7 @@ function makeSyntheticStoredConversation(opts, defaultTitle) {
2936
2902
  isDeleted: false
2937
2903
  };
2938
2904
  }
2939
- var import_watermelondb, import_uuid2, SKELETON_PAGE_SIZE;
2905
+ var import_watermelondb, import_uuid2;
2940
2906
  var init_operations = __esm({
2941
2907
  "src/lib/db/chat/operations.ts"() {
2942
2908
  "use strict";
@@ -2949,7 +2915,6 @@ var init_operations = __esm({
2949
2915
  init_conversationEncryption();
2950
2916
  init_encryption();
2951
2917
  init_types2();
2952
- SKELETON_PAGE_SIZE = 2e3;
2953
2918
  }
2954
2919
  });
2955
2920
 
@@ -19976,7 +19941,6 @@ var DatabaseManager = class {
19976
19941
  from: this.currentWalletAddress,
19977
19942
  to: walletAddress
19978
19943
  });
19979
- void this.disposeAdapter(this.database);
19980
19944
  this.database = null;
19981
19945
  }
19982
19946
  if (this.database) {
@@ -20006,37 +19970,11 @@ var DatabaseManager = class {
20006
19970
  async resetDatabase() {
20007
19971
  const db = this.database;
20008
19972
  if (db) {
20009
- this.database = null;
20010
- this.currentWalletAddress = void 0;
20011
19973
  await db.write(async () => {
20012
19974
  await db.unsafeResetDatabase();
20013
19975
  });
20014
- await this.disposeAdapter(db);
20015
- }
20016
- }
20017
- /**
20018
- * Best-effort dispose of the adapter backing a Database, if it exposes one.
20019
- *
20020
- * OPFS/SQLite adapters use this to terminate their dedicated worker and release
20021
- * the exclusive SAHPool (+ WASM heap) they hold. The SDK only sees a generic
20022
- * `DatabaseAdapter`, so we probe `adapter.underlyingAdapter.dispose` rather than
20023
- * type it. Client-side implementations are refcounted + idempotent, so calling
20024
- * this is safe even when the adapter factory also disposes.
20025
- *
20026
- * Awaitable and never rejects: a sync throw or async rejection from `dispose`
20027
- * is caught + logged. Awaited on the async `resetDatabase` path so teardown
20028
- * completes before the caller reopens; fire-and-forget on the synchronous
20029
- * `getDatabase` path (which cannot block).
20030
- */
20031
- async disposeAdapter(db) {
20032
- try {
20033
- const underlying = db.adapter?.underlyingAdapter;
20034
- await underlying?.dispose?.();
20035
- } catch (error) {
20036
- this.logger.warn?.("Adapter dispose failed", {
20037
- component: "DatabaseManager",
20038
- error
20039
- });
19976
+ this.database = null;
19977
+ this.currentWalletAddress = void 0;
20040
19978
  }
20041
19979
  }
20042
19980
  /**
@@ -8103,21 +8103,6 @@ declare class DatabaseManager {
8103
8103
  * Reset the current database (useful for logout or testing).
8104
8104
  */
8105
8105
  resetDatabase(): Promise<void>;
8106
- /**
8107
- * Best-effort dispose of the adapter backing a Database, if it exposes one.
8108
- *
8109
- * OPFS/SQLite adapters use this to terminate their dedicated worker and release
8110
- * the exclusive SAHPool (+ WASM heap) they hold. The SDK only sees a generic
8111
- * `DatabaseAdapter`, so we probe `adapter.underlyingAdapter.dispose` rather than
8112
- * type it. Client-side implementations are refcounted + idempotent, so calling
8113
- * this is safe even when the adapter factory also disposes.
8114
- *
8115
- * Awaitable and never rejects: a sync throw or async rejection from `dispose`
8116
- * is caught + logged. Awaited on the async `resetDatabase` path so teardown
8117
- * completes before the caller reopens; fire-and-forget on the synchronous
8118
- * `getDatabase` path (which cannot block).
8119
- */
8120
- private disposeAdapter;
8121
8106
  /**
8122
8107
  * Check and handle schema migrations for a specific wallet.
8123
8108
  * Returns true if a destructive migration is in progress.
@@ -8103,21 +8103,6 @@ declare class DatabaseManager {
8103
8103
  * Reset the current database (useful for logout or testing).
8104
8104
  */
8105
8105
  resetDatabase(): Promise<void>;
8106
- /**
8107
- * Best-effort dispose of the adapter backing a Database, if it exposes one.
8108
- *
8109
- * OPFS/SQLite adapters use this to terminate their dedicated worker and release
8110
- * the exclusive SAHPool (+ WASM heap) they hold. The SDK only sees a generic
8111
- * `DatabaseAdapter`, so we probe `adapter.underlyingAdapter.dispose` rather than
8112
- * type it. Client-side implementations are refcounted + idempotent, so calling
8113
- * this is safe even when the adapter factory also disposes.
8114
- *
8115
- * Awaitable and never rejects: a sync throw or async rejection from `dispose`
8116
- * is caught + logged. Awaited on the async `resetDatabase` path so teardown
8117
- * completes before the caller reopens; fire-and-forget on the synchronous
8118
- * `getDatabase` path (which cannot block).
8119
- */
8120
- private disposeAdapter;
8121
8106
  /**
8122
8107
  * Check and handle schema migrations for a specific wallet.
8123
8108
  * Returns true if a destructive migration is in progress.
@@ -121,7 +121,7 @@ import {
121
121
  updateVaultMemoryEmbeddingOp,
122
122
  updateVaultMemoryOp,
123
123
  useEncryption
124
- } from "./chunk-DC6J5RX5.mjs";
124
+ } from "./chunk-KQZ4KVYY.mjs";
125
125
  import {
126
126
  PiiRedactor,
127
127
  createStreamingDeAnonymizer,
@@ -12664,7 +12664,6 @@ var DatabaseManager = class {
12664
12664
  from: this.currentWalletAddress,
12665
12665
  to: walletAddress
12666
12666
  });
12667
- void this.disposeAdapter(this.database);
12668
12667
  this.database = null;
12669
12668
  }
12670
12669
  if (this.database) {
@@ -12694,37 +12693,11 @@ var DatabaseManager = class {
12694
12693
  async resetDatabase() {
12695
12694
  const db = this.database;
12696
12695
  if (db) {
12697
- this.database = null;
12698
- this.currentWalletAddress = void 0;
12699
12696
  await db.write(async () => {
12700
12697
  await db.unsafeResetDatabase();
12701
12698
  });
12702
- await this.disposeAdapter(db);
12703
- }
12704
- }
12705
- /**
12706
- * Best-effort dispose of the adapter backing a Database, if it exposes one.
12707
- *
12708
- * OPFS/SQLite adapters use this to terminate their dedicated worker and release
12709
- * the exclusive SAHPool (+ WASM heap) they hold. The SDK only sees a generic
12710
- * `DatabaseAdapter`, so we probe `adapter.underlyingAdapter.dispose` rather than
12711
- * type it. Client-side implementations are refcounted + idempotent, so calling
12712
- * this is safe even when the adapter factory also disposes.
12713
- *
12714
- * Awaitable and never rejects: a sync throw or async rejection from `dispose`
12715
- * is caught + logged. Awaited on the async `resetDatabase` path so teardown
12716
- * completes before the caller reopens; fire-and-forget on the synchronous
12717
- * `getDatabase` path (which cannot block).
12718
- */
12719
- async disposeAdapter(db) {
12720
- try {
12721
- const underlying = db.adapter?.underlyingAdapter;
12722
- await underlying?.dispose?.();
12723
- } catch (error) {
12724
- this.logger.warn?.("Adapter dispose failed", {
12725
- component: "DatabaseManager",
12726
- error
12727
- });
12699
+ this.database = null;
12700
+ this.currentWalletAddress = void 0;
12728
12701
  }
12729
12702
  }
12730
12703
  /**
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  recall
3
- } from "./chunk-DC6J5RX5.mjs";
3
+ } from "./chunk-KQZ4KVYY.mjs";
4
4
  import "./chunk-DFVCS3QQ.mjs";
5
5
  import "./chunk-GYKJOWEO.mjs";
6
6
  export {
@@ -18838,7 +18838,7 @@ function createMemoryVaultSearchTool(vaultCtx, embeddingOptions, cache, searchOp
18838
18838
  legacy.map((r) => ({ id: r.uniqueId, content: r.content, score: r.similarity }))
18839
18839
  );
18840
18840
  }
18841
- const { recall: recall2 } = await import("./recall-V4763HKS.mjs");
18841
+ const { recall: recall2 } = await import("./recall-IF2HX7ZA.mjs");
18842
18842
  const result = await recall2(
18843
18843
  query,
18844
18844
  { vaultCtx, embeddingOptions, vaultCache: cache },
@@ -22877,7 +22877,6 @@ var DatabaseManager = class {
22877
22877
  from: this.currentWalletAddress,
22878
22878
  to: walletAddress
22879
22879
  });
22880
- void this.disposeAdapter(this.database);
22881
22880
  this.database = null;
22882
22881
  }
22883
22882
  if (this.database) {
@@ -22907,37 +22906,11 @@ var DatabaseManager = class {
22907
22906
  async resetDatabase() {
22908
22907
  const db = this.database;
22909
22908
  if (db) {
22910
- this.database = null;
22911
- this.currentWalletAddress = void 0;
22912
22909
  await db.write(async () => {
22913
22910
  await db.unsafeResetDatabase();
22914
22911
  });
22915
- await this.disposeAdapter(db);
22916
- }
22917
- }
22918
- /**
22919
- * Best-effort dispose of the adapter backing a Database, if it exposes one.
22920
- *
22921
- * OPFS/SQLite adapters use this to terminate their dedicated worker and release
22922
- * the exclusive SAHPool (+ WASM heap) they hold. The SDK only sees a generic
22923
- * `DatabaseAdapter`, so we probe `adapter.underlyingAdapter.dispose` rather than
22924
- * type it. Client-side implementations are refcounted + idempotent, so calling
22925
- * this is safe even when the adapter factory also disposes.
22926
- *
22927
- * Awaitable and never rejects: a sync throw or async rejection from `dispose`
22928
- * is caught + logged. Awaited on the async `resetDatabase` path so teardown
22929
- * completes before the caller reopens; fire-and-forget on the synchronous
22930
- * `getDatabase` path (which cannot block).
22931
- */
22932
- async disposeAdapter(db) {
22933
- try {
22934
- const underlying = db.adapter?.underlyingAdapter;
22935
- await underlying?.dispose?.();
22936
- } catch (error) {
22937
- this.logger.warn?.("Adapter dispose failed", {
22938
- component: "DatabaseManager",
22939
- error
22940
- });
22912
+ this.database = null;
22913
+ this.currentWalletAddress = void 0;
22941
22914
  }
22942
22915
  }
22943
22916
  /**
@@ -27189,6 +27162,7 @@ var TOOL_CATALOG = {
27189
27162
  // Slack (src/tools/slack.ts)
27190
27163
  slack_get_me: { label: "Get my Slack profile", provider: "slack", connector: "Slack" },
27191
27164
  slack_list_channels: { label: "List channels", provider: "slack", connector: "Slack" },
27165
+ slack_list_dms: { label: "List direct messages", provider: "slack", connector: "Slack" },
27192
27166
  slack_search_messages: { label: "Search messages", provider: "slack", connector: "Slack" },
27193
27167
  slack_list_users: { label: "List members", provider: "slack", connector: "Slack" },
27194
27168
  slack_get_channel_history: {
@@ -274,21 +274,6 @@ declare class DatabaseManager {
274
274
  * Reset the current database (useful for logout or testing).
275
275
  */
276
276
  resetDatabase(): Promise<void>;
277
- /**
278
- * Best-effort dispose of the adapter backing a Database, if it exposes one.
279
- *
280
- * OPFS/SQLite adapters use this to terminate their dedicated worker and release
281
- * the exclusive SAHPool (+ WASM heap) they hold. The SDK only sees a generic
282
- * `DatabaseAdapter`, so we probe `adapter.underlyingAdapter.dispose` rather than
283
- * type it. Client-side implementations are refcounted + idempotent, so calling
284
- * this is safe even when the adapter factory also disposes.
285
- *
286
- * Awaitable and never rejects: a sync throw or async rejection from `dispose`
287
- * is caught + logged. Awaited on the async `resetDatabase` path so teardown
288
- * completes before the caller reopens; fire-and-forget on the synchronous
289
- * `getDatabase` path (which cannot block).
290
- */
291
- private disposeAdapter;
292
277
  /**
293
278
  * Check and handle schema migrations for a specific wallet.
294
279
  * Returns true if a destructive migration is in progress.
@@ -274,21 +274,6 @@ declare class DatabaseManager {
274
274
  * Reset the current database (useful for logout or testing).
275
275
  */
276
276
  resetDatabase(): Promise<void>;
277
- /**
278
- * Best-effort dispose of the adapter backing a Database, if it exposes one.
279
- *
280
- * OPFS/SQLite adapters use this to terminate their dedicated worker and release
281
- * the exclusive SAHPool (+ WASM heap) they hold. The SDK only sees a generic
282
- * `DatabaseAdapter`, so we probe `adapter.underlyingAdapter.dispose` rather than
283
- * type it. Client-side implementations are refcounted + idempotent, so calling
284
- * this is safe even when the adapter factory also disposes.
285
- *
286
- * Awaitable and never rejects: a sync throw or async rejection from `dispose`
287
- * is caught + logged. Awaited on the async `resetDatabase` path so teardown
288
- * completes before the caller reopens; fire-and-forget on the synchronous
289
- * `getDatabase` path (which cannot block).
290
- */
291
- private disposeAdapter;
292
277
  /**
293
278
  * Check and handle schema migrations for a specific wallet.
294
279
  * Returns true if a destructive migration is in progress.
@@ -95,7 +95,7 @@ import {
95
95
  updateVaultMemoryEmbeddingOp,
96
96
  updateVaultMemoryOp,
97
97
  upsertMessageOp
98
- } from "./chunk-MKRSHU4S.mjs";
98
+ } from "./chunk-KLJBJWWI.mjs";
99
99
  import {
100
100
  createStreamingDeAnonymizer,
101
101
  resolvePiiRedactor
@@ -1984,7 +1984,6 @@ var DatabaseManager = class {
1984
1984
  from: this.currentWalletAddress,
1985
1985
  to: walletAddress
1986
1986
  });
1987
- void this.disposeAdapter(this.database);
1988
1987
  this.database = null;
1989
1988
  }
1990
1989
  if (this.database) {
@@ -2014,37 +2013,11 @@ var DatabaseManager = class {
2014
2013
  async resetDatabase() {
2015
2014
  const db = this.database;
2016
2015
  if (db) {
2017
- this.database = null;
2018
- this.currentWalletAddress = void 0;
2019
2016
  await db.write(async () => {
2020
2017
  await db.unsafeResetDatabase();
2021
2018
  });
2022
- await this.disposeAdapter(db);
2023
- }
2024
- }
2025
- /**
2026
- * Best-effort dispose of the adapter backing a Database, if it exposes one.
2027
- *
2028
- * OPFS/SQLite adapters use this to terminate their dedicated worker and release
2029
- * the exclusive SAHPool (+ WASM heap) they hold. The SDK only sees a generic
2030
- * `DatabaseAdapter`, so we probe `adapter.underlyingAdapter.dispose` rather than
2031
- * type it. Client-side implementations are refcounted + idempotent, so calling
2032
- * this is safe even when the adapter factory also disposes.
2033
- *
2034
- * Awaitable and never rejects: a sync throw or async rejection from `dispose`
2035
- * is caught + logged. Awaited on the async `resetDatabase` path so teardown
2036
- * completes before the caller reopens; fire-and-forget on the synchronous
2037
- * `getDatabase` path (which cannot block).
2038
- */
2039
- async disposeAdapter(db) {
2040
- try {
2041
- const underlying = db.adapter?.underlyingAdapter;
2042
- await underlying?.dispose?.();
2043
- } catch (error) {
2044
- this.logger.warn?.("Adapter dispose failed", {
2045
- component: "DatabaseManager",
2046
- error
2047
- });
2019
+ this.database = null;
2020
+ this.currentWalletAddress = void 0;
2048
2021
  }
2049
2022
  }
2050
2023
  /**
@@ -6244,6 +6217,7 @@ var TOOL_CATALOG = {
6244
6217
  // Slack (src/tools/slack.ts)
6245
6218
  slack_get_me: { label: "Get my Slack profile", provider: "slack", connector: "Slack" },
6246
6219
  slack_list_channels: { label: "List channels", provider: "slack", connector: "Slack" },
6220
+ slack_list_dms: { label: "List direct messages", provider: "slack", connector: "Slack" },
6247
6221
  slack_search_messages: { label: "Search messages", provider: "slack", connector: "Slack" },
6248
6222
  slack_list_users: { label: "List members", provider: "slack", connector: "Slack" },
6249
6223
  slack_get_channel_history: {
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  recall
3
- } from "./chunk-MKRSHU4S.mjs";
3
+ } from "./chunk-KLJBJWWI.mjs";
4
4
  import "./chunk-RCCKRTBI.mjs";
5
5
  import "./chunk-FMGZTVXQ.mjs";
6
6
  export {