@rubytech/create-maxy 1.0.758 → 1.0.760
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/package.json +1 -1
- package/payload/platform/package.json +2 -2
- package/payload/platform/plugins/memory/PLUGIN.md +2 -0
- package/payload/platform/plugins/memory/mcp/dist/index.js +133 -1
- package/payload/platform/plugins/memory/mcp/dist/index.js.map +1 -1
- package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-archive-write.test.js +42 -2
- package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-archive-write.test.js.map +1 -1
- package/payload/platform/plugins/memory/mcp/dist/tools/memory-archive-write.d.ts +15 -0
- package/payload/platform/plugins/memory/mcp/dist/tools/memory-archive-write.d.ts.map +1 -1
- package/payload/platform/plugins/memory/mcp/dist/tools/memory-archive-write.js +34 -1
- package/payload/platform/plugins/memory/mcp/dist/tools/memory-archive-write.js.map +1 -1
- package/payload/platform/plugins/memory/mcp/dist/tools/whatsapp-export-insight-write.d.ts +27 -0
- package/payload/platform/plugins/memory/mcp/dist/tools/whatsapp-export-insight-write.d.ts.map +1 -0
- package/payload/platform/plugins/memory/mcp/dist/tools/whatsapp-export-insight-write.js +160 -0
- package/payload/platform/plugins/memory/mcp/dist/tools/whatsapp-export-insight-write.js.map +1 -0
- package/payload/platform/plugins/memory/mcp/dist/tools/whatsapp-export-parse.d.ts +9 -0
- package/payload/platform/plugins/memory/mcp/dist/tools/whatsapp-export-parse.d.ts.map +1 -0
- package/payload/platform/plugins/memory/mcp/dist/tools/whatsapp-export-parse.js +29 -0
- package/payload/platform/plugins/memory/mcp/dist/tools/whatsapp-export-parse.js.map +1 -0
- package/payload/platform/plugins/whatsapp-import/lib/dist/index.d.ts +3 -0
- package/payload/platform/plugins/whatsapp-import/lib/dist/index.d.ts.map +1 -0
- package/payload/platform/plugins/whatsapp-import/lib/dist/index.js +6 -0
- package/payload/platform/plugins/whatsapp-import/lib/dist/index.js.map +1 -0
- package/payload/platform/plugins/whatsapp-import/lib/dist/parse-export.d.ts +33 -0
- package/payload/platform/plugins/whatsapp-import/lib/dist/parse-export.d.ts.map +1 -0
- package/payload/platform/plugins/whatsapp-import/lib/dist/parse-export.js +253 -0
- package/payload/platform/plugins/whatsapp-import/lib/dist/parse-export.js.map +1 -0
- package/payload/platform/plugins/whatsapp-import/lib/src/__tests__/parse-export.test.ts +503 -0
- package/payload/platform/plugins/whatsapp-import/lib/src/index.ts +7 -0
- package/payload/platform/plugins/whatsapp-import/lib/src/parse-export.ts +385 -0
- package/payload/platform/plugins/whatsapp-import/lib/tsconfig.json +9 -0
- package/payload/platform/plugins/whatsapp-import/lib/vitest.config.ts +9 -0
- package/payload/platform/plugins/whatsapp-import/skills/whatsapp-import/SKILL.md +9 -11
- package/payload/platform/plugins/whatsapp-import/skills/whatsapp-import/references/export-parse.md +10 -5
- package/payload/platform/plugins/whatsapp-import/skills/whatsapp-import/references/insight-extraction.md +18 -15
- package/payload/platform/templates/specialists/agents/database-operator.md +1 -1
- package/payload/server/chunk-2W7O63CK.js +3052 -0
- package/payload/server/chunk-WW464F23.js +9512 -0
- package/payload/server/chunk-ZK3VNR7Y.js +9510 -0
- package/payload/server/client-pool-TULUIO6M.js +28 -0
- package/payload/server/maxy-edge.js +2 -2
- package/payload/server/public/assets/{admin-CTbpNMNG.js → admin-DHg5a2u2.js} +2 -2
- package/payload/server/public/index.html +1 -1
- package/payload/server/server.js +21 -12
|
@@ -0,0 +1,253 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.parseExport = parseExport;
|
|
4
|
+
const node_crypto_1 = require("node:crypto");
|
|
5
|
+
const node_fs_1 = require("node:fs");
|
|
6
|
+
const TIMESTAMP_PREFIX_DDMMYY = /^\[(\d{2})\/(\d{2})\/(\d{2}),\s+(\d{1,2}):(\d{2})(?::(\d{2}))?\]\s*(.*)$/;
|
|
7
|
+
const TIMESTAMP_PREFIX_MMDDYY = TIMESTAMP_PREFIX_DDMMYY; // shape is identical; ordering differs in interpretation only
|
|
8
|
+
// System-message patterns that appear WITHOUT a `: ` sender/body separator.
|
|
9
|
+
// WhatsApp emits group-event and security-code lines as `<Sender> <verb> ...`
|
|
10
|
+
// (no colon). Lines that match the timestamp prefix but lack `: ` and do not
|
|
11
|
+
// match one of these patterns are LOUD-FAIL parse errors — never silently
|
|
12
|
+
// dropped.
|
|
13
|
+
const LINE_LEVEL_SYSTEM_PATTERNS = [
|
|
14
|
+
/^Messages and calls are end-to-end encrypted/i,
|
|
15
|
+
/'s security code changed\.?$/i,
|
|
16
|
+
/ created group ["“”]/,
|
|
17
|
+
/ added /,
|
|
18
|
+
/ removed /,
|
|
19
|
+
/ left$/,
|
|
20
|
+
/ changed the subject from /,
|
|
21
|
+
/ changed this group's icon/,
|
|
22
|
+
/ joined using this group's invite link/,
|
|
23
|
+
/^You're now an admin$/i,
|
|
24
|
+
/^You created group/i,
|
|
25
|
+
];
|
|
26
|
+
// Body-level patterns evaluated after `Sender: body` split. These are real
|
|
27
|
+
// messages syntactically but carry no graph value (deletions, media-only).
|
|
28
|
+
const BODY_LEVEL_SYSTEM_PATTERNS = [
|
|
29
|
+
/^You deleted this message\.?$/,
|
|
30
|
+
/^This message was deleted\.?$/,
|
|
31
|
+
];
|
|
32
|
+
const MEDIA_ONLY_PATTERNS = [
|
|
33
|
+
/^<Media omitted>$/,
|
|
34
|
+
/^IMG-\d+-\w+\.(jpg|jpeg|png|heic|gif)\s*\(file attached\)$/i,
|
|
35
|
+
/^VID-\d+-\w+\.mp4\s*\(file attached\)$/i,
|
|
36
|
+
/^PTT-\d+-\w+\.opus\s*\(file attached\)$/i,
|
|
37
|
+
/^AUD-\d+-\w+\.opus\s*\(file attached\)$/i,
|
|
38
|
+
/^STK-\d+-\w+\.webp\s*\(file attached\)$/i,
|
|
39
|
+
/^.+\.(pdf|docx|doc|xlsx|xls|pptx|ppt|zip|csv|txt)\s*\(file attached\)$/i,
|
|
40
|
+
/^.+attached:\s*.+$/, // alternative LRM-prefixed format on some platforms
|
|
41
|
+
];
|
|
42
|
+
function parseExport(input) {
|
|
43
|
+
const { filePath, accountId, timezone, dateFormat = "DD/MM/YY" } = input;
|
|
44
|
+
if (!accountId || !accountId.trim()) {
|
|
45
|
+
throw new Error("parse-export: accountId is required.");
|
|
46
|
+
}
|
|
47
|
+
if (!timezone || !timezone.trim()) {
|
|
48
|
+
throw new Error("parse-export: timezone is required (e.g. 'Europe/London').");
|
|
49
|
+
}
|
|
50
|
+
const rawBytes = (0, node_fs_1.readFileSync)(filePath);
|
|
51
|
+
const sha256Hex = (0, node_crypto_1.createHash)("sha256").update(rawBytes).digest("hex");
|
|
52
|
+
const archiveSourceFile = `whatsapp-export:${sha256Hex}`;
|
|
53
|
+
const conversationId = `whatsapp-export:${sha256Hex}:${accountId}`;
|
|
54
|
+
const text = decodeAndNormalise(rawBytes);
|
|
55
|
+
if (text.length === 0) {
|
|
56
|
+
throw new Error(`parse-export: file is empty — not a _chat.txt. file=${filePath}`);
|
|
57
|
+
}
|
|
58
|
+
const lines = text.split("\n");
|
|
59
|
+
const counters = {
|
|
60
|
+
parsed: 0,
|
|
61
|
+
systemSkipped: 0,
|
|
62
|
+
mediaSkipped: 0,
|
|
63
|
+
parseErrors: 0,
|
|
64
|
+
};
|
|
65
|
+
const raw = [];
|
|
66
|
+
for (let i = 0; i < lines.length; i++) {
|
|
67
|
+
const line = lines[i];
|
|
68
|
+
if (line.length === 0 && i === lines.length - 1)
|
|
69
|
+
continue; // trailing newline
|
|
70
|
+
const prefixMatch = matchTimestampPrefix(line, dateFormat);
|
|
71
|
+
if (prefixMatch) {
|
|
72
|
+
raw.push({
|
|
73
|
+
rawLineIndex: i + 1,
|
|
74
|
+
...prefixMatch.dateParts,
|
|
75
|
+
remainder: prefixMatch.remainder,
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
else {
|
|
79
|
+
// Continuation of the previous message body. If there is no previous
|
|
80
|
+
// message, this line is leading garbage — ignore it (matches the
|
|
81
|
+
// export-parse.md edge case where a leading BOM or blank line precedes
|
|
82
|
+
// the first timestamp).
|
|
83
|
+
const last = raw[raw.length - 1];
|
|
84
|
+
if (last) {
|
|
85
|
+
last.remainder += "\n" + line;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
// Stage 2 — categorise each raw message. Do NOT trim trailing whitespace
|
|
90
|
+
// from the remainder before splitting — `Joel: ` (sender + colon + trailing
|
|
91
|
+
// space + newline) collapses to `Joel:` after a `\s+$` trim and the `: `
|
|
92
|
+
// separator disappears, turning an empty-body system skip into a LOUD-FAIL.
|
|
93
|
+
const parsedLines = [];
|
|
94
|
+
for (const r of raw) {
|
|
95
|
+
const remainder = r.remainder;
|
|
96
|
+
const colonIdx = findFirstColonSeparator(remainder);
|
|
97
|
+
if (colonIdx === -1) {
|
|
98
|
+
// No `: ` separator. Must match a known system pattern or LOUD-FAIL.
|
|
99
|
+
const trimmed = remainder.replace(/\s+$/, "");
|
|
100
|
+
if (matchesAny(trimmed, LINE_LEVEL_SYSTEM_PATTERNS)) {
|
|
101
|
+
counters.systemSkipped++;
|
|
102
|
+
continue;
|
|
103
|
+
}
|
|
104
|
+
counters.parseErrors++;
|
|
105
|
+
throw new Error(`parse-export: parse-error file=${filePath} line=${r.rawLineIndex} reason=no-sender-body-separator content="${trimmed.slice(0, 80)}"`);
|
|
106
|
+
}
|
|
107
|
+
const senderName = remainder.slice(0, colonIdx).trim();
|
|
108
|
+
const body = remainder.slice(colonIdx + 2).replace(/\s+$/, "");
|
|
109
|
+
if (body.length === 0) {
|
|
110
|
+
counters.systemSkipped++;
|
|
111
|
+
continue;
|
|
112
|
+
}
|
|
113
|
+
if (matchesAny(body, BODY_LEVEL_SYSTEM_PATTERNS)) {
|
|
114
|
+
counters.systemSkipped++;
|
|
115
|
+
continue;
|
|
116
|
+
}
|
|
117
|
+
if (matchesAny(body, MEDIA_ONLY_PATTERNS)) {
|
|
118
|
+
counters.mediaSkipped++;
|
|
119
|
+
continue;
|
|
120
|
+
}
|
|
121
|
+
const dateSent = isoWithOffset(r.year, r.month, r.day, r.hour, r.minute, r.second, timezone);
|
|
122
|
+
parsedLines.push({
|
|
123
|
+
senderName,
|
|
124
|
+
dateSent,
|
|
125
|
+
body,
|
|
126
|
+
sequenceIndex: parsedLines.length,
|
|
127
|
+
});
|
|
128
|
+
counters.parsed++;
|
|
129
|
+
}
|
|
130
|
+
if (parsedLines.length === 0 && counters.systemSkipped === 0 && counters.mediaSkipped === 0) {
|
|
131
|
+
throw new Error(`parse-export: zero parsed lines after walking ${filePath} — not a _chat.txt or all lines failed grammar.`);
|
|
132
|
+
}
|
|
133
|
+
return {
|
|
134
|
+
conversationId,
|
|
135
|
+
archiveSourceFile,
|
|
136
|
+
parsedLines,
|
|
137
|
+
counters,
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
// ---------------------------------------------------------------------------
|
|
141
|
+
// Internals
|
|
142
|
+
// ---------------------------------------------------------------------------
|
|
143
|
+
function decodeAndNormalise(bytes) {
|
|
144
|
+
// Strict UTF-8 decode. Node's TextDecoder with `fatal: true` throws on
|
|
145
|
+
// invalid bytes — that's the LOUD-FAIL the brief mandates for encoding
|
|
146
|
+
// errors. The default `Buffer.toString('utf8')` silently substitutes
|
|
147
|
+
// U+FFFD, which would let bad bytes propagate into the graph.
|
|
148
|
+
let text;
|
|
149
|
+
try {
|
|
150
|
+
text = new TextDecoder("utf-8", { fatal: true }).decode(bytes);
|
|
151
|
+
}
|
|
152
|
+
catch (err) {
|
|
153
|
+
throw new Error(`parse-export: UTF-8 decode failed — ${err instanceof Error ? err.message : String(err)}. The file is not valid UTF-8; re-export from WhatsApp.`);
|
|
154
|
+
}
|
|
155
|
+
// Strip leading BOM (U+FEFF).
|
|
156
|
+
if (text.charCodeAt(0) === 0xfeff) {
|
|
157
|
+
text = text.slice(1);
|
|
158
|
+
}
|
|
159
|
+
// Normalise mixed line endings to LF.
|
|
160
|
+
text = text.replace(/\r\n/g, "\n").replace(/\r/g, "\n");
|
|
161
|
+
return text;
|
|
162
|
+
}
|
|
163
|
+
function matchTimestampPrefix(line, dateFormat) {
|
|
164
|
+
const re = dateFormat === "MM/DD/YY" ? TIMESTAMP_PREFIX_MMDDYY : TIMESTAMP_PREFIX_DDMMYY;
|
|
165
|
+
const m = line.match(re);
|
|
166
|
+
if (!m)
|
|
167
|
+
return null;
|
|
168
|
+
const a = parseInt(m[1], 10); // dd or mm depending on dateFormat
|
|
169
|
+
const b = parseInt(m[2], 10); // mm or dd
|
|
170
|
+
const yy = parseInt(m[3], 10);
|
|
171
|
+
const hour = parseInt(m[4], 10);
|
|
172
|
+
const minute = parseInt(m[5], 10);
|
|
173
|
+
const second = m[6] !== undefined ? parseInt(m[6], 10) : 0;
|
|
174
|
+
const remainder = m[7] ?? "";
|
|
175
|
+
const day = dateFormat === "MM/DD/YY" ? b : a;
|
|
176
|
+
const month = dateFormat === "MM/DD/YY" ? a : b;
|
|
177
|
+
// Range-check before passing to Date.UTC — that function silently rolls
|
|
178
|
+
// over invalid components (Date.UTC(2026, 13, 1) → 2027-02-01), which
|
|
179
|
+
// would corrupt timestamps when the operator passes the wrong dateFormat
|
|
180
|
+
// for a US-locale export. Reject as not-a-prefix; the caller retries the
|
|
181
|
+
// file with the correct format or LOUD-FAILs when the file isn't a chat.
|
|
182
|
+
if (month < 1 || month > 12 || day < 1 || day > 31)
|
|
183
|
+
return null;
|
|
184
|
+
if (hour > 23 || minute > 59 || second > 59)
|
|
185
|
+
return null;
|
|
186
|
+
// WhatsApp's two-digit year is unambiguous in the 21st century; explicit
|
|
187
|
+
// shift here documents the assumption rather than relying on locale.
|
|
188
|
+
const year = 2000 + yy;
|
|
189
|
+
return {
|
|
190
|
+
dateParts: { year, month, day, hour, minute, second },
|
|
191
|
+
remainder,
|
|
192
|
+
};
|
|
193
|
+
}
|
|
194
|
+
function findFirstColonSeparator(remainder) {
|
|
195
|
+
// Split on the FIRST `: ` (colon-space). A sender display name may itself
|
|
196
|
+
// contain a `:` (e.g. "Joel: Work"), so we anchor on the first colon
|
|
197
|
+
// followed by a space — that's the WhatsApp export's stable separator.
|
|
198
|
+
const idx = remainder.indexOf(": ");
|
|
199
|
+
return idx;
|
|
200
|
+
}
|
|
201
|
+
function matchesAny(text, patterns) {
|
|
202
|
+
for (const p of patterns) {
|
|
203
|
+
if (p.test(text))
|
|
204
|
+
return true;
|
|
205
|
+
}
|
|
206
|
+
return false;
|
|
207
|
+
}
|
|
208
|
+
function isoWithOffset(year, month, day, hour, minute, second, timezone) {
|
|
209
|
+
// Produce ISO 8601 with the offset that the supplied IANA zone holds for
|
|
210
|
+
// this wall-clock instant. Two-step refinement is needed to handle DST:
|
|
211
|
+
// the wall-clock components describe a local time, and we need the offset
|
|
212
|
+
// for the corresponding UTC instant in `timezone`.
|
|
213
|
+
const guessUtcMs = Date.UTC(year, month - 1, day, hour, minute, second);
|
|
214
|
+
let offMin = offsetMinutesAt(new Date(guessUtcMs), timezone);
|
|
215
|
+
const refinedUtcMs = guessUtcMs - offMin * 60_000;
|
|
216
|
+
offMin = offsetMinutesAt(new Date(refinedUtcMs), timezone);
|
|
217
|
+
const sign = offMin >= 0 ? "+" : "-";
|
|
218
|
+
const absOff = Math.abs(offMin);
|
|
219
|
+
const offHH = String(Math.floor(absOff / 60)).padStart(2, "0");
|
|
220
|
+
const offMM = String(absOff % 60).padStart(2, "0");
|
|
221
|
+
const Y = String(year).padStart(4, "0");
|
|
222
|
+
const M = String(month).padStart(2, "0");
|
|
223
|
+
const D = String(day).padStart(2, "0");
|
|
224
|
+
const H = String(hour).padStart(2, "0");
|
|
225
|
+
const Mi = String(minute).padStart(2, "0");
|
|
226
|
+
const S = String(second).padStart(2, "0");
|
|
227
|
+
return `${Y}-${M}-${D}T${H}:${Mi}:${S}${sign}${offHH}:${offMM}`;
|
|
228
|
+
}
|
|
229
|
+
function offsetMinutesAt(date, timezone) {
|
|
230
|
+
// Use Intl.DateTimeFormat with longOffset to read the IANA-zone offset for
|
|
231
|
+
// the given UTC instant. Output format: "GMT+01:00", "GMT-05:00", or "GMT".
|
|
232
|
+
const formatter = new Intl.DateTimeFormat("en-US", {
|
|
233
|
+
timeZone: timezone,
|
|
234
|
+
timeZoneName: "longOffset",
|
|
235
|
+
});
|
|
236
|
+
const parts = formatter.formatToParts(date);
|
|
237
|
+
const tzPart = parts.find((p) => p.type === "timeZoneName");
|
|
238
|
+
if (!tzPart) {
|
|
239
|
+
throw new Error(`parse-export: unable to read offset for timezone "${timezone}".`);
|
|
240
|
+
}
|
|
241
|
+
const value = tzPart.value;
|
|
242
|
+
if (value === "GMT" || value === "UTC")
|
|
243
|
+
return 0;
|
|
244
|
+
const m = value.match(/^(?:GMT|UTC)([+-])(\d{1,2}):?(\d{2})?$/);
|
|
245
|
+
if (!m) {
|
|
246
|
+
throw new Error(`parse-export: cannot parse timezone offset "${value}" for IANA zone "${timezone}".`);
|
|
247
|
+
}
|
|
248
|
+
const sign = m[1] === "+" ? 1 : -1;
|
|
249
|
+
const hh = parseInt(m[2], 10);
|
|
250
|
+
const mm = m[3] ? parseInt(m[3], 10) : 0;
|
|
251
|
+
return sign * (hh * 60 + mm);
|
|
252
|
+
}
|
|
253
|
+
//# sourceMappingURL=parse-export.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parse-export.js","sourceRoot":"","sources":["../src/parse-export.ts"],"names":[],"mappings":"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"}
|