openmates 0.8.0-alpha.3 → 0.9.0-alpha.2

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.
@@ -730,6 +730,49 @@ var OpenMatesWsClient = class {
730
730
  this.socket.on("close", onClose);
731
731
  });
732
732
  }
733
+ /**
734
+ * Collect all frames until `terminatorType` arrives (or timeout).
735
+ * Returns every frame received before the terminator, in order.
736
+ * Used by ensureSynced to consume the full phased-sync event stream.
737
+ */
738
+ collectMessages(terminatorType, timeoutMs = 9e4) {
739
+ return new Promise((resolve4, reject) => {
740
+ const collected = [];
741
+ const onMessage = (rawData) => {
742
+ try {
743
+ const parsed = JSON.parse(rawData.toString());
744
+ if (parsed.type === terminatorType) {
745
+ cleanup();
746
+ resolve4(collected);
747
+ return;
748
+ }
749
+ collected.push(parsed);
750
+ } catch {
751
+ }
752
+ };
753
+ const onError = (error) => {
754
+ cleanup();
755
+ reject(error);
756
+ };
757
+ const onClose = () => {
758
+ cleanup();
759
+ resolve4(collected);
760
+ };
761
+ const timeout = setTimeout(() => {
762
+ cleanup();
763
+ reject(new Error(`Timeout waiting for '${terminatorType}'`));
764
+ }, timeoutMs);
765
+ const cleanup = () => {
766
+ clearTimeout(timeout);
767
+ this.socket.off("message", onMessage);
768
+ this.socket.off("error", onError);
769
+ this.socket.off("close", onClose);
770
+ };
771
+ this.socket.on("message", onMessage);
772
+ this.socket.on("error", onError);
773
+ this.socket.on("close", onClose);
774
+ });
775
+ }
733
776
  /**
734
777
  * Collect the AI response for a sent message.
735
778
  *
@@ -902,10 +945,11 @@ var OpenMatesWsClient = class {
902
945
 
903
946
  // src/mentions.ts
904
947
  var MODEL_ALIASES = {
905
- best: "claude-opus-4-6",
948
+ best: "claude-opus-4-7",
906
949
  fast: "qwen3-235b-a22b-2507"
907
950
  };
908
951
  var CHAT_MODELS = [
952
+ { id: "claude-opus-4-7", name: "Claude Opus 4.7" },
909
953
  { id: "claude-opus-4-6", name: "Claude Opus 4.6" },
910
954
  { id: "claude-sonnet-4-6", name: "Claude Sonnet 4.6" },
911
955
  { id: "claude-haiku-4-5-20251001", name: "Claude Haiku 4.5" },
@@ -3229,41 +3273,53 @@ Required: ${schema.required.join(", ")}`
3229
3273
  let totalChatCount = 0;
3230
3274
  try {
3231
3275
  ws.send("phased_sync_request", {
3232
- phase: "phase3",
3276
+ phase: "all",
3233
3277
  client_chat_versions: clientChatVersions,
3234
3278
  client_chat_ids: clientChatIds,
3235
3279
  client_embed_ids: clientEmbedIds
3236
3280
  });
3237
- const initial = await ws.waitForMessage("phase_3_last_100_chats_ready");
3238
- const initialPayload = initial.payload;
3239
- const firstChats = initialPayload.chats ?? [];
3240
- for (const wrapper of firstChats) {
3241
- const details = wrapper.chat_details;
3242
- if (!details || typeof details.id !== "string") continue;
3243
- const messages = Array.isArray(wrapper.messages) ? wrapper.messages : [];
3244
- chats.push({ details, messages });
3245
- }
3246
- totalChatCount = initialPayload.total_chat_count ?? firstChats.length;
3247
- embeds = initialPayload.embeds ?? [];
3248
- embedKeys = initialPayload.embed_keys ?? [];
3249
- newChatSuggestions = initialPayload.new_chat_suggestions ?? [];
3250
- let offset = firstChats.length;
3251
- while (offset < totalChatCount) {
3252
- ws.send("load_more_chats", { offset, limit: 50 });
3253
- const more = await ws.waitForMessage("load_more_chats_response");
3254
- const payload = more.payload;
3255
- const batch = payload.chats ?? [];
3256
- for (const wrapper of batch) {
3257
- const details = wrapper.chat_details;
3258
- if (!details || typeof details.id !== "string") continue;
3259
- const messages = Array.isArray(wrapper.messages) ? wrapper.messages : [];
3260
- chats.push({ details, messages });
3281
+ const frames = await ws.collectMessages("phased_sync_complete", 9e4);
3282
+ const messagesByChatId = /* @__PURE__ */ new Map();
3283
+ for (const frame of frames) {
3284
+ if (frame.type === "phase_1_last_chat_ready") {
3285
+ const p = frame.payload;
3286
+ newChatSuggestions = p.new_chat_suggestions ?? [];
3287
+ } else if (frame.type === "phase_1b_chat_content_ready") {
3288
+ const p = frame.payload;
3289
+ for (const c of p.chats ?? []) {
3290
+ if (c.chat_id && Array.isArray(c.messages) && c.messages.length > 0) {
3291
+ messagesByChatId.set(c.chat_id, c.messages);
3292
+ }
3293
+ }
3294
+ if (p.embeds) embeds.push(...p.embeds);
3295
+ if (p.embed_keys) embedKeys.push(...p.embed_keys);
3296
+ } else if (frame.type === "phase_2_last_20_chats_ready") {
3297
+ const p = frame.payload;
3298
+ totalChatCount = p.total_chat_count ?? 0;
3299
+ for (const wrapper of p.chats ?? []) {
3300
+ const details = wrapper.chat_details;
3301
+ if (!details || typeof details.id !== "string") continue;
3302
+ chats.push({ details, messages: [] });
3303
+ }
3304
+ } else if (frame.type === "background_message_sync") {
3305
+ const p = frame.payload;
3306
+ for (const c of p.chats ?? []) {
3307
+ if (c.chat_id && Array.isArray(c.messages) && c.messages.length > 0) {
3308
+ messagesByChatId.set(c.chat_id, c.messages);
3309
+ }
3310
+ }
3311
+ if (p.embeds) embeds.push(...p.embeds);
3312
+ if (p.embed_keys) embedKeys.push(...p.embed_keys);
3313
+ }
3314
+ }
3315
+ for (const chat of chats) {
3316
+ const id = typeof chat.details.id === "string" ? chat.details.id : "";
3317
+ const msgs = messagesByChatId.get(id);
3318
+ if (msgs && msgs.length > 0) {
3319
+ chat.messages = msgs;
3261
3320
  }
3262
- if (payload.embeds) embeds.push(...payload.embeds);
3263
- if (payload.embed_keys) embedKeys.push(...payload.embed_keys);
3264
- offset += batch.length;
3265
- if (!payload.has_more || batch.length === 0) break;
3266
3321
  }
3322
+ if (totalChatCount === 0) totalChatCount = chats.length;
3267
3323
  } finally {
3268
3324
  ws.close();
3269
3325
  }
@@ -3524,8 +3580,8 @@ function getSecretSuffix(match, n = 3) {
3524
3580
  if (cleaned.length <= n) return cleaned;
3525
3581
  return cleaned.slice(-n);
3526
3582
  }
3527
- function generatePlaceholder(prefix, match, suffixLength = 3) {
3528
- return `[${prefix}_${getSecretSuffix(match, suffixLength)}]`;
3583
+ function generatePlaceholder(prefix, match, suffixLength = 3, counter = 1) {
3584
+ return `[${prefix}_${counter}_${getSecretSuffix(match, suffixLength)}]`;
3529
3585
  }
3530
3586
  var SECRET_PATTERNS = [
3531
3587
  {
@@ -3983,6 +4039,7 @@ var SecretScanner = class {
3983
4039
  allMappings.push(mapping);
3984
4040
  }
3985
4041
  }
4042
+ const typeCounts = {};
3986
4043
  if (this.options.enablePatternDetection) {
3987
4044
  for (const pattern of SECRET_PATTERNS) {
3988
4045
  pattern.regex.lastIndex = 0;
@@ -3998,10 +4055,12 @@ var SecretScanner = class {
3998
4055
  if (pattern.validate && !pattern.validate(matchText)) continue;
3999
4056
  const existing = this.registry.get(matchText);
4000
4057
  if (existing) continue;
4058
+ typeCounts[pattern.type] = (typeCounts[pattern.type] || 0) + 1;
4001
4059
  const placeholder = generatePlaceholder(
4002
4060
  pattern.placeholderPrefix,
4003
4061
  matchText,
4004
- this.options.suffixLength
4062
+ this.options.suffixLength,
4063
+ typeCounts[pattern.type]
4005
4064
  );
4006
4065
  allMappings.push({
4007
4066
  placeholder,
@@ -4081,7 +4140,7 @@ var OutputRedactor = class {
4081
4140
  }
4082
4141
  /**
4083
4142
  * Initialize the redactor by loading personal data entries from
4084
- * the user's encrypted Settings & Memories.
4143
+ * the user's encrypted Memories.
4085
4144
  *
4086
4145
  * Safe to call without a session — silently skips if not logged in.
4087
4146
  *
@@ -9132,7 +9191,7 @@ async function handleMentions(client, subcommand, _rest, flags) {
9132
9191
  mate: "Mates",
9133
9192
  skill: "Skills",
9134
9193
  focus_mode: "Focus Modes",
9135
- settings_memory: "Settings & Memories"
9194
+ settings_memory: "Memories"
9136
9195
  };
9137
9196
  for (const [type, items] of grouped) {
9138
9197
  const label = typeLabels[type] || type;
@@ -9302,7 +9361,7 @@ Types:
9302
9361
  mate AI mates/personas (@Sophia, @Finn)
9303
9362
  skill App skills (@Web-Search, @Code-Get-Docs)
9304
9363
  focus_mode Focus modes (@Web-Research)
9305
- settings_memory Settings & memories (@Code-Projects)
9364
+ settings_memory Memories (@Code-Projects)
9306
9365
 
9307
9366
  Use @mentions in chat messages:
9308
9367
  openmates chats new "@Sophia tell me about React hooks"
@@ -9321,7 +9380,7 @@ Commands:
9321
9380
  openmates apps [--help] App skill commands (list, run, ...)
9322
9381
  openmates mentions [--help] List available @mentions
9323
9382
  openmates embeds [--help] Embed commands (show)
9324
- openmates settings [--help] Settings & memories
9383
+ openmates settings [--help] Memories
9325
9384
  openmates inspirations [--lang <code>] [--json] Daily inspirations
9326
9385
  openmates newchatsuggestions [--limit <n>] [--json] Personalized new chat suggestions
9327
9386
  openmates server [--help] Server management (install, start, stop, ...)
@@ -9386,7 +9445,7 @@ Options for 'delete':
9386
9445
  @Claude-Opus-4.6 Specific model
9387
9446
  @Sophia AI mate/persona
9388
9447
  @Web-Search App skill
9389
- @Code-Projects Settings & memories
9448
+ @Code-Projects Memories
9390
9449
  @/path/to/file.ts Attach local file (secrets auto-redacted)
9391
9450
 
9392
9451
  Sensitive files (.env) use zero-knowledge mode (only names + last 3 chars).
@@ -9503,7 +9562,6 @@ ${h("Billing")}
9503
9562
  \x1B[2mGift cards (buy/manage): ${s("billing/gift-cards")}\x1B[0m
9504
9563
  ${h("Privacy")}
9505
9564
  openmates settings post auto-delete-chats --data '{"period":"90d"}'
9506
- openmates settings post auto-delete-usage --data '{"period":"1y"}'
9507
9565
  \x1B[2mHide personal data / anonymization: ${s("privacy/hide-personal-data")}\x1B[0m
9508
9566
  ${h("Notifications")}
9509
9567
  openmates settings get reminders [--json] Active reminders
@@ -9513,8 +9571,8 @@ ${h("Interface")}
9513
9571
  openmates settings post user/language --data '{"language":"en"}'
9514
9572
  openmates settings post user/darkmode --data '{"dark_mode":true}'
9515
9573
  openmates settings post ai-model-defaults --data '{"simple":"...","complex":"..."}'
9516
- ${h("App Store")}
9517
- openmates apps list Same as App Store
9574
+ ${h("Apps")}
9575
+ openmates apps list Same as Apps
9518
9576
  openmates apps <app-id> App details
9519
9577
  \x1B[2mWeb: ${s("app_store")}\x1B[0m
9520
9578
  ${h("Mates")}
package/dist/cli.js CHANGED
@@ -2,7 +2,7 @@
2
2
  import {
3
3
  getExtForLang,
4
4
  serializeToYaml
5
- } from "./chunk-XNONURHY.js";
5
+ } from "./chunk-QWU5GCDA.js";
6
6
  export {
7
7
  getExtForLang,
8
8
  serializeToYaml
package/dist/index.js CHANGED
@@ -6,7 +6,7 @@ import {
6
6
  getExtForLang,
7
7
  parseNewChatSuggestionText,
8
8
  serializeToYaml
9
- } from "./chunk-XNONURHY.js";
9
+ } from "./chunk-QWU5GCDA.js";
10
10
  export {
11
11
  MATE_NAMES,
12
12
  MEMORY_TYPE_REGISTRY,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "openmates",
3
- "version": "0.8.0-alpha.3",
3
+ "version": "0.9.0-alpha.2",
4
4
  "description": "OpenMates CLI and SDK",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",