@prbartosh/poczta-mcp 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/.env.example +19 -0
- package/LICENSE +21 -0
- package/README.md +141 -0
- package/config.example.json +50 -0
- package/cron.example +19 -0
- package/dist/auth/google.js +29 -0
- package/dist/auth/google.js.map +1 -0
- package/dist/auth/index.js +31 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/auth/microsoft.js +44 -0
- package/dist/auth/microsoft.js.map +1 -0
- package/dist/config.js +201 -0
- package/dist/config.js.map +1 -0
- package/dist/digest.js +82 -0
- package/dist/digest.js.map +1 -0
- package/dist/index.js +105 -0
- package/dist/index.js.map +1 -0
- package/dist/install.js +209 -0
- package/dist/install.js.map +1 -0
- package/dist/mail/imap.js +192 -0
- package/dist/mail/imap.js.map +1 -0
- package/dist/mail/smtp.js +50 -0
- package/dist/mail/smtp.js.map +1 -0
- package/dist/oauth.js +138 -0
- package/dist/oauth.js.map +1 -0
- package/dist/server.js +201 -0
- package/dist/server.js.map +1 -0
- package/dist/setup.js +444 -0
- package/dist/setup.js.map +1 -0
- package/package.json +62 -0
- package/skills/daily-briefing/SKILL.md +57 -0
package/dist/digest.js
ADDED
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { writeFileSync, mkdirSync } from "node:fs";
|
|
2
|
+
import { dirname, isAbsolute, resolve } from "node:path";
|
|
3
|
+
import { homedir } from "node:os";
|
|
4
|
+
import { getAccount, requireEnv } from "./config.js";
|
|
5
|
+
import { sendEmail } from "./mail/smtp.js";
|
|
6
|
+
function expandHome(p) {
|
|
7
|
+
if (p === "~")
|
|
8
|
+
return homedir();
|
|
9
|
+
if (p.startsWith("~/"))
|
|
10
|
+
return resolve(homedir(), p.slice(2));
|
|
11
|
+
return isAbsolute(p) ? p : resolve(process.cwd(), p);
|
|
12
|
+
}
|
|
13
|
+
function stamps(tz) {
|
|
14
|
+
const now = new Date();
|
|
15
|
+
try {
|
|
16
|
+
const date = new Intl.DateTimeFormat("en-CA", {
|
|
17
|
+
timeZone: tz,
|
|
18
|
+
year: "numeric",
|
|
19
|
+
month: "2-digit",
|
|
20
|
+
day: "2-digit",
|
|
21
|
+
}).format(now); // en-CA -> YYYY-MM-DD
|
|
22
|
+
return { date, datetime: now.toISOString() };
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
return { date: now.toISOString().slice(0, 10), datetime: now.toISOString() };
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
function subst(s, v) {
|
|
29
|
+
return s.replaceAll("{date}", v.date).replaceAll("{datetime}", v.datetime);
|
|
30
|
+
}
|
|
31
|
+
async function deliverOne(cfg, ch, markdown, v) {
|
|
32
|
+
switch (ch.type) {
|
|
33
|
+
case "chat":
|
|
34
|
+
return { channel: "chat", ok: true, detail: "returned to caller" };
|
|
35
|
+
case "file": {
|
|
36
|
+
const path = subst(expandHome(ch.path), v);
|
|
37
|
+
mkdirSync(dirname(path), { recursive: true });
|
|
38
|
+
writeFileSync(path, markdown, "utf8");
|
|
39
|
+
return { channel: "file", ok: true, detail: path };
|
|
40
|
+
}
|
|
41
|
+
case "email": {
|
|
42
|
+
const acc = getAccount(cfg, ch.fromAccount);
|
|
43
|
+
const res = await sendEmail(acc, {
|
|
44
|
+
to: ch.to,
|
|
45
|
+
subject: subst(ch.subject, v),
|
|
46
|
+
body: markdown,
|
|
47
|
+
});
|
|
48
|
+
return { channel: "email", ok: true, detail: `to ${res.to}` };
|
|
49
|
+
}
|
|
50
|
+
case "webhook": {
|
|
51
|
+
const url = requireEnv(ch.urlEnv);
|
|
52
|
+
const payload = ch.format === "slack" ? { text: markdown } : { date: v.date, markdown };
|
|
53
|
+
const res = await fetch(url, {
|
|
54
|
+
method: "POST",
|
|
55
|
+
headers: { "content-type": "application/json" },
|
|
56
|
+
body: JSON.stringify(payload),
|
|
57
|
+
});
|
|
58
|
+
if (!res.ok)
|
|
59
|
+
throw new Error(`webhook ${res.status}`);
|
|
60
|
+
return { channel: "webhook", ok: true, detail: `HTTP ${res.status}` };
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Deliver a finished digest (markdown) to all configured channels.
|
|
66
|
+
* Channel failures are isolated: one failing channel does not block the others.
|
|
67
|
+
*/
|
|
68
|
+
export async function deliverDigest(cfg, markdown, channelsOverride) {
|
|
69
|
+
const v = stamps(cfg.digest.timezone);
|
|
70
|
+
const channels = channelsOverride ?? cfg.digest.channels;
|
|
71
|
+
const results = [];
|
|
72
|
+
for (const ch of channels) {
|
|
73
|
+
try {
|
|
74
|
+
results.push(await deliverOne(cfg, ch, markdown, v));
|
|
75
|
+
}
|
|
76
|
+
catch (e) {
|
|
77
|
+
results.push({ channel: ch.type, ok: false, detail: e.message });
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
return results;
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=digest.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"digest.js","sourceRoot":"","sources":["../src/digest.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { loadConfig } from "./config.js";
|
|
3
|
+
import { runServer } from "./server.js";
|
|
4
|
+
import { runSetup } from "./setup.js";
|
|
5
|
+
import { runInstall } from "./install.js";
|
|
6
|
+
import { getUnread, listFolders } from "./mail/imap.js";
|
|
7
|
+
import { deliverDigest } from "./digest.js";
|
|
8
|
+
/** Plain (non-AI) digest: list unread grouped by account and deliver. For testing the pipeline. */
|
|
9
|
+
async function runRawDigest() {
|
|
10
|
+
const cfg = loadConfig();
|
|
11
|
+
const sections = [];
|
|
12
|
+
let total = 0;
|
|
13
|
+
for (const acc of cfg.accounts) {
|
|
14
|
+
try {
|
|
15
|
+
const unread = await getUnread(acc, "INBOX", 50);
|
|
16
|
+
total += unread.length;
|
|
17
|
+
const lines = unread.map((m) => `- **${m.subject}** — ${m.from} (${m.date.slice(0, 10)})`);
|
|
18
|
+
sections.push(`## ${acc.label ?? acc.id} (${unread.length})\n${lines.join("\n") || "_brak_"}`);
|
|
19
|
+
}
|
|
20
|
+
catch (e) {
|
|
21
|
+
sections.push(`## ${acc.label ?? acc.id}\n_blad: ${e.message}_`);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
const md = `# Poczta — nieprzeczytane (${total})\n\n${sections.join("\n\n")}\n`;
|
|
25
|
+
const results = await deliverDigest(cfg, md);
|
|
26
|
+
process.stderr.write(`raw digest delivered: ${JSON.stringify(results)}\n`);
|
|
27
|
+
if (results.some((r) => r.channel === "chat"))
|
|
28
|
+
process.stdout.write(md);
|
|
29
|
+
}
|
|
30
|
+
/** Standalone refresh-token grabber: node dist/index.js oauth google|microsoft */
|
|
31
|
+
async function runOauth(provider) {
|
|
32
|
+
const { intro, outro, text, password, isCancel, cancel } = await import("@clack/prompts");
|
|
33
|
+
const { googleLoopback, microsoftLoopback } = await import("./oauth.js");
|
|
34
|
+
const req = (v) => {
|
|
35
|
+
if (isCancel(v)) {
|
|
36
|
+
cancel("Przerwano.");
|
|
37
|
+
process.exit(0);
|
|
38
|
+
}
|
|
39
|
+
return v;
|
|
40
|
+
};
|
|
41
|
+
intro(`oauth · ${provider ?? "?"}`);
|
|
42
|
+
if (provider === "google") {
|
|
43
|
+
const clientId = req(await text({ message: "Google Client ID" })).trim();
|
|
44
|
+
const clientSecret = req(await password({ message: "Google Client secret" }));
|
|
45
|
+
const { refreshToken } = await googleLoopback({ clientId, clientSecret });
|
|
46
|
+
process.stdout.write(`\nREFRESH_TOKEN=${refreshToken}\n`);
|
|
47
|
+
}
|
|
48
|
+
else if (provider === "microsoft") {
|
|
49
|
+
const tenantId = req(await text({ message: "Azure tenantId" })).trim();
|
|
50
|
+
const clientId = req(await text({ message: "Azure clientId" })).trim();
|
|
51
|
+
const clientSecret = req(await password({ message: "Azure client secret" }));
|
|
52
|
+
const { refreshToken } = await microsoftLoopback({ tenantId, clientId, clientSecret, port: 3000 });
|
|
53
|
+
process.stdout.write(`\nREFRESH_TOKEN=${refreshToken}\n`);
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
process.stderr.write("Uzycie: poczta-mcp oauth google|microsoft\n");
|
|
57
|
+
process.exit(1);
|
|
58
|
+
}
|
|
59
|
+
outro("Wklej wartosc do .env pod nazwa z refreshTokenEnv.");
|
|
60
|
+
}
|
|
61
|
+
/** Verify each account can authenticate and list folders. */
|
|
62
|
+
async function runDoctor() {
|
|
63
|
+
const cfg = loadConfig();
|
|
64
|
+
for (const acc of cfg.accounts) {
|
|
65
|
+
try {
|
|
66
|
+
const folders = await listFolders(acc);
|
|
67
|
+
process.stdout.write(`OK ${acc.id} (${acc.email}) — ${folders.length} folderow\n`);
|
|
68
|
+
}
|
|
69
|
+
catch (e) {
|
|
70
|
+
process.stdout.write(`FAIL ${acc.id} (${acc.email}) — ${e.message}\n`);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
async function main() {
|
|
75
|
+
const cmd = process.argv[2];
|
|
76
|
+
switch (cmd) {
|
|
77
|
+
case "setup":
|
|
78
|
+
await runSetup();
|
|
79
|
+
break;
|
|
80
|
+
case "install":
|
|
81
|
+
await runInstall();
|
|
82
|
+
break;
|
|
83
|
+
case "digest":
|
|
84
|
+
await runRawDigest();
|
|
85
|
+
break;
|
|
86
|
+
case "doctor":
|
|
87
|
+
await runDoctor();
|
|
88
|
+
break;
|
|
89
|
+
case "oauth":
|
|
90
|
+
await runOauth(process.argv[3]);
|
|
91
|
+
break;
|
|
92
|
+
case undefined:
|
|
93
|
+
case "server":
|
|
94
|
+
await runServer();
|
|
95
|
+
break;
|
|
96
|
+
default:
|
|
97
|
+
process.stderr.write(`Unknown command: ${cmd}\nUsage: poczta-mcp [server|setup|install|doctor|digest|oauth google|microsoft]\n`);
|
|
98
|
+
process.exit(1);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
main().catch((e) => {
|
|
102
|
+
process.stderr.write(`${e.stack ?? e}\n`);
|
|
103
|
+
process.exit(1);
|
|
104
|
+
});
|
|
105
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/install.js
ADDED
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
import { existsSync, readFileSync, writeFileSync, mkdirSync } from "node:fs";
|
|
2
|
+
import { dirname, join, resolve } from "node:path";
|
|
3
|
+
import { homedir, platform } from "node:os";
|
|
4
|
+
import { fileURLToPath } from "node:url";
|
|
5
|
+
import { spawnSync } from "node:child_process";
|
|
6
|
+
import { intro, outro, multiselect, confirm, isCancel, cancel, note, log, spinner } from "@clack/prompts";
|
|
7
|
+
import { configPath, envPath } from "./config.js";
|
|
8
|
+
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
9
|
+
const PKG_ROOT = resolve(__dirname, ".."); // dist/install.js -> project root
|
|
10
|
+
const SERVER_SCRIPT = join(__dirname, "index.js"); // dist/index.js
|
|
11
|
+
function req(v) {
|
|
12
|
+
if (isCancel(v)) {
|
|
13
|
+
cancel("Przerwano.");
|
|
14
|
+
process.exit(0);
|
|
15
|
+
}
|
|
16
|
+
return v;
|
|
17
|
+
}
|
|
18
|
+
/** Is `poczta-mcp` resolvable on PATH? */
|
|
19
|
+
function globalBinPresent() {
|
|
20
|
+
const which = platform() === "win32" ? "where" : "which";
|
|
21
|
+
const r = spawnSync(which, ["poczta-mcp"], { encoding: "utf8" });
|
|
22
|
+
return r.status === 0 && !!(r.stdout ?? "").trim();
|
|
23
|
+
}
|
|
24
|
+
function isCmdPresent(cmd) {
|
|
25
|
+
const which = platform() === "win32" ? "where" : "which";
|
|
26
|
+
const r = spawnSync(which, [cmd], { encoding: "utf8" });
|
|
27
|
+
return r.status === 0 && !!(r.stdout ?? "").trim();
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Absolute node path that survives version upgrades.
|
|
31
|
+
*
|
|
32
|
+
* Prefer the `node` on PATH (usually a stable symlink like /opt/homebrew/bin/node that
|
|
33
|
+
* also sits in the client's restricted PATH). Fall back to process.execPath, which is a
|
|
34
|
+
* version-pinned path (e.g. .../node/26.3.1/bin/node) that breaks on upgrade.
|
|
35
|
+
*/
|
|
36
|
+
function stableNodePath() {
|
|
37
|
+
const which = platform() === "win32" ? "where" : "which";
|
|
38
|
+
const r = spawnSync(which, ["node"], { encoding: "utf8" });
|
|
39
|
+
const p = (r.stdout ?? "").split("\n")[0]?.trim();
|
|
40
|
+
if (p && existsSync(p))
|
|
41
|
+
return p;
|
|
42
|
+
return process.execPath;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Build the launch command + env for the MCP entry.
|
|
46
|
+
*
|
|
47
|
+
* ALWAYS absolute node + absolute script — never the bare `poczta-mcp` bin name.
|
|
48
|
+
* Clients (Claude Desktop especially) spawn with a restricted PATH that often does
|
|
49
|
+
* not include the npm global bin dir, so a bare command fails with ENOENT. An
|
|
50
|
+
* absolute node path sidesteps PATH entirely.
|
|
51
|
+
*/
|
|
52
|
+
function serverCmd() {
|
|
53
|
+
const env = {};
|
|
54
|
+
const cfg = configPath();
|
|
55
|
+
const en = envPath();
|
|
56
|
+
if (existsSync(cfg))
|
|
57
|
+
env.POCZTA_MCP_CONFIG = cfg;
|
|
58
|
+
if (existsSync(en))
|
|
59
|
+
env.POCZTA_MCP_ENV = en;
|
|
60
|
+
return { command: stableNodePath(), args: [SERVER_SCRIPT, "server"], env };
|
|
61
|
+
}
|
|
62
|
+
/** npm install -g the package directory; returns true on success. */
|
|
63
|
+
function npmInstallGlobal() {
|
|
64
|
+
const s = spinner();
|
|
65
|
+
s.start("npm install -g (globalna instalacja)...");
|
|
66
|
+
const r = spawnSync("npm", ["install", "-g", PKG_ROOT], { encoding: "utf8" });
|
|
67
|
+
if (r.status === 0) {
|
|
68
|
+
s.stop("Zainstalowano globalnie: poczta-mcp");
|
|
69
|
+
return true;
|
|
70
|
+
}
|
|
71
|
+
s.stop("npm install -g nieudane");
|
|
72
|
+
log.error((r.stderr || r.stdout || "brak szczegolow").trim().split("\n").slice(-4).join("\n"));
|
|
73
|
+
return false;
|
|
74
|
+
}
|
|
75
|
+
// ── Claude Code ───────────────────────────────────────────────────────────────
|
|
76
|
+
function installClaudeCode(sc) {
|
|
77
|
+
// Preferred path: the official CLI handles config location + scope.
|
|
78
|
+
if (isCmdPresent("claude")) {
|
|
79
|
+
const args = ["mcp", "add", "poczta", "-s", "user"];
|
|
80
|
+
for (const [k, v] of Object.entries(sc.env))
|
|
81
|
+
args.push("-e", `${k}=${v}`);
|
|
82
|
+
args.push("--", sc.command, ...sc.args);
|
|
83
|
+
const r = spawnSync("claude", args, { encoding: "utf8" });
|
|
84
|
+
if (r.status === 0)
|
|
85
|
+
return "Claude Code: dodano przez 'claude mcp add' (scope user)";
|
|
86
|
+
// fall through to file merge on failure (e.g. already exists)
|
|
87
|
+
log.warn(`'claude mcp add' zwrocilo blad, probuje plik: ${(r.stderr || "").trim().split("\n")[0]}`);
|
|
88
|
+
}
|
|
89
|
+
// Fallback: merge ~/.claude.json (user scope).
|
|
90
|
+
const p = join(homedir(), ".claude.json");
|
|
91
|
+
const json = existsSync(p) ? JSON.parse(readFileSync(p, "utf8")) : {};
|
|
92
|
+
json.mcpServers = json.mcpServers ?? {};
|
|
93
|
+
json.mcpServers.poczta = { command: sc.command, args: sc.args, env: sc.env };
|
|
94
|
+
writeFileSync(p, JSON.stringify(json, null, 2) + "\n", "utf8");
|
|
95
|
+
return `Claude Code: wpisano do ${p}`;
|
|
96
|
+
}
|
|
97
|
+
// ── Claude Desktop ──────────────────────────────────────────────────────────
|
|
98
|
+
function claudeDesktopConfigPath() {
|
|
99
|
+
if (platform() === "darwin")
|
|
100
|
+
return join(homedir(), "Library", "Application Support", "Claude", "claude_desktop_config.json");
|
|
101
|
+
if (platform() === "win32")
|
|
102
|
+
return join(process.env.APPDATA ?? join(homedir(), "AppData", "Roaming"), "Claude", "claude_desktop_config.json");
|
|
103
|
+
return join(homedir(), ".config", "Claude", "claude_desktop_config.json");
|
|
104
|
+
}
|
|
105
|
+
function installClaudeDesktop(sc) {
|
|
106
|
+
const p = claudeDesktopConfigPath();
|
|
107
|
+
mkdirSync(dirname(p), { recursive: true });
|
|
108
|
+
const json = existsSync(p) ? JSON.parse(readFileSync(p, "utf8")) : {};
|
|
109
|
+
json.mcpServers = json.mcpServers ?? {};
|
|
110
|
+
json.mcpServers.poczta = { command: sc.command, args: sc.args, env: sc.env };
|
|
111
|
+
writeFileSync(p, JSON.stringify(json, null, 2) + "\n", "utf8");
|
|
112
|
+
return `Claude Desktop: ${p} (zrestartuj aplikacje)`;
|
|
113
|
+
}
|
|
114
|
+
// ── Codex CLI (~/.codex/config.toml) ──────────────────────────────────────────
|
|
115
|
+
function tomlString(v) {
|
|
116
|
+
return `"${v.replace(/\\/g, "\\\\").replace(/"/g, '\\"')}"`;
|
|
117
|
+
}
|
|
118
|
+
function codexBlock(sc) {
|
|
119
|
+
const lines = [
|
|
120
|
+
"[mcp_servers.poczta]",
|
|
121
|
+
`command = ${tomlString(sc.command)}`,
|
|
122
|
+
`args = [${sc.args.map(tomlString).join(", ")}]`,
|
|
123
|
+
];
|
|
124
|
+
const envKeys = Object.keys(sc.env);
|
|
125
|
+
if (envKeys.length) {
|
|
126
|
+
lines.push("", "[mcp_servers.poczta.env]");
|
|
127
|
+
for (const k of envKeys)
|
|
128
|
+
lines.push(`${k} = ${tomlString(sc.env[k])}`);
|
|
129
|
+
}
|
|
130
|
+
return lines.join("\n") + "\n";
|
|
131
|
+
}
|
|
132
|
+
/** Remove any existing [mcp_servers.poczta] and [mcp_servers.poczta.env] tables. */
|
|
133
|
+
function stripCodexPoczta(toml) {
|
|
134
|
+
const lines = toml.split("\n");
|
|
135
|
+
const out = [];
|
|
136
|
+
let skipping = false;
|
|
137
|
+
for (const line of lines) {
|
|
138
|
+
const t = line.trim();
|
|
139
|
+
if (/^\[mcp_servers\.poczta(\.env)?\]\s*$/.test(t)) {
|
|
140
|
+
skipping = true;
|
|
141
|
+
continue;
|
|
142
|
+
}
|
|
143
|
+
if (skipping && /^\[/.test(t))
|
|
144
|
+
skipping = false; // next table starts -> stop skipping
|
|
145
|
+
if (!skipping)
|
|
146
|
+
out.push(line);
|
|
147
|
+
}
|
|
148
|
+
return out.join("\n");
|
|
149
|
+
}
|
|
150
|
+
function installCodex(sc) {
|
|
151
|
+
const p = join(homedir(), ".codex", "config.toml");
|
|
152
|
+
mkdirSync(dirname(p), { recursive: true });
|
|
153
|
+
let toml = existsSync(p) ? readFileSync(p, "utf8") : "";
|
|
154
|
+
const had = /\[mcp_servers\.poczta\]/.test(toml);
|
|
155
|
+
toml = stripCodexPoczta(toml).replace(/\n{3,}/g, "\n\n").replace(/\s*$/, "\n");
|
|
156
|
+
if (toml.trim())
|
|
157
|
+
toml += "\n";
|
|
158
|
+
toml += codexBlock(sc);
|
|
159
|
+
writeFileSync(p, toml, "utf8");
|
|
160
|
+
return `Codex: ${p}${had ? " (zaktualizowano istniejacy wpis)" : ""}`;
|
|
161
|
+
}
|
|
162
|
+
export async function runInstall() {
|
|
163
|
+
intro("poczta-mcp · instalacja");
|
|
164
|
+
if (!existsSync(configPath())) {
|
|
165
|
+
log.warn(`Brak config.json (${configPath()}). Rejestracja zadziala, ale najpierw odpal 'poczta-mcp setup'.`);
|
|
166
|
+
}
|
|
167
|
+
// Optional: global bin for terminal convenience (`poczta-mcp setup`). The MCP entry
|
|
168
|
+
// below ALWAYS uses an absolute node path regardless, so PATH never matters for the client.
|
|
169
|
+
if (!globalBinPresent()) {
|
|
170
|
+
const wantGlobal = req(await confirm({
|
|
171
|
+
message: "Zainstalowac globalnie (npm i -g) dla wygody w terminalu? (wpis MCP i tak uzyje absolutnej sciezki)",
|
|
172
|
+
initialValue: false,
|
|
173
|
+
}));
|
|
174
|
+
if (wantGlobal)
|
|
175
|
+
npmInstallGlobal();
|
|
176
|
+
}
|
|
177
|
+
else {
|
|
178
|
+
log.info("poczta-mcp juz dostepny globalnie.");
|
|
179
|
+
}
|
|
180
|
+
const sc = serverCmd();
|
|
181
|
+
note(`command: ${sc.command}\nargs: ${sc.args.join(" ")}\n` +
|
|
182
|
+
Object.entries(sc.env).map(([k, v]) => `${k}=${v}`).join("\n"), "Wpis MCP");
|
|
183
|
+
const targets = req(await multiselect({
|
|
184
|
+
message: "Gdzie zarejestrowac serwer MCP? (spacja zaznacza)",
|
|
185
|
+
options: [
|
|
186
|
+
{ value: "claude-code", label: "Claude Code (CLI)" },
|
|
187
|
+
{ value: "claude-desktop", label: "Claude Desktop" },
|
|
188
|
+
{ value: "codex", label: "Codex CLI" },
|
|
189
|
+
],
|
|
190
|
+
required: true,
|
|
191
|
+
}));
|
|
192
|
+
const results = [];
|
|
193
|
+
for (const t of targets) {
|
|
194
|
+
try {
|
|
195
|
+
if (t === "claude-code")
|
|
196
|
+
results.push(installClaudeCode(sc));
|
|
197
|
+
else if (t === "claude-desktop")
|
|
198
|
+
results.push(installClaudeDesktop(sc));
|
|
199
|
+
else if (t === "codex")
|
|
200
|
+
results.push(installCodex(sc));
|
|
201
|
+
}
|
|
202
|
+
catch (e) {
|
|
203
|
+
results.push(`BLAD (${t}): ${e.message}`);
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
note(results.join("\n"), "Wynik");
|
|
207
|
+
outro("Gotowe. Zrestartuj klienta. Test: zapytaj agenta 'co mam nieprzeczytane'.");
|
|
208
|
+
}
|
|
209
|
+
//# sourceMappingURL=install.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install.js","sourceRoot":"","sources":["../src/install.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
import { ImapFlow } from "imapflow";
|
|
2
|
+
import { simpleParser } from "mailparser";
|
|
3
|
+
import { convert as htmlToText } from "html-to-text";
|
|
4
|
+
import { resolveCreds } from "../auth/index.js";
|
|
5
|
+
const PREVIEW_LEN = 240;
|
|
6
|
+
/** Build an authenticated, connected ImapFlow client for an account. */
|
|
7
|
+
async function connect(acc) {
|
|
8
|
+
const creds = await resolveCreds(acc);
|
|
9
|
+
const opts = {
|
|
10
|
+
host: acc.imap.host,
|
|
11
|
+
port: acc.imap.port,
|
|
12
|
+
secure: acc.imap.secure,
|
|
13
|
+
auth: creds.kind === "password"
|
|
14
|
+
? { user: creds.user, pass: creds.pass }
|
|
15
|
+
: { user: creds.user, accessToken: creds.accessToken },
|
|
16
|
+
logger: false,
|
|
17
|
+
// STARTTLS path when secure=false (e.g. port 143/587)
|
|
18
|
+
...(acc.imap.secure ? {} : { disableAutoIdle: true }),
|
|
19
|
+
};
|
|
20
|
+
const client = new ImapFlow(opts);
|
|
21
|
+
await client.connect();
|
|
22
|
+
return client;
|
|
23
|
+
}
|
|
24
|
+
/** Connect, run fn, always logout. One connection per operation (matches the simple, robust pattern). */
|
|
25
|
+
async function withImap(acc, fn) {
|
|
26
|
+
const client = await connect(acc);
|
|
27
|
+
try {
|
|
28
|
+
return await fn(client);
|
|
29
|
+
}
|
|
30
|
+
finally {
|
|
31
|
+
await client.logout().catch(() => client.close());
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
function addr(v) {
|
|
35
|
+
// imapflow envelope address arrays -> "Name <email>" joined
|
|
36
|
+
if (!Array.isArray(v))
|
|
37
|
+
return "";
|
|
38
|
+
return v
|
|
39
|
+
.map((a) => a.name ? `${a.name} <${a.address ?? ""}>` : (a.address ?? ""))
|
|
40
|
+
.filter(Boolean)
|
|
41
|
+
.join(", ");
|
|
42
|
+
}
|
|
43
|
+
function isoDate(d) {
|
|
44
|
+
if (d instanceof Date && !isNaN(d.getTime()))
|
|
45
|
+
return d.toISOString();
|
|
46
|
+
return "";
|
|
47
|
+
}
|
|
48
|
+
async function previewFromSource(source) {
|
|
49
|
+
const parsed = await simpleParser(source);
|
|
50
|
+
let text = parsed.text?.trim() ?? "";
|
|
51
|
+
if (!text && parsed.html) {
|
|
52
|
+
text = htmlToText(parsed.html, { wordwrap: false }).trim();
|
|
53
|
+
}
|
|
54
|
+
return { text };
|
|
55
|
+
}
|
|
56
|
+
export async function getUnread(acc, folder = "INBOX", maxResults = 35, maxAgeDays = 3) {
|
|
57
|
+
return withImap(acc, async (c) => {
|
|
58
|
+
const lock = await c.getMailboxLock(folder);
|
|
59
|
+
try {
|
|
60
|
+
const criteria = { seen: false };
|
|
61
|
+
if (maxAgeDays && maxAgeDays > 0) {
|
|
62
|
+
// IMAP SINCE is date-granular; subtract whole days from today.
|
|
63
|
+
criteria.since = new Date(Date.now() - maxAgeDays * 86_400_000);
|
|
64
|
+
}
|
|
65
|
+
const uids = await c.search(criteria, { uid: true });
|
|
66
|
+
if (!uids || uids.length === 0)
|
|
67
|
+
return [];
|
|
68
|
+
const recent = uids.slice(-maxResults).reverse();
|
|
69
|
+
const out = [];
|
|
70
|
+
for await (const msg of c.fetch(recent, { uid: true, envelope: true, source: true }, { uid: true })) {
|
|
71
|
+
const env = msg.envelope;
|
|
72
|
+
const { text } = msg.source ? await previewFromSource(msg.source) : { text: "" };
|
|
73
|
+
out.push({
|
|
74
|
+
account: acc.id,
|
|
75
|
+
uid: String(msg.uid),
|
|
76
|
+
from: addr(env?.from),
|
|
77
|
+
to: addr(env?.to),
|
|
78
|
+
subject: env?.subject ?? "(brak tematu)",
|
|
79
|
+
date: isoDate(env?.date),
|
|
80
|
+
preview: text.replace(/\s+/g, " ").slice(0, PREVIEW_LEN),
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
// fetch() yields in ascending uid order; restore newest-first
|
|
84
|
+
return out.reverse();
|
|
85
|
+
}
|
|
86
|
+
finally {
|
|
87
|
+
lock.release();
|
|
88
|
+
}
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
export async function getBody(acc, uid, folder = "INBOX") {
|
|
92
|
+
return withImap(acc, async (c) => {
|
|
93
|
+
const lock = await c.getMailboxLock(folder);
|
|
94
|
+
try {
|
|
95
|
+
const msg = await c.fetchOne(uid, { uid: true, envelope: true, source: true }, { uid: true });
|
|
96
|
+
if (!msg || !msg.source)
|
|
97
|
+
return null;
|
|
98
|
+
const env = msg.envelope;
|
|
99
|
+
const parsed = await simpleParser(msg.source);
|
|
100
|
+
let body = parsed.text?.trim() ?? "";
|
|
101
|
+
if (!body && parsed.html)
|
|
102
|
+
body = htmlToText(parsed.html, { wordwrap: false }).trim();
|
|
103
|
+
return {
|
|
104
|
+
account: acc.id,
|
|
105
|
+
uid: String(msg.uid),
|
|
106
|
+
from: addr(env?.from),
|
|
107
|
+
to: addr(env?.to),
|
|
108
|
+
subject: env?.subject ?? "(brak tematu)",
|
|
109
|
+
date: isoDate(env?.date),
|
|
110
|
+
preview: body.replace(/\s+/g, " ").slice(0, PREVIEW_LEN),
|
|
111
|
+
body,
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
finally {
|
|
115
|
+
lock.release();
|
|
116
|
+
}
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
export async function searchEmails(acc, crit, folder = "INBOX", maxResults = 20) {
|
|
120
|
+
return withImap(acc, async (c) => {
|
|
121
|
+
const lock = await c.getMailboxLock(folder);
|
|
122
|
+
try {
|
|
123
|
+
const q = {};
|
|
124
|
+
if (crit.from)
|
|
125
|
+
q.from = crit.from;
|
|
126
|
+
if (crit.subject)
|
|
127
|
+
q.subject = crit.subject;
|
|
128
|
+
if (crit.since) {
|
|
129
|
+
const d = new Date(`${crit.since}T00:00:00Z`);
|
|
130
|
+
if (!isNaN(d.getTime()))
|
|
131
|
+
q.since = d;
|
|
132
|
+
}
|
|
133
|
+
if (crit.unreadOnly)
|
|
134
|
+
q.seen = false;
|
|
135
|
+
const uids = await c.search(Object.keys(q).length ? q : { all: true }, { uid: true });
|
|
136
|
+
if (!uids || uids.length === 0)
|
|
137
|
+
return [];
|
|
138
|
+
const recent = uids.slice(-maxResults).reverse();
|
|
139
|
+
const out = [];
|
|
140
|
+
for await (const msg of c.fetch(recent, { uid: true, envelope: true }, { uid: true })) {
|
|
141
|
+
const env = msg.envelope;
|
|
142
|
+
out.push({
|
|
143
|
+
account: acc.id,
|
|
144
|
+
uid: String(msg.uid),
|
|
145
|
+
from: addr(env?.from),
|
|
146
|
+
to: addr(env?.to),
|
|
147
|
+
subject: env?.subject ?? "(brak tematu)",
|
|
148
|
+
date: isoDate(env?.date),
|
|
149
|
+
preview: "",
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
return out.reverse();
|
|
153
|
+
}
|
|
154
|
+
finally {
|
|
155
|
+
lock.release();
|
|
156
|
+
}
|
|
157
|
+
});
|
|
158
|
+
}
|
|
159
|
+
export async function markRead(acc, uids, folder = "INBOX") {
|
|
160
|
+
if (uids.length === 0)
|
|
161
|
+
return { marked: [] };
|
|
162
|
+
return withImap(acc, async (c) => {
|
|
163
|
+
const lock = await c.getMailboxLock(folder);
|
|
164
|
+
try {
|
|
165
|
+
await c.messageFlagsAdd(uids.map(Number), ["\\Seen"], { uid: true });
|
|
166
|
+
return { marked: uids };
|
|
167
|
+
}
|
|
168
|
+
finally {
|
|
169
|
+
lock.release();
|
|
170
|
+
}
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
export async function listFolders(acc) {
|
|
174
|
+
return withImap(acc, async (c) => {
|
|
175
|
+
const list = await c.list();
|
|
176
|
+
return list.map((m) => m.path);
|
|
177
|
+
});
|
|
178
|
+
}
|
|
179
|
+
/** Fetch threading headers for a reply (best-effort). */
|
|
180
|
+
export async function getMessageId(acc, uid, folder = "INBOX") {
|
|
181
|
+
return withImap(acc, async (c) => {
|
|
182
|
+
const lock = await c.getMailboxLock(folder);
|
|
183
|
+
try {
|
|
184
|
+
const msg = await c.fetchOne(uid, { uid: true, envelope: true }, { uid: true });
|
|
185
|
+
return msg && msg.envelope ? (msg.envelope.messageId ?? undefined) : undefined;
|
|
186
|
+
}
|
|
187
|
+
finally {
|
|
188
|
+
lock.release();
|
|
189
|
+
}
|
|
190
|
+
});
|
|
191
|
+
}
|
|
192
|
+
//# sourceMappingURL=imap.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"imap.js","sourceRoot":"","sources":["../../src/mail/imap.ts"],"names":[],"mappings":"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"}
|