@robono/server 0.25.0 → 0.27.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +8 -0
- package/HISTORY-IMPORT.md +117 -5
- package/INTEGRATION-ASSISTANT.md +103 -0
- package/README.md +16 -0
- package/SBOM.spdx.json +9 -9
- package/dist/calling.d.ts +30 -0
- package/dist/calling.d.ts.map +1 -1
- package/dist/calling.js +13 -0
- package/dist/calling.js.map +1 -1
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +2 -1
- package/dist/client.js.map +1 -1
- package/dist/generated/custom-messages.d.ts +31 -0
- package/dist/generated/custom-messages.d.ts.map +1 -0
- package/dist/generated/custom-messages.js +84 -0
- package/dist/generated/custom-messages.js.map +1 -0
- package/dist/generated/history-import-interactions.d.ts +17 -0
- package/dist/generated/history-import-interactions.d.ts.map +1 -0
- package/dist/generated/history-import-interactions.js +40 -0
- package/dist/generated/history-import-interactions.js.map +1 -0
- package/dist/generated/interactions.d.ts +199 -0
- package/dist/generated/interactions.d.ts.map +1 -0
- package/dist/generated/interactions.js +89 -0
- package/dist/generated/interactions.js.map +1 -0
- package/dist/generated/sdk-versions.d.ts +13 -0
- package/dist/generated/sdk-versions.d.ts.map +1 -0
- package/dist/generated/sdk-versions.js +4 -0
- package/dist/generated/sdk-versions.js.map +1 -0
- package/dist/history-convert.d.ts +52 -0
- package/dist/history-convert.d.ts.map +1 -0
- package/dist/history-convert.js +276 -0
- package/dist/history-convert.js.map +1 -0
- package/dist/history-export-cli.d.ts +4 -0
- package/dist/history-export-cli.d.ts.map +1 -0
- package/dist/history-export-cli.js +166 -0
- package/dist/history-export-cli.js.map +1 -0
- package/dist/history-export-files.d.ts +39 -0
- package/dist/history-export-files.d.ts.map +1 -0
- package/dist/history-export-files.js +119 -0
- package/dist/history-export-files.js.map +1 -0
- package/dist/history-export.d.ts +92 -0
- package/dist/history-export.d.ts.map +1 -0
- package/dist/history-export.js +78 -0
- package/dist/history-export.js.map +1 -0
- package/dist/history-import-cli.d.ts +1 -7
- package/dist/history-import-cli.d.ts.map +1 -1
- package/dist/history-import-cli.js +4 -33
- package/dist/history-import-cli.js.map +1 -1
- package/dist/history-import-validation.d.ts +8 -0
- package/dist/history-import-validation.d.ts.map +1 -0
- package/dist/history-import-validation.js +85 -0
- package/dist/history-import-validation.js.map +1 -0
- package/dist/history-import.d.ts +10 -1
- package/dist/history-import.d.ts.map +1 -1
- package/dist/history-import.js +27 -6
- package/dist/history-import.js.map +1 -1
- package/dist/history-migrate-cli.d.ts +3 -0
- package/dist/history-migrate-cli.d.ts.map +1 -0
- package/dist/history-migrate-cli.js +260 -0
- package/dist/history-migrate-cli.js.map +1 -0
- package/dist/history-polls.d.ts +4 -0
- package/dist/history-polls.d.ts.map +1 -0
- package/dist/history-polls.js +66 -0
- package/dist/history-polls.js.map +1 -0
- package/dist/index.d.ts +7 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/integration-assistant.txt +103 -0
- package/dist/messaging-notification-providers.d.ts +2 -3
- package/dist/messaging-notification-providers.d.ts.map +1 -1
- package/dist/messaging-notification-providers.js.map +1 -1
- package/dist/messaging.d.ts +5 -0
- package/dist/messaging.d.ts.map +1 -1
- package/dist/messaging.js +11 -2
- package/dist/messaging.js.map +1 -1
- package/dist/messenger-example-cli.d.ts +3 -0
- package/dist/messenger-example-cli.d.ts.map +1 -0
- package/dist/messenger-example-cli.js +47 -0
- package/dist/messenger-example-cli.js.map +1 -0
- package/dist/messenger-example.d.ts +9 -0
- package/dist/messenger-example.d.ts.map +1 -0
- package/dist/messenger-example.js +42 -0
- package/dist/messenger-example.js.map +1 -0
- package/dist/messenger-example.json +1 -0
- package/dist/messenger-hosted-install.d.ts.map +1 -1
- package/dist/messenger-hosted-install.js +4 -2
- package/dist/messenger-hosted-install.js.map +1 -1
- package/dist/messenger-install.d.ts +1 -1
- package/dist/messenger-install.d.ts.map +1 -1
- package/dist/messenger-install.js +5 -4
- package/dist/messenger-install.js.map +1 -1
- package/dist/messenger-preview-template.d.ts.map +1 -1
- package/dist/messenger-preview-template.js +1 -0
- package/dist/messenger-preview-template.js.map +1 -1
- package/package.json +8 -4
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"history-import-cli.js","sourceRoot":"","sources":["../src/history-import-cli.ts"],"names":[],"mappings":";AACA,OAAO,EAAC,QAAQ,EAAC,IAAI,EAAC,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAC,aAAa,EAAC,MAAM,UAAU,CAAC;AACvC,OAAO,EAAC,mBAAmB,EAA2B,MAAM,qBAAqB,CAAC;AAClF,OAAO,EAAC,WAAW,EAAC,MAAM,aAAa,CAAC;AACxC,mGAAmG;AACnG,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,IAAa,EAAC,MAAsB,OAAO,CAAC,GAAG,EAAC,MAAwB,OAAO,CAAC,GAAG;IACzH,MAAM,KAAK,GAAC,IAAI,GAAG,CAAS,IAAI,CAAC,MAAM,CAAC,CAAC,CAAA,EAAE,CAAA,CAAC,KAAG,SAAS,IAAE,CAAC,KAAG,QAAQ,CAAC,CAAC,CAAC;IACzE,IAAG,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAC,CAAC;QAAA,GAAG,CAAC,yLAAyL,CAAC,CAAC;QAAA,OAAO;IAAA,CAAC;IAC/N,MAAM,IAAI,GAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAA,EAAE,CAAA,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAAA,IAAG,IAAI,CAAC,MAAM,KAAG,CAAC,IAAE,IAAI,CAAC,CAAC,CAAC,KAAG,QAAQ,IAAE,CAAC,IAAI,CAAC,CAAC,CAAC;QAAC,MAAM,KAAK,CAAC,mDAAmD,CAAC,CAAC;IAC3J,MAAM,IAAI,GAAC,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IAAA,IAAG,CAAC,IAAI,CAAC,MAAM,EAAE,IAAE,IAAI,CAAC,IAAI,GAAC,
|
|
1
|
+
{"version":3,"file":"history-import-cli.js","sourceRoot":"","sources":["../src/history-import-cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { HistoryImportMessage } from './history-import.js';
|
|
2
|
+
export declare function validateHistoryImportFile(value: any): asserts value is {
|
|
3
|
+
jobId: string;
|
|
4
|
+
conversationId: string;
|
|
5
|
+
authors: string[];
|
|
6
|
+
messages: HistoryImportMessage[];
|
|
7
|
+
};
|
|
8
|
+
//# sourceMappingURL=history-import-validation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"history-import-validation.d.ts","sourceRoot":"","sources":["../src/history-import-validation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,oBAAoB,EAAC,MAAM,qBAAqB,CAAC;AAI9D,wBAAgB,yBAAyB,CAAC,KAAK,EAAC,GAAG,GAAE,OAAO,CAAC,KAAK,IAAI;IAAC,KAAK,EAAC,MAAM,CAAC;IAAA,cAAc,EAAC,MAAM,CAAC;IAAA,OAAO,EAAC,MAAM,EAAE,CAAC;IAAA,QAAQ,EAAC,oBAAoB,EAAE,CAAA;CAAC,CA+B1J"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { validateCustomMessage, customMessageScreeningText } from './generated/custom-messages.js';
|
|
2
|
+
import { validatePoll } from './generated/interactions.js';
|
|
3
|
+
import { validateHistoryInteractions } from './generated/history-import-interactions.js';
|
|
4
|
+
export function validateHistoryImportFile(value) {
|
|
5
|
+
const uuid = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;
|
|
6
|
+
const id = (v) => typeof v === 'string' && v.length > 0 && v.length <= 200 && v === v.trim() && !/[\u0000-\u001f\u007f]/.test(v);
|
|
7
|
+
if (!value || !uuid.test(value.jobId) || !uuid.test(value.conversationId) || !Array.isArray(value.authors) || !value.authors.length || value.authors.length > 10000 || value.authors.some((a) => !id(a)) || new Set(value.authors).size !== value.authors.length)
|
|
8
|
+
throw Error('Provide UUID jobId and conversationId and a unique authors list.');
|
|
9
|
+
if (!Array.isArray(value.messages) || !value.messages.length || value.messages.length > 100000)
|
|
10
|
+
throw Error('Include 1–100,000 messages.');
|
|
11
|
+
if (value.messages.filter((m) => m?.interactions?.pin).length > 20)
|
|
12
|
+
throw Error('A conversation supports at most 20 pinned messages.');
|
|
13
|
+
const ids = new Map(), order = new Map(), authors = new Set(value.authors);
|
|
14
|
+
let bytes = 0;
|
|
15
|
+
for (const [index, message] of value.messages.entries()) {
|
|
16
|
+
const fail = (reason) => { throw Error(`Message ${index + 1}: ${reason}`); };
|
|
17
|
+
if (!message || !id(message.sourceId) || ids.has(message.sourceId) || !authors.has(message.authorId))
|
|
18
|
+
fail('use a unique sourceId and an author from the authors list.');
|
|
19
|
+
const sent = Date.parse(message.sentAt);
|
|
20
|
+
if (typeof message.sentAt !== 'string' || !Number.isFinite(sent) || sent < 0 || sent > Date.now())
|
|
21
|
+
fail('sentAt must be a valid past date.');
|
|
22
|
+
const c = message.content;
|
|
23
|
+
if (!c || !['text', 'image', 'video', 'voice', 'document', 'poll'].includes(c.kind) || Object.keys(c).some(k => !['kind', 'text', 'media', 'custom', 'poll'].includes(k)))
|
|
24
|
+
fail('provide supported content only.');
|
|
25
|
+
if (c.kind === 'text' && (typeof c.text !== 'string' || !c.text.trim() || c.text.length > 10000 || c.media))
|
|
26
|
+
fail('text must contain 1–10,000 characters.');
|
|
27
|
+
if (c.custom !== undefined) {
|
|
28
|
+
if (c.kind !== 'text')
|
|
29
|
+
fail('custom messages require a text fallback.');
|
|
30
|
+
try {
|
|
31
|
+
customMessageScreeningText(c.text, validateCustomMessage(c.custom));
|
|
32
|
+
}
|
|
33
|
+
catch {
|
|
34
|
+
fail('custom message data or fallback is invalid.');
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
if (c.kind !== 'text' && c.kind !== 'poll' && (!c.media || typeof c.media.assetId !== 'string' || !c.media.assetId.startsWith('robono-r2:')))
|
|
38
|
+
fail('upload attachments privately through importer.upload first. Public source URLs are not accepted.');
|
|
39
|
+
if (c.kind === 'poll') {
|
|
40
|
+
try {
|
|
41
|
+
validatePoll(c.poll);
|
|
42
|
+
}
|
|
43
|
+
catch {
|
|
44
|
+
fail('invalid poll.');
|
|
45
|
+
}
|
|
46
|
+
if (c.text !== undefined || c.media !== undefined || c.custom !== undefined)
|
|
47
|
+
fail('polls require separate content.');
|
|
48
|
+
}
|
|
49
|
+
else if (c.poll !== undefined)
|
|
50
|
+
fail('poll content requires kind poll.');
|
|
51
|
+
if (message.interactions !== undefined) {
|
|
52
|
+
try {
|
|
53
|
+
validateHistoryInteractions(message.interactions, c.poll, authors);
|
|
54
|
+
}
|
|
55
|
+
catch {
|
|
56
|
+
fail('invalid historical reactions or votes.');
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
if (Object.keys(message).some(k => !['sourceId', 'authorId', 'sentAt', 'content', 'replyToSourceId', 'threadRootSourceId', 'interactions'].includes(k)))
|
|
60
|
+
fail('unrecognized message field.');
|
|
61
|
+
bytes += Buffer.byteLength(JSON.stringify(c)) + Buffer.byteLength(JSON.stringify(message.interactions ?? {}));
|
|
62
|
+
if (bytes > 268435456)
|
|
63
|
+
fail('import exceeds 256 MiB.');
|
|
64
|
+
if (message.replyToSourceId !== undefined && !id(message.replyToSourceId))
|
|
65
|
+
fail('replyToSourceId must be an original source ID.');
|
|
66
|
+
if (message.threadRootSourceId !== undefined && (!id(message.threadRootSourceId) || !message.replyToSourceId))
|
|
67
|
+
fail('threadRootSourceId requires a valid root and reply target.');
|
|
68
|
+
if (message.interactions?.pin && Date.parse(message.interactions.pin.createdAt) < sent)
|
|
69
|
+
fail('pin date precedes the message.');
|
|
70
|
+
ids.set(message.sourceId, sent);
|
|
71
|
+
order.set(message.sourceId, index);
|
|
72
|
+
}
|
|
73
|
+
for (const [index, message] of value.messages.entries())
|
|
74
|
+
if (message.replyToSourceId !== undefined && (!ids.has(message.replyToSourceId) || ids.get(message.replyToSourceId) > Date.parse(message.sentAt) || message.replyToSourceId === message.sourceId || ids.get(message.replyToSourceId) === Date.parse(message.sentAt) && order.get(message.replyToSourceId) >= index))
|
|
75
|
+
throw Error(`Message ${index + 1}: the original reply target must exist and precede this message.`);
|
|
76
|
+
const messages = new Map(value.messages.map((m) => [m.sourceId, m]));
|
|
77
|
+
for (const m of value.messages) {
|
|
78
|
+
if (!m.threadRootSourceId)
|
|
79
|
+
continue;
|
|
80
|
+
const root = messages.get(m.threadRootSourceId), reply = messages.get(m.replyToSourceId);
|
|
81
|
+
if (!root || root.threadRootSourceId || order.get(root.sourceId) >= order.get(m.sourceId) || root.sourceId !== reply?.sourceId && reply?.threadRootSourceId !== root.sourceId)
|
|
82
|
+
throw Error('A thread must refer to an earlier root and a reply within that thread.');
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=history-import-validation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"history-import-validation.js","sourceRoot":"","sources":["../src/history-import-validation.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,qBAAqB,EAAC,0BAA0B,EAAC,MAAM,gCAAgC,CAAC;AAChG,OAAO,EAAC,YAAY,EAAC,MAAM,6BAA6B,CAAC;AACzD,OAAO,EAAC,2BAA2B,EAAC,MAAM,4CAA4C,CAAC;AACvF,MAAM,UAAU,yBAAyB,CAAC,KAAS;IAClD,MAAM,IAAI,GAAC,4EAA4E,CAAC;IACxF,MAAM,EAAE,GAAC,CAAC,CAAS,EAAC,EAAE,CAAA,OAAO,CAAC,KAAG,QAAQ,IAAE,CAAC,CAAC,MAAM,GAAC,CAAC,IAAE,CAAC,CAAC,MAAM,IAAE,GAAG,IAAE,CAAC,KAAG,CAAC,CAAC,IAAI,EAAE,IAAE,CAAC,uBAAuB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACrH,IAAG,CAAC,KAAK,IAAE,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAE,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,IAAE,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,IAAE,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,IAAE,KAAK,CAAC,OAAO,CAAC,MAAM,GAAC,KAAK,IAAE,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAS,EAAC,EAAE,CAAA,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAE,IAAI,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,KAAG,KAAK,CAAC,OAAO,CAAC,MAAM;QAAC,MAAM,KAAK,CAAC,kEAAkE,CAAC,CAAC;IACpU,IAAG,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,IAAE,KAAK,CAAC,QAAQ,CAAC,MAAM,GAAC,MAAM;QAAC,MAAM,KAAK,CAAC,6BAA6B,CAAC,CAAC;IACnI,IAAG,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAK,EAAC,EAAE,CAAA,CAAC,EAAE,YAAY,EAAE,GAAG,CAAC,CAAC,MAAM,GAAC,EAAE;QAAC,MAAM,KAAK,CAAC,qDAAqD,CAAC,CAAC;IACrI,MAAM,GAAG,GAAC,IAAI,GAAG,EAAiB,EAAC,KAAK,GAAC,IAAI,GAAG,EAAiB,EAAC,OAAO,GAAC,IAAI,GAAG,CAAS,KAAK,CAAC,OAAO,CAAC,CAAC;IAAA,IAAI,KAAK,GAAC,CAAC,CAAC;IACrH,KAAI,MAAM,CAAC,KAAK,EAAC,OAAO,CAAC,IAAG,KAAK,CAAC,QAAQ,CAAC,OAAO,EAAE,EAAC,CAAC;QACrD,MAAM,IAAI,GAAC,CAAC,MAAa,EAAC,EAAE,GAAC,MAAM,KAAK,CAAC,WAAW,KAAK,GAAC,CAAC,KAAK,MAAM,EAAE,CAAC,CAAC,CAAA,CAAC,CAAC;QAC5E,IAAG,CAAC,OAAO,IAAE,CAAC,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAE,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAE,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC;YAAC,IAAI,CAAC,4DAA4D,CAAC,CAAC;QACjK,MAAM,IAAI,GAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAAA,IAAG,OAAO,OAAO,CAAC,MAAM,KAAG,QAAQ,IAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAE,IAAI,GAAC,CAAC,IAAE,IAAI,GAAC,IAAI,CAAC,GAAG,EAAE;YAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC;QACrK,MAAM,CAAC,GAAC,OAAO,CAAC,OAAO,CAAC;QAAA,IAAG,CAAC,CAAC,IAAE,CAAC,CAAC,MAAM,EAAC,OAAO,EAAC,OAAO,EAAC,OAAO,EAAC,UAAU,EAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAA,EAAE,CAAA,CAAC,CAAC,MAAM,EAAC,MAAM,EAAC,OAAO,EAAC,QAAQ,EAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;YAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC;QAC1N,IAAG,CAAC,CAAC,IAAI,KAAG,MAAM,IAAE,CAAC,OAAO,CAAC,CAAC,IAAI,KAAG,QAAQ,IAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,IAAE,CAAC,CAAC,IAAI,CAAC,MAAM,GAAC,KAAK,IAAE,CAAC,CAAC,KAAK,CAAC;YAAC,IAAI,CAAC,wCAAwC,CAAC,CAAC;QAC5I,IAAG,CAAC,CAAC,MAAM,KAAG,SAAS,EAAC,CAAC;YACxB,IAAG,CAAC,CAAC,IAAI,KAAG,MAAM;gBAAC,IAAI,CAAC,0CAA0C,CAAC,CAAC;YACpE,IAAG,CAAC;gBAAA,0BAA0B,CAAC,CAAC,CAAC,IAAI,EAAC,qBAAqB,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;YAAA,CAAC;YAAA,MAAK,CAAC;gBAAA,IAAI,CAAC,6CAA6C,CAAC,CAAC;YAAA,CAAC;QACpI,CAAC;QACD,IAAG,CAAC,CAAC,IAAI,KAAG,MAAM,IAAE,CAAC,CAAC,IAAI,KAAG,MAAM,IAAE,CAAC,CAAC,CAAC,CAAC,KAAK,IAAE,OAAO,CAAC,CAAC,KAAK,CAAC,OAAO,KAAG,QAAQ,IAAE,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;YAAC,IAAI,CAAC,kGAAkG,CAAC,CAAC;QACvO,IAAG,CAAC,CAAC,IAAI,KAAG,MAAM,EAAC,CAAC;YAAA,IAAG,CAAC;gBAAA,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YAAA,CAAC;YAAA,MAAK,CAAC;gBAAA,IAAI,CAAC,eAAe,CAAC,CAAC;YAAA,CAAC;YAAA,IAAG,CAAC,CAAC,IAAI,KAAG,SAAS,IAAE,CAAC,CAAC,KAAK,KAAG,SAAS,IAAE,CAAC,CAAC,MAAM,KAAG,SAAS;gBAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC;QAAA,CAAC;aAChL,IAAG,CAAC,CAAC,IAAI,KAAG,SAAS;YAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC;QACpE,IAAG,OAAO,CAAC,YAAY,KAAG,SAAS,EAAC,CAAC;YAAA,IAAG,CAAC;gBAAA,2BAA2B,CAAC,OAAO,CAAC,YAAY,EAAC,CAAC,CAAC,IAAI,EAAC,OAAO,CAAC,CAAC;YAAA,CAAC;YAAA,MAAK,CAAC;gBAAA,IAAI,CAAC,wCAAwC,CAAC,CAAC;YAAA,CAAC;QAAA,CAAC;QAClK,IAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAA,EAAE,CAAA,CAAC,CAAC,UAAU,EAAC,UAAU,EAAC,QAAQ,EAAC,SAAS,EAAC,iBAAiB,EAAC,oBAAoB,EAAC,cAAc,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;YAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;QACnL,KAAK,IAAE,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,GAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,YAAY,IAAE,EAAE,CAAC,CAAC,CAAC;QAAA,IAAG,KAAK,GAAC,SAAS;YAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;QAC3J,IAAG,OAAO,CAAC,eAAe,KAAG,SAAS,IAAE,CAAC,EAAE,CAAC,OAAO,CAAC,eAAe,CAAC;YAAC,IAAI,CAAC,gDAAgD,CAAC,CAAC;QAC5H,IAAG,OAAO,CAAC,kBAAkB,KAAG,SAAS,IAAE,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,kBAAkB,CAAC,IAAE,CAAC,OAAO,CAAC,eAAe,CAAC;YAAC,IAAI,CAAC,4DAA4D,CAAC,CAAC;QAC1K,IAAG,OAAO,CAAC,YAAY,EAAE,GAAG,IAAE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC,GAAG,CAAC,SAAS,CAAC,GAAC,IAAI;YAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC;QACzH,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,EAAC,IAAI,CAAC,CAAC;QAAA,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,EAAC,KAAK,CAAC,CAAC;IAClE,CAAC;IACD,KAAI,MAAM,CAAC,KAAK,EAAC,OAAO,CAAC,IAAG,KAAK,CAAC,QAAQ,CAAC,OAAO,EAAE;QAAC,IAAG,OAAO,CAAC,eAAe,KAAG,SAAS,IAAE,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,eAAe,CAAC,IAAE,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,eAAe,CAAE,GAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAE,OAAO,CAAC,eAAe,KAAG,OAAO,CAAC,QAAQ,IAAE,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,eAAe,CAAC,KAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAE,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,eAAe,CAAE,IAAE,KAAK,CAAC;YAAC,MAAM,KAAK,CAAC,WAAW,KAAK,GAAC,CAAC,kEAAkE,CAAC,CAAC;IACxb,MAAM,QAAQ,GAAC,IAAI,GAAG,CAA8B,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAsB,EAAC,EAAE,CAAA,CAAC,CAAC,CAAC,QAAQ,EAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAClH,KAAI,MAAM,CAAC,IAAI,KAAK,CAAC,QAAQ,EAAC,CAAC;QAAA,IAAG,CAAC,CAAC,CAAC,kBAAkB;YAAC,SAAS;QAAA,MAAM,IAAI,GAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,kBAAkB,CAAC,EAAC,KAAK,GAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC;QAAA,IAAG,CAAC,IAAI,IAAE,IAAI,CAAC,kBAAkB,IAAE,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAE,IAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAE,IAAE,IAAI,CAAC,QAAQ,KAAG,KAAK,EAAE,QAAQ,IAAE,KAAK,EAAE,kBAAkB,KAAG,IAAI,CAAC,QAAQ;YAAC,MAAM,KAAK,CAAC,wEAAwE,CAAC,CAAC;IAAA,CAAC;AAC9Y,CAAC"}
|
package/dist/history-import.d.ts
CHANGED
|
@@ -1,21 +1,29 @@
|
|
|
1
|
+
import type { MessagePoll } from './generated/interactions.js';
|
|
2
|
+
import type { HistoryInteractions } from './generated/history-import-interactions.js';
|
|
1
3
|
import { RobonoManagedMedia } from './managed-media.js';
|
|
2
4
|
import type { MessagingStoredMedia, MessagingUploadFile, MessagingMediaKind } from './messaging-media.js';
|
|
5
|
+
import type { CustomMessageContent } from './generated/custom-messages.js';
|
|
3
6
|
export interface HistoryImportMessage {
|
|
4
7
|
sourceId: string;
|
|
5
8
|
authorId: string;
|
|
6
9
|
sentAt: string;
|
|
7
10
|
content: {
|
|
8
|
-
kind: 'text' | 'voice' | 'image' | 'video' | 'document';
|
|
11
|
+
kind: 'text' | 'voice' | 'image' | 'video' | 'document' | 'poll';
|
|
12
|
+
poll?: MessagePoll;
|
|
9
13
|
text?: string;
|
|
10
14
|
media?: MessagingStoredMedia;
|
|
15
|
+
custom?: CustomMessageContent;
|
|
11
16
|
};
|
|
12
17
|
replyToSourceId?: string;
|
|
18
|
+
threadRootSourceId?: string;
|
|
19
|
+
interactions?: HistoryInteractions;
|
|
13
20
|
}
|
|
14
21
|
export interface HistoryImportStatus {
|
|
15
22
|
jobId: string;
|
|
16
23
|
state: 'staging' | 'committing' | 'complete' | 'cancelled';
|
|
17
24
|
expiresAt?: string;
|
|
18
25
|
stagedCount?: number;
|
|
26
|
+
inputDigest?: string;
|
|
19
27
|
importedCount?: number;
|
|
20
28
|
}
|
|
21
29
|
/** Server-only. A manage-scoped key cannot be exposed in an app or browser. */
|
|
@@ -34,6 +42,7 @@ export declare class RobonoHistoryImport {
|
|
|
34
42
|
conversationId: string;
|
|
35
43
|
authors: string[];
|
|
36
44
|
count: number;
|
|
45
|
+
inputDigest?: string;
|
|
37
46
|
}): Promise<HistoryImportStatus>;
|
|
38
47
|
append(jobId: string, messages: Array<HistoryImportMessage & {
|
|
39
48
|
ordinal: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"history-import.d.ts","sourceRoot":"","sources":["../src/history-import.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"history-import.d.ts","sourceRoot":"","sources":["../src/history-import.ts"],"names":[],"mappings":"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"}
|
package/dist/history-import.js
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { createHash } from 'node:crypto';
|
|
2
|
+
import { validateHistoryImportFile } from './history-import-validation.js';
|
|
1
3
|
import { RobonoError } from './errors.js';
|
|
2
4
|
import { RobonoManagedMedia } from './managed-media.js';
|
|
3
5
|
const uuid = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;
|
|
@@ -52,16 +54,35 @@ export class RobonoHistoryImport {
|
|
|
52
54
|
}
|
|
53
55
|
/** Retry this whole operation with the same job/source IDs after interruption. */
|
|
54
56
|
async importMessages(input) {
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
const started = await this.start({ jobId: input.jobId, conversationId: input.conversationId, authors: input.authors, count: input.messages.length });
|
|
57
|
+
validateHistoryImportFile(input);
|
|
58
|
+
const inputDigest = createHash('sha256').update(JSON.stringify(input.messages)).digest('hex');
|
|
59
|
+
const started = await this.start({ jobId: input.jobId, conversationId: input.conversationId, authors: input.authors, count: input.messages.length, inputDigest });
|
|
58
60
|
if (started.state === 'complete')
|
|
59
61
|
return started;
|
|
60
62
|
if (started.state !== 'staging')
|
|
61
63
|
throw Error('This import is no longer active.');
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
64
|
+
const resume = started.inputDigest === inputDigest ? started.stagedCount ?? 0 : 0;
|
|
65
|
+
if (!Number.isSafeInteger(resume) || resume < 0 || resume > input.messages.length)
|
|
66
|
+
throw Error('Invalid import progress from the service.');
|
|
67
|
+
input.onProgress?.(resume, input.messages.length);
|
|
68
|
+
// The service stages a batch before screening it. Recheck the last batch after
|
|
69
|
+
// interruption so an accepted stage is never mistaken for completed screening.
|
|
70
|
+
for (let offset = Math.max(0, resume - 20); offset < input.messages.length;) {
|
|
71
|
+
const batch = [];
|
|
72
|
+
let bytes = 0;
|
|
73
|
+
while (offset + batch.length < input.messages.length && batch.length < 20) {
|
|
74
|
+
const message = { ...input.messages[offset + batch.length], ordinal: offset + batch.length };
|
|
75
|
+
const size = Buffer.byteLength(JSON.stringify(message));
|
|
76
|
+
if (size > 1048576)
|
|
77
|
+
throw Error('An imported message exceeds the batch size limit.');
|
|
78
|
+
if (batch.length && bytes + size > 1048576)
|
|
79
|
+
break;
|
|
80
|
+
batch.push(message);
|
|
81
|
+
bytes += size;
|
|
82
|
+
}
|
|
83
|
+
await this.append(input.jobId, batch);
|
|
84
|
+
offset += batch.length;
|
|
85
|
+
input.onProgress?.(offset, input.messages.length);
|
|
65
86
|
}
|
|
66
87
|
return this.commit(input.jobId);
|
|
67
88
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"history-import.js","sourceRoot":"","sources":["../src/history-import.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,WAAW,EAAC,MAAM,aAAa,CAAC;AACxC,OAAO,EAAC,kBAAkB,EAAC,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"history-import.js","sourceRoot":"","sources":["../src/history-import.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"history-migrate-cli.d.ts","sourceRoot":"","sources":["../src/history-migrate-cli.ts"],"names":[],"mappings":";AAmCA,wBAAsB,mBAAmB,CAAC,IAAI,EAAC,MAAM,EAAE,EAAC,GAAG,GAAC,MAAM,CAAC,UAAsB,EAAC,GAAG,GAAC,CAAC,CAAC,EAAC,MAAM,KAAG,IAAgB,EAAC,OAAO,CAAC,EAAC,OAAO,KAAK,iBAoF/I"}
|
|
@@ -0,0 +1,260 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { constants } from 'node:fs';
|
|
3
|
+
import { open, mkdir, lstat, rename, unlink } from 'node:fs/promises';
|
|
4
|
+
import { join, resolve, dirname, isAbsolute } from 'node:path';
|
|
5
|
+
import { pathToFileURL } from 'node:url';
|
|
6
|
+
import { createHash, randomUUID } from 'node:crypto';
|
|
7
|
+
import { isDeepStrictEqual } from 'node:util';
|
|
8
|
+
import { convertHistory } from './history-convert.js';
|
|
9
|
+
import { validateHistoryImportFile } from './history-import-validation.js';
|
|
10
|
+
import { RobonoHistoryImport } from './history-import.js';
|
|
11
|
+
import { RobonoError } from './errors.js';
|
|
12
|
+
async function readAttachment(root, name, expected) {
|
|
13
|
+
if (typeof name !== 'string' || !name || isAbsolute(name) || name.includes('\\') || name.split('/').some(p => !p || p === '.' || p === '..'))
|
|
14
|
+
throw Error('Attachment paths must stay inside the folder beside the mapping file.');
|
|
15
|
+
let path = root;
|
|
16
|
+
for (const part of name.split('/')) {
|
|
17
|
+
path = join(path, part);
|
|
18
|
+
if ((await lstat(path)).isSymbolicLink())
|
|
19
|
+
throw Error('Linked attachment paths are not accepted.');
|
|
20
|
+
}
|
|
21
|
+
const h = await open(path, constants.O_RDONLY | (constants.O_NOFOLLOW ?? 0));
|
|
22
|
+
try {
|
|
23
|
+
const stat = await h.stat();
|
|
24
|
+
if (!stat.isFile() || stat.nlink !== 1 || stat.size < 1 || stat.size > 104857600)
|
|
25
|
+
throw Error('Each attachment must be a regular file of 1–100 MiB.');
|
|
26
|
+
const bytes = await h.readFile();
|
|
27
|
+
if (bytes.length !== stat.size || expected && (bytes.length !== expected.byteSize || createHash('sha256').update(bytes).digest('hex') !== expected.sha256))
|
|
28
|
+
throw Error('An attachment changed. Restore the original private migration files.');
|
|
29
|
+
return bytes;
|
|
30
|
+
}
|
|
31
|
+
finally {
|
|
32
|
+
await h.close();
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
async function readJson(file, jsonl = false) {
|
|
36
|
+
const handle = await open(file, constants.O_RDONLY | (constants.O_NOFOLLOW ?? 0));
|
|
37
|
+
try {
|
|
38
|
+
const stat = await handle.stat();
|
|
39
|
+
if (!stat.isFile() || stat.nlink !== 1 || stat.size > 268435456)
|
|
40
|
+
throw Error('Use a regular JSON/JSONL file of at most 256 MiB.');
|
|
41
|
+
const text = await handle.readFile('utf8');
|
|
42
|
+
try {
|
|
43
|
+
return JSON.parse(text);
|
|
44
|
+
}
|
|
45
|
+
catch {
|
|
46
|
+
if (jsonl) {
|
|
47
|
+
try {
|
|
48
|
+
return text.split(/\r?\n/).filter(line => line.trim()).map(line => JSON.parse(line));
|
|
49
|
+
}
|
|
50
|
+
catch { }
|
|
51
|
+
}
|
|
52
|
+
throw Error('Invalid JSON/JSONL file.');
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
finally {
|
|
56
|
+
await handle.close();
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
async function save(folder, name, value) {
|
|
60
|
+
const temporary = join(folder, '.save-' + randomUUID());
|
|
61
|
+
const h = await open(temporary, 'wx', 0o600);
|
|
62
|
+
try {
|
|
63
|
+
await h.writeFile(JSON.stringify(value, null, 2) + '\n');
|
|
64
|
+
await h.sync();
|
|
65
|
+
}
|
|
66
|
+
finally {
|
|
67
|
+
await h.close();
|
|
68
|
+
}
|
|
69
|
+
await rename(temporary, join(folder, name));
|
|
70
|
+
if (process.platform !== 'win32') {
|
|
71
|
+
const d = await open(folder, 'r');
|
|
72
|
+
try {
|
|
73
|
+
await d.sync();
|
|
74
|
+
}
|
|
75
|
+
finally {
|
|
76
|
+
await d.close();
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
export async function runHistoryMigration(args, env = process.env, log = console.log, fetcher) {
|
|
81
|
+
if (args.length === 1 && args[0] === '--help') {
|
|
82
|
+
log('Prepare locally: robono-history-migrate --provider sendbird|stream --source export.json --mapping mapping.json --out new-private-folder\nApply/resume: robono-history-migrate --apply folder\nInspect plan.json and report.json first. Mapping supplies authorized conversation IDs and authenticated user IDs. Conversion needs no credentials. Applying requires ROBONO_API_KEY on your server.');
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
const options = new Map();
|
|
86
|
+
for (let i = 0; i < args.length; i += 2) {
|
|
87
|
+
const key = args[i], value = args[i + 1];
|
|
88
|
+
if (!key || !['--provider', '--source', '--mapping', '--out', '--apply'].includes(key) || !value || value.startsWith('--') || options.has(key))
|
|
89
|
+
throw Error('Invalid migration options. Use --help.');
|
|
90
|
+
options.set(key, value);
|
|
91
|
+
}
|
|
92
|
+
if (!options.has('--apply')) {
|
|
93
|
+
if (options.size !== 4 || !options.has('--out') || !options.has('--source') || !options.has('--mapping') || !['sendbird', 'stream'].includes(options.get('--provider') ?? ''))
|
|
94
|
+
throw Error('Supply --provider, --source, --mapping and --out.');
|
|
95
|
+
const plan = convertHistory(options.get('--provider'), await readJson(options.get('--source'), true), await readJson(options.get('--mapping')));
|
|
96
|
+
const folder = resolve(options.get('--out'));
|
|
97
|
+
await mkdir(folder, { mode: 0o700 });
|
|
98
|
+
if (plan.attachments?.length) {
|
|
99
|
+
await mkdir(join(folder, 'files'), { mode: 0o700 });
|
|
100
|
+
let total = 0;
|
|
101
|
+
for (const attachment of plan.attachments) {
|
|
102
|
+
const bytes = await readAttachment(dirname(resolve(options.get('--mapping'))), attachment.path);
|
|
103
|
+
total += bytes.length;
|
|
104
|
+
if (total > 536870912)
|
|
105
|
+
throw Error('Prepared attachment files exceed 512 MiB. Split the source by conversations.');
|
|
106
|
+
attachment.path = 'files/' + attachment.uploadId + '.bin';
|
|
107
|
+
attachment.sha256 = createHash('sha256').update(bytes).digest('hex');
|
|
108
|
+
attachment.file.byteSize = bytes.length;
|
|
109
|
+
const h = await open(join(folder, attachment.path), 'wx', 0o600);
|
|
110
|
+
try {
|
|
111
|
+
await h.writeFile(bytes);
|
|
112
|
+
await h.sync();
|
|
113
|
+
}
|
|
114
|
+
finally {
|
|
115
|
+
await h.close();
|
|
116
|
+
}
|
|
117
|
+
const message = plan.conversations.find(c => c.conversationId === attachment.conversationId)?.messages.find(m => m.sourceId === attachment.sourceId);
|
|
118
|
+
if (!message?.content.media)
|
|
119
|
+
throw Error('Invalid attachment reference.');
|
|
120
|
+
message.content.media.byteSize = bytes.length;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
await save(folder, 'plan.json', plan);
|
|
124
|
+
await save(folder, 'report.json', { version: 1, ready: plan.issues.length === 0 && plan.conversations.length > 0, conversations: plan.conversations.length, messages: plan.conversations.reduce((n, c) => n + c.messages.length, 0), issues: plan.issues, notices: plan.notices ?? [] });
|
|
125
|
+
log(`Prepared ${plan.conversations.length} conversations. ${plan.issues.length} items need attention; ${plan.notices?.length ?? 0} conversion notes; see the private report.json. Nothing sent.`);
|
|
126
|
+
return;
|
|
127
|
+
}
|
|
128
|
+
if (options.size !== 1)
|
|
129
|
+
throw Error('--apply takes only the previously prepared folder.');
|
|
130
|
+
const key = env.ROBONO_API_KEY;
|
|
131
|
+
if (!key)
|
|
132
|
+
throw Error('Set ROBONO_API_KEY privately on your server.');
|
|
133
|
+
const folder = resolve(options.get('--apply')), stat = await lstat(folder);
|
|
134
|
+
if (!stat.isDirectory() || stat.isSymbolicLink() || process.platform !== 'win32' && (stat.mode & 0o077) !== 0)
|
|
135
|
+
throw Error('Use the private migration folder created by this command.');
|
|
136
|
+
const lockPath = join(folder, '.migration.lock');
|
|
137
|
+
let lock;
|
|
138
|
+
try {
|
|
139
|
+
lock = await open(lockPath, 'wx', 0o600);
|
|
140
|
+
}
|
|
141
|
+
catch {
|
|
142
|
+
throw Error('Migration is locked. If an earlier process crashed, confirm it stopped before removing .migration.lock.');
|
|
143
|
+
}
|
|
144
|
+
try {
|
|
145
|
+
await lock.writeFile(JSON.stringify({ pid: process.pid }));
|
|
146
|
+
const plan = await readJson(join(folder, 'plan.json'));
|
|
147
|
+
if (plan.version !== 1 || !Array.isArray(plan.conversations) || !plan.conversations.length || plan.conversations.length > 10000 || !Array.isArray(plan.issues) || plan.issues.length)
|
|
148
|
+
throw Error('Resolve the conversion report before applying. No history has been sent.');
|
|
149
|
+
const destinations = new Set(), jobs = new Set();
|
|
150
|
+
for (const conversation of plan.conversations) {
|
|
151
|
+
validateHistoryImportFile(conversation);
|
|
152
|
+
if (destinations.has(conversation.conversationId) || jobs.has(conversation.jobId))
|
|
153
|
+
throw Error('Each conversation and job must occur only once.');
|
|
154
|
+
destinations.add(conversation.conversationId);
|
|
155
|
+
jobs.add(conversation.jobId);
|
|
156
|
+
}
|
|
157
|
+
const attachments = plan.attachments ?? [], attachmentTargets = new Set();
|
|
158
|
+
let attachmentBytes = 0;
|
|
159
|
+
if (!Array.isArray(attachments) || attachments.length > 100000)
|
|
160
|
+
throw Error('Invalid migration attachment list.');
|
|
161
|
+
for (const attachment of attachments) {
|
|
162
|
+
const target = JSON.stringify([attachment.conversationId, attachment.sourceId]), message = plan.conversations.find(c => c.conversationId === attachment.conversationId)?.messages.find(m => m.sourceId === attachment.sourceId);
|
|
163
|
+
if (attachmentTargets.has(target) || !message?.content.media || message.content.kind !== attachment.kind || message.content.media.assetId !== 'robono-r2:pending-' + attachment.uploadId || !/^files\/[0-9a-f-]{36}\.bin$/.test(attachment.path) || attachment.path !== 'files/' + attachment.uploadId + '.bin' || !/^[0-9a-f]{64}$/.test(attachment.sha256 ?? '') || !isDeepStrictEqual({ ...message.content.media, assetId: undefined }, { ...attachment.file, assetId: undefined }))
|
|
164
|
+
throw Error('Invalid migration attachment reference.');
|
|
165
|
+
attachmentTargets.add(target);
|
|
166
|
+
const bytes = await readAttachment(folder, attachment.path, { sha256: attachment.sha256, byteSize: attachment.file.byteSize });
|
|
167
|
+
attachmentBytes += bytes.length;
|
|
168
|
+
if (attachmentBytes > 536870912)
|
|
169
|
+
throw Error('Prepared attachment files exceed 512 MiB.');
|
|
170
|
+
}
|
|
171
|
+
for (const c of plan.conversations)
|
|
172
|
+
for (const m of c.messages)
|
|
173
|
+
if (m.content.media?.assetId.startsWith('robono-r2:pending-') && !attachmentTargets.has(JSON.stringify([c.conversationId, m.sourceId])))
|
|
174
|
+
throw Error('A prepared attachment is missing.');
|
|
175
|
+
const digest = createHash('sha256').update(JSON.stringify(plan)).digest('hex');
|
|
176
|
+
let progress = { version: 1, digest, completed: [] };
|
|
177
|
+
try {
|
|
178
|
+
const saved = await readJson(join(folder, 'progress.json'));
|
|
179
|
+
if (saved.version !== 1 || saved.digest !== digest || !Array.isArray(saved.completed) || saved.completed.some((v) => typeof v !== 'string' || !jobs.has(v)))
|
|
180
|
+
throw Error('The migration plan changed after applying. Restore the original plan before resuming.');
|
|
181
|
+
progress = saved;
|
|
182
|
+
}
|
|
183
|
+
catch (error) {
|
|
184
|
+
if (error.code !== 'ENOENT')
|
|
185
|
+
throw error;
|
|
186
|
+
}
|
|
187
|
+
await save(folder, 'progress.json', progress);
|
|
188
|
+
const importer = new RobonoHistoryImport({ apiKey: key, ...(fetcher ? { fetch: fetcher } : {}) });
|
|
189
|
+
for (const [index, conversation] of plan.conversations.entries()) {
|
|
190
|
+
// Always confirm completed jobs with the service; a local report is not proof of import.
|
|
191
|
+
for (let attempt = 0;; attempt++)
|
|
192
|
+
try {
|
|
193
|
+
const selected = attachments.filter(a => a.conversationId === conversation.conversationId);
|
|
194
|
+
let prepared = structuredClone(conversation);
|
|
195
|
+
if (selected.length) {
|
|
196
|
+
let resolved = false;
|
|
197
|
+
try {
|
|
198
|
+
const saved = await readJson(join(folder, 'resolved-' + conversation.jobId + '.json'));
|
|
199
|
+
if (saved.digest !== digest)
|
|
200
|
+
throw Error('The migration attachment checkpoint changed.');
|
|
201
|
+
validateHistoryImportFile(saved.conversation);
|
|
202
|
+
const expected = structuredClone(conversation), savedMessages = new Map(saved.conversation.messages.map((m) => [m.sourceId, m]));
|
|
203
|
+
for (const attachment of selected) {
|
|
204
|
+
const original = expected.messages.find(m => m.sourceId === attachment.sourceId), restored = savedMessages.get(attachment.sourceId);
|
|
205
|
+
if (!restored?.content.media || !restored.content.media.assetId.startsWith('robono-r2:') || restored.content.media.assetId.startsWith('robono-r2:pending-') || !isDeepStrictEqual({ ...restored.content.media, assetId: undefined }, { ...attachment.file, assetId: undefined }))
|
|
206
|
+
throw Error('Invalid attachment checkpoint.');
|
|
207
|
+
original.content.media = restored.content.media;
|
|
208
|
+
}
|
|
209
|
+
if (!isDeepStrictEqual(expected, saved.conversation))
|
|
210
|
+
throw Error('Invalid attachment checkpoint.');
|
|
211
|
+
prepared = saved.conversation;
|
|
212
|
+
resolved = true;
|
|
213
|
+
}
|
|
214
|
+
catch (error) {
|
|
215
|
+
if (error.code !== 'ENOENT')
|
|
216
|
+
throw error;
|
|
217
|
+
}
|
|
218
|
+
if (!resolved) {
|
|
219
|
+
const status = await importer.start({ jobId: conversation.jobId, conversationId: conversation.conversationId, authors: conversation.authors, count: conversation.messages.length });
|
|
220
|
+
if (status.state !== 'staging')
|
|
221
|
+
throw Error('Restore the original migration attachment checkpoint before resuming.');
|
|
222
|
+
for (const attachment of selected) {
|
|
223
|
+
const message = prepared.messages.find(m => m.sourceId === attachment.sourceId);
|
|
224
|
+
const bytes = await readAttachment(folder, attachment.path, { sha256: attachment.sha256, byteSize: attachment.file.byteSize });
|
|
225
|
+
message.content.media = await importer.upload({ jobId: conversation.jobId, conversationId: conversation.conversationId, authorId: message.authorId, uploadId: attachment.uploadId, kind: attachment.kind, file: attachment.file, bytes });
|
|
226
|
+
}
|
|
227
|
+
await save(folder, 'resolved-' + conversation.jobId + '.json', { digest, conversation: prepared });
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
const result = await importer.importMessages({ ...prepared, onProgress: (done, total) => log(`Conversation ${index + 1}/${plan.conversations.length}: ${done}/${total} prepared.`) });
|
|
231
|
+
if (result.state !== 'complete')
|
|
232
|
+
throw Error('Import did not complete.');
|
|
233
|
+
if (!progress.completed.includes(conversation.jobId))
|
|
234
|
+
progress.completed.push(conversation.jobId);
|
|
235
|
+
delete progress.failed;
|
|
236
|
+
await save(folder, 'progress.json', progress);
|
|
237
|
+
break;
|
|
238
|
+
}
|
|
239
|
+
catch (error) {
|
|
240
|
+
if (attempt < 8 && (error instanceof TypeError || error instanceof RobonoError && error.retryable)) {
|
|
241
|
+
log('Waiting for a connection or attachment check. Retrying this conversation.');
|
|
242
|
+
await new Promise(r => setTimeout(r, Math.min(15000, 1000 * 2 ** attempt)));
|
|
243
|
+
continue;
|
|
244
|
+
}
|
|
245
|
+
const code = error instanceof RobonoError && /^[a-z_]{1,80}$/.test(error.code) ? error.code : 'import_failed';
|
|
246
|
+
progress.failed = { jobId: conversation.jobId, code };
|
|
247
|
+
await save(folder, 'progress.json', progress);
|
|
248
|
+
throw Error(`Conversation ${index + 1} stopped (${code}). Earlier completed conversations are saved. Rerun the same command after resolving the cause.`);
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
log(`Migration complete: ${progress.completed.length} conversations. Keep this folder private for recovery.`);
|
|
252
|
+
}
|
|
253
|
+
finally {
|
|
254
|
+
await lock.close();
|
|
255
|
+
await unlink(lockPath);
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
if (process.argv[1] && import.meta.url === pathToFileURL(process.argv[1]).href)
|
|
259
|
+
runHistoryMigration(process.argv.slice(2)).catch(error => { console.error(error instanceof Error ? error.message : 'Migration failed.'); process.exitCode = 1; });
|
|
260
|
+
//# sourceMappingURL=history-migrate-cli.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"history-migrate-cli.js","sourceRoot":"","sources":["../src/history-migrate-cli.ts"],"names":[],"mappings":";AACA,OAAO,EAAC,SAAS,EAAC,MAAM,SAAS,CAAC;AAClC,OAAO,EAAC,IAAI,EAAC,KAAK,EAAC,KAAK,EAAC,MAAM,EAAC,MAAM,EAAC,MAAM,kBAAkB,CAAC;AAChE,OAAO,EAAC,IAAI,EAAC,OAAO,EAAC,OAAO,EAAC,UAAU,EAAC,MAAM,WAAW,CAAC;AAC1D,OAAO,EAAC,aAAa,EAAC,MAAM,UAAU,CAAC;AACvC,OAAO,EAAC,UAAU,EAAC,UAAU,EAAC,MAAM,aAAa,CAAC;AAClD,OAAO,EAAC,iBAAiB,EAAC,MAAM,WAAW,CAAC;AAC5C,OAAO,EAAC,cAAc,EAA2B,MAAM,sBAAsB,CAAC;AAC9E,OAAO,EAAC,yBAAyB,EAAC,MAAM,gCAAgC,CAAC;AACzE,OAAO,EAAC,mBAAmB,EAAC,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAC,WAAW,EAAC,MAAM,aAAa,CAAC;AAExC,KAAK,UAAU,cAAc,CAAC,IAAW,EAAC,IAAW,EAAC,QAAmD;IACxG,IAAG,OAAO,IAAI,KAAG,QAAQ,IAAE,CAAC,IAAI,IAAE,UAAU,CAAC,IAAI,CAAC,IAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAA,EAAE,CAAA,CAAC,CAAC,IAAE,CAAC,KAAG,GAAG,IAAE,CAAC,KAAG,IAAI,CAAC;QAAC,MAAM,KAAK,CAAC,uEAAuE,CAAC,CAAC;IAC7M,IAAI,IAAI,GAAC,IAAI,CAAC;IAAA,KAAI,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAC,CAAC;QAAA,IAAI,GAAC,IAAI,CAAC,IAAI,EAAC,IAAI,CAAC,CAAC;QAAA,IAAG,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,cAAc,EAAE;YAAC,MAAM,KAAK,CAAC,2CAA2C,CAAC,CAAC;IAAA,CAAC;IACxK,MAAM,CAAC,GAAC,MAAM,IAAI,CAAC,IAAI,EAAC,SAAS,CAAC,QAAQ,GAAC,CAAC,SAAS,CAAC,UAAU,IAAE,CAAC,CAAC,CAAC,CAAC;IACtE,IAAG,CAAC;QAAA,MAAM,IAAI,GAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;QAAA,IAAG,CAAC,IAAI,CAAC,MAAM,EAAE,IAAE,IAAI,CAAC,KAAK,KAAG,CAAC,IAAE,IAAI,CAAC,IAAI,GAAC,CAAC,IAAE,IAAI,CAAC,IAAI,GAAC,SAAS;YAAC,MAAM,KAAK,CAAC,sDAAsD,CAAC,CAAC;QACrK,MAAM,KAAK,GAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,CAAC;QAAA,IAAG,KAAK,CAAC,MAAM,KAAG,IAAI,CAAC,IAAI,IAAE,QAAQ,IAAE,CAAC,KAAK,CAAC,MAAM,KAAG,QAAQ,CAAC,QAAQ,IAAE,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,KAAG,QAAQ,CAAC,MAAM,CAAC;YAAC,MAAM,KAAK,CAAC,sEAAsE,CAAC,CAAC;QAAA,OAAO,KAAK,CAAC;IAC/Q,CAAC;YAAO,CAAC;QAAA,MAAM,CAAC,CAAC,KAAK,EAAE,CAAC;IAAA,CAAC;AAC3B,CAAC;AAED,KAAK,UAAU,QAAQ,CAAC,IAAW,EAAC,KAAK,GAAC,KAAK;IAC9C,MAAM,MAAM,GAAC,MAAM,IAAI,CAAC,IAAI,EAAC,SAAS,CAAC,QAAQ,GAAC,CAAC,SAAS,CAAC,UAAU,IAAE,CAAC,CAAC,CAAC,CAAC;IAC3E,IAAG,CAAC;QACH,MAAM,IAAI,GAAC,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;QAAA,IAAG,CAAC,IAAI,CAAC,MAAM,EAAE,IAAE,IAAI,CAAC,KAAK,KAAG,CAAC,IAAE,IAAI,CAAC,IAAI,GAAC,SAAS;YAAC,MAAM,KAAK,CAAC,mDAAmD,CAAC,CAAC;QACvJ,MAAM,IAAI,GAAC,MAAM,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QACzC,IAAG,CAAC;YAAA,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAAA,CAAC;QAAA,MAAK,CAAC;YAAA,IAAG,KAAK,EAAC,CAAC;gBAAA,IAAG,CAAC;oBAAA,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,IAAI,CAAA,EAAE,CAAA,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,CAAA,EAAE,CAAA,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;gBAAA,CAAC;gBAAA,MAAK,CAAC,CAAA,CAAC;YAAA,CAAC;YAAA,MAAM,KAAK,CAAC,0BAA0B,CAAC,CAAC;QAAA,CAAC;IACrL,CAAC;YAAO,CAAC;QAAA,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;IAAA,CAAC;AAChC,CAAC;AACD,KAAK,UAAU,IAAI,CAAC,MAAa,EAAC,IAAW,EAAC,KAAa;IAC1D,MAAM,SAAS,GAAC,IAAI,CAAC,MAAM,EAAC,QAAQ,GAAC,UAAU,EAAE,CAAC,CAAC;IAAA,MAAM,CAAC,GAAC,MAAM,IAAI,CAAC,SAAS,EAAC,IAAI,EAAC,KAAK,CAAC,CAAC;IAC5F,IAAG,CAAC;QAAA,MAAM,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,EAAC,IAAI,EAAC,CAAC,CAAC,GAAC,IAAI,CAAC,CAAC;QAAA,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;IAAA,CAAC;YAAO,CAAC;QAAA,MAAM,CAAC,CAAC,KAAK,EAAE,CAAC;IAAA,CAAC;IAClG,MAAM,MAAM,CAAC,SAAS,EAAC,IAAI,CAAC,MAAM,EAAC,IAAI,CAAC,CAAC,CAAC;IAC1C,IAAG,OAAO,CAAC,QAAQ,KAAG,OAAO,EAAC,CAAC;QAAA,MAAM,CAAC,GAAC,MAAM,IAAI,CAAC,MAAM,EAAC,GAAG,CAAC,CAAC;QAAA,IAAG,CAAC;YAAA,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;QAAA,CAAC;gBAAO,CAAC;YAAA,MAAM,CAAC,CAAC,KAAK,EAAE,CAAC;QAAA,CAAC;IAAA,CAAC;AAC7G,CAAC;AACD,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,IAAa,EAAC,MAAsB,OAAO,CAAC,GAAG,EAAC,MAAqB,OAAO,CAAC,GAAG,EAAC,OAAqB;IAC/I,IAAG,IAAI,CAAC,MAAM,KAAG,CAAC,IAAE,IAAI,CAAC,CAAC,CAAC,KAAG,QAAQ,EAAC,CAAC;QAAA,GAAG,CAAC,mYAAmY,CAAC,CAAC;QAAA,OAAO;IAAA,CAAC;IACzb,MAAM,OAAO,GAAC,IAAI,GAAG,EAAiB,CAAC;IAAA,KAAI,IAAI,CAAC,GAAC,CAAC,EAAC,CAAC,GAAC,IAAI,CAAC,MAAM,EAAC,CAAC,IAAE,CAAC,EAAC,CAAC;QAAA,MAAM,GAAG,GAAC,IAAI,CAAC,CAAC,CAAC,EAAC,KAAK,GAAC,IAAI,CAAC,CAAC,GAAC,CAAC,CAAC,CAAC;QAAA,IAAG,CAAC,GAAG,IAAE,CAAC,CAAC,YAAY,EAAC,UAAU,EAAC,WAAW,EAAC,OAAO,EAAC,SAAS,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAE,CAAC,KAAK,IAAE,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,IAAE,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC;YAAC,MAAM,KAAK,CAAC,wCAAwC,CAAC,CAAC;QAAA,OAAO,CAAC,GAAG,CAAC,GAAG,EAAC,KAAK,CAAC,CAAC;IAAA,CAAC;IACzT,IAAG,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,EAAC,CAAC;QAC3B,IAAG,OAAO,CAAC,IAAI,KAAG,CAAC,IAAE,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,IAAE,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,IAAE,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,IAAE,CAAC,CAAC,UAAU,EAAC,QAAQ,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,IAAE,EAAE,CAAC;YAAC,MAAM,KAAK,CAAC,mDAAmD,CAAC,CAAC;QACjO,MAAM,IAAI,GAAC,cAAc,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,CAAwB,EAAC,MAAM,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAE,EAAC,IAAI,CAAC,EAAC,MAAM,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,CAAE,CAAC,CAAC,CAAC;QACpK,MAAM,MAAM,GAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAE,CAAC,CAAC;QAAA,MAAM,KAAK,CAAC,MAAM,EAAC,EAAC,IAAI,EAAC,KAAK,EAAC,CAAC,CAAC;QAC7E,IAAG,IAAI,CAAC,WAAW,EAAE,MAAM,EAAC,CAAC;YAC5B,MAAM,KAAK,CAAC,IAAI,CAAC,MAAM,EAAC,OAAO,CAAC,EAAC,EAAC,IAAI,EAAC,KAAK,EAAC,CAAC,CAAC;YAAA,IAAI,KAAK,GAAC,CAAC,CAAC;YAC3D,KAAI,MAAM,UAAU,IAAI,IAAI,CAAC,WAAW,EAAC,CAAC;gBACzC,MAAM,KAAK,GAAC,MAAM,cAAc,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,CAAE,CAAC,CAAC,EAAC,UAAU,CAAC,IAAI,CAAC,CAAC;gBAAA,KAAK,IAAE,KAAK,CAAC,MAAM,CAAC;gBAClH,IAAG,KAAK,GAAC,SAAS;oBAAC,MAAM,KAAK,CAAC,8EAA8E,CAAC,CAAC;gBAC/G,UAAU,CAAC,IAAI,GAAC,QAAQ,GAAC,UAAU,CAAC,QAAQ,GAAC,MAAM,CAAC;gBAAA,UAAU,CAAC,MAAM,GAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBAAA,UAAU,CAAC,IAAI,CAAC,QAAQ,GAAC,KAAK,CAAC,MAAM,CAAC;gBAC7J,MAAM,CAAC,GAAC,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,EAAC,UAAU,CAAC,IAAI,CAAC,EAAC,IAAI,EAAC,KAAK,CAAC,CAAC;gBAAA,IAAG,CAAC;oBAAA,MAAM,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;oBAAA,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;gBAAA,CAAC;wBAAO,CAAC;oBAAA,MAAM,CAAC,CAAC,KAAK,EAAE,CAAC;gBAAA,CAAC;gBAClI,MAAM,OAAO,GAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAA,EAAE,CAAA,CAAC,CAAC,cAAc,KAAG,UAAU,CAAC,cAAc,CAAC,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAA,EAAE,CAAA,CAAC,CAAC,QAAQ,KAAG,UAAU,CAAC,QAAQ,CAAC,CAAC;gBAAA,IAAG,CAAC,OAAO,EAAE,OAAO,CAAC,KAAK;oBAAC,MAAM,KAAK,CAAC,+BAA+B,CAAC,CAAC;gBAAA,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,GAAC,KAAK,CAAC,MAAM,CAAC;YAChQ,CAAC;QACF,CAAC;QACD,MAAM,IAAI,CAAC,MAAM,EAAC,WAAW,EAAC,IAAI,CAAC,CAAC;QAAA,MAAM,IAAI,CAAC,MAAM,EAAC,aAAa,EAAC,EAAC,OAAO,EAAC,CAAC,EAAC,KAAK,EAAC,IAAI,CAAC,MAAM,CAAC,MAAM,KAAG,CAAC,IAAE,IAAI,CAAC,aAAa,CAAC,MAAM,GAAC,CAAC,EAAC,aAAa,EAAC,IAAI,CAAC,aAAa,CAAC,MAAM,EAAC,QAAQ,EAAC,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,EAAC,CAAC,EAAC,EAAE,CAAA,CAAC,GAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,EAAC,CAAC,CAAC,EAAC,MAAM,EAAC,IAAI,CAAC,MAAM,EAAC,OAAO,EAAC,IAAI,CAAC,OAAO,IAAE,EAAE,EAAC,CAAC,CAAC;QAChS,GAAG,CAAC,YAAY,IAAI,CAAC,aAAa,CAAC,MAAM,mBAAmB,IAAI,CAAC,MAAM,CAAC,MAAM,0BAA0B,IAAI,CAAC,OAAO,EAAE,MAAM,IAAE,CAAC,+DAA+D,CAAC,CAAC;QAAA,OAAO;IACxM,CAAC;IACD,IAAG,OAAO,CAAC,IAAI,KAAG,CAAC;QAAC,MAAM,KAAK,CAAC,oDAAoD,CAAC,CAAC;IACtF,MAAM,GAAG,GAAC,GAAG,CAAC,cAAc,CAAC;IAAA,IAAG,CAAC,GAAG;QAAC,MAAM,KAAK,CAAC,8CAA8C,CAAC,CAAC;IACjG,MAAM,MAAM,GAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAE,CAAC,EAAC,IAAI,GAAC,MAAM,KAAK,CAAC,MAAM,CAAC,CAAC;IACvE,IAAG,CAAC,IAAI,CAAC,WAAW,EAAE,IAAE,IAAI,CAAC,cAAc,EAAE,IAAE,OAAO,CAAC,QAAQ,KAAG,OAAO,IAAE,CAAC,IAAI,CAAC,IAAI,GAAC,KAAK,CAAC,KAAG,CAAC;QAAC,MAAM,KAAK,CAAC,2DAA2D,CAAC,CAAC;IAC1K,MAAM,QAAQ,GAAC,IAAI,CAAC,MAAM,EAAC,iBAAiB,CAAC,CAAC;IAAA,IAAI,IAAI,CAAC;IACvD,IAAG,CAAC;QAAA,IAAI,GAAC,MAAM,IAAI,CAAC,QAAQ,EAAC,IAAI,EAAC,KAAK,CAAC,CAAC;IAAA,CAAC;IAAA,MAAK,CAAC;QAAA,MAAM,KAAK,CAAC,yGAAyG,CAAC,CAAC;IAAA,CAAC;IACxK,IAAG,CAAC;QACH,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,EAAC,GAAG,EAAC,OAAO,CAAC,GAAG,EAAC,CAAC,CAAC,CAAC;QACxD,MAAM,IAAI,GAAC,MAAM,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAC,WAAW,CAAC,CAAyB,CAAC;QAC5E,IAAG,IAAI,CAAC,OAAO,KAAG,CAAC,IAAE,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,IAAE,CAAC,IAAI,CAAC,aAAa,CAAC,MAAM,IAAE,IAAI,CAAC,aAAa,CAAC,MAAM,GAAC,KAAK,IAAE,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,IAAE,IAAI,CAAC,MAAM,CAAC,MAAM;YAAC,MAAM,KAAK,CAAC,0EAA0E,CAAC,CAAC;QAC9P,MAAM,YAAY,GAAC,IAAI,GAAG,EAAU,EAAC,IAAI,GAAC,IAAI,GAAG,EAAU,CAAC;QAC5D,KAAI,MAAM,YAAY,IAAI,IAAI,CAAC,aAAa,EAAC,CAAC;YAAA,yBAAyB,CAAC,YAAY,CAAC,CAAC;YAAA,IAAG,YAAY,CAAC,GAAG,CAAC,YAAY,CAAC,cAAc,CAAC,IAAE,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,KAAK,CAAC;gBAAC,MAAM,KAAK,CAAC,iDAAiD,CAAC,CAAC;YAAA,YAAY,CAAC,GAAG,CAAC,YAAY,CAAC,cAAc,CAAC,CAAC;YAAA,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;QAAA,CAAC;QAChT,MAAM,WAAW,GAAC,IAAI,CAAC,WAAW,IAAE,EAAE,EAAC,iBAAiB,GAAC,IAAI,GAAG,EAAU,CAAC;QAAA,IAAI,eAAe,GAAC,CAAC,CAAC;QACjG,IAAG,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,IAAE,WAAW,CAAC,MAAM,GAAC,MAAM;YAAC,MAAM,KAAK,CAAC,oCAAoC,CAAC,CAAC;QAC5G,KAAI,MAAM,UAAU,IAAI,WAAW,EAAC,CAAC;YACpC,MAAM,MAAM,GAAC,IAAI,CAAC,SAAS,CAAC,CAAC,UAAU,CAAC,cAAc,EAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,EAAC,OAAO,GAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAA,EAAE,CAAA,CAAC,CAAC,cAAc,KAAG,UAAU,CAAC,cAAc,CAAC,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAA,EAAE,CAAA,CAAC,CAAC,QAAQ,KAAG,UAAU,CAAC,QAAQ,CAAC,CAAC;YAClN,IAAG,iBAAiB,CAAC,GAAG,CAAC,MAAM,CAAC,IAAE,CAAC,OAAO,EAAE,OAAO,CAAC,KAAK,IAAE,OAAO,CAAC,OAAO,CAAC,IAAI,KAAG,UAAU,CAAC,IAAI,IAAE,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,KAAG,oBAAoB,GAAC,UAAU,CAAC,QAAQ,IAAE,CAAC,6BAA6B,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAE,UAAU,CAAC,IAAI,KAAG,QAAQ,GAAC,UAAU,CAAC,QAAQ,GAAC,MAAM,IAAE,CAAC,gBAAgB,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,IAAE,EAAE,CAAC,IAAE,CAAC,iBAAiB,CAAC,EAAC,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,EAAC,OAAO,EAAC,SAAS,EAAC,EAAC,EAAC,GAAG,UAAU,CAAC,IAAI,EAAC,OAAO,EAAC,SAAS,EAAC,CAAC;gBAAC,MAAM,KAAK,CAAC,yCAAyC,CAAC,CAAC;YACxe,iBAAiB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YAAA,MAAM,KAAK,GAAC,MAAM,cAAc,CAAC,MAAM,EAAC,UAAU,CAAC,IAAI,EAAC,EAAC,MAAM,EAAC,UAAU,CAAC,MAAM,EAAC,QAAQ,EAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,EAAC,CAAC,CAAC;YAAA,eAAe,IAAE,KAAK,CAAC,MAAM,CAAC;YAClL,IAAG,eAAe,GAAC,SAAS;gBAAC,MAAM,KAAK,CAAC,2CAA2C,CAAC,CAAC;QACvF,CAAC;QACD,KAAI,MAAM,CAAC,IAAI,IAAI,CAAC,aAAa;YAAC,KAAI,MAAM,CAAC,IAAI,CAAC,CAAC,QAAQ;gBAAC,IAAG,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,UAAU,CAAC,oBAAoB,CAAC,IAAE,CAAC,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,cAAc,EAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;oBAAC,MAAM,KAAK,CAAC,mCAAmC,CAAC,CAAC;QACjP,MAAM,MAAM,GAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC7E,IAAI,QAAQ,GAAiF,EAAC,OAAO,EAAC,CAAC,EAAC,MAAM,EAAC,SAAS,EAAC,EAAE,EAAC,CAAC;QAC7H,IAAG,CAAC;YAAA,MAAM,KAAK,GAAC,MAAM,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAC,eAAe,CAAC,CAAC,CAAC;YAAA,IAAG,KAAK,CAAC,OAAO,KAAG,CAAC,IAAE,KAAK,CAAC,MAAM,KAAG,MAAM,IAAE,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,IAAE,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAS,EAAC,EAAE,CAAA,OAAO,CAAC,KAAG,QAAQ,IAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;gBAAC,MAAM,KAAK,CAAC,uFAAuF,CAAC,CAAC;YAAA,QAAQ,GAAC,KAAK,CAAC;QAAA,CAAC;QAAA,OAAM,KAAK,EAAC,CAAC;YAAA,IAAI,KAA+B,CAAC,IAAI,KAAG,QAAQ;gBAAC,MAAM,KAAK,CAAC;QAAA,CAAC;QACnZ,MAAM,IAAI,CAAC,MAAM,EAAC,eAAe,EAAC,QAAQ,CAAC,CAAC;QAC5C,MAAM,QAAQ,GAAC,IAAI,mBAAmB,CAAC,EAAC,MAAM,EAAC,GAAG,EAAC,GAAG,CAAC,OAAO,CAAA,CAAC,CAAA,EAAC,KAAK,EAAC,OAAO,EAAC,CAAA,CAAC,CAAA,EAAE,CAAC,EAAC,CAAC,CAAC;QACrF,KAAI,MAAM,CAAC,KAAK,EAAC,YAAY,CAAC,IAAI,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,EAAC,CAAC;YAC/D,yFAAyF;YACzF,KAAI,IAAI,OAAO,GAAC,CAAC,GAAE,OAAO,EAAE;gBAAC,IAAG,CAAC;oBAChC,MAAM,QAAQ,GAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAA,EAAE,CAAA,CAAC,CAAC,cAAc,KAAG,YAAY,CAAC,cAAc,CAAC,CAAC;oBAAA,IAAI,QAAQ,GAAC,eAAe,CAAC,YAAY,CAAC,CAAC;oBAChI,IAAG,QAAQ,CAAC,MAAM,EAAC,CAAC;wBACnB,IAAI,QAAQ,GAAC,KAAK,CAAC;wBACnB,IAAG,CAAC;4BAAA,MAAM,KAAK,GAAC,MAAM,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAC,WAAW,GAAC,YAAY,CAAC,KAAK,GAAC,OAAO,CAAC,CAAC,CAAC;4BAAA,IAAG,KAAK,CAAC,MAAM,KAAG,MAAM;gCAAC,MAAM,KAAK,CAAC,8CAA8C,CAAC,CAAC;4BAAA,yBAAyB,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;4BACtN,MAAM,QAAQ,GAAC,eAAe,CAAC,YAAY,CAAC,EAAC,aAAa,GAAC,IAAI,GAAG,CAAC,KAAK,CAAC,YAAY,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAK,EAAC,EAAE,CAAA,CAAC,CAAC,CAAC,QAAQ,EAAC,CAAC,CAAC,CAAC,CAAC,CAAC;4BAC7H,KAAI,MAAM,UAAU,IAAI,QAAQ,EAAC,CAAC;gCACjC,MAAM,QAAQ,GAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAA,EAAE,CAAA,CAAC,CAAC,QAAQ,KAAG,UAAU,CAAC,QAAQ,CAAE,EAAC,QAAQ,GAAK,aAAa,CAAC,GAAG,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;gCAChI,IAAG,CAAC,QAAQ,EAAE,OAAO,CAAC,KAAK,IAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,YAAY,CAAC,IAAE,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,oBAAoB,CAAC,IAAE,CAAC,iBAAiB,CAAC,EAAC,GAAG,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAC,OAAO,EAAC,SAAS,EAAC,EAAC,EAAC,GAAG,UAAU,CAAC,IAAI,EAAC,OAAO,EAAC,SAAS,EAAC,CAAC;oCAAC,MAAM,KAAK,CAAC,gCAAgC,CAAC,CAAC;gCAC/S,QAAQ,CAAC,OAAO,CAAC,KAAK,GAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC;4BAC/C,CAAC;4BACD,IAAG,CAAC,iBAAiB,CAAC,QAAQ,EAAC,KAAK,CAAC,YAAY,CAAC;gCAAC,MAAM,KAAK,CAAC,gCAAgC,CAAC,CAAC;4BACjG,QAAQ,GAAC,KAAK,CAAC,YAAY,CAAC;4BAAA,QAAQ,GAAC,IAAI,CAAC;wBAC3C,CAAC;wBAAA,OAAM,KAAK,EAAC,CAAC;4BAAA,IAAI,KAA+B,CAAC,IAAI,KAAG,QAAQ;gCAAC,MAAM,KAAK,CAAC;wBAAA,CAAC;wBAC/E,IAAG,CAAC,QAAQ,EAAC,CAAC;4BACd,MAAM,MAAM,GAAC,MAAM,QAAQ,CAAC,KAAK,CAAC,EAAC,KAAK,EAAC,YAAY,CAAC,KAAK,EAAC,cAAc,EAAC,YAAY,CAAC,cAAc,EAAC,OAAO,EAAC,YAAY,CAAC,OAAO,EAAC,KAAK,EAAC,YAAY,CAAC,QAAQ,CAAC,MAAM,EAAC,CAAC,CAAC;4BACzK,IAAG,MAAM,CAAC,KAAK,KAAG,SAAS;gCAAC,MAAM,KAAK,CAAC,uEAAuE,CAAC,CAAC;4BACjH,KAAI,MAAM,UAAU,IAAI,QAAQ,EAAC,CAAC;gCACjC,MAAM,OAAO,GAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAA,EAAE,CAAA,CAAC,CAAC,QAAQ,KAAG,UAAU,CAAC,QAAQ,CAAE,CAAC;gCAC3E,MAAM,KAAK,GAAC,MAAM,cAAc,CAAC,MAAM,EAAC,UAAU,CAAC,IAAI,EAAC,EAAC,MAAM,EAAC,UAAU,CAAC,MAAM,EAAC,QAAQ,EAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,EAAC,CAAC,CAAC;gCACtH,OAAO,CAAC,OAAO,CAAC,KAAK,GAAC,MAAM,QAAQ,CAAC,MAAM,CAAC,EAAC,KAAK,EAAC,YAAY,CAAC,KAAK,EAAC,cAAc,EAAC,YAAY,CAAC,cAAc,EAAC,QAAQ,EAAC,OAAO,CAAC,QAAQ,EAAC,QAAQ,EAAC,UAAU,CAAC,QAAQ,EAAC,IAAI,EAAC,UAAU,CAAC,IAAI,EAAC,IAAI,EAAC,UAAU,CAAC,IAAI,EAAC,KAAK,EAAC,CAAC,CAAC;4BAC3N,CAAC;4BACD,MAAM,IAAI,CAAC,MAAM,EAAC,WAAW,GAAC,YAAY,CAAC,KAAK,GAAC,OAAO,EAAC,EAAC,MAAM,EAAC,YAAY,EAAC,QAAQ,EAAC,CAAC,CAAC;wBACzF,CAAC;oBACF,CAAC;oBACD,MAAM,MAAM,GAAC,MAAM,QAAQ,CAAC,cAAc,CAAC,EAAC,GAAG,QAAQ,EAAC,UAAU,EAAC,CAAC,IAAI,EAAC,KAAK,EAAC,EAAE,CAAA,GAAG,CAAC,gBAAgB,KAAK,GAAC,CAAC,IAAI,IAAI,CAAC,aAAa,CAAC,MAAM,KAAK,IAAI,IAAI,KAAK,YAAY,CAAC,EAAC,CAAC,CAAC;oBAC3K,IAAG,MAAM,CAAC,KAAK,KAAG,UAAU;wBAAC,MAAM,KAAK,CAAC,0BAA0B,CAAC,CAAC;oBACrE,IAAG,CAAC,QAAQ,CAAC,SAAS,CAAC,QAAQ,CAAC,YAAY,CAAC,KAAK,CAAC;wBAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;oBAAA,OAAO,QAAQ,CAAC,MAAM,CAAC;oBAAA,MAAM,IAAI,CAAC,MAAM,EAAC,eAAe,EAAC,QAAQ,CAAC,CAAC;oBAAA,MAAM;gBAC1K,CAAC;gBAAA,OAAM,KAAK,EAAC,CAAC;oBACb,IAAG,OAAO,GAAC,CAAC,IAAE,CAAC,KAAK,YAAY,SAAS,IAAE,KAAK,YAAY,WAAW,IAAE,KAAK,CAAC,SAAS,CAAC,EAAC,CAAC;wBAAA,GAAG,CAAC,2EAA2E,CAAC,CAAC;wBAAA,MAAM,IAAI,OAAO,CAAC,CAAC,CAAA,EAAE,CAAA,UAAU,CAAC,CAAC,EAAC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAC,IAAI,GAAC,CAAC,IAAE,OAAO,CAAC,CAAC,CAAC,CAAC;wBAAA,SAAS;oBAAA,CAAC;oBAC1P,MAAM,IAAI,GAAC,KAAK,YAAY,WAAW,IAAE,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA,CAAC,CAAA,KAAK,CAAC,IAAI,CAAA,CAAC,CAAA,eAAe,CAAC;oBACtG,QAAQ,CAAC,MAAM,GAAC,EAAC,KAAK,EAAC,YAAY,CAAC,KAAK,EAAC,IAAI,EAAC,CAAC;oBAAA,MAAM,IAAI,CAAC,MAAM,EAAC,eAAe,EAAC,QAAQ,CAAC,CAAC;oBAAA,MAAM,KAAK,CAAC,gBAAgB,KAAK,GAAC,CAAC,aAAa,IAAI,iGAAiG,CAAC,CAAC;gBACpP,CAAC;QACF,CAAC;QACD,GAAG,CAAC,uBAAuB,QAAQ,CAAC,SAAS,CAAC,MAAM,wDAAwD,CAAC,CAAC;IAC/G,CAAC;YAAO,CAAC;QAAA,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;QAAA,MAAM,MAAM,CAAC,QAAQ,CAAC,CAAC;IAAA,CAAC;AACrD,CAAC;AACD,IAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAE,MAAM,CAAC,IAAI,CAAC,GAAG,KAAG,aAAa,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI;IAAC,mBAAmB,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAA,EAAE,GAAC,OAAO,CAAC,KAAK,CAAC,KAAK,YAAY,KAAK,CAAA,CAAC,CAAA,KAAK,CAAC,OAAO,CAAA,CAAC,CAAA,mBAAmB,CAAC,CAAC,CAAA,OAAO,CAAC,QAAQ,GAAC,CAAC,CAAC,CAAA,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { HistoryImportMessage } from './history-import.js';
|
|
2
|
+
/** Consume complete provider exports. Counts are checks, never invented voters. */
|
|
3
|
+
export declare function convertImportedPoll(provider: 'sendbird' | 'stream', p: any, exportedVotes: any[] | undefined, user: (v: any) => string | null): Pick<HistoryImportMessage, 'content' | 'interactions'>;
|
|
4
|
+
//# sourceMappingURL=history-polls.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"history-polls.d.ts","sourceRoot":"","sources":["../src/history-polls.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAC,oBAAoB,EAAC,MAAM,qBAAqB,CAAC;AAG9D,mFAAmF;AACnF,wBAAgB,mBAAmB,CAAC,QAAQ,EAAC,UAAU,GAAC,QAAQ,EAAC,CAAC,EAAC,GAAG,EAAC,aAAa,EAAC,GAAG,EAAE,GAAC,SAAS,EAAC,IAAI,EAAC,CAAC,CAAC,EAAC,GAAG,KAAG,MAAM,GAAC,IAAI,GAAE,IAAI,CAAC,oBAAoB,EAAC,SAAS,GAAC,cAAc,CAAC,CA8BlL"}
|