fluxmail 0.20.0 → 0.21.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/dist/accounts/oauthCallback.d.ts +6 -3
- package/dist/accounts/oauthCallback.d.ts.map +1 -1
- package/dist/accounts/oauthCallback.js +8 -6
- package/dist/accounts/oauthCallback.js.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +93 -10
- package/dist/cli.js.map +1 -1
- package/dist/cliCloudAuth.d.ts +48 -0
- package/dist/cliCloudAuth.d.ts.map +1 -0
- package/dist/cliCloudAuth.js +254 -0
- package/dist/cliCloudAuth.js.map +1 -0
- package/dist/cliCloudClient.d.ts +29 -0
- package/dist/cliCloudClient.d.ts.map +1 -0
- package/dist/cliCloudClient.js +154 -0
- package/dist/cliCloudClient.js.map +1 -0
- package/dist/cliInstances.d.ts +39 -4
- package/dist/cliInstances.d.ts.map +1 -1
- package/dist/cliInstances.js +76 -8
- package/dist/cliInstances.js.map +1 -1
- package/dist/cliMail.d.ts.map +1 -1
- package/dist/cliMail.js +54 -143
- package/dist/cliMail.js.map +1 -1
- package/dist/cliMailBackend.d.ts +125 -0
- package/dist/cliMailBackend.d.ts.map +1 -0
- package/dist/cliMailBackend.js +354 -0
- package/dist/cliMailBackend.js.map +1 -0
- package/dist/cliOutput.d.ts.map +1 -1
- package/dist/cliOutput.js +19 -2
- package/dist/cliOutput.js.map +1 -1
- package/dist/feedback.d.ts +13 -29
- package/dist/feedback.d.ts.map +1 -1
- package/dist/feedback.js +2 -1
- package/dist/feedback.js.map +1 -1
- package/dist/http/admin.d.ts.map +1 -1
- package/dist/http/admin.js +4 -2
- package/dist/http/admin.js.map +1 -1
- package/dist/http/rest.d.ts.map +1 -1
- package/dist/http/rest.js +13 -6
- package/dist/http/rest.js.map +1 -1
- package/dist/mcp/attachmentContent.d.ts +1 -1
- package/dist/mcp/attachmentContent.d.ts.map +1 -1
- package/dist/mcp/buildServer.d.ts.map +1 -1
- package/dist/mcp/buildServer.js +37 -9
- package/dist/mcp/buildServer.js.map +1 -1
- package/dist/mcp/outputSchemas.d.ts +189 -3100
- package/dist/mcp/outputSchemas.d.ts.map +1 -1
- package/dist/sendAt.d.ts +4 -0
- package/dist/sendAt.d.ts.map +1 -0
- package/dist/sendAt.js +10 -0
- package/dist/sendAt.js.map +1 -0
- package/dist/service/emailService.d.ts.map +1 -1
- package/dist/service/emailService.js +20 -1
- package/dist/service/emailService.js.map +1 -1
- package/dist/storage/fileLock.d.ts +2 -0
- package/dist/storage/fileLock.d.ts.map +1 -1
- package/dist/storage/fileLock.js +25 -4
- package/dist/storage/fileLock.js.map +1 -1
- package/dist/telemetry.d.ts +5 -0
- package/dist/telemetry.d.ts.map +1 -1
- package/dist/telemetry.js +17 -2
- package/dist/telemetry.js.map +1 -1
- package/package.json +8 -9
|
@@ -0,0 +1,254 @@
|
|
|
1
|
+
import { execFile } from 'node:child_process';
|
|
2
|
+
import { randomBytes } from 'node:crypto';
|
|
3
|
+
import { createServer } from 'node:net';
|
|
4
|
+
import { EmailError } from '@fluxmail/core';
|
|
5
|
+
import { MAIL_SCOPES, PERMISSION_PRESETS } from '@fluxmail/core/mcp';
|
|
6
|
+
import { runOAuthCallbackFlow } from './accounts/oauthCallback.js';
|
|
7
|
+
import { clearCloudSession, CLOUD_SESSION_LOCK, cloudSessionLockPath, currentRequestDeadlineMs, InstanceApiError, loadCloudSession, requestTimeoutError, saveCloudInstance, saveCloudSession, } from './cliInstances.js';
|
|
8
|
+
import { DEFAULT_FEEDBACK_CLOUD_ORIGIN } from './feedback.js';
|
|
9
|
+
import { withAsyncFileLock } from './storage/fileLock.js';
|
|
10
|
+
export const DEFAULT_CLOUD_ORIGIN = DEFAULT_FEEDBACK_CLOUD_ORIGIN;
|
|
11
|
+
/** Refresh a little early so a token can't expire while a request is in flight. */
|
|
12
|
+
const ACCESS_TOKEN_MARGIN_MS = 30_000;
|
|
13
|
+
const DEFAULT_ACCESS_TOKEN_LIFETIME_MS = 15 * 60 * 1000;
|
|
14
|
+
export function cloudMcpUrl(serverUrl) {
|
|
15
|
+
return `${serverUrl}/mcp`;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Every Cloud request goes through here. Credentials stay on the profile's
|
|
19
|
+
* origin and never follow a redirect, including OAuth endpoints a server names
|
|
20
|
+
* in its metadata.
|
|
21
|
+
*/
|
|
22
|
+
export function cloudFetch(serverUrl) {
|
|
23
|
+
const { origin } = new URL(serverUrl);
|
|
24
|
+
return async (input, init) => {
|
|
25
|
+
const url = new URL(input instanceof Request ? input.url : input);
|
|
26
|
+
if (url.origin !== origin) {
|
|
27
|
+
throw new EmailError('permission_denied', 'Fluxmail Cloud named another server. Refusing to contact it.');
|
|
28
|
+
}
|
|
29
|
+
const deadline = AbortSignal.timeout(currentRequestDeadlineMs());
|
|
30
|
+
const signal = init?.signal ? AbortSignal.any([init.signal, deadline]) : deadline;
|
|
31
|
+
let response;
|
|
32
|
+
try {
|
|
33
|
+
response = await fetch(input, { ...init, signal, redirect: 'manual' });
|
|
34
|
+
}
|
|
35
|
+
catch (error) {
|
|
36
|
+
if (deadline.aborted)
|
|
37
|
+
throw requestTimeoutError();
|
|
38
|
+
if (init?.signal?.aborted)
|
|
39
|
+
throw error;
|
|
40
|
+
throw new InstanceApiError('request_failed', `Could not reach Fluxmail Cloud at ${origin}.`, 0);
|
|
41
|
+
}
|
|
42
|
+
if (response.status >= 300 && response.status < 400) {
|
|
43
|
+
throw new EmailError('permission_denied', 'Fluxmail Cloud redirected an authenticated request. Refusing to forward credentials.');
|
|
44
|
+
}
|
|
45
|
+
return response;
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
function sessionEndedError(instance) {
|
|
49
|
+
return new EmailError('permission_denied', `The Fluxmail Cloud session for "${instance}" has ended. Run "fluxmail --instance ${instance} login".`);
|
|
50
|
+
}
|
|
51
|
+
export function apiKeyRejectedError(instance) {
|
|
52
|
+
return new EmailError('permission_denied', `Fluxmail Cloud rejected the API key for "${instance}". Run "fluxmail --instance ${instance} login --api-key" with an active key.`);
|
|
53
|
+
}
|
|
54
|
+
function missingSessionError(instance) {
|
|
55
|
+
return new EmailError('permission_denied', `Log in to instance "${instance}" first.`);
|
|
56
|
+
}
|
|
57
|
+
async function discover(serverUrl) {
|
|
58
|
+
const sdk = await import('@modelcontextprotocol/client');
|
|
59
|
+
const fetchFn = cloudFetch(serverUrl);
|
|
60
|
+
const { authorizationServerUrl, authorizationServerMetadata: metadata } = await sdk.discoverOAuthServerInfo(cloudMcpUrl(serverUrl), { fetchFn });
|
|
61
|
+
return { sdk, fetchFn, authorizationServerUrl, metadata };
|
|
62
|
+
}
|
|
63
|
+
function oauthSession(serverUrl, clientId, tokens, previous) {
|
|
64
|
+
const refreshToken = tokens.refresh_token ?? previous?.refreshToken;
|
|
65
|
+
if (!refreshToken) {
|
|
66
|
+
throw new EmailError('invalid_request', 'Fluxmail Cloud did not issue a refresh token. Try logging in again.');
|
|
67
|
+
}
|
|
68
|
+
return {
|
|
69
|
+
kind: 'oauth',
|
|
70
|
+
serverUrl,
|
|
71
|
+
clientId,
|
|
72
|
+
accessToken: tokens.access_token,
|
|
73
|
+
refreshToken,
|
|
74
|
+
expiresAt: Date.now() + (tokens.expires_in ? tokens.expires_in * 1000 : DEFAULT_ACCESS_TOKEN_LIFETIME_MS),
|
|
75
|
+
...(tokens.scope ? { scope: tokens.scope } : {}),
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
function usable(session, rejected) {
|
|
79
|
+
return session.accessToken !== rejected && session.expiresAt - Date.now() > ACCESS_TOKEN_MARGIN_MS;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* The bearer token for this instance. `rejected` names a token Cloud just
|
|
83
|
+
* refused. Parallel CLI processes share one refresh token, and Cloud treats a
|
|
84
|
+
* second use as replay and revokes the connection, so the refresh happens under
|
|
85
|
+
* a lock with the session read again inside it.
|
|
86
|
+
*/
|
|
87
|
+
export async function cloudAccessToken(instance, serverUrl, rejected) {
|
|
88
|
+
// A session from another origin belongs to a login that hasn't finished moving the profile.
|
|
89
|
+
const session = loadCloudSession(instance);
|
|
90
|
+
if (session?.serverUrl !== serverUrl)
|
|
91
|
+
throw missingSessionError(instance);
|
|
92
|
+
if (session.kind === 'key') {
|
|
93
|
+
if (session.key === rejected)
|
|
94
|
+
throw apiKeyRejectedError(instance);
|
|
95
|
+
return session.key;
|
|
96
|
+
}
|
|
97
|
+
if (usable(session, rejected))
|
|
98
|
+
return session.accessToken;
|
|
99
|
+
return withAsyncFileLock(cloudSessionLockPath(), CLOUD_SESSION_LOCK, async () => {
|
|
100
|
+
const current = loadCloudSession(instance);
|
|
101
|
+
if (current?.kind !== 'oauth' || current.serverUrl !== serverUrl)
|
|
102
|
+
throw missingSessionError(instance);
|
|
103
|
+
if (usable(current, rejected))
|
|
104
|
+
return current.accessToken;
|
|
105
|
+
const { sdk, fetchFn, authorizationServerUrl, metadata } = await discover(serverUrl);
|
|
106
|
+
let tokens;
|
|
107
|
+
try {
|
|
108
|
+
tokens = await sdk.refreshAuthorization(authorizationServerUrl, {
|
|
109
|
+
metadata,
|
|
110
|
+
clientInformation: { client_id: current.clientId },
|
|
111
|
+
refreshToken: current.refreshToken,
|
|
112
|
+
resource: new URL(cloudMcpUrl(serverUrl)),
|
|
113
|
+
fetchFn,
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
catch (error) {
|
|
117
|
+
if (error instanceof sdk.OAuthError && ['invalid_grant', 'invalid_client'].includes(error.code)) {
|
|
118
|
+
throw sessionEndedError(instance);
|
|
119
|
+
}
|
|
120
|
+
throw error;
|
|
121
|
+
}
|
|
122
|
+
const next = oauthSession(serverUrl, current.clientId, tokens, current);
|
|
123
|
+
saveCloudSession(instance, next);
|
|
124
|
+
return tokens.access_token;
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
function freeLoopbackPort() {
|
|
128
|
+
return new Promise((resolve, reject) => {
|
|
129
|
+
const server = createServer();
|
|
130
|
+
server.once('error', reject);
|
|
131
|
+
server.listen(0, '127.0.0.1', () => {
|
|
132
|
+
const address = server.address();
|
|
133
|
+
server.close(() => {
|
|
134
|
+
if (address && typeof address === 'object')
|
|
135
|
+
resolve(address.port);
|
|
136
|
+
else
|
|
137
|
+
reject(new Error('Could not choose an OAuth callback port.'));
|
|
138
|
+
});
|
|
139
|
+
});
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Browser sign-in. Each login registers its own public client: Cloud deletes
|
|
144
|
+
* registered clients that have no tokens, so an ID kept across logins can go
|
|
145
|
+
* stale, and the failure would only show in the browser.
|
|
146
|
+
*/
|
|
147
|
+
export async function loginToCloud(options) {
|
|
148
|
+
const { instance, serverUrl, preset, onAuthUrl, flow } = options;
|
|
149
|
+
const { sdk, fetchFn, authorizationServerUrl, metadata } = await discover(serverUrl);
|
|
150
|
+
const resource = new URL(cloudMcpUrl(serverUrl));
|
|
151
|
+
const port = await freeLoopbackPort();
|
|
152
|
+
const redirectUri = `http://127.0.0.1:${port}/oauth/callback`;
|
|
153
|
+
const clientInformation = await sdk.registerClient(authorizationServerUrl, {
|
|
154
|
+
metadata,
|
|
155
|
+
fetchFn,
|
|
156
|
+
clientMetadata: {
|
|
157
|
+
client_name: 'Fluxmail CLI',
|
|
158
|
+
redirect_uris: [redirectUri],
|
|
159
|
+
grant_types: ['authorization_code', 'refresh_token'],
|
|
160
|
+
response_types: ['code'],
|
|
161
|
+
token_endpoint_auth_method: 'none',
|
|
162
|
+
// Registration caps what any login can later ask for; the authorization request narrows it.
|
|
163
|
+
scope: [...MAIL_SCOPES, 'offline_access'].join(' '),
|
|
164
|
+
},
|
|
165
|
+
});
|
|
166
|
+
const state = randomBytes(32).toString('base64url');
|
|
167
|
+
const { authorizationUrl, codeVerifier } = await sdk.startAuthorization(authorizationServerUrl, {
|
|
168
|
+
metadata,
|
|
169
|
+
clientInformation,
|
|
170
|
+
redirectUrl: redirectUri,
|
|
171
|
+
scope: [...PERMISSION_PRESETS[preset], 'offline_access'].join(' '),
|
|
172
|
+
state,
|
|
173
|
+
resource,
|
|
174
|
+
});
|
|
175
|
+
const tokens = await runOAuthCallbackFlow({
|
|
176
|
+
provider: 'cloud',
|
|
177
|
+
redirectUri,
|
|
178
|
+
host: '127.0.0.1',
|
|
179
|
+
port,
|
|
180
|
+
state,
|
|
181
|
+
authUrl: authorizationUrl.href,
|
|
182
|
+
onAuthUrl,
|
|
183
|
+
successTitle: () => 'Signed in to Fluxmail Cloud',
|
|
184
|
+
options: flow,
|
|
185
|
+
complete: async (code, callback) => ({
|
|
186
|
+
email: '',
|
|
187
|
+
value: await sdk.exchangeAuthorization(authorizationServerUrl, {
|
|
188
|
+
metadata,
|
|
189
|
+
clientInformation,
|
|
190
|
+
authorizationCode: code,
|
|
191
|
+
iss: callback.searchParams.get('iss') ?? undefined,
|
|
192
|
+
codeVerifier,
|
|
193
|
+
redirectUri,
|
|
194
|
+
resource,
|
|
195
|
+
fetchFn,
|
|
196
|
+
}),
|
|
197
|
+
}),
|
|
198
|
+
});
|
|
199
|
+
await replaceCloudSession(instance, oauthSession(serverUrl, clientInformation.client_id, tokens));
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* Stores a new login's session and points the profile at its origin. Both
|
|
203
|
+
* change under the refresh lock, so a refresh already in flight finishes first
|
|
204
|
+
* and can't overwrite the new session with the old one. Each approval is a
|
|
205
|
+
* separate connection, so the old one is then revoked at the server that
|
|
206
|
+
* issued it.
|
|
207
|
+
*/
|
|
208
|
+
export async function replaceCloudSession(instance, session) {
|
|
209
|
+
const previous = await withAsyncFileLock(cloudSessionLockPath(), CLOUD_SESSION_LOCK, async () => {
|
|
210
|
+
const current = loadCloudSession(instance);
|
|
211
|
+
saveCloudSession(instance, session);
|
|
212
|
+
saveCloudInstance(instance, session.serverUrl);
|
|
213
|
+
return current;
|
|
214
|
+
});
|
|
215
|
+
if (previous?.kind === 'oauth')
|
|
216
|
+
await revokeCloudSession(previous.serverUrl, previous).catch(() => false);
|
|
217
|
+
}
|
|
218
|
+
async function revokeCloudSession(serverUrl, session) {
|
|
219
|
+
const { fetchFn, metadata } = await discover(serverUrl);
|
|
220
|
+
const revocationEndpoint = metadata?.revocation_endpoint;
|
|
221
|
+
if (!revocationEndpoint)
|
|
222
|
+
return false;
|
|
223
|
+
const response = await fetchFn(revocationEndpoint, {
|
|
224
|
+
method: 'POST',
|
|
225
|
+
headers: { 'content-type': 'application/x-www-form-urlencoded' },
|
|
226
|
+
body: new URLSearchParams({
|
|
227
|
+
token: session.refreshToken,
|
|
228
|
+
token_type_hint: 'refresh_token',
|
|
229
|
+
client_id: session.clientId,
|
|
230
|
+
}),
|
|
231
|
+
});
|
|
232
|
+
return response.ok;
|
|
233
|
+
}
|
|
234
|
+
/** Forgets the local credentials even when Cloud can't be reached; reports whether the connection was revoked. */
|
|
235
|
+
export async function logoutOfCloud(instance) {
|
|
236
|
+
return withAsyncFileLock(cloudSessionLockPath(), CLOUD_SESSION_LOCK, async () => {
|
|
237
|
+
const session = loadCloudSession(instance);
|
|
238
|
+
if (!session)
|
|
239
|
+
throw missingSessionError(instance);
|
|
240
|
+
const revoked = session.kind === 'oauth' && (await revokeCloudSession(session.serverUrl, session).catch(() => false));
|
|
241
|
+
clearCloudSession(instance);
|
|
242
|
+
return { revoked };
|
|
243
|
+
});
|
|
244
|
+
}
|
|
245
|
+
/** Best effort: the sign-in URL is always printed too. */
|
|
246
|
+
export function openInBrowser(url) {
|
|
247
|
+
const [command, args] = process.platform === 'darwin'
|
|
248
|
+
? ['open', [url]]
|
|
249
|
+
: process.platform === 'win32'
|
|
250
|
+
? ['rundll32', ['url.dll,FileProtocolHandler', url]]
|
|
251
|
+
: ['xdg-open', [url]];
|
|
252
|
+
execFile(command, args, { timeout: 5_000 }, () => { }).unref();
|
|
253
|
+
}
|
|
254
|
+
//# sourceMappingURL=cliCloudAuth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cliCloudAuth.js","sourceRoot":"","sources":["../src/cliCloudAuth.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/** Calls Cloud's MCP endpoint, the only one that accepts both OAuth tokens and agent keys. */
|
|
2
|
+
export declare class CloudClient {
|
|
3
|
+
readonly instance: string;
|
|
4
|
+
readonly serverUrl: string;
|
|
5
|
+
private readonly apiKey?;
|
|
6
|
+
private connection?;
|
|
7
|
+
private lastToken?;
|
|
8
|
+
/** The SDK wraps what the transport throws, so the original error is kept for the caller. */
|
|
9
|
+
private transportFailure?;
|
|
10
|
+
/** `apiKey` checks a key before login stores it; otherwise the instance's stored session is used. */
|
|
11
|
+
constructor(instance: string, serverUrl: string, apiKey?: string | undefined);
|
|
12
|
+
private transportStep;
|
|
13
|
+
/** The error to report for a failed SDK call, when it isn't a tool or protocol error. */
|
|
14
|
+
private sdkFailure;
|
|
15
|
+
private fetch;
|
|
16
|
+
private request;
|
|
17
|
+
private connect;
|
|
18
|
+
/**
|
|
19
|
+
* `data` from the tool result. Partly failed modifies and sends that have a
|
|
20
|
+
* delivery operation are errors that still carry data, which callers inspect
|
|
21
|
+
* the same way as a REST response.
|
|
22
|
+
*/
|
|
23
|
+
callTool<T>(name: string, args?: Record<string, unknown>): Promise<T>;
|
|
24
|
+
readAttachment(accountId: string, messageId: string, attachmentId: string): Promise<{
|
|
25
|
+
content: Buffer;
|
|
26
|
+
mimeType?: string;
|
|
27
|
+
}>;
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=cliCloudClient.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cliCloudClient.d.ts","sourceRoot":"","sources":["../src/cliCloudClient.ts"],"names":[],"mappings":"AAmCA,8FAA8F;AAC9F,qBAAa,WAAW;IAQpB,QAAQ,CAAC,QAAQ,EAAE,MAAM;IACzB,QAAQ,CAAC,SAAS,EAAE,MAAM;IAC1B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC;IAT1B,OAAO,CAAC,UAAU,CAAC,CAAkB;IACrC,OAAO,CAAC,SAAS,CAAC,CAAS;IAC3B,6FAA6F;IAC7F,OAAO,CAAC,gBAAgB,CAAC,CAAQ;IAEjC,qGAAqG;gBAE1F,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACT,MAAM,CAAC,EAAE,MAAM,YAAA;YAGpB,aAAa;IAS3B,yFAAyF;IACzF,OAAO,CAAC,UAAU;IAOlB,OAAO,CAAC,KAAK,CAAsF;IAEnG,OAAO,CAAC,OAAO,CAgBb;IAEF,OAAO,CAAC,OAAO;IA2Bf;;;;OAIG;IACG,QAAQ,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GAAG,OAAO,CAAC,CAAC,CAAC;IAoCzE,cAAc,CAClB,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CA2BnD"}
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
import { EmailError } from '@fluxmail/core';
|
|
2
|
+
import { attachmentUri } from '@fluxmail/core/mcp';
|
|
3
|
+
import { apiKeyRejectedError, cloudAccessToken, cloudFetch, cloudMcpUrl } from './cliCloudAuth.js';
|
|
4
|
+
import { currentRequestDeadlineMs, InstanceApiError, instanceResponseError, requestTimeoutError, } from './cliInstances.js';
|
|
5
|
+
import { VERSION } from './version.js';
|
|
6
|
+
const INVALID_PARAMS = -32602;
|
|
7
|
+
const SDK_REQUEST_TIMEOUT = 'REQUEST_TIMEOUT';
|
|
8
|
+
function parseJson(text) {
|
|
9
|
+
try {
|
|
10
|
+
return JSON.parse(text);
|
|
11
|
+
}
|
|
12
|
+
catch {
|
|
13
|
+
return undefined;
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
/** Calls Cloud's MCP endpoint, the only one that accepts both OAuth tokens and agent keys. */
|
|
17
|
+
export class CloudClient {
|
|
18
|
+
instance;
|
|
19
|
+
serverUrl;
|
|
20
|
+
apiKey;
|
|
21
|
+
connection;
|
|
22
|
+
lastToken;
|
|
23
|
+
/** The SDK wraps what the transport throws, so the original error is kept for the caller. */
|
|
24
|
+
transportFailure;
|
|
25
|
+
/** `apiKey` checks a key before login stores it; otherwise the instance's stored session is used. */
|
|
26
|
+
constructor(instance, serverUrl, apiKey) {
|
|
27
|
+
this.instance = instance;
|
|
28
|
+
this.serverUrl = serverUrl;
|
|
29
|
+
this.apiKey = apiKey;
|
|
30
|
+
}
|
|
31
|
+
async transportStep(step) {
|
|
32
|
+
try {
|
|
33
|
+
return await step();
|
|
34
|
+
}
|
|
35
|
+
catch (error) {
|
|
36
|
+
if (error instanceof EmailError || error instanceof InstanceApiError)
|
|
37
|
+
this.transportFailure = error;
|
|
38
|
+
throw error;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
/** The error to report for a failed SDK call, when it isn't a tool or protocol error. */
|
|
42
|
+
sdkFailure(error) {
|
|
43
|
+
if (this.transportFailure)
|
|
44
|
+
return this.transportFailure;
|
|
45
|
+
// The SDK's own deadline aborts the fetch before cloudFetch's, so it needs the same mapping.
|
|
46
|
+
if (error.code === SDK_REQUEST_TIMEOUT)
|
|
47
|
+
return requestTimeoutError();
|
|
48
|
+
return undefined;
|
|
49
|
+
}
|
|
50
|
+
fetch = (input, init) => this.transportStep(() => this.request(input, init));
|
|
51
|
+
request = async (input, init) => {
|
|
52
|
+
const response = await cloudFetch(this.serverUrl)(input, init);
|
|
53
|
+
if (response.ok || response.status === 401)
|
|
54
|
+
return response;
|
|
55
|
+
const body = (await response
|
|
56
|
+
.clone()
|
|
57
|
+
.json()
|
|
58
|
+
.catch(() => undefined));
|
|
59
|
+
// JSON-RPC errors use numeric codes and belong to the SDK, which negotiates on them.
|
|
60
|
+
if (typeof body?.error?.code !== 'string')
|
|
61
|
+
return response;
|
|
62
|
+
throw instanceResponseError(body.error.code, body.error.message ?? `Fluxmail Cloud returned HTTP ${response.status}.`, response.status, body.error.data, body.requestId);
|
|
63
|
+
};
|
|
64
|
+
connect() {
|
|
65
|
+
this.connection ??= (async () => {
|
|
66
|
+
const { Client, StreamableHTTPClientTransport } = await import('@modelcontextprotocol/client');
|
|
67
|
+
const transport = new StreamableHTTPClientTransport(new URL(cloudMcpUrl(this.serverUrl)), {
|
|
68
|
+
fetch: this.fetch,
|
|
69
|
+
authProvider: {
|
|
70
|
+
token: () => this.transportStep(async () => {
|
|
71
|
+
this.lastToken = this.apiKey ?? (await cloudAccessToken(this.instance, this.serverUrl));
|
|
72
|
+
return this.lastToken;
|
|
73
|
+
}),
|
|
74
|
+
onUnauthorized: () => this.transportStep(async () => {
|
|
75
|
+
if (this.apiKey)
|
|
76
|
+
throw apiKeyRejectedError(this.instance);
|
|
77
|
+
this.lastToken = await cloudAccessToken(this.instance, this.serverUrl, this.lastToken);
|
|
78
|
+
}),
|
|
79
|
+
},
|
|
80
|
+
});
|
|
81
|
+
const client = new Client({ name: 'fluxmail-cli', version: VERSION }, { versionNegotiation: { mode: 'auto' } });
|
|
82
|
+
await client.connect(transport, { timeout: currentRequestDeadlineMs() });
|
|
83
|
+
return client;
|
|
84
|
+
})().catch((error) => {
|
|
85
|
+
throw this.sdkFailure(error) ?? error;
|
|
86
|
+
});
|
|
87
|
+
return this.connection;
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* `data` from the tool result. Partly failed modifies and sends that have a
|
|
91
|
+
* delivery operation are errors that still carry data, which callers inspect
|
|
92
|
+
* the same way as a REST response.
|
|
93
|
+
*/
|
|
94
|
+
async callTool(name, args = {}) {
|
|
95
|
+
const client = await this.connect();
|
|
96
|
+
this.transportFailure = undefined;
|
|
97
|
+
let result;
|
|
98
|
+
try {
|
|
99
|
+
result = await client.callTool({ name, arguments: args }, { timeout: currentRequestDeadlineMs() });
|
|
100
|
+
}
|
|
101
|
+
catch (error) {
|
|
102
|
+
const failure = this.sdkFailure(error);
|
|
103
|
+
if (failure)
|
|
104
|
+
throw failure;
|
|
105
|
+
if (error.code === INVALID_PARAMS) {
|
|
106
|
+
throw new EmailError('permission_denied', 'This Fluxmail Cloud connection does not allow this command. Log in again with more permissions.');
|
|
107
|
+
}
|
|
108
|
+
throw error;
|
|
109
|
+
}
|
|
110
|
+
const structured = result.structuredContent;
|
|
111
|
+
if (structured?.data !== undefined)
|
|
112
|
+
return structured.data;
|
|
113
|
+
const block = result.content.find((item) => item.type === 'text');
|
|
114
|
+
const text = block?.text ?? '';
|
|
115
|
+
if (!result.isError) {
|
|
116
|
+
const parsed = parseJson(text);
|
|
117
|
+
if (parsed?.data !== undefined)
|
|
118
|
+
return parsed.data;
|
|
119
|
+
throw instanceResponseError('invalid_response', 'Fluxmail Cloud returned no data.', 200);
|
|
120
|
+
}
|
|
121
|
+
const failure = parseJson(text);
|
|
122
|
+
throw instanceResponseError(failure?.error ?? 'invalid_request', failure?.message ?? text ?? 'Fluxmail Cloud rejected the request.', 0, failure?.data, failure?.requestId);
|
|
123
|
+
}
|
|
124
|
+
async readAttachment(accountId, messageId, attachmentId) {
|
|
125
|
+
const client = await this.connect();
|
|
126
|
+
this.transportFailure = undefined;
|
|
127
|
+
// Lookups use the IDs, and the template needs a filename segment.
|
|
128
|
+
const uri = attachmentUri(accountId, messageId, attachmentId, 'attachment');
|
|
129
|
+
let contents;
|
|
130
|
+
try {
|
|
131
|
+
({
|
|
132
|
+
contents: [contents],
|
|
133
|
+
} = await client.readResource({ uri }, { timeout: currentRequestDeadlineMs() }));
|
|
134
|
+
}
|
|
135
|
+
catch (error) {
|
|
136
|
+
const failure = this.sdkFailure(error);
|
|
137
|
+
if (failure)
|
|
138
|
+
throw failure;
|
|
139
|
+
// Cloud's resource handler reports only a message. The tool reports the same failure with
|
|
140
|
+
// its code, such as not_found or permission_denied, and throws it from callTool.
|
|
141
|
+
await this.callTool('download_attachment', { accountId, messageId, attachmentId });
|
|
142
|
+
// The tool succeeded, so the read failed for a reason that has passed.
|
|
143
|
+
throw instanceResponseError('provider_unavailable', error instanceof Error ? error.message : String(error), 0);
|
|
144
|
+
}
|
|
145
|
+
if (contents?.blob !== undefined) {
|
|
146
|
+
return { content: Buffer.from(contents.blob, 'base64'), mimeType: contents.mimeType };
|
|
147
|
+
}
|
|
148
|
+
if (contents?.text !== undefined) {
|
|
149
|
+
return { content: Buffer.from(contents.text, 'utf8'), mimeType: contents.mimeType };
|
|
150
|
+
}
|
|
151
|
+
throw instanceResponseError('invalid_response', 'Fluxmail Cloud returned no attachment content.', 200);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
//# sourceMappingURL=cliCloudClient.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cliCloudClient.js","sourceRoot":"","sources":["../src/cliCloudClient.ts"],"names":[],"mappings":"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"}
|
package/dist/cliInstances.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { type ProviderFailure } from '@fluxmail/core';
|
|
1
|
+
import { EmailError, type ProviderFailure } from '@fluxmail/core';
|
|
2
2
|
export interface LocalInstanceProfile {
|
|
3
3
|
kind: 'local';
|
|
4
4
|
}
|
|
@@ -6,7 +6,31 @@ export interface RemoteInstanceProfile {
|
|
|
6
6
|
kind: 'remote';
|
|
7
7
|
serverUrl: string;
|
|
8
8
|
}
|
|
9
|
-
export
|
|
9
|
+
export interface CloudInstanceProfile {
|
|
10
|
+
kind: 'cloud';
|
|
11
|
+
serverUrl: string;
|
|
12
|
+
}
|
|
13
|
+
export type InstanceProfile = LocalInstanceProfile | RemoteInstanceProfile | CloudInstanceProfile;
|
|
14
|
+
/** `serverUrl` is the origin that issued the credential. It is only ever sent there. */
|
|
15
|
+
export type CloudSession = {
|
|
16
|
+
serverUrl: string;
|
|
17
|
+
} & ({
|
|
18
|
+
kind: 'oauth';
|
|
19
|
+
clientId: string;
|
|
20
|
+
accessToken: string;
|
|
21
|
+
refreshToken: string;
|
|
22
|
+
expiresAt: number;
|
|
23
|
+
scope?: string;
|
|
24
|
+
} | {
|
|
25
|
+
kind: 'key';
|
|
26
|
+
key: string;
|
|
27
|
+
});
|
|
28
|
+
/** Guards every change to a Cloud session: refresh, login, logout and profile removal. */
|
|
29
|
+
export declare const CLOUD_SESSION_LOCK: {
|
|
30
|
+
timeoutMs: number;
|
|
31
|
+
staleMs: number;
|
|
32
|
+
description: string;
|
|
33
|
+
};
|
|
10
34
|
export interface CliInstanceConfig {
|
|
11
35
|
active?: string;
|
|
12
36
|
instances: Record<string, InstanceProfile>;
|
|
@@ -17,6 +41,7 @@ export interface ApiEnvelope<T> {
|
|
|
17
41
|
warnings?: string[];
|
|
18
42
|
}
|
|
19
43
|
export declare function setRequestDeadlineMs(value: number): void;
|
|
44
|
+
export declare function currentRequestDeadlineMs(): number;
|
|
20
45
|
export declare class InstanceApiError extends Error {
|
|
21
46
|
readonly code: string;
|
|
22
47
|
readonly status: number;
|
|
@@ -26,6 +51,7 @@ export declare class InstanceApiError extends Error {
|
|
|
26
51
|
failure?: ProviderFailure;
|
|
27
52
|
constructor(code: string, message: string, status: number, data?: Record<string, unknown> | undefined, requestId?: string | undefined, connectionStage?: string | undefined);
|
|
28
53
|
}
|
|
54
|
+
export declare function requestTimeoutError(): InstanceApiError;
|
|
29
55
|
export declare function instanceResponseError(code: string, message: string, status: number, data?: Record<string, unknown>, requestId?: string, connectionStage?: string): Error;
|
|
30
56
|
/** The provider failure a local request recorded for this response or JSON envelope. */
|
|
31
57
|
export declare function localFailure(value: object): ProviderFailure | undefined;
|
|
@@ -39,10 +65,17 @@ export declare class CliCanceledError extends Error {
|
|
|
39
65
|
export declare function apiErrorCode(error: unknown): string;
|
|
40
66
|
export declare function instanceConfigPath(): string;
|
|
41
67
|
export declare function credentialPath(): string;
|
|
68
|
+
/** Kept apart from member sessions because refreshing rewrites this file on every token rotation. */
|
|
69
|
+
export declare function cloudCredentialPath(): string;
|
|
42
70
|
export declare function loadInstanceConfig(): CliInstanceConfig;
|
|
71
|
+
export declare function cloudSessionLockPath(): string;
|
|
72
|
+
export declare function loadCloudSession(instanceName: string): CloudSession | undefined;
|
|
73
|
+
export declare function saveCloudSession(instanceName: string, session: CloudSession): void;
|
|
74
|
+
export declare function clearCloudSession(instanceName: string): void;
|
|
43
75
|
export declare function validateRemoteServerUrl(value: string): string;
|
|
44
76
|
export declare function saveLocalInstance(name?: string): void;
|
|
45
77
|
export declare function saveRemoteInstance(name: string, serverUrl: string): void;
|
|
78
|
+
export declare function saveCloudInstance(name: string, serverUrl: string): void;
|
|
46
79
|
export declare function useInstance(name: string): void;
|
|
47
80
|
export declare function removeInstance(name: string): void;
|
|
48
81
|
export declare function resolveInstance(name?: string): {
|
|
@@ -55,13 +88,15 @@ export declare function saveSessionToken(instanceName: string, token: string): v
|
|
|
55
88
|
export declare function clearSessionToken(instanceName: string): void;
|
|
56
89
|
export declare class InstanceClient {
|
|
57
90
|
readonly name: string;
|
|
58
|
-
readonly profile: InstanceProfile
|
|
91
|
+
readonly profile: Exclude<InstanceProfile, CloudInstanceProfile>;
|
|
59
92
|
private readonly token?;
|
|
60
93
|
private readonly requestTimeoutMs?;
|
|
61
|
-
constructor(name: string, profile: InstanceProfile, token?: string | undefined, requestTimeoutMs?: number | undefined);
|
|
94
|
+
constructor(name: string, profile: Exclude<InstanceProfile, CloudInstanceProfile>, token?: string | undefined, requestTimeoutMs?: number | undefined);
|
|
62
95
|
request(pathname: string, init?: RequestInit, authenticated?: boolean): Promise<Response>;
|
|
63
96
|
json<T>(pathname: string, init?: RequestInit, authenticated?: boolean): Promise<T>;
|
|
64
97
|
jsonEnvelope<T>(pathname: string, init?: RequestInit, authenticated?: boolean): Promise<ApiEnvelope<T>>;
|
|
65
98
|
}
|
|
99
|
+
/** Administration stays in the Cloud dashboard; the CLI only reads and manages mail there. */
|
|
100
|
+
export declare function cloudManagementError(profile: CloudInstanceProfile, page?: string): EmailError;
|
|
66
101
|
export declare function instanceClient(name?: string, requireToken?: boolean, requestTimeoutMs?: number): InstanceClient;
|
|
67
102
|
//# sourceMappingURL=cliInstances.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cliInstances.d.ts","sourceRoot":"","sources":["../src/cliInstances.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"cliInstances.d.ts","sourceRoot":"","sources":["../src/cliInstances.ts"],"names":[],"mappings":"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"}
|