openmates 0.29.0-alpha.7 → 0.29.0-alpha.8

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 CHANGED
@@ -384,8 +384,11 @@ launches the CLI and never reads CLI login state. Credentials are explicit:
384
384
  log in with `loginPassword()` or import a caller-owned session. If the native
385
385
  module for your platform is missing or incompatible, construction throws
386
386
  `SessionClientError` with code `native_binding_unavailable` (no TypeScript
387
- fallback). Prebuilt artifacts are not yet published; from a source checkout run
388
- `npm run build:sdk:native`.
387
+ fallback). The SDK is moving to one portable WebAssembly build of the core
388
+ (`wasm/openmates_sdk_bg.wasm`, for Node, Deno, Bun, edge and browsers): privacy
389
+ helpers, task ordering and embed-version reconstruction already use it. Prebuilt
390
+ artifacts are not yet published; from a source checkout run
391
+ `npm run build:sdk:wasm` and `npm run build:sdk:native`.
389
392
 
390
393
  ## Versioning
391
394
 
@@ -68,7 +68,7 @@ import {
68
68
  serializeAssumptionProofInputs,
69
69
  validatePublicChatEncryptionKeyId,
70
70
  writeAccountExportArchive
71
- } from "./chunk-MNOHHJLL.js";
71
+ } from "./chunk-OEOKK5FT.js";
72
72
  import {
73
73
  TASK_STATUSES,
74
74
  base64ToBytes,
@@ -11804,8 +11804,24 @@ function safeArchiveSegment(value) {
11804
11804
  return cleaned || "unknown";
11805
11805
  }
11806
11806
 
11807
- // src/sdkEmbedVersion.ts
11807
+ // src/sdkWasm.ts
11808
11808
  import { createRequire } from "module";
11809
+ import { readFileSync } from "fs";
11810
+ var loaded = null;
11811
+ function loadSdkWasm() {
11812
+ if (loaded) return loaded;
11813
+ try {
11814
+ const glue = createRequire(import.meta.url)("../wasm/openmates_sdk.js");
11815
+ glue.initSync({ module: readFileSync(new URL("../wasm/openmates_sdk_bg.wasm", import.meta.url)) });
11816
+ if ([glue.privacy, glue.taskOrder, glue.reconstructEmbedVersion].some((fn) => typeof fn !== "function")) return null;
11817
+ loaded = glue;
11818
+ } catch {
11819
+ return null;
11820
+ }
11821
+ return loaded;
11822
+ }
11823
+
11824
+ // src/sdkEmbedVersion.ts
11809
11825
  function reconstructEmbedVersionLocal(rows, key) {
11810
11826
  let encoded;
11811
11827
  try {
@@ -11815,13 +11831,8 @@ function reconstructEmbedVersionLocal(rows, key) {
11815
11831
  } catch {
11816
11832
  throw new SessionClientError("invalid_argument", "Invalid typed version reconstruction input.");
11817
11833
  }
11818
- let native;
11819
- try {
11820
- native = createRequire(import.meta.url)(`../native/${process.platform}-${process.arch}.node`);
11821
- } catch {
11822
- throw new SessionClientError("native_binding_unavailable", "Install a native SDK build containing version reconstruction.");
11823
- }
11824
- if (typeof native.reconstructEmbedVersion !== "function") throw new SessionClientError("native_binding_unavailable", "Install a native SDK build containing version reconstruction.");
11834
+ const native = loadSdkWasm();
11835
+ if (!native) throw new SessionClientError("native_binding_unavailable", "Install an OpenMates SDK build containing its WebAssembly module.");
11825
11836
  try {
11826
11837
  const content = native.reconstructEmbedVersion(encoded);
11827
11838
  if (typeof content !== "string" || Buffer.byteLength(content, "utf8") > 16 * 1024 * 1024) throw Error();
@@ -12042,7 +12053,7 @@ async function createAccountChatIdentity(masterKey) {
12042
12053
  }
12043
12054
 
12044
12055
  // src/sdk.ts
12045
- import { chmodSync, existsSync, mkdirSync, readFileSync, writeFileSync } from "fs";
12056
+ import { chmodSync, existsSync, mkdirSync, readFileSync as readFileSync2, writeFileSync } from "fs";
12046
12057
  import { homedir } from "os";
12047
12058
  import { dirname as dirname2, join } from "path";
12048
12059
 
@@ -13114,7 +13125,7 @@ var OpenMates = class {
13114
13125
  function loadOrCreateDeviceId(customPath) {
13115
13126
  const path = customPath ?? join(homedir(), ".openmates", "sdk-device-id");
13116
13127
  if (existsSync(path)) {
13117
- const stored = readFileSync(path, "utf8").trim();
13128
+ const stored = readFileSync2(path, "utf8").trim();
13118
13129
  if (stored) return stored;
13119
13130
  }
13120
13131
  const deviceId = randomUUID3();
@@ -13731,8 +13742,8 @@ var OpenMatesChats = class {
13731
13742
  }
13732
13743
  async addToProject(chatId, projectId, options = {}) {
13733
13744
  const { record, projectKey } = await resolveSdkProject(this.client, projectId);
13734
- const loaded = await this.load(chatId);
13735
- const chat = loaded.chat;
13745
+ const loaded2 = await this.load(chatId);
13746
+ const chat = loaded2.chat;
13736
13747
  const targetId = String(chat?.id ?? chatId);
13737
13748
  const displayName = typeof chat?.title === "string" ? chat.title : targetId;
13738
13749
  return createSdkProjectItem(this.client, record.project_id, projectKey, {
@@ -13745,18 +13756,18 @@ var OpenMatesChats = class {
13745
13756
  }
13746
13757
  async removeFromProject(chatId, projectId) {
13747
13758
  const resolvedProjectId = await resolveSdkProjectId(this.client, projectId);
13748
- const loaded = await this.load(chatId);
13749
- const chat = loaded.chat;
13759
+ const loaded2 = await this.load(chatId);
13760
+ const chat = loaded2.chat;
13750
13761
  return deleteSdkProjectItemByTarget(this.client, resolvedProjectId, "chat", String(chat?.id ?? chatId));
13751
13762
  }
13752
13763
  async messages(options) {
13753
13764
  if (options.all === true) {
13754
- const loaded2 = await this.load(options.chatId);
13755
- const chat2 = loaded2.chat;
13765
+ const loaded3 = await this.load(options.chatId);
13766
+ const chat2 = loaded3.chat;
13756
13767
  if (!chat2) {
13757
13768
  throw new OpenMatesConfigError("Saved chat payload did not include chat metadata");
13758
13769
  }
13759
- const messages = normalizeLoadedChatMessages(loaded2);
13770
+ const messages = normalizeLoadedChatMessages(loaded3);
13760
13771
  return {
13761
13772
  chat: chat2,
13762
13773
  messages,
@@ -13789,20 +13800,20 @@ var OpenMatesChats = class {
13789
13800
  const resolvedChatId = await resolveSdkChatId(this.client, options.chatId);
13790
13801
  payload = await this.client.get(messageWindowPath(resolvedChatId));
13791
13802
  }
13792
- const loaded = await this.client.decryptLoadedChatPayload(payload);
13793
- const chat = loaded.chat;
13803
+ const loaded2 = await this.client.decryptLoadedChatPayload(payload);
13804
+ const chat = loaded2.chat;
13794
13805
  if (!chat) {
13795
13806
  throw new OpenMatesConfigError("Saved chat payload did not include chat metadata");
13796
13807
  }
13797
13808
  return {
13798
13809
  chat,
13799
- messages: normalizeLoadedChatMessages(loaded),
13800
- hasMoreBefore: loaded.has_more_before === true,
13801
- hasMoreAfter: loaded.has_more_after === true,
13802
- startCursor: loaded.start_cursor ?? null,
13803
- endCursor: loaded.end_cursor ?? null,
13804
- anchorFound: loaded.anchor_found !== false,
13805
- serverMessageCount: typeof loaded.server_message_count === "number" ? loaded.server_message_count : null
13810
+ messages: normalizeLoadedChatMessages(loaded2),
13811
+ hasMoreBefore: loaded2.has_more_before === true,
13812
+ hasMoreAfter: loaded2.has_more_after === true,
13813
+ startCursor: loaded2.start_cursor ?? null,
13814
+ endCursor: loaded2.end_cursor ?? null,
13815
+ anchorFound: loaded2.anchor_found !== false,
13816
+ serverMessageCount: typeof loaded2.server_message_count === "number" ? loaded2.server_message_count : null
13806
13817
  };
13807
13818
  }
13808
13819
  async *messagePages(options) {
@@ -13825,8 +13836,8 @@ var OpenMatesChats = class {
13825
13836
  }
13826
13837
  }
13827
13838
  async fork(options) {
13828
- const { loaded, chat } = await this.loadPersonalEncryptedChat(options.chatId);
13829
- const messages = normalizeLoadedChatMessages(loaded);
13839
+ const { loaded: loaded2, chat } = await this.loadPersonalEncryptedChat(options.chatId);
13840
+ const messages = normalizeLoadedChatMessages(loaded2);
13830
13841
  const boundaryIndex = findMessageBoundaryIndex(messages, options.fromMessageId);
13831
13842
  const sourceSlice = messages.slice(0, boundaryIndex + 1);
13832
13843
  const masterKey = await this.client.masterKey();
@@ -13887,8 +13898,8 @@ var OpenMatesChats = class {
13887
13898
  if (!options.dryRun) {
13888
13899
  requireConfirmed({ confirmed: options.confirmDestructive === true }, "Rewinding a chat");
13889
13900
  }
13890
- const { loaded, chat } = await this.loadPersonalEncryptedChat(options.chatId);
13891
- const messages = normalizeLoadedChatMessages(loaded);
13901
+ const { loaded: loaded2, chat } = await this.loadPersonalEncryptedChat(options.chatId);
13902
+ const messages = normalizeLoadedChatMessages(loaded2);
13892
13903
  findMessageBoundaryIndex(messages, options.toMessageId);
13893
13904
  const rewind = await this.client.request(`/v1/sdk/chats/${encodeURIComponent(chat.id)}/rewind`, {
13894
13905
  protocol_version: 1,
@@ -13907,8 +13918,8 @@ var OpenMatesChats = class {
13907
13918
  if (!options.dryRun) {
13908
13919
  requireConfirmed({ confirmed: options.confirmDestructive === true }, "Retrying a chat");
13909
13920
  }
13910
- const { loaded } = await this.loadPersonalEncryptedChat(options.chatId);
13911
- const messages = normalizeLoadedChatMessages(loaded);
13921
+ const { loaded: loaded2 } = await this.loadPersonalEncryptedChat(options.chatId);
13922
+ const messages = normalizeLoadedChatMessages(loaded2);
13912
13923
  const retryIndex = findRetryableUserMessageIndex(messages);
13913
13924
  if (retryIndex < 0) {
13914
13925
  throw new OpenMatesConfigError("No retryable user message found for this chat");
@@ -13984,9 +13995,9 @@ var OpenMatesChats = class {
13984
13995
  if (teamId) {
13985
13996
  throw new OpenMatesConfigError("Sending to an existing Team chat is not supported yet");
13986
13997
  }
13987
- const loaded = await this.load(chatId);
13988
- const chat = loaded.chat;
13989
- loadedMessages = normalizeLoadedChatMessages(loaded);
13998
+ const loaded2 = await this.load(chatId);
13999
+ const chat = loaded2.chat;
14000
+ loadedMessages = normalizeLoadedChatMessages(loaded2);
13990
14001
  if (!chat?.encrypted_chat_key) {
13991
14002
  throw new OpenMatesConfigError("Saved chat does not include encrypted chat key material");
13992
14003
  }
@@ -14230,8 +14241,8 @@ var OpenMatesChats = class {
14230
14241
  return this.client.delete(`/v1/sdk/chats/${encodeURIComponent(await resolveSdkChatId(this.client, chatId))}`);
14231
14242
  }
14232
14243
  async share(chatId, options = {}) {
14233
- const loaded = await this.load(chatId);
14234
- const chat = loaded.chat;
14244
+ const loaded2 = await this.load(chatId);
14245
+ const chat = loaded2.chat;
14235
14246
  if (!chat?.encrypted_chat_key) {
14236
14247
  throw new OpenMatesConfigError("Chat does not include an encrypted chat key");
14237
14248
  }
@@ -14256,8 +14267,8 @@ var OpenMatesChats = class {
14256
14267
  return this.send(message, { saveToAccount: false });
14257
14268
  }
14258
14269
  async loadPersonalEncryptedChat(chatId) {
14259
- const loaded = await this.load(chatId);
14260
- const chat = loaded.chat;
14270
+ const loaded2 = await this.load(chatId);
14271
+ const chat = loaded2.chat;
14261
14272
  if (!chat) {
14262
14273
  throw new OpenMatesConfigError("Saved chat payload did not include chat metadata");
14263
14274
  }
@@ -14271,7 +14282,7 @@ var OpenMatesChats = class {
14271
14282
  if (!chatKey) {
14272
14283
  throw new OpenMatesConfigError("Unable to decrypt saved chat key material");
14273
14284
  }
14274
- return { loaded, chat, chatKey };
14285
+ return { loaded: loaded2, chat, chatKey };
14275
14286
  }
14276
14287
  };
14277
14288
  function normalizeLoadedChatMessages(payload) {
@@ -16873,6 +16884,7 @@ export {
16873
16884
  planKeyFromRecord,
16874
16885
  rewriteRememberMessageReferences,
16875
16886
  hasRememberMessageReference,
16887
+ loadSdkWasm,
16876
16888
  OpenMatesProjectSourceAuthoringUnavailableError,
16877
16889
  APP_SKILL_METADATA,
16878
16890
  exportDesignIcon,
@@ -1,24 +1,17 @@
1
+ import {
2
+ loadSdkWasm
3
+ } from "./chunk-OEOKK5FT.js";
1
4
  import {
2
5
  SessionClientError
3
6
  } from "./chunk-6AR2CP7K.js";
4
7
 
5
8
  // src/sdkTaskOrder.ts
6
- import { createRequire } from "module";
7
9
  function invalid() {
8
10
  throw new SessionClientError("invalid_argument", "Supply task rows and an explicit locale.");
9
11
  }
10
12
  function nativeOrder(encoded) {
11
- const platform = `${process.platform}-${process.arch}`;
12
- if (!(/* @__PURE__ */ new Set(["linux-arm64", "linux-x64", "darwin-arm64", "darwin-x64", "win32-arm64", "win32-x64"])).has(platform)) {
13
- throw new SessionClientError("native_binding_unavailable", "Install a native SDK build for this platform.");
14
- }
15
- let native;
16
- try {
17
- native = createRequire(import.meta.url)(`../native/${platform}.node`);
18
- } catch {
19
- throw new SessionClientError("native_binding_unavailable", "Install a native SDK build for this platform.");
20
- }
21
- if (typeof native.taskOrder !== "function") throw new SessionClientError("native_binding_unavailable", "Install a native SDK build containing task ordering.");
13
+ const native = loadSdkWasm();
14
+ if (!native) throw new SessionClientError("native_binding_unavailable", "Install an OpenMates SDK build containing its WebAssembly module.");
22
15
  return native.taskOrder(encoded);
23
16
  }
24
17
  function sortTasks(tasks, options) {
package/dist/cli.js CHANGED
@@ -21,11 +21,11 @@ import {
21
21
  shouldRequireTrustedAccountGuard,
22
22
  waitForSafeE2ETotpWindow,
23
23
  waitForWorkflowRun
24
- } from "./chunk-VBI5K4EC.js";
24
+ } from "./chunk-DG355WNG.js";
25
25
  import "./chunk-TMYEFC7M.js";
26
26
  import "./chunk-V2QAI5ET.js";
27
27
  import "./chunk-IWKP55ZB.js";
28
- import "./chunk-MNOHHJLL.js";
28
+ import "./chunk-OEOKK5FT.js";
29
29
  import "./chunk-6AR2CP7K.js";
30
30
  import "./chunk-67U3XD2B.js";
31
31
  import "./chunk-QRCAXXAL.js";
package/dist/index.js CHANGED
@@ -22,13 +22,13 @@ import {
22
22
  selectAssistantMessagesForSpeech,
23
23
  serializeToYaml,
24
24
  summarizeAssistantSpeech
25
- } from "./chunk-VBI5K4EC.js";
25
+ } from "./chunk-DG355WNG.js";
26
26
  import "./chunk-TMYEFC7M.js";
27
27
  import "./chunk-V2QAI5ET.js";
28
28
  import "./chunk-IWKP55ZB.js";
29
29
  import {
30
30
  sortTasks
31
- } from "./chunk-LOIT2IBC.js";
31
+ } from "./chunk-STUHDWNB.js";
32
32
  import {
33
33
  APP_SKILL_METADATA,
34
34
  OpenMates,
@@ -54,7 +54,7 @@ import {
54
54
  renderPlanLearningDetail,
55
55
  renderPlanLearningList,
56
56
  renderPlanList
57
- } from "./chunk-MNOHHJLL.js";
57
+ } from "./chunk-OEOKK5FT.js";
58
58
  import {
59
59
  RustApiKeyClient,
60
60
  RustApiKeyClientError
package/dist/sdk-entry.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  sortTasks
3
- } from "./chunk-LOIT2IBC.js";
3
+ } from "./chunk-STUHDWNB.js";
4
4
  import {
5
5
  APP_SKILL_METADATA,
6
6
  OpenMates,
@@ -38,8 +38,9 @@ import {
38
38
  OpenMatesTeams,
39
39
  OpenMatesUnavailableError,
40
40
  OpenMatesWikipedia,
41
- OpenMatesWorkflows
42
- } from "./chunk-MNOHHJLL.js";
41
+ OpenMatesWorkflows,
42
+ loadSdkWasm
43
+ } from "./chunk-OEOKK5FT.js";
43
44
  import {
44
45
  RustApiKeyClient,
45
46
  RustApiKeyClientError
@@ -64,7 +65,6 @@ import {
64
65
  import "./chunk-67U3XD2B.js";
65
66
 
66
67
  // src/sdkPrivacy.ts
67
- import { createRequire } from "module";
68
68
  var invalid = () => {
69
69
  throw new SessionClientError("invalid_argument", "Invalid typed privacy input.");
70
70
  };
@@ -107,14 +107,8 @@ function call(input) {
107
107
  } catch {
108
108
  return invalid();
109
109
  }
110
- const platform = `${process.platform}-${process.arch}`;
111
- let native;
112
- try {
113
- native = createRequire(import.meta.url)(`../native/${platform}.node`);
114
- } catch {
115
- throw new SessionClientError("native_binding_unavailable", "Install a native SDK build containing privacy operations.");
116
- }
117
- if (typeof native.privacy !== "function") throw new SessionClientError("native_binding_unavailable", "Install a native SDK build containing privacy operations.");
110
+ const native = loadSdkWasm();
111
+ if (!native) throw new SessionClientError("native_binding_unavailable", "Install an OpenMates SDK build containing its WebAssembly module.");
118
112
  try {
119
113
  const result = JSON.parse(native.privacy(encoded));
120
114
  if (!result || typeof result !== "object" || Array.isArray(result) || typeof result.text !== "string") throw new SessionClientError("protocol", "The native privacy result is invalid.");
@@ -17,47 +17,47 @@
17
17
  {
18
18
  "name": "libggml-base.so",
19
19
  "bytes": 1110088,
20
- "sha256": "90b62dcb460829e7cf6a6e59f4b81f74a88c720a91bb189b0aa3c688016d8bed"
20
+ "sha256": "6b162c3983b753293cdbe882eb6bdfd709117ea58542e59e25eeed01a055c346"
21
21
  },
22
22
  {
23
23
  "name": "libggml-base.so.0",
24
24
  "bytes": 1110088,
25
- "sha256": "90b62dcb460829e7cf6a6e59f4b81f74a88c720a91bb189b0aa3c688016d8bed"
25
+ "sha256": "6b162c3983b753293cdbe882eb6bdfd709117ea58542e59e25eeed01a055c346"
26
26
  },
27
27
  {
28
28
  "name": "libggml-base.so.0.15.1",
29
29
  "bytes": 1110088,
30
- "sha256": "90b62dcb460829e7cf6a6e59f4b81f74a88c720a91bb189b0aa3c688016d8bed"
30
+ "sha256": "6b162c3983b753293cdbe882eb6bdfd709117ea58542e59e25eeed01a055c346"
31
31
  },
32
32
  {
33
33
  "name": "libggml-cpu.so",
34
34
  "bytes": 869800,
35
- "sha256": "b6556d1c951b67e3b46e498ee98b1b6c5c5b132842997524a2ba8a9105e13bbc"
35
+ "sha256": "de588be9671e45fc1428293a97c7d80dc67140e06cae72deb39c53a5793b274a"
36
36
  },
37
37
  {
38
38
  "name": "libggml-cpu.so.0",
39
39
  "bytes": 869800,
40
- "sha256": "b6556d1c951b67e3b46e498ee98b1b6c5c5b132842997524a2ba8a9105e13bbc"
40
+ "sha256": "de588be9671e45fc1428293a97c7d80dc67140e06cae72deb39c53a5793b274a"
41
41
  },
42
42
  {
43
43
  "name": "libggml-cpu.so.0.15.1",
44
44
  "bytes": 869800,
45
- "sha256": "b6556d1c951b67e3b46e498ee98b1b6c5c5b132842997524a2ba8a9105e13bbc"
45
+ "sha256": "de588be9671e45fc1428293a97c7d80dc67140e06cae72deb39c53a5793b274a"
46
46
  },
47
47
  {
48
48
  "name": "libggml.so",
49
49
  "bytes": 1899104,
50
- "sha256": "3a5e4d3199d1fdaeec30ce58e8269f50d4914b7fdac92e985ff562128502a385"
50
+ "sha256": "9d603d1099a5fad2715f8a7bb1d73b4551a492903d827573fc39557ff9376766"
51
51
  },
52
52
  {
53
53
  "name": "libggml.so.0",
54
54
  "bytes": 1899104,
55
- "sha256": "3a5e4d3199d1fdaeec30ce58e8269f50d4914b7fdac92e985ff562128502a385"
55
+ "sha256": "9d603d1099a5fad2715f8a7bb1d73b4551a492903d827573fc39557ff9376766"
56
56
  },
57
57
  {
58
58
  "name": "libggml.so.0.15.1",
59
59
  "bytes": 1899104,
60
- "sha256": "3a5e4d3199d1fdaeec30ce58e8269f50d4914b7fdac92e985ff562128502a385"
60
+ "sha256": "9d603d1099a5fad2715f8a7bb1d73b4551a492903d827573fc39557ff9376766"
61
61
  },
62
62
  {
63
63
  "name": "openmates-pii-worker",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "openmates",
3
- "version": "0.29.0-alpha.7",
3
+ "version": "0.29.0-alpha.8",
4
4
  "description": "OpenMates CLI and SDK",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -28,7 +28,9 @@
28
28
  "dist",
29
29
  "fixtures",
30
30
  "templates",
31
- "native/*.node"
31
+ "native/*.node",
32
+ "wasm/openmates_sdk.js",
33
+ "wasm/openmates_sdk_bg.wasm"
32
34
  ],
33
35
  "scripts": {
34
36
  "build": "tsup src/index.ts src/sdk-entry.ts src/sdk-session-v1-entry.ts src/cli.ts src/remoteAccessCrypto.ts src/privacyDaemon.ts --format esm --dts --clean && node scripts/package-remote-command-apparmor.mjs",
@@ -80,7 +82,8 @@
80
82
  "test:unit:chat-preparation": "node --test --experimental-strip-types --loader ./tests/loader.mjs tests/http.test.ts tests/preparedPrivacy.test.ts tests/ownedTurnMetadata.test.ts tests/foregroundChatRecovery.test.ts tests/taskContextDiscovery.test.ts && node --test --experimental-strip-types --loader ./tests/loader.mjs --test-name-pattern \"CLI saved-chat recovery preflight\" tests/client.test.ts",
81
83
  "build:sdk": "tsup src/sdk-entry.ts src/sdk-session-v1-entry.ts --format esm --dts",
82
84
  "build:sdk:native": "python3 ../../../scripts/build_sdk_native.py --language npm",
83
- "test:unit:sdk-session": "node --test --experimental-strip-types --loader ./tests/loader.mjs tests/sdk-api-key-rust.test.ts tests/sdk-conformance.test.ts tests/sdk-crypto-legacy-om.test.ts tests/sdk-privacy.test.ts tests/sdk-project-sources.test.ts tests/sdk-project-task-watch-unavailable.test.ts tests/sdk-session-app-skill.test.ts tests/sdk-session-apps-inventory.test.ts tests/sdk-session-chat-details.test.ts tests/sdk-session-drafts.test.ts tests/sdk-session-embed-share.test.ts tests/sdk-session-full-chat-read.test.ts tests/sdk-session-original-dispatch.test.ts tests/sdk-session.test.ts tests/sdk-task-order.test.ts && node --test tests/sdk-v1-package.test.mjs tests/sdk-workflow-file-sync.test.mjs"
85
+ "test:unit:sdk-session": "node --test --experimental-strip-types --loader ./tests/loader.mjs tests/sdk-api-key-rust.test.ts tests/sdk-conformance.test.ts tests/sdk-crypto-legacy-om.test.ts tests/sdk-privacy.test.ts tests/sdk-project-sources.test.ts tests/sdk-project-task-watch-unavailable.test.ts tests/sdk-session-app-skill.test.ts tests/sdk-session-apps-inventory.test.ts tests/sdk-session-chat-details.test.ts tests/sdk-session-drafts.test.ts tests/sdk-session-embed-share.test.ts tests/sdk-session-full-chat-read.test.ts tests/sdk-session-original-dispatch.test.ts tests/sdk-session.test.ts tests/sdk-task-order.test.ts && node --test tests/sdk-v1-package.test.mjs tests/sdk-workflow-file-sync.test.mjs tests/sdk-wasm.test.mjs",
86
+ "build:sdk:wasm": "python3 ../../../scripts/build_sdk_native.py --language wasm"
84
87
  },
85
88
  "keywords": [
86
89
  "openmates",