@leemour/cli-messaging 0.98.0 → 0.100.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/README.md +6 -6
- package/dist/cli/bot/command.d.ts.map +1 -1
- package/dist/cli/bot/command.js +8 -2
- package/dist/cli/bot/command.js.map +1 -1
- package/dist/cli/bot/port.d.ts +95 -2
- package/dist/cli/bot/port.d.ts.map +1 -1
- package/dist/cli/bot/registry.d.ts +2 -0
- package/dist/cli/bot/registry.d.ts.map +1 -1
- package/dist/cli/bot/registry.js +2 -0
- package/dist/cli/bot/registry.js.map +1 -1
- package/dist/cli/bot/setup.d.ts +9 -0
- package/dist/cli/bot/setup.d.ts.map +1 -0
- package/dist/cli/bot/setup.js +155 -0
- package/dist/cli/bot/setup.js.map +1 -0
- package/dist/cli/bot/updates.d.ts +23 -0
- package/dist/cli/bot/updates.d.ts.map +1 -0
- package/dist/cli/bot/updates.js +61 -0
- package/dist/cli/bot/updates.js.map +1 -0
- package/dist/cli/bot/watch.d.ts +9 -0
- package/dist/cli/bot/watch.d.ts.map +1 -0
- package/dist/cli/bot/watch.js +197 -0
- package/dist/cli/bot/watch.js.map +1 -0
- package/dist/cli/index.d.ts +3 -2
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +1 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/messenger/conversations-command.d.ts.map +1 -1
- package/dist/cli/messenger/conversations-command.js +64 -4
- package/dist/cli/messenger/conversations-command.js.map +1 -1
- package/dist/cli/messenger/messages-command.d.ts.map +1 -1
- package/dist/cli/messenger/messages-command.js +45 -11
- package/dist/cli/messenger/messages-command.js.map +1 -1
- package/dist/cli/messenger/models-command.d.ts +1 -1
- package/dist/cli/messenger/models-command.d.ts.map +1 -1
- package/dist/cli/messenger/models-command.js +64 -3
- package/dist/cli/messenger/models-command.js.map +1 -1
- package/dist/cli/messenger/observed.d.ts.map +1 -1
- package/dist/cli/messenger/observed.js +27 -10
- package/dist/cli/messenger/observed.js.map +1 -1
- package/dist/cli/messenger/port.d.ts +15 -9
- package/dist/cli/messenger/port.d.ts.map +1 -1
- package/dist/cli/messenger/port.js.map +1 -1
- package/dist/cli/messenger/store-maintenance-command.js +20 -4
- package/dist/cli/messenger/store-maintenance-command.js.map +1 -1
- package/dist/cli/messenger/stored.d.ts.map +1 -1
- package/dist/cli/messenger/stored.js +41 -29
- package/dist/cli/messenger/stored.js.map +1 -1
- package/dist/conversations/chunks.d.ts +28 -0
- package/dist/conversations/chunks.d.ts.map +1 -0
- package/dist/conversations/chunks.js +45 -0
- package/dist/conversations/chunks.js.map +1 -0
- package/dist/conversations/link.d.ts +1 -1
- package/dist/conversations/link.d.ts.map +1 -1
- package/dist/conversations/link.js.map +1 -1
- package/dist/embeddings/embed.d.ts +22 -0
- package/dist/embeddings/embed.d.ts.map +1 -0
- package/dist/embeddings/embed.js +69 -0
- package/dist/embeddings/embed.js.map +1 -0
- package/dist/embeddings/models.d.ts +35 -0
- package/dist/embeddings/models.d.ts.map +1 -0
- package/dist/embeddings/models.js +87 -0
- package/dist/embeddings/models.js.map +1 -0
- package/dist/embeddings/pool.d.ts +15 -0
- package/dist/embeddings/pool.d.ts.map +1 -0
- package/dist/embeddings/pool.js +20 -0
- package/dist/embeddings/pool.js.map +1 -0
- package/dist/embeddings/worker.d.ts +2 -0
- package/dist/embeddings/worker.d.ts.map +1 -0
- package/dist/embeddings/worker.js +22 -0
- package/dist/embeddings/worker.js.map +1 -0
- package/dist/embeddings/workers.d.ts +8 -0
- package/dist/embeddings/workers.d.ts.map +1 -0
- package/dist/embeddings/workers.js +51 -0
- package/dist/embeddings/workers.js.map +1 -0
- package/dist/index.d.ts +0 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/kit/contract.d.ts +4 -2
- package/dist/kit/contract.d.ts.map +1 -1
- package/dist/kit/contract.js +68 -27
- package/dist/kit/contract.js.map +1 -1
- package/dist/kit/fake.d.ts +2 -2
- package/dist/kit/fake.d.ts.map +1 -1
- package/dist/kit/fake.js.map +1 -1
- package/dist/mcp/resources.d.ts.map +1 -1
- package/dist/mcp/resources.js +2 -1
- package/dist/mcp/resources.js.map +1 -1
- package/dist/mcp/tools/messages.d.ts.map +1 -1
- package/dist/mcp/tools/messages.js +14 -4
- package/dist/mcp/tools/messages.js.map +1 -1
- package/dist/search/query.d.ts +2 -0
- package/dist/search/query.d.ts.map +1 -1
- package/dist/search/query.js +10 -7
- package/dist/search/query.js.map +1 -1
- package/dist/sends/permissions.d.ts.map +1 -1
- package/dist/sends/permissions.js +3 -0
- package/dist/sends/permissions.js.map +1 -1
- package/dist/services/archive.d.ts.map +1 -1
- package/dist/services/archive.js +12 -3
- package/dist/services/archive.js.map +1 -1
- package/dist/services/chats.js +2 -2
- package/dist/services/chats.js.map +1 -1
- package/dist/services/conversations.d.ts.map +1 -1
- package/dist/services/conversations.js +7 -0
- package/dist/services/conversations.js.map +1 -1
- package/dist/services/embeddings.d.ts +39 -0
- package/dist/services/embeddings.d.ts.map +1 -0
- package/dist/services/embeddings.js +82 -0
- package/dist/services/embeddings.js.map +1 -0
- package/dist/services/inbox.d.ts +2 -2
- package/dist/services/inbox.d.ts.map +1 -1
- package/dist/services/inbox.js +12 -1
- package/dist/services/inbox.js.map +1 -1
- package/dist/services/index.d.ts +6 -2
- package/dist/services/index.d.ts.map +1 -1
- package/dist/services/index.js +4 -1
- package/dist/services/index.js.map +1 -1
- package/dist/services/messages.d.ts +42 -4
- package/dist/services/messages.d.ts.map +1 -1
- package/dist/services/messages.js +175 -15
- package/dist/services/messages.js.map +1 -1
- package/dist/services/people.d.ts.map +1 -1
- package/dist/services/people.js +4 -2
- package/dist/services/people.js.map +1 -1
- package/dist/speech/install.d.ts +8 -1
- package/dist/speech/install.d.ts.map +1 -1
- package/dist/speech/install.js +11 -4
- package/dist/speech/install.js.map +1 -1
- package/dist/store/sqlite/accounts.d.ts +1 -0
- package/dist/store/sqlite/accounts.d.ts.map +1 -1
- package/dist/store/sqlite/accounts.js +6 -1
- package/dist/store/sqlite/accounts.js.map +1 -1
- package/dist/store/sqlite/conversations.d.ts +1 -1
- package/dist/store/sqlite/conversations.d.ts.map +1 -1
- package/dist/store/sqlite/conversations.js +29 -3
- package/dist/store/sqlite/conversations.js.map +1 -1
- package/dist/store/sqlite/drizzle/bun.js +1 -1
- package/dist/store/sqlite/drizzle/core.d.ts +1 -1
- package/dist/store/sqlite/drizzle/core.d.ts.map +1 -1
- package/dist/store/sqlite/drizzle/core.js +3 -1
- package/dist/store/sqlite/drizzle/core.js.map +1 -1
- package/dist/store/sqlite/drizzle/node.js +1 -1
- package/dist/store/sqlite/drizzle/{shared-VIVPOB3Q.js → shared-WZFJ4TMA.js} +94 -93
- package/dist/store/sqlite/drizzle/{shared-VIVPOB3Q.js.map → shared-WZFJ4TMA.js.map} +3 -3
- package/dist/store/sqlite/manifest.d.ts.map +1 -1
- package/dist/store/sqlite/manifest.js +1 -0
- package/dist/store/sqlite/manifest.js.map +1 -1
- package/dist/store/sqlite/messages.d.ts +1 -1
- package/dist/store/sqlite/messages.d.ts.map +1 -1
- package/dist/store/sqlite/messages.js +8 -24
- package/dist/store/sqlite/messages.js.map +1 -1
- package/dist/store/sqlite/migrations.generated.d.ts.map +1 -1
- package/dist/store/sqlite/migrations.generated.js +8 -0
- package/dist/store/sqlite/migrations.generated.js.map +1 -1
- package/dist/store/sqlite/schema.d.ts +176 -0
- package/dist/store/sqlite/schema.d.ts.map +1 -1
- package/dist/store/sqlite/schema.js +33 -1
- package/dist/store/sqlite/schema.js.map +1 -1
- package/dist/store/sqlite/vectors.d.ts +34 -0
- package/dist/store/sqlite/vectors.d.ts.map +1 -0
- package/dist/store/sqlite/vectors.js +54 -0
- package/dist/store/sqlite/vectors.js.map +1 -0
- package/dist/store/sqlite/words.d.ts +10 -5
- package/dist/store/sqlite/words.d.ts.map +1 -1
- package/dist/store/sqlite/words.js +26 -8
- package/dist/store/sqlite/words.js.map +1 -1
- package/dist/store/store.d.ts +29 -1
- package/dist/store/store.d.ts.map +1 -1
- package/dist/store/store.js +28 -1
- package/dist/store/store.js.map +1 -1
- package/package.json +3 -1
- package/parity.json +620 -3
- package/dist/domain/capabilities.d.ts +0 -25
- package/dist/domain/capabilities.d.ts.map +0 -1
- package/dist/domain/capabilities.js +0 -2
- package/dist/domain/capabilities.js.map +0 -1
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { Id } from "../domain/models.js";
|
|
2
|
+
/**
|
|
3
|
+
* ~300 tokens: e5's tokenizer reads 3.7 characters a token in Russian and 4.0 in English
|
|
4
|
+
* (phase 5 E1). Characters, not tokens, so a chunk is the same whatever model embeds it.
|
|
5
|
+
*/
|
|
6
|
+
export declare const CHUNK_CHARS = 1200;
|
|
7
|
+
export interface ChunkLine {
|
|
8
|
+
id: Id;
|
|
9
|
+
sender: string | null;
|
|
10
|
+
text: string;
|
|
11
|
+
}
|
|
12
|
+
export interface Chunk {
|
|
13
|
+
firstId: Id;
|
|
14
|
+
lastId: Id;
|
|
15
|
+
/** What the model is given; never stored, only its hash. */
|
|
16
|
+
text: string;
|
|
17
|
+
hash: string;
|
|
18
|
+
}
|
|
19
|
+
/** A chunk's text from its messages, as the build cut it: what is hashed and what the model reads. */
|
|
20
|
+
export declare const chunkTextOf: (lines: ChunkLine[]) => string;
|
|
21
|
+
export declare const chunkHash: (text: string) => string;
|
|
22
|
+
/**
|
|
23
|
+
* A conversation, oldest message first, cut at message boundaries into chunks of at most `limit`
|
|
24
|
+
* characters. A message longer than the limit is a chunk of its own; the model cuts it further.
|
|
25
|
+
* Messages with no text add nothing, and a conversation of only those has no chunk.
|
|
26
|
+
*/
|
|
27
|
+
export declare const cutChunks: (members: ChunkLine[], limit?: number) => Chunk[];
|
|
28
|
+
//# sourceMappingURL=chunks.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chunks.d.ts","sourceRoot":"","sources":["../../src/conversations/chunks.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,qBAAqB,CAAA;AAE7C;;;GAGG;AACH,eAAO,MAAM,WAAW,OAAQ,CAAA;AAEhC,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,EAAE,CAAA;IACN,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;IACrB,IAAI,EAAE,MAAM,CAAA;CACb;AAED,MAAM,WAAW,KAAK;IACpB,OAAO,EAAE,EAAE,CAAA;IACX,MAAM,EAAE,EAAE,CAAA;IACV,4DAA4D;IAC5D,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;CACb;AAID,sGAAsG;AACtG,eAAO,MAAM,WAAW,UAAW,SAAS,EAAE,KAAG,MAIlC,CAAA;AAEf,eAAO,MAAM,SAAS,SAAU,MAAM,KAAG,MAAyD,CAAA;AAElG;;;;GAIG;AACH,eAAO,MAAM,SAAS,YAAa,SAAS,EAAE,qBAAwB,KAAK,EAsB1E,CAAA"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
/**
|
|
3
|
+
* ~300 tokens: e5's tokenizer reads 3.7 characters a token in Russian and 4.0 in English
|
|
4
|
+
* (phase 5 E1). Characters, not tokens, so a chunk is the same whatever model embeds it.
|
|
5
|
+
*/
|
|
6
|
+
export const CHUNK_CHARS = 1_200;
|
|
7
|
+
const lineOf = ({ sender, text }) => (sender ? `${sender}: ${text}` : text);
|
|
8
|
+
/** A chunk's text from its messages, as the build cut it: what is hashed and what the model reads. */
|
|
9
|
+
export const chunkTextOf = (lines) => lines
|
|
10
|
+
.filter(({ text }) => text.trim())
|
|
11
|
+
.map(lineOf)
|
|
12
|
+
.join("\n");
|
|
13
|
+
export const chunkHash = (text) => createHash("sha256").update(text).digest("hex");
|
|
14
|
+
/**
|
|
15
|
+
* A conversation, oldest message first, cut at message boundaries into chunks of at most `limit`
|
|
16
|
+
* characters. A message longer than the limit is a chunk of its own; the model cuts it further.
|
|
17
|
+
* Messages with no text add nothing, and a conversation of only those has no chunk.
|
|
18
|
+
*/
|
|
19
|
+
export const cutChunks = (members, limit = CHUNK_CHARS) => {
|
|
20
|
+
const chunks = [];
|
|
21
|
+
let open = [];
|
|
22
|
+
let size = 0;
|
|
23
|
+
const close = () => {
|
|
24
|
+
const first = open[0];
|
|
25
|
+
const last = open.at(-1);
|
|
26
|
+
if (!first || !last)
|
|
27
|
+
return;
|
|
28
|
+
const text = chunkTextOf(open);
|
|
29
|
+
chunks.push({ firstId: first.id, lastId: last.id, text, hash: chunkHash(text) });
|
|
30
|
+
open = [];
|
|
31
|
+
size = 0;
|
|
32
|
+
};
|
|
33
|
+
for (const member of members) {
|
|
34
|
+
if (!member.text.trim())
|
|
35
|
+
continue;
|
|
36
|
+
const length = lineOf(member).length;
|
|
37
|
+
if (open.length > 0 && size + 1 + length > limit)
|
|
38
|
+
close();
|
|
39
|
+
size += (open.length > 0 ? 1 : 0) + length;
|
|
40
|
+
open.push(member);
|
|
41
|
+
}
|
|
42
|
+
close();
|
|
43
|
+
return chunks;
|
|
44
|
+
};
|
|
45
|
+
//# sourceMappingURL=chunks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chunks.js","sourceRoot":"","sources":["../../src/conversations/chunks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAGxC;;;GAGG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,KAAK,CAAA;AAgBhC,MAAM,MAAM,GAAG,CAAC,EAAE,MAAM,EAAE,IAAI,EAAa,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAA;AAEtF,sGAAsG;AACtG,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,KAAkB,EAAU,EAAE,CACxD,KAAK;KACF,MAAM,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;KACjC,GAAG,CAAC,MAAM,CAAC;KACX,IAAI,CAAC,IAAI,CAAC,CAAA;AAEf,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,IAAY,EAAU,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;AAElG;;;;GAIG;AACH,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,OAAoB,EAAE,KAAK,GAAG,WAAW,EAAW,EAAE;IAC9E,MAAM,MAAM,GAAY,EAAE,CAAA;IAC1B,IAAI,IAAI,GAAgB,EAAE,CAAA;IAC1B,IAAI,IAAI,GAAG,CAAC,CAAA;IACZ,MAAM,KAAK,GAAG,GAAG,EAAE;QACjB,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,CAAA;QACrB,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAA;QACxB,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI;YAAE,OAAM;QAC3B,MAAM,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC,CAAA;QAC9B,MAAM,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;QAChF,IAAI,GAAG,EAAE,CAAA;QACT,IAAI,GAAG,CAAC,CAAA;IACV,CAAC,CAAA;IACD,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE;YAAE,SAAQ;QACjC,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,CAAA;QACpC,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,GAAG,MAAM,GAAG,KAAK;YAAE,KAAK,EAAE,CAAA;QACzD,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,CAAA;QAC1C,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;IACnB,CAAC;IACD,KAAK,EAAE,CAAA;IACP,OAAO,MAAM,CAAA;AACf,CAAC,CAAA"}
|
|
@@ -2,7 +2,7 @@ import type { Id, Message } from "../domain/models.js";
|
|
|
2
2
|
export declare const RULES_VERSION = 4;
|
|
3
3
|
/** How far back a rule looks, in messages: 97% of reply parents sat within 50 in a measured group. */
|
|
4
4
|
export declare const LOOK_BACK = 50;
|
|
5
|
-
export type LinkInput = Pick<Message, "id" | "senderId" | "text" | "timestamp" | "replyToId" | "threadId" | "mentions"
|
|
5
|
+
export type LinkInput = Pick<Message, "id" | "senderId" | "text" | "timestamp" | "replyToId" | "threadId" | "mentions"> & Partial<Pick<Message, "senderName">>;
|
|
6
6
|
export interface Link {
|
|
7
7
|
messageId: Id;
|
|
8
8
|
parentId: Id;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"link.d.ts","sourceRoot":"","sources":["../../src/conversations/link.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAEtD,eAAO,MAAM,aAAa,IAAI,CAAA;AAE9B,sGAAsG;AACtG,eAAO,MAAM,SAAS,KAAK,CAAA;AAM3B,MAAM,MAAM,SAAS,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"link.d.ts","sourceRoot":"","sources":["../../src/conversations/link.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAEtD,eAAO,MAAM,aAAa,IAAI,CAAA;AAE9B,sGAAsG;AACtG,eAAO,MAAM,SAAS,KAAK,CAAA;AAM3B,MAAM,MAAM,SAAS,GAAG,IAAI,CAC1B,OAAO,EACP,IAAI,GAAG,UAAU,GAAG,MAAM,GAAG,WAAW,GAAG,WAAW,GAAG,UAAU,GAAG,UAAU,CACjF,GACC,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC,CAAA;AAEtC,MAAM,WAAW,IAAI;IACnB,SAAS,EAAE,EAAE,CAAA;IACb,QAAQ,EAAE,EAAE,CAAA;IACZ,MAAM,EAAE,UAAU,GAAG,MAAM,CAAA;IAC3B,IAAI,EAAE,OAAO,GAAG,SAAS,GAAG,aAAa,CAAA;IACzC,UAAU,EAAE,MAAM,CAAA;IAClB,MAAM,EAAE,MAAM,CAAA;CACf;AAED,MAAM,WAAW,MAAM;IACrB,KAAK,EAAE,IAAI,EAAE,CAAA;IACb,kEAAkE;IAClE,OAAO,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE,GAAG,IAAI,CAAC,CAAA;IAC3B,4FAA4F;IAC5F,aAAa,EAAE,EAAE,EAAE,EAAE,CAAA;CACtB;AAED,MAAM,WAAW,WAAW;IAC1B,sFAAsF;IACtF,OAAO,CAAC,EAAE,WAAW,CAAC,MAAM,EAAE,EAAE,CAAC,CAAA;IACjC;;;OAGG;IACH,OAAO,CAAC,EAAE,WAAW,CAAC,EAAE,EAAE,EAAE,GAAG,IAAI,CAAC,CAAA;CACrC;AAED;;;GAGG;AACH,eAAO,MAAM,YAAY,aACb,QAAQ,CAAC,SAAS,CAAC,yBACiB,WAAW,KACxD,MA0BF,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"link.js","sourceRoot":"","sources":["../../src/conversations/link.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,CAAA;AAE9B,sGAAsG;AACtG,MAAM,CAAC,MAAM,SAAS,GAAG,EAAE,CAAA;AAE3B,yFAAyF;AACzF,MAAM,kBAAkB,GAAG,EAAE,CAAA;AAC7B,MAAM,cAAc,GAAG,CAAC,GAAG,MAAM,CAAA;
|
|
1
|
+
{"version":3,"file":"link.js","sourceRoot":"","sources":["../../src/conversations/link.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { TextModel } from "./models.js";
|
|
2
|
+
export declare const textModelsDirectory: (env?: NodeJS.ProcessEnv) => string;
|
|
3
|
+
export declare const placedText: (model: TextModel, directory: string) => [import("../speech/models.js").ModelFile, string][];
|
|
4
|
+
export declare const isTextModelInstalled: (model: TextModel, directory: string) => boolean;
|
|
5
|
+
/** Past 8 threads one session gains nothing; Bun takes 1 unless told (`2026-10-02-embeddings.md`). */
|
|
6
|
+
export declare const defaultThreads: () => number;
|
|
7
|
+
export type Kind = "query" | "passage";
|
|
8
|
+
export interface Embedder {
|
|
9
|
+
readonly model: TextModel;
|
|
10
|
+
/** One unit vector per text, in order. */
|
|
11
|
+
embed(texts: string[], kind: Kind): Promise<Float32Array[]>;
|
|
12
|
+
close(): Promise<void>;
|
|
13
|
+
}
|
|
14
|
+
/** A text longer than the model's limit keeps its beginning and the closing special token. */
|
|
15
|
+
export declare const truncated: (ids: number[], max: number) => number[];
|
|
16
|
+
export declare const unit: (vector: Float32Array) => Float32Array;
|
|
17
|
+
/** The mean over a single text's tokens: one text a run, so no padding to mask. */
|
|
18
|
+
export declare const meanOf: (data: Float32Array, tokens: number, dims: number) => Float32Array;
|
|
19
|
+
export declare const openEmbedder: (model: TextModel, directory: string, { threads }?: {
|
|
20
|
+
threads?: number;
|
|
21
|
+
}) => Promise<Embedder>;
|
|
22
|
+
//# sourceMappingURL=embed.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"embed.d.ts","sourceRoot":"","sources":["../../src/embeddings/embed.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAE5C,eAAO,MAAM,mBAAmB,SAAS,MAAM,CAAC,UAAU,KAAiB,MAA4C,CAAA;AAEvH,eAAO,MAAM,UAAU,UAAW,SAAS,aAAa,MAAM,wDACoC,CAAA;AAElG,eAAO,MAAM,oBAAoB,UAAW,SAAS,aAAa,MAAM,KAAG,OAC/B,CAAA;AAE5C,sGAAsG;AACtG,eAAO,MAAM,cAAc,QAAO,MAA6C,CAAA;AAE/E,MAAM,MAAM,IAAI,GAAG,OAAO,GAAG,SAAS,CAAA;AAEtC,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAA;IACzB,0CAA0C;IAC1C,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAAA;IAC3D,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;CACvB;AAED,8FAA8F;AAC9F,eAAO,MAAM,SAAS,QAAS,MAAM,EAAE,OAAO,MAAM,KAAG,MAAM,EACe,CAAA;AAE5E,eAAO,MAAM,IAAI,WAAY,YAAY,KAAG,YAK3C,CAAA;AAED,mFAAmF;AACnF,eAAO,MAAM,MAAM,SAAU,YAAY,UAAU,MAAM,QAAQ,MAAM,KAAG,YAOzE,CAAA;AAED,eAAO,MAAM,YAAY,UAChB,SAAS,aACL,MAAM,gBACe;IAAE,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,KACnD,OAAO,CAAC,QAAQ,CA6ClB,CAAA"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { readFileSync } from "node:fs";
|
|
2
|
+
import { availableParallelism } from "node:os";
|
|
3
|
+
import { basename, join } from "node:path";
|
|
4
|
+
import { filesPresent, sharedModelsDirectory } from "../speech/install.js";
|
|
5
|
+
export const textModelsDirectory = (env = process.env) => sharedModelsDirectory("text", env);
|
|
6
|
+
export const placedText = (model, directory) => model.files.map((file) => [file, join(directory, model.id, file.name)]);
|
|
7
|
+
export const isTextModelInstalled = (model, directory) => filesPresent(placedText(model, directory));
|
|
8
|
+
/** Past 8 threads one session gains nothing; Bun takes 1 unless told (`2026-10-02-embeddings.md`). */
|
|
9
|
+
export const defaultThreads = () => Math.min(8, availableParallelism());
|
|
10
|
+
/** A text longer than the model's limit keeps its beginning and the closing special token. */
|
|
11
|
+
export const truncated = (ids, max) => ids.length <= max ? ids : [...ids.slice(0, max - 1), ids.at(-1)];
|
|
12
|
+
export const unit = (vector) => {
|
|
13
|
+
let sum = 0;
|
|
14
|
+
for (const value of vector)
|
|
15
|
+
sum += value * value;
|
|
16
|
+
const length = Math.sqrt(sum);
|
|
17
|
+
return length === 0 ? vector : vector.map((value) => value / length);
|
|
18
|
+
};
|
|
19
|
+
/** The mean over a single text's tokens: one text a run, so no padding to mask. */
|
|
20
|
+
export const meanOf = (data, tokens, dims) => {
|
|
21
|
+
const mean = new Float32Array(dims);
|
|
22
|
+
for (let token = 0; token < tokens; token++) {
|
|
23
|
+
for (let dim = 0; dim < dims; dim++)
|
|
24
|
+
mean[dim] = mean[dim] + data[token * dims + dim] / tokens;
|
|
25
|
+
}
|
|
26
|
+
return mean;
|
|
27
|
+
};
|
|
28
|
+
export const openEmbedder = async (model, directory, { threads = defaultThreads() } = {}) => {
|
|
29
|
+
const [{ Tokenizer }, ort] = await Promise.all([
|
|
30
|
+
import("@huggingface/tokenizers"),
|
|
31
|
+
import("@leemour/cli-messaging-onnx"),
|
|
32
|
+
]);
|
|
33
|
+
const path = (name) => join(directory, model.id, name);
|
|
34
|
+
const tokenizer = new Tokenizer(JSON.parse(readFileSync(path("tokenizer.json"), "utf8")), JSON.parse(readFileSync(path("tokenizer_config.json"), "utf8")));
|
|
35
|
+
ort.env.wasm.numThreads = threads;
|
|
36
|
+
const session = await ort.InferenceSession.create(readFileSync(path(model.onnx)), model.externalData
|
|
37
|
+
? { externalData: [{ path: basename(model.externalData), data: readFileSync(path(model.externalData)) }] }
|
|
38
|
+
: {});
|
|
39
|
+
const typeIds = session.inputNames.includes("token_type_ids");
|
|
40
|
+
const one = async (text) => {
|
|
41
|
+
const ids = truncated(tokenizer.encode(text).ids, model.maxTokens);
|
|
42
|
+
const shape = [1, ids.length];
|
|
43
|
+
const feeds = {
|
|
44
|
+
input_ids: new ort.Tensor("int64", BigInt64Array.from(ids, BigInt), shape),
|
|
45
|
+
attention_mask: new ort.Tensor("int64", new BigInt64Array(ids.length).fill(1n), shape),
|
|
46
|
+
};
|
|
47
|
+
if (typeIds)
|
|
48
|
+
feeds.token_type_ids = new ort.Tensor("int64", new BigInt64Array(ids.length), shape);
|
|
49
|
+
const output = await session.run(feeds);
|
|
50
|
+
if (model.pooling === "sentence_embedding") {
|
|
51
|
+
return unit(Float32Array.from(output.sentence_embedding?.data));
|
|
52
|
+
}
|
|
53
|
+
const hidden = output.last_hidden_state;
|
|
54
|
+
if (!hidden)
|
|
55
|
+
throw new Error(`${model.id} gave no last_hidden_state`);
|
|
56
|
+
return unit(meanOf(hidden.data, ids.length, hidden.dims.at(-1)));
|
|
57
|
+
};
|
|
58
|
+
return {
|
|
59
|
+
model,
|
|
60
|
+
embed: async (texts, kind) => {
|
|
61
|
+
const vectors = [];
|
|
62
|
+
for (const text of texts)
|
|
63
|
+
vectors.push(await one(`${model.prefix[kind]}${text}`));
|
|
64
|
+
return vectors;
|
|
65
|
+
},
|
|
66
|
+
close: () => session.release(),
|
|
67
|
+
};
|
|
68
|
+
};
|
|
69
|
+
//# sourceMappingURL=embed.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"embed.js","sourceRoot":"","sources":["../../src/embeddings/embed.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type { ModelFile } from "../speech/models.js";
|
|
2
|
+
/**
|
|
3
|
+
* The text embedding models `conversations embed` can use, each **pinned to one commit** and checked by
|
|
4
|
+
* sha256, as the speech models are. Measured 2026-10-02 through `@leemour/cli-messaging-onnx`, 4 threads, a
|
|
5
|
+
* Ryzen AI 9 HX 470 laptop, 300-token chunks, Node 24 and Bun 1.3.14 alike
|
|
6
|
+
* (`docs/storage/research/2026-10-02-embeddings.md`): e5-small ~10 chunks a second, EmbeddingGemma ~1.5.
|
|
7
|
+
*/
|
|
8
|
+
export interface TextModel {
|
|
9
|
+
id: string;
|
|
10
|
+
title: string;
|
|
11
|
+
languages: string;
|
|
12
|
+
licence: string;
|
|
13
|
+
/** A licence the user accepts before the model is downloaded, or nothing for an open one. */
|
|
14
|
+
terms?: string;
|
|
15
|
+
dims: number;
|
|
16
|
+
/** What the model was trained on; a longer text is cut. */
|
|
17
|
+
maxTokens: number;
|
|
18
|
+
/** About how many ~300-token chunks a second one session embeds on 8 threads, for the estimate. */
|
|
19
|
+
chunksPerSecond: number;
|
|
20
|
+
/** How the model's output becomes one vector. */
|
|
21
|
+
pooling: "mean" | "sentence_embedding";
|
|
22
|
+
/** Prepended to a search and to a stored chunk: the model was trained with them. */
|
|
23
|
+
prefix: {
|
|
24
|
+
query: string;
|
|
25
|
+
passage: string;
|
|
26
|
+
};
|
|
27
|
+
files: ModelFile[];
|
|
28
|
+
/** The ONNX file among `files`, and the weights it keeps beside itself, if any. */
|
|
29
|
+
onnx: string;
|
|
30
|
+
externalData?: string;
|
|
31
|
+
}
|
|
32
|
+
export declare const TEXT_MODELS: TextModel[];
|
|
33
|
+
export declare const DEFAULT_TEXT_MODEL = "e5-small";
|
|
34
|
+
export declare const textModel: (id: string) => TextModel;
|
|
35
|
+
//# sourceMappingURL=models.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"models.d.ts","sourceRoot":"","sources":["../../src/embeddings/models.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAA;AAEpD;;;;;GAKG;AACH,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;IACb,SAAS,EAAE,MAAM,CAAA;IACjB,OAAO,EAAE,MAAM,CAAA;IACf,6FAA6F;IAC7F,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,MAAM,CAAA;IACZ,2DAA2D;IAC3D,SAAS,EAAE,MAAM,CAAA;IACjB,mGAAmG;IACnG,eAAe,EAAE,MAAM,CAAA;IACvB,iDAAiD;IACjD,OAAO,EAAE,MAAM,GAAG,oBAAoB,CAAA;IACtC,oFAAoF;IACpF,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAA;IAC1C,KAAK,EAAE,SAAS,EAAE,CAAA;IAClB,mFAAmF;IACnF,IAAI,EAAE,MAAM,CAAA;IACZ,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB;AAQD,eAAO,MAAM,WAAW,EAAE,SAAS,EAyElC,CAAA;AAED,eAAO,MAAM,kBAAkB,aAAa,CAAA;AAE5C,eAAO,MAAM,SAAS,OAAQ,MAAM,KAAG,SAStC,CAAA"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { CliError } from "@leemour/cli-core";
|
|
2
|
+
const huggingFace = (repository, commit) => (name) => `https://huggingface.co/${repository}/resolve/${commit}/${name}`;
|
|
3
|
+
const e5 = huggingFace("Xenova/multilingual-e5-small", "761b726dd34fb83930e26aab4e9ac3899aa1fa78");
|
|
4
|
+
const gemma = huggingFace("onnx-community/embeddinggemma-300m-ONNX", "5090578d9565bb06545b4552f76e6bc2c93e4a66");
|
|
5
|
+
export const TEXT_MODELS = [
|
|
6
|
+
{
|
|
7
|
+
id: "e5-small",
|
|
8
|
+
title: "multilingual-e5-small, 8-bit",
|
|
9
|
+
languages: "about 100 languages, Russian and English among them",
|
|
10
|
+
licence: "MIT",
|
|
11
|
+
dims: 384,
|
|
12
|
+
maxTokens: 512,
|
|
13
|
+
chunksPerSecond: 15,
|
|
14
|
+
pooling: "mean",
|
|
15
|
+
prefix: { query: "query: ", passage: "passage: " },
|
|
16
|
+
onnx: "onnx/model_quantized.onnx",
|
|
17
|
+
files: [
|
|
18
|
+
{
|
|
19
|
+
name: "onnx/model_quantized.onnx",
|
|
20
|
+
url: e5("onnx/model_quantized.onnx"),
|
|
21
|
+
sha256: "f80102d3f2a1229f387d3c81909990d8945513e347b0eab049f7de3c6f98c193",
|
|
22
|
+
bytes: 118_308_185,
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
name: "tokenizer.json",
|
|
26
|
+
url: e5("tokenizer.json"),
|
|
27
|
+
sha256: "0b44a9d7b51c3c62626640cda0e2c2f70fdacdc25bbbd68038369d14ebdf4c39",
|
|
28
|
+
bytes: 17_082_730,
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
name: "tokenizer_config.json",
|
|
32
|
+
url: e5("tokenizer_config.json"),
|
|
33
|
+
sha256: "a1d6bc8734a6f635dc158508bef000f8e2e5a759c7d92f984b2c86e5ff53425b",
|
|
34
|
+
bytes: 443,
|
|
35
|
+
},
|
|
36
|
+
],
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
id: "embeddinggemma",
|
|
40
|
+
title: "EmbeddingGemma 300M, 4-bit",
|
|
41
|
+
languages: "over 100 languages — the best of the two on chat, about seven times slower",
|
|
42
|
+
licence: "Gemma Terms of Use",
|
|
43
|
+
terms: "https://ai.google.dev/gemma/terms",
|
|
44
|
+
dims: 768,
|
|
45
|
+
maxTokens: 2048,
|
|
46
|
+
chunksPerSecond: 2,
|
|
47
|
+
pooling: "sentence_embedding",
|
|
48
|
+
prefix: { query: "task: search result | query: ", passage: "title: none | text: " },
|
|
49
|
+
onnx: "onnx/model_q4.onnx",
|
|
50
|
+
externalData: "onnx/model_q4.onnx_data",
|
|
51
|
+
files: [
|
|
52
|
+
{
|
|
53
|
+
name: "onnx/model_q4.onnx",
|
|
54
|
+
url: gemma("onnx/model_q4.onnx"),
|
|
55
|
+
sha256: "ad1dfee81a70f7944b9b9d1cc6e48075b832881cf33fab2f2b248be78f3f0043",
|
|
56
|
+
bytes: 519_322,
|
|
57
|
+
},
|
|
58
|
+
{
|
|
59
|
+
name: "onnx/model_q4.onnx_data",
|
|
60
|
+
url: gemma("onnx/model_q4.onnx_data"),
|
|
61
|
+
sha256: "599962c3143b040de2dd05e5975be3e9091dd067cacc6a8f7186e3203bab9e02",
|
|
62
|
+
bytes: 196_725_760,
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
name: "tokenizer.json",
|
|
66
|
+
url: gemma("tokenizer.json"),
|
|
67
|
+
sha256: "4dda02faaf32bc91031dc8c88457ac272b00c1016cc679757d1c441b248b9c47",
|
|
68
|
+
bytes: 20_323_312,
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
name: "tokenizer_config.json",
|
|
72
|
+
url: gemma("tokenizer_config.json"),
|
|
73
|
+
sha256: "3ca953eea6c3c9fcda9cf3df22949ff18b216f7c74bd6459230f3f1013953f3a",
|
|
74
|
+
bytes: 1_156_830,
|
|
75
|
+
},
|
|
76
|
+
],
|
|
77
|
+
},
|
|
78
|
+
];
|
|
79
|
+
export const DEFAULT_TEXT_MODEL = "e5-small";
|
|
80
|
+
export const textModel = (id) => {
|
|
81
|
+
const found = TEXT_MODELS.find((model) => model.id === id);
|
|
82
|
+
if (!found) {
|
|
83
|
+
throw new CliError("validation_error", `no text model ${id} — one of: ${TEXT_MODELS.map((model) => model.id).join(", ")}`);
|
|
84
|
+
}
|
|
85
|
+
return found;
|
|
86
|
+
};
|
|
87
|
+
//# sourceMappingURL=models.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"models.js","sourceRoot":"","sources":["../../src/embeddings/models.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { type Embedder } from "./embed.js";
|
|
2
|
+
import type { TextModel } from "./models.js";
|
|
3
|
+
/** Each worker holds its own copy of the model: 550–650 MB measured for e5-small (phase 5 E12). */
|
|
4
|
+
export declare const WORKER_BYTES = 700000000;
|
|
5
|
+
/**
|
|
6
|
+
* One session in this thread, or `workers` sessions in worker threads with the threads split between
|
|
7
|
+
* them: ~1.8× at 3 workers, ~2× at 6 on a 12-core laptop. Refuses a count whose copies would not fit in
|
|
8
|
+
* the free memory, so a run never pushes the machine into swap.
|
|
9
|
+
*/
|
|
10
|
+
export declare const openPool: (model: TextModel, directory: string, { workers, threads, free, }?: {
|
|
11
|
+
workers?: number;
|
|
12
|
+
threads?: number;
|
|
13
|
+
free?: number;
|
|
14
|
+
}) => Promise<Embedder>;
|
|
15
|
+
//# sourceMappingURL=pool.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pool.d.ts","sourceRoot":"","sources":["../../src/embeddings/pool.ts"],"names":[],"mappings":"AAEA,OAAO,EAAkB,KAAK,QAAQ,EAAgB,MAAM,YAAY,CAAA;AACxE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAE5C,mGAAmG;AACnG,eAAO,MAAM,YAAY,YAAc,CAAA;AAEvC;;;;GAIG;AACH,eAAO,MAAM,QAAQ,UACZ,SAAS,aACL,MAAM,gCAKd;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,KACvD,OAAO,CAAC,QAAQ,CAUlB,CAAA"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { freemem } from "node:os";
|
|
2
|
+
import { CliError } from "@leemour/cli-core";
|
|
3
|
+
import { defaultThreads, openEmbedder } from "./embed.js";
|
|
4
|
+
/** Each worker holds its own copy of the model: 550–650 MB measured for e5-small (phase 5 E12). */
|
|
5
|
+
export const WORKER_BYTES = 700_000_000;
|
|
6
|
+
/**
|
|
7
|
+
* One session in this thread, or `workers` sessions in worker threads with the threads split between
|
|
8
|
+
* them: ~1.8× at 3 workers, ~2× at 6 on a 12-core laptop. Refuses a count whose copies would not fit in
|
|
9
|
+
* the free memory, so a run never pushes the machine into swap.
|
|
10
|
+
*/
|
|
11
|
+
export const openPool = async (model, directory, { workers = 1, threads = defaultThreads(), free = freemem(), } = {}) => {
|
|
12
|
+
if (workers <= 1)
|
|
13
|
+
return openEmbedder(model, directory, { threads });
|
|
14
|
+
if (workers * WORKER_BYTES > free) {
|
|
15
|
+
throw new CliError("validation_error", `${workers} workers need about ${Math.round((workers * WORKER_BYTES) / 1e9)} GB, and ${Math.floor(free / 1e9)} GB is free — use fewer`);
|
|
16
|
+
}
|
|
17
|
+
const { openWorkers } = await import("./workers.js");
|
|
18
|
+
return openWorkers(model, directory, { workers, threads: Math.max(1, Math.floor(threads / workers)) });
|
|
19
|
+
};
|
|
20
|
+
//# sourceMappingURL=pool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pool.js","sourceRoot":"","sources":["../../src/embeddings/pool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AACjC,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAC5C,OAAO,EAAE,cAAc,EAAiB,YAAY,EAAE,MAAM,YAAY,CAAA;AAGxE,mGAAmG;AACnG,MAAM,CAAC,MAAM,YAAY,GAAG,WAAW,CAAA;AAEvC;;;;GAIG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG,KAAK,EAC3B,KAAgB,EAChB,SAAiB,EACjB,EACE,OAAO,GAAG,CAAC,EACX,OAAO,GAAG,cAAc,EAAE,EAC1B,IAAI,GAAG,OAAO,EAAE,GACjB,GAA0D,EAAE,EAC1C,EAAE;IACrB,IAAI,OAAO,IAAI,CAAC;QAAE,OAAO,YAAY,CAAC,KAAK,EAAE,SAAS,EAAE,EAAE,OAAO,EAAE,CAAC,CAAA;IACpE,IAAI,OAAO,GAAG,YAAY,GAAG,IAAI,EAAE,CAAC;QAClC,MAAM,IAAI,QAAQ,CAChB,kBAAkB,EAClB,GAAG,OAAO,uBAAuB,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,GAAG,YAAY,CAAC,GAAG,GAAG,CAAC,YAAY,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,GAAG,CAAC,yBAAyB,CACvI,CAAA;IACH,CAAC;IACD,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC,CAAA;IACpD,OAAO,WAAW,CAAC,KAAK,EAAE,SAAS,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC,CAAA;AACxG,CAAC,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worker.d.ts","sourceRoot":"","sources":["../../src/embeddings/worker.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { parentPort, workerData } from "node:worker_threads";
|
|
2
|
+
import { openEmbedder } from "./embed.js";
|
|
3
|
+
const { model, directory, threads } = workerData;
|
|
4
|
+
const embedder = await openEmbedder(model, directory, { threads });
|
|
5
|
+
const port = parentPort;
|
|
6
|
+
if (!port)
|
|
7
|
+
throw new Error("run as a worker");
|
|
8
|
+
port.on("message", async (job) => {
|
|
9
|
+
if (job === "close") {
|
|
10
|
+
await embedder.close();
|
|
11
|
+
port.close();
|
|
12
|
+
return;
|
|
13
|
+
}
|
|
14
|
+
try {
|
|
15
|
+
port.postMessage({ id: job.id, vectors: await embedder.embed(job.texts, job.kind) });
|
|
16
|
+
}
|
|
17
|
+
catch (error) {
|
|
18
|
+
port.postMessage({ id: job.id, error: error instanceof Error ? error.message : String(error) });
|
|
19
|
+
}
|
|
20
|
+
});
|
|
21
|
+
port.postMessage("ready");
|
|
22
|
+
//# sourceMappingURL=worker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worker.js","sourceRoot":"","sources":["../../src/embeddings/worker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAA;AAC5D,OAAO,EAAa,YAAY,EAAE,MAAM,YAAY,CAAA;AAGpD,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,GAAG,UAAsE,CAAA;AAC5G,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,KAAK,EAAE,SAAS,EAAE,EAAE,OAAO,EAAE,CAAC,CAAA;AAClE,MAAM,IAAI,GAAG,UAAU,CAAA;AACvB,IAAI,CAAC,IAAI;IAAE,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAA;AAE7C,IAAI,CAAC,EAAE,CAAC,SAAS,EAAE,KAAK,EAAE,GAA0D,EAAE,EAAE;IACtF,IAAI,GAAG,KAAK,OAAO,EAAE,CAAC;QACpB,MAAM,QAAQ,CAAC,KAAK,EAAE,CAAA;QACtB,IAAI,CAAC,KAAK,EAAE,CAAA;QACZ,OAAM;IACR,CAAC;IACD,IAAI,CAAC;QACH,IAAI,CAAC,WAAW,CAAC,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IACtF,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,CAAC,WAAW,CAAC,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;IACjG,CAAC;AACH,CAAC,CAAC,CAAA;AACF,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAA"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { Embedder } from "./embed.js";
|
|
2
|
+
import type { TextModel } from "./models.js";
|
|
3
|
+
/** `workers` worker threads, each with its own session on `threads` threads; texts are split between them. */
|
|
4
|
+
export declare const openWorkers: (model: TextModel, directory: string, { workers, threads }: {
|
|
5
|
+
workers: number;
|
|
6
|
+
threads: number;
|
|
7
|
+
}) => Promise<Embedder>;
|
|
8
|
+
//# sourceMappingURL=workers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workers.d.ts","sourceRoot":"","sources":["../../src/embeddings/workers.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAQ,MAAM,YAAY,CAAA;AAChD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAE5C,8GAA8G;AAC9G,eAAO,MAAM,WAAW,UACf,SAAS,aACL,MAAM,wBACK;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,KACzD,OAAO,CAAC,QAAQ,CAkDlB,CAAA"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { Worker } from "node:worker_threads";
|
|
2
|
+
/** `workers` worker threads, each with its own session on `threads` threads; texts are split between them. */
|
|
3
|
+
export const openWorkers = async (model, directory, { workers, threads }) => {
|
|
4
|
+
const pending = new Map();
|
|
5
|
+
const started = await Promise.allSettled(Array.from({ length: workers }, () => {
|
|
6
|
+
const worker = new Worker(new URL("./worker.js", import.meta.url), {
|
|
7
|
+
workerData: { model, directory, threads },
|
|
8
|
+
});
|
|
9
|
+
return new Promise((resolve, reject) => {
|
|
10
|
+
worker.once("error", reject);
|
|
11
|
+
worker.once("message", (first) => {
|
|
12
|
+
if (first !== "ready")
|
|
13
|
+
return reject(new Error("the embedding worker did not start"));
|
|
14
|
+
worker.off("error", reject);
|
|
15
|
+
worker.on("message", ({ id, vectors, error }) => {
|
|
16
|
+
const job = pending.get(id);
|
|
17
|
+
pending.delete(id);
|
|
18
|
+
if (error !== undefined || !vectors)
|
|
19
|
+
job?.reject(new Error(error ?? "no vectors"));
|
|
20
|
+
else
|
|
21
|
+
job?.resolve(vectors);
|
|
22
|
+
});
|
|
23
|
+
resolve(worker);
|
|
24
|
+
});
|
|
25
|
+
});
|
|
26
|
+
}));
|
|
27
|
+
const pool = started.flatMap((result) => (result.status === "fulfilled" ? [result.value] : []));
|
|
28
|
+
const failed = started.find((result) => result.status === "rejected");
|
|
29
|
+
if (failed) {
|
|
30
|
+
await Promise.all(pool.map((worker) => worker.terminate()));
|
|
31
|
+
throw failed.reason;
|
|
32
|
+
}
|
|
33
|
+
let next = 0;
|
|
34
|
+
const run = (worker, texts, kind) => new Promise((resolve, reject) => {
|
|
35
|
+
const id = next++;
|
|
36
|
+
pending.set(id, { resolve, reject });
|
|
37
|
+
worker.postMessage({ id, texts, kind });
|
|
38
|
+
});
|
|
39
|
+
return {
|
|
40
|
+
model,
|
|
41
|
+
embed: async (texts, kind) => {
|
|
42
|
+
const share = Math.ceil(texts.length / pool.length);
|
|
43
|
+
const parts = await Promise.all(pool.map((worker, index) => run(worker, texts.slice(index * share, (index + 1) * share), kind)));
|
|
44
|
+
return parts.flat();
|
|
45
|
+
},
|
|
46
|
+
close: async () => {
|
|
47
|
+
await Promise.all(pool.map((worker) => worker.terminate()));
|
|
48
|
+
},
|
|
49
|
+
};
|
|
50
|
+
};
|
|
51
|
+
//# sourceMappingURL=workers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workers.js","sourceRoot":"","sources":["../../src/embeddings/workers.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
export type { Capabilities } from "./domain/capabilities.js";
|
|
2
1
|
export { formatLocator, isLocator, type MessageLocator, parseLocator } from "./domain/locator.js";
|
|
3
2
|
export { type Markup, parseMarkdown } from "./domain/markdown.js";
|
|
4
3
|
export type * from "./domain/models.js";
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,KAAK,cAAc,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AACjG,OAAO,EAAE,KAAK,MAAM,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AACjE,mBAAmB,oBAAoB,CAAA;AACvC,YAAY,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAA;AACzE,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAA;AAClD,YAAY,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAA;AACvD,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAA;AACxF,OAAO,EAAE,KAAK,aAAa,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAC/D,OAAO,EAAE,KAAK,aAAa,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AACxF,OAAO,EAAE,IAAI,EAAE,KAAK,YAAY,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AAC5E,OAAO,EAAE,UAAU,EAAE,KAAK,WAAW,EAAE,MAAM,sBAAsB,CAAA;AACnE,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA"}
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,SAAS,EAAuB,YAAY,EAAE,MAAM,qBAAqB,CAAA;AACjG,OAAO,EAAe,aAAa,EAAE,MAAM,sBAAsB,CAAA;AAGjE,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAA;AAElD,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAA;AACxF,OAAO,EAAsB,aAAa,EAAE,MAAM,aAAa,CAAA;AAC/D,OAAO,EAAsB,aAAa,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AACxF,OAAO,EAAE,IAAI,EAAqB,QAAQ,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AAC5E,OAAO,EAAE,UAAU,EAAoB,MAAM,sBAAsB,CAAA;AACnE,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA"}
|
package/dist/kit/contract.d.ts
CHANGED
|
@@ -18,9 +18,11 @@ export interface ContractOptions {
|
|
|
18
18
|
orderBy?: "id" | "time";
|
|
19
19
|
/** How long `watch` may take to say it listens, and to end once aborted. */
|
|
20
20
|
waitMs?: number;
|
|
21
|
+
/** As the messenger's `history`: a `"server"` messenger's adapter must have every `ServerReads` method. */
|
|
22
|
+
history?: "server" | "store";
|
|
21
23
|
}
|
|
22
24
|
/** Every method of the optional groups, which `capability` hands over or refuses. */
|
|
23
|
-
export declare const OPTIONAL_METHODS: readonly ["historyAfter", "historyBefore", "topics", "inspect", "edit", "forward", "delete", "pin", "unpin", "react", "markRead", "poll", "vote", "closePoll", "createPoll", "watch", "feed", "download", "transcribe", "scheduled", "members", "admins", "chatEvents", "sessions", "lookup", "addressBook", "people", "createGroup", "join", "leave", "group", "updateGroup", "resetInviteLink", "addMembers", "removeMembers", "addAdmin", "removeAdmin", "folders", "createFolder", "updateFolder", "deleteFolder", "addContact", "removeContact", "block", "unblock", "renameContact", "importContacts", "updateProfile", "endOtherSessions"];
|
|
25
|
+
export declare const OPTIONAL_METHODS: readonly ["chats", "history", "around", "contact", "historyAfter", "historyBefore", "topics", "inspect", "edit", "forward", "delete", "pin", "unpin", "react", "markRead", "poll", "vote", "closePoll", "createPoll", "watch", "feed", "download", "transcribe", "scheduled", "members", "admins", "chatEvents", "sessions", "lookup", "addressBook", "people", "createGroup", "join", "leave", "group", "updateGroup", "resetInviteLink", "addMembers", "removeMembers", "addAdmin", "removeAdmin", "folders", "createFolder", "updateFolder", "deleteFolder", "addContact", "removeContact", "block", "unblock", "renameContact", "importContacts", "updateProfile", "endOtherSessions"];
|
|
24
26
|
/**
|
|
25
27
|
* The port's promises as cases any test runner can run: each connects through `connect`, checks
|
|
26
28
|
* with `node:assert/strict` and closes the adapter. None needs a live service.
|
|
@@ -33,5 +35,5 @@ export declare const OPTIONAL_METHODS: readonly ["historyAfter", "historyBefore"
|
|
|
33
35
|
* })
|
|
34
36
|
* ```
|
|
35
37
|
*/
|
|
36
|
-
export declare const contractCases: ({ connect, ids, orderBy, waitMs, }: ContractOptions) => ContractCase[];
|
|
38
|
+
export declare const contractCases: ({ connect, ids, orderBy, waitMs, history, }: ContractOptions) => ContractCase[];
|
|
37
39
|
//# sourceMappingURL=contract.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"contract.d.ts","sourceRoot":"","sources":["../../src/kit/contract.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"contract.d.ts","sourceRoot":"","sources":["../../src/kit/contract.ts"],"names":[],"mappings":"AAGA,OAAO,EAAiC,KAAK,gBAAgB,EAAoB,MAAM,0BAA0B,CAAA;AAGjH,OAAO,EAA2B,KAAK,OAAO,EAAE,KAAK,IAAI,EAAW,MAAM,WAAW,CAAA;AAErF,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAA;IACZ,6FAA6F;IAC7F,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,6GAA6G;IAC7G,GAAG,IAAI,OAAO,CAAC,SAAS,GAAG;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAChD;AAED,MAAM,WAAW,eAAe;IAC9B,oGAAoG;IACpG,OAAO,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAA;IACrE,2GAA2G;IAC3G,GAAG,CAAC,EAAE,OAAO,CAAA;IACb,0GAA0G;IAC1G,OAAO,CAAC,EAAE,IAAI,GAAG,MAAM,CAAA;IACvB,4EAA4E;IAC5E,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,2GAA2G;IAC3G,OAAO,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAA;CAC7B;AAWD,qFAAqF;AACrF,eAAO,MAAM,gBAAgB,4pBAmD2B,CAAA;AAmCxD;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,aAAa,gDAMvB,eAAe,KAAG,YAAY,EAkWhC,CAAA"}
|