@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.
Files changed (122) hide show
  1. package/dist/db/migrations.d.ts.map +1 -1
  2. package/dist/db/migrations.js +22 -0
  3. package/dist/db/migrations.js.map +1 -1
  4. package/dist/db/schema.d.ts +178 -0
  5. package/dist/db/schema.d.ts.map +1 -1
  6. package/dist/db/schema.js +15 -0
  7. package/dist/db/schema.js.map +1 -1
  8. package/dist/index.d.ts.map +1 -1
  9. package/dist/index.js +5 -0
  10. package/dist/index.js.map +1 -1
  11. package/dist/routes/chat.d.ts.map +1 -1
  12. package/dist/routes/chat.js +77 -7
  13. package/dist/routes/chat.js.map +1 -1
  14. package/dist/routes/email.d.ts +5 -0
  15. package/dist/routes/email.d.ts.map +1 -0
  16. package/dist/routes/email.js +202 -0
  17. package/dist/routes/email.js.map +1 -0
  18. package/dist/security/tool-profiles.d.ts.map +1 -1
  19. package/dist/security/tool-profiles.js +3 -0
  20. package/dist/security/tool-profiles.js.map +1 -1
  21. package/dist/server.d.ts +1 -0
  22. package/dist/server.d.ts.map +1 -1
  23. package/dist/server.js +4 -0
  24. package/dist/server.js.map +1 -1
  25. package/dist/services/email/gmail.d.ts +16 -0
  26. package/dist/services/email/gmail.d.ts.map +1 -0
  27. package/dist/services/email/gmail.js +170 -0
  28. package/dist/services/email/gmail.js.map +1 -0
  29. package/dist/services/email/index.d.ts +3 -0
  30. package/dist/services/email/index.d.ts.map +1 -0
  31. package/dist/services/email/index.js +2 -0
  32. package/dist/services/email/index.js.map +1 -0
  33. package/dist/services/email/oauth.d.ts +32 -0
  34. package/dist/services/email/oauth.d.ts.map +1 -0
  35. package/dist/services/email/oauth.js +105 -0
  36. package/dist/services/email/oauth.js.map +1 -0
  37. package/dist/services/email/outlook.d.ts +15 -0
  38. package/dist/services/email/outlook.d.ts.map +1 -0
  39. package/dist/services/email/outlook.js +142 -0
  40. package/dist/services/email/outlook.js.map +1 -0
  41. package/dist/services/email/service.d.ts +50 -0
  42. package/dist/services/email/service.d.ts.map +1 -0
  43. package/dist/services/email/service.js +277 -0
  44. package/dist/services/email/service.js.map +1 -0
  45. package/dist/services/email/types.d.ts +82 -0
  46. package/dist/services/email/types.d.ts.map +1 -0
  47. package/dist/services/email/types.js +3 -0
  48. package/dist/services/email/types.js.map +1 -0
  49. package/dist/tools/email-tools.d.ts +52 -0
  50. package/dist/tools/email-tools.d.ts.map +1 -0
  51. package/dist/tools/email-tools.js +237 -0
  52. package/dist/tools/email-tools.js.map +1 -0
  53. package/dist/tools/index.d.ts +3 -1
  54. package/dist/tools/index.d.ts.map +1 -1
  55. package/dist/tools/index.js +16 -2
  56. package/dist/tools/index.js.map +1 -1
  57. package/dist/tools/project-tools.d.ts +6 -0
  58. package/dist/tools/project-tools.d.ts.map +1 -1
  59. package/dist/tools/project-tools.js +82 -0
  60. package/dist/tools/project-tools.js.map +1 -1
  61. package/dist/tools/tool-names.d.ts +1 -0
  62. package/dist/tools/tool-names.d.ts.map +1 -1
  63. package/dist/tools/tool-names.js +1 -0
  64. package/dist/tools/tool-names.js.map +1 -1
  65. package/package.json +2 -2
  66. package/web-dist/assets/{_basePickBy-1ypMBiW_.js → _basePickBy-CzT63eI9.js} +1 -1
  67. package/web-dist/assets/{_baseUniq-DvjcbfPq.js → _baseUniq-C9jker1F.js} +1 -1
  68. package/web-dist/assets/{arc-ErevYm19.js → arc-DljFfWWm.js} +1 -1
  69. package/web-dist/assets/{architectureDiagram-2XIMDMQ5-D_WVp0kY.js → architectureDiagram-2XIMDMQ5-pEbMBiw_.js} +1 -1
  70. package/web-dist/assets/{blockDiagram-WCTKOSBZ-Bo6-xom-.js → blockDiagram-WCTKOSBZ-A_4J6Sb-.js} +1 -1
  71. package/web-dist/assets/{c4Diagram-IC4MRINW-D9M8EKu_.js → c4Diagram-IC4MRINW-COgCzBlY.js} +1 -1
  72. package/web-dist/assets/channel-xM6w002v.js +1 -0
  73. package/web-dist/assets/{chunk-4BX2VUAB-WH1KAVAb.js → chunk-4BX2VUAB-Bfy5mnZM.js} +1 -1
  74. package/web-dist/assets/{chunk-55IACEB6-D2a2qrrp.js → chunk-55IACEB6-BHbwUxN1.js} +1 -1
  75. package/web-dist/assets/{chunk-FMBD7UC4-28DcGMIY.js → chunk-FMBD7UC4-oWbyVk_l.js} +1 -1
  76. package/web-dist/assets/{chunk-JSJVCQXG-C1uNGWZs.js → chunk-JSJVCQXG-DICPKbbU.js} +1 -1
  77. package/web-dist/assets/{chunk-KX2RTZJC-V1qtcDEn.js → chunk-KX2RTZJC-S1AI6fsb.js} +1 -1
  78. package/web-dist/assets/{chunk-NQ4KR5QH-cug-v0rY.js → chunk-NQ4KR5QH-CC2BDuwQ.js} +1 -1
  79. package/web-dist/assets/{chunk-QZHKN3VN-CM17QePX.js → chunk-QZHKN3VN-BU0b1vSt.js} +1 -1
  80. package/web-dist/assets/{chunk-WL4C6EOR-DlYbqSTG.js → chunk-WL4C6EOR-BxRy9Kn0.js} +1 -1
  81. package/web-dist/assets/classDiagram-VBA2DB6C-BwiCmurD.js +1 -0
  82. package/web-dist/assets/classDiagram-v2-RAHNMMFH-BwiCmurD.js +1 -0
  83. package/web-dist/assets/clone-BXkaMZnK.js +1 -0
  84. package/web-dist/assets/{cose-bilkent-S5V4N54A-CVsGoDQL.js → cose-bilkent-S5V4N54A-C0lXwD6L.js} +1 -1
  85. package/web-dist/assets/{dagre-KLK3FWXG-DLQZVyW4.js → dagre-KLK3FWXG-DsCVwtnr.js} +1 -1
  86. package/web-dist/assets/{diagram-E7M64L7V-BF0y78lG.js → diagram-E7M64L7V-CRFZjLO4.js} +1 -1
  87. package/web-dist/assets/{diagram-IFDJBPK2-MuDqalfZ.js → diagram-IFDJBPK2-CxxDuheX.js} +1 -1
  88. package/web-dist/assets/{diagram-P4PSJMXO-e36wc7XG.js → diagram-P4PSJMXO-DdN9wKJP.js} +1 -1
  89. package/web-dist/assets/{erDiagram-INFDFZHY-B_i7tPHh.js → erDiagram-INFDFZHY-BxRMeXZf.js} +1 -1
  90. package/web-dist/assets/{flowDiagram-PKNHOUZH-fPB07Diy.js → flowDiagram-PKNHOUZH--76cPw_T.js} +1 -1
  91. package/web-dist/assets/{ganttDiagram-A5KZAMGK-q8EsM9Gb.js → ganttDiagram-A5KZAMGK-D81XRpy6.js} +1 -1
  92. package/web-dist/assets/{gitGraphDiagram-K3NZZRJ6-BiAyblPL.js → gitGraphDiagram-K3NZZRJ6-BWTqK6Hq.js} +1 -1
  93. package/web-dist/assets/{graph-DnNeq8po.js → graph-e1i_2mNj.js} +1 -1
  94. package/web-dist/assets/index-BU0ZMPd5.css +32 -0
  95. package/web-dist/assets/{index-Bk_qadgU.js → index-C_vS46mJ.js} +1 -1
  96. package/web-dist/assets/{index-BbmkMmHZ.js → index-_OeJ0-l0.js} +1 -1
  97. package/web-dist/assets/{index-CzRne9la.js → index-oEvNrdmq.js} +395 -373
  98. package/web-dist/assets/{infoDiagram-LFFYTUFH-C3TzSSln.js → infoDiagram-LFFYTUFH-BAvnH6OJ.js} +1 -1
  99. package/web-dist/assets/{ishikawaDiagram-PHBUUO56-szGd8_KC.js → ishikawaDiagram-PHBUUO56-DaNqVDUe.js} +1 -1
  100. package/web-dist/assets/{journeyDiagram-4ABVD52K-ByTvobTa.js → journeyDiagram-4ABVD52K-BjDRRfop.js} +1 -1
  101. package/web-dist/assets/{kanban-definition-K7BYSVSG-DoUUzwjw.js → kanban-definition-K7BYSVSG-Qw6LXlh0.js} +1 -1
  102. package/web-dist/assets/{layout-BzJ0RrG1.js → layout-BhFuErQG.js} +1 -1
  103. package/web-dist/assets/{linear-B5XYxmuh.js → linear-CVpOVEfb.js} +1 -1
  104. package/web-dist/assets/{mindmap-definition-YRQLILUH-FaHbvuby.js → mindmap-definition-YRQLILUH-HX2oEkzo.js} +1 -1
  105. package/web-dist/assets/{pieDiagram-SKSYHLDU-F0mNDNRX.js → pieDiagram-SKSYHLDU-eoDXKsir.js} +1 -1
  106. package/web-dist/assets/{quadrantDiagram-337W2JSQ-CSy2sGI7.js → quadrantDiagram-337W2JSQ-BMuqPJ4T.js} +1 -1
  107. package/web-dist/assets/{requirementDiagram-Z7DCOOCP-iXp1hJSy.js → requirementDiagram-Z7DCOOCP-DortKE8d.js} +1 -1
  108. package/web-dist/assets/{sankeyDiagram-WA2Y5GQK-BUFT8Ncy.js → sankeyDiagram-WA2Y5GQK-BdCE80-q.js} +1 -1
  109. package/web-dist/assets/{sequenceDiagram-2WXFIKYE-iWc1z5r5.js → sequenceDiagram-2WXFIKYE-CcYDmGFB.js} +1 -1
  110. package/web-dist/assets/{stateDiagram-RAJIS63D-Dmla9JkM.js → stateDiagram-RAJIS63D-CSTfSkb3.js} +1 -1
  111. package/web-dist/assets/stateDiagram-v2-FVOUBMTO-DBn-vddG.js +1 -0
  112. package/web-dist/assets/{timeline-definition-YZTLITO2-4XUMaeyN.js → timeline-definition-YZTLITO2-CluVwYjy.js} +1 -1
  113. package/web-dist/assets/{treemap-KZPCXAKY-BiXISVos.js → treemap-KZPCXAKY-Ds4wGITO.js} +1 -1
  114. package/web-dist/assets/{vennDiagram-LZ73GAT5-BHzH1mWp.js → vennDiagram-LZ73GAT5-DDk9o8W5.js} +1 -1
  115. package/web-dist/assets/{xychartDiagram-JWTSCODW-C1rAefFy.js → xychartDiagram-JWTSCODW-BWpgTsfS.js} +1 -1
  116. package/web-dist/index.html +2 -2
  117. package/web-dist/assets/channel-CzVoFm04.js +0 -1
  118. package/web-dist/assets/classDiagram-VBA2DB6C-CkMkzWkJ.js +0 -1
  119. package/web-dist/assets/classDiagram-v2-RAHNMMFH-CkMkzWkJ.js +0 -1
  120. package/web-dist/assets/clone-BrtlKZXp.js +0 -1
  121. package/web-dist/assets/index-C-Ol-PwZ.css +0 -32
  122. 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,3 @@
1
+ // Shared types for the email integration (Gmail + Outlook/Microsoft Graph).
2
+ export {};
3
+ //# sourceMappingURL=types.js.map
@@ -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"}