@wirecat/cli-core 0.306.0 → 0.307.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/dist/analysis/consents.js +4 -4
- package/dist/analysis/consents.js.map +1 -1
- package/dist/attachments/directory.js +1 -1
- package/dist/attachments/directory.js.map +1 -1
- package/dist/botcheck/service.js +3 -3
- package/dist/botcheck/service.js.map +1 -1
- package/dist/cli/bot/context.d.ts +2 -2
- package/dist/cli/bot/copy.js +4 -4
- package/dist/cli/bot/copy.js.map +1 -1
- package/dist/cli/bot/messages.d.ts.map +1 -1
- package/dist/cli/bot/messages.js +2 -2
- package/dist/cli/bot/messages.js.map +1 -1
- package/dist/cli/bot/moderation.js +1 -1
- package/dist/cli/bot/moderation.js.map +1 -1
- package/dist/cli/bot/people.js +4 -4
- package/dist/cli/bot/people.js.map +1 -1
- package/dist/cli/bot/store.js +2 -2
- package/dist/cli/bot/store.js.map +1 -1
- package/dist/cli/config-keys.d.ts.map +1 -1
- package/dist/cli/config-keys.js +2 -1
- package/dist/cli/config-keys.js.map +1 -1
- package/dist/cli/messenger/account-command.js +1 -1
- package/dist/cli/messenger/account-command.js.map +1 -1
- package/dist/cli/messenger/complete-command.js +2 -2
- package/dist/cli/messenger/complete-command.js.map +1 -1
- package/dist/cli/messenger/context.js +1 -1
- package/dist/cli/messenger/context.js.map +1 -1
- package/dist/cli/messenger/serve-members.js +1 -1
- package/dist/cli/messenger/serve-members.js.map +1 -1
- package/dist/cli/messenger/serve-stems.js +3 -3
- package/dist/cli/messenger/serve-stems.js.map +1 -1
- package/dist/cli/messenger/stored.d.ts.map +1 -1
- package/dist/cli/messenger/stored.js +21 -21
- package/dist/cli/messenger/stored.js.map +1 -1
- package/dist/cli/store-settings.js +3 -3
- package/dist/cli/store-settings.js.map +1 -1
- package/dist/errors/reasons.d.ts.map +1 -1
- package/dist/errors/reasons.js +1 -0
- package/dist/errors/reasons.js.map +1 -1
- package/dist/files/atomic-write.d.ts +15 -0
- package/dist/files/atomic-write.d.ts.map +1 -0
- package/dist/files/atomic-write.js +35 -0
- package/dist/files/atomic-write.js.map +1 -0
- package/dist/files/index.d.ts +2 -0
- package/dist/files/index.d.ts.map +1 -1
- package/dist/files/index.js +2 -0
- package/dist/files/index.js.map +1 -1
- package/dist/files/lock.d.ts +14 -0
- package/dist/files/lock.d.ts.map +1 -0
- package/dist/files/lock.js +22 -0
- package/dist/files/lock.js.map +1 -0
- package/dist/files/native-lease-release.d.ts +3 -1
- package/dist/files/native-lease-release.d.ts.map +1 -1
- package/dist/files/native-lease-release.js +7 -3
- package/dist/files/native-lease-release.js.map +1 -1
- package/dist/kit/search-recipes.d.ts.map +1 -1
- package/dist/kit/search-recipes.js +5 -5
- package/dist/kit/search-recipes.js.map +1 -1
- package/dist/mcp/resources.js +1 -1
- package/dist/mcp/resources.js.map +1 -1
- package/dist/mcp/tools/chats.js +1 -1
- package/dist/mcp/tools/chats.js.map +1 -1
- package/dist/replies/dry-run.d.ts.map +1 -1
- package/dist/replies/dry-run.js +5 -5
- package/dist/replies/dry-run.js.map +1 -1
- package/dist/services/admin-statistics.js +6 -6
- package/dist/services/admin-statistics.js.map +1 -1
- package/dist/services/agenda.js +1 -1
- package/dist/services/agenda.js.map +1 -1
- package/dist/services/archive-gaps.js +4 -4
- package/dist/services/archive-gaps.js.map +1 -1
- package/dist/services/archive.d.ts.map +1 -1
- package/dist/services/archive.js +23 -23
- package/dist/services/archive.js.map +1 -1
- package/dist/services/attachments.d.ts.map +1 -1
- package/dist/services/attachments.js +21 -10
- package/dist/services/attachments.js.map +1 -1
- package/dist/services/chat-documents.js +2 -2
- package/dist/services/chat-documents.js.map +1 -1
- package/dist/services/chats.d.ts.map +1 -1
- package/dist/services/chats.js +24 -19
- package/dist/services/chats.js.map +1 -1
- package/dist/services/conversations.js +15 -15
- package/dist/services/conversations.js.map +1 -1
- package/dist/services/counters.d.ts.map +1 -1
- package/dist/services/counters.js +4 -4
- package/dist/services/counters.js.map +1 -1
- package/dist/services/embeddings-maintenance.d.ts.map +1 -1
- package/dist/services/embeddings-maintenance.js +13 -13
- package/dist/services/embeddings-maintenance.js.map +1 -1
- package/dist/services/embeddings-search.d.ts.map +1 -1
- package/dist/services/embeddings-search.js +16 -16
- package/dist/services/embeddings-search.js.map +1 -1
- package/dist/services/evidence-read.js +1 -1
- package/dist/services/evidence-read.js.map +1 -1
- package/dist/services/folders.js +1 -1
- package/dist/services/folders.js.map +1 -1
- package/dist/services/inbox.js +4 -4
- package/dist/services/inbox.js.map +1 -1
- package/dist/services/index.d.ts +1 -1
- package/dist/services/index.d.ts.map +1 -1
- package/dist/services/index.js.map +1 -1
- package/dist/services/mail-search.d.ts.map +1 -1
- package/dist/services/mail-search.js +15 -13
- package/dist/services/mail-search.js.map +1 -1
- package/dist/services/meeting-context.d.ts +4 -2
- package/dist/services/meeting-context.d.ts.map +1 -1
- package/dist/services/meeting-context.js +1 -1
- package/dist/services/meeting-context.js.map +1 -1
- package/dist/services/meeting-tasks.d.ts +4 -2
- package/dist/services/meeting-tasks.d.ts.map +1 -1
- package/dist/services/meeting-tasks.js +1 -1
- package/dist/services/meeting-tasks.js.map +1 -1
- package/dist/services/mentions.d.ts.map +1 -1
- package/dist/services/mentions.js +8 -8
- package/dist/services/mentions.js.map +1 -1
- package/dist/services/message-resolution.d.ts.map +1 -1
- package/dist/services/message-resolution.js +6 -6
- package/dist/services/message-resolution.js.map +1 -1
- package/dist/services/messages-archive-search.js +4 -4
- package/dist/services/messages-archive-search.js.map +1 -1
- package/dist/services/messages-combined.js +3 -3
- package/dist/services/messages-combined.js.map +1 -1
- package/dist/services/messages-discovery.js +2 -2
- package/dist/services/messages-discovery.js.map +1 -1
- package/dist/services/messages-search.d.ts.map +1 -1
- package/dist/services/messages-search.js +13 -13
- package/dist/services/messages-search.js.map +1 -1
- package/dist/services/messages.js +6 -6
- package/dist/services/messages.js.map +1 -1
- package/dist/services/metadata.js +9 -9
- package/dist/services/metadata.js.map +1 -1
- package/dist/services/notes-search.js +4 -4
- package/dist/services/notes-search.js.map +1 -1
- package/dist/services/people.d.ts.map +1 -1
- package/dist/services/people.js +18 -17
- package/dist/services/people.js.map +1 -1
- package/dist/services/person-context.js +16 -16
- package/dist/services/person-context.js.map +1 -1
- package/dist/services/person-meeting-context.d.ts +3 -2
- package/dist/services/person-meeting-context.d.ts.map +1 -1
- package/dist/services/person-meeting-context.js +3 -3
- package/dist/services/person-meeting-context.js.map +1 -1
- package/dist/services/person-profile.js +5 -5
- package/dist/services/person-profile.js.map +1 -1
- package/dist/services/person-timeline.js +2 -2
- package/dist/services/person-timeline.js.map +1 -1
- package/dist/services/pictures.d.ts.map +1 -1
- package/dist/services/pictures.js +9 -6
- package/dist/services/pictures.js.map +1 -1
- package/dist/services/private-people.d.ts.map +1 -1
- package/dist/services/private-people.js +7 -7
- package/dist/services/private-people.js.map +1 -1
- package/dist/services/rankings-selection.js +1 -1
- package/dist/services/rankings-selection.js.map +1 -1
- package/dist/services/rankings.js +7 -7
- package/dist/services/rankings.js.map +1 -1
- package/dist/services/retention.d.ts +3 -3
- package/dist/services/retention.js +2 -2
- package/dist/services/retention.js.map +1 -1
- package/dist/services/search-all-meetings.js +2 -2
- package/dist/services/search-all-meetings.js.map +1 -1
- package/dist/services/search-all.d.ts.map +1 -1
- package/dist/services/search-all.js +3 -1
- package/dist/services/search-all.js.map +1 -1
- package/dist/services/search-catchup.js +1 -1
- package/dist/services/search-catchup.js.map +1 -1
- package/dist/services/search-kind.js +4 -4
- package/dist/services/search-kind.js.map +1 -1
- package/dist/services/search-refresh.d.ts.map +1 -1
- package/dist/services/search-refresh.js +2 -2
- package/dist/services/search-refresh.js.map +1 -1
- package/dist/services/searches.js +7 -7
- package/dist/services/searches.js.map +1 -1
- package/dist/services/server-search.js +4 -4
- package/dist/services/server-search.js.map +1 -1
- package/dist/services/tags.d.ts.map +1 -1
- package/dist/services/tags.js +7 -4
- package/dist/services/tags.js.map +1 -1
- package/dist/services/task-rules.js +6 -6
- package/dist/services/task-rules.js.map +1 -1
- package/dist/services/tasks.js +2 -2
- package/dist/services/tasks.js.map +1 -1
- package/dist/services/thread-context.d.ts.map +1 -1
- package/dist/services/thread-context.js +5 -5
- package/dist/services/thread-context.js.map +1 -1
- package/dist/speech/hearing.d.ts.map +1 -1
- package/dist/speech/hearing.js +2 -2
- package/dist/speech/hearing.js.map +1 -1
- package/dist/store/account-store.d.ts +64 -17
- package/dist/store/account-store.d.ts.map +1 -1
- package/dist/store/account-store.js +75 -121
- package/dist/store/account-store.js.map +1 -1
- package/dist/store/accounts.d.ts +35 -0
- package/dist/store/accounts.d.ts.map +1 -0
- package/dist/store/accounts.js +47 -0
- package/dist/store/accounts.js.map +1 -0
- package/dist/store/attachments.d.ts +40 -0
- package/dist/store/attachments.d.ts.map +1 -0
- package/dist/store/attachments.js +50 -0
- package/dist/store/attachments.js.map +1 -0
- package/dist/store/chats.d.ts +47 -0
- package/dist/store/chats.d.ts.map +1 -0
- package/dist/store/chats.js +80 -0
- package/dist/store/chats.js.map +1 -0
- package/dist/store/conversations.d.ts +73 -0
- package/dist/store/conversations.d.ts.map +1 -0
- package/dist/store/conversations.js +118 -0
- package/dist/store/conversations.js.map +1 -0
- package/dist/store/counters.d.ts +25 -0
- package/dist/store/counters.d.ts.map +1 -0
- package/dist/store/counters.js +26 -0
- package/dist/store/counters.js.map +1 -0
- package/dist/store/index.d.ts +1 -1
- package/dist/store/index.d.ts.map +1 -1
- package/dist/store/index.js.map +1 -1
- package/dist/store/keys.d.ts +16 -0
- package/dist/store/keys.d.ts.map +1 -0
- package/dist/store/keys.js +25 -0
- package/dist/store/keys.js.map +1 -0
- package/dist/store/mentions.d.ts +41 -0
- package/dist/store/mentions.d.ts.map +1 -0
- package/dist/store/mentions.js +39 -0
- package/dist/store/mentions.js.map +1 -0
- package/dist/store/messages.d.ts +116 -0
- package/dist/store/messages.d.ts.map +1 -0
- package/dist/store/messages.js +102 -0
- package/dist/store/messages.js.map +1 -0
- package/dist/store/people.d.ts +53 -0
- package/dist/store/people.d.ts.map +1 -0
- package/dist/store/people.js +65 -0
- package/dist/store/people.js.map +1 -0
- package/dist/store/queries.d.ts +22 -0
- package/dist/store/queries.d.ts.map +1 -0
- package/dist/store/queries.js +22 -0
- package/dist/store/queries.js.map +1 -0
- package/dist/store/roster.d.ts +38 -0
- package/dist/store/roster.d.ts.map +1 -0
- package/dist/store/roster.js +54 -0
- package/dist/store/roster.js.map +1 -0
- package/dist/store/search-index.d.ts +40 -0
- package/dist/store/search-index.d.ts.map +1 -0
- package/dist/store/search-index.js +19 -0
- package/dist/store/search-index.js.map +1 -0
- package/dist/store/searches.d.ts +22 -0
- package/dist/store/searches.d.ts.map +1 -0
- package/dist/store/searches.js +25 -0
- package/dist/store/searches.js.map +1 -0
- package/dist/store/sqlite/accounts.d.ts +1 -1
- package/dist/store/sqlite/admin-statistics.d.ts +1 -1
- package/dist/store/sqlite/batches.d.ts +1 -1
- package/dist/store/sqlite/bot-updates.d.ts +1 -1
- package/dist/store/sqlite/chats.d.ts +1 -1
- package/dist/store/sqlite/conversation-eligibility.d.ts +1 -1
- package/dist/store/sqlite/conversations.d.ts +1 -1
- package/dist/store/sqlite/emails.d.ts +1 -1
- package/dist/store/sqlite/emails.d.ts.map +1 -1
- package/dist/store/sqlite/emails.js +5 -2
- package/dist/store/sqlite/emails.js.map +1 -1
- package/dist/store/sqlite/identities.d.ts +1 -1
- package/dist/store/sqlite/knowledge.d.ts +1 -1
- package/dist/store/sqlite/lucene-fields.d.ts +66 -0
- package/dist/store/sqlite/lucene-fields.d.ts.map +1 -0
- package/dist/store/sqlite/lucene-fields.js +360 -0
- package/dist/store/sqlite/lucene-fields.js.map +1 -0
- package/dist/store/sqlite/lucene.d.ts +2 -13
- package/dist/store/sqlite/lucene.d.ts.map +1 -1
- package/dist/store/sqlite/lucene.js +27 -329
- package/dist/store/sqlite/lucene.js.map +1 -1
- package/dist/store/sqlite/meeting-projects.d.ts +1 -1
- package/dist/store/sqlite/messages.d.ts +1 -1
- package/dist/store/sqlite/person-links.d.ts +1 -1
- package/dist/store/sqlite/private-people.d.ts +1 -1
- package/dist/store/sqlite/proposed-actions.d.ts +1 -1
- package/dist/store/sqlite/ranges.d.ts +1 -1
- package/dist/store/sqlite/ranking-evidence.d.ts +1 -1
- package/dist/store/sqlite/reads.d.ts +1 -1
- package/dist/store/sqlite/search.d.ts +1 -1
- package/dist/store/sqlite/tags.d.ts +1 -1
- package/dist/store/sqlite/task-rule-stops.d.ts +1 -1
- package/dist/store/sqlite/words.d.ts +1 -1
- package/dist/store/store.d.ts +62 -828
- package/dist/store/store.d.ts.map +1 -1
- package/dist/store/store.js +105 -836
- package/dist/store/store.js.map +1 -1
- package/dist/store/sync.d.ts +36 -0
- package/dist/store/sync.d.ts.map +1 -0
- package/dist/store/sync.js +59 -0
- package/dist/store/sync.js.map +1 -0
- package/dist/store/tags.d.ts +13 -0
- package/dist/store/tags.d.ts.map +1 -0
- package/dist/store/tags.js +23 -0
- package/dist/store/tags.js.map +1 -0
- package/dist/store/types.d.ts +247 -0
- package/dist/store/types.d.ts.map +1 -0
- package/dist/store/types.js +2 -0
- package/dist/store/types.js.map +1 -0
- package/dist/store/vectors.d.ts +109 -0
- package/dist/store/vectors.d.ts.map +1 -0
- package/dist/store/vectors.js +221 -0
- package/dist/store/vectors.js.map +1 -0
- package/dist/update/index.d.ts +52 -0
- package/dist/update/index.d.ts.map +1 -0
- package/dist/update/index.js +68 -0
- package/dist/update/index.js.map +1 -0
- package/package.json +5 -1
|
@@ -0,0 +1,360 @@
|
|
|
1
|
+
import { CliError } from "@wirecat/cli-base";
|
|
2
|
+
import { storedKinds } from "../../domain/attachments.js";
|
|
3
|
+
import { siteOf } from "../../domain/mentions.js";
|
|
4
|
+
import { tagOf } from "../../domain/tags.js";
|
|
5
|
+
import { foldRegex, wildcardPattern } from "../../search/lucene/automaton.js";
|
|
6
|
+
import { PRESETS } from "../../search/lucene/presets.js";
|
|
7
|
+
import { parseBytes } from "../../search/lucene/registry.js";
|
|
8
|
+
import { isStemmed } from "../../search/lucene/resolved.js";
|
|
9
|
+
import { exhausted, QUERY_LIMITS, searchError } from "../../search/lucene/types.js";
|
|
10
|
+
import { inSource } from "../../search/query.js";
|
|
11
|
+
import { normalize } from "../normalize.js";
|
|
12
|
+
import { linkMatch } from "./mention-links.js";
|
|
13
|
+
import { valueMatch } from "./phone-countries.js";
|
|
14
|
+
/** A voice note's transcript is its attachment's text, written by speech recognition (`speech:<model>`). */
|
|
15
|
+
export const SPEECH = "coalesce(att.extractor,'') LIKE 'speech:%'";
|
|
16
|
+
export const quoted = (value) => `"${value.replaceAll('"', '""')}"`;
|
|
17
|
+
export const combine = (parts, operator) => ({
|
|
18
|
+
sql: parts.length ? `(${parts.map(({ sql }) => sql).join(` ${operator} `)})` : operator === "AND" ? "1" : "0",
|
|
19
|
+
params: parts.flatMap(({ params }) => params),
|
|
20
|
+
exact: parts.every(({ exact }) => exact),
|
|
21
|
+
});
|
|
22
|
+
export const prefixOf = (pattern) => {
|
|
23
|
+
if (pattern.includes("|"))
|
|
24
|
+
return "";
|
|
25
|
+
let prefix = "";
|
|
26
|
+
for (const c of pattern) {
|
|
27
|
+
if (!/[\p{L}\p{N}_ -]/u.test(c)) {
|
|
28
|
+
if (["?", "*", "{"].includes(c))
|
|
29
|
+
prefix = [...prefix].slice(0, -1).join("");
|
|
30
|
+
break;
|
|
31
|
+
}
|
|
32
|
+
prefix += c;
|
|
33
|
+
}
|
|
34
|
+
return prefix;
|
|
35
|
+
};
|
|
36
|
+
export const wordMatch = (corpus, match) => ({
|
|
37
|
+
sql: `m.id IN (SELECT rowid FROM ${corpus.words} WHERE ${corpus.words} MATCH ?)`,
|
|
38
|
+
params: [`normalized_text : (${match})`],
|
|
39
|
+
exact: true,
|
|
40
|
+
fts: match,
|
|
41
|
+
});
|
|
42
|
+
// The vocabulary is the whole store's, so a chat or date filter does not shorten it.
|
|
43
|
+
const tooManyWords = ({ field, operator, value, span }, alone) => {
|
|
44
|
+
const term = `${field}:${operator === "regex" ? `/${value}/` : value}`;
|
|
45
|
+
throw new CliError("validation_error", `search: ${term}${alone ? " matches" : " and the patterns before it match"} more than ${QUERY_LIMITS.expansions} indexed words, the term expansions budget — use a longer prefix, or body:/…/ inside one chat`, {
|
|
46
|
+
reason: "query.too-large",
|
|
47
|
+
budget: "term expansions",
|
|
48
|
+
complete: false,
|
|
49
|
+
term,
|
|
50
|
+
limit: QUERY_LIMITS.expansions,
|
|
51
|
+
span,
|
|
52
|
+
});
|
|
53
|
+
};
|
|
54
|
+
const bound = (sql, ...params) => ({ sql, params, exact: true });
|
|
55
|
+
const always = (fragment) => ({ fragment });
|
|
56
|
+
// The items whose mentions match: an email by its text; a message by its text, files and voice notes.
|
|
57
|
+
const mentioned = ({ mail }, where, params) => mail
|
|
58
|
+
? bound(`m.id IN (SELECT mn.source_id FROM mentions mn WHERE mn.source_type='email' AND ${where})`, ...params)
|
|
59
|
+
: bound(`m.id IN (SELECT mn.source_id FROM mentions mn WHERE mn.source_type='message' AND ${where} ` +
|
|
60
|
+
"UNION SELECT a.attachable_id FROM mentions mn JOIN attachments a ON a.id=mn.source_id " +
|
|
61
|
+
`AND a.attachable_type='message' WHERE mn.source_type='attachment' AND ${where})`, ...params, ...params);
|
|
62
|
+
const stemsOf = ({ execution }, text) => execution.stemmer?.phrases(text);
|
|
63
|
+
const stemmedText = (node, scope) => {
|
|
64
|
+
const { execution, corpus } = scope;
|
|
65
|
+
if (!execution.stemmer && !execution.unstemmed)
|
|
66
|
+
throw new Error("a stemmed leaf reached the compiler without the store's stemmer");
|
|
67
|
+
const text = normalize(node.value);
|
|
68
|
+
const stems = stemsOf(scope, node.value);
|
|
69
|
+
// Words OR stems: two spellings can fold one word to different stems, and every exact hit must stay.
|
|
70
|
+
return always(/[\p{L}\p{N}]/u.test(text)
|
|
71
|
+
? scope.everywhere(node, text, {
|
|
72
|
+
sql: `m.id IN (SELECT rowid FROM ${corpus.words} WHERE ${corpus.words} MATCH ?)${stems ? ` OR m.id IN (SELECT rowid FROM ${corpus.stems} WHERE ${corpus.stems} MATCH ?)` : ""}`,
|
|
73
|
+
params: [`normalized_text : (${quoted(text)})`, ...(stems ? [`stems : (${stems})`] : [])],
|
|
74
|
+
exact: true,
|
|
75
|
+
fts: quoted(text),
|
|
76
|
+
...(stems ? { stems } : {}),
|
|
77
|
+
})
|
|
78
|
+
: bound("0"));
|
|
79
|
+
};
|
|
80
|
+
const words = (node, scope) => {
|
|
81
|
+
const { operator, value } = node;
|
|
82
|
+
const { corpus } = scope;
|
|
83
|
+
if (value === "")
|
|
84
|
+
return always(bound("0"));
|
|
85
|
+
if (isStemmed(node))
|
|
86
|
+
return stemmedText(node, scope);
|
|
87
|
+
if (operator === "term" || operator === "phrase") {
|
|
88
|
+
const text = normalize(value);
|
|
89
|
+
const stems = stemsOf(scope, value);
|
|
90
|
+
return always(/[\p{L}\p{N}]/u.test(text)
|
|
91
|
+
? scope.everywhere(node, text, { ...wordMatch(corpus, quoted(text)), ...(stems ? { stems } : {}) })
|
|
92
|
+
: bound("0"));
|
|
93
|
+
}
|
|
94
|
+
const pattern = operator === "wildcard" ? wildcardPattern(normalize(value)) : foldRegex(value, node.span);
|
|
95
|
+
const automaton = scope.patternOf(pattern, node);
|
|
96
|
+
const cached = scope.expanded.get(pattern);
|
|
97
|
+
if (cached)
|
|
98
|
+
return { node, fragment: cached };
|
|
99
|
+
const prefix = prefixOf(pattern);
|
|
100
|
+
const terms = scope.database
|
|
101
|
+
.prepare(`SELECT term FROM ${corpus.vocab} WHERE col='normalized_text'${prefix ? " AND term>=? AND term<=?" : ""} ORDER BY term LIMIT ?`)
|
|
102
|
+
.all(...(prefix ? [prefix, `${prefix}\u{10ffff}`] : []), QUERY_LIMITS.expansions + 1);
|
|
103
|
+
if (scope.expand(terms.length) > QUERY_LIMITS.expansions)
|
|
104
|
+
tooManyWords(node, terms.length > QUERY_LIMITS.expansions);
|
|
105
|
+
const matches = terms.flatMap(({ term }) => {
|
|
106
|
+
scope.check();
|
|
107
|
+
return automaton.test(String(term), scope.budget) ? [quoted(String(term))] : [];
|
|
108
|
+
});
|
|
109
|
+
const fragment = matches.length ? wordMatch(corpus, matches.join(" OR ")) : bound("0");
|
|
110
|
+
scope.expanded.set(pattern, fragment);
|
|
111
|
+
return always(fragment);
|
|
112
|
+
};
|
|
113
|
+
const body = (node, scope) => {
|
|
114
|
+
const { operator, value } = node;
|
|
115
|
+
if (value === "")
|
|
116
|
+
return always(bound("m.text = ?", ""));
|
|
117
|
+
if (operator === "term" || operator === "phrase")
|
|
118
|
+
return always(bound("m.text = ?", value));
|
|
119
|
+
const automaton = scope.patternOf(operator === "wildcard" ? wildcardPattern(value) : value, node);
|
|
120
|
+
return { fragment: { sql: "1", params: [], exact: false }, test: (text) => automaton.test(text, scope.budget) };
|
|
121
|
+
};
|
|
122
|
+
const preset = ({ value }, { budget }) => ({
|
|
123
|
+
fragment: { sql: "1", params: [], exact: false },
|
|
124
|
+
test: (text, attachments) => {
|
|
125
|
+
budget.work += text.length;
|
|
126
|
+
if (budget.work > QUERY_LIMITS.work)
|
|
127
|
+
exhausted("detector work");
|
|
128
|
+
return PRESETS[value.toLowerCase()]?.candidate(text, attachments) ?? false;
|
|
129
|
+
},
|
|
130
|
+
});
|
|
131
|
+
const attachmentColumn = (column) => (node, scope) => {
|
|
132
|
+
const { operator, value } = node;
|
|
133
|
+
const { database, execution, corpus, budget, boundedAttachments } = scope;
|
|
134
|
+
const wanted = normalize(value);
|
|
135
|
+
const automaton = operator === "wildcard" || operator === "regex"
|
|
136
|
+
? scope.patternOf(operator === "wildcard" ? wildcardPattern(wanted) : foldRegex(value, node.span), node)
|
|
137
|
+
: undefined;
|
|
138
|
+
const fits = (known) => {
|
|
139
|
+
const name = normalize(known);
|
|
140
|
+
budget.work += name.length;
|
|
141
|
+
if (budget.work > QUERY_LIMITS.work)
|
|
142
|
+
exhausted("detector work");
|
|
143
|
+
if (automaton)
|
|
144
|
+
return automaton.test(name, budget);
|
|
145
|
+
return name === wanted || (column === "mime" && !wanted.includes("/") && name.startsWith(`${wanted}/`));
|
|
146
|
+
};
|
|
147
|
+
let accounts = combine(execution.accounts.map(({ provider, account }) => bound("ac.provider=? AND ac.external_id=?", provider, account)), "OR");
|
|
148
|
+
if (boundedAttachments && execution.chat) {
|
|
149
|
+
const chat = execution.chat;
|
|
150
|
+
accounts = combine([
|
|
151
|
+
accounts,
|
|
152
|
+
bound(`ac.provider=? AND ac.external_id=? AND m.chat_id IN (SELECT id FROM ${corpus.threads} WHERE account_id=ac.id AND external_id=?)`, chat.account.provider, chat.account.account, chat.chatId),
|
|
153
|
+
], "AND");
|
|
154
|
+
}
|
|
155
|
+
const page = database.prepare(`SELECT att.id AS id, att.attachable_id AS message, att.${column} AS value FROM attachments att JOIN ${corpus.rows} m ON m.id=att.attachable_id AND att.attachable_type='${corpus.item}' JOIN accounts ac ON ac.id=m.account_id WHERE att.id > ? AND att.${column} IS NOT NULL AND m.deleted_at IS NULL AND ${accounts.sql} ORDER BY att.id LIMIT 5000`);
|
|
156
|
+
const messages = new Set();
|
|
157
|
+
for (let rows = page.all(0, ...accounts.params); rows.length > 0;) {
|
|
158
|
+
scope.check();
|
|
159
|
+
for (const row of rows) {
|
|
160
|
+
if (fits(String(row.value)))
|
|
161
|
+
messages.add(Number(row.message));
|
|
162
|
+
if (boundedAttachments && messages.size > QUERY_LIMITS.candidates)
|
|
163
|
+
exhausted("attachment message keys");
|
|
164
|
+
}
|
|
165
|
+
rows = page.all(Number(rows.at(-1)?.id), ...accounts.params);
|
|
166
|
+
}
|
|
167
|
+
return always(bound("m.id IN (SELECT value FROM json_each(?))", JSON.stringify([...messages])));
|
|
168
|
+
};
|
|
169
|
+
const size = (node, { corpus }) => {
|
|
170
|
+
const { operator, value } = node;
|
|
171
|
+
const conditions = operator === "range"
|
|
172
|
+
? [
|
|
173
|
+
...(value === "*"
|
|
174
|
+
? []
|
|
175
|
+
: [bound(`att.size ${node.lower_inclusive ? ">=" : ">"} ?`, parseBytes(value, node.span))]),
|
|
176
|
+
...(node.upper === undefined || node.upper === "*"
|
|
177
|
+
? []
|
|
178
|
+
: [bound(`att.size ${node.upper_inclusive ? "<=" : "<"} ?`, parseBytes(node.upper, node.span))]),
|
|
179
|
+
]
|
|
180
|
+
: [bound("att.size = ?", parseBytes(value, node.span))];
|
|
181
|
+
const range = combine(conditions, "AND");
|
|
182
|
+
return always(bound(`EXISTS (SELECT 1 FROM attachments att WHERE att.attachable_type='${corpus.item}' AND att.attachable_id=m.id AND att.size IS NOT NULL AND ${range.sql})`, ...range.params));
|
|
183
|
+
};
|
|
184
|
+
const attachmentText = (which) => ({ value }, scope) => {
|
|
185
|
+
const text = normalize(value);
|
|
186
|
+
// Never `fts`: the ranking ANDs every required word into message_words, where a file's words are not.
|
|
187
|
+
const set = scope.attachmentWords(quoted(text), which);
|
|
188
|
+
return always(/[\p{L}\p{N}]/u.test(text) ? bound(`m.id IN (${set.sql})`, ...set.params) : bound("0"));
|
|
189
|
+
};
|
|
190
|
+
const date = (node) => {
|
|
191
|
+
const range = node.resolution?.date;
|
|
192
|
+
if (!range)
|
|
193
|
+
searchError("query.invalid-ast", node.span);
|
|
194
|
+
const conditions = [];
|
|
195
|
+
if (range.lower !== undefined)
|
|
196
|
+
conditions.push(bound(`m.sent_at ${range.lower_inclusive ? ">=" : ">"} ?`, range.lower));
|
|
197
|
+
if (range.upper !== undefined)
|
|
198
|
+
conditions.push(bound(`m.sent_at ${range.upper_inclusive ? "<=" : "<"} ?`, range.upper));
|
|
199
|
+
return always(combine(conditions, "AND"));
|
|
200
|
+
};
|
|
201
|
+
const chat = (node, { corpus }) => {
|
|
202
|
+
const found = node.resolution?.chat;
|
|
203
|
+
if (!found)
|
|
204
|
+
searchError("query.invalid-ast", node.span);
|
|
205
|
+
return always(bound(`m.chat_id IN (SELECT cc.id FROM ${corpus.threads} cc JOIN accounts aa ON aa.id=cc.account_id WHERE aa.provider=? AND aa.external_id=? AND cc.external_id=?)`, found.account.provider, found.account.account, found.chatId));
|
|
206
|
+
};
|
|
207
|
+
const from = (node) => {
|
|
208
|
+
const sender = node.resolution?.sender;
|
|
209
|
+
if (node.resolution?.outgoing)
|
|
210
|
+
return always(bound("m.outgoing = 1"));
|
|
211
|
+
if (!sender)
|
|
212
|
+
searchError("query.invalid-ast", node.span);
|
|
213
|
+
return always(bound("m.sender_identity_id IN (SELECT ii.id FROM identities ii WHERE ii.provider=? AND ii.external_id=?)", sender.provider, sender.id));
|
|
214
|
+
};
|
|
215
|
+
const mentions = (node, scope) => {
|
|
216
|
+
const [type, id = ""] = node.value.split(":");
|
|
217
|
+
const pk = Number(id);
|
|
218
|
+
// A person is mentioned by name, or by a phone or an address that is theirs.
|
|
219
|
+
const linked = {
|
|
220
|
+
person: [
|
|
221
|
+
"(mn.target_type = 'person' AND mn.target_id = ?) OR (mn.target_type = 'identity' " +
|
|
222
|
+
"AND mn.target_id IN (SELECT identity_id FROM identity_links WHERE person_id = ?))",
|
|
223
|
+
[pk, pk],
|
|
224
|
+
],
|
|
225
|
+
organization: [
|
|
226
|
+
"mn.target_type = 'identity' AND mn.target_id IN " +
|
|
227
|
+
"(SELECT identity_id FROM organization_identities WHERE organization_id = ?)",
|
|
228
|
+
[pk],
|
|
229
|
+
],
|
|
230
|
+
document: ["mn.target_type = 'document' AND mn.target_id = ?", [pk]],
|
|
231
|
+
};
|
|
232
|
+
const target = linked[type ?? ""];
|
|
233
|
+
if (target === undefined)
|
|
234
|
+
searchError("query.invalid-reference", node.span);
|
|
235
|
+
return always(mentioned(scope, `mn.status = 'linked' AND (${target[0]})`, target[1]));
|
|
236
|
+
};
|
|
237
|
+
const link = (field) => ({ value }, scope) => always({
|
|
238
|
+
...linkMatch(field, value, scope.mail, (where, params) => mentioned(scope, where, params)),
|
|
239
|
+
exact: true,
|
|
240
|
+
});
|
|
241
|
+
const found = ({ field, value }, scope) => {
|
|
242
|
+
const match = field === "domain" ? undefined : valueMatch(scope.database, value);
|
|
243
|
+
return always(match === undefined
|
|
244
|
+
? mentioned(scope, "mn.domain = ? AND mn.status <> 'dismissed'", [siteOf(value.toLowerCase())])
|
|
245
|
+
: mentioned(scope, `mn.kind = ? AND ${match.sql} AND mn.status <> 'dismissed'`, [field, ...match.params]));
|
|
246
|
+
};
|
|
247
|
+
const tag = (node, { corpus }) => {
|
|
248
|
+
const name = tagOf(node.value);
|
|
249
|
+
if (name === undefined)
|
|
250
|
+
searchError("query.invalid-tag", node.span);
|
|
251
|
+
return always(bound(`m.id IN (SELECT tg.taggable_id FROM taggings tg JOIN tags t ON t.id=tg.tag_id WHERE t.name=? AND tg.taggable_type='${corpus.item}') OR ` +
|
|
252
|
+
`m.chat_id IN (SELECT tg.taggable_id FROM taggings tg JOIN tags t ON t.id=tg.tag_id WHERE t.name=? AND tg.taggable_type='${corpus.thread}') OR ` +
|
|
253
|
+
"m.sender_identity_id IN (SELECT tg.taggable_id FROM taggings tg JOIN tags t ON t.id=tg.tag_id WHERE t.name=? AND tg.taggable_type='identity')", name, name, name));
|
|
254
|
+
};
|
|
255
|
+
const messengerOnly = (compile) => (node, scope) => {
|
|
256
|
+
if (scope.mail)
|
|
257
|
+
throw new CliError("validation_error", `search: ${node.field}: is a messenger field — mail has no ${node.field}`, {
|
|
258
|
+
reason: "query.unsupported-field",
|
|
259
|
+
span: node.span,
|
|
260
|
+
});
|
|
261
|
+
return compile(node, scope);
|
|
262
|
+
};
|
|
263
|
+
const topic = messengerOnly(({ value }) => always(bound("m.thread_external_id = ?", value)));
|
|
264
|
+
const kind = messengerOnly(({ value }) => always(bound("CASE WHEN json_extract(c.metadata,'$.peerKind') IN ('private','saved','bot','service','group','channel','unknown') THEN json_extract(c.metadata,'$.peerKind') WHEN c.kind='dialog' AND json_extract(c.metadata,'$.isBot')=1 THEN 'bot' WHEN c.kind='dialog' THEN 'private' ELSE c.kind END = ?", value.toLowerCase())));
|
|
265
|
+
const has = ({ value }, { corpus, mail }) => {
|
|
266
|
+
const wanted = value.toLowerCase();
|
|
267
|
+
return always(wanted === "text"
|
|
268
|
+
? bound("length(trim(coalesce(m.text,''))) > 0")
|
|
269
|
+
: wanted === "link"
|
|
270
|
+
? bound(`(${mail ? "m.text LIKE '%' || ? || '%'" : "m.id IN (SELECT rowid FROM messages_fts WHERE messages_fts MATCH ?)"} OR EXISTS (SELECT 1 FROM attachments att WHERE att.attachable_type='${corpus.item}' AND att.attachable_id=m.id AND att.kind IN ('share','webpage')))`, mail ? "://" : quoted("://"))
|
|
271
|
+
: wanted === "attachment"
|
|
272
|
+
? bound(`EXISTS (SELECT 1 FROM attachments att WHERE att.attachable_type='${corpus.item}' AND att.attachable_id=m.id)`)
|
|
273
|
+
: bound(`EXISTS (SELECT 1 FROM attachments att WHERE att.attachable_type='${corpus.item}' AND att.attachable_id=m.id AND att.kind IN (${storedKinds(wanted)
|
|
274
|
+
.map(() => "?")
|
|
275
|
+
.join(",")}))`, ...storedKinds(wanted)));
|
|
276
|
+
};
|
|
277
|
+
const inSourceField = ({ value }, { execution }) => {
|
|
278
|
+
const source = value.toLowerCase();
|
|
279
|
+
const chosen = execution.accounts.filter(({ provider }) => inSource(source, provider));
|
|
280
|
+
return always(chosen.length
|
|
281
|
+
? combine(chosen.map(({ provider, account }) => bound("ac.provider=? AND ac.external_id=?", provider, account)), "OR")
|
|
282
|
+
: bound("0"));
|
|
283
|
+
};
|
|
284
|
+
const recipient = (node, { mail }) => {
|
|
285
|
+
const who = node.resolution?.sender;
|
|
286
|
+
if (!who)
|
|
287
|
+
searchError("query.invalid-ast", node.span);
|
|
288
|
+
return always(mail
|
|
289
|
+
? bound("m.id IN (SELECT r.email_id FROM email_recipients r JOIN identities ii ON ii.id = r.identity_id WHERE r.role = ? AND ii.provider = ? AND ii.external_id = ?)", node.field, who.provider, who.id)
|
|
290
|
+
: bound("0"));
|
|
291
|
+
};
|
|
292
|
+
// What a page says about itself, and whether a note is written or a file, exist for notes only.
|
|
293
|
+
const notesOnly = () => always(bound("0"));
|
|
294
|
+
const mailbox = ({ value }, { mail }) => always(mail
|
|
295
|
+
? bound(
|
|
296
|
+
// Not tied to m.account_id: a correlated subquery re-reads every mailbox link for each email (minutes on
|
|
297
|
+
// 880k links), and an email only ever links to its own account's mailboxes anyway.
|
|
298
|
+
`m.id IN (SELECT em.email_id FROM email_mailboxes em WHERE em.mailbox_id IN
|
|
299
|
+
(SELECT b.id FROM mailboxes b WHERE lower(b.external_id) = lower(?) OR lower(b.name) = lower(?)))`, value, value)
|
|
300
|
+
: bound("0"));
|
|
301
|
+
const is = ({ value }, { mail }) => {
|
|
302
|
+
const state = value.toLowerCase();
|
|
303
|
+
return always(!mail ? bound("0") : state === "starred" ? bound("m.flagged = 1") : bound("m.read = ?", state === "read" ? 1 : 0));
|
|
304
|
+
};
|
|
305
|
+
const subject = ({ operator, value }, { corpus, mail }) => {
|
|
306
|
+
const wanted = normalize(value);
|
|
307
|
+
const parts = wanted.match(/[\p{L}\p{N}]+/gu) ?? [];
|
|
308
|
+
if (!mail || !parts.length)
|
|
309
|
+
return always(bound("0"));
|
|
310
|
+
// The word index holds subject and body together: it narrows, the subject itself decides.
|
|
311
|
+
return {
|
|
312
|
+
fragment: { ...wordMatch(corpus, parts.map(quoted).join(" AND ")), exact: false },
|
|
313
|
+
test: (text) => {
|
|
314
|
+
const heading = normalize(text.slice(0, Math.max(0, text.indexOf("\n\n"))));
|
|
315
|
+
return operator === "phrase"
|
|
316
|
+
? heading.includes(wanted)
|
|
317
|
+
: parts.every((word) => new RegExp(`(^|[^\\p{L}\\p{N}])${word}`, "u").test(heading));
|
|
318
|
+
},
|
|
319
|
+
};
|
|
320
|
+
};
|
|
321
|
+
/** One compiler per field of `QUERY_FIELDS`, by its name: a leaf compiles by a lookup, never a branch. */
|
|
322
|
+
export const FIELD_COMPILERS = {
|
|
323
|
+
text: words,
|
|
324
|
+
exact: words,
|
|
325
|
+
body,
|
|
326
|
+
preset,
|
|
327
|
+
filename: attachmentColumn("name"),
|
|
328
|
+
mime: attachmentColumn("mime"),
|
|
329
|
+
size,
|
|
330
|
+
content: attachmentText("file"),
|
|
331
|
+
transcript: attachmentText("transcript"),
|
|
332
|
+
date,
|
|
333
|
+
chat,
|
|
334
|
+
from,
|
|
335
|
+
mentions,
|
|
336
|
+
url: link("url"),
|
|
337
|
+
link: link("link"),
|
|
338
|
+
phone: found,
|
|
339
|
+
email: found,
|
|
340
|
+
domain: found,
|
|
341
|
+
tag,
|
|
342
|
+
topic,
|
|
343
|
+
kind,
|
|
344
|
+
has,
|
|
345
|
+
in: inSourceField,
|
|
346
|
+
to: recipient,
|
|
347
|
+
cc: recipient,
|
|
348
|
+
bcc: recipient,
|
|
349
|
+
title: notesOnly,
|
|
350
|
+
site: notesOnly,
|
|
351
|
+
lang: notesOnly,
|
|
352
|
+
author: notesOnly,
|
|
353
|
+
keyword: notesOnly,
|
|
354
|
+
source: notesOnly,
|
|
355
|
+
mailbox,
|
|
356
|
+
label: mailbox,
|
|
357
|
+
is,
|
|
358
|
+
subject,
|
|
359
|
+
};
|
|
360
|
+
//# sourceMappingURL=lucene-fields.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lucene-fields.js","sourceRoot":"","sources":["../../../src/store/sqlite/lucene-fields.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,19 +1,9 @@
|
|
|
1
1
|
import type { Page } from "../../domain/models.js";
|
|
2
2
|
import type { QueryExecution } from "../../search/lucene/resolved.js";
|
|
3
3
|
import type { SqlValue } from "../driver.js";
|
|
4
|
-
import type { ScoredHit } from "../store.js";
|
|
5
4
|
import type { StoreContext } from "./open.js";
|
|
6
|
-
|
|
7
|
-
export
|
|
8
|
-
rows: string;
|
|
9
|
-
threads: string;
|
|
10
|
-
words: string;
|
|
11
|
-
stems: string;
|
|
12
|
-
vocab: string;
|
|
13
|
-
item: string;
|
|
14
|
-
thread: string;
|
|
15
|
-
}
|
|
16
|
-
export declare const prefixOf: (pattern: string) => string;
|
|
5
|
+
import type { ScoredHit } from "./words.js";
|
|
6
|
+
export { type Corpus, prefixOf } from "./lucene-fields.js";
|
|
17
7
|
export type QueryGrouping = "chat" | "sender" | "time";
|
|
18
8
|
export interface QueryGroup {
|
|
19
9
|
provider?: string;
|
|
@@ -34,5 +24,4 @@ interface QuerySelection {
|
|
|
34
24
|
}
|
|
35
25
|
/** The matcher and its consumer run synchronously in one read snapshot; exact keys stay in SQL. */
|
|
36
26
|
export declare const withQuerySelection: <T>(context: StoreContext, execution: QueryExecution, consume: (selection: QuerySelection, check: () => void) => T) => T;
|
|
37
|
-
export {};
|
|
38
27
|
//# sourceMappingURL=lucene.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lucene.d.ts","sourceRoot":"","sources":["../../../src/store/sqlite/lucene.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"lucene.d.ts","sourceRoot":"","sources":["../../../src/store/sqlite/lucene.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,wBAAwB,CAAA;AAElD,OAAO,KAAK,EAAE,cAAc,EAAmC,MAAM,iCAAiC,CAAA;AAGtG,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAA;AAa5C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AAG7C,OAAO,KAAK,EAAc,SAAS,EAAE,MAAM,YAAY,CAAA;AAEvD,OAAO,EAAE,KAAK,MAAM,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AA0B1D,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,QAAQ,GAAG,MAAM,CAAA;AACtD,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,EAAE,EAAE,MAAM,GAAG,IAAI,CAAA;IACjB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,KAAK,EAAE,MAAM,CAAA;CACd;AAcD,eAAO,MAAM,UAAU,YAAa,YAAY,aAAa,cAAc,KAAG,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAC3C,CAAA;AAC1D,iGAAiG;AACjG,eAAO,MAAM,UAAU,YACZ,YAAY,aACV,cAAc,MACrB,aAAa,KAChB,OAAO,CAAC,UAAU,EAAE,CAA8D,CAAA;AACrF,oGAAoG;AACpG,eAAO,MAAM,eAAe,YAAa,YAAY,aAAa,cAAc,KAAG,OAAO,CAAC,MAAM,EAAE,CACzC,CAAA;AAoa1D,UAAU,cAAc;IACtB,GAAG,EAAE,MAAM,CAAA;IACX,MAAM,EAAE,QAAQ,EAAE,CAAA;CACnB;AAED,mGAAmG;AACnG,eAAO,MAAM,kBAAkB,GAAI,CAAC,WACzB,YAAY,aACV,cAAc,WAChB,CAAC,SAAS,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,IAAI,KAAK,CAAC,KAC3D,CAyDF,CAAA"}
|