@robono/server 0.26.0 → 0.28.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.
Files changed (74) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/HISTORY-IMPORT.md +104 -5
  3. package/README.md +1 -1
  4. package/SBOM.spdx.json +9 -9
  5. package/dist/calling.d.ts +30 -0
  6. package/dist/calling.d.ts.map +1 -1
  7. package/dist/calling.js +13 -0
  8. package/dist/calling.js.map +1 -1
  9. package/dist/client.d.ts +22 -1
  10. package/dist/client.d.ts.map +1 -1
  11. package/dist/client.js +17 -3
  12. package/dist/client.js.map +1 -1
  13. package/dist/generated/history-import-interactions.d.ts +17 -0
  14. package/dist/generated/history-import-interactions.d.ts.map +1 -0
  15. package/dist/generated/history-import-interactions.js +40 -0
  16. package/dist/generated/history-import-interactions.js.map +1 -0
  17. package/dist/generated/interactions.d.ts +199 -0
  18. package/dist/generated/interactions.d.ts.map +1 -0
  19. package/dist/generated/interactions.js +89 -0
  20. package/dist/generated/interactions.js.map +1 -0
  21. package/dist/generated/sdk-versions.d.ts +7 -7
  22. package/dist/generated/sdk-versions.d.ts.map +1 -1
  23. package/dist/generated/sdk-versions.js +1 -1
  24. package/dist/generated/sdk-versions.js.map +1 -1
  25. package/dist/history-convert.d.ts +52 -0
  26. package/dist/history-convert.d.ts.map +1 -0
  27. package/dist/history-convert.js +276 -0
  28. package/dist/history-convert.js.map +1 -0
  29. package/dist/history-import-cli.d.ts +1 -7
  30. package/dist/history-import-cli.d.ts.map +1 -1
  31. package/dist/history-import-cli.js +4 -44
  32. package/dist/history-import-cli.js.map +1 -1
  33. package/dist/history-import-validation.d.ts +8 -0
  34. package/dist/history-import-validation.d.ts.map +1 -0
  35. package/dist/history-import-validation.js +85 -0
  36. package/dist/history-import-validation.js.map +1 -0
  37. package/dist/history-import.d.ts +8 -1
  38. package/dist/history-import.d.ts.map +1 -1
  39. package/dist/history-import.js +27 -6
  40. package/dist/history-import.js.map +1 -1
  41. package/dist/history-migrate-cli.d.ts +3 -0
  42. package/dist/history-migrate-cli.d.ts.map +1 -0
  43. package/dist/history-migrate-cli.js +260 -0
  44. package/dist/history-migrate-cli.js.map +1 -0
  45. package/dist/history-polls.d.ts +4 -0
  46. package/dist/history-polls.d.ts.map +1 -0
  47. package/dist/history-polls.js +66 -0
  48. package/dist/history-polls.js.map +1 -0
  49. package/dist/index.d.ts +3 -1
  50. package/dist/index.d.ts.map +1 -1
  51. package/dist/index.js +1 -0
  52. package/dist/index.js.map +1 -1
  53. package/dist/managed-media.d.ts +10 -0
  54. package/dist/managed-media.d.ts.map +1 -1
  55. package/dist/managed-media.js +2 -0
  56. package/dist/managed-media.js.map +1 -1
  57. package/dist/messaging-media.d.ts +16 -0
  58. package/dist/messaging-media.d.ts.map +1 -1
  59. package/dist/messaging-media.js +19 -0
  60. package/dist/messaging-media.js.map +1 -1
  61. package/dist/messaging.d.ts.map +1 -1
  62. package/dist/messaging.js +6 -1
  63. package/dist/messaging.js.map +1 -1
  64. package/dist/messenger-example.json +1 -1
  65. package/dist/messenger-install.d.ts +1 -1
  66. package/dist/push.d.ts.map +1 -1
  67. package/dist/push.js +1 -0
  68. package/dist/push.js.map +1 -1
  69. package/dist/types.d.ts +56 -3
  70. package/dist/types.d.ts.map +1 -1
  71. package/dist/webhooks.d.ts.map +1 -1
  72. package/dist/webhooks.js +10 -0
  73. package/dist/webhooks.js.map +1 -1
  74. package/package.json +2 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"history-convert.d.ts","sourceRoot":"","sources":["../src/history-convert.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAC,oBAAoB,EAAC,MAAM,qBAAqB,CAAC;AAG9D,OAAO,KAAK,EAAC,mBAAmB,EAAC,kBAAkB,EAAC,MAAM,sBAAsB,CAAC;AAGjF,MAAM,WAAW,wBAAwB;IAAE,IAAI,EAAC,MAAM,CAAC;IAAA,QAAQ,EAAC,MAAM,CAAC;IAAA,QAAQ,CAAC,EAAC,MAAM,CAAC;IAAA,UAAU,CAAC,EAAC,MAAM,CAAA;CAAC;AAC3G,MAAM,WAAW,uBAAuB;IACvC,aAAa,EAAC,MAAM,CAAC,MAAM,EAAC,MAAM,CAAC,CAAC;IACpC,KAAK,CAAC,EAAC,MAAM,CAAC,MAAM,EAAC,MAAM,CAAC,CAAC;IAC7B,uFAAuF;IACvF,eAAe,CAAC,EAAC,OAAO,CAAC;IACzB,SAAS,CAAC,EAAC,MAAM,CAAC,MAAM,EAAC,MAAM,CAAC,CAAC;IACjC,qFAAqF;IACrF,WAAW,CAAC,EAAC,MAAM,CAAC,MAAM,EAAC,MAAM,CAAC,MAAM,EAAC,wBAAwB,GAAC,wBAAwB,EAAE,CAAC,CAAC,CAAC;IAC/F,+EAA+E;IAC/E,KAAK,CAAC,EAAC,MAAM,CAAC,MAAM,EAAC,OAAO,CAAC,CAAC;CAC9B;AACD,MAAM,WAAW,sBAAsB;IAAE,MAAM,EAAC,MAAM,CAAC;IAAA,IAAI,EAAC,MAAM,CAAC;IAAA,QAAQ,CAAC,EAAC,MAAM,CAAC;IAAA,OAAO,CAAC,EAAC,MAAM,CAAA;CAAC;AACpG,MAAM,WAAW,oBAAoB;IACpC,OAAO,EAAC,CAAC,CAAC;IAAA,QAAQ,EAAC,UAAU,GAAC,QAAQ,CAAC;IACvC,aAAa,EAAC;QAAC,KAAK,EAAC,MAAM,CAAC;QAAA,cAAc,EAAC,MAAM,CAAC;QAAA,aAAa,EAAC,MAAM,CAAC;QAAA,OAAO,EAAC,MAAM,EAAE,CAAC;QAAA,QAAQ,EAAC,oBAAoB,EAAE,CAAA;KAAC,EAAE,CAAC;IAC3H,MAAM,EAAC,sBAAsB,EAAE,CAAC;IAChC,OAAO,CAAC,EAAC,sBAAsB,EAAE,CAAC;IAClC,WAAW,CAAC,EAAC;QAAC,cAAc,EAAC,MAAM,CAAC;QAAA,QAAQ,EAAC,MAAM,CAAC;QAAA,QAAQ,EAAC,MAAM,CAAC;QAAA,IAAI,EAAC,MAAM,CAAC;QAAA,IAAI,EAAC,kBAAkB,CAAC;QAAA,IAAI,EAAC,mBAAmB,CAAC;QAAA,MAAM,CAAC,EAAC,MAAM,CAAA;KAAC,EAAE,CAAC;CACnJ;AAMD;;GAEG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAC,UAAU,GAAC,QAAQ,EAAC,MAAM,EAAC,OAAO,EAAC,OAAO,EAAC,uBAAuB,GAAE,oBAAoB,CAwH/H"}
@@ -0,0 +1,276 @@
1
+ import { randomUUID, createHash } from 'node:crypto';
2
+ import { validateHistoryImportFile } from './history-import-validation.js';
3
+ import { validateReaction } from './generated/interactions.js';
4
+ import { convertImportedPoll } from './history-polls.js';
5
+ const object = (v) => v !== null && typeof v === 'object' && !Array.isArray(v);
6
+ const own = (v, k) => object(v) && Object.hasOwn(v, k) ? v[k] : undefined;
7
+ const id = (v) => typeof v === 'string' && v.length > 0 && v.length <= 200 && !/[\u0000-\u001f\u007f]/.test(v) && v === v.trim() ? v : typeof v === 'number' && Number.isSafeInteger(v) && v >= 0 ? String(v) : null;
8
+ 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;
9
+ /** Local-only conversion. Never downloads URLs or uses the old provider's keys.
10
+ * Any unsupported data is reported and prevents applying the generated plan.
11
+ */
12
+ export function convertHistory(provider, source, mapping) {
13
+ if (!['sendbird', 'stream'].includes(provider) || !object(mapping) || !object(mapping.conversations) || mapping.users !== undefined && !object(mapping.users) || mapping.reactions !== undefined && !object(mapping.reactions) || mapping.attachments !== undefined && !object(mapping.attachments) || mapping.polls !== undefined && !object(mapping.polls) || mapping.preserveUserIds !== undefined && typeof mapping.preserveUserIds !== 'boolean')
14
+ throw Error('Provide a supported provider and explicit conversation/user mapping.');
15
+ const targets = Object.values(mapping.conversations);
16
+ if (!targets.length || targets.some(v => typeof v !== 'string' || !uuid.test(v)) || new Set(targets).size !== targets.length)
17
+ throw Error('Map each source channel to a different authorized Robono conversation UUID.');
18
+ if (mapping.users) {
19
+ const values = Object.values(mapping.users);
20
+ if (values.some(v => !id(v)) || new Set(values).size !== values.length)
21
+ throw Error('Map each source user to a different authenticated user ID.');
22
+ }
23
+ const plan = { version: 1, provider, conversations: [], issues: [] };
24
+ const groups = new Map();
25
+ const rows = [];
26
+ function expand(value, channel) {
27
+ if (Array.isArray(value)) {
28
+ for (const v of value)
29
+ expand(v, channel);
30
+ return;
31
+ }
32
+ if (!object(value))
33
+ throw Error('Expected exported message objects or channel objects.');
34
+ if (Array.isArray(value.channels)) {
35
+ expand(value.channels);
36
+ return;
37
+ }
38
+ if (Array.isArray(value.messages)) {
39
+ const c = id(value.channel?.cid) ?? (id(value.channel?.type) && id(value.channel?.id) ? value.channel.type + ':' + value.channel.id : undefined) ?? id(value.channel_url) ?? channel;
40
+ for (const m of value.messages)
41
+ rows.push({ data: m, ...(c ? { channel: c } : {}) });
42
+ return;
43
+ }
44
+ if (provider === 'stream' && typeof value.type === 'string' && object(value.data)) {
45
+ if (['user', 'channel', 'member'].includes(value.type))
46
+ return; // membership remains the customer's explicit authorization
47
+ rows.push({ data: value.data, entity: value.type, ...(channel ? { channel } : {}) });
48
+ return;
49
+ }
50
+ rows.push({ data: value, ...(channel ? { channel } : {}) });
51
+ }
52
+ expand(source);
53
+ if (!rows.length || rows.length > 1000000)
54
+ throw Error('Provide 1–1,000,000 exported records.');
55
+ const issue = (record, code, data, channel) => { plan.issues.push({ record: record + 1, code, ...(id(data?.message_id ?? data?.id) ? { sourceId: id(data.message_id ?? data.id) } : {}), ...(channel ? { channel } : {}) }); };
56
+ const user = (value) => { const key = id(typeof value === 'object' ? value?.id : value); if (!key)
57
+ return null; return id(own(mapping.users, key) ?? (mapping.preserveUserIds ? key : null)); };
58
+ const pending = [];
59
+ const polls = new Map(), pollVotes = new Map(), usedPolls = new Set();
60
+ for (const [record, row] of rows.entries())
61
+ if (row.entity === 'poll') {
62
+ const pid = id(row.data?.id);
63
+ if (!pid || polls.has(pid))
64
+ issue(record, 'invalid_or_duplicate_poll', row.data);
65
+ else
66
+ polls.set(pid, row.data);
67
+ }
68
+ else if (row.entity === 'poll_vote') {
69
+ const pid = id(row.data?.poll_id);
70
+ if (!pid)
71
+ issue(record, 'poll_vote_mapping_required', row.data);
72
+ else {
73
+ const list = pollVotes.get(pid) ?? [];
74
+ list.push(row.data);
75
+ pollVotes.set(pid, list);
76
+ }
77
+ }
78
+ for (const [record, row] of rows.entries()) {
79
+ const m = row.data;
80
+ if (!object(m)) {
81
+ issue(record, 'invalid_record', m);
82
+ continue;
83
+ }
84
+ const channel = id(m.channel_url ?? m.cid) ?? (id(m.channel_type) && id(m.channel_id) ? m.channel_type + ':' + m.channel_id : row.channel);
85
+ if (row.entity && row.entity !== 'message') {
86
+ if (['poll', 'poll_vote'].includes(row.entity))
87
+ continue;
88
+ if (row.entity === 'reaction')
89
+ pending.push({ record, data: m, ...(channel ? { channel } : {}) });
90
+ else
91
+ issue(record, 'unsupported_entity_' + row.entity, m, channel);
92
+ continue;
93
+ }
94
+ const destination = channel && own(mapping.conversations, channel);
95
+ if (!destination) {
96
+ issue(record, 'conversation_mapping_required', m, channel);
97
+ continue;
98
+ }
99
+ if (m.is_removed === true || m.deleted_at || m.type === 'deleted') {
100
+ issue(record, 'deleted_message_excluded', m, channel);
101
+ continue;
102
+ }
103
+ if (provider === 'sendbird' && !['MESG', 'FILE'].includes(m.type) || provider === 'stream' && m.type && !['regular', 'reply'].includes(m.type)) {
104
+ issue(record, 'unsupported_message_type', m, channel);
105
+ continue;
106
+ }
107
+ const pollId = id(m.poll_id ?? m.poll?.id), hasPoll = !!(m.poll || pollId);
108
+ let convertedPoll;
109
+ if (hasPoll) {
110
+ const definition = m.poll ?? (pollId ? polls.get(pollId) ?? own(mapping.polls, pollId) : undefined);
111
+ try {
112
+ convertedPoll = convertImportedPoll(provider, definition, pollId && polls.has(pollId) ? pollVotes.get(pollId) ?? [] : undefined, user);
113
+ if (pollId)
114
+ usedPolls.add(pollId);
115
+ }
116
+ catch (error) {
117
+ issue(record, error instanceof Error ? error.message : 'invalid_poll', m, channel);
118
+ continue;
119
+ }
120
+ }
121
+ const sourceId = id(provider === 'sendbird' ? m.message_id : m.id), authorId = user(provider === 'sendbird' ? m.user?.user_id ?? m.sender?.user_id ?? m.user_id : m.user_id ?? m.user);
122
+ const hasFile = m.type === 'FILE' || Array.isArray(m.attachments) && m.attachments.length || m.url || m.files;
123
+ const attachment = sourceId && own(own(mapping.attachments, channel), sourceId);
124
+ if (hasFile && !attachment) {
125
+ issue(record, 'private_attachment_mapping_required', m, channel);
126
+ continue;
127
+ }
128
+ const files = hasFile ? (Array.isArray(attachment) ? attachment : [attachment]) : [];
129
+ const count = Array.isArray(m.attachments) && m.attachments.length ? m.attachments.length : Array.isArray(m.files) && m.files.length ? m.files.length : 1;
130
+ if (hasFile && (files.length !== count || count > 100)) {
131
+ issue(record, 'attachment_count_mismatch', m, channel);
132
+ continue;
133
+ }
134
+ const rawDate = provider === 'sendbird' ? m.created_at : m.created_at;
135
+ const time = typeof rawDate === 'number' && Number.isSafeInteger(rawDate) ? rawDate : typeof rawDate === 'string' ? Date.parse(rawDate) : NaN;
136
+ const text = provider === 'sendbird' ? m.message : m.text;
137
+ if (!sourceId || !authorId || !Number.isFinite(time) || time < 0 || time > Date.now() || !hasFile && !hasPoll && (typeof text !== 'string' || !text.trim())) {
138
+ issue(record, 'invalid_message_or_user_mapping', m, channel);
139
+ continue;
140
+ }
141
+ let group = groups.get(channel);
142
+ if (!group) {
143
+ group = { jobId: randomUUID(), conversationId: destination, sourceChannel: channel, authors: [], messages: [] };
144
+ groups.set(channel, group);
145
+ }
146
+ const message = { sourceId, authorId, sentAt: new Date(time).toISOString(), content: { kind: 'text', text } };
147
+ if (convertedPoll) {
148
+ Object.assign(message, convertedPoll);
149
+ if (hasFile || typeof text === 'string' && text.trim() && text.trim() !== convertedPoll.content.poll?.question)
150
+ issue(record, 'poll_message_text_requires_mapping', m, channel);
151
+ }
152
+ const extraMessages = [];
153
+ if (hasFile)
154
+ for (const [fileIndex, attachment] of files.entries()) {
155
+ if (!object(attachment) || typeof attachment.path !== 'string' || !attachment.path.trim() || typeof attachment.mimeType !== 'string' || !/^[-a-z0-9+.]+\/[-a-z0-9+.]+$/.test(attachment.mimeType)) {
156
+ issue(record, 'invalid_attachment_mapping', m, channel);
157
+ continue;
158
+ }
159
+ const mimeType = attachment.mimeType, kind = mimeType.startsWith('image/') ? 'image' : mimeType.startsWith('video/') ? 'video' : mimeType.startsWith('audio/') ? 'voice' : 'document';
160
+ if (['voice', 'video'].includes(kind) && (!Number.isSafeInteger(attachment.durationMs) || attachment.durationMs < 1)) {
161
+ issue(record, 'attachment_duration_required', m, channel);
162
+ continue;
163
+ }
164
+ const file = { mimeType, fileName: attachment.fileName ?? attachment.path.split(/[\\/]/).at(-1), byteSize: 0, ...(attachment.durationMs ? { durationMs: attachment.durationMs } : {}) };
165
+ if (!file.fileName || file.fileName.length > 240 || /[\u0000-\u001f\u007f]/.test(file.fileName)) {
166
+ issue(record, 'invalid_attachment_mapping', m, channel);
167
+ continue;
168
+ }
169
+ const item = fileIndex === 0 ? message : { sourceId: 'file:' + createHash('sha256').update(JSON.stringify([sourceId, fileIndex])).digest('hex'), authorId, sentAt: message.sentAt, content: { kind: 'text', text: '' } };
170
+ const uploadId = randomUUID();
171
+ item.content = { kind, ...(fileIndex === 0 && typeof text === 'string' && text.trim() ? { text } : {}), media: { ...file, assetId: 'robono-r2:pending-' + uploadId } };
172
+ (plan.attachments ??= []).push({ conversationId: destination, sourceId: item.sourceId, uploadId, path: attachment.path, kind, file });
173
+ if (fileIndex > 0)
174
+ extraMessages.push(item);
175
+ }
176
+ const thread = id(m.parent_message_id ?? m.parent_id);
177
+ const parent = id(m.quoted_message_id) ?? thread;
178
+ if (parent && parent !== '0')
179
+ message.replyToSourceId = parent;
180
+ if (thread && thread !== '0')
181
+ message.threadRootSourceId = thread;
182
+ // Vendor metadata is retained as custom data rather than mistaken for executable actions.
183
+ const understood = new Set(['message_id', 'id', 'type', 'channel_url', 'cid', 'channel_type', 'channel_id', 'user', 'sender', 'user_id', 'created_at', 'updated_at', 'message', 'text', 'data', 'custom_type', 'attachments', 'url', 'files', 'poll', 'poll_id', 'parent_message_id', 'parent_id', 'quoted_message_id', 'pinned', 'is_pinned', 'pinned_by_id', 'pinned_by', 'pinned_at', 'reactions', 'latest_reactions', 'is_removed', 'deleted_at', 'request_id', 'req_id', 'message_survival_seconds', 'reply_count', 'thread_participants', 'own_reactions', 'reaction_counts', 'reaction_scores', 'reaction_groups', 'mentioned_users', 'mentioned_user_ids', 'mention_type', 'silent', 'hide_push', 'show_in_channel', 'is_reply_to_channel', 'pinned_expires', 'pin_expires', 'file', 'size', 'name', 'thumbnails']);
184
+ const extra = Object.fromEntries(Object.entries(m).filter(([key]) => !understood.has(key)));
185
+ if (m.silent || m.hide_push || m.show_in_channel || m.is_reply_to_channel || m.pinned_expires || m.pin_expires || m.message_survival_seconds)
186
+ issue(record, 'message_behavior_requires_mapping', m, channel);
187
+ if (m.data !== undefined && m.data !== '' || m.custom_type || Object.keys(extra).length) {
188
+ if (hasFile || hasPoll)
189
+ issue(record, 'nontext_custom_metadata_requires_mapping', m, channel);
190
+ else
191
+ message.content.custom = { type: provider + '.message', version: 1, data: { ...(m.data !== undefined ? { data: m.data } : {}), ...(m.custom_type ? { customType: m.custom_type } : {}), ...(Object.keys(extra).length ? { extra } : {}) } };
192
+ }
193
+ if (m.pinned || m.is_pinned) {
194
+ const pinnedBy = user(m.pinned_by_id ?? m.pinned_by?.user_id ?? m.pinned_by), date = typeof m.pinned_at === 'number' ? m.pinned_at : Date.parse(m.pinned_at);
195
+ if (!pinnedBy || !Number.isFinite(date) || date < time || date > Date.now())
196
+ issue(record, 'pin_author_and_date_required', m, channel);
197
+ else
198
+ message.interactions = { ...message.interactions, pin: { userId: pinnedBy, createdAt: new Date(date).toISOString() } };
199
+ }
200
+ if (Array.isArray(m.reactions))
201
+ for (const reaction of m.reactions) {
202
+ if (provider === 'sendbird') {
203
+ if (!Array.isArray(reaction.user_ids)) {
204
+ issue(record, 'reaction_users_missing', m, channel);
205
+ continue;
206
+ }
207
+ for (const uid of reaction.user_ids)
208
+ pending.push({ record, data: { message_id: sourceId, user_id: uid, type: reaction.key }, channel: channel });
209
+ }
210
+ else
211
+ pending.push({ record, data: { ...reaction, message_id: sourceId }, channel: channel });
212
+ }
213
+ if (m.latest_reactions?.length && !m.reactions)
214
+ issue(record, 'complete_reaction_list_required', m, channel);
215
+ for (const extra of extraMessages) {
216
+ if (message.replyToSourceId)
217
+ extra.replyToSourceId = message.replyToSourceId;
218
+ if (message.threadRootSourceId)
219
+ extra.threadRootSourceId = message.threadRootSourceId;
220
+ }
221
+ if (extraMessages.length)
222
+ (plan.notices ??= []).push({ record: record + 1, code: 'attachments_converted_to_consecutive_messages', sourceId, channel: channel });
223
+ group.messages.push(message, ...extraMessages);
224
+ }
225
+ for (const pid of new Set([...polls.keys(), ...pollVotes.keys()]))
226
+ if (!usedPolls.has(pid))
227
+ plan.issues.push({ record: 0, code: 'unreferenced_poll_or_votes' });
228
+ const messageIndex = new Map(), channelMessageIndex = new Map();
229
+ for (const g of groups.values())
230
+ for (const m of g.messages) {
231
+ const key = JSON.stringify([g.sourceChannel, m.sourceId]);
232
+ messageIndex.set(m.sourceId, [...(messageIndex.get(m.sourceId) ?? []), m]);
233
+ channelMessageIndex.set(key, [...(channelMessageIndex.get(key) ?? []), m]);
234
+ }
235
+ for (const { record, data: r, channel } of pending) {
236
+ const mid = id(r.message_id);
237
+ const matches = mid ? (channel ? channelMessageIndex.get(JSON.stringify([channel, mid])) : messageIndex.get(mid)) ?? [] : [];
238
+ const authorId = user(r.user_id ?? r.user);
239
+ const emoji = own(mapping.reactions, String(r.type)) ?? r.type;
240
+ if (matches.length !== 1 || !authorId) {
241
+ issue(record, 'reaction_target_or_user_missing', r, channel);
242
+ continue;
243
+ }
244
+ try {
245
+ if (!validateReaction(emoji))
246
+ throw Error();
247
+ }
248
+ catch {
249
+ issue(record, 'reaction_mapping_required', r, channel);
250
+ continue;
251
+ }
252
+ const m = matches[0];
253
+ m.interactions ??= {};
254
+ m.interactions.reactions ??= [];
255
+ const existing = m.interactions.reactions.find(v => v.userId === authorId);
256
+ if (existing) {
257
+ if (existing.emoji !== emoji)
258
+ issue(record, 'multiple_reactions_per_person', r, channel);
259
+ continue;
260
+ }
261
+ m.interactions.reactions.push({ userId: authorId, emoji });
262
+ }
263
+ for (const group of groups.values()) {
264
+ group.messages.sort((a, b) => Date.parse(a.sentAt) - Date.parse(b.sentAt));
265
+ group.authors = [...new Set(group.messages.flatMap(m => [m.authorId, ...(m.interactions?.pin ? [m.interactions.pin.userId] : []), ...(m.interactions?.reactions ?? []).map(r => r.userId), ...(m.interactions?.votes ?? []).map(r => r.userId)]))].sort();
266
+ try {
267
+ validateHistoryImportFile(group);
268
+ }
269
+ catch {
270
+ plan.issues.push({ record: 0, channel: group.sourceChannel, code: 'conversation_validation_failed' });
271
+ }
272
+ plan.conversations.push(group);
273
+ }
274
+ return plan;
275
+ }
276
+ //# sourceMappingURL=history-convert.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"history-convert.js","sourceRoot":"","sources":["../src/history-convert.ts"],"names":[],"mappings":"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"}
@@ -1,11 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import { type HistoryImportMessage } from './history-import.js';
2
+ export { validateHistoryImportFile } from './history-import-validation.js';
3
3
  /** Private JSON export: never print message bodies or keys. Validation does not contact Robono. */
4
4
  export declare function runHistoryImport(args: string[], env?: NodeJS.ProcessEnv, log?: (line: string) => void): Promise<void>;
5
- export declare function validateHistoryImportFile(value: any): asserts value is {
6
- jobId: string;
7
- conversationId: string;
8
- authors: string[];
9
- messages: HistoryImportMessage[];
10
- };
11
5
  //# sourceMappingURL=history-import-cli.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"history-import-cli.d.ts","sourceRoot":"","sources":["../src/history-import-cli.ts"],"names":[],"mappings":";AAGA,OAAO,EAAqB,KAAK,oBAAoB,EAAC,MAAM,qBAAqB,CAAC;AAGlF,mGAAmG;AACnG,wBAAsB,gBAAgB,CAAC,IAAI,EAAC,MAAM,EAAE,EAAC,GAAG,GAAC,MAAM,CAAC,UAAsB,EAAC,GAAG,GAAC,CAAC,IAAI,EAAC,MAAM,KAAG,IAAgB,iBAkBzH;AACD,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,CAqB1J"}
1
+ {"version":3,"file":"history-import-cli.d.ts","sourceRoot":"","sources":["../src/history-import-cli.ts"],"names":[],"mappings":";AAMA,OAAO,EAAC,yBAAyB,EAAC,MAAM,gCAAgC,CAAC;AACzE,mGAAmG;AACnG,wBAAsB,gBAAgB,CAAC,IAAI,EAAC,MAAM,EAAE,EAAC,GAAG,GAAC,MAAM,CAAC,UAAsB,EAAC,GAAG,GAAC,CAAC,IAAI,EAAC,MAAM,KAAG,IAAgB,iBAkBzH"}
@@ -3,7 +3,8 @@ import { readFile, stat } from 'node:fs/promises';
3
3
  import { pathToFileURL } from 'node:url';
4
4
  import { RobonoHistoryImport } from './history-import.js';
5
5
  import { RobonoError } from './errors.js';
6
- import { validateCustomMessage, customMessageScreeningText } from './generated/custom-messages.js';
6
+ import { validateHistoryImportFile } from './history-import-validation.js';
7
+ export { validateHistoryImportFile } from './history-import-validation.js';
7
8
  /** Private JSON export: never print message bodies or keys. Validation does not contact Robono. */
8
9
  export async function runHistoryImport(args, env = process.env, log = console.log) {
9
10
  const flags = new Set(args.filter(a => a === '--apply' || a === '--help'));
@@ -15,8 +16,8 @@ export async function runHistoryImport(args, env = process.env, log = console.lo
15
16
  if (rest.length !== 2 || rest[0] !== '--file' || !rest[1])
16
17
  throw Error('Use --file history.json, with --apply when ready.');
17
18
  const info = await stat(rest[1]);
18
- if (!info.isFile() || info.size > 33554432)
19
- throw Error('Use a JSON file no larger than 32 MiB.');
19
+ if (!info.isFile() || info.size > 268435456)
20
+ throw Error('Use a JSON file no larger than 256 MiB.');
20
21
  let input;
21
22
  try {
22
23
  input = JSON.parse(await readFile(rest[1], 'utf8'));
@@ -48,47 +49,6 @@ export async function runHistoryImport(args, env = process.env, log = console.lo
48
49
  }
49
50
  }
50
51
  }
51
- export function validateHistoryImportFile(value) {
52
- 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;
53
- const id = (v) => typeof v === 'string' && v.length > 0 && v.length <= 200 && v === v.trim() && !/[\u0000-\u001f\u007f]/.test(v);
54
- 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)
55
- throw Error('Provide UUID jobId and conversationId and a unique authors list.');
56
- if (!Array.isArray(value.messages) || !value.messages.length || value.messages.length > 10000)
57
- throw Error('Include 1–10,000 messages.');
58
- const ids = new Map(), order = new Map();
59
- for (const [index, message] of value.messages.entries()) {
60
- const fail = (reason) => { throw Error(`Message ${index + 1}: ${reason}`); };
61
- if (!message || !id(message.sourceId) || ids.has(message.sourceId) || !value.authors.includes(message.authorId))
62
- fail('use a unique sourceId and an author from the authors list.');
63
- const sent = Date.parse(message.sentAt);
64
- if (typeof message.sentAt !== 'string' || !Number.isFinite(sent) || sent < 0 || sent > Date.now())
65
- fail('sentAt must be a valid past date.');
66
- const c = message.content;
67
- if (!c || !['text', 'image', 'video', 'voice', 'document'].includes(c.kind) || Object.keys(c).some(k => !['kind', 'text', 'media', 'custom'].includes(k)))
68
- fail('provide supported content only.');
69
- if (c.kind === 'text' && (typeof c.text !== 'string' || !c.text.trim() || c.text.length > 10000 || c.media))
70
- fail('text must contain 1–10,000 characters.');
71
- if (c.custom !== undefined) {
72
- if (c.kind !== 'text')
73
- fail('custom messages require a text fallback.');
74
- try {
75
- customMessageScreeningText(c.text, validateCustomMessage(c.custom));
76
- }
77
- catch {
78
- fail('custom message data or fallback is invalid.');
79
- }
80
- }
81
- if (c.kind !== 'text' && (!c.media || typeof c.media.assetId !== 'string' || !c.media.assetId.startsWith('robono-r2:')))
82
- fail('upload attachments privately through importer.upload first. Public source URLs are not accepted.');
83
- if (message.replyToSourceId !== undefined && !id(message.replyToSourceId))
84
- fail('replyToSourceId must be an original source ID.');
85
- ids.set(message.sourceId, sent);
86
- order.set(message.sourceId, index);
87
- }
88
- for (const [index, message] of value.messages.entries())
89
- 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))
90
- throw Error(`Message ${index + 1}: the original reply target must exist and precede this message.`);
91
- }
92
52
  if (process.argv[1] && import.meta.url === pathToFileURL(process.argv[1]).href)
93
53
  runHistoryImport(process.argv.slice(2)).catch(error => { console.error(error instanceof Error ? error.message : 'History import failed.'); process.exitCode = 1; });
94
54
  //# sourceMappingURL=history-import-cli.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"history-import-cli.js","sourceRoot":"","sources":["../src/history-import-cli.ts"],"names":[],"mappings":"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"}
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,OAAO,EAAC,yBAAyB,EAAC,MAAM,gCAAgC,CAAC;AACzE,OAAO,EAAC,yBAAyB,EAAC,MAAM,gCAAgC,CAAC;AACzE,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,SAAS;QAAC,MAAM,KAAK,CAAC,yCAAyC,CAAC,CAAC;IAC7H,IAAI,KAAS,CAAC;IAAA,IAAG,CAAC;QAAA,KAAK,GAAC,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAC,MAAM,CAAC,CAAC,CAAC;IAAA,CAAC;IAAA,MAAK,CAAC;QAAA,MAAM,KAAK,CAAC,0CAA0C,CAAC,CAAC;IAAA,CAAC;IACnI,yBAAyB,CAAC,KAAK,CAAC,CAAC;IACjC,GAAG,CAAC,aAAa,KAAK,CAAC,QAAQ,CAAC,MAAM,kBAAkB,KAAK,CAAC,OAAO,CAAC,MAAM,WAAW,CAAC,CAAC;IACzF,IAAG,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,EAAC,CAAC;QAAA,GAAG,CAAC,6EAA6E,CAAC,CAAC;QAAA,OAAO;IAAA,CAAC;IACrH,MAAM,MAAM,GAAC,GAAG,CAAC,cAAc,CAAC;IAAA,IAAG,CAAC,MAAM;QAAC,MAAM,KAAK,CAAC,gFAAgF,CAAC,CAAC;IACzI,MAAM,QAAQ,GAAC,IAAI,mBAAmB,CAAC,EAAC,MAAM,EAAC,CAAC,CAAC;IACjD,KAAI,IAAI,OAAO,GAAC,CAAC,GAAE,OAAO,EAAE,EAAC,CAAC;QAC7B,IAAG,CAAC;YAAA,MAAM,MAAM,GAAC,MAAM,QAAQ,CAAC,cAAc,CAAC,EAAC,GAAG,KAAK,EAAC,UAAU,EAAC,CAAC,IAAW,EAAC,KAAY,EAAC,EAAE,CAAA,GAAG,CAAC,YAAY,IAAI,IAAI,KAAK,GAAG,CAAC,EAAC,CAAC,CAAC;YAAA,GAAG,CAAC,UAAU,MAAM,CAAC,KAAK,KAAK,MAAM,CAAC,aAAa,IAAE,KAAK,CAAC,QAAQ,CAAC,MAAM,YAAY,CAAC,CAAC;YAAA,OAAO;QAAA,CAAC;QACpO,OAAM,KAAK,EAAC,CAAC;YACZ,IAAG,OAAO,IAAE,CAAC,IAAE,CAAC,CAAC,KAAK,YAAY,SAAS,IAAE,KAAK,YAAY,WAAW,IAAE,KAAK,CAAC,SAAS,CAAC;gBAAC,MAAM,KAAK,CAAC;YACxG,GAAG,CAAC,0DAA0D,CAAC,CAAC;YAAA,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;QACrI,CAAC;IACF,CAAC;AACF,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,gBAAgB,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,wBAAwB,CAAC,CAAC,CAAA,OAAO,CAAC,QAAQ,GAAC,CAAC,CAAC,CAAA,CAAC,CAAC,CAAC"}
@@ -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":"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"}
@@ -1,3 +1,5 @@
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';
3
5
  import type { CustomMessageContent } from './generated/custom-messages.js';
@@ -6,18 +8,22 @@ export interface HistoryImportMessage {
6
8
  authorId: string;
7
9
  sentAt: string;
8
10
  content: {
9
- kind: 'text' | 'voice' | 'image' | 'video' | 'document';
11
+ kind: 'text' | 'voice' | 'image' | 'video' | 'document' | 'poll';
12
+ poll?: MessagePoll;
10
13
  text?: string;
11
14
  media?: MessagingStoredMedia;
12
15
  custom?: CustomMessageContent;
13
16
  };
14
17
  replyToSourceId?: string;
18
+ threadRootSourceId?: string;
19
+ interactions?: HistoryInteractions;
15
20
  }
16
21
  export interface HistoryImportStatus {
17
22
  jobId: string;
18
23
  state: 'staging' | 'committing' | 'complete' | 'cancelled';
19
24
  expiresAt?: string;
20
25
  stagedCount?: number;
26
+ inputDigest?: string;
21
27
  importedCount?: number;
22
28
  }
23
29
  /** Server-only. A manage-scoped key cannot be exposed in an app or browser. */
@@ -36,6 +42,7 @@ export declare class RobonoHistoryImport {
36
42
  conversationId: string;
37
43
  authors: string[];
38
44
  count: number;
45
+ inputDigest?: string;
39
46
  }): Promise<HistoryImportStatus>;
40
47
  append(jobId: string, messages: Array<HistoryImportMessage & {
41
48
  ordinal: number;
@@ -1 +1 @@
1
- {"version":3,"file":"history-import.d.ts","sourceRoot":"","sources":["../src/history-import.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,kBAAkB,EAAC,MAAM,oBAAoB,CAAC;AACtD,OAAO,KAAK,EAAC,oBAAoB,EAAC,mBAAmB,EAAC,kBAAkB,EAAC,MAAM,sBAAsB,CAAC;AACtG,OAAO,KAAK,EAAC,oBAAoB,EAAC,MAAM,gCAAgC,CAAC;AACzE,MAAM,WAAW,oBAAoB;IACpC,QAAQ,EAAC,MAAM,CAAC;IAAA,QAAQ,EAAC,MAAM,CAAC;IAAA,MAAM,EAAC,MAAM,CAAC;IAC9C,OAAO,EAAC;QAAC,IAAI,EAAC,MAAM,GAAC,OAAO,GAAC,OAAO,GAAC,OAAO,GAAC,UAAU,CAAC;QAAA,IAAI,CAAC,EAAC,MAAM,CAAC;QAAA,KAAK,CAAC,EAAC,oBAAoB,CAAC;QAAA,MAAM,CAAC,EAAC,oBAAoB,CAAA;KAAC,CAAC;IAC/H,eAAe,CAAC,EAAC,MAAM,CAAC;CACxB;AACD,MAAM,WAAW,mBAAmB;IAAE,KAAK,EAAC,MAAM,CAAC;IAAA,KAAK,EAAC,SAAS,GAAC,YAAY,GAAC,UAAU,GAAC,WAAW,CAAC;IAAA,SAAS,CAAC,EAAC,MAAM,CAAC;IAAA,WAAW,CAAC,EAAC,MAAM,CAAC;IAAA,aAAa,CAAC,EAAC,MAAM,CAAA;CAAC;AAEnK,+EAA+E;AAC/E,qBAAa,mBAAmB;IAEnB,OAAO,CAAC,OAAO;IAD3B,OAAO,CAAC,QAAQ,CAAQ;gBACJ,OAAO,EAAC;QAAC,MAAM,EAAC,MAAM,CAAC;QAAA,OAAO,CAAC,EAAC,MAAM,CAAC;QAAA,QAAQ,CAAC,EAAC,MAAM,CAAC;QAAA,KAAK,CAAC,EAAC,OAAO,KAAK,CAAA;KAAC;YAIlF,OAAO;IAOrB,KAAK,CAAC,KAAK,EAAC;QAAC,KAAK,EAAC,MAAM,CAAC;QAAA,cAAc,EAAC,MAAM,CAAC;QAAA,OAAO,EAAC,MAAM,EAAE,CAAC;QAAA,KAAK,EAAC,MAAM,CAAA;KAAC;IAC9E,MAAM,CAAC,KAAK,EAAC,MAAM,EAAC,QAAQ,EAAC,KAAK,CAAC,oBAAoB,GAAC;QAAC,OAAO,EAAC,MAAM,CAAA;KAAC,CAAC;IACzE,MAAM,CAAC,KAAK,EAAC,MAAM;IACnB,MAAM,CAAC,KAAK,EAAC,MAAM;IACnB,MAAM,CAAC,KAAK,EAAC,MAAM;IACnB,uFAAuF;IACvF,KAAK,CAAC,KAAK,EAAC,MAAM;IAIZ,MAAM,CAAC,KAAK,EAAC;QAAC,KAAK,EAAC,MAAM,CAAC;QAAA,cAAc,EAAC,MAAM,CAAC;QAAA,QAAQ,EAAC,MAAM,CAAC;QAAA,QAAQ,EAAC,MAAM,CAAC;QAAA,IAAI,EAAC,kBAAkB,CAAC;QAAA,IAAI,EAAC,mBAAmB,CAAC;QAAA,KAAK,EAAC,UAAU,CAAA;KAAC,GAAE,OAAO,CAAC,oBAAoB,CAAC;IAUxL,kFAAkF;IAC5E,cAAc,CAAC,KAAK,EAAC;QAAC,KAAK,EAAC,MAAM,CAAC;QAAA,cAAc,EAAC,MAAM,CAAC;QAAA,OAAO,EAAC,MAAM,EAAE,CAAC;QAAA,QAAQ,EAAC,oBAAoB,EAAE,CAAC;QAAA,UAAU,CAAC,EAAC,CAAC,QAAQ,EAAC,MAAM,EAAC,KAAK,EAAC,MAAM,KAAG,IAAI,CAAA;KAAC,GAAE,OAAO,CAAC,mBAAmB,CAAC;CAW/L"}
1
+ {"version":3,"file":"history-import.d.ts","sourceRoot":"","sources":["../src/history-import.ts"],"names":[],"mappings":"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"}