@anuma/sdk 10.0.2 → 10.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/expo/index.cjs +281 -226
- package/dist/expo/index.mjs +227 -172
- package/dist/react/index.cjs +304 -249
- package/dist/react/index.mjs +235 -180
- package/dist/server/index.cjs +1430 -1375
- package/dist/server/index.d.mts +1 -8
- package/dist/server/index.d.ts +1 -8
- package/dist/server/index.mjs +263 -208
- package/package.json +1 -1
package/dist/react/index.mjs
CHANGED
|
@@ -2180,6 +2180,160 @@ async function assembleDecryptedMessage(message, address) {
|
|
|
2180
2180
|
return result;
|
|
2181
2181
|
}
|
|
2182
2182
|
|
|
2183
|
+
// src/lib/db/chat/models.ts
|
|
2184
|
+
import { Model as Model2 } from "@nozbe/watermelondb";
|
|
2185
|
+
import { date, field, json, text } from "@nozbe/watermelondb/decorators";
|
|
2186
|
+
var Message = class extends Model2 {
|
|
2187
|
+
};
|
|
2188
|
+
Message.table = "history";
|
|
2189
|
+
Message.associations = {
|
|
2190
|
+
conversations: { type: "belongs_to", key: "conversation_id" },
|
|
2191
|
+
media: { type: "has_many", foreignKey: "message_id" }
|
|
2192
|
+
};
|
|
2193
|
+
__decorateClass([
|
|
2194
|
+
field("message_id")
|
|
2195
|
+
], Message.prototype, "messageId", 2);
|
|
2196
|
+
__decorateClass([
|
|
2197
|
+
text("conversation_id")
|
|
2198
|
+
], Message.prototype, "conversationId", 2);
|
|
2199
|
+
__decorateClass([
|
|
2200
|
+
text("role")
|
|
2201
|
+
], Message.prototype, "role", 2);
|
|
2202
|
+
__decorateClass([
|
|
2203
|
+
text("content")
|
|
2204
|
+
], Message.prototype, "content", 2);
|
|
2205
|
+
__decorateClass([
|
|
2206
|
+
text("model")
|
|
2207
|
+
], Message.prototype, "model", 2);
|
|
2208
|
+
__decorateClass([
|
|
2209
|
+
text("image_model")
|
|
2210
|
+
], Message.prototype, "imageModel", 2);
|
|
2211
|
+
__decorateClass([
|
|
2212
|
+
json("files", (raw) => raw)
|
|
2213
|
+
], Message.prototype, "files", 2);
|
|
2214
|
+
__decorateClass([
|
|
2215
|
+
json("file_ids", (raw) => raw)
|
|
2216
|
+
], Message.prototype, "fileIds", 2);
|
|
2217
|
+
__decorateClass([
|
|
2218
|
+
date("created_at")
|
|
2219
|
+
], Message.prototype, "createdAt", 2);
|
|
2220
|
+
__decorateClass([
|
|
2221
|
+
date("updated_at")
|
|
2222
|
+
], Message.prototype, "updatedAt", 2);
|
|
2223
|
+
__decorateClass([
|
|
2224
|
+
json("vector", (raw) => raw)
|
|
2225
|
+
], Message.prototype, "vector", 2);
|
|
2226
|
+
__decorateClass([
|
|
2227
|
+
text("embedding_model")
|
|
2228
|
+
], Message.prototype, "embeddingModel", 2);
|
|
2229
|
+
__decorateClass([
|
|
2230
|
+
json("chunks", (raw) => raw)
|
|
2231
|
+
], Message.prototype, "chunks", 2);
|
|
2232
|
+
__decorateClass([
|
|
2233
|
+
json("usage", (raw) => raw)
|
|
2234
|
+
], Message.prototype, "usage", 2);
|
|
2235
|
+
__decorateClass([
|
|
2236
|
+
json("sources", (raw) => raw)
|
|
2237
|
+
], Message.prototype, "sources", 2);
|
|
2238
|
+
__decorateClass([
|
|
2239
|
+
field("response_duration")
|
|
2240
|
+
], Message.prototype, "responseDuration", 2);
|
|
2241
|
+
__decorateClass([
|
|
2242
|
+
field("was_stopped")
|
|
2243
|
+
], Message.prototype, "wasStopped", 2);
|
|
2244
|
+
__decorateClass([
|
|
2245
|
+
text("error")
|
|
2246
|
+
], Message.prototype, "error", 2);
|
|
2247
|
+
__decorateClass([
|
|
2248
|
+
json("thought_process", (raw) => raw)
|
|
2249
|
+
], Message.prototype, "thoughtProcess", 2);
|
|
2250
|
+
__decorateClass([
|
|
2251
|
+
text("thinking")
|
|
2252
|
+
], Message.prototype, "thinking", 2);
|
|
2253
|
+
__decorateClass([
|
|
2254
|
+
text("parent_message_id")
|
|
2255
|
+
], Message.prototype, "parentMessageId", 2);
|
|
2256
|
+
__decorateClass([
|
|
2257
|
+
text("feedback")
|
|
2258
|
+
], Message.prototype, "feedback", 2);
|
|
2259
|
+
__decorateClass([
|
|
2260
|
+
json("tool_call_events", (raw) => raw)
|
|
2261
|
+
], Message.prototype, "toolCallEvents", 2);
|
|
2262
|
+
__decorateClass([
|
|
2263
|
+
text("origin")
|
|
2264
|
+
], Message.prototype, "origin", 2);
|
|
2265
|
+
var Conversation = class extends Model2 {
|
|
2266
|
+
};
|
|
2267
|
+
Conversation.table = "conversations";
|
|
2268
|
+
Conversation.associations = {
|
|
2269
|
+
history: { type: "has_many", foreignKey: "conversation_id" },
|
|
2270
|
+
projects: { type: "belongs_to", key: "project_id" }
|
|
2271
|
+
};
|
|
2272
|
+
__decorateClass([
|
|
2273
|
+
text("conversation_id")
|
|
2274
|
+
], Conversation.prototype, "conversationId", 2);
|
|
2275
|
+
__decorateClass([
|
|
2276
|
+
text("title")
|
|
2277
|
+
], Conversation.prototype, "title", 2);
|
|
2278
|
+
__decorateClass([
|
|
2279
|
+
text("project_id")
|
|
2280
|
+
], Conversation.prototype, "projectId", 2);
|
|
2281
|
+
__decorateClass([
|
|
2282
|
+
date("created_at")
|
|
2283
|
+
], Conversation.prototype, "createdAt", 2);
|
|
2284
|
+
__decorateClass([
|
|
2285
|
+
date("updated_at")
|
|
2286
|
+
], Conversation.prototype, "updatedAt", 2);
|
|
2287
|
+
__decorateClass([
|
|
2288
|
+
field("is_deleted")
|
|
2289
|
+
], Conversation.prototype, "isDeleted", 2);
|
|
2290
|
+
__decorateClass([
|
|
2291
|
+
date("pinned_at")
|
|
2292
|
+
], Conversation.prototype, "pinnedAt", 2);
|
|
2293
|
+
var ConversationSummary = class extends Model2 {
|
|
2294
|
+
};
|
|
2295
|
+
ConversationSummary.table = "conversation_summaries";
|
|
2296
|
+
ConversationSummary.associations = {
|
|
2297
|
+
conversations: { type: "belongs_to", key: "conversation_id" }
|
|
2298
|
+
};
|
|
2299
|
+
__decorateClass([
|
|
2300
|
+
text("conversation_id")
|
|
2301
|
+
], ConversationSummary.prototype, "conversationId", 2);
|
|
2302
|
+
__decorateClass([
|
|
2303
|
+
text("summary")
|
|
2304
|
+
], ConversationSummary.prototype, "summary", 2);
|
|
2305
|
+
__decorateClass([
|
|
2306
|
+
text("summarized_up_to")
|
|
2307
|
+
], ConversationSummary.prototype, "summarizedUpTo", 2);
|
|
2308
|
+
__decorateClass([
|
|
2309
|
+
field("token_count")
|
|
2310
|
+
], ConversationSummary.prototype, "tokenCount", 2);
|
|
2311
|
+
__decorateClass([
|
|
2312
|
+
date("created_at")
|
|
2313
|
+
], ConversationSummary.prototype, "createdAt", 2);
|
|
2314
|
+
__decorateClass([
|
|
2315
|
+
date("updated_at")
|
|
2316
|
+
], ConversationSummary.prototype, "updatedAt", 2);
|
|
2317
|
+
|
|
2318
|
+
// src/lib/db/chat/summaryRevision.ts
|
|
2319
|
+
var conversationRevisions = /* @__PURE__ */ new WeakMap();
|
|
2320
|
+
function getConversationRevision(database, conversationId) {
|
|
2321
|
+
return conversationRevisions.get(database)?.get(conversationId) ?? 0;
|
|
2322
|
+
}
|
|
2323
|
+
function advanceConversationRevision(database, conversationId) {
|
|
2324
|
+
let revisions = conversationRevisions.get(database);
|
|
2325
|
+
if (!revisions) {
|
|
2326
|
+
revisions = /* @__PURE__ */ new Map();
|
|
2327
|
+
conversationRevisions.set(database, revisions);
|
|
2328
|
+
}
|
|
2329
|
+
revisions.set(conversationId, getConversationRevision(database, conversationId) + 1);
|
|
2330
|
+
}
|
|
2331
|
+
function assertConversationRevision(database, conversationId, revision2) {
|
|
2332
|
+
if (getConversationRevision(database, conversationId) !== revision2) {
|
|
2333
|
+
throw new Error("The conversation changed during summarization. Retry the request.");
|
|
2334
|
+
}
|
|
2335
|
+
}
|
|
2336
|
+
|
|
2183
2337
|
// src/lib/db/chat/toolCallEventIndex.ts
|
|
2184
2338
|
import { Q } from "@nozbe/watermelondb";
|
|
2185
2339
|
function parseEventIds(value) {
|
|
@@ -2889,8 +3043,20 @@ async function getMessageSkeletonsOp(ctx, convId) {
|
|
|
2889
3043
|
async function getToolCallEventIdsOp(ctx, convId) {
|
|
2890
3044
|
return getToolCallEventIds(ctx.messagesCollection, convId);
|
|
2891
3045
|
}
|
|
3046
|
+
async function invalidateConversationSummary(ctx, conversationId, changedMessageId) {
|
|
3047
|
+
if (!ctx.database.schema?.tables[ConversationSummary.table]) return;
|
|
3048
|
+
const summaries = await ctx.database.get(ConversationSummary.table).query(Q2.where("conversation_id", conversationId)).fetch();
|
|
3049
|
+
for (const summary of summaries) {
|
|
3050
|
+
if (changedMessageId !== void 0) {
|
|
3051
|
+
const [boundary] = await ctx.messagesCollection.query(Q2.where("id", summary.summarizedUpTo), Q2.where("conversation_id", conversationId)).fetch();
|
|
3052
|
+
if (boundary && changedMessageId > boundary.messageId) continue;
|
|
3053
|
+
}
|
|
3054
|
+
await summary.destroyPermanently();
|
|
3055
|
+
}
|
|
3056
|
+
}
|
|
2892
3057
|
async function clearMessagesOp(ctx, convId) {
|
|
2893
3058
|
await ctx.database.write(async () => {
|
|
3059
|
+
await invalidateConversationSummary(ctx, convId);
|
|
2894
3060
|
const messages = await ctx.messagesCollection.query(Q2.where("conversation_id", convId)).fetch();
|
|
2895
3061
|
const jobs = ctx.database.schema?.tables[ExtractionJob.table] ? await ctx.database.get(ExtractionJob.table).query(Q2.where("conversation_id", convId)).fetch() : [];
|
|
2896
3062
|
for (const job of jobs) {
|
|
@@ -2902,11 +3068,12 @@ async function clearMessagesOp(ctx, convId) {
|
|
|
2902
3068
|
}
|
|
2903
3069
|
for (const message of messages) {
|
|
2904
3070
|
await message.update((msg) => {
|
|
2905
|
-
msg._setRaw("file_ids", null);
|
|
3071
|
+
if (ctx.messagesCollection.schema.columns.file_ids) msg._setRaw("file_ids", null);
|
|
2906
3072
|
msg._setRaw("files", null);
|
|
2907
3073
|
});
|
|
2908
3074
|
await message.destroyPermanently();
|
|
2909
3075
|
}
|
|
3076
|
+
advanceConversationRevision(ctx.database, convId);
|
|
2910
3077
|
});
|
|
2911
3078
|
}
|
|
2912
3079
|
async function deleteMessageOp(ctx, uniqueId) {
|
|
@@ -2917,6 +3084,7 @@ async function deleteMessageOp(ctx, uniqueId) {
|
|
|
2917
3084
|
return null;
|
|
2918
3085
|
}
|
|
2919
3086
|
await ctx.database.write(async () => {
|
|
3087
|
+
await invalidateConversationSummary(ctx, message.conversationId, message.messageId);
|
|
2920
3088
|
const jobs = ctx.database.schema?.tables[ExtractionJob.table] ? await ctx.database.get(ExtractionJob.table).query(Q2.where("conversation_id", message.conversationId)).fetch() : [];
|
|
2921
3089
|
for (const job of jobs) {
|
|
2922
3090
|
const ids = JSON.parse(String(job._getRaw("message_ids")));
|
|
@@ -2926,10 +3094,11 @@ async function deleteMessageOp(ctx, uniqueId) {
|
|
|
2926
3094
|
});
|
|
2927
3095
|
}
|
|
2928
3096
|
await message.update((msg) => {
|
|
2929
|
-
msg._setRaw("file_ids", null);
|
|
3097
|
+
if (ctx.messagesCollection.schema.columns.file_ids) msg._setRaw("file_ids", null);
|
|
2930
3098
|
msg._setRaw("files", null);
|
|
2931
3099
|
});
|
|
2932
3100
|
await message.destroyPermanently();
|
|
3101
|
+
advanceConversationRevision(ctx.database, message.conversationId);
|
|
2933
3102
|
});
|
|
2934
3103
|
return uniqueId;
|
|
2935
3104
|
}
|
|
@@ -3339,6 +3508,14 @@ async function _updateMessageOp(ctx, uniqueId, opts) {
|
|
|
3339
3508
|
ctx.embeddedWalletSigner
|
|
3340
3509
|
) : opts;
|
|
3341
3510
|
await ctx.database.write(async () => {
|
|
3511
|
+
let contentChanged = false;
|
|
3512
|
+
if (opts.content !== void 0) {
|
|
3513
|
+
const originalContent = ctx.walletAddress ? await decryptField(message.content, ctx.walletAddress) : message.content;
|
|
3514
|
+
contentChanged = opts.content !== originalContent;
|
|
3515
|
+
if (contentChanged) {
|
|
3516
|
+
await invalidateConversationSummary(ctx, message.conversationId, message.messageId);
|
|
3517
|
+
}
|
|
3518
|
+
}
|
|
3342
3519
|
await message.update((msg) => {
|
|
3343
3520
|
if (encryptedOpts.content !== void 0)
|
|
3344
3521
|
msg._setRaw("content", encryptedOpts.content);
|
|
@@ -3383,6 +3560,7 @@ async function _updateMessageOp(ctx, uniqueId, opts) {
|
|
|
3383
3560
|
msg._setRaw("tool_call_events", tceValue);
|
|
3384
3561
|
}
|
|
3385
3562
|
});
|
|
3563
|
+
if (contentChanged) advanceConversationRevision(ctx.database, message.conversationId);
|
|
3386
3564
|
});
|
|
3387
3565
|
return messageToStored(message, ctx.walletAddress, ctx.signMessage, ctx.embeddedWalletSigner);
|
|
3388
3566
|
}
|
|
@@ -5419,22 +5597,22 @@ function toReceipt(action, argumentsJson, output) {
|
|
|
5419
5597
|
const result = parseObject(output);
|
|
5420
5598
|
return {
|
|
5421
5599
|
kind: action.kind,
|
|
5422
|
-
venueName:
|
|
5423
|
-
day:
|
|
5424
|
-
time:
|
|
5600
|
+
venueName: text2(args.venue_name) ?? "",
|
|
5601
|
+
day: text2(args.day) ?? "",
|
|
5602
|
+
time: text2(args.time) ?? "",
|
|
5425
5603
|
partySize: count(args.party_size),
|
|
5426
|
-
reservationId:
|
|
5427
|
-
resyUrl:
|
|
5428
|
-
feeSummary:
|
|
5604
|
+
reservationId: text2(result.reservation_id) ?? text2(args.reservation_id),
|
|
5605
|
+
resyUrl: text2(result.reservations_url),
|
|
5606
|
+
feeSummary: text2(result.fee_summary),
|
|
5429
5607
|
...outcome(action, output, result)
|
|
5430
5608
|
};
|
|
5431
5609
|
}
|
|
5432
5610
|
function outcome(action, output, result) {
|
|
5433
5611
|
if (action.alreadyDone.test(output)) return { status: "already_done" };
|
|
5434
|
-
const reason =
|
|
5612
|
+
const reason = text2(result.error);
|
|
5435
5613
|
if (action.kind === "booking") {
|
|
5436
5614
|
if (BOOKING_OUTCOME_UNKNOWN.test(output)) return { status: "unknown" };
|
|
5437
|
-
const held = result.success === true ||
|
|
5615
|
+
const held = result.success === true || text2(result.reservation_id) !== void 0;
|
|
5438
5616
|
return held ? { status: "made" } : { status: "not_made", reason };
|
|
5439
5617
|
}
|
|
5440
5618
|
if (result.error_code === CANCEL_OUTCOME_UNKNOWN) return { status: "unknown", reason };
|
|
@@ -5449,7 +5627,7 @@ function parseObject(json5) {
|
|
|
5449
5627
|
return {};
|
|
5450
5628
|
}
|
|
5451
5629
|
}
|
|
5452
|
-
function
|
|
5630
|
+
function text2(value) {
|
|
5453
5631
|
if (typeof value === "number") return String(value);
|
|
5454
5632
|
return typeof value === "string" && value ? value : void 0;
|
|
5455
5633
|
}
|
|
@@ -10899,7 +11077,7 @@ function hasControl(value) {
|
|
|
10899
11077
|
function integer(value, minimum = 0) {
|
|
10900
11078
|
return Number.isSafeInteger(value) && value >= minimum;
|
|
10901
11079
|
}
|
|
10902
|
-
function
|
|
11080
|
+
function json2(value, ancestors = /* @__PURE__ */ new Set()) {
|
|
10903
11081
|
if (value === null || typeof value === "string" || typeof value === "boolean") return true;
|
|
10904
11082
|
if (typeof value === "number") return Number.isFinite(value);
|
|
10905
11083
|
if (typeof value !== "object" || ancestors.has(value)) return false;
|
|
@@ -10907,12 +11085,12 @@ function json(value, ancestors = /* @__PURE__ */ new Set()) {
|
|
|
10907
11085
|
if (!Array.isArray(value) && Object.getPrototypeOf(value) !== Object.prototype && Object.getPrototypeOf(value) !== null)
|
|
10908
11086
|
return false;
|
|
10909
11087
|
ancestors.add(value);
|
|
10910
|
-
const valid = Object.values(value).every((v) =>
|
|
11088
|
+
const valid = Object.values(value).every((v) => json2(v, ancestors));
|
|
10911
11089
|
ancestors.delete(value);
|
|
10912
11090
|
return valid;
|
|
10913
11091
|
}
|
|
10914
11092
|
function validRecord(value) {
|
|
10915
|
-
if (!object(value) || typeof value.kind !== "string" || !kinds.has(value.kind) || !id(value.id) || !integer(value.sortKey) || !integer(value.createdAt, 1) || !integer(value.updatedAt, 1) || typeof value.isDeleted !== "boolean" || !object(value.data) || !
|
|
11093
|
+
if (!object(value) || typeof value.kind !== "string" || !kinds.has(value.kind) || !id(value.id) || !integer(value.sortKey) || !integer(value.createdAt, 1) || !integer(value.updatedAt, 1) || typeof value.isDeleted !== "boolean" || !object(value.data) || !json2(value.data) || Object.keys(value).some(
|
|
10916
11094
|
(key) => ![...metadata, "data"].includes(key)
|
|
10917
11095
|
))
|
|
10918
11096
|
return false;
|
|
@@ -10941,14 +11119,14 @@ function vectorFields(write) {
|
|
|
10941
11119
|
...write.embeddingModel !== void 0 ? { embedding_model: write.embeddingModel } : {}
|
|
10942
11120
|
};
|
|
10943
11121
|
}
|
|
10944
|
-
function
|
|
11122
|
+
function text3(value) {
|
|
10945
11123
|
return typeof value === "string";
|
|
10946
11124
|
}
|
|
10947
11125
|
function timestamp(value) {
|
|
10948
11126
|
return typeof value === "string" && Number.isFinite(Date.parse(value));
|
|
10949
11127
|
}
|
|
10950
11128
|
function presigned(value) {
|
|
10951
|
-
if (!object(value) || !
|
|
11129
|
+
if (!object(value) || !text3(value.url) || !/^https:\/\//.test(value.url) || !text3(value.method) || !object(value.headers) || !Object.values(value.headers).every(text3) || !timestamp(value.expires_at))
|
|
10952
11130
|
invalid();
|
|
10953
11131
|
return {
|
|
10954
11132
|
url: value.url,
|
|
@@ -10958,7 +11136,7 @@ function presigned(value) {
|
|
|
10958
11136
|
};
|
|
10959
11137
|
}
|
|
10960
11138
|
function attachment(value) {
|
|
10961
|
-
if (!object(value) || !
|
|
11139
|
+
if (!object(value) || !text3(value.attachment_id) || !attachmentIdPattern.test(value.attachment_id) || !integer(value.size_bytes, 1) || value.state !== "pending" && value.state !== "committed" || value.owner_kind !== void 0 && value.owner_kind !== "message" && value.owner_kind !== "summary" || value.owner_id !== void 0 && !id(value.owner_id) || !timestamp(value.created_at) || value.committed_at !== void 0 && !timestamp(value.committed_at))
|
|
10962
11140
|
invalid();
|
|
10963
11141
|
return {
|
|
10964
11142
|
id: value.attachment_id,
|
|
@@ -10971,7 +11149,7 @@ function attachment(value) {
|
|
|
10971
11149
|
};
|
|
10972
11150
|
}
|
|
10973
11151
|
function ref(value) {
|
|
10974
|
-
if (!object(value) || !
|
|
11152
|
+
if (!object(value) || !text3(value.kind) || !kinds.has(value.kind) || !id(value.id)) invalid();
|
|
10975
11153
|
return { kind: value.kind, id: value.id };
|
|
10976
11154
|
}
|
|
10977
11155
|
function sameMetadata(a, b) {
|
|
@@ -11194,7 +11372,7 @@ async function createRemoteChatStore(options) {
|
|
|
11194
11372
|
},
|
|
11195
11373
|
async account(signal) {
|
|
11196
11374
|
const value = await request("/account", {}, signal);
|
|
11197
|
-
if (!object(value) || value.account_id !== accountId || !
|
|
11375
|
+
if (!object(value) || value.account_id !== accountId || !text3(value.key_id) || value.state !== "none" && value.state !== "migrating" && value.state !== "active" || !integer(value.record_count) || !integer(value.storage_bytes) || !integer(value.vector_count))
|
|
11198
11376
|
invalid();
|
|
11199
11377
|
if (value.key_id && value.key_id !== keyId)
|
|
11200
11378
|
throw new ChatStoreError("Canonical chat key does not match", 409, "key_mismatch");
|
|
@@ -11268,12 +11446,12 @@ async function createRemoteChatStore(options) {
|
|
|
11268
11446
|
},
|
|
11269
11447
|
async changes(cursor, options2) {
|
|
11270
11448
|
const limit = options2?.limit ?? 100;
|
|
11271
|
-
if (!integer(limit, 1) || limit > 200 || cursor !== void 0 && (!
|
|
11449
|
+
if (!integer(limit, 1) || limit > 200 || cursor !== void 0 && (!text3(cursor) || cursor.length > 2048))
|
|
11272
11450
|
invalid();
|
|
11273
11451
|
const params = new URLSearchParams({ account_id: String(accountId), limit: String(limit) });
|
|
11274
11452
|
if (cursor) params.set("cursor", cursor);
|
|
11275
11453
|
const value = await request(`/changes?${params}`, {}, options2?.signal);
|
|
11276
|
-
if (!object(value) || !Array.isArray(value.items) || value.items.length > limit || value.next_cursor !== void 0 && !
|
|
11454
|
+
if (!object(value) || !Array.isArray(value.items) || value.items.length > limit || value.next_cursor !== void 0 && !text3(value.next_cursor) || value.changes_cursor !== void 0 && !text3(value.changes_cursor))
|
|
11277
11455
|
invalid();
|
|
11278
11456
|
const items = [];
|
|
11279
11457
|
for (const item of value.items) items.push(await decode(item));
|
|
@@ -11401,27 +11579,27 @@ var emptyMessage = {
|
|
|
11401
11579
|
};
|
|
11402
11580
|
|
|
11403
11581
|
// src/lib/db/appFiles/models.ts
|
|
11404
|
-
import { Model as
|
|
11405
|
-
import { date, readonly, text as
|
|
11406
|
-
var AppFile = class extends
|
|
11582
|
+
import { Model as Model3 } from "@nozbe/watermelondb";
|
|
11583
|
+
import { date as date2, readonly, text as text4 } from "@nozbe/watermelondb/decorators";
|
|
11584
|
+
var AppFile = class extends Model3 {
|
|
11407
11585
|
};
|
|
11408
11586
|
AppFile.table = "app_files";
|
|
11409
11587
|
AppFile.associations = {};
|
|
11410
11588
|
__decorateClass([
|
|
11411
|
-
|
|
11589
|
+
text4("conversation_id")
|
|
11412
11590
|
], AppFile.prototype, "conversationId", 2);
|
|
11413
11591
|
__decorateClass([
|
|
11414
|
-
|
|
11592
|
+
text4("path")
|
|
11415
11593
|
], AppFile.prototype, "path", 2);
|
|
11416
11594
|
__decorateClass([
|
|
11417
|
-
|
|
11595
|
+
text4("content")
|
|
11418
11596
|
], AppFile.prototype, "content", 2);
|
|
11419
11597
|
__decorateClass([
|
|
11420
11598
|
readonly,
|
|
11421
|
-
|
|
11599
|
+
date2("created_at")
|
|
11422
11600
|
], AppFile.prototype, "createdAt", 2);
|
|
11423
11601
|
__decorateClass([
|
|
11424
|
-
|
|
11602
|
+
date2("updated_at")
|
|
11425
11603
|
], AppFile.prototype, "updatedAt", 2);
|
|
11426
11604
|
|
|
11427
11605
|
// src/lib/db/appFiles/operations.ts
|
|
@@ -11566,141 +11744,6 @@ async function decryptConversationTitle(encryptedTitle, address) {
|
|
|
11566
11744
|
}
|
|
11567
11745
|
}
|
|
11568
11746
|
|
|
11569
|
-
// src/lib/db/chat/models.ts
|
|
11570
|
-
import { Model as Model3 } from "@nozbe/watermelondb";
|
|
11571
|
-
import { date as date2, field, json as json2, text as text4 } from "@nozbe/watermelondb/decorators";
|
|
11572
|
-
var Message = class extends Model3 {
|
|
11573
|
-
};
|
|
11574
|
-
Message.table = "history";
|
|
11575
|
-
Message.associations = {
|
|
11576
|
-
conversations: { type: "belongs_to", key: "conversation_id" },
|
|
11577
|
-
media: { type: "has_many", foreignKey: "message_id" }
|
|
11578
|
-
};
|
|
11579
|
-
__decorateClass([
|
|
11580
|
-
field("message_id")
|
|
11581
|
-
], Message.prototype, "messageId", 2);
|
|
11582
|
-
__decorateClass([
|
|
11583
|
-
text4("conversation_id")
|
|
11584
|
-
], Message.prototype, "conversationId", 2);
|
|
11585
|
-
__decorateClass([
|
|
11586
|
-
text4("role")
|
|
11587
|
-
], Message.prototype, "role", 2);
|
|
11588
|
-
__decorateClass([
|
|
11589
|
-
text4("content")
|
|
11590
|
-
], Message.prototype, "content", 2);
|
|
11591
|
-
__decorateClass([
|
|
11592
|
-
text4("model")
|
|
11593
|
-
], Message.prototype, "model", 2);
|
|
11594
|
-
__decorateClass([
|
|
11595
|
-
text4("image_model")
|
|
11596
|
-
], Message.prototype, "imageModel", 2);
|
|
11597
|
-
__decorateClass([
|
|
11598
|
-
json2("files", (raw) => raw)
|
|
11599
|
-
], Message.prototype, "files", 2);
|
|
11600
|
-
__decorateClass([
|
|
11601
|
-
json2("file_ids", (raw) => raw)
|
|
11602
|
-
], Message.prototype, "fileIds", 2);
|
|
11603
|
-
__decorateClass([
|
|
11604
|
-
date2("created_at")
|
|
11605
|
-
], Message.prototype, "createdAt", 2);
|
|
11606
|
-
__decorateClass([
|
|
11607
|
-
date2("updated_at")
|
|
11608
|
-
], Message.prototype, "updatedAt", 2);
|
|
11609
|
-
__decorateClass([
|
|
11610
|
-
json2("vector", (raw) => raw)
|
|
11611
|
-
], Message.prototype, "vector", 2);
|
|
11612
|
-
__decorateClass([
|
|
11613
|
-
text4("embedding_model")
|
|
11614
|
-
], Message.prototype, "embeddingModel", 2);
|
|
11615
|
-
__decorateClass([
|
|
11616
|
-
json2("chunks", (raw) => raw)
|
|
11617
|
-
], Message.prototype, "chunks", 2);
|
|
11618
|
-
__decorateClass([
|
|
11619
|
-
json2("usage", (raw) => raw)
|
|
11620
|
-
], Message.prototype, "usage", 2);
|
|
11621
|
-
__decorateClass([
|
|
11622
|
-
json2("sources", (raw) => raw)
|
|
11623
|
-
], Message.prototype, "sources", 2);
|
|
11624
|
-
__decorateClass([
|
|
11625
|
-
field("response_duration")
|
|
11626
|
-
], Message.prototype, "responseDuration", 2);
|
|
11627
|
-
__decorateClass([
|
|
11628
|
-
field("was_stopped")
|
|
11629
|
-
], Message.prototype, "wasStopped", 2);
|
|
11630
|
-
__decorateClass([
|
|
11631
|
-
text4("error")
|
|
11632
|
-
], Message.prototype, "error", 2);
|
|
11633
|
-
__decorateClass([
|
|
11634
|
-
json2("thought_process", (raw) => raw)
|
|
11635
|
-
], Message.prototype, "thoughtProcess", 2);
|
|
11636
|
-
__decorateClass([
|
|
11637
|
-
text4("thinking")
|
|
11638
|
-
], Message.prototype, "thinking", 2);
|
|
11639
|
-
__decorateClass([
|
|
11640
|
-
text4("parent_message_id")
|
|
11641
|
-
], Message.prototype, "parentMessageId", 2);
|
|
11642
|
-
__decorateClass([
|
|
11643
|
-
text4("feedback")
|
|
11644
|
-
], Message.prototype, "feedback", 2);
|
|
11645
|
-
__decorateClass([
|
|
11646
|
-
json2("tool_call_events", (raw) => raw)
|
|
11647
|
-
], Message.prototype, "toolCallEvents", 2);
|
|
11648
|
-
__decorateClass([
|
|
11649
|
-
text4("origin")
|
|
11650
|
-
], Message.prototype, "origin", 2);
|
|
11651
|
-
var Conversation = class extends Model3 {
|
|
11652
|
-
};
|
|
11653
|
-
Conversation.table = "conversations";
|
|
11654
|
-
Conversation.associations = {
|
|
11655
|
-
history: { type: "has_many", foreignKey: "conversation_id" },
|
|
11656
|
-
projects: { type: "belongs_to", key: "project_id" }
|
|
11657
|
-
};
|
|
11658
|
-
__decorateClass([
|
|
11659
|
-
text4("conversation_id")
|
|
11660
|
-
], Conversation.prototype, "conversationId", 2);
|
|
11661
|
-
__decorateClass([
|
|
11662
|
-
text4("title")
|
|
11663
|
-
], Conversation.prototype, "title", 2);
|
|
11664
|
-
__decorateClass([
|
|
11665
|
-
text4("project_id")
|
|
11666
|
-
], Conversation.prototype, "projectId", 2);
|
|
11667
|
-
__decorateClass([
|
|
11668
|
-
date2("created_at")
|
|
11669
|
-
], Conversation.prototype, "createdAt", 2);
|
|
11670
|
-
__decorateClass([
|
|
11671
|
-
date2("updated_at")
|
|
11672
|
-
], Conversation.prototype, "updatedAt", 2);
|
|
11673
|
-
__decorateClass([
|
|
11674
|
-
field("is_deleted")
|
|
11675
|
-
], Conversation.prototype, "isDeleted", 2);
|
|
11676
|
-
__decorateClass([
|
|
11677
|
-
date2("pinned_at")
|
|
11678
|
-
], Conversation.prototype, "pinnedAt", 2);
|
|
11679
|
-
var ConversationSummary = class extends Model3 {
|
|
11680
|
-
};
|
|
11681
|
-
ConversationSummary.table = "conversation_summaries";
|
|
11682
|
-
ConversationSummary.associations = {
|
|
11683
|
-
conversations: { type: "belongs_to", key: "conversation_id" }
|
|
11684
|
-
};
|
|
11685
|
-
__decorateClass([
|
|
11686
|
-
text4("conversation_id")
|
|
11687
|
-
], ConversationSummary.prototype, "conversationId", 2);
|
|
11688
|
-
__decorateClass([
|
|
11689
|
-
text4("summary")
|
|
11690
|
-
], ConversationSummary.prototype, "summary", 2);
|
|
11691
|
-
__decorateClass([
|
|
11692
|
-
text4("summarized_up_to")
|
|
11693
|
-
], ConversationSummary.prototype, "summarizedUpTo", 2);
|
|
11694
|
-
__decorateClass([
|
|
11695
|
-
field("token_count")
|
|
11696
|
-
], ConversationSummary.prototype, "tokenCount", 2);
|
|
11697
|
-
__decorateClass([
|
|
11698
|
-
date2("created_at")
|
|
11699
|
-
], ConversationSummary.prototype, "createdAt", 2);
|
|
11700
|
-
__decorateClass([
|
|
11701
|
-
date2("updated_at")
|
|
11702
|
-
], ConversationSummary.prototype, "updatedAt", 2);
|
|
11703
|
-
|
|
11704
11747
|
// src/lib/db/chat/schema.ts
|
|
11705
11748
|
import { appSchema, tableSchema } from "@nozbe/watermelondb";
|
|
11706
11749
|
import { addColumns, schemaMigrations } from "@nozbe/watermelondb/Schema/migrations";
|
|
@@ -25532,10 +25575,7 @@ async function computeStaleFacetKeys(ctx, memories, facets, previous, watermark,
|
|
|
25532
25575
|
for (const facet of facets) {
|
|
25533
25576
|
if (!previous.sections.some((s) => s.key === facet.key)) stale.add(facet.key);
|
|
25534
25577
|
}
|
|
25535
|
-
|
|
25536
|
-
let toAttribute = changed.filter(
|
|
25537
|
-
(m) => !m.isDeleted && !m.supersededBy && !citedIds.has(m.uniqueId)
|
|
25538
|
-
);
|
|
25578
|
+
let toAttribute = changed.filter((m) => !m.isDeleted && !m.supersededBy);
|
|
25539
25579
|
if (reviewedMemoryIds !== void 0) {
|
|
25540
25580
|
const allowed = new Set(reviewedMemoryIds);
|
|
25541
25581
|
toAttribute = toAttribute.filter((m) => allowed.has(m.uniqueId));
|
|
@@ -32347,6 +32387,13 @@ var lastCompactionTime = /* @__PURE__ */ new Map();
|
|
|
32347
32387
|
var COMPACTION_COOLDOWN_MS = 6e4;
|
|
32348
32388
|
var MAX_SUMMARY_TOKEN_RATIO = 0.8;
|
|
32349
32389
|
async function maybeSummarizeHistory(options) {
|
|
32390
|
+
const { database, conversationId } = options;
|
|
32391
|
+
const revision2 = getConversationRevision(database, conversationId);
|
|
32392
|
+
const result = await summarizeHistoryAtRevision(options, revision2);
|
|
32393
|
+
assertConversationRevision(database, conversationId, revision2);
|
|
32394
|
+
return result;
|
|
32395
|
+
}
|
|
32396
|
+
async function summarizeHistoryAtRevision(options, revision2) {
|
|
32350
32397
|
const { database, conversationId, messages, summarizeHistory, summaryMinWindowMessages, token } = options;
|
|
32351
32398
|
if (!summarizeHistory) {
|
|
32352
32399
|
return { messagesToConvert: messages, summarySystemMessage: null };
|
|
@@ -32387,7 +32434,7 @@ async function maybeSummarizeHistory(options) {
|
|
|
32387
32434
|
clearTimeout(staleGuardTimerId);
|
|
32388
32435
|
}
|
|
32389
32436
|
}
|
|
32390
|
-
const promise = doSummarizeHistory(options);
|
|
32437
|
+
const promise = doSummarizeHistory(options, revision2);
|
|
32391
32438
|
summarizationLocks.set(conversationId, promise);
|
|
32392
32439
|
try {
|
|
32393
32440
|
return await promise;
|
|
@@ -32401,7 +32448,7 @@ Summary to condense:
|
|
|
32401
32448
|
{summary}
|
|
32402
32449
|
|
|
32403
32450
|
Condensed summary:`;
|
|
32404
|
-
async function doSummarizeHistory(options) {
|
|
32451
|
+
async function doSummarizeHistory(options, revision2) {
|
|
32405
32452
|
const {
|
|
32406
32453
|
database,
|
|
32407
32454
|
conversationId,
|
|
@@ -32416,7 +32463,20 @@ async function doSummarizeHistory(options) {
|
|
|
32416
32463
|
} = options;
|
|
32417
32464
|
try {
|
|
32418
32465
|
const summaryCtx = createSummaryContext(database);
|
|
32466
|
+
const persistSummary = (summary, summarizedUpTo, tokenCount) => database.write(async (writer) => {
|
|
32467
|
+
assertConversationRevision(database, conversationId, revision2);
|
|
32468
|
+
await writer.callWriter(
|
|
32469
|
+
() => upsertConversationSummaryOp(
|
|
32470
|
+
summaryCtx,
|
|
32471
|
+
conversationId,
|
|
32472
|
+
summary,
|
|
32473
|
+
summarizedUpTo,
|
|
32474
|
+
tokenCount
|
|
32475
|
+
)
|
|
32476
|
+
);
|
|
32477
|
+
});
|
|
32419
32478
|
let cachedSummary = await getConversationSummaryOp(summaryCtx, conversationId);
|
|
32479
|
+
assertConversationRevision(database, conversationId, revision2);
|
|
32420
32480
|
const lastCompacted = lastCompactionTime.get(conversationId) ?? 0;
|
|
32421
32481
|
const compactionCooledDown = Date.now() - lastCompacted > COMPACTION_COOLDOWN_MS;
|
|
32422
32482
|
if (cachedSummary && cachedSummary.tokenCount > summaryTokenThreshold * MAX_SUMMARY_TOKEN_RATIO && compactionCooledDown) {
|
|
@@ -32432,13 +32492,7 @@ async function doSummarizeHistory(options) {
|
|
|
32432
32492
|
);
|
|
32433
32493
|
const compactedSummary = redactor ? redactor.deAnonymize(rawCompacted) : rawCompacted;
|
|
32434
32494
|
const compactedTokens = estimateTokens(compactedSummary);
|
|
32435
|
-
await
|
|
32436
|
-
summaryCtx,
|
|
32437
|
-
conversationId,
|
|
32438
|
-
compactedSummary,
|
|
32439
|
-
cachedSummary.summarizedUpTo,
|
|
32440
|
-
compactedTokens
|
|
32441
|
-
);
|
|
32495
|
+
await persistSummary(compactedSummary, cachedSummary.summarizedUpTo, compactedTokens);
|
|
32442
32496
|
cachedSummary = {
|
|
32443
32497
|
...cachedSummary,
|
|
32444
32498
|
summary: compactedSummary,
|
|
@@ -32446,6 +32500,7 @@ async function doSummarizeHistory(options) {
|
|
|
32446
32500
|
};
|
|
32447
32501
|
lastCompactionTime.set(conversationId, Date.now());
|
|
32448
32502
|
} catch {
|
|
32503
|
+
assertConversationRevision(database, conversationId, revision2);
|
|
32449
32504
|
lastCompactionTime.set(conversationId, Date.now());
|
|
32450
32505
|
getLogger().warn(
|
|
32451
32506
|
"[summarize] Summary compaction failed, proceeding with oversized summary"
|
|
@@ -32477,10 +32532,9 @@ async function doSummarizeHistory(options) {
|
|
|
32477
32532
|
redactor,
|
|
32478
32533
|
onPiiRedacted
|
|
32479
32534
|
});
|
|
32535
|
+
assertConversationRevision(database, conversationId, revision2);
|
|
32480
32536
|
if (summarizeResult.didSummarize && summarizeResult.summary && summarizeResult.summarizedUpTo) {
|
|
32481
|
-
await
|
|
32482
|
-
summaryCtx,
|
|
32483
|
-
conversationId,
|
|
32537
|
+
await persistSummary(
|
|
32484
32538
|
summarizeResult.summary,
|
|
32485
32539
|
summarizeResult.summarizedUpTo,
|
|
32486
32540
|
summarizeResult.summaryTokenCount
|
|
@@ -32499,6 +32553,7 @@ async function doSummarizeHistory(options) {
|
|
|
32499
32553
|
summarySystemMessage: summarizeResult.summary ? summaryToSystemMessage(summarizeResult.summary) : null
|
|
32500
32554
|
};
|
|
32501
32555
|
} catch (err) {
|
|
32556
|
+
assertConversationRevision(database, conversationId, revision2);
|
|
32502
32557
|
getLogger().warn("[summarize] Summarization failed, falling back to verbatim:", err);
|
|
32503
32558
|
return { messagesToConvert: messages, summarySystemMessage: null };
|
|
32504
32559
|
}
|