@wirecat/cli-core 0.276.0 → 0.278.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/cli/index.d.ts +1 -0
- 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/json-fields.d.ts +5 -3
- package/dist/cli/json-fields.d.ts.map +1 -1
- package/dist/cli/json-fields.js +8 -5
- package/dist/cli/json-fields.js.map +1 -1
- package/dist/meetings/index.d.ts +2 -0
- package/dist/meetings/index.d.ts.map +1 -1
- package/dist/meetings/index.js +2 -0
- package/dist/meetings/index.js.map +1 -1
- package/dist/meetings/preparation-context.d.ts +55 -0
- package/dist/meetings/preparation-context.d.ts.map +1 -0
- package/dist/meetings/preparation-context.js +25 -0
- package/dist/meetings/preparation-context.js.map +1 -0
- package/dist/meetings/series-history.d.ts +33 -0
- package/dist/meetings/series-history.d.ts.map +1 -0
- package/dist/meetings/series-history.js +24 -0
- package/dist/meetings/series-history.js.map +1 -0
- package/dist/services/index.d.ts +2 -0
- package/dist/services/index.d.ts.map +1 -1
- package/dist/services/index.js +1 -0
- package/dist/services/index.js.map +1 -1
- package/dist/services/meeting-preparation-types.d.ts +53 -0
- package/dist/services/meeting-preparation-types.d.ts.map +1 -0
- package/dist/services/meeting-preparation-types.js +2 -0
- package/dist/services/meeting-preparation-types.js.map +1 -0
- package/dist/services/meeting-preparation-validation.d.ts +23 -0
- package/dist/services/meeting-preparation-validation.d.ts.map +1 -0
- package/dist/services/meeting-preparation-validation.js +56 -0
- package/dist/services/meeting-preparation-validation.js.map +1 -0
- package/dist/services/meeting-preparation.d.ts +7 -0
- package/dist/services/meeting-preparation.d.ts.map +1 -0
- package/dist/services/meeting-preparation.js +125 -0
- package/dist/services/meeting-preparation.js.map +1 -0
- package/dist/store/index.d.ts +1 -0
- package/dist/store/index.d.ts.map +1 -1
- package/dist/store/index.js.map +1 -1
- package/dist/store/sqlite/email-index.d.ts +23 -0
- package/dist/store/sqlite/email-index.d.ts.map +1 -0
- package/dist/store/sqlite/email-index.js +160 -0
- package/dist/store/sqlite/email-index.js.map +1 -0
- package/dist/store/sqlite/emails.d.ts +10 -1
- package/dist/store/sqlite/emails.d.ts.map +1 -1
- package/dist/store/sqlite/emails.js +5 -157
- package/dist/store/sqlite/emails.js.map +1 -1
- package/dist/store/sqlite/mail-rules.d.ts +53 -0
- package/dist/store/sqlite/mail-rules.d.ts.map +1 -0
- package/dist/store/sqlite/mail-rules.js +80 -0
- package/dist/store/sqlite/mail-rules.js.map +1 -0
- 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/meeting-preparation-context.d.ts +4 -0
- package/dist/store/sqlite/meeting-preparation-context.d.ts.map +1 -0
- package/dist/store/sqlite/meeting-preparation-context.js +50 -0
- package/dist/store/sqlite/meeting-preparation-context.js.map +1 -0
- package/dist/store/sqlite/meeting-series-history.d.ts +4 -0
- package/dist/store/sqlite/meeting-series-history.d.ts.map +1 -0
- package/dist/store/sqlite/meeting-series-history.js +67 -0
- package/dist/store/sqlite/meeting-series-history.js.map +1 -0
- package/dist/store/sqlite/meetings.d.ts +3 -2
- package/dist/store/sqlite/meetings.d.ts.map +1 -1
- package/dist/store/sqlite/meetings.js +4 -0
- package/dist/store/sqlite/meetings.js.map +1 -1
- package/dist/store/sqlite/mentions.d.ts.map +1 -1
- package/dist/store/sqlite/mentions.js +4 -2
- package/dist/store/sqlite/mentions.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/preparation-context-queries.d.ts +51 -0
- package/dist/store/sqlite/preparation-context-queries.d.ts.map +1 -0
- package/dist/store/sqlite/preparation-context-queries.js +51 -0
- package/dist/store/sqlite/preparation-context-queries.js.map +1 -0
- package/dist/store/sqlite/schema.d.ts +183 -0
- package/dist/store/sqlite/schema.d.ts.map +1 -1
- package/dist/store/sqlite/schema.js +17 -0
- package/dist/store/sqlite/schema.js.map +1 -1
- package/dist/store/store.d.ts +2 -3
- package/dist/store/store.d.ts.map +1 -1
- package/dist/store/store.js +2 -1
- package/dist/store/store.js.map +1 -1
- package/package.json +1 -1
- package/parity.json +8 -24
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { MeetingPreparationRequest } from "./meeting-preparation-types.js";
|
|
2
|
+
export declare const preparationCancelled: (signal?: AbortSignal) => void;
|
|
3
|
+
export declare const preparationRequest: (accountId: number, externalId: string, original: MeetingPreparationRequest) => {
|
|
4
|
+
after: number;
|
|
5
|
+
until: number;
|
|
6
|
+
historyAfter: number;
|
|
7
|
+
signal?: AbortSignal;
|
|
8
|
+
meetings: number;
|
|
9
|
+
cues: number;
|
|
10
|
+
contextLimit: number;
|
|
11
|
+
bytes: number;
|
|
12
|
+
maxReadBytes: number;
|
|
13
|
+
history: {
|
|
14
|
+
accountId: number;
|
|
15
|
+
externalId: string;
|
|
16
|
+
after: number;
|
|
17
|
+
before: number;
|
|
18
|
+
signal?: AbortSignal;
|
|
19
|
+
limit: number;
|
|
20
|
+
maxReadBytes: number;
|
|
21
|
+
};
|
|
22
|
+
};
|
|
23
|
+
//# sourceMappingURL=meeting-preparation-validation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"meeting-preparation-validation.d.ts","sourceRoot":"","sources":["../../src/services/meeting-preparation-validation.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAA;AAE/E,eAAO,MAAM,oBAAoB,YAAa,WAAW,KAAG,IAO3D,CAAA;AACD,eAAO,MAAM,kBAAkB,cAAe,MAAM,cAAc,MAAM,YAAY,yBAAyB;;;;;;;;;;;;;;;;;;;CA8C5G,CAAA"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { CliError } from "@wirecat/cli-base";
|
|
2
|
+
import { validateMeetingSeriesHistory } from "../meetings/index.js";
|
|
3
|
+
export const preparationCancelled = (signal) => {
|
|
4
|
+
if (!signal?.aborted)
|
|
5
|
+
return;
|
|
6
|
+
if (signal.reason instanceof CliError)
|
|
7
|
+
throw signal.reason;
|
|
8
|
+
throw new CliError(signal.reason instanceof Error && signal.reason.name === "TimeoutError" ? "timeout" : "cancelled", "Meeting preparation was interrupted");
|
|
9
|
+
};
|
|
10
|
+
export const preparationRequest = (accountId, externalId, original) => {
|
|
11
|
+
if (!original || typeof original !== "object" || Array.isArray(original))
|
|
12
|
+
throw new CliError("validation_error", "meeting preparation request is required");
|
|
13
|
+
const input = { ...original };
|
|
14
|
+
for (const key of Object.keys(input))
|
|
15
|
+
if (![
|
|
16
|
+
"after",
|
|
17
|
+
"until",
|
|
18
|
+
"historyAfter",
|
|
19
|
+
"meetings",
|
|
20
|
+
"cues",
|
|
21
|
+
"contextLimit",
|
|
22
|
+
"maxReadBytes",
|
|
23
|
+
"bytes",
|
|
24
|
+
"signal",
|
|
25
|
+
].includes(key))
|
|
26
|
+
throw new CliError("validation_error", `unknown preparation field: ${key}`);
|
|
27
|
+
if (input.signal !== undefined && !(input.signal instanceof AbortSignal))
|
|
28
|
+
throw new CliError("validation_error", "signal must be an AbortSignal");
|
|
29
|
+
preparationCancelled(input.signal);
|
|
30
|
+
const bounded = (value, fallback, max, name) => {
|
|
31
|
+
const result = value === undefined ? fallback : value;
|
|
32
|
+
if (!Number.isSafeInteger(result) || result < 1 || result > max)
|
|
33
|
+
throw new CliError("validation_error", `${name} must be an integer from 1 to ${max}`);
|
|
34
|
+
return result;
|
|
35
|
+
};
|
|
36
|
+
const meetings = bounded(input.meetings, 5, 20, "meetings");
|
|
37
|
+
const cues = bounded(input.cues, 10, 100, "cues");
|
|
38
|
+
const contextLimit = bounded(input.contextLimit, 20, 100, "contextLimit");
|
|
39
|
+
const bytes = bounded(input.bytes, 65536, 4194304, "bytes");
|
|
40
|
+
if (bytes < 4096)
|
|
41
|
+
throw new CliError("validation_error", "bytes must be at least 4096");
|
|
42
|
+
const history = validateMeetingSeriesHistory({
|
|
43
|
+
accountId,
|
|
44
|
+
externalId,
|
|
45
|
+
after: input.historyAfter,
|
|
46
|
+
before: input.after,
|
|
47
|
+
limit: meetings,
|
|
48
|
+
maxReadBytes: input.maxReadBytes,
|
|
49
|
+
signal: input.signal,
|
|
50
|
+
});
|
|
51
|
+
if (!Number.isSafeInteger(input.until) || Math.abs(input.until) > 8640000000000000 || input.until <= input.after)
|
|
52
|
+
throw new CliError("validation_error", "until must be an absolute timestamp later than after");
|
|
53
|
+
preparationCancelled(input.signal);
|
|
54
|
+
return { ...input, meetings, cues, contextLimit, bytes, maxReadBytes: history.maxReadBytes, history };
|
|
55
|
+
};
|
|
56
|
+
//# sourceMappingURL=meeting-preparation-validation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"meeting-preparation-validation.js","sourceRoot":"","sources":["../../src/services/meeting-preparation-validation.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { type MeetingProviderScope } from "../meetings/index.js";
|
|
2
|
+
import type { MeetingPreparation, MeetingPreparationPorts, MeetingPreparationRequest } from "./meeting-preparation-types.js";
|
|
3
|
+
export declare const createMeetingPreparationService: (scope: MeetingProviderScope, accountId: number, ports: MeetingPreparationPorts) => {
|
|
4
|
+
scope: Readonly<MeetingProviderScope>;
|
|
5
|
+
prepare(externalId: string, original: MeetingPreparationRequest): Promise<MeetingPreparation>;
|
|
6
|
+
};
|
|
7
|
+
//# sourceMappingURL=meeting-preparation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"meeting-preparation.d.ts","sourceRoot":"","sources":["../../src/services/meeting-preparation.ts"],"names":[],"mappings":"AACA,OAAO,EAA0B,KAAK,oBAAoB,EAAwB,MAAM,sBAAsB,CAAA;AAE9G,OAAO,KAAK,EACV,kBAAkB,EAClB,uBAAuB,EACvB,yBAAyB,EAC1B,MAAM,gCAAgC,CAAA;AAKvC,eAAO,MAAM,+BAA+B,UACnC,oBAAoB,aAChB,MAAM,SACV,uBAAuB;IA2B5B,KAAK;IACC,OAAO,aAAa,MAAM,YAAY,yBAAyB,GAAG,OAAO,CAAC,kBAAkB,CAAC;CAiGtG,CAAA"}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
import { CliError } from "@wirecat/cli-base";
|
|
2
|
+
import { formatMeetingReference, snapshotMeetingScope } from "../meetings/index.js";
|
|
3
|
+
import { readMeetingEvidence } from "./meeting-evidence.js";
|
|
4
|
+
import { preparationCancelled, preparationRequest } from "./meeting-preparation-validation.js";
|
|
5
|
+
const size = (value) => Buffer.byteLength(JSON.stringify(value), "utf8");
|
|
6
|
+
export const createMeetingPreparationService = (scope, accountId, ports) => {
|
|
7
|
+
const fixed = snapshotMeetingScope(scope);
|
|
8
|
+
if (!Number.isSafeInteger(accountId) || accountId < 1)
|
|
9
|
+
throw new CliError("validation_error", "accountId must be a positive safe integer");
|
|
10
|
+
const store = ports?.meetings;
|
|
11
|
+
if (!store ||
|
|
12
|
+
[
|
|
13
|
+
"account",
|
|
14
|
+
"seriesHistory",
|
|
15
|
+
"preparationContext",
|
|
16
|
+
"meetingMetadata",
|
|
17
|
+
"transcriptMetadata",
|
|
18
|
+
"transcripts",
|
|
19
|
+
"transcriptRows",
|
|
20
|
+
].some((key) => typeof store[key] !== "function") ||
|
|
21
|
+
typeof ports?.upcoming?.next !== "function")
|
|
22
|
+
throw new CliError("configuration_error", "Meeting preparation requires bounded meeting reads and an upcoming reader");
|
|
23
|
+
if (ports.upcoming.scope?.provider !== fixed.provider || ports.upcoming.scope?.account !== fixed.account)
|
|
24
|
+
throw new CliError("configuration_error", "The upcoming reader belongs to another provider or account");
|
|
25
|
+
const next = ports.upcoming.next.bind(ports.upcoming);
|
|
26
|
+
return {
|
|
27
|
+
scope: fixed,
|
|
28
|
+
async prepare(externalId, original) {
|
|
29
|
+
const input = preparationRequest(accountId, externalId, original);
|
|
30
|
+
const { signal, meetings, cues, contextLimit, maxReadBytes, bytes } = input;
|
|
31
|
+
const owner = await store.account(accountId);
|
|
32
|
+
preparationCancelled(signal);
|
|
33
|
+
if (!owner || owner.provider !== fixed.provider || owner.account !== fixed.account)
|
|
34
|
+
throw new CliError("not_found", "The selected meeting account is unavailable");
|
|
35
|
+
const upcoming = await next(externalId, { after: input.after, until: input.until, maxReadBytes, signal });
|
|
36
|
+
preparationCancelled(signal);
|
|
37
|
+
if (upcoming.scope.provider !== fixed.provider ||
|
|
38
|
+
upcoming.scope.account !== fixed.account ||
|
|
39
|
+
upcoming.meetingId !== externalId ||
|
|
40
|
+
upcoming.after !== input.after ||
|
|
41
|
+
upcoming.until !== input.until)
|
|
42
|
+
throw new CliError("invalid_response", "The upcoming reader returned another selection");
|
|
43
|
+
const history = await store.seriesHistory(input.history);
|
|
44
|
+
preparationCancelled(signal);
|
|
45
|
+
const result = {
|
|
46
|
+
schemaVersion: 1,
|
|
47
|
+
accountId,
|
|
48
|
+
upcoming,
|
|
49
|
+
series: history.series,
|
|
50
|
+
historyWindow: { after: input.historyAfter, before: input.after },
|
|
51
|
+
items: [],
|
|
52
|
+
limits: { meetings, cues, contextLimit, maxReadBytes, bytes },
|
|
53
|
+
coverage: {
|
|
54
|
+
archiveCompleteness: "unknown",
|
|
55
|
+
consistency: "live-reads",
|
|
56
|
+
historyHasMore: history.hasMore,
|
|
57
|
+
hasUndated: history.hasUndated,
|
|
58
|
+
skippedUnavailable: [],
|
|
59
|
+
outputLimited: false,
|
|
60
|
+
context: "observed-participants/confirmed-projects/accepted-meeting-subject-facts/direct-source-tasks",
|
|
61
|
+
factEvidence: "not-revalidated",
|
|
62
|
+
unqueried: ["person-history", "project-wide-context", "project-alias-candidates"],
|
|
63
|
+
},
|
|
64
|
+
};
|
|
65
|
+
if (history.items.length > meetings ||
|
|
66
|
+
(history.items.length && !history.series) ||
|
|
67
|
+
(history.series && history.series.externalId !== externalId))
|
|
68
|
+
throw new CliError("invalid_response", "The history reader returned another series or exceeded its bound");
|
|
69
|
+
if (size(result) > bytes)
|
|
70
|
+
throw new CliError("validation_error", "Preparation metadata exceeds bytes; increase the output budget");
|
|
71
|
+
if (!history.series)
|
|
72
|
+
return structuredClone(result);
|
|
73
|
+
const seriesId = history.series.id;
|
|
74
|
+
for (const meeting of history.items) {
|
|
75
|
+
preparationCancelled(signal);
|
|
76
|
+
const reference = formatMeetingReference({ type: "meeting", accountId, meetingId: meeting.id });
|
|
77
|
+
if (meeting.startedAt === null || meeting.startedAt < input.historyAfter || meeting.startedAt >= input.after)
|
|
78
|
+
throw new CliError("invalid_response", "A history entry is outside the selected window");
|
|
79
|
+
const remaining = bytes - size(result) - 512;
|
|
80
|
+
if (remaining < 2) {
|
|
81
|
+
result.coverage.outputLimited = true;
|
|
82
|
+
break;
|
|
83
|
+
}
|
|
84
|
+
try {
|
|
85
|
+
const evidence = await readMeetingEvidence(store, accountId, reference, {
|
|
86
|
+
cues,
|
|
87
|
+
bytes: remaining,
|
|
88
|
+
maxReadBytes,
|
|
89
|
+
maxTranscriptPages: 2,
|
|
90
|
+
signal,
|
|
91
|
+
});
|
|
92
|
+
preparationCancelled(signal);
|
|
93
|
+
const context = await store.preparationContext({
|
|
94
|
+
accountId,
|
|
95
|
+
meetingId: meeting.id,
|
|
96
|
+
seriesId,
|
|
97
|
+
updatedAt: meeting.updatedAt,
|
|
98
|
+
limit: contextLimit,
|
|
99
|
+
maxReadBytes,
|
|
100
|
+
signal,
|
|
101
|
+
});
|
|
102
|
+
preparationCancelled(signal);
|
|
103
|
+
const entry = { reference, meeting, evidence, context };
|
|
104
|
+
result.items.push(entry);
|
|
105
|
+
if (size(result) > bytes) {
|
|
106
|
+
result.items.pop();
|
|
107
|
+
result.coverage.outputLimited = true;
|
|
108
|
+
break;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
catch (error) {
|
|
112
|
+
preparationCancelled(signal);
|
|
113
|
+
if (!(error instanceof CliError) || error.code !== "not_found")
|
|
114
|
+
throw error;
|
|
115
|
+
result.coverage.skippedUnavailable.push(reference);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
preparationCancelled(signal);
|
|
119
|
+
if (size(result) > bytes)
|
|
120
|
+
throw new CliError("validation_error", "Preparation coverage exceeds bytes; increase the output budget");
|
|
121
|
+
return structuredClone(result);
|
|
122
|
+
},
|
|
123
|
+
};
|
|
124
|
+
};
|
|
125
|
+
//# sourceMappingURL=meeting-preparation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"meeting-preparation.js","sourceRoot":"","sources":["../../src/services/meeting-preparation.ts"],"names":[],"mappings":"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"}
|
package/dist/store/index.d.ts
CHANGED
|
@@ -17,6 +17,7 @@ export { FACT_STATUSES, FACT_TYPES } from "./sqlite/facts.js";
|
|
|
17
17
|
export type { Involvement, InvolvementStore } from "./sqlite/involvements.js";
|
|
18
18
|
export type { Annotation, KnowledgeRelation, KnowledgeStore, KnowledgeTarget, LabelledType, Organization, Project, Reminder, } from "./sqlite/knowledge.js";
|
|
19
19
|
export { ORGANIZATION_KINDS, PROJECT_TYPES, SCOPES } from "./sqlite/knowledge.js";
|
|
20
|
+
export type { MailRule, MailRuleCount, MailRuleInput, MailRulesStore } from "./sqlite/mail-rules.js";
|
|
20
21
|
export type { MeetingProjectLink, MeetingProjectsStore } from "./sqlite/meeting-projects.js";
|
|
21
22
|
export type { MeetingContextReadCapabilities, MeetingReadCapabilities, MeetingReadScope, TranscriptContextInput, TranscriptContextPage, TranscriptPage, TranscriptReadScope, TranscriptRowPage, } from "./sqlite/meeting-reads.js";
|
|
22
23
|
export type { MeetingVectorHit, MeetingVectors } from "./sqlite/meeting-vectors.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/store/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/store/index.ts"],"names":[],"mappings":"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"}
|
package/dist/store/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/store/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AACrC,OAAO,EAAE,UAAU,EAAkB,OAAO,EAAE,MAAM,iBAAiB,CAAA;AACrE,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAA;AACrC,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAA;AAErC,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAA;AACnE,OAAO,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAA;AAG/E,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AAqBnD,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAY7D,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAA;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/store/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AACrC,OAAO,EAAE,UAAU,EAAkB,OAAO,EAAE,MAAM,iBAAiB,CAAA;AACrE,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAA;AACrC,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAA;AAErC,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAA;AACnE,OAAO,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAA;AAG/E,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AAqBnD,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAY7D,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAA;AAgBjF,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AAEnF,OAAO,EAEL,WAAW,GAKZ,MAAM,yBAAyB,CAAA;AAYhC,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAA;AAChE,OAAO,EACL,eAAe,EACf,gBAAgB,EAGhB,gBAAgB,GACjB,MAAM,0BAA0B,CAAA;AAIjC,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAA;AA0BhE,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AAClG,OAAO,EAeL,SAAS,GAqBV,MAAM,YAAY,CAAA"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { type Chunk } from "../../conversations/chunks.js";
|
|
2
|
+
import type { Stemmer, Stemmers } from "../../search/stem.js";
|
|
3
|
+
import type { CacheDatabase } from "../driver.js";
|
|
4
|
+
export declare const titleOf: (subject: string | null) => string | null;
|
|
5
|
+
/**
|
|
6
|
+
* Every piece of mail: a stretch of a thread, or of one email's attachment. A thread piece holds no email of its
|
|
7
|
+
* own; `threadPieces` cuts the thread again to find which emails it spans.
|
|
8
|
+
*/
|
|
9
|
+
export declare const MAIL_PIECES = "(SELECT k.id, k.content_hash, k.chunkable_type AS type, k.chunkable_id AS owner, k.position,\n k.start_offset, k.end_offset, k.account_id, k.occurred_at, a.attachable_id AS email_id,\n CASE k.chunkable_type WHEN 'email_thread' THEN k.chunkable_id\n ELSE (SELECT email_thread_id FROM emails WHERE id = a.attachable_id) END AS thread_id\n FROM chunks k LEFT JOIN attachments a ON k.chunkable_type = 'attachment' AND a.id = k.chunkable_id\n AND a.attachable_type = 'email'\n WHERE k.chunkable_type = 'email_thread' OR a.id IS NOT NULL) p";
|
|
10
|
+
/**
|
|
11
|
+
* A thread's pieces, email by email: a piece never spans two emails, so a hit names the email that holds it
|
|
12
|
+
* (bench/mail-quality). A new reply adds its own pieces; every earlier one keeps its hash and so its vector.
|
|
13
|
+
*/
|
|
14
|
+
export declare const threadPieces: (database: CacheDatabase, threadId: number) => Chunk[];
|
|
15
|
+
export declare const queueThreads: (database: CacheDatabase, ids: Iterable<number>) => void;
|
|
16
|
+
/** Drops the pieces of an email's attachment texts; answers their hashes, for `purgeUnused` once new ones are in. */
|
|
17
|
+
export declare const dropAttachmentChunks: (database: CacheDatabase, emailId: number) => string[];
|
|
18
|
+
/** Vectors are keyed by text alone, so one goes only when no piece of anything holds that text any more. */
|
|
19
|
+
export declare const purgeUnused: (database: CacheDatabase, hashes: string[]) => void;
|
|
20
|
+
/** Each attachment's extracted text, in pieces for search by meaning, as an email's own text is. */
|
|
21
|
+
export declare const chunkAttachments: (database: CacheDatabase, accountId: number, emailId: number, now: number) => void;
|
|
22
|
+
export declare const drainEmailIndex: (database: CacheDatabase, stemmerFor: (stemmers: Stemmers) => Stemmer) => number;
|
|
23
|
+
//# sourceMappingURL=email-index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"email-index.d.ts","sourceRoot":"","sources":["../../../src/store/sqlite/email-index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,KAAK,KAAK,EAAmD,MAAM,+BAA+B,CAAA;AAExH,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAA;AAC7D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAKjD,eAAO,MAAM,OAAO,YAAa,MAAM,GAAG,IAAI,KAAG,MAAM,GAAG,IACa,CAAA;AAEvE;;;GAGG;AACH,eAAO,MAAM,WAAW,gjBAM0C,CAAA;AA8BlE;;;GAGG;AACH,eAAO,MAAM,YAAY,aAAc,aAAa,YAAY,MAAM,KAAG,KAAK,EAC7B,CAAA;AAoCjD,eAAO,MAAM,YAAY,aAAc,aAAa,OAAO,QAAQ,CAAC,MAAM,CAAC,SAK1E,CAAA;AAID,qHAAqH;AACrH,eAAO,MAAM,oBAAoB,aAAc,aAAa,WAAW,MAAM,KAAG,MAAM,EAWrF,CAAA;AAED,4GAA4G;AAC5G,eAAO,MAAM,WAAW,aAAc,aAAa,UAAU,MAAM,EAAE,SAKpE,CAAA;AAED,oGAAoG;AACpG,eAAO,MAAM,gBAAgB,aAAc,aAAa,aAAa,MAAM,WAAW,MAAM,OAAO,MAAM,SA6BxG,CAAA;AAKD,eAAO,MAAM,eAAe,aAAc,aAAa,cAAc,CAAC,QAAQ,EAAE,QAAQ,KAAK,OAAO,KAAG,MA+DtG,CAAA"}
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
import { CHUNK_CHARS, chunkHash, cutChunks, splitText } from "../../conversations/chunks.js";
|
|
2
|
+
import { mailCore } from "../../conversations/mail-text.js";
|
|
3
|
+
import { int, str } from "./events.js";
|
|
4
|
+
import { CORPORA, drainCorpus } from "./note-index.js";
|
|
5
|
+
import { inBatch } from "./search-index.js";
|
|
6
|
+
export const titleOf = (subject) => subject?.replace(/^\s*((re|fwd?|aw|wg)\s*:\s*)+/i, "").trim() || null;
|
|
7
|
+
/**
|
|
8
|
+
* Every piece of mail: a stretch of a thread, or of one email's attachment. A thread piece holds no email of its
|
|
9
|
+
* own; `threadPieces` cuts the thread again to find which emails it spans.
|
|
10
|
+
*/
|
|
11
|
+
export const MAIL_PIECES = `(SELECT k.id, k.content_hash, k.chunkable_type AS type, k.chunkable_id AS owner, k.position,
|
|
12
|
+
k.start_offset, k.end_offset, k.account_id, k.occurred_at, a.attachable_id AS email_id,
|
|
13
|
+
CASE k.chunkable_type WHEN 'email_thread' THEN k.chunkable_id
|
|
14
|
+
ELSE (SELECT email_thread_id FROM emails WHERE id = a.attachable_id) END AS thread_id
|
|
15
|
+
FROM chunks k LEFT JOIN attachments a ON k.chunkable_type = 'attachment' AND a.id = k.chunkable_id
|
|
16
|
+
AND a.attachable_type = 'email'
|
|
17
|
+
WHERE k.chunkable_type = 'email_thread' OR a.id IS NOT NULL) p`;
|
|
18
|
+
/** A thread's live emails, oldest first, each as what it adds: its subject, then its own text. */
|
|
19
|
+
const threadText = (database, threadId) => {
|
|
20
|
+
const rows = database
|
|
21
|
+
.prepare(`SELECT id, subject, coalesce(body_text, '') AS body, coalesce(from_name, from_address) AS sender,
|
|
22
|
+
coalesce(received_at, sent_at) AS at
|
|
23
|
+
FROM emails WHERE email_thread_id = ? AND deleted_at IS NULL ORDER BY coalesce(sent_at, received_at), id`)
|
|
24
|
+
.all(threadId);
|
|
25
|
+
const earlier = [];
|
|
26
|
+
const at = new Map();
|
|
27
|
+
const lines = rows.map((row) => {
|
|
28
|
+
const body = String(row.body);
|
|
29
|
+
const core = mailCore(body, earlier);
|
|
30
|
+
earlier.push(body);
|
|
31
|
+
const subject = titleOf(str(row.subject));
|
|
32
|
+
const text = subject ? `${subject}\n\n${core}` : core;
|
|
33
|
+
at.set(String(row.id), int(row.at) ?? null);
|
|
34
|
+
return { id: String(row.id), sender: str(row.sender), text };
|
|
35
|
+
});
|
|
36
|
+
return { lines, at };
|
|
37
|
+
};
|
|
38
|
+
/**
|
|
39
|
+
* A thread's pieces, email by email: a piece never spans two emails, so a hit names the email that holds it
|
|
40
|
+
* (bench/mail-quality). A new reply adds its own pieces; every earlier one keeps its hash and so its vector.
|
|
41
|
+
*/
|
|
42
|
+
export const threadPieces = (database, threadId) => cutThread(threadText(database, threadId).lines);
|
|
43
|
+
/** The one cut of a thread: what is stored, what is embedded and what a hit is read back from must agree. */
|
|
44
|
+
const cutThread = (lines) => lines.flatMap((line) => cutChunks([line], CHUNK_CHARS));
|
|
45
|
+
const chunkThread = (database, threadId, now) => {
|
|
46
|
+
const before = database
|
|
47
|
+
.prepare("SELECT content_hash AS hash FROM chunks WHERE chunkable_type = 'email_thread' AND chunkable_id = ?")
|
|
48
|
+
.all(threadId)
|
|
49
|
+
.map(({ hash }) => String(hash));
|
|
50
|
+
database.prepare("DELETE FROM chunks WHERE chunkable_type = 'email_thread' AND chunkable_id = ?").run(threadId);
|
|
51
|
+
const thread = database
|
|
52
|
+
.prepare("SELECT t.account_id, a.scope FROM email_threads t JOIN accounts a ON a.id = t.account_id WHERE t.id = ?")
|
|
53
|
+
.get(threadId);
|
|
54
|
+
if (thread) {
|
|
55
|
+
const { lines, at } = threadText(database, threadId);
|
|
56
|
+
const insert = database.prepare(`INSERT INTO chunks (chunkable_type, chunkable_id, position, start_offset, end_offset, content_hash, scope, account_id,
|
|
57
|
+
occurred_at, created_at, updated_at) VALUES ('email_thread', ?, ?, 0, ?, ?, ?, ?, ?, ?, ?)`);
|
|
58
|
+
for (const [position, piece] of cutThread(lines).entries())
|
|
59
|
+
insert.run(threadId, position, piece.text.length, piece.hash, str(thread.scope), Number(thread.account_id), at.get(piece.lastId) ?? null, now, now);
|
|
60
|
+
}
|
|
61
|
+
purgeUnused(database, before);
|
|
62
|
+
};
|
|
63
|
+
export const queueThreads = (database, ids) => {
|
|
64
|
+
const queue = database.prepare("INSERT OR IGNORE INTO email_index_pending (indexable_type, id) VALUES ('email_thread', ?)");
|
|
65
|
+
for (const id of ids)
|
|
66
|
+
queue.run(id);
|
|
67
|
+
};
|
|
68
|
+
const ATTACHMENTS_OF_EMAIL = "SELECT id FROM attachments WHERE attachable_type = 'email' AND attachable_id = ?";
|
|
69
|
+
/** Drops the pieces of an email's attachment texts; answers their hashes, for `purgeUnused` once new ones are in. */
|
|
70
|
+
export const dropAttachmentChunks = (database, emailId) => {
|
|
71
|
+
const hashes = database
|
|
72
|
+
.prepare(`SELECT content_hash AS hash FROM chunks WHERE chunkable_type = 'attachment' AND chunkable_id IN (${ATTACHMENTS_OF_EMAIL})`)
|
|
73
|
+
.all(emailId)
|
|
74
|
+
.map(({ hash }) => String(hash));
|
|
75
|
+
database
|
|
76
|
+
.prepare(`DELETE FROM chunks WHERE chunkable_type = 'attachment' AND chunkable_id IN (${ATTACHMENTS_OF_EMAIL})`)
|
|
77
|
+
.run(emailId);
|
|
78
|
+
return hashes;
|
|
79
|
+
};
|
|
80
|
+
/** Vectors are keyed by text alone, so one goes only when no piece of anything holds that text any more. */
|
|
81
|
+
export const purgeUnused = (database, hashes) => {
|
|
82
|
+
const purge = database.prepare("DELETE FROM embeddings WHERE content_hash = ? AND NOT EXISTS (SELECT 1 FROM chunks WHERE content_hash = ?)");
|
|
83
|
+
for (const hash of new Set(hashes))
|
|
84
|
+
purge.run(hash, hash);
|
|
85
|
+
};
|
|
86
|
+
/** Each attachment's extracted text, in pieces for search by meaning, as an email's own text is. */
|
|
87
|
+
export const chunkAttachments = (database, accountId, emailId, now) => {
|
|
88
|
+
const email = database
|
|
89
|
+
.prepare("SELECT a.scope, coalesce(e.received_at, e.sent_at) AS at FROM emails e JOIN accounts a ON a.id = e.account_id WHERE e.id = ?")
|
|
90
|
+
.get(emailId);
|
|
91
|
+
const insert = database.prepare(`INSERT INTO chunks (chunkable_type, chunkable_id, position, start_offset, end_offset, content_hash, scope, account_id,
|
|
92
|
+
occurred_at, created_at, updated_at) VALUES ('attachment', ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`);
|
|
93
|
+
const files = database
|
|
94
|
+
.prepare("SELECT id, text FROM attachments WHERE attachable_type = 'email' AND attachable_id = ? AND text <> ''")
|
|
95
|
+
.all(emailId);
|
|
96
|
+
for (const file of files) {
|
|
97
|
+
const text = String(file.text);
|
|
98
|
+
for (const [position, { start, end }] of splitText(text, CHUNK_CHARS).entries())
|
|
99
|
+
insert.run(Number(file.id), position, start, end, chunkHash(text.slice(start, end)), str(email?.scope), accountId, int(email?.at), now, now);
|
|
100
|
+
}
|
|
101
|
+
};
|
|
102
|
+
const MAIL_CUT = "mail_pieces_cut";
|
|
103
|
+
const CUT = "email";
|
|
104
|
+
export const drainEmailIndex = (database, stemmerFor) => {
|
|
105
|
+
// Mail was once cut without cleaning, then across the emails of a thread; a store cut either way is cut again.
|
|
106
|
+
if (database.prepare("SELECT value FROM store_settings WHERE key = ?").get(MAIL_CUT)?.value !== CUT)
|
|
107
|
+
inBatch(database, () => {
|
|
108
|
+
const single = database
|
|
109
|
+
.prepare("SELECT DISTINCT content_hash AS hash FROM chunks WHERE chunkable_type = 'email'")
|
|
110
|
+
.all()
|
|
111
|
+
.map(({ hash }) => String(hash));
|
|
112
|
+
database.prepare("DELETE FROM chunks WHERE chunkable_type = 'email'").run();
|
|
113
|
+
queueThreads(database, database
|
|
114
|
+
.prepare("SELECT id FROM email_threads")
|
|
115
|
+
.all()
|
|
116
|
+
.map(({ id }) => Number(id)));
|
|
117
|
+
purgeUnused(database, single);
|
|
118
|
+
database
|
|
119
|
+
.prepare("INSERT OR REPLACE INTO store_settings (key, value, at) VALUES (?, ?, ?)")
|
|
120
|
+
.run(MAIL_CUT, CUT, Date.now());
|
|
121
|
+
});
|
|
122
|
+
database
|
|
123
|
+
.prepare(`INSERT OR IGNORE INTO email_index_pending (indexable_type, id)
|
|
124
|
+
SELECT DISTINCT 'email_thread', e.email_thread_id FROM email_index_pending q JOIN emails e ON e.id = q.id
|
|
125
|
+
WHERE q.indexable_type = 'email' AND e.email_thread_id IS NOT NULL`)
|
|
126
|
+
.run();
|
|
127
|
+
// Attachments saved before their text was cut into pieces get them here, once.
|
|
128
|
+
const unchunked = database
|
|
129
|
+
.prepare(`SELECT DISTINCT e.id, e.account_id FROM attachments a JOIN emails e ON a.attachable_type = 'email' AND e.id = a.attachable_id
|
|
130
|
+
WHERE a.text <> '' AND e.deleted_at IS NULL
|
|
131
|
+
AND NOT EXISTS (SELECT 1 FROM chunks k WHERE k.chunkable_type = 'attachment' AND k.chunkable_id = a.id)`)
|
|
132
|
+
.all();
|
|
133
|
+
if (unchunked.length)
|
|
134
|
+
inBatch(database, () => {
|
|
135
|
+
for (const row of unchunked) {
|
|
136
|
+
const before = dropAttachmentChunks(database, Number(row.id));
|
|
137
|
+
chunkAttachments(database, Number(row.account_id), Number(row.id), Date.now());
|
|
138
|
+
purgeUnused(database, before);
|
|
139
|
+
}
|
|
140
|
+
});
|
|
141
|
+
const emails = drainCorpus(database, CORPORA.email, stemmerFor);
|
|
142
|
+
const next = database.prepare("SELECT id FROM email_index_pending WHERE indexable_type = 'email_thread' ORDER BY id LIMIT 50");
|
|
143
|
+
const done = database.prepare("DELETE FROM email_index_pending WHERE indexable_type = 'email_thread' AND id = ?");
|
|
144
|
+
let threads = 0;
|
|
145
|
+
for (;;) {
|
|
146
|
+
const count = inBatch(database, () => {
|
|
147
|
+
const ids = next.all().map(({ id }) => Number(id));
|
|
148
|
+
for (const id of ids) {
|
|
149
|
+
chunkThread(database, id, Date.now());
|
|
150
|
+
done.run(id);
|
|
151
|
+
}
|
|
152
|
+
return ids.length;
|
|
153
|
+
});
|
|
154
|
+
if (count === 0)
|
|
155
|
+
break;
|
|
156
|
+
threads += count;
|
|
157
|
+
}
|
|
158
|
+
return emails + threads;
|
|
159
|
+
};
|
|
160
|
+
//# sourceMappingURL=email-index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"email-index.js","sourceRoot":"","sources":["../../../src/store/sqlite/email-index.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,6 +3,7 @@ import type { Attachment, Metadata } from "../../meetings/index.js";
|
|
|
3
3
|
import type { Stemmer, Stemmers } from "../../search/stem.js";
|
|
4
4
|
import type { CacheDatabase } from "../driver.js";
|
|
5
5
|
import type { ConversationSummary, StoredHit } from "../store.js";
|
|
6
|
+
import { type MailRulesStore } from "./mail-rules.js";
|
|
6
7
|
import { type AttachmentInput } from "./meetings.js";
|
|
7
8
|
import type { StoreContext } from "./open.js";
|
|
8
9
|
export interface EmailAddress {
|
|
@@ -38,6 +39,8 @@ export interface EmailInput {
|
|
|
38
39
|
size?: number | null;
|
|
39
40
|
headers?: Metadata;
|
|
40
41
|
metadata?: Metadata;
|
|
42
|
+
/** The `mail_rules` row that decided how this email is stored; `null` clears it. */
|
|
43
|
+
mailRuleId?: number | null;
|
|
41
44
|
/** Added to the mailboxes the email is already in; one scan sees one folder, so none is taken away. */
|
|
42
45
|
mailboxes?: MailboxInput[];
|
|
43
46
|
/** Replaced when given; the text is word-indexed. */
|
|
@@ -104,6 +107,7 @@ export interface Email {
|
|
|
104
107
|
size: number | null;
|
|
105
108
|
headers: Metadata;
|
|
106
109
|
metadata: Metadata;
|
|
110
|
+
mailRuleId: number | null;
|
|
107
111
|
recipients: EmailRecipient[];
|
|
108
112
|
mailboxes: Mailbox[];
|
|
109
113
|
attachments: EmailAttachment[];
|
|
@@ -206,11 +210,16 @@ export interface MailStore {
|
|
|
206
210
|
threadExternalId?: string;
|
|
207
211
|
since?: number;
|
|
208
212
|
}): Promise<EmailVectorHit[]>;
|
|
213
|
+
/** The account's mail rules, and which rule decided each email. */
|
|
214
|
+
readonly rules: MailRulesStore;
|
|
209
215
|
}
|
|
210
216
|
/** An email as a message of its thread, the shape mail had when it was stored as messages. */
|
|
211
217
|
export declare const messageOfEmail: (email: Email, thread: string) => Message;
|
|
212
218
|
/** Emails as search hits, in the order of `pks`: the thread is the chat, so a hit's locator is the one mail had as messages. */
|
|
213
219
|
export declare const emailHitsByPk: (database: CacheDatabase, pks: number[]) => StoredHit[];
|
|
214
|
-
|
|
220
|
+
/**
|
|
221
|
+
* Indexes the queued emails as the notes are indexed, words and stems of the subject, then the body; then cuts
|
|
222
|
+
* the threads they belong to into pieces for search by meaning.
|
|
223
|
+
*/
|
|
215
224
|
export declare const mailStoreOver: ({ database, orm }: Pick<StoreContext, "database" | "orm">, stemmerFor?: (stemmers: Stemmers) => Stemmer) => MailStore;
|
|
216
225
|
//# sourceMappingURL=emails.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"emails.d.ts","sourceRoot":"","sources":["../../../src/store/sqlite/emails.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"emails.d.ts","sourceRoot":"","sources":["../../../src/store/sqlite/emails.ts"],"names":[],"mappings":"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"}
|