openmates 0.27.0-alpha.53 → 0.27.0-alpha.55

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.
@@ -647,11 +647,6 @@ function clearSyncCache(teamId) {
647
647
  rmSync(filePath);
648
648
  }
649
649
  }
650
- function isSyncCacheFresh(maxAgeMs = 3e5, teamId) {
651
- const cache = loadSyncCache(teamId);
652
- if (!cache) return false;
653
- return Date.now() - cache.syncedAt < (cache.pendingRecoveryOutputs ? Math.min(maxAgeMs, 6e4) : maxAgeMs);
654
- }
655
650
  function loadTrustedAccountId() {
656
651
  const trusted = readJsonFile(join(getStateDir(), TRUSTED_ACCOUNT_FILE));
657
652
  return typeof trusted?.accountId === "string" && trusted.accountId.trim() ? trusted.accountId.trim() : null;
@@ -1207,7 +1202,6 @@ export {
1207
1202
  saveSyncCache,
1208
1203
  loadSyncCache,
1209
1204
  clearSyncCache,
1210
- isSyncCacheFresh,
1211
1205
  loadTrustedAccountId,
1212
1206
  saveTrustedAccountId,
1213
1207
  assertTrustedAccountId,
@@ -7,7 +7,6 @@ import {
7
7
  ensurePrivacyDaemon,
8
8
  getCredentialStorageMode,
9
9
  installPrivacyModel,
10
- isSyncCacheFresh,
11
10
  loadAnonymousId,
12
11
  loadLocalTeamKey,
13
12
  loadSession,
@@ -35,7 +34,7 @@ import {
35
34
  verifyInstalledModel,
36
35
  verifyPrivacyRuntime,
37
36
  withSessionRefreshLock
38
- } from "./chunk-5HWC6OTW.js";
37
+ } from "./chunk-5SFXCJJ4.js";
39
38
  import {
40
39
  RemoteAccessReplayGuard,
41
40
  createRemoteAccessHandshake,
@@ -53,6 +52,7 @@ import {
53
52
  buildUpdateUserTaskInput,
54
53
  bytesToBase64,
55
54
  bytesToBase64Url,
55
+ createAesGcmCombinedDecryptor,
56
56
  createApiKeyCryptoMaterial,
57
57
  createPasswordMigrationMaterialV2,
58
58
  createRecoveryKeyMaterial,
@@ -101,7 +101,7 @@ import {
101
101
  unwrapApiKeyMasterKey,
102
102
  unwrapPasswordMasterKey,
103
103
  workflowProjectionDeleteGuidance
104
- } from "./chunk-FC27KZIW.js";
104
+ } from "./chunk-F2U6KIMR.js";
105
105
  import {
106
106
  adoptUploadEmbedId,
107
107
  transcribeUploadedAudio,
@@ -13134,13 +13134,15 @@ var OpenMatesClient = class _OpenMatesClient {
13134
13134
  const markdown = !preview && typeof d.encrypted_draft_md === "string" ? await decryptWithAesGcmCombined(d.encrypted_draft_md, draftKey) : null;
13135
13135
  draftPreview = (preview || markdown)?.replace(/\s+/g, " ").trim().slice(0, 200) || null;
13136
13136
  }
13137
- const title = typeof d.encrypted_title === "string" && chatKeyBytes ? await decryptWithAesGcmCombined(d.encrypted_title, chatKeyBytes) : null;
13138
- const summary = typeof d.encrypted_chat_summary === "string" && chatKeyBytes ? await decryptWithAesGcmCombined(
13139
- d.encrypted_chat_summary,
13140
- chatKeyBytes
13141
- ) : null;
13142
- const category = typeof d.encrypted_category === "string" && chatKeyBytes ? await decryptWithAesGcmCombined(d.encrypted_category, chatKeyBytes) : null;
13143
- const slug = typeof d.encrypted_slug === "string" && chatKeyBytes ? await decryptObjectSlug(d.encrypted_slug, chatKeyBytes) : null;
13137
+ const decrypt = chatKeyBytes ? await createAesGcmCombinedDecryptor(chatKeyBytes) : async () => null;
13138
+ const field3 = (name) => typeof d[name] === "string" ? decrypt(d[name]) : Promise.resolve(null);
13139
+ const [title, summary, category, slugValue] = await Promise.all([
13140
+ field3("encrypted_title"),
13141
+ field3("encrypted_chat_summary"),
13142
+ field3("encrypted_category"),
13143
+ field3("encrypted_slug")
13144
+ ]);
13145
+ const slug = chatKeyBytes && typeof d.encrypted_slug === "string" ? slugValue ?? "" : null;
13144
13146
  return {
13145
13147
  id,
13146
13148
  shortId: id.slice(0, 8),
@@ -13284,7 +13286,7 @@ var OpenMatesClient = class _OpenMatesClient {
13284
13286
  const localTeamKey = teamId ? loadLocalTeamKey(this.requireSession().hashedEmail, teamId) : null;
13285
13287
  if (teamId && !localTeamKey) return null;
13286
13288
  const wrappingKey = localTeamKey ? base64ToBytes(localTeamKey) : masterKey;
13287
- return this.decryptChatListPage(cache, limit, page, options, teamId, masterKey, wrappingKey);
13289
+ return this.decryptChatListPage(cache, limit, page, options, teamId, masterKey, wrappingKey, options.onCachedChats);
13288
13290
  }
13289
13291
  async listChats(limit = 10, page = 1, options = {}) {
13290
13292
  const teamId = this.resolveTeamContext(options);
@@ -13297,24 +13299,32 @@ var OpenMatesClient = class _OpenMatesClient {
13297
13299
  } : void 0, options.signal);
13298
13300
  return this.decryptChatListPage(cache, limit, page, options, teamId, masterKey);
13299
13301
  }
13300
- async decryptChatListPage(cache, limit, page, options, teamId, masterKey, cachedWrappingKey) {
13302
+ async decryptChatListPage(cache, limit, page, options, teamId, masterKey, cachedWrappingKey, onCachedChats) {
13303
+ const accountCurrent = this.captureTeamAccountOwner().isCurrent;
13304
+ const current2 = () => {
13305
+ if (!this.hasSession() || !accountCurrent() || teamId !== this.resolveTeamContext(options) || !masterKey.equals(Buffer.from(this.getMasterKeyBytes()))) throw new Error("Chat workspace changed");
13306
+ };
13301
13307
  const wrappingKey = cachedWrappingKey ?? await this.getChatWrappingKey(teamId, masterKey);
13302
13308
  const total = cache.chats.length;
13303
13309
  const offset = (page - 1) * limit;
13304
13310
  const slice = cache.chats.slice(offset, offset + limit);
13305
13311
  const output = [];
13306
- for (const chat of slice) {
13307
- output.push(await this.decryptChatListItem(chat, wrappingKey, cache, teamId));
13308
- }
13309
- if (!this.hasSession() || teamId !== this.resolveTeamContext(options) || !masterKey.equals(Buffer.from(this.getMasterKeyBytes()))) throw new Error("Chat workspace changed");
13310
- return {
13311
- chats: output,
13312
+ const result = () => ({
13313
+ chats: output.slice(),
13312
13314
  pendingRecoveryOutputs: cache.pendingRecoveryOutputs ?? 0,
13313
13315
  total,
13314
13316
  page,
13315
13317
  limit,
13316
- hasMore: offset + limit < total
13317
- };
13318
+ hasMore: offset + output.length < total
13319
+ });
13320
+ for (let start = 0; start < slice.length; start += 8) {
13321
+ current2();
13322
+ output.push(...await Promise.all(slice.slice(start, start + 8).map((chat) => this.decryptChatListItem(chat, wrappingKey, cache, teamId))));
13323
+ current2();
13324
+ if (onCachedChats && output.length === 32 && output.length < slice.length) onCachedChats(result());
13325
+ }
13326
+ current2();
13327
+ return result();
13318
13328
  }
13319
13329
  async saveDraft(params) {
13320
13330
  const markdown = params.markdown.trim();
@@ -13881,49 +13891,61 @@ var OpenMatesClient = class _OpenMatesClient {
13881
13891
  if (!chatKey) throw new Error(`Chat '${chatId}' is missing locally decryptable key material.`);
13882
13892
  return { chatId, chatKey };
13883
13893
  }
13894
+ /** Operation-local ciphertext index and nonextractable key; no persistent plaintext cache. */
13895
+ async createRawChatMessageReader(chatItem, chatKeyBytes, embeds, current2 = () => {
13896
+ }) {
13897
+ const embedIdsByMessage = /* @__PURE__ */ new Map();
13898
+ for (const embed of embeds) {
13899
+ if (embed.parent_embed_id || typeof embed.hashed_message_id !== "string") continue;
13900
+ const id = String(embed.embed_id ?? embed.id ?? "");
13901
+ if (!id) continue;
13902
+ const ids = embedIdsByMessage.get(embed.hashed_message_id) ?? [];
13903
+ ids.push(id);
13904
+ embedIdsByMessage.set(embed.hashed_message_id, ids);
13905
+ }
13906
+ const decrypt = chatKeyBytes ? await createAesGcmCombinedDecryptor(chatKeyBytes) : async () => null;
13907
+ return async (rawMessages) => {
13908
+ const messages = new Array(rawMessages.length);
13909
+ let next = 0;
13910
+ await Promise.all(Array.from({ length: Math.min(8, rawMessages.length) }, async () => {
13911
+ while (next < rawMessages.length) {
13912
+ current2();
13913
+ const index = next++, raw = rawMessages[index];
13914
+ const m = typeof raw === "string" ? JSON.parse(raw) : raw;
13915
+ const field3 = (name) => typeof m[name] === "string" ? decrypt(m[name]) : Promise.resolve(null);
13916
+ const [content, senderName, msgCategory, modelName, piiMappings] = await Promise.all([
13917
+ field3("encrypted_content"),
13918
+ field3("encrypted_sender_name"),
13919
+ field3("encrypted_category"),
13920
+ field3("encrypted_model_name"),
13921
+ field3("encrypted_pii_mappings")
13922
+ ]);
13923
+ current2();
13924
+ const clientMsgId = String(m.client_message_id ?? m.id ?? m.message_id ?? "");
13925
+ const hashed = clientMsgId ? createHash13("sha256").update(clientMsgId).digest("hex") : "";
13926
+ messages[index] = {
13927
+ id: String(m.id ?? m.message_id ?? ""),
13928
+ clientMessageId: clientMsgId,
13929
+ chatId: String(m.chat_id ?? chatItem.id),
13930
+ role: String(m.role ?? "unknown"),
13931
+ content: content ?? "",
13932
+ senderName,
13933
+ hashedSenderUserId: typeof m.hashed_user_id === "string" ? m.hashed_user_id : null,
13934
+ category: msgCategory,
13935
+ modelName,
13936
+ createdAt: typeof m.created_at === "number" ? m.created_at : 0,
13937
+ embedIds: [...embedIdsByMessage.get(hashed) ?? []],
13938
+ ...typeof m.encrypted_pii_mappings === "string" && chatKeyBytes ? { piiMappings: JSON.parse(piiMappings ?? "[]") } : {}
13939
+ };
13940
+ }
13941
+ }));
13942
+ current2();
13943
+ messages.sort((a, b) => a.createdAt - b.createdAt);
13944
+ return messages;
13945
+ };
13946
+ }
13884
13947
  async decryptRawChatMessages(rawMessages, chatItem, chatKeyBytes, embeds = []) {
13885
- const messages = [];
13886
- for (const raw of rawMessages) {
13887
- const m = typeof raw === "string" ? JSON.parse(raw) : raw;
13888
- const content = typeof m.encrypted_content === "string" && chatKeyBytes ? await decryptWithAesGcmCombined(m.encrypted_content, chatKeyBytes) : null;
13889
- const senderName = typeof m.encrypted_sender_name === "string" && chatKeyBytes ? await decryptWithAesGcmCombined(
13890
- m.encrypted_sender_name,
13891
- chatKeyBytes
13892
- ) : null;
13893
- const msgCategory = typeof m.encrypted_category === "string" && chatKeyBytes ? await decryptWithAesGcmCombined(m.encrypted_category, chatKeyBytes) : null;
13894
- const modelName = typeof m.encrypted_model_name === "string" && chatKeyBytes ? await decryptWithAesGcmCombined(
13895
- m.encrypted_model_name,
13896
- chatKeyBytes
13897
- ) : null;
13898
- const clientMsgId = String(
13899
- m.client_message_id ?? m.id ?? m.message_id ?? ""
13900
- );
13901
- let msgEmbedIds = [];
13902
- if (clientMsgId && embeds.length > 0) {
13903
- const hashed = createHash13("sha256").update(clientMsgId).digest("hex");
13904
- msgEmbedIds = embeds.filter(
13905
- (e) => e.hashed_message_id === hashed && !e.parent_embed_id
13906
- ).map((e) => String(e.embed_id ?? e.id ?? "")).filter(Boolean);
13907
- }
13908
- messages.push({
13909
- id: String(m.id ?? m.message_id ?? ""),
13910
- clientMessageId: clientMsgId,
13911
- chatId: String(m.chat_id ?? chatItem.id),
13912
- role: String(m.role ?? "unknown"),
13913
- content: content ?? "",
13914
- senderName,
13915
- hashedSenderUserId: typeof m.hashed_user_id === "string" ? m.hashed_user_id : null,
13916
- category: msgCategory,
13917
- modelName,
13918
- createdAt: typeof m.created_at === "number" ? m.created_at : 0,
13919
- embedIds: msgEmbedIds,
13920
- ...typeof m.encrypted_pii_mappings === "string" && chatKeyBytes ? {
13921
- piiMappings: JSON.parse(await decryptWithAesGcmCombined(m.encrypted_pii_mappings, chatKeyBytes) ?? "[]")
13922
- } : {}
13923
- });
13924
- }
13925
- messages.sort((a, b) => a.createdAt - b.createdAt);
13926
- return coalesceMemoryRequestMessages(messages);
13948
+ return coalesceMemoryRequestMessages(await (await this.createRawChatMessageReader(chatItem, chatKeyBytes, embeds))(rawMessages));
13927
13949
  }
13928
13950
  async resolveCachedChatForQuery(query, cache, wrappingKey, teamId) {
13929
13951
  const normalized = query.trim().toLowerCase();
@@ -13997,6 +14019,7 @@ var OpenMatesClient = class _OpenMatesClient {
13997
14019
  }
13998
14020
  /** Get decrypted messages for a chat resolved by UUID, prefix or title. */
13999
14021
  async getChatMessages(query, options = {}) {
14022
+ const accountCurrent = this.captureTeamAccountOwner().isCurrent;
14000
14023
  const teamId = this.resolveTeamContext(options);
14001
14024
  const masterKey = Buffer.from(this.getMasterKeyBytes());
14002
14025
  const localCache = options.preferCache ? loadSyncCache(teamId) : null;
@@ -14009,8 +14032,10 @@ var OpenMatesClient = class _OpenMatesClient {
14009
14032
  embedKeys: []
14010
14033
  } : await this.ensureSynced(true, [], options));
14011
14034
  const current2 = () => {
14012
- if (!this.hasSession() || teamId !== this.resolveTeamContext(options) || !masterKey.equals(Buffer.from(this.getMasterKeyBytes()))) throw new Error("Chat workspace changed");
14035
+ if (!this.hasSession() || !accountCurrent() || teamId !== this.resolveTeamContext(options) || !masterKey.equals(Buffer.from(this.getMasterKeyBytes()))) throw new Error("Chat workspace changed");
14013
14036
  };
14037
+ current2();
14038
+ options.signal?.throwIfAborted();
14014
14039
  const localTeamKey = options.preferCache && teamId ? loadLocalTeamKey(this.requireSession().hashedEmail, teamId) : null;
14015
14040
  if (options.preferCache && teamId && !localTeamKey) throw new Error("Team key unavailable offline. Reconnect to refresh Team access.");
14016
14041
  const wrappingKey = localTeamKey ? base64ToBytes(localTeamKey) : await this.getChatWrappingKey(teamId, masterKey);
@@ -14055,11 +14080,17 @@ var OpenMatesClient = class _OpenMatesClient {
14055
14080
  const merged = { ...latest, chats: row3 ? latest.chats.map((chat) => chat === row3 ? { ...row3, messages: messages2 } : chat) : [...latest.chats, { ...found, messages: messages2 }] };
14056
14081
  saveSyncCache(mergeConcurrentChatMessages(merged, latest), teamId);
14057
14082
  };
14083
+ const readMessages = await this.createRawChatMessageReader(chatItem, chatKeyBytes, cache.embeds, () => {
14084
+ current2();
14085
+ options.signal?.throwIfAborted();
14086
+ });
14087
+ let decodedMessages;
14058
14088
  let rawMessages = found.messages;
14059
14089
  let historyIncomplete = rawMessages.length > 0 && Number(found.details.messages_v) > rawMessages.length;
14060
14090
  const hasServerMessages = typeof found.details.messages_v === "number" && found.details.messages_v > 0;
14061
14091
  if (rawMessages.length === 0 && (hasServerMessages || fetchedMetadata) && foundChatId) {
14062
14092
  const pages = [];
14093
+ const decodedPages = [];
14063
14094
  let cursor = null;
14064
14095
  let hasMoreBefore = true;
14065
14096
  for (let page = 0; page < Math.max(1, Math.min(CLI_MESSAGE_HISTORY_MAX_PAGES, options.maxHistoryPages ?? CLI_MESSAGE_HISTORY_MAX_PAGES)) && hasMoreBefore; page += 1) {
@@ -14089,20 +14120,33 @@ var OpenMatesClient = class _OpenMatesClient {
14089
14120
  if (!response.ok) throw new Error(`Chat messages failed with HTTP ${response.status}`);
14090
14121
  const pageMessages = Array.isArray(response.data.messages) ? normalizeSyncedMessages(response.data.messages) : [];
14091
14122
  if (pageMessages.length === 0) break;
14123
+ const decoded2 = await readMessages(pageMessages);
14092
14124
  if (page === 0 && options.onMessages) {
14093
- const latest = await this.decryptRawChatMessages(pageMessages, chatItem, chatKeyBytes, cache.embeds);
14094
14125
  current2();
14095
14126
  if (options.preferCache) persistMessages(pageMessages);
14096
- options.onMessages({ chat: chatItem, messages: latest });
14127
+ options.onMessages({ chat: chatItem, messages: coalesceMemoryRequestMessages(decoded2) });
14097
14128
  }
14129
+ decodedPages.unshift(decoded2);
14098
14130
  pages.unshift(pageMessages);
14099
14131
  cursor = response.data.start_cursor ?? null;
14100
14132
  hasMoreBefore = response.data.has_more_before === true && cursor !== null;
14101
14133
  }
14102
14134
  rawMessages = pages.flat();
14135
+ decodedMessages = decodedPages.flat();
14103
14136
  historyIncomplete ||= hasMoreBefore;
14104
14137
  }
14105
- const messages = await this.decryptRawChatMessages(rawMessages, chatItem, chatKeyBytes, cache.embeds);
14138
+ if (!decodedMessages && options.onMessages && rawMessages.length > CLI_MESSAGE_HISTORY_PAGE_LIMIT) {
14139
+ const ordered = rawMessages.map((raw) => typeof raw === "string" ? JSON.parse(raw) : raw).sort((a, b) => (typeof a.created_at === "number" ? a.created_at : 0) - (typeof b.created_at === "number" ? b.created_at : 0));
14140
+ const split = ordered.length - CLI_MESSAGE_HISTORY_PAGE_LIMIT;
14141
+ const latest = await readMessages(ordered.slice(split));
14142
+ current2();
14143
+ options.onMessages({ chat: chatItem, messages: coalesceMemoryRequestMessages(latest) });
14144
+ const older = await readMessages(ordered.slice(0, split));
14145
+ decodedMessages = [...older, ...latest];
14146
+ }
14147
+ const decoded = decodedMessages ?? await readMessages(rawMessages);
14148
+ decoded.sort((a, b) => a.createdAt - b.createdAt);
14149
+ const messages = coalesceMemoryRequestMessages(decoded);
14106
14150
  current2();
14107
14151
  if (options.preferCache && rawMessages !== found.messages) persistMessages(rawMessages);
14108
14152
  return { chat: chatItem, messages, ...historyIncomplete ? { historyIncomplete: true } : {} };
@@ -15988,6 +16032,18 @@ var OpenMatesClient = class _OpenMatesClient {
15988
16032
  remoteCommandReviewInteractive: Boolean(params.onRemoteCommandReview)
15989
16033
  });
15990
16034
  }
16035
+ const queuedAdmission = !params.incognito && shouldWaitForAi ? ws.waitForMessage("message_queued", (payload) => {
16036
+ const event = payload;
16037
+ return event.chat_id === chatId && event.user_message_id === messageId;
16038
+ }, params.responseTimeoutMs ?? 9e4) : null;
16039
+ if (queuedAdmission) void queuedAdmission.catch(() => {
16040
+ });
16041
+ const pausedHandoff = !params.incognito && shouldWaitForAi ? ws.waitForMessage("queued_handoff_paused", (payload) => {
16042
+ const event = payload;
16043
+ return event.chat_id === chatId && (event.message_id === messageId || event.message_id === void 0);
16044
+ }, params.responseTimeoutMs ?? 9e4) : null;
16045
+ if (pausedHandoff) void pausedHandoff.catch(() => {
16046
+ });
15991
16047
  const confirmed = ws.waitForMessage(
15992
16048
  "chat_message_confirmed",
15993
16049
  (payload) => {
@@ -16281,11 +16337,56 @@ var OpenMatesClient = class _OpenMatesClient {
16281
16337
  }
16282
16338
  await this.replayCurrentTurnRecoveryOutputPages(ws, ownerId2, pages, cache, teamId, chatId);
16283
16339
  };
16284
- const resp = await (precollectedResponse ?? ws.collectAiResponse(messageId, chatId, {
16340
+ const responsePromise = precollectedResponse ?? ws.collectAiResponse(messageId, chatId, {
16285
16341
  ...streamOpts,
16286
16342
  timeoutMs: params.responseTimeoutMs,
16287
16343
  recoveryTurnId: savedTurnId
16288
- }));
16344
+ });
16345
+ const outcome = await Promise.race([
16346
+ responsePromise.then((response) => ({ kind: "response", response })),
16347
+ ...queuedAdmission ? [queuedAdmission.then(
16348
+ (frame) => ({ kind: "queued", frame }),
16349
+ () => new Promise(() => {
16350
+ })
16351
+ )] : [],
16352
+ ...pausedHandoff ? [pausedHandoff.then(
16353
+ (frame) => ({ kind: "paused", frame }),
16354
+ () => new Promise(() => {
16355
+ })
16356
+ )] : []
16357
+ ]);
16358
+ if (outcome.kind === "paused") {
16359
+ void responsePromise.catch(() => {
16360
+ });
16361
+ throw new Error("Message saved, but AI handoff is paused. No assistant run started; check the chat before retrying.");
16362
+ }
16363
+ if (outcome.kind === "queued") {
16364
+ void responsePromise.catch(() => {
16365
+ });
16366
+ const frame = outcome.frame.payload;
16367
+ return {
16368
+ status: "queued",
16369
+ chatId,
16370
+ messageId: null,
16371
+ userMessageId: messageId,
16372
+ queueMode: frame.queue_mode === "steer" ? "steer" : "follow_up",
16373
+ queueRevision: typeof frame.queue_revision === "number" ? frame.queue_revision : 1,
16374
+ assistant: "",
16375
+ category: null,
16376
+ modelName: null,
16377
+ mateName: null,
16378
+ followUpSuggestions: [],
16379
+ taskProposals: [],
16380
+ taskUpdateProposals: [],
16381
+ taskEvents: [],
16382
+ pendingTaskUpdateJobs: [],
16383
+ subChatEvents: [],
16384
+ appSettingsMemoryRequests: [],
16385
+ tokenUsage: null,
16386
+ promptBudget: null
16387
+ };
16388
+ }
16389
+ const resp = outcome.response;
16289
16390
  assistantMessageId = resp.messageId;
16290
16391
  assistant = resp.content;
16291
16392
  category = resp.category;
@@ -18298,7 +18399,7 @@ var OpenMatesClient = class _OpenMatesClient {
18298
18399
  return documents;
18299
18400
  }
18300
18401
  async decryptTaskContextRecord(record10, options = {}) {
18301
- const { decryptUserTask: decryptUserTask2 } = await import("./tasksCli-S7PH7TWA.js");
18402
+ const { decryptUserTask: decryptUserTask2 } = await import("./tasksCli-VEBWWQW4.js");
18302
18403
  const teamId = this.resolveTeamContext(options);
18303
18404
  if (!teamId || record10.source === "workflow_run") return decryptUserTask2(record10, this.getMasterKeyBytes());
18304
18405
  this.requireSession();
@@ -21201,11 +21302,9 @@ Required: ${schema.required.join(", ")}`
21201
21302
  const teamId = this.resolveTeamContext(options);
21202
21303
  const syncMasterKey = Buffer.from(this.getMasterKeyBytes());
21203
21304
  const refreshChatIdSet = new Set(refreshChatIds.filter(Boolean));
21204
- if (!forceRefresh && refreshChatIdSet.size === 0 && isSyncCacheFresh(3e5, teamId)) {
21205
- const cache2 = loadSyncCache(teamId);
21206
- if (cache2) return cache2;
21207
- }
21208
21305
  const existingCache = loadSyncCache(teamId);
21306
+ const maxAgeMs = existingCache?.pendingRecoveryOutputs ? 6e4 : 3e5;
21307
+ if (!forceRefresh && refreshChatIdSet.size === 0 && existingCache && Date.now() - existingCache.syncedAt < maxAgeMs) return existingCache;
21209
21308
  const clientChatVersions = {};
21210
21309
  const clientChatIds = [];
21211
21310
  const clientEmbedIds = [];
@@ -65624,6 +65723,9 @@ Only output the final Markdown table. Do NOT include explanations, notes, or any
65624
65723
  generated_by: {
65625
65724
  text: "generated by {model}"
65626
65725
  },
65726
+ using_model: {
65727
+ text: "Using {model}"
65728
+ },
65627
65729
  assistant_speech: {
65628
65730
  confirmation: {
65629
65731
  text: "Confirmation"
@@ -65831,6 +65933,26 @@ Only output the final Markdown table. Do NOT include explanations, notes, or any
65831
65933
  text: "Stop queue"
65832
65934
  }
65833
65935
  },
65936
+ response_activity: {
65937
+ using: {
65938
+ text: "Using {apps}"
65939
+ },
65940
+ thinking_using: {
65941
+ text: "Thinking & using {apps}"
65942
+ },
65943
+ response_thinking: {
65944
+ text: "Thinking for this response"
65945
+ },
65946
+ researching: {
65947
+ text: "Researching\u2026"
65948
+ },
65949
+ working: {
65950
+ text: "Working\u2026"
65951
+ },
65952
+ writing: {
65953
+ text: "Writing\u2026"
65954
+ }
65955
+ },
65834
65956
  new_chat_suggestions: {
65835
65957
  quantum_computing: {
65836
65958
  text: "Teach me about quantum computing in simple terms"
@@ -66558,6 +66680,38 @@ Only output the final Markdown table. Do NOT include explanations, notes, or any
66558
66680
  text: "Could not start the explanation chat. Please try again."
66559
66681
  }
66560
66682
  },
66683
+ queued_followup: {
66684
+ queued: {
66685
+ text: "Queued"
66686
+ },
66687
+ steering: {
66688
+ text: "Steering current response"
66689
+ },
66690
+ updating: {
66691
+ text: "Updating\u2026"
66692
+ },
66693
+ steer_instead: {
66694
+ text: "Steer instead"
66695
+ },
66696
+ editing: {
66697
+ text: "Editing queued message"
66698
+ },
66699
+ cancel_edit: {
66700
+ text: "Cancel edit"
66701
+ },
66702
+ conflict: {
66703
+ text: "This queued message changed on another device. Reopen it to edit the latest version."
66704
+ },
66705
+ unavailable: {
66706
+ text: "Couldn\u2019t update the queued message. Try again."
66707
+ },
66708
+ steer_deferred: {
66709
+ text: "Couldn\u2019t steer this response. Your message remains queued."
66710
+ },
66711
+ paused: {
66712
+ text: "Saved, but the assistant could not continue with this message."
66713
+ }
66714
+ },
66561
66715
  hidden_chats: {
66562
66716
  unlock: {
66563
66717
  text: "Unlock hidden chats"
@@ -99283,7 +99437,12 @@ async function loadHomeData(state, client2, render) {
99283
99437
  state.homeChatsLoading = signedIn && homeChatItems(state).length === 0;
99284
99438
  if (signedIn && typeof client2.listCachedChats === "function") {
99285
99439
  try {
99286
- const cached = await client2.listCachedChats(Number.MAX_SAFE_INTEGER, 1);
99440
+ const cached = await client2.listCachedChats(Number.MAX_SAFE_INTEGER, 1, { onCachedChats: (page) => {
99441
+ if (!current2() || state.recentChats.length > 0) return;
99442
+ updateHomeChats(state, page.chats);
99443
+ state.homeChatsLoading = homeChatItems(state).length === 0;
99444
+ render();
99445
+ } });
99287
99446
  if (!current2()) return;
99288
99447
  if (cached) updateHomeChats(state, cached.chats);
99289
99448
  } catch {
@@ -121448,6 +121607,10 @@ ${renderRemoteCommandReview(review)}
121448
121607
  const acceptedTaskProposals = params.acceptTaskProposals === true && result.status === "completed" ? await acceptChatTaskProposals(client2, result.chatId, result.taskProposals, `${finalMessage}
121449
121608
 
121450
121609
  ${result.assistant}`) : [];
121610
+ if (result.status === "queued") {
121611
+ if (!params.json) process.stderr.write("Message queued for this chat. It will run after the active response finishes.\n");
121612
+ return { ...result, acceptedTaskProposals: [] };
121613
+ }
121451
121614
  if (result.status === "waiting_for_user") {
121452
121615
  const question = parseInteractiveQuestionBlock(result.assistant);
121453
121616
  if (params.json && question) {
@@ -524,37 +524,48 @@ async function unwrapApiKeyMasterKey(params) {
524
524
  }
525
525
  }
526
526
  async function decryptWithAesGcmCombined(encryptedWithIvB64, rawKeyBytes, associatedData) {
527
+ const decrypt = await createAesGcmCombinedDecryptor(rawKeyBytes);
528
+ return decrypt(encryptedWithIvB64, associatedData);
529
+ }
530
+ async function createAesGcmCombinedDecryptor(rawKeyBytes) {
531
+ let key;
527
532
  try {
528
- const combined = base64ToBytes(encryptedWithIvB64);
529
- if (combined.length <= AES_GCM_IV_LENGTH) {
530
- return null;
531
- }
532
- let offset = 0;
533
- if (combined.length > CIPHERTEXT_HEADER_LENGTH + AES_GCM_IV_LENGTH && combined[0] === CIPHERTEXT_MAGIC_0 && combined[1] === CIPHERTEXT_MAGIC_1) {
534
- offset = CIPHERTEXT_HEADER_LENGTH;
535
- }
536
- const iv = combined.slice(offset, offset + AES_GCM_IV_LENGTH);
537
- const ciphertext = combined.slice(offset + AES_GCM_IV_LENGTH);
538
- const key = await cryptoApi.subtle.importKey(
533
+ key = await cryptoApi.subtle.importKey(
539
534
  "raw",
540
535
  toArrayBuffer(rawKeyBytes),
541
536
  { name: "AES-GCM" },
542
537
  false,
543
538
  ["decrypt"]
544
539
  );
545
- const decrypted = await cryptoApi.subtle.decrypt(
546
- {
547
- name: "AES-GCM",
548
- iv: toArrayBuffer(iv),
549
- ...associatedData ? { additionalData: toArrayBuffer(new TextEncoder().encode(associatedData)) } : {}
550
- },
551
- key,
552
- toArrayBuffer(ciphertext)
553
- );
554
- return new TextDecoder().decode(decrypted);
555
540
  } catch {
556
- return null;
541
+ return async () => null;
557
542
  }
543
+ return async (encryptedWithIvB64, associatedData) => {
544
+ try {
545
+ const combined = base64ToBytes(encryptedWithIvB64);
546
+ if (combined.length <= AES_GCM_IV_LENGTH) {
547
+ return null;
548
+ }
549
+ let offset = 0;
550
+ if (combined.length > CIPHERTEXT_HEADER_LENGTH + AES_GCM_IV_LENGTH && combined[0] === CIPHERTEXT_MAGIC_0 && combined[1] === CIPHERTEXT_MAGIC_1) {
551
+ offset = CIPHERTEXT_HEADER_LENGTH;
552
+ }
553
+ const iv = combined.slice(offset, offset + AES_GCM_IV_LENGTH);
554
+ const ciphertext = combined.slice(offset + AES_GCM_IV_LENGTH);
555
+ const decrypted = await cryptoApi.subtle.decrypt(
556
+ {
557
+ name: "AES-GCM",
558
+ iv: toArrayBuffer(iv),
559
+ ...associatedData ? { additionalData: toArrayBuffer(new TextEncoder().encode(associatedData)) } : {}
560
+ },
561
+ key,
562
+ toArrayBuffer(ciphertext)
563
+ );
564
+ return new TextDecoder().decode(decrypted);
565
+ } catch {
566
+ return null;
567
+ }
568
+ };
558
569
  }
559
570
  async function deriveEmailEncryptionKeyB64(email, emailSaltB64) {
560
571
  const encoder = new TextEncoder();
@@ -1292,6 +1303,7 @@ export {
1292
1303
  createApiKeyCryptoMaterial,
1293
1304
  unwrapApiKeyMasterKey,
1294
1305
  decryptWithAesGcmCombined,
1306
+ createAesGcmCombinedDecryptor,
1295
1307
  deriveEmailEncryptionKeyB64,
1296
1308
  decryptBytesWithAesGcm,
1297
1309
  deriveEmbedKeyFromChatKey,
@@ -2715,7 +2715,9 @@ declare class OpenMatesClient {
2715
2715
  /** Observe lifecycle metadata without claiming or collecting AI responses. */
2716
2716
  observeChatActivity(onChange: () => void): Promise<() => void>;
2717
2717
  /** Read encrypted local history without refreshing or opening a connection. */
2718
- listCachedChats(limit?: number, page?: number, options?: TeamContextOptions): Promise<ChatListPage | null>;
2718
+ listCachedChats(limit?: number, page?: number, options?: TeamContextOptions & {
2719
+ onCachedChats?: (page: ChatListPage) => void;
2720
+ }): Promise<ChatListPage | null>;
2719
2721
  listChats(limit?: number, page?: number, options?: TeamContextOptions & {
2720
2722
  forceRefresh?: boolean;
2721
2723
  signal?: AbortSignal;
@@ -2773,6 +2775,8 @@ declare class OpenMatesClient {
2773
2775
  chatId: string;
2774
2776
  chatKey: Uint8Array;
2775
2777
  }>;
2778
+ /** Operation-local ciphertext index and nonextractable key; no persistent plaintext cache. */
2779
+ private createRawChatMessageReader;
2776
2780
  private decryptRawChatMessages;
2777
2781
  private resolveCachedChatForQuery;
2778
2782
  /**
@@ -2989,11 +2993,13 @@ declare class OpenMatesClient {
2989
2993
  /** Override WebSocket turn waits for long-running sends and responses. */
2990
2994
  responseTimeoutMs?: number;
2991
2995
  }): Promise<{
2992
- status: "completed" | "waiting_for_user";
2996
+ status: "completed" | "waiting_for_user" | "queued";
2993
2997
  chatId: string;
2994
2998
  messageId: string | null;
2995
2999
  /** Canonical ID of the persisted human turn, including sends that skip AI. */
2996
3000
  userMessageId?: string;
3001
+ queueMode?: "follow_up" | "steer";
3002
+ queueRevision?: number;
2997
3003
  assistant: string;
2998
3004
  category: string | null;
2999
3005
  modelName: string | null;
package/dist/cli.d.ts CHANGED
@@ -1,2 +1,2 @@
1
1
  #!/usr/bin/env node
2
- export { ak as ImagesAiDetectionClassification, al as ImagesAiDetectionSummary, aK as assertTrustedAccountCommandAllowed, aL as assertTrustedAccountGuardEnvironment, aC as buildImagesAiDetectionSummary, aM as buildProjectDefaultFocus, aN as buildTravelConnectionsRequest, aD as classifyImagesAiDetection, aO as extractExplicitProjectMentions, aF as formatImagesAiDetectionLabel, aG as getExtForLang, aP as handleWiki, aQ as printWhoAmI, aR as readRootProjectInstructions, aS as renderProjectReadApprovalRequest, aT as renderProjectWriteApprovalRequest, aU as renderRemoteCommandEvent, aV as requireExactConfirmation, aW as resolveProjectContext, aJ as serializeToYaml, aX as shouldRequireTrustedAccountGuard, aY as waitForSafeE2ETotpWindow, aZ as waitForWorkflowRun } from './cli-Cn2HwS-2.js';
2
+ export { ak as ImagesAiDetectionClassification, al as ImagesAiDetectionSummary, aK as assertTrustedAccountCommandAllowed, aL as assertTrustedAccountGuardEnvironment, aC as buildImagesAiDetectionSummary, aM as buildProjectDefaultFocus, aN as buildTravelConnectionsRequest, aD as classifyImagesAiDetection, aO as extractExplicitProjectMentions, aF as formatImagesAiDetectionLabel, aG as getExtForLang, aP as handleWiki, aQ as printWhoAmI, aR as readRootProjectInstructions, aS as renderProjectReadApprovalRequest, aT as renderProjectWriteApprovalRequest, aU as renderRemoteCommandEvent, aV as requireExactConfirmation, aW as resolveProjectContext, aJ as serializeToYaml, aX as shouldRequireTrustedAccountGuard, aY as waitForSafeE2ETotpWindow, aZ as waitForWorkflowRun } from './cli-D2oJ-ctT.js';
package/dist/cli.js CHANGED
@@ -21,10 +21,10 @@ import {
21
21
  shouldRequireTrustedAccountGuard,
22
22
  waitForSafeE2ETotpWindow,
23
23
  waitForWorkflowRun
24
- } from "./chunk-PCH6QOC4.js";
25
- import "./chunk-5HWC6OTW.js";
24
+ } from "./chunk-6W3OFVOF.js";
25
+ import "./chunk-5SFXCJJ4.js";
26
26
  import "./chunk-IWKP55ZB.js";
27
- import "./chunk-FC27KZIW.js";
27
+ import "./chunk-F2U6KIMR.js";
28
28
  import "./chunk-TMYEFC7M.js";
29
29
  import "./chunk-V2QAI5ET.js";
30
30
  export {
package/dist/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- import { O as OpenMatesSession, U as UserPlanStatus, a as UserPlanRecord, b as UserPlanVerificationStatus, c as UserPlanLearningType, d as UserPlanLearningTargetKind, e as UserPlanLearningStatus, f as UserPlanLearningLevel, g as UserPlanLearningRecord, h as UserPlanCriterionRecord, i as UserPlanVerificationRecord, j as UserPlanCreateInput, k as UserPlanUpdateInput, B as BuyerAddress, P as ProjectItemRecord, T as TaskCreateOptions, l as TaskUpdateOptions, m as UserPlanLearningCreateTasksInput, n as UserPlanLearningCreateTasksResult, o as UserTaskStatus, E as ExternalChatContext, p as TaskPriorityLevel, D as DecryptedUserTask, q as DecryptedTaskActivityEntry, r as TaskActivityCreateOptions, s as UserTaskReorderInput, W as WorkflowSummary, t as WorkflowCapability, u as WorkflowDetail, v as WorkflowAuthoringWarning, w as WorkflowInputStartParams, x as WorkflowInputSessionResult, y as WorkflowInputSessionDetail, z as WorkflowInputEvent, A as WorkflowGraph, C as WorkflowRunContentRetention, F as WorkflowRunOnceOptions, G as WorkflowRunDetail, H as WorkflowRunOptions, I as WorkflowNode, J as WorkflowRunCancellationResult, K as WorkflowTemplateProjectionUpsertParams, L as WorkflowTemplateProjectionResult, M as PublicWorkflowTemplateProjection, N as WorkflowTemplateProjectionRevocationResult, Q as WorkflowTemplateBindingCompletionParams, R as WorkflowTemplateBindingCompletionResult, S as WorkflowTemplateShortUrlParams, V as WorkflowTemplateShortUrlResult, X as ShortUrlRevokeResult, Y as WorkflowTemplateImportPayload, Z as ImportedWorkflowTemplate, _ as WikipediaLearningBundle } from './cli-Cn2HwS-2.js';
2
- export { $ as AuthMethodsStatus, a0 as AuthoritativeChatReconciliation, a1 as BackupCodesResult, a2 as BankTransferOrderDetails, a3 as BankTransferStatus, a4 as CachedChat, a5 as CachedNewChatSuggestion, a6 as ChatListPage, a7 as CliSignupResult, a8 as DecryptedDraft, a9 as DecryptedEmbed, aa as DecryptedMemoryEntry, ab as DecryptedMessage, ac as DecryptedNewChatSuggestion, ad as DocsFile, ae as DocsFolder, af as DocsSearchResult, ag as DocsTree, ah as EncryptedDraft, ai as GiftCardBankTransferStatus, aj as INTEREST_TAG_IDS, ak as ImagesAiDetectionClassification, al as ImagesAiDetectionSummary, am as InterestTagId, an as MATE_NAMES, ao as MEMORY_TYPE_REGISTRY, ap as MemoryFieldDef, aq as MemoryTypeDef, ar as OpenMatesClient, as as OpenMatesClientOptions, at as SyncCache, au as TopicPreferencesPayload, av as TotpSetupStartResult, aw as WorkflowEdge, ax as WorkflowNodeRun, ay as WorkflowNodeType, az as WorkflowReturnedOutputReference, aA as WorkflowRunContentStorage, aB as WorkflowRunRouting, aC as buildImagesAiDetectionSummary, aD as classifyImagesAiDetection, aE as deriveAppUrl, aF as formatImagesAiDetectionLabel, aG as getExtForLang, aH as normalizeInterestTagIds, aI as reconcileAuthoritativeChats, aJ as serializeToYaml } from './cli-Cn2HwS-2.js';
1
+ import { O as OpenMatesSession, U as UserPlanStatus, a as UserPlanRecord, b as UserPlanVerificationStatus, c as UserPlanLearningType, d as UserPlanLearningTargetKind, e as UserPlanLearningStatus, f as UserPlanLearningLevel, g as UserPlanLearningRecord, h as UserPlanCriterionRecord, i as UserPlanVerificationRecord, j as UserPlanCreateInput, k as UserPlanUpdateInput, B as BuyerAddress, P as ProjectItemRecord, T as TaskCreateOptions, l as TaskUpdateOptions, m as UserPlanLearningCreateTasksInput, n as UserPlanLearningCreateTasksResult, o as UserTaskStatus, E as ExternalChatContext, p as TaskPriorityLevel, D as DecryptedUserTask, q as DecryptedTaskActivityEntry, r as TaskActivityCreateOptions, s as UserTaskReorderInput, W as WorkflowSummary, t as WorkflowCapability, u as WorkflowDetail, v as WorkflowAuthoringWarning, w as WorkflowInputStartParams, x as WorkflowInputSessionResult, y as WorkflowInputSessionDetail, z as WorkflowInputEvent, A as WorkflowGraph, C as WorkflowRunContentRetention, F as WorkflowRunOnceOptions, G as WorkflowRunDetail, H as WorkflowRunOptions, I as WorkflowNode, J as WorkflowRunCancellationResult, K as WorkflowTemplateProjectionUpsertParams, L as WorkflowTemplateProjectionResult, M as PublicWorkflowTemplateProjection, N as WorkflowTemplateProjectionRevocationResult, Q as WorkflowTemplateBindingCompletionParams, R as WorkflowTemplateBindingCompletionResult, S as WorkflowTemplateShortUrlParams, V as WorkflowTemplateShortUrlResult, X as ShortUrlRevokeResult, Y as WorkflowTemplateImportPayload, Z as ImportedWorkflowTemplate, _ as WikipediaLearningBundle } from './cli-D2oJ-ctT.js';
2
+ export { $ as AuthMethodsStatus, a0 as AuthoritativeChatReconciliation, a1 as BackupCodesResult, a2 as BankTransferOrderDetails, a3 as BankTransferStatus, a4 as CachedChat, a5 as CachedNewChatSuggestion, a6 as ChatListPage, a7 as CliSignupResult, a8 as DecryptedDraft, a9 as DecryptedEmbed, aa as DecryptedMemoryEntry, ab as DecryptedMessage, ac as DecryptedNewChatSuggestion, ad as DocsFile, ae as DocsFolder, af as DocsSearchResult, ag as DocsTree, ah as EncryptedDraft, ai as GiftCardBankTransferStatus, aj as INTEREST_TAG_IDS, ak as ImagesAiDetectionClassification, al as ImagesAiDetectionSummary, am as InterestTagId, an as MATE_NAMES, ao as MEMORY_TYPE_REGISTRY, ap as MemoryFieldDef, aq as MemoryTypeDef, ar as OpenMatesClient, as as OpenMatesClientOptions, at as SyncCache, au as TopicPreferencesPayload, av as TotpSetupStartResult, aw as WorkflowEdge, ax as WorkflowNodeRun, ay as WorkflowNodeType, az as WorkflowReturnedOutputReference, aA as WorkflowRunContentStorage, aB as WorkflowRunRouting, aC as buildImagesAiDetectionSummary, aD as classifyImagesAiDetection, aE as deriveAppUrl, aF as formatImagesAiDetectionLabel, aG as getExtForLang, aH as normalizeInterestTagIds, aI as reconcileAuthoritativeChats, aJ as serializeToYaml } from './cli-D2oJ-ctT.js';
3
3
 
4
4
  type ChatModelSelection = "auto" | (string & {});
5
5
  interface ChatModelCatalogEntry {
package/dist/index.js CHANGED
@@ -44,10 +44,10 @@ import {
44
44
  selectAssistantMessagesForSpeech,
45
45
  serializeToYaml,
46
46
  summarizeAssistantSpeech
47
- } from "./chunk-PCH6QOC4.js";
48
- import "./chunk-5HWC6OTW.js";
47
+ } from "./chunk-6W3OFVOF.js";
48
+ import "./chunk-5SFXCJJ4.js";
49
49
  import "./chunk-IWKP55ZB.js";
50
- import "./chunk-FC27KZIW.js";
50
+ import "./chunk-F2U6KIMR.js";
51
51
  import "./chunk-TMYEFC7M.js";
52
52
  import "./chunk-V2QAI5ET.js";
53
53
  export {
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  runPrivacyDaemon
3
- } from "./chunk-5HWC6OTW.js";
3
+ } from "./chunk-5SFXCJJ4.js";
4
4
 
5
5
  // src/privacyDaemon.ts
6
6
  void runPrivacyDaemon().catch(() => process.exit(1));
@@ -30,7 +30,7 @@ import {
30
30
  taskLookupScopes,
31
31
  taskPriorityLevel,
32
32
  workflowProjectionDeleteGuidance
33
- } from "./chunk-FC27KZIW.js";
33
+ } from "./chunk-F2U6KIMR.js";
34
34
  export {
35
35
  TASK_STATUSES,
36
36
  buildBlockUserTaskInput,
@@ -17,47 +17,47 @@
17
17
  {
18
18
  "name": "libggml-base.so",
19
19
  "bytes": 1110088,
20
- "sha256": "ab52a9264487708871053c7d2f452f54f132716892207ccaec997318b5e23b1a"
20
+ "sha256": "6a206cb47287d4597fed24840955504398be4fdb92f1317e36621d7345b64e65"
21
21
  },
22
22
  {
23
23
  "name": "libggml-base.so.0",
24
24
  "bytes": 1110088,
25
- "sha256": "ab52a9264487708871053c7d2f452f54f132716892207ccaec997318b5e23b1a"
25
+ "sha256": "6a206cb47287d4597fed24840955504398be4fdb92f1317e36621d7345b64e65"
26
26
  },
27
27
  {
28
28
  "name": "libggml-base.so.0.15.1",
29
29
  "bytes": 1110088,
30
- "sha256": "ab52a9264487708871053c7d2f452f54f132716892207ccaec997318b5e23b1a"
30
+ "sha256": "6a206cb47287d4597fed24840955504398be4fdb92f1317e36621d7345b64e65"
31
31
  },
32
32
  {
33
33
  "name": "libggml-cpu.so",
34
34
  "bytes": 869800,
35
- "sha256": "73bdccf793d2aa04e3fde27b0d46f90afa6f49a2a91ddd764ec9d7e422e95ec4"
35
+ "sha256": "50b85ca0cca21bff7709775869e608dcd1b8ce3cb5ba705fa5d8ddc0aa570376"
36
36
  },
37
37
  {
38
38
  "name": "libggml-cpu.so.0",
39
39
  "bytes": 869800,
40
- "sha256": "73bdccf793d2aa04e3fde27b0d46f90afa6f49a2a91ddd764ec9d7e422e95ec4"
40
+ "sha256": "50b85ca0cca21bff7709775869e608dcd1b8ce3cb5ba705fa5d8ddc0aa570376"
41
41
  },
42
42
  {
43
43
  "name": "libggml-cpu.so.0.15.1",
44
44
  "bytes": 869800,
45
- "sha256": "73bdccf793d2aa04e3fde27b0d46f90afa6f49a2a91ddd764ec9d7e422e95ec4"
45
+ "sha256": "50b85ca0cca21bff7709775869e608dcd1b8ce3cb5ba705fa5d8ddc0aa570376"
46
46
  },
47
47
  {
48
48
  "name": "libggml.so",
49
49
  "bytes": 1899104,
50
- "sha256": "f108928f8395e1ee4eb9d80e65076479dee1dbba5a6d20a196b062846647a905"
50
+ "sha256": "483f0288f2565ff90cd171543ea0d02b11a10feed555917abdd76a54ac9a9f7d"
51
51
  },
52
52
  {
53
53
  "name": "libggml.so.0",
54
54
  "bytes": 1899104,
55
- "sha256": "f108928f8395e1ee4eb9d80e65076479dee1dbba5a6d20a196b062846647a905"
55
+ "sha256": "483f0288f2565ff90cd171543ea0d02b11a10feed555917abdd76a54ac9a9f7d"
56
56
  },
57
57
  {
58
58
  "name": "libggml.so.0.15.1",
59
59
  "bytes": 1899104,
60
- "sha256": "f108928f8395e1ee4eb9d80e65076479dee1dbba5a6d20a196b062846647a905"
60
+ "sha256": "483f0288f2565ff90cd171543ea0d02b11a10feed555917abdd76a54ac9a9f7d"
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.27.0-alpha.53",
3
+ "version": "0.27.0-alpha.55",
4
4
  "description": "OpenMates CLI and SDK",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -53,7 +53,7 @@
53
53
  "test:unit:tui": "node --test --experimental-strip-types --loader ./tests/loader.mjs tests/tui.test.ts tests/tuiExampleContinuation.test.ts tests/tuiWorkflowInteraction.test.ts tests/tuiWorkspaceInteraction.test.ts tests/tuiLayout.test.ts tests/tuiTerminal.test.ts tests/tuiRenderCache.test.ts tests/tuiStreamingRender.test.ts tests/tuiStreamingSend.test.ts tests/tuiTerminalFrame.test.ts tests/tuiPrototypeBridge.test.ts tests/tuiStartup.test.ts tests/tuiTasksWorkspace.test.ts tests/tuiProjectsWorkspace.test.ts tests/tuiWorkflowWorkspace.test.ts tests/tuiAttachments.test.ts tests/tuiCancellation.test.ts tests/tuiWorkflowVersion.test.ts tests/tuiAppsWorkspace.test.ts tests/tuiHome.test.ts tests/tuiEmbeds.test.ts tests/tuiEmbedPreviews.test.ts tests/tuiMarkdown.test.ts tests/tuiResultsViews.test.ts tests/tuiRichChatInteraction.test.ts tests/tuiInteractiveQuestions.test.ts tests/tuiCachedWorkspaces.test.ts tests/tuiTaskList.test.ts tests/tuiWorkspaceCache.test.ts tests/tuiProjectCacheInteraction.test.ts tests/tuiChatSidebar.test.ts tests/tuiPointer.test.ts tests/tuiPointerWorkspaces.test.ts tests/tuiPointerChat.test.ts tests/tuiHeaderActions.test.ts tests/tuiSettings.test.ts tests/tuiTeamsSettings.test.ts tests/tuiTeamChat.test.ts tests/tuiChromeShell.test.ts tests/tuiModelSelector.test.ts tests/tuiModelSelectorShell.test.ts",
54
54
  "test:unit:connected-account-import": "node --test --experimental-strip-types --loader ./tests/loader.mjs tests/connectedAccountImport.test.ts",
55
55
  "test:unit:benchmark": "node --test --experimental-strip-types --loader ./tests/loader.mjs src/__tests__/benchmark.test.ts",
56
- "test": "node --test --experimental-strip-types --loader ./tests/loader.mjs tests/wiki.test.ts tests/privacy.test.ts tests/crypto.test.ts tests/storage.test.ts tests/keychain.test.ts tests/mentions.test.ts tests/outputRedactor.test.ts tests/fileEmbed.test.ts tests/embedCreator.test.ts tests/shareEncryption.test.ts tests/server.test.ts tests/serverCaddyUpdate.test.ts tests/serverCaddyUpgrade.test.ts tests/serverQuickTest.test.ts tests/ws.test.ts tests/urlEmbed.test.ts tests/tui.test.ts tests/tuiTeamsSettings.test.ts tests/tuiTeamChat.test.ts tests/tuiExampleContinuation.test.ts tests/tuiWorkflowInteraction.test.ts tests/tuiWorkspaceInteraction.test.ts tests/tuiLayout.test.ts tests/tuiTerminal.test.ts tests/tuiRenderCache.test.ts tests/tuiStreamingRender.test.ts tests/tuiStreamingSend.test.ts tests/tuiTerminalFrame.test.ts tests/tuiPrototypeBridge.test.ts tests/tuiStartup.test.ts tests/tuiTasksWorkspace.test.ts tests/tuiProjectsWorkspace.test.ts tests/tuiWorkflowWorkspace.test.ts tests/tuiAttachments.test.ts tests/tuiCancellation.test.ts tests/tuiWorkflowVersion.test.ts tests/tuiAppsWorkspace.test.ts tests/tuiHome.test.ts tests/tuiEmbeds.test.ts tests/tuiEmbedPreviews.test.ts tests/tuiMarkdown.test.ts tests/tuiResultsViews.test.ts tests/tuiRichChatInteraction.test.ts tests/tuiInteractiveQuestions.test.ts tests/tuiCachedWorkspaces.test.ts tests/tuiTaskList.test.ts tests/tuiWorkspaceCache.test.ts tests/tuiProjectCacheInteraction.test.ts tests/tuiChatSidebar.test.ts tests/sdk-chat-sidebar.test.ts tests/workflows.test.ts tests/workflow-file.test.ts tests/sdk-workflows.test.ts tests/draft-sync.test.ts tests/sdk-draft-sync.test.ts tests/ideabucket.test.ts tests/teams-permissions.test.ts tests/sdk-teams.test.ts tests/team-ai-trigger.test.ts src/__tests__/benchmark.test.ts && node --test --experimental-strip-types --loader ./tests/loader.mjs tests/embedRenderers.test.ts tests/connectedAccountImport.test.ts && node --test --experimental-strip-types --loader ./tests/loader.mjs tests/cli.test.ts tests/loginTerminal.test.ts tests/imagesDetectAi.test.ts tests/uploadService.test.ts tests/billing.test.ts tests/account-delete.test.ts tests/signup.test.ts tests/security-setup.test.ts tests/e2e-provisioning.test.ts && npm run test:unit:session && npm run test:unit:task-sync && npm run test:unit:task-pagination",
56
+ "test": "node --test --experimental-strip-types --loader ./tests/loader.mjs tests/wiki.test.ts tests/privacy.test.ts tests/crypto.test.ts tests/cryptoBatch.test.ts tests/clientStartup.test.ts tests/storage.test.ts tests/keychain.test.ts tests/mentions.test.ts tests/outputRedactor.test.ts tests/fileEmbed.test.ts tests/embedCreator.test.ts tests/shareEncryption.test.ts tests/server.test.ts tests/serverCaddyUpdate.test.ts tests/serverCaddyUpgrade.test.ts tests/serverQuickTest.test.ts tests/ws.test.ts tests/urlEmbed.test.ts tests/tui.test.ts tests/tuiTeamsSettings.test.ts tests/tuiTeamChat.test.ts tests/tuiExampleContinuation.test.ts tests/tuiWorkflowInteraction.test.ts tests/tuiWorkspaceInteraction.test.ts tests/tuiLayout.test.ts tests/tuiTerminal.test.ts tests/tuiRenderCache.test.ts tests/tuiStreamingRender.test.ts tests/tuiStreamingSend.test.ts tests/tuiTerminalFrame.test.ts tests/tuiPrototypeBridge.test.ts tests/tuiStartup.test.ts tests/tuiTasksWorkspace.test.ts tests/tuiProjectsWorkspace.test.ts tests/tuiWorkflowWorkspace.test.ts tests/tuiAttachments.test.ts tests/tuiCancellation.test.ts tests/tuiWorkflowVersion.test.ts tests/tuiAppsWorkspace.test.ts tests/tuiHome.test.ts tests/tuiEmbeds.test.ts tests/tuiEmbedPreviews.test.ts tests/tuiMarkdown.test.ts tests/tuiResultsViews.test.ts tests/tuiRichChatInteraction.test.ts tests/tuiInteractiveQuestions.test.ts tests/tuiCachedWorkspaces.test.ts tests/tuiTaskList.test.ts tests/tuiWorkspaceCache.test.ts tests/tuiProjectCacheInteraction.test.ts tests/tuiChatSidebar.test.ts tests/sdk-chat-sidebar.test.ts tests/workflows.test.ts tests/workflow-file.test.ts tests/sdk-workflows.test.ts tests/draft-sync.test.ts tests/sdk-draft-sync.test.ts tests/ideabucket.test.ts tests/teams-permissions.test.ts tests/sdk-teams.test.ts tests/team-ai-trigger.test.ts src/__tests__/benchmark.test.ts && node --test --experimental-strip-types --loader ./tests/loader.mjs tests/embedRenderers.test.ts tests/connectedAccountImport.test.ts && node --test --experimental-strip-types --loader ./tests/loader.mjs tests/cli.test.ts tests/loginTerminal.test.ts tests/imagesDetectAi.test.ts tests/uploadService.test.ts tests/billing.test.ts tests/account-delete.test.ts tests/signup.test.ts tests/security-setup.test.ts tests/e2e-provisioning.test.ts && npm run test:unit:session && npm run test:unit:task-sync && npm run test:unit:task-pagination",
57
57
  "test:unit:session": "node --test --experimental-strip-types --loader ./tests/loader.mjs --test-name-pattern \"serializes refreshes|session refresh|rotated|gateway\" tests/client.test.ts",
58
58
  "test:unit:task-sync": "node --test --experimental-strip-types --loader ./tests/loader.mjs tests/projectTaskSync.test.ts tests/taskActivityDelivery.test.ts tests/taskCommandDelivery.test.ts tests/taskDelivery.test.ts tests/taskMutationDelivery.test.ts tests/claimConflict.test.ts tests/cliTaskQueue.test.ts tests/codexConnection.test.ts tests/remoteSources.test.ts tests/remoteAccess.test.ts tests/remoteAccessCrypto.test.ts",
59
59
  "test:unit:sdk-sidebar": "node --test --experimental-strip-types --loader ./tests/loader.mjs tests/sdk-chat-sidebar.test.ts",