personal-ai 0.1.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/README.md +227 -0
- package/SKILL.md +310 -0
- package/dist/auth-Dtx8Wc3l.mjs +2 -0
- package/dist/calendar-BHcM4wfQ.mjs +91 -0
- package/dist/calendar-BHcM4wfQ.mjs.map +1 -0
- package/dist/entry.mjs +3891 -0
- package/dist/entry.mjs.map +1 -0
- package/dist/gmail-B9ja9sKN.mjs +92 -0
- package/dist/gmail-B9ja9sKN.mjs.map +1 -0
- package/dist/index.mjs +1761 -0
- package/dist/index.mjs.map +1 -0
- package/dist/mac-C9SDXZGK.mjs +55 -0
- package/dist/mac-C9SDXZGK.mjs.map +1 -0
- package/package.json +72 -0
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { c as warn, r as googleOAuth } from "./entry.mjs";
|
|
3
|
+
import "./auth-Dtx8Wc3l.mjs";
|
|
4
|
+
import { google } from "googleapis";
|
|
5
|
+
|
|
6
|
+
//#region src/connectors/google/gmail.ts
|
|
7
|
+
/**
|
|
8
|
+
* Gmail connector — fetches messages and returns CollectorResult[] for raw layer.
|
|
9
|
+
*/
|
|
10
|
+
function parseFrom(fromHeader) {
|
|
11
|
+
const match = fromHeader.match(/^(.+?)\s*<(.+?)>$/);
|
|
12
|
+
if (match) return `${match[1].trim()} <${match[2].trim()}>`;
|
|
13
|
+
return fromHeader.trim();
|
|
14
|
+
}
|
|
15
|
+
function buildQuery(opts) {
|
|
16
|
+
const parts = [];
|
|
17
|
+
if (opts.query) parts.push(opts.query);
|
|
18
|
+
const days = opts.days ?? 30;
|
|
19
|
+
const dateStr = (/* @__PURE__ */ new Date(Date.now() - days * 24 * 60 * 60 * 1e3)).toISOString().split("T")[0].replace(/-/g, "/");
|
|
20
|
+
parts.push(`after:${dateStr}`);
|
|
21
|
+
return parts.join(" ");
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Sync Gmail messages and return one CollectorResult per message.
|
|
25
|
+
*/
|
|
26
|
+
async function syncGmail(opts = {}) {
|
|
27
|
+
await googleOAuth.ensureAuthenticated();
|
|
28
|
+
const gmail = google.gmail({
|
|
29
|
+
version: "v1",
|
|
30
|
+
auth: googleOAuth.getClient()
|
|
31
|
+
});
|
|
32
|
+
const query = buildQuery(opts);
|
|
33
|
+
const maxResults = opts.maxResults ?? 100;
|
|
34
|
+
const allMessages = [];
|
|
35
|
+
let pageToken;
|
|
36
|
+
do {
|
|
37
|
+
const res = await gmail.users.messages.list({
|
|
38
|
+
userId: "me",
|
|
39
|
+
q: query,
|
|
40
|
+
maxResults: Math.min(100, maxResults - allMessages.length),
|
|
41
|
+
pageToken
|
|
42
|
+
});
|
|
43
|
+
const messages = res.data.messages ?? [];
|
|
44
|
+
for (const m of messages) if (m.id) allMessages.push({ id: m.id });
|
|
45
|
+
pageToken = res.data.nextPageToken ?? void 0;
|
|
46
|
+
if (maxResults > 0 && allMessages.length >= maxResults) break;
|
|
47
|
+
} while (pageToken);
|
|
48
|
+
const results = [];
|
|
49
|
+
let failed = 0;
|
|
50
|
+
for (const msg of allMessages) try {
|
|
51
|
+
const data = (await gmail.users.messages.get({
|
|
52
|
+
userId: "me",
|
|
53
|
+
id: msg.id,
|
|
54
|
+
format: "metadata",
|
|
55
|
+
metadataHeaders: [
|
|
56
|
+
"From",
|
|
57
|
+
"Subject",
|
|
58
|
+
"Date"
|
|
59
|
+
]
|
|
60
|
+
})).data;
|
|
61
|
+
const headers = data.payload?.headers ?? [];
|
|
62
|
+
const from = parseFrom(headers.find((h) => h.name === "From")?.value ?? "");
|
|
63
|
+
const subject = headers.find((h) => h.name === "Subject")?.value ?? "(no subject)";
|
|
64
|
+
const dateStr = headers.find((h) => h.name === "Date")?.value ?? "";
|
|
65
|
+
const labels = (data.labelIds ?? []).join(", ");
|
|
66
|
+
const snippet = data.snippet ?? "";
|
|
67
|
+
const content = [
|
|
68
|
+
`- **From**: ${from}`,
|
|
69
|
+
`- **Date**: ${dateStr}`,
|
|
70
|
+
labels ? `- **Labels**: ${labels}` : "",
|
|
71
|
+
"",
|
|
72
|
+
snippet ? `Preview: ${snippet}` : ""
|
|
73
|
+
].filter(Boolean).join("\n");
|
|
74
|
+
results.push({
|
|
75
|
+
id: msg.id,
|
|
76
|
+
title: subject,
|
|
77
|
+
content
|
|
78
|
+
});
|
|
79
|
+
} catch (err) {
|
|
80
|
+
failed++;
|
|
81
|
+
if (failed <= 3) {
|
|
82
|
+
const msgText = err instanceof Error ? err.message : String(err);
|
|
83
|
+
warn(`Gmail message fetch failed: ${msgText}`);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
if (failed > 3) warn(`Gmail message fetch failed for ${failed} message(s).`);
|
|
87
|
+
return results;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
//#endregion
|
|
91
|
+
export { syncGmail };
|
|
92
|
+
//# sourceMappingURL=gmail-B9ja9sKN.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gmail-B9ja9sKN.mjs","names":[],"sources":["../src/connectors/google/gmail.ts"],"sourcesContent":["/**\n * Gmail connector — fetches messages and returns CollectorResult[] for raw layer.\n */\n\nimport { google } from \"googleapis\";\nimport type { gmail_v1 } from \"googleapis\";\nimport type { CollectorResult } from \"../../types.js\";\nimport { googleOAuth } from \"../../auth/index.js\";\nimport * as console from \"../../utils/console.js\";\n\nexport interface SyncGmailOptions {\n /** Gmail query (e.g. \"is:important\"). Optional; time filter added from --days. */\n query?: string;\n /** Fetch emails from last N days (default 30). */\n days?: number;\n /** Max messages to fetch (default 100). */\n maxResults?: number;\n}\n\nfunction parseFrom(fromHeader: string): string {\n const match = fromHeader.match(/^(.+?)\\s*<(.+?)>$/);\n if (match) {\n return `${match[1].trim()} <${match[2].trim()}>`;\n }\n return fromHeader.trim();\n}\n\nfunction buildQuery(opts: SyncGmailOptions): string {\n const parts: string[] = [];\n if (opts.query) {\n parts.push(opts.query);\n }\n const days = opts.days ?? 30;\n const date = new Date(Date.now() - days * 24 * 60 * 60 * 1000);\n const dateStr = date.toISOString().split(\"T\")[0].replace(/-/g, \"/\");\n parts.push(`after:${dateStr}`);\n return parts.join(\" \");\n}\n\n/**\n * Sync Gmail messages and return one CollectorResult per message.\n */\nexport async function syncGmail(opts: SyncGmailOptions = {}): Promise<CollectorResult[]> {\n await googleOAuth.ensureAuthenticated();\n const gmail: gmail_v1.Gmail = google.gmail({\n version: \"v1\",\n auth: googleOAuth.getClient(),\n });\n\n const query = buildQuery(opts);\n const maxResults = opts.maxResults ?? 100;\n const allMessages: Array<{ id: string }> = [];\n let pageToken: string | undefined;\n\n do {\n const res = await gmail.users.messages.list({\n userId: \"me\",\n q: query,\n maxResults: Math.min(100, maxResults - allMessages.length),\n pageToken,\n });\n const messages = res.data.messages ?? [];\n for (const m of messages) {\n if (m.id) allMessages.push({ id: m.id });\n }\n pageToken = res.data.nextPageToken ?? undefined;\n if (maxResults > 0 && allMessages.length >= maxResults) break;\n } while (pageToken);\n\n const results: CollectorResult[] = [];\n let failed = 0;\n\n for (const msg of allMessages) {\n try {\n const getRes = await gmail.users.messages.get({\n userId: \"me\",\n id: msg.id!,\n format: \"metadata\",\n metadataHeaders: [\"From\", \"Subject\", \"Date\"],\n });\n const data = getRes.data;\n const headers = data.payload?.headers ?? [];\n const from = parseFrom(\n (headers.find((h) => h.name === \"From\")?.value as string) ?? \"\",\n );\n const subject =\n (headers.find((h) => h.name === \"Subject\")?.value as string) ??\n \"(no subject)\";\n const dateStr =\n (headers.find((h) => h.name === \"Date\")?.value as string) ?? \"\";\n const labels = (data.labelIds ?? []).join(\", \");\n const snippet = (data.snippet as string) ?? \"\";\n\n const content = [\n `- **From**: ${from}`,\n `- **Date**: ${dateStr}`,\n labels ? `- **Labels**: ${labels}` : \"\",\n \"\",\n snippet ? `Preview: ${snippet}` : \"\",\n ]\n .filter(Boolean)\n .join(\"\\n\");\n\n results.push({\n id: msg.id!,\n title: subject,\n content,\n });\n } catch (err) {\n failed++;\n if (failed <= 3) {\n const msgText = err instanceof Error ? err.message : String(err);\n console.warn(`Gmail message fetch failed: ${msgText}`);\n }\n }\n }\n\n if (failed > 3) {\n console.warn(`Gmail message fetch failed for ${failed} message(s).`);\n }\n return results;\n}\n"],"mappings":";;;;;;;;;AAmBA,SAAS,UAAU,YAA4B;CAC7C,MAAM,QAAQ,WAAW,MAAM,oBAAoB;AACnD,KAAI,MACF,QAAO,GAAG,MAAM,GAAG,MAAM,CAAC,IAAI,MAAM,GAAG,MAAM,CAAC;AAEhD,QAAO,WAAW,MAAM;;AAG1B,SAAS,WAAW,MAAgC;CAClD,MAAM,QAAkB,EAAE;AAC1B,KAAI,KAAK,MACP,OAAM,KAAK,KAAK,MAAM;CAExB,MAAM,OAAO,KAAK,QAAQ;CAE1B,MAAM,2BADO,IAAI,KAAK,KAAK,KAAK,GAAG,OAAO,KAAK,KAAK,KAAK,IAAK,EACzC,aAAa,CAAC,MAAM,IAAI,CAAC,GAAG,QAAQ,MAAM,IAAI;AACnE,OAAM,KAAK,SAAS,UAAU;AAC9B,QAAO,MAAM,KAAK,IAAI;;;;;AAMxB,eAAsB,UAAU,OAAyB,EAAE,EAA8B;AACvF,OAAM,YAAY,qBAAqB;CACvC,MAAM,QAAwB,OAAO,MAAM;EACzC,SAAS;EACT,MAAM,YAAY,WAAW;EAC9B,CAAC;CAEF,MAAM,QAAQ,WAAW,KAAK;CAC9B,MAAM,aAAa,KAAK,cAAc;CACtC,MAAM,cAAqC,EAAE;CAC7C,IAAI;AAEJ,IAAG;EACD,MAAM,MAAM,MAAM,MAAM,MAAM,SAAS,KAAK;GAC1C,QAAQ;GACR,GAAG;GACH,YAAY,KAAK,IAAI,KAAK,aAAa,YAAY,OAAO;GAC1D;GACD,CAAC;EACF,MAAM,WAAW,IAAI,KAAK,YAAY,EAAE;AACxC,OAAK,MAAM,KAAK,SACd,KAAI,EAAE,GAAI,aAAY,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC;AAE1C,cAAY,IAAI,KAAK,iBAAiB;AACtC,MAAI,aAAa,KAAK,YAAY,UAAU,WAAY;UACjD;CAET,MAAM,UAA6B,EAAE;CACrC,IAAI,SAAS;AAEb,MAAK,MAAM,OAAO,YAChB,KAAI;EAOF,MAAM,QANS,MAAM,MAAM,MAAM,SAAS,IAAI;GAC5C,QAAQ;GACR,IAAI,IAAI;GACR,QAAQ;GACR,iBAAiB;IAAC;IAAQ;IAAW;IAAO;GAC7C,CAAC,EACkB;EACpB,MAAM,UAAU,KAAK,SAAS,WAAW,EAAE;EAC3C,MAAM,OAAO,UACV,QAAQ,MAAM,MAAM,EAAE,SAAS,OAAO,EAAE,SAAoB,GAC9D;EACD,MAAM,UACH,QAAQ,MAAM,MAAM,EAAE,SAAS,UAAU,EAAE,SAC5C;EACF,MAAM,UACH,QAAQ,MAAM,MAAM,EAAE,SAAS,OAAO,EAAE,SAAoB;EAC/D,MAAM,UAAU,KAAK,YAAY,EAAE,EAAE,KAAK,KAAK;EAC/C,MAAM,UAAW,KAAK,WAAsB;EAE5C,MAAM,UAAU;GACd,eAAe;GACf,eAAe;GACf,SAAS,iBAAiB,WAAW;GACrC;GACA,UAAU,YAAY,YAAY;GACnC,CACE,OAAO,QAAQ,CACf,KAAK,KAAK;AAEb,UAAQ,KAAK;GACX,IAAI,IAAI;GACR,OAAO;GACP;GACD,CAAC;UACK,KAAK;AACZ;AACA,MAAI,UAAU,GAAG;GACf,MAAM,UAAU,eAAe,QAAQ,IAAI,UAAU,OAAO,IAAI;AAChE,QAAa,+BAA+B,UAAU;;;AAK5D,KAAI,SAAS,EACX,MAAa,kCAAkC,OAAO,cAAc;AAEtE,QAAO"}
|