@wirecat/cli-core 0.431.0 → 0.433.0
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/CHANGELOG.md +22 -0
- package/dist/cli/messenger/conversation-answers.d.ts +1 -0
- package/dist/cli/messenger/conversations-command.js +11 -3
- package/dist/cli/messenger/message-answers.d.ts +1 -0
- package/dist/cli/messenger/message-writes.d.ts +2 -0
- package/dist/cli/messenger/messages-search-command.js +11 -1
- package/dist/cli/messenger/search-answers.js +13 -0
- package/dist/cli/steps.js +6 -0
- package/dist/cli/upgrade-command.js +1 -1
- package/dist/entities/conversation-preparation.d.ts +10 -0
- package/dist/entities/conversation-preparation.js +2 -0
- package/dist/entities/conversation-results.d.ts +10 -0
- package/dist/entities/evidence.d.ts +8 -0
- package/dist/entities/index.d.ts +45 -0
- package/dist/entities/listener.d.ts +4 -0
- package/dist/entities/message-context.d.ts +3 -0
- package/dist/entities/message-transfer.d.ts +8 -0
- package/dist/entities/message-write.d.ts +4 -0
- package/dist/entities/message.d.ts +2 -0
- package/dist/entities/message.js +2 -0
- package/dist/entities/store-records.d.ts +5 -0
- package/dist/models/anthropic.js +2 -4
- package/dist/services/embeddings-maintenance.js +71 -2
- package/dist/services/embeddings-search.js +3 -1
- package/dist/services/embeddings.d.ts +7 -0
- package/dist/services/messages-archive-search.d.ts +2 -1
- package/dist/services/messages-archive-search.js +4 -4
- package/dist/services/messages-discovery.d.ts +24 -1
- package/dist/services/messages-discovery.js +61 -4
- package/dist/services/messages-meaning.d.ts +7 -0
- package/dist/services/messages-meaning.js +53 -0
- package/dist/services/messages-search.d.ts +5 -0
- package/dist/services/messages.d.ts +5 -0
- package/dist/services/messages.js +2 -1
- package/dist/services/search-catchup.js +1 -0
- package/dist/store/drivers/node-sqlite.js +1 -0
- package/dist/store/sqlite/drizzle/bun.js +58 -14
- package/dist/store/sqlite/drizzle/bun.js.map +3 -3
- package/dist/store/sqlite/drizzle/core.js +173 -7
- package/dist/store/sqlite/drizzle/core.js.map +4 -4
- package/dist/store/sqlite/drizzle/node.js +57 -13
- package/dist/store/sqlite/drizzle/node.js.map +3 -3
- package/dist/store/sqlite/drizzle/shared-55XJMTPA.js +6514 -0
- package/dist/store/sqlite/drizzle/shared-55XJMTPA.js.map +7 -0
- package/dist/store/sqlite/message-chunks.d.ts +44 -0
- package/dist/store/sqlite/message-chunks.js +76 -0
- package/dist/store/sqlite/open.js +1 -0
- package/dist/store/sqlite/schema/canonical-tags.d.ts +1 -0
- package/dist/store/sqlite/schema/document-index-pending.d.ts +1 -0
- package/dist/store/sqlite/schema/document-transfers.d.ts +1 -0
- package/dist/store/sqlite/schema/tag-consolidations.d.ts +2 -0
- package/dist/store/sqlite/schema.d.ts +97 -0
- package/dist/store/sqlite/vectors.js +4 -1
- package/dist/store/vectors.d.ts +36 -0
- package/dist/store/vectors.js +54 -0
- package/package.json +23 -24
- package/dist/store/sqlite/drizzle/shared-HKXF6HKX.js +0 -4846
- package/dist/store/sqlite/drizzle/shared-HKXF6HKX.js.map +0 -7
|
@@ -144,7 +144,10 @@ export const clearVectors = ({ orm }, chatKey, model) => orm.all(sql `DELETE FRO
|
|
|
144
144
|
/** Rows read per step of a search, so a chat of any size is scanned in bounded memory. */
|
|
145
145
|
const SCAN_PAGE = 5_000;
|
|
146
146
|
export const dot = (query, blob) => {
|
|
147
|
-
|
|
147
|
+
// A view, not a copy: copying every blob cost more than the scoring itself (cli-testing vector-index).
|
|
148
|
+
const vector = blob.byteOffset % 4 === 0
|
|
149
|
+
? new Float32Array(blob.buffer, blob.byteOffset, blob.byteLength / 4)
|
|
150
|
+
: new Float32Array(blob.buffer.slice(blob.byteOffset, blob.byteOffset + blob.byteLength));
|
|
148
151
|
let sum = 0;
|
|
149
152
|
for (let index = 0; index < query.length; index++)
|
|
150
153
|
sum += query[index] * vector[index];
|
package/dist/store/vectors.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { Id } from "../domain/models.js";
|
|
2
2
|
import { type MailStore } from "./sqlite/emails.js";
|
|
3
3
|
import * as imageChunks from "./sqlite/image-chunks.js";
|
|
4
|
+
import * as messageChunks from "./sqlite/message-chunks.js";
|
|
4
5
|
import type { StoreContext } from "./sqlite/open.js";
|
|
5
6
|
import type { ChunkToEmbed } from "./sqlite/vectors.js";
|
|
6
7
|
import type { AccountKey, ConversationHit, PictureInput, StoredReadiness } from "./types.js";
|
|
@@ -51,6 +52,41 @@ export interface AccountVectors {
|
|
|
51
52
|
messageId: Id;
|
|
52
53
|
score: number;
|
|
53
54
|
}[]>;
|
|
55
|
+
/** Live messages with text after pk `after`, with the chunk and vector each has; `chatId` narrows it. */
|
|
56
|
+
messagesToEmbed(key: AccountKey, options: {
|
|
57
|
+
chatId?: Id;
|
|
58
|
+
model: string;
|
|
59
|
+
after: number;
|
|
60
|
+
limit: number;
|
|
61
|
+
}): Promise<messageChunks.MessageToEmbed[]>;
|
|
62
|
+
/** Keeps each message's vector of `model` and makes its hash the message's chunk. */
|
|
63
|
+
saveMessageVectors(key: AccountKey, model: string, dims: number, messages: {
|
|
64
|
+
messagePk: number;
|
|
65
|
+
hash: string;
|
|
66
|
+
length: number;
|
|
67
|
+
occurredAt: number;
|
|
68
|
+
vector: Float32Array;
|
|
69
|
+
}[]): Promise<void>;
|
|
70
|
+
/** Drops the chunks of messages gone, deleted or emptied, and the vectors only they used; how many. */
|
|
71
|
+
dropGoneMessages(key: AccountKey): Promise<number>;
|
|
72
|
+
/** Whether any message of the account has a vector of `model`. */
|
|
73
|
+
hasMessageVectors(key: AccountKey, model: string): Promise<boolean>;
|
|
74
|
+
/**
|
|
75
|
+
* The messages nearest in meaning to `query` by their own vector of `model`, best first. The one place
|
|
76
|
+
* message vectors are read, so their storage can change behind it.
|
|
77
|
+
*/
|
|
78
|
+
nearestMessages(key: AccountKey, options: {
|
|
79
|
+
chatId?: Id;
|
|
80
|
+
model: string;
|
|
81
|
+
since?: string;
|
|
82
|
+
before?: string;
|
|
83
|
+
limit: number;
|
|
84
|
+
query: Float32Array;
|
|
85
|
+
}): Promise<{
|
|
86
|
+
chatId: Id;
|
|
87
|
+
messageId: Id;
|
|
88
|
+
score: number;
|
|
89
|
+
}[]>;
|
|
54
90
|
/** The current build's distinct chunks, and how many have a vector of `model`. */
|
|
55
91
|
vectorStatus(key: AccountKey, chatId: Id, model: string): Promise<{
|
|
56
92
|
chunks: number;
|
package/dist/store/vectors.js
CHANGED
|
@@ -2,6 +2,7 @@ import { keysOver } from "./keys.js";
|
|
|
2
2
|
import * as conversationQueries from "./sqlite/conversations.js";
|
|
3
3
|
import { threadConversation } from "./sqlite/emails.js";
|
|
4
4
|
import * as imageChunks from "./sqlite/image-chunks.js";
|
|
5
|
+
import * as messageChunks from "./sqlite/message-chunks.js";
|
|
5
6
|
import { write } from "./sqlite/transaction.js";
|
|
6
7
|
import * as vectors from "./sqlite/vectors.js";
|
|
7
8
|
export const accountVectorsOver = (context, mail) => {
|
|
@@ -93,6 +94,59 @@ export const accountVectorsOver = (context, mail) => {
|
|
|
93
94
|
position: imageChunks.PICTURE_POSITION,
|
|
94
95
|
});
|
|
95
96
|
},
|
|
97
|
+
messagesToEmbed: async (key, { chatId, model, after, limit }) => {
|
|
98
|
+
const accountPk = findAccountPk(key);
|
|
99
|
+
if (accountPk === undefined)
|
|
100
|
+
return [];
|
|
101
|
+
const chatKey = chatId === undefined ? undefined : chatKeyOf(key, chatId);
|
|
102
|
+
if (chatId !== undefined && chatKey === undefined)
|
|
103
|
+
return [];
|
|
104
|
+
return messageChunks.messagesToEmbed(context, accountPk, {
|
|
105
|
+
...(chatKey === undefined ? {} : { chatKey }),
|
|
106
|
+
model,
|
|
107
|
+
after,
|
|
108
|
+
limit,
|
|
109
|
+
});
|
|
110
|
+
},
|
|
111
|
+
saveMessageVectors: async (key, model, dims, messages) => {
|
|
112
|
+
const accountPk = findAccountPk(key);
|
|
113
|
+
if (accountPk === undefined)
|
|
114
|
+
return;
|
|
115
|
+
write(database, () => {
|
|
116
|
+
vectors.saveVectors(context, model, dims, messages.map(({ hash, vector }) => ({ hash, vector })));
|
|
117
|
+
messageChunks.saveMessageChunks(context, accountPk, messages);
|
|
118
|
+
});
|
|
119
|
+
},
|
|
120
|
+
dropGoneMessages: async (key) => {
|
|
121
|
+
const accountPk = findAccountPk(key);
|
|
122
|
+
if (accountPk === undefined)
|
|
123
|
+
return 0;
|
|
124
|
+
let dropped = 0;
|
|
125
|
+
write(database, () => {
|
|
126
|
+
dropped = messageChunks.dropGoneMessageChunks(context, accountPk);
|
|
127
|
+
});
|
|
128
|
+
return dropped;
|
|
129
|
+
},
|
|
130
|
+
hasMessageVectors: async (key, model) => {
|
|
131
|
+
const accountPk = findAccountPk(key);
|
|
132
|
+
return accountPk !== undefined && messageChunks.hasMessageVectors(context, accountPk, model);
|
|
133
|
+
},
|
|
134
|
+
nearestMessages: async (key, { chatId, model, since, before, limit, query }) => {
|
|
135
|
+
const accountPk = findAccountPk(key);
|
|
136
|
+
if (accountPk === undefined)
|
|
137
|
+
return [];
|
|
138
|
+
const chatKey = chatId === undefined ? undefined : chatKeyOf(key, chatId);
|
|
139
|
+
if (chatId !== undefined && chatKey === undefined)
|
|
140
|
+
return [];
|
|
141
|
+
return messageChunks.nearestMessages(context, accountPk, {
|
|
142
|
+
...(chatKey === undefined ? {} : { chatKey }),
|
|
143
|
+
...(since === undefined ? {} : { since: Date.parse(since) }),
|
|
144
|
+
...(before === undefined ? {} : { before: Date.parse(before) }),
|
|
145
|
+
model,
|
|
146
|
+
limit,
|
|
147
|
+
query,
|
|
148
|
+
});
|
|
149
|
+
},
|
|
96
150
|
vectorStatus: async (key, chatId, model) => {
|
|
97
151
|
const chatKey = chatKeyOf(key, chatId);
|
|
98
152
|
return chatKey === undefined ? { chunks: 0, embedded: 0 } : vectors.vectorStatus(context, chatKey, model);
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@wirecat/cli-core",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.433.0",
|
|
4
4
|
"description": "The messenger-neutral half of a messaging CLI: domain model, message locators, rendering, name resolution, the SQLite seam, the command skeleton and shared read commands, the send guard, run records and the message store",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"author": "Viacheslav Ptsarev",
|
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
"engines": {
|
|
17
17
|
"node": "^22.16.0 || >=24"
|
|
18
18
|
},
|
|
19
|
-
"packageManager": "pnpm@11.
|
|
19
|
+
"packageManager": "pnpm@11.28.8",
|
|
20
20
|
"files": [
|
|
21
21
|
"dist",
|
|
22
22
|
"parity.json",
|
|
@@ -170,17 +170,17 @@
|
|
|
170
170
|
"help:examples": "HELP_EXAMPLES_REPORT=1 vitest run scripts/help-examples.test.ts --silent=false"
|
|
171
171
|
},
|
|
172
172
|
"dependencies": {
|
|
173
|
-
"@anthropic-ai/sdk": "
|
|
173
|
+
"@anthropic-ai/sdk": "1.3.0",
|
|
174
174
|
"@bomb.sh/tab": "0.0.22",
|
|
175
175
|
"@huggingface/tokenizers": "0.2.0",
|
|
176
|
-
"@modelcontextprotocol/server": "2.
|
|
176
|
+
"@modelcontextprotocol/server": "^2.4.0",
|
|
177
177
|
"@resvg/resvg-js": "2.6.2",
|
|
178
178
|
"@valibot/to-json-schema": "1.8.0",
|
|
179
179
|
"@wirecat/cli-core-onnx": "1.0.1",
|
|
180
180
|
"@wirecat/cli-core-sqlite": "1.0.1",
|
|
181
181
|
"@xmldom/xmldom": "0.9.12",
|
|
182
182
|
"chardet": "2.2.0",
|
|
183
|
-
"defuddle": "0.19.
|
|
183
|
+
"defuddle": "0.19.6",
|
|
184
184
|
"dictionary-en": "4.0.0",
|
|
185
185
|
"dictionary-es": "4.0.0",
|
|
186
186
|
"dictionary-ru": "3.0.0",
|
|
@@ -188,9 +188,9 @@
|
|
|
188
188
|
"fflate": "0.8.3",
|
|
189
189
|
"iconv-lite": "0.7.3",
|
|
190
190
|
"image-size": "2.0.4",
|
|
191
|
-
"linkedom": "0.18.
|
|
191
|
+
"linkedom": "0.18.14",
|
|
192
192
|
"liquidjs": "10.30.0",
|
|
193
|
-
"lossless-json": "4.3.
|
|
193
|
+
"lossless-json": "4.3.3",
|
|
194
194
|
"mammoth": "1.13.0",
|
|
195
195
|
"mdast-util-from-markdown": "2.1.0",
|
|
196
196
|
"mdast-util-gfm": "3.1.0",
|
|
@@ -198,40 +198,39 @@
|
|
|
198
198
|
"ogg-opus-decoder": "1.7.5",
|
|
199
199
|
"psl": "1.15.0",
|
|
200
200
|
"qrcode-generator": "2.0.4",
|
|
201
|
-
"sherpa-onnx": "
|
|
201
|
+
"sherpa-onnx": "2.0.0",
|
|
202
202
|
"string-width": "8.3.0",
|
|
203
|
-
"unpdf": "1.
|
|
203
|
+
"unpdf": "1.9.1",
|
|
204
204
|
"valibot": "1.5.0",
|
|
205
205
|
"word-extractor": "1.0.4",
|
|
206
206
|
"wrap-ansi": "10.0.2",
|
|
207
207
|
"yaml": "2.9.1"
|
|
208
208
|
},
|
|
209
209
|
"devDependencies": {
|
|
210
|
-
"@biomejs/biome": "2.
|
|
211
|
-
"@cspell/dict-en-gb": "5.0.
|
|
210
|
+
"@biomejs/biome": "2.6.3",
|
|
211
|
+
"@cspell/dict-en-gb": "5.0.38",
|
|
212
212
|
"@cspell/dict-es-es": "3.0.9",
|
|
213
|
-
"@cspell/dict-ru_ru": "2.3.
|
|
214
|
-
"@modelcontextprotocol/client": "2.
|
|
215
|
-
"@napi-rs/canvas": "1.0.
|
|
213
|
+
"@cspell/dict-ru_ru": "2.3.4",
|
|
214
|
+
"@modelcontextprotocol/client": "2.4.0",
|
|
215
|
+
"@napi-rs/canvas": "1.0.13",
|
|
216
216
|
"@types/mdast": "4.0.4",
|
|
217
|
-
"@types/node": "^22.20.
|
|
217
|
+
"@types/node": "^22.20.5",
|
|
218
218
|
"@types/pngjs": "6.0.5",
|
|
219
|
-
"@vitest/coverage-v8": "^5.0.
|
|
219
|
+
"@vitest/coverage-v8": "^5.0.5",
|
|
220
220
|
"@wirecat/cli-base": "0.57.0",
|
|
221
221
|
"@wirecat/cli-core-legacy-tags": "npm:@wirecat/cli-core@0.414.0",
|
|
222
222
|
"commander": "15.0.0",
|
|
223
|
-
"cspell": "10.
|
|
224
|
-
"drizzle-kit": "1.0.0-rc.
|
|
225
|
-
"drizzle-orm": "1.0.0-rc.
|
|
223
|
+
"cspell": "10.4.0",
|
|
224
|
+
"drizzle-kit": "1.0.0-rc.5",
|
|
225
|
+
"drizzle-orm": "1.0.0-rc.5",
|
|
226
226
|
"esbuild": "0.28.2",
|
|
227
|
-
"exceljs": "4.4.0",
|
|
228
227
|
"jsqr": "1.4.0",
|
|
229
|
-
"lefthook": "2.
|
|
230
|
-
"libphonenumber-js": "1.13.
|
|
231
|
-
"markdownlint-cli2": "0.
|
|
228
|
+
"lefthook": "2.2.2",
|
|
229
|
+
"libphonenumber-js": "1.13.15",
|
|
230
|
+
"markdownlint-cli2": "0.24.0",
|
|
232
231
|
"pngjs": "7.0.0",
|
|
233
232
|
"typescript": "^7.0.2",
|
|
234
|
-
"vitest": "^5.0.
|
|
233
|
+
"vitest": "^5.0.5"
|
|
235
234
|
},
|
|
236
235
|
"publishConfig": {
|
|
237
236
|
"access": "public"
|