@jait/gateway 0.1.497 → 0.1.499
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/dist/db/migrations.d.ts.map +1 -1
- package/dist/db/migrations.js +22 -0
- package/dist/db/migrations.js.map +1 -1
- package/dist/db/schema.d.ts +178 -0
- package/dist/db/schema.d.ts.map +1 -1
- package/dist/db/schema.js +15 -0
- package/dist/db/schema.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -1
- package/dist/routes/chat.d.ts.map +1 -1
- package/dist/routes/chat.js +77 -7
- package/dist/routes/chat.js.map +1 -1
- package/dist/routes/email.d.ts +5 -0
- package/dist/routes/email.d.ts.map +1 -0
- package/dist/routes/email.js +202 -0
- package/dist/routes/email.js.map +1 -0
- package/dist/security/tool-profiles.d.ts.map +1 -1
- package/dist/security/tool-profiles.js +3 -0
- package/dist/security/tool-profiles.js.map +1 -1
- package/dist/server.d.ts +1 -0
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +4 -0
- package/dist/server.js.map +1 -1
- package/dist/services/email/gmail.d.ts +16 -0
- package/dist/services/email/gmail.d.ts.map +1 -0
- package/dist/services/email/gmail.js +170 -0
- package/dist/services/email/gmail.js.map +1 -0
- package/dist/services/email/index.d.ts +3 -0
- package/dist/services/email/index.d.ts.map +1 -0
- package/dist/services/email/index.js +2 -0
- package/dist/services/email/index.js.map +1 -0
- package/dist/services/email/oauth.d.ts +32 -0
- package/dist/services/email/oauth.d.ts.map +1 -0
- package/dist/services/email/oauth.js +105 -0
- package/dist/services/email/oauth.js.map +1 -0
- package/dist/services/email/outlook.d.ts +15 -0
- package/dist/services/email/outlook.d.ts.map +1 -0
- package/dist/services/email/outlook.js +142 -0
- package/dist/services/email/outlook.js.map +1 -0
- package/dist/services/email/service.d.ts +50 -0
- package/dist/services/email/service.d.ts.map +1 -0
- package/dist/services/email/service.js +277 -0
- package/dist/services/email/service.js.map +1 -0
- package/dist/services/email/types.d.ts +82 -0
- package/dist/services/email/types.d.ts.map +1 -0
- package/dist/services/email/types.js +3 -0
- package/dist/services/email/types.js.map +1 -0
- package/dist/tools/email-tools.d.ts +52 -0
- package/dist/tools/email-tools.d.ts.map +1 -0
- package/dist/tools/email-tools.js +237 -0
- package/dist/tools/email-tools.js.map +1 -0
- package/dist/tools/index.d.ts +3 -1
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +16 -2
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/project-tools.d.ts +6 -0
- package/dist/tools/project-tools.d.ts.map +1 -1
- package/dist/tools/project-tools.js +82 -0
- package/dist/tools/project-tools.js.map +1 -1
- package/dist/tools/tool-names.d.ts +1 -0
- package/dist/tools/tool-names.d.ts.map +1 -1
- package/dist/tools/tool-names.js +1 -0
- package/dist/tools/tool-names.js.map +1 -1
- package/package.json +2 -2
- package/web-dist/assets/{_basePickBy-1ypMBiW_.js → _basePickBy-CzT63eI9.js} +1 -1
- package/web-dist/assets/{_baseUniq-DvjcbfPq.js → _baseUniq-C9jker1F.js} +1 -1
- package/web-dist/assets/{arc-ErevYm19.js → arc-DljFfWWm.js} +1 -1
- package/web-dist/assets/{architectureDiagram-2XIMDMQ5-D_WVp0kY.js → architectureDiagram-2XIMDMQ5-pEbMBiw_.js} +1 -1
- package/web-dist/assets/{blockDiagram-WCTKOSBZ-Bo6-xom-.js → blockDiagram-WCTKOSBZ-A_4J6Sb-.js} +1 -1
- package/web-dist/assets/{c4Diagram-IC4MRINW-D9M8EKu_.js → c4Diagram-IC4MRINW-COgCzBlY.js} +1 -1
- package/web-dist/assets/channel-xM6w002v.js +1 -0
- package/web-dist/assets/{chunk-4BX2VUAB-WH1KAVAb.js → chunk-4BX2VUAB-Bfy5mnZM.js} +1 -1
- package/web-dist/assets/{chunk-55IACEB6-D2a2qrrp.js → chunk-55IACEB6-BHbwUxN1.js} +1 -1
- package/web-dist/assets/{chunk-FMBD7UC4-28DcGMIY.js → chunk-FMBD7UC4-oWbyVk_l.js} +1 -1
- package/web-dist/assets/{chunk-JSJVCQXG-C1uNGWZs.js → chunk-JSJVCQXG-DICPKbbU.js} +1 -1
- package/web-dist/assets/{chunk-KX2RTZJC-V1qtcDEn.js → chunk-KX2RTZJC-S1AI6fsb.js} +1 -1
- package/web-dist/assets/{chunk-NQ4KR5QH-cug-v0rY.js → chunk-NQ4KR5QH-CC2BDuwQ.js} +1 -1
- package/web-dist/assets/{chunk-QZHKN3VN-CM17QePX.js → chunk-QZHKN3VN-BU0b1vSt.js} +1 -1
- package/web-dist/assets/{chunk-WL4C6EOR-DlYbqSTG.js → chunk-WL4C6EOR-BxRy9Kn0.js} +1 -1
- package/web-dist/assets/classDiagram-VBA2DB6C-BwiCmurD.js +1 -0
- package/web-dist/assets/classDiagram-v2-RAHNMMFH-BwiCmurD.js +1 -0
- package/web-dist/assets/clone-BXkaMZnK.js +1 -0
- package/web-dist/assets/{cose-bilkent-S5V4N54A-CVsGoDQL.js → cose-bilkent-S5V4N54A-C0lXwD6L.js} +1 -1
- package/web-dist/assets/{dagre-KLK3FWXG-DLQZVyW4.js → dagre-KLK3FWXG-DsCVwtnr.js} +1 -1
- package/web-dist/assets/{diagram-E7M64L7V-BF0y78lG.js → diagram-E7M64L7V-CRFZjLO4.js} +1 -1
- package/web-dist/assets/{diagram-IFDJBPK2-MuDqalfZ.js → diagram-IFDJBPK2-CxxDuheX.js} +1 -1
- package/web-dist/assets/{diagram-P4PSJMXO-e36wc7XG.js → diagram-P4PSJMXO-DdN9wKJP.js} +1 -1
- package/web-dist/assets/{erDiagram-INFDFZHY-B_i7tPHh.js → erDiagram-INFDFZHY-BxRMeXZf.js} +1 -1
- package/web-dist/assets/{flowDiagram-PKNHOUZH-fPB07Diy.js → flowDiagram-PKNHOUZH--76cPw_T.js} +1 -1
- package/web-dist/assets/{ganttDiagram-A5KZAMGK-q8EsM9Gb.js → ganttDiagram-A5KZAMGK-D81XRpy6.js} +1 -1
- package/web-dist/assets/{gitGraphDiagram-K3NZZRJ6-BiAyblPL.js → gitGraphDiagram-K3NZZRJ6-BWTqK6Hq.js} +1 -1
- package/web-dist/assets/{graph-DnNeq8po.js → graph-e1i_2mNj.js} +1 -1
- package/web-dist/assets/index-BU0ZMPd5.css +32 -0
- package/web-dist/assets/{index-Bk_qadgU.js → index-C_vS46mJ.js} +1 -1
- package/web-dist/assets/{index-BbmkMmHZ.js → index-_OeJ0-l0.js} +1 -1
- package/web-dist/assets/{index-CzRne9la.js → index-oEvNrdmq.js} +395 -373
- package/web-dist/assets/{infoDiagram-LFFYTUFH-C3TzSSln.js → infoDiagram-LFFYTUFH-BAvnH6OJ.js} +1 -1
- package/web-dist/assets/{ishikawaDiagram-PHBUUO56-szGd8_KC.js → ishikawaDiagram-PHBUUO56-DaNqVDUe.js} +1 -1
- package/web-dist/assets/{journeyDiagram-4ABVD52K-ByTvobTa.js → journeyDiagram-4ABVD52K-BjDRRfop.js} +1 -1
- package/web-dist/assets/{kanban-definition-K7BYSVSG-DoUUzwjw.js → kanban-definition-K7BYSVSG-Qw6LXlh0.js} +1 -1
- package/web-dist/assets/{layout-BzJ0RrG1.js → layout-BhFuErQG.js} +1 -1
- package/web-dist/assets/{linear-B5XYxmuh.js → linear-CVpOVEfb.js} +1 -1
- package/web-dist/assets/{mindmap-definition-YRQLILUH-FaHbvuby.js → mindmap-definition-YRQLILUH-HX2oEkzo.js} +1 -1
- package/web-dist/assets/{pieDiagram-SKSYHLDU-F0mNDNRX.js → pieDiagram-SKSYHLDU-eoDXKsir.js} +1 -1
- package/web-dist/assets/{quadrantDiagram-337W2JSQ-CSy2sGI7.js → quadrantDiagram-337W2JSQ-BMuqPJ4T.js} +1 -1
- package/web-dist/assets/{requirementDiagram-Z7DCOOCP-iXp1hJSy.js → requirementDiagram-Z7DCOOCP-DortKE8d.js} +1 -1
- package/web-dist/assets/{sankeyDiagram-WA2Y5GQK-BUFT8Ncy.js → sankeyDiagram-WA2Y5GQK-BdCE80-q.js} +1 -1
- package/web-dist/assets/{sequenceDiagram-2WXFIKYE-iWc1z5r5.js → sequenceDiagram-2WXFIKYE-CcYDmGFB.js} +1 -1
- package/web-dist/assets/{stateDiagram-RAJIS63D-Dmla9JkM.js → stateDiagram-RAJIS63D-CSTfSkb3.js} +1 -1
- package/web-dist/assets/stateDiagram-v2-FVOUBMTO-DBn-vddG.js +1 -0
- package/web-dist/assets/{timeline-definition-YZTLITO2-4XUMaeyN.js → timeline-definition-YZTLITO2-CluVwYjy.js} +1 -1
- package/web-dist/assets/{treemap-KZPCXAKY-BiXISVos.js → treemap-KZPCXAKY-Ds4wGITO.js} +1 -1
- package/web-dist/assets/{vennDiagram-LZ73GAT5-BHzH1mWp.js → vennDiagram-LZ73GAT5-DDk9o8W5.js} +1 -1
- package/web-dist/assets/{xychartDiagram-JWTSCODW-C1rAefFy.js → xychartDiagram-JWTSCODW-BWpgTsfS.js} +1 -1
- package/web-dist/index.html +2 -2
- package/web-dist/assets/channel-CzVoFm04.js +0 -1
- package/web-dist/assets/classDiagram-VBA2DB6C-CkMkzWkJ.js +0 -1
- package/web-dist/assets/classDiagram-v2-RAHNMMFH-CkMkzWkJ.js +0 -1
- package/web-dist/assets/clone-BrtlKZXp.js +0 -1
- package/web-dist/assets/index-C-Ol-PwZ.css +0 -32
- package/web-dist/assets/stateDiagram-v2-FVOUBMTO-DrmN0_X9.js +0 -1
|
@@ -0,0 +1,277 @@
|
|
|
1
|
+
// EmailService — orchestrates connected mailboxes: OAuth connect flow,
|
|
2
|
+
// account persistence, token storage/refresh, and provider-agnostic ops.
|
|
3
|
+
import { randomBytes } from "node:crypto";
|
|
4
|
+
import { and, desc, eq, isNull } from "drizzle-orm";
|
|
5
|
+
import { emailAccounts } from "../../db/schema.js";
|
|
6
|
+
import { uuidv7 } from "../../db/uuidv7.js";
|
|
7
|
+
import { GmailClient } from "./gmail.js";
|
|
8
|
+
import { OutlookClient } from "./outlook.js";
|
|
9
|
+
import { buildAuthorizeUrl, createPkce, envClientCredentials, exchangeCode, refreshTokens, } from "./oauth.js";
|
|
10
|
+
const TOKEN_SECRET_TYPE = "email-account";
|
|
11
|
+
const APP_SECRET_TYPE = "email-oauth-app";
|
|
12
|
+
const PROVIDERS = ["gmail", "outlook"];
|
|
13
|
+
export class EmailService {
|
|
14
|
+
db;
|
|
15
|
+
secrets;
|
|
16
|
+
clients = {
|
|
17
|
+
gmail: new GmailClient(),
|
|
18
|
+
outlook: new OutlookClient(),
|
|
19
|
+
};
|
|
20
|
+
pending = new Map();
|
|
21
|
+
constructor(db, secrets) {
|
|
22
|
+
this.db = db;
|
|
23
|
+
this.secrets = secrets;
|
|
24
|
+
}
|
|
25
|
+
// ── OAuth client credentials ───────────────────────────────────────
|
|
26
|
+
/** Resolve OAuth app credentials: per-user secret first, then env. */
|
|
27
|
+
resolveCredentials(provider, userId) {
|
|
28
|
+
const clientId = this.secrets.getValue(userId, APP_SECRET_TYPE, `${provider}-client-id`);
|
|
29
|
+
const clientSecret = this.secrets.getValue(userId, APP_SECRET_TYPE, `${provider}-client-secret`);
|
|
30
|
+
if (clientId && clientSecret)
|
|
31
|
+
return { clientId, clientSecret };
|
|
32
|
+
return envClientCredentials(provider);
|
|
33
|
+
}
|
|
34
|
+
/** Which providers are ready to connect (have OAuth app credentials). */
|
|
35
|
+
configuredProviders(userId) {
|
|
36
|
+
return {
|
|
37
|
+
gmail: !!this.resolveCredentials("gmail", userId),
|
|
38
|
+
outlook: !!this.resolveCredentials("outlook", userId),
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
saveAppCredentials(userId, provider, creds) {
|
|
42
|
+
this.secrets.save({
|
|
43
|
+
userId,
|
|
44
|
+
type: APP_SECRET_TYPE,
|
|
45
|
+
key: `${provider}-client-id`,
|
|
46
|
+
label: `${provider} OAuth client id`,
|
|
47
|
+
value: creds.clientId,
|
|
48
|
+
});
|
|
49
|
+
this.secrets.save({
|
|
50
|
+
userId,
|
|
51
|
+
type: APP_SECRET_TYPE,
|
|
52
|
+
key: `${provider}-client-secret`,
|
|
53
|
+
label: `${provider} OAuth client secret`,
|
|
54
|
+
value: creds.clientSecret,
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
// ── Connect flow ───────────────────────────────────────────────────
|
|
58
|
+
startConnect(params) {
|
|
59
|
+
if (!PROVIDERS.includes(params.provider)) {
|
|
60
|
+
throw new Error(`Unsupported email provider: ${params.provider}`);
|
|
61
|
+
}
|
|
62
|
+
const credentials = this.resolveCredentials(params.provider, params.userId);
|
|
63
|
+
if (!credentials) {
|
|
64
|
+
throw new Error(`${params.provider} is not configured. Add its OAuth client id/secret (env ` +
|
|
65
|
+
`${params.provider === "gmail" ? "GMAIL" : "OUTLOOK"}_OAUTH_CLIENT_ID/SECRET or in Email settings).`);
|
|
66
|
+
}
|
|
67
|
+
const state = randomBytes(24).toString("base64url");
|
|
68
|
+
const { verifier, challenge } = createPkce();
|
|
69
|
+
this.pending.set(state, {
|
|
70
|
+
userId: params.userId,
|
|
71
|
+
provider: params.provider,
|
|
72
|
+
codeVerifier: verifier,
|
|
73
|
+
redirectUri: params.redirectUri,
|
|
74
|
+
createdAt: Date.now(),
|
|
75
|
+
});
|
|
76
|
+
this.gcPending();
|
|
77
|
+
const authUrl = buildAuthorizeUrl({
|
|
78
|
+
provider: params.provider,
|
|
79
|
+
credentials,
|
|
80
|
+
redirectUri: params.redirectUri,
|
|
81
|
+
state,
|
|
82
|
+
codeChallenge: challenge,
|
|
83
|
+
});
|
|
84
|
+
return { authUrl };
|
|
85
|
+
}
|
|
86
|
+
async completeConnect(params) {
|
|
87
|
+
const pending = this.pending.get(params.state);
|
|
88
|
+
if (!pending)
|
|
89
|
+
throw new Error("OAuth state is invalid or expired. Please retry connecting.");
|
|
90
|
+
this.pending.delete(params.state);
|
|
91
|
+
const credentials = this.resolveCredentials(pending.provider, pending.userId);
|
|
92
|
+
if (!credentials)
|
|
93
|
+
throw new Error(`${pending.provider} OAuth credentials are no longer configured.`);
|
|
94
|
+
const tokens = await exchangeCode({
|
|
95
|
+
provider: pending.provider,
|
|
96
|
+
credentials,
|
|
97
|
+
redirectUri: pending.redirectUri,
|
|
98
|
+
code: params.code,
|
|
99
|
+
codeVerifier: pending.codeVerifier,
|
|
100
|
+
});
|
|
101
|
+
const email = await this.clients[pending.provider].getProfileEmail(tokens.accessToken);
|
|
102
|
+
if (!email)
|
|
103
|
+
throw new Error("Could not read the account email address from the provider.");
|
|
104
|
+
const account = this.upsertAccount(pending.userId, pending.provider, email);
|
|
105
|
+
this.storeTokens(account.id, pending.userId, tokens);
|
|
106
|
+
return account;
|
|
107
|
+
}
|
|
108
|
+
// ── Account persistence ────────────────────────────────────────────
|
|
109
|
+
listAccounts(userId) {
|
|
110
|
+
return this.db
|
|
111
|
+
.select()
|
|
112
|
+
.from(emailAccounts)
|
|
113
|
+
.where(userId ? eq(emailAccounts.userId, userId) : isNull(emailAccounts.userId))
|
|
114
|
+
.orderBy(desc(emailAccounts.updatedAt))
|
|
115
|
+
.all()
|
|
116
|
+
.map(rowToAccount);
|
|
117
|
+
}
|
|
118
|
+
getAccount(userId, accountId) {
|
|
119
|
+
const row = this.db
|
|
120
|
+
.select()
|
|
121
|
+
.from(emailAccounts)
|
|
122
|
+
.where(and(eq(emailAccounts.id, accountId), userId ? eq(emailAccounts.userId, userId) : isNull(emailAccounts.userId)))
|
|
123
|
+
.get();
|
|
124
|
+
return row ? rowToAccount(row) : null;
|
|
125
|
+
}
|
|
126
|
+
/** Resolve an account by id, or fall back to the user's first account. */
|
|
127
|
+
resolveAccount(userId, accountId) {
|
|
128
|
+
if (accountId) {
|
|
129
|
+
const acct = this.getAccount(userId, accountId);
|
|
130
|
+
if (!acct)
|
|
131
|
+
throw new Error(`Email account ${accountId} not found.`);
|
|
132
|
+
return acct;
|
|
133
|
+
}
|
|
134
|
+
const accounts = this.listAccounts(userId);
|
|
135
|
+
const first = accounts[0];
|
|
136
|
+
if (!first)
|
|
137
|
+
throw new Error("No email account connected. Connect Gmail or Outlook first.");
|
|
138
|
+
return first;
|
|
139
|
+
}
|
|
140
|
+
disconnect(userId, accountId) {
|
|
141
|
+
const acct = this.getAccount(userId, accountId);
|
|
142
|
+
if (!acct)
|
|
143
|
+
return false;
|
|
144
|
+
this.db.delete(emailAccounts).where(eq(emailAccounts.id, accountId)).run();
|
|
145
|
+
const secretId = this.findTokenSecretId(userId, accountId);
|
|
146
|
+
if (secretId)
|
|
147
|
+
this.secrets.delete(secretId, userId);
|
|
148
|
+
return true;
|
|
149
|
+
}
|
|
150
|
+
upsertAccount(userId, provider, email) {
|
|
151
|
+
const now = new Date().toISOString();
|
|
152
|
+
const existing = this.db
|
|
153
|
+
.select()
|
|
154
|
+
.from(emailAccounts)
|
|
155
|
+
.where(and(userId ? eq(emailAccounts.userId, userId) : isNull(emailAccounts.userId), eq(emailAccounts.provider, provider), eq(emailAccounts.email, email)))
|
|
156
|
+
.get();
|
|
157
|
+
if (existing) {
|
|
158
|
+
this.db
|
|
159
|
+
.update(emailAccounts)
|
|
160
|
+
.set({ status: "connected", error: null, updatedAt: now })
|
|
161
|
+
.where(eq(emailAccounts.id, existing.id))
|
|
162
|
+
.run();
|
|
163
|
+
return rowToAccount({ ...existing, status: "connected", error: null, updatedAt: now });
|
|
164
|
+
}
|
|
165
|
+
const id = uuidv7();
|
|
166
|
+
const row = {
|
|
167
|
+
id,
|
|
168
|
+
userId: userId ?? null,
|
|
169
|
+
provider,
|
|
170
|
+
email,
|
|
171
|
+
displayName: email,
|
|
172
|
+
status: "connected",
|
|
173
|
+
error: null,
|
|
174
|
+
createdAt: now,
|
|
175
|
+
updatedAt: now,
|
|
176
|
+
};
|
|
177
|
+
this.db.insert(emailAccounts).values(row).run();
|
|
178
|
+
return rowToAccount(row);
|
|
179
|
+
}
|
|
180
|
+
// ── Token storage / refresh ────────────────────────────────────────
|
|
181
|
+
storeTokens(accountId, userId, tokens) {
|
|
182
|
+
this.secrets.save({
|
|
183
|
+
userId,
|
|
184
|
+
type: TOKEN_SECRET_TYPE,
|
|
185
|
+
key: accountId,
|
|
186
|
+
label: `Email tokens (${accountId})`,
|
|
187
|
+
value: JSON.stringify(tokens),
|
|
188
|
+
});
|
|
189
|
+
}
|
|
190
|
+
loadTokens(accountId, userId) {
|
|
191
|
+
const raw = this.secrets.getValue(userId, TOKEN_SECRET_TYPE, accountId);
|
|
192
|
+
if (!raw)
|
|
193
|
+
return null;
|
|
194
|
+
try {
|
|
195
|
+
return JSON.parse(raw);
|
|
196
|
+
}
|
|
197
|
+
catch {
|
|
198
|
+
return null;
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
findTokenSecretId(userId, accountId) {
|
|
202
|
+
const list = this.secrets.list(userId, TOKEN_SECRET_TYPE);
|
|
203
|
+
return list.find((s) => s.key === accountId)?.id ?? null;
|
|
204
|
+
}
|
|
205
|
+
async validAccessToken(account) {
|
|
206
|
+
const tokens = this.loadTokens(account.id, account.userId);
|
|
207
|
+
if (!tokens)
|
|
208
|
+
throw new Error("No stored credentials for this account. Reconnect it.");
|
|
209
|
+
if (tokens.expiresAt - Date.now() > 60_000)
|
|
210
|
+
return tokens.accessToken;
|
|
211
|
+
if (!tokens.refreshToken)
|
|
212
|
+
throw new Error("Access token expired and no refresh token is available. Reconnect.");
|
|
213
|
+
const credentials = this.resolveCredentials(account.provider, account.userId);
|
|
214
|
+
if (!credentials)
|
|
215
|
+
throw new Error(`${account.provider} OAuth credentials are not configured.`);
|
|
216
|
+
const refreshed = await refreshTokens({
|
|
217
|
+
provider: account.provider,
|
|
218
|
+
credentials,
|
|
219
|
+
refreshToken: tokens.refreshToken,
|
|
220
|
+
});
|
|
221
|
+
this.storeTokens(account.id, account.userId, refreshed);
|
|
222
|
+
return refreshed.accessToken;
|
|
223
|
+
}
|
|
224
|
+
// ── Provider-agnostic operations ───────────────────────────────────
|
|
225
|
+
async listMessages(userId, accountId, opts) {
|
|
226
|
+
const account = this.resolveAccount(userId, accountId);
|
|
227
|
+
const token = await this.validAccessToken(account);
|
|
228
|
+
const messages = await this.clients[account.provider].listMessages(token, opts);
|
|
229
|
+
return { account, messages };
|
|
230
|
+
}
|
|
231
|
+
async getMessage(userId, accountId, id) {
|
|
232
|
+
const account = this.resolveAccount(userId, accountId);
|
|
233
|
+
const token = await this.validAccessToken(account);
|
|
234
|
+
return this.clients[account.provider].getMessage(token, id);
|
|
235
|
+
}
|
|
236
|
+
async sendMessage(userId, accountId, input) {
|
|
237
|
+
const account = this.resolveAccount(userId, accountId);
|
|
238
|
+
const token = await this.validAccessToken(account);
|
|
239
|
+
return this.clients[account.provider].sendMessage(token, input);
|
|
240
|
+
}
|
|
241
|
+
async tagMessage(userId, accountId, id, add, remove) {
|
|
242
|
+
const account = this.resolveAccount(userId, accountId);
|
|
243
|
+
const token = await this.validAccessToken(account);
|
|
244
|
+
await this.clients[account.provider].tagMessage(token, id, add, remove);
|
|
245
|
+
}
|
|
246
|
+
async deleteMessage(userId, accountId, id) {
|
|
247
|
+
const account = this.resolveAccount(userId, accountId);
|
|
248
|
+
const token = await this.validAccessToken(account);
|
|
249
|
+
await this.clients[account.provider].deleteMessage(token, id);
|
|
250
|
+
}
|
|
251
|
+
async listFolders(userId, accountId) {
|
|
252
|
+
const account = this.resolveAccount(userId, accountId);
|
|
253
|
+
const token = await this.validAccessToken(account);
|
|
254
|
+
return this.clients[account.provider].listFolders(token);
|
|
255
|
+
}
|
|
256
|
+
gcPending() {
|
|
257
|
+
const cutoff = Date.now() - 10 * 60_000;
|
|
258
|
+
for (const [state, p] of this.pending) {
|
|
259
|
+
if (p.createdAt < cutoff)
|
|
260
|
+
this.pending.delete(state);
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
function rowToAccount(row) {
|
|
265
|
+
return {
|
|
266
|
+
id: row.id,
|
|
267
|
+
userId: row.userId,
|
|
268
|
+
provider: row.provider,
|
|
269
|
+
email: row.email,
|
|
270
|
+
displayName: row.displayName,
|
|
271
|
+
status: row.status,
|
|
272
|
+
error: row.error,
|
|
273
|
+
createdAt: row.createdAt,
|
|
274
|
+
updatedAt: row.updatedAt,
|
|
275
|
+
};
|
|
276
|
+
}
|
|
277
|
+
//# sourceMappingURL=service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service.js","sourceRoot":"","sources":["../../../src/services/email/service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
export type EmailProvider = "gmail" | "outlook";
|
|
2
|
+
/** Public metadata about a connected mailbox (no tokens). */
|
|
3
|
+
export interface EmailAccount {
|
|
4
|
+
id: string;
|
|
5
|
+
userId: string | null;
|
|
6
|
+
provider: EmailProvider;
|
|
7
|
+
email: string;
|
|
8
|
+
displayName: string;
|
|
9
|
+
status: "connected" | "error";
|
|
10
|
+
error?: string | null;
|
|
11
|
+
createdAt: string;
|
|
12
|
+
updatedAt: string;
|
|
13
|
+
}
|
|
14
|
+
/** OAuth token bundle persisted (encrypted) in the user-secret store. */
|
|
15
|
+
export interface EmailTokens {
|
|
16
|
+
accessToken: string;
|
|
17
|
+
refreshToken: string | null;
|
|
18
|
+
/** Epoch milliseconds when the access token expires. */
|
|
19
|
+
expiresAt: number;
|
|
20
|
+
scope?: string;
|
|
21
|
+
}
|
|
22
|
+
/** A lightweight message summary for list views. */
|
|
23
|
+
export interface EmailMessageSummary {
|
|
24
|
+
id: string;
|
|
25
|
+
threadId?: string;
|
|
26
|
+
from: string;
|
|
27
|
+
to: string;
|
|
28
|
+
subject: string;
|
|
29
|
+
snippet: string;
|
|
30
|
+
date: string;
|
|
31
|
+
unread: boolean;
|
|
32
|
+
/** Provider label / category names attached to the message. */
|
|
33
|
+
labels: string[];
|
|
34
|
+
hasAttachments: boolean;
|
|
35
|
+
}
|
|
36
|
+
/** A fully-hydrated message including its body. */
|
|
37
|
+
export interface EmailMessageFull extends EmailMessageSummary {
|
|
38
|
+
cc: string;
|
|
39
|
+
bodyText: string;
|
|
40
|
+
bodyHtml: string;
|
|
41
|
+
}
|
|
42
|
+
/** A mailbox folder / label the user can filter by. */
|
|
43
|
+
export interface EmailFolder {
|
|
44
|
+
id: string;
|
|
45
|
+
name: string;
|
|
46
|
+
unreadCount?: number;
|
|
47
|
+
}
|
|
48
|
+
export interface ListMessagesOptions {
|
|
49
|
+
folder?: string;
|
|
50
|
+
query?: string;
|
|
51
|
+
limit?: number;
|
|
52
|
+
}
|
|
53
|
+
export interface SendMessageInput {
|
|
54
|
+
to: string;
|
|
55
|
+
subject: string;
|
|
56
|
+
body: string;
|
|
57
|
+
cc?: string;
|
|
58
|
+
bcc?: string;
|
|
59
|
+
/** When set, send as a reply within this message's thread. */
|
|
60
|
+
replyToMessageId?: string;
|
|
61
|
+
/** Send the body as HTML instead of plain text. */
|
|
62
|
+
html?: boolean;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Provider-specific mailbox client. The {@link EmailService} owns token
|
|
66
|
+
* refresh and hands a valid access token to these stateless operations.
|
|
67
|
+
*/
|
|
68
|
+
export interface MailboxClient {
|
|
69
|
+
listMessages(accessToken: string, opts: ListMessagesOptions): Promise<EmailMessageSummary[]>;
|
|
70
|
+
getMessage(accessToken: string, id: string): Promise<EmailMessageFull>;
|
|
71
|
+
sendMessage(accessToken: string, input: SendMessageInput): Promise<{
|
|
72
|
+
id: string;
|
|
73
|
+
}>;
|
|
74
|
+
/** Add/remove a label (Gmail) or category (Outlook) by human name. */
|
|
75
|
+
tagMessage(accessToken: string, id: string, add: string[], remove: string[]): Promise<void>;
|
|
76
|
+
/** Move a message to trash / deleted items. */
|
|
77
|
+
deleteMessage(accessToken: string, id: string): Promise<void>;
|
|
78
|
+
listFolders(accessToken: string): Promise<EmailFolder[]>;
|
|
79
|
+
/** Resolve the authenticated account's primary email address. */
|
|
80
|
+
getProfileEmail(accessToken: string): Promise<string>;
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/services/email/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/services/email/types.ts"],"names":[],"mappings":"AAAA,4EAA4E"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import type { EmailService } from "../services/email/index.js";
|
|
2
|
+
import type { WsControlPlane } from "../ws.js";
|
|
3
|
+
import type { ToolDefinition } from "./contracts.js";
|
|
4
|
+
interface ListInput {
|
|
5
|
+
accountId?: string;
|
|
6
|
+
folder?: string;
|
|
7
|
+
query?: string;
|
|
8
|
+
limit?: number;
|
|
9
|
+
}
|
|
10
|
+
export declare function createEmailListTool(email: EmailService): ToolDefinition<ListInput>;
|
|
11
|
+
interface ReadInput {
|
|
12
|
+
id: string;
|
|
13
|
+
accountId?: string;
|
|
14
|
+
}
|
|
15
|
+
export declare function createEmailReadTool(email: EmailService): ToolDefinition<ReadInput>;
|
|
16
|
+
interface SendInput {
|
|
17
|
+
to?: string;
|
|
18
|
+
subject?: string;
|
|
19
|
+
body: string;
|
|
20
|
+
cc?: string;
|
|
21
|
+
bcc?: string;
|
|
22
|
+
replyToMessageId?: string;
|
|
23
|
+
html?: boolean;
|
|
24
|
+
accountId?: string;
|
|
25
|
+
}
|
|
26
|
+
export declare function createEmailSendTool(email: EmailService, ws?: WsControlPlane): ToolDefinition<SendInput>;
|
|
27
|
+
interface TagInput {
|
|
28
|
+
id: string;
|
|
29
|
+
add?: string[];
|
|
30
|
+
remove?: string[];
|
|
31
|
+
accountId?: string;
|
|
32
|
+
}
|
|
33
|
+
export declare function createEmailTagTool(email: EmailService, ws?: WsControlPlane): ToolDefinition<TagInput>;
|
|
34
|
+
interface DeleteInput {
|
|
35
|
+
id: string;
|
|
36
|
+
accountId?: string;
|
|
37
|
+
}
|
|
38
|
+
export declare function createEmailDeleteTool(email: EmailService, ws?: WsControlPlane): ToolDefinition<DeleteInput>;
|
|
39
|
+
interface ViewInput {
|
|
40
|
+
action: "navigate" | "open" | "compose" | "refresh";
|
|
41
|
+
accountId?: string;
|
|
42
|
+
folder?: string;
|
|
43
|
+
messageId?: string;
|
|
44
|
+
to?: string;
|
|
45
|
+
subject?: string;
|
|
46
|
+
body?: string;
|
|
47
|
+
replyToMessageId?: string;
|
|
48
|
+
}
|
|
49
|
+
export declare function createEmailViewTool(ws: WsControlPlane): ToolDefinition<ViewInput>;
|
|
50
|
+
export declare function createEmailTools(email: EmailService, ws?: WsControlPlane): ToolDefinition[];
|
|
51
|
+
export {};
|
|
52
|
+
//# sourceMappingURL=email-tools.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"email-tools.d.ts","sourceRoot":"","sources":["../../src/tools/email-tools.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC/D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAC/C,OAAO,KAAK,EAAe,cAAc,EAAc,MAAM,gBAAgB,CAAC;AAkB9E,UAAU,SAAS;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,YAAY,GAAG,cAAc,CAAC,SAAS,CAAC,CAqClF;AAED,UAAU,SAAS;IACjB,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,YAAY,GAAG,cAAc,CAAC,SAAS,CAAC,CA8BlF;AAED,UAAU,SAAS;IACjB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,YAAY,EAAE,EAAE,CAAC,EAAE,cAAc,GAAG,cAAc,CAAC,SAAS,CAAC,CA0CvG;AAED,UAAU,QAAQ;IAChB,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,YAAY,EAAE,EAAE,CAAC,EAAE,cAAc,GAAG,cAAc,CAAC,QAAQ,CAAC,CA8BrG;AAED,UAAU,WAAW;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,YAAY,EAAE,EAAE,CAAC,EAAE,cAAc,GAAG,cAAc,CAAC,WAAW,CAAC,CA0B3G;AAED,UAAU,SAAS;IACjB,MAAM,EAAE,UAAU,GAAG,MAAM,GAAG,SAAS,GAAG,SAAS,CAAC;IACpD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,wBAAgB,mBAAmB,CAAC,EAAE,EAAE,cAAc,GAAG,cAAc,CAAC,SAAS,CAAC,CA2CjF;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,YAAY,EAAE,EAAE,CAAC,EAAE,cAAc,GAAG,cAAc,EAAE,CAU3F"}
|