@rubytech/create-maxy 1.0.759 → 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.
Files changed (39) hide show
  1. package/package.json +1 -1
  2. package/payload/platform/package.json +2 -2
  3. package/payload/platform/plugins/memory/PLUGIN.md +2 -0
  4. package/payload/platform/plugins/memory/mcp/dist/index.js +133 -1
  5. package/payload/platform/plugins/memory/mcp/dist/index.js.map +1 -1
  6. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-archive-write.test.js +42 -2
  7. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-archive-write.test.js.map +1 -1
  8. package/payload/platform/plugins/memory/mcp/dist/tools/memory-archive-write.d.ts +15 -0
  9. package/payload/platform/plugins/memory/mcp/dist/tools/memory-archive-write.d.ts.map +1 -1
  10. package/payload/platform/plugins/memory/mcp/dist/tools/memory-archive-write.js +34 -1
  11. package/payload/platform/plugins/memory/mcp/dist/tools/memory-archive-write.js.map +1 -1
  12. package/payload/platform/plugins/memory/mcp/dist/tools/whatsapp-export-insight-write.d.ts +27 -0
  13. package/payload/platform/plugins/memory/mcp/dist/tools/whatsapp-export-insight-write.d.ts.map +1 -0
  14. package/payload/platform/plugins/memory/mcp/dist/tools/whatsapp-export-insight-write.js +160 -0
  15. package/payload/platform/plugins/memory/mcp/dist/tools/whatsapp-export-insight-write.js.map +1 -0
  16. package/payload/platform/plugins/memory/mcp/dist/tools/whatsapp-export-parse.d.ts +9 -0
  17. package/payload/platform/plugins/memory/mcp/dist/tools/whatsapp-export-parse.d.ts.map +1 -0
  18. package/payload/platform/plugins/memory/mcp/dist/tools/whatsapp-export-parse.js +29 -0
  19. package/payload/platform/plugins/memory/mcp/dist/tools/whatsapp-export-parse.js.map +1 -0
  20. package/payload/platform/plugins/whatsapp-import/lib/dist/index.d.ts +3 -0
  21. package/payload/platform/plugins/whatsapp-import/lib/dist/index.d.ts.map +1 -0
  22. package/payload/platform/plugins/whatsapp-import/lib/dist/index.js +6 -0
  23. package/payload/platform/plugins/whatsapp-import/lib/dist/index.js.map +1 -0
  24. package/payload/platform/plugins/whatsapp-import/lib/dist/parse-export.d.ts +33 -0
  25. package/payload/platform/plugins/whatsapp-import/lib/dist/parse-export.d.ts.map +1 -0
  26. package/payload/platform/plugins/whatsapp-import/lib/dist/parse-export.js +253 -0
  27. package/payload/platform/plugins/whatsapp-import/lib/dist/parse-export.js.map +1 -0
  28. package/payload/platform/plugins/whatsapp-import/lib/src/__tests__/parse-export.test.ts +503 -0
  29. package/payload/platform/plugins/whatsapp-import/lib/src/index.ts +7 -0
  30. package/payload/platform/plugins/whatsapp-import/lib/src/parse-export.ts +385 -0
  31. package/payload/platform/plugins/whatsapp-import/lib/tsconfig.json +9 -0
  32. package/payload/platform/plugins/whatsapp-import/lib/vitest.config.ts +9 -0
  33. package/payload/platform/plugins/whatsapp-import/skills/whatsapp-import/SKILL.md +9 -11
  34. package/payload/platform/plugins/whatsapp-import/skills/whatsapp-import/references/export-parse.md +10 -5
  35. package/payload/platform/plugins/whatsapp-import/skills/whatsapp-import/references/insight-extraction.md +18 -15
  36. package/payload/platform/templates/specialists/agents/database-operator.md +1 -1
  37. package/payload/server/chunk-WW464F23.js +9512 -0
  38. package/payload/server/maxy-edge.js +1 -1
  39. package/payload/server/server.js +1 -1
@@ -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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"}