@fluxmail/core 0.19.0 → 0.19.1
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/attachments.d.ts +9 -0
- package/dist/attachments.d.ts.map +1 -0
- package/dist/attachments.js +27 -0
- package/dist/attachments.js.map +1 -0
- package/dist/errors.d.ts +5 -0
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +16 -0
- package/dist/errors.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/mcp/clients.d.ts +16 -0
- package/dist/mcp/clients.d.ts.map +1 -0
- package/dist/mcp/clients.js +69 -0
- package/dist/mcp/clients.js.map +1 -0
- package/dist/mcp/index.d.ts +2 -0
- package/dist/mcp/index.d.ts.map +1 -1
- package/dist/mcp/index.js +2 -0
- package/dist/mcp/index.js.map +1 -1
- package/dist/mcp/pdf.d.ts +18 -0
- package/dist/mcp/pdf.d.ts.map +1 -0
- package/dist/mcp/pdf.js +97 -0
- package/dist/mcp/pdf.js.map +1 -0
- package/dist/mcp/results.d.ts +114 -0
- package/dist/mcp/results.d.ts.map +1 -0
- package/dist/mcp/results.js +165 -0
- package/dist/mcp/results.js.map +1 -0
- package/dist/mcp/tools.d.ts +7 -0
- package/dist/mcp/tools.d.ts.map +1 -1
- package/dist/mcp/tools.generated.d.ts +1 -0
- package/dist/mcp/tools.generated.d.ts.map +1 -1
- package/dist/mcp/tools.generated.js +1852 -0
- package/dist/mcp/tools.generated.js.map +1 -1
- package/dist/mcp/tools.js +2 -1
- package/dist/mcp/tools.js.map +1 -1
- package/dist/reply.d.ts +11 -1
- package/dist/reply.d.ts.map +1 -1
- package/dist/reply.js +43 -0
- package/dist/reply.js.map +1 -1
- package/dist/search.d.ts +8 -1
- package/dist/search.d.ts.map +1 -1
- package/dist/search.js +36 -0
- package/dist/search.js.map +1 -1
- package/dist/searchCursor.d.ts +35 -0
- package/dist/searchCursor.d.ts.map +1 -0
- package/dist/searchCursor.js +113 -0
- package/dist/searchCursor.js.map +1 -0
- package/package.json +9 -1
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/** A filename safe for a download: control, path and reserved characters become underscores. */
|
|
2
|
+
export declare function safeAttachmentFilename(filename: string): string;
|
|
3
|
+
/** Response headers for downloading an attachment's decoded content. */
|
|
4
|
+
export declare function attachmentDownloadHeaders(attachment: {
|
|
5
|
+
filename: string;
|
|
6
|
+
mimeType: string;
|
|
7
|
+
byteLength: number;
|
|
8
|
+
}): Record<string, string>;
|
|
9
|
+
//# sourceMappingURL=attachments.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"attachments.d.ts","sourceRoot":"","sources":["../src/attachments.ts"],"names":[],"mappings":"AAEA,gGAAgG;AAChG,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAS/D;AASD,wEAAwE;AACxE,wBAAgB,yBAAyB,CAAC,UAAU,EAAE;IACpD,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;CACpB,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CASzB"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
const MIME_TYPE_PATTERN = /^[\w!#$&^_.+-]+\/[\w!#$&^_.+-]+$/;
|
|
2
|
+
/** A filename safe for a download: control, path and reserved characters become underscores. */
|
|
3
|
+
export function safeAttachmentFilename(filename) {
|
|
4
|
+
let safe = '';
|
|
5
|
+
for (const character of filename) {
|
|
6
|
+
const code = character.charCodeAt(0);
|
|
7
|
+
// encodeURIComponent throws on an unpaired surrogate, so replace it too.
|
|
8
|
+
const unpaired = character.length === 1 && code >= 0xd800 && code <= 0xdfff;
|
|
9
|
+
safe += code < 32 || code === 127 || unpaired || '/\\:*?"<>|'.includes(character) ? '_' : character;
|
|
10
|
+
}
|
|
11
|
+
return safe || 'attachment';
|
|
12
|
+
}
|
|
13
|
+
function encodeContentDispositionFilename(filename) {
|
|
14
|
+
return encodeURIComponent(filename).replace(/['()*]/g, (character) => `%${character.charCodeAt(0).toString(16).toUpperCase()}`);
|
|
15
|
+
}
|
|
16
|
+
/** Response headers for downloading an attachment's decoded content. */
|
|
17
|
+
export function attachmentDownloadHeaders(attachment) {
|
|
18
|
+
const name = safeAttachmentFilename(attachment.filename);
|
|
19
|
+
return {
|
|
20
|
+
'content-type': MIME_TYPE_PATTERN.test(attachment.mimeType) ? attachment.mimeType : 'application/octet-stream',
|
|
21
|
+
'content-length': String(attachment.byteLength),
|
|
22
|
+
'content-disposition': `attachment; filename="${name.replace(/[^\x20-\x7e]/g, '_')}"; filename*=UTF-8''${encodeContentDispositionFilename(name)}`,
|
|
23
|
+
'cache-control': 'no-store',
|
|
24
|
+
'x-content-type-options': 'nosniff',
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=attachments.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"attachments.js","sourceRoot":"","sources":["../src/attachments.ts"],"names":[],"mappings":"AAAA,MAAM,iBAAiB,GAAG,kCAAkC,CAAC;AAE7D,gGAAgG;AAChG,MAAM,UAAU,sBAAsB,CAAC,QAAgB;IACrD,IAAI,IAAI,GAAG,EAAE,CAAC;IACd,KAAK,MAAM,SAAS,IAAI,QAAQ,EAAE,CAAC;QACjC,MAAM,IAAI,GAAG,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;QACrC,yEAAyE;QACzE,MAAM,QAAQ,GAAG,SAAS,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,IAAI,MAAM,IAAI,IAAI,IAAI,MAAM,CAAC;QAC5E,IAAI,IAAI,IAAI,GAAG,EAAE,IAAI,IAAI,KAAK,GAAG,IAAI,QAAQ,IAAI,YAAY,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC;IACtG,CAAC;IACD,OAAO,IAAI,IAAI,YAAY,CAAC;AAC9B,CAAC;AAED,SAAS,gCAAgC,CAAC,QAAgB;IACxD,OAAO,kBAAkB,CAAC,QAAQ,CAAC,CAAC,OAAO,CACzC,SAAS,EACT,CAAC,SAAS,EAAE,EAAE,CAAC,IAAI,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,WAAW,EAAE,EAAE,CACxE,CAAC;AACJ,CAAC;AAED,wEAAwE;AACxE,MAAM,UAAU,yBAAyB,CAAC,UAIzC;IACC,MAAM,IAAI,GAAG,sBAAsB,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;IACzD,OAAO;QACL,cAAc,EAAE,iBAAiB,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,0BAA0B;QAC9G,gBAAgB,EAAE,MAAM,CAAC,UAAU,CAAC,UAAU,CAAC;QAC/C,qBAAqB,EAAE,yBAAyB,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE,GAAG,CAAC,uBAAuB,gCAAgC,CAAC,IAAI,CAAC,EAAE;QACjJ,eAAe,EAAE,UAAU;QAC3B,wBAAwB,EAAE,SAAS;KACpC,CAAC;AACJ,CAAC"}
|
package/dist/errors.d.ts
CHANGED
|
@@ -39,4 +39,9 @@ export declare function networkFailure(error: unknown): Pick<ProviderFailure, 'r
|
|
|
39
39
|
/** A provider response is missing data Fluxmail needs. */
|
|
40
40
|
export declare function invalidResponseError(message: string): EmailError;
|
|
41
41
|
export declare function isEmailError(err: unknown): err is EmailError;
|
|
42
|
+
/**
|
|
43
|
+
* Whether an error proves a send or change was not applied, so the caller may retry or report
|
|
44
|
+
* it as failed. Any other error leaves the outcome uncertain.
|
|
45
|
+
*/
|
|
46
|
+
export declare function isDefiniteDeliveryFailure(error: unknown): boolean;
|
|
42
47
|
//# sourceMappingURL=errors.d.ts.map
|
package/dist/errors.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE3C,MAAM,MAAM,cAAc,GACtB,cAAc,GACd,cAAc,GACd,WAAW,GACX,iBAAiB,GACjB,sBAAsB,GACtB,sBAAsB,GACtB,sBAAsB,GACtB,mBAAmB,GACnB,wBAAwB,CAAC;AAE7B,eAAO,MAAM,cAAc,EAAE,SAAS,QAAQ,EAAiC,CAAC;AAEhF,kFAAkF;AAClF,eAAO,MAAM,eAAe,kRAgBlB,CAAC;AACX,MAAM,MAAM,aAAa,GAAG,CAAC,OAAO,eAAe,CAAC,CAAC,MAAM,CAAC,CAAC;AAE7D,+CAA+C;AAC/C,eAAO,MAAM,cAAc,kGASjB,CAAC;AACX,MAAM,MAAM,YAAY,GAAG,CAAC,OAAO,cAAc,CAAC,CAAC,MAAM,CAAC,CAAC;AAE3D,6FAA6F;AAC7F,eAAO,MAAM,gBAAgB,yXAmBnB,CAAC;AAEX;;;GAGG;AACH,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,MAAM,CAAC,EAAE,aAAa,CAAC;IACvB,KAAK,CAAC,EAAE,YAAY,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,qBAAa,UAAW,SAAQ,KAAK;IACnC,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC;IAC9B,oEAAoE;IACpE,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACxC,2FAA2F;IAC3F,OAAO,CAAC,EAAE,eAAe,CAAC;gBAEd,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,EAAE,eAAe;CAO7G;AAgBD;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,CAAC,eAAe,EAAE,QAAQ,GAAG,QAAQ,CAAC,GAAG,SAAS,CAYrG;AAED,0DAA0D;AAC1D,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,UAAU,CAEhE;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,OAAO,GAAG,GAAG,IAAI,UAAU,CAE5D"}
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE3C,MAAM,MAAM,cAAc,GACtB,cAAc,GACd,cAAc,GACd,WAAW,GACX,iBAAiB,GACjB,sBAAsB,GACtB,sBAAsB,GACtB,sBAAsB,GACtB,mBAAmB,GACnB,wBAAwB,CAAC;AAE7B,eAAO,MAAM,cAAc,EAAE,SAAS,QAAQ,EAAiC,CAAC;AAEhF,kFAAkF;AAClF,eAAO,MAAM,eAAe,kRAgBlB,CAAC;AACX,MAAM,MAAM,aAAa,GAAG,CAAC,OAAO,eAAe,CAAC,CAAC,MAAM,CAAC,CAAC;AAE7D,+CAA+C;AAC/C,eAAO,MAAM,cAAc,kGASjB,CAAC;AACX,MAAM,MAAM,YAAY,GAAG,CAAC,OAAO,cAAc,CAAC,CAAC,MAAM,CAAC,CAAC;AAE3D,6FAA6F;AAC7F,eAAO,MAAM,gBAAgB,yXAmBnB,CAAC;AAEX;;;GAGG;AACH,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,MAAM,CAAC,EAAE,aAAa,CAAC;IACvB,KAAK,CAAC,EAAE,YAAY,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,qBAAa,UAAW,SAAQ,KAAK;IACnC,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC;IAC9B,oEAAoE;IACpE,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACxC,2FAA2F;IAC3F,OAAO,CAAC,EAAE,eAAe,CAAC;gBAEd,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,EAAE,eAAe;CAO7G;AAgBD;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,CAAC,eAAe,EAAE,QAAQ,GAAG,QAAQ,CAAC,GAAG,SAAS,CAYrG;AAED,0DAA0D;AAC1D,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,UAAU,CAEhE;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,OAAO,GAAG,GAAG,IAAI,UAAU,CAE5D;AAED;;;GAGG;AACH,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAajE"}
|
package/dist/errors.js
CHANGED
|
@@ -105,4 +105,20 @@ export function invalidResponseError(message) {
|
|
|
105
105
|
export function isEmailError(err) {
|
|
106
106
|
return err instanceof EmailError;
|
|
107
107
|
}
|
|
108
|
+
/**
|
|
109
|
+
* Whether an error proves a send or change was not applied, so the caller may retry or report
|
|
110
|
+
* it as failed. Any other error leaves the outcome uncertain.
|
|
111
|
+
*/
|
|
112
|
+
export function isDefiniteDeliveryFailure(error) {
|
|
113
|
+
return (isEmailError(error) &&
|
|
114
|
+
[
|
|
115
|
+
'invalid_request',
|
|
116
|
+
'not_found',
|
|
117
|
+
'permission_denied',
|
|
118
|
+
'unsupported_capability',
|
|
119
|
+
'auth_expired',
|
|
120
|
+
'rate_limited',
|
|
121
|
+
'entitlement_exceeded',
|
|
122
|
+
].includes(error.code));
|
|
123
|
+
}
|
|
108
124
|
//# sourceMappingURL=errors.js.map
|
package/dist/errors.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,aAAa,CAAC;AAC5B,cAAc,oBAAoB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,aAAa,CAAC;AAC5B,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC"}
|
package/dist/index.js
CHANGED
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,aAAa,CAAC;AAC5B,cAAc,oBAAoB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,aAAa,CAAC;AAC5B,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/** Fixed labels for MCP clients. Client names are untrusted, so telemetry groups them into these. */
|
|
2
|
+
export declare const mcpClients: readonly ["claude", "claude_desktop", "claude_code", "codex", "cursor", "chatgpt", "vscode", "windsurf", "cline", "roo_code", "goose", "zed", "muse", "other", "unknown"];
|
|
3
|
+
export type McpClient = (typeof mcpClients)[number];
|
|
4
|
+
export declare function classifyMcpClient(name: unknown): McpClient;
|
|
5
|
+
export interface McpClientProperties {
|
|
6
|
+
mcp_client: McpClient;
|
|
7
|
+
/** The self-reported name, trimmed. Omitted when blank or longer than 128 characters. */
|
|
8
|
+
mcp_client_name?: string;
|
|
9
|
+
/** The self-reported version, trimmed. Omitted when blank or longer than 64 characters. */
|
|
10
|
+
mcp_client_version?: string;
|
|
11
|
+
/** A dated MCP revision such as `2026-07-28`. Omitted when absent or malformed. */
|
|
12
|
+
mcp_protocol_version?: string;
|
|
13
|
+
}
|
|
14
|
+
/** Describe an untrusted `clientInfo` object and protocol version from a request. */
|
|
15
|
+
export declare function mcpClientProperties(info: unknown, protocolVersion?: unknown): McpClientProperties;
|
|
16
|
+
//# sourceMappingURL=clients.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clients.d.ts","sourceRoot":"","sources":["../../src/mcp/clients.ts"],"names":[],"mappings":"AAAA,qGAAqG;AACrG,eAAO,MAAM,UAAU,2KAgBb,CAAC;AACX,MAAM,MAAM,SAAS,GAAG,CAAC,OAAO,UAAU,CAAC,CAAC,MAAM,CAAC,CAAC;AAwBpD,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,OAAO,GAAG,SAAS,CAQ1D;AAED,MAAM,WAAW,mBAAmB;IAClC,UAAU,EAAE,SAAS,CAAC;IACtB,yFAAyF;IACzF,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,2FAA2F;IAC3F,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,mFAAmF;IACnF,oBAAoB,CAAC,EAAE,MAAM,CAAC;CAC/B;AAOD,qFAAqF;AACrF,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,OAAO,EAAE,eAAe,CAAC,EAAE,OAAO,GAAG,mBAAmB,CAYjG"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/** Fixed labels for MCP clients. Client names are untrusted, so telemetry groups them into these. */
|
|
2
|
+
export const mcpClients = [
|
|
3
|
+
'claude',
|
|
4
|
+
'claude_desktop',
|
|
5
|
+
'claude_code',
|
|
6
|
+
'codex',
|
|
7
|
+
'cursor',
|
|
8
|
+
'chatgpt',
|
|
9
|
+
'vscode',
|
|
10
|
+
'windsurf',
|
|
11
|
+
'cline',
|
|
12
|
+
'roo_code',
|
|
13
|
+
'goose',
|
|
14
|
+
'zed',
|
|
15
|
+
'muse',
|
|
16
|
+
'other',
|
|
17
|
+
'unknown',
|
|
18
|
+
];
|
|
19
|
+
const aliases = new Map([
|
|
20
|
+
['claude', 'claude'],
|
|
21
|
+
['claude_ai', 'claude'],
|
|
22
|
+
['claude_desktop', 'claude_desktop'],
|
|
23
|
+
['claude_code', 'claude_code'],
|
|
24
|
+
['codex', 'codex'],
|
|
25
|
+
['codex_mcp_client', 'codex'],
|
|
26
|
+
['cursor', 'cursor'],
|
|
27
|
+
['cursor_vscode', 'cursor'],
|
|
28
|
+
['chatgpt', 'chatgpt'],
|
|
29
|
+
['openai_mcp', 'chatgpt'],
|
|
30
|
+
['vscode', 'vscode'],
|
|
31
|
+
['visual_studio_code', 'vscode'],
|
|
32
|
+
['windsurf', 'windsurf'],
|
|
33
|
+
['cline', 'cline'],
|
|
34
|
+
['roo_code', 'roo_code'],
|
|
35
|
+
['goose', 'goose'],
|
|
36
|
+
['zed', 'zed'],
|
|
37
|
+
['muse', 'muse'],
|
|
38
|
+
]);
|
|
39
|
+
// Client names are untrusted. Classify them into fixed labels for stable grouping.
|
|
40
|
+
export function classifyMcpClient(name) {
|
|
41
|
+
if (typeof name !== 'string' || !name.trim())
|
|
42
|
+
return 'unknown';
|
|
43
|
+
if (name.length > 128)
|
|
44
|
+
return 'other';
|
|
45
|
+
const normalized = name
|
|
46
|
+
.trim()
|
|
47
|
+
.toLowerCase()
|
|
48
|
+
.replace(/[ _-]+/g, '_');
|
|
49
|
+
return aliases.get(normalized) ?? 'other';
|
|
50
|
+
}
|
|
51
|
+
function boundedText(value, maxLength) {
|
|
52
|
+
const trimmed = typeof value === 'string' ? value.trim() : '';
|
|
53
|
+
return trimmed && trimmed.length <= maxLength ? trimmed : undefined;
|
|
54
|
+
}
|
|
55
|
+
/** Describe an untrusted `clientInfo` object and protocol version from a request. */
|
|
56
|
+
export function mcpClientProperties(info, protocolVersion) {
|
|
57
|
+
const client = info && typeof info === 'object' ? info : {};
|
|
58
|
+
const name = boundedText(client.name, 128);
|
|
59
|
+
const version = boundedText(client.version, 64);
|
|
60
|
+
return {
|
|
61
|
+
mcp_client: classifyMcpClient(client.name),
|
|
62
|
+
...(name ? { mcp_client_name: name } : {}),
|
|
63
|
+
...(version ? { mcp_client_version: version } : {}),
|
|
64
|
+
...(typeof protocolVersion === 'string' && /^\d{4}-\d{2}-\d{2}$/.test(protocolVersion)
|
|
65
|
+
? { mcp_protocol_version: protocolVersion }
|
|
66
|
+
: {}),
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=clients.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clients.js","sourceRoot":"","sources":["../../src/mcp/clients.ts"],"names":[],"mappings":"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"}
|
package/dist/mcp/index.d.ts
CHANGED
package/dist/mcp/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/mcp/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/mcp/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC"}
|
package/dist/mcp/index.js
CHANGED
package/dist/mcp/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/mcp/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/mcp/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { type PdfText } from './results.js';
|
|
2
|
+
export interface PdfTextExtractorOptions {
|
|
3
|
+
/**
|
|
4
|
+
* The worker module. It reads `{ bytes, cMapDirectory, firstPage, lastPage, maxPages, maxChars }`
|
|
5
|
+
* from `workerData` and posts one PdfText message.
|
|
6
|
+
*/
|
|
7
|
+
workerUrl: URL;
|
|
8
|
+
/** pdf.js reads CMaps from a filesystem path ending in a separator; a file:// URL does not load. */
|
|
9
|
+
cMapDirectory: string;
|
|
10
|
+
}
|
|
11
|
+
export type PdfTextExtractor = (content: Buffer, signal: AbortSignal, pages?: string, onError?: (error: unknown) => void) => Promise<PdfText | undefined>;
|
|
12
|
+
/**
|
|
13
|
+
* Extracts PDF text in memory-limited workers. At most PDF_TEXT_LIMITS.workers extractions run at
|
|
14
|
+
* once in the process. Waiting for a worker shares the extraction timeout. The extractor resolves
|
|
15
|
+
* undefined when extraction fails or is aborted.
|
|
16
|
+
*/
|
|
17
|
+
export declare function createPdfTextExtractor({ workerUrl, cMapDirectory }: PdfTextExtractorOptions): PdfTextExtractor;
|
|
18
|
+
//# sourceMappingURL=pdf.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pdf.d.ts","sourceRoot":"","sources":["../../src/mcp/pdf.ts"],"names":[],"mappings":"AACA,OAAO,EAAmC,KAAK,OAAO,EAAE,MAAM,cAAc,CAAC;AAE7E,MAAM,WAAW,uBAAuB;IACtC;;;OAGG;IACH,SAAS,EAAE,GAAG,CAAC;IACf,oGAAoG;IACpG,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,MAAM,gBAAgB,GAAG,CAC7B,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,WAAW,EACnB,KAAK,CAAC,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,KAC/B,OAAO,CAAC,OAAO,GAAG,SAAS,CAAC,CAAC;AAmClC;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,EAAE,SAAS,EAAE,aAAa,EAAE,EAAE,uBAAuB,GAAG,gBAAgB,CA2D9G"}
|
package/dist/mcp/pdf.js
ADDED
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { Worker } from 'node:worker_threads';
|
|
2
|
+
import { PDF_TEXT_LIMITS, parsePageRange } from './results.js';
|
|
3
|
+
// Shared by every extractor in this process, so concurrent extractions cannot multiply the
|
|
4
|
+
// heap limit.
|
|
5
|
+
let runningWorkers = 0;
|
|
6
|
+
const workerQueue = [];
|
|
7
|
+
/** Resolves true once a worker slot is held, or false when the signal aborts first. */
|
|
8
|
+
function acquireWorkerSlot(signal) {
|
|
9
|
+
if (signal.aborted)
|
|
10
|
+
return Promise.resolve(false);
|
|
11
|
+
if (runningWorkers < PDF_TEXT_LIMITS.workers) {
|
|
12
|
+
runningWorkers++;
|
|
13
|
+
return Promise.resolve(true);
|
|
14
|
+
}
|
|
15
|
+
return new Promise((resolve) => {
|
|
16
|
+
const grant = () => {
|
|
17
|
+
signal.removeEventListener('abort', cancel);
|
|
18
|
+
resolve(true);
|
|
19
|
+
};
|
|
20
|
+
const cancel = () => {
|
|
21
|
+
workerQueue.splice(workerQueue.indexOf(grant), 1);
|
|
22
|
+
resolve(false);
|
|
23
|
+
};
|
|
24
|
+
workerQueue.push(grant);
|
|
25
|
+
signal.addEventListener('abort', cancel, { once: true });
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
/** Hand the slot to the next waiting extraction, or free it. */
|
|
29
|
+
function releaseWorkerSlot() {
|
|
30
|
+
const next = workerQueue.shift();
|
|
31
|
+
if (next)
|
|
32
|
+
next();
|
|
33
|
+
else
|
|
34
|
+
runningWorkers--;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Extracts PDF text in memory-limited workers. At most PDF_TEXT_LIMITS.workers extractions run at
|
|
38
|
+
* once in the process. Waiting for a worker shares the extraction timeout. The extractor resolves
|
|
39
|
+
* undefined when extraction fails or is aborted.
|
|
40
|
+
*/
|
|
41
|
+
export function createPdfTextExtractor({ workerUrl, cMapDirectory }) {
|
|
42
|
+
const runPdfWorker = (content, signal, pages, onError) => {
|
|
43
|
+
const range = parsePageRange(pages);
|
|
44
|
+
if (!range)
|
|
45
|
+
return Promise.resolve(undefined);
|
|
46
|
+
return new Promise((resolve) => {
|
|
47
|
+
if (signal.aborted)
|
|
48
|
+
return resolve(undefined);
|
|
49
|
+
const bytes = new Uint8Array(content);
|
|
50
|
+
const worker = new Worker(workerUrl, {
|
|
51
|
+
workerData: {
|
|
52
|
+
bytes,
|
|
53
|
+
cMapDirectory,
|
|
54
|
+
firstPage: range.first,
|
|
55
|
+
lastPage: range.last,
|
|
56
|
+
maxPages: PDF_TEXT_LIMITS.maxPages,
|
|
57
|
+
maxChars: PDF_TEXT_LIMITS.maxChars,
|
|
58
|
+
},
|
|
59
|
+
transferList: [bytes.buffer],
|
|
60
|
+
resourceLimits: { maxOldGenerationSizeMb: PDF_TEXT_LIMITS.heapMb },
|
|
61
|
+
});
|
|
62
|
+
let settled = false;
|
|
63
|
+
const finish = (result, error) => {
|
|
64
|
+
if (settled)
|
|
65
|
+
return;
|
|
66
|
+
settled = true;
|
|
67
|
+
clearTimeout(timer);
|
|
68
|
+
signal.removeEventListener('abort', abort);
|
|
69
|
+
if (error)
|
|
70
|
+
onError?.(error);
|
|
71
|
+
// Resolve after the thread stops so a released slot no longer holds its heap.
|
|
72
|
+
void worker.terminate().finally(() => resolve(result));
|
|
73
|
+
};
|
|
74
|
+
const abort = () => finish();
|
|
75
|
+
const timer = setTimeout(() => finish(undefined, new Error('PDF text extraction timed out.')), PDF_TEXT_LIMITS.timeoutMs);
|
|
76
|
+
signal.addEventListener('abort', abort, { once: true });
|
|
77
|
+
worker.once('message', (result) => finish(result));
|
|
78
|
+
worker.once('error', (error) => finish(undefined, error));
|
|
79
|
+
worker.once('exit', (code) => finish(undefined, new Error(`PDF text worker exited with code ${code}.`)));
|
|
80
|
+
});
|
|
81
|
+
};
|
|
82
|
+
return async (content, signal, pages = '1-999999', onError) => {
|
|
83
|
+
const waitTimeout = AbortSignal.timeout(PDF_TEXT_LIMITS.timeoutMs);
|
|
84
|
+
if (!(await acquireWorkerSlot(AbortSignal.any([signal, waitTimeout])))) {
|
|
85
|
+
if (waitTimeout.aborted && !signal.aborted)
|
|
86
|
+
onError?.(new Error('PDF text extraction timed out waiting for a worker.'));
|
|
87
|
+
return undefined;
|
|
88
|
+
}
|
|
89
|
+
try {
|
|
90
|
+
return await runPdfWorker(content, signal, pages, onError);
|
|
91
|
+
}
|
|
92
|
+
finally {
|
|
93
|
+
releaseWorkerSlot();
|
|
94
|
+
}
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=pdf.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pdf.js","sourceRoot":"","sources":["../../src/mcp/pdf.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC7C,OAAO,EAAE,eAAe,EAAE,cAAc,EAAgB,MAAM,cAAc,CAAC;AAmB7E,2FAA2F;AAC3F,cAAc;AACd,IAAI,cAAc,GAAG,CAAC,CAAC;AACvB,MAAM,WAAW,GAAsB,EAAE,CAAC;AAE1C,uFAAuF;AACvF,SAAS,iBAAiB,CAAC,MAAmB;IAC5C,IAAI,MAAM,CAAC,OAAO;QAAE,OAAO,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IAClD,IAAI,cAAc,GAAG,eAAe,CAAC,OAAO,EAAE,CAAC;QAC7C,cAAc,EAAE,CAAC;QACjB,OAAO,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/B,CAAC;IACD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,MAAM,KAAK,GAAG,GAAG,EAAE;YACjB,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YAC5C,OAAO,CAAC,IAAI,CAAC,CAAC;QAChB,CAAC,CAAC;QACF,MAAM,MAAM,GAAG,GAAG,EAAE;YAClB,WAAW,CAAC,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;YAClD,OAAO,CAAC,KAAK,CAAC,CAAC;QACjB,CAAC,CAAC;QACF,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACxB,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IAC3D,CAAC,CAAC,CAAC;AACL,CAAC;AAED,gEAAgE;AAChE,SAAS,iBAAiB;IACxB,MAAM,IAAI,GAAG,WAAW,CAAC,KAAK,EAAE,CAAC;IACjC,IAAI,IAAI;QAAE,IAAI,EAAE,CAAC;;QACZ,cAAc,EAAE,CAAC;AACxB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,sBAAsB,CAAC,EAAE,SAAS,EAAE,aAAa,EAA2B;IAC1F,MAAM,YAAY,GAAG,CACnB,OAAe,EACf,MAAmB,EACnB,KAAa,EACb,OAAkC,EACJ,EAAE;QAChC,MAAM,KAAK,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;QACpC,IAAI,CAAC,KAAK;YAAE,OAAO,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QAC9C,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YAC7B,IAAI,MAAM,CAAC,OAAO;gBAAE,OAAO,OAAO,CAAC,SAAS,CAAC,CAAC;YAC9C,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,OAAO,CAAC,CAAC;YACtC,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,SAAS,EAAE;gBACnC,UAAU,EAAE;oBACV,KAAK;oBACL,aAAa;oBACb,SAAS,EAAE,KAAK,CAAC,KAAK;oBACtB,QAAQ,EAAE,KAAK,CAAC,IAAI;oBACpB,QAAQ,EAAE,eAAe,CAAC,QAAQ;oBAClC,QAAQ,EAAE,eAAe,CAAC,QAAQ;iBACnC;gBACD,YAAY,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC;gBAC5B,cAAc,EAAE,EAAE,sBAAsB,EAAE,eAAe,CAAC,MAAM,EAAE;aACnE,CAAC,CAAC;YACH,IAAI,OAAO,GAAG,KAAK,CAAC;YACpB,MAAM,MAAM,GAAG,CAAC,MAAgB,EAAE,KAAe,EAAE,EAAE;gBACnD,IAAI,OAAO;oBAAE,OAAO;gBACpB,OAAO,GAAG,IAAI,CAAC;gBACf,YAAY,CAAC,KAAK,CAAC,CAAC;gBACpB,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;gBAC3C,IAAI,KAAK;oBAAE,OAAO,EAAE,CAAC,KAAK,CAAC,CAAC;gBAC5B,8EAA8E;gBAC9E,KAAK,MAAM,CAAC,SAAS,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;YACzD,CAAC,CAAC;YACF,MAAM,KAAK,GAAG,GAAG,EAAE,CAAC,MAAM,EAAE,CAAC;YAC7B,MAAM,KAAK,GAAG,UAAU,CACtB,GAAG,EAAE,CAAC,MAAM,CAAC,SAAS,EAAE,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC,EACpE,eAAe,CAAC,SAAS,CAC1B,CAAC;YACF,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;YACxD,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,MAAe,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;YAC5D,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC;YAC1D,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,SAAS,EAAE,IAAI,KAAK,CAAC,oCAAoC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC;QAC3G,CAAC,CAAC,CAAC;IACL,CAAC,CAAC;IAEF,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,GAAG,UAAU,EAAE,OAAO,EAAE,EAAE;QAC5D,MAAM,WAAW,GAAG,WAAW,CAAC,OAAO,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC;QACnE,IAAI,CAAC,CAAC,MAAM,iBAAiB,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YACvE,IAAI,WAAW,CAAC,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO;gBACxC,OAAO,EAAE,CAAC,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAC,CAAC;YAC9E,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,IAAI,CAAC;YACH,OAAO,MAAM,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;QAC7D,CAAC;gBAAS,CAAC;YACT,iBAAiB,EAAE,CAAC;QACtB,CAAC;IACH,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import type { Message, ModifyAction, Thread } from '../types.js';
|
|
2
|
+
import type { ModifyActionName } from './scopes.js';
|
|
3
|
+
/** The most body characters one MCP result returns, so one long email can't fill the model's context. */
|
|
4
|
+
export declare const MAX_BODY_CHARS = 50000;
|
|
5
|
+
export declare const MAX_THREAD_PAGE_TOKEN_CHARS = 1024;
|
|
6
|
+
export declare const DEFAULT_THREAD_PAGE_SIZE = 10;
|
|
7
|
+
export type BodyFormat = 'text' | 'html' | 'both' | 'none';
|
|
8
|
+
export type BodyTruncation = Record<string, {
|
|
9
|
+
totalChars: number;
|
|
10
|
+
nextOffset?: number;
|
|
11
|
+
}>;
|
|
12
|
+
/** Keep the requested body parts, cut to a shared character budget, and say where each was cut. */
|
|
13
|
+
export declare function selectBody(message: Message, format: BodyFormat, budget?: number): Message & {
|
|
14
|
+
bodyTruncation?: BodyTruncation;
|
|
15
|
+
};
|
|
16
|
+
export interface BodyPage {
|
|
17
|
+
format: 'text' | 'html';
|
|
18
|
+
text: string;
|
|
19
|
+
offset: number;
|
|
20
|
+
totalChars: number;
|
|
21
|
+
nextOffset?: number;
|
|
22
|
+
}
|
|
23
|
+
/** One window of a message body, for reading a long body in parts. */
|
|
24
|
+
export declare function bodyPage(message: Message, format: 'text' | 'html', offset?: number, maxChars?: number): BodyPage;
|
|
25
|
+
/**
|
|
26
|
+
* The message offset a thread page token points to, or undefined when the token is malformed or
|
|
27
|
+
* belongs to another thread. A token is the base64url JSON of the thread ID and the offset.
|
|
28
|
+
*/
|
|
29
|
+
export declare function threadPageOffset(threadId: string, pageToken: string | undefined): number | undefined;
|
|
30
|
+
export interface ThreadPage {
|
|
31
|
+
id: string;
|
|
32
|
+
subject: string;
|
|
33
|
+
messages: Array<Message & {
|
|
34
|
+
bodyTruncation?: BodyTruncation;
|
|
35
|
+
}>;
|
|
36
|
+
nextPageToken?: string;
|
|
37
|
+
}
|
|
38
|
+
/** One page of a thread's messages. Bodies on the page share one character budget. */
|
|
39
|
+
export declare function threadPage(thread: Thread, options: {
|
|
40
|
+
threadId: string;
|
|
41
|
+
offset: number;
|
|
42
|
+
pageSize?: number;
|
|
43
|
+
bodyFormat?: BodyFormat;
|
|
44
|
+
}): ThreadPage;
|
|
45
|
+
/** Folders a move can't target, because archive and trash have their own actions. */
|
|
46
|
+
export declare const PROTECTED_MOVE_DESTINATIONS: ReadonlySet<string>;
|
|
47
|
+
/**
|
|
48
|
+
* The provider action for a modify action and its arguments, or an error message for the
|
|
49
|
+
* caller when a required argument is missing or the move targets a protected folder.
|
|
50
|
+
*/
|
|
51
|
+
export declare function toModifyAction(action: ModifyActionName, args: {
|
|
52
|
+
folder?: string;
|
|
53
|
+
labels?: string[];
|
|
54
|
+
}): {
|
|
55
|
+
action: ModifyAction;
|
|
56
|
+
} | {
|
|
57
|
+
error: string;
|
|
58
|
+
};
|
|
59
|
+
export declare function mediaType(mimeType: string): string;
|
|
60
|
+
export type AttachmentResourceContents = {
|
|
61
|
+
uri: string;
|
|
62
|
+
mimeType: string;
|
|
63
|
+
text: string;
|
|
64
|
+
} | {
|
|
65
|
+
uri: string;
|
|
66
|
+
mimeType: string;
|
|
67
|
+
blob: string;
|
|
68
|
+
};
|
|
69
|
+
/**
|
|
70
|
+
* Some clients, including claude.ai, only pass a blob to the model through
|
|
71
|
+
* file storage, so UTF-8 text attachments go out as text.
|
|
72
|
+
*/
|
|
73
|
+
export declare function attachmentContents(uri: string, mimeType: string, content: Buffer): AttachmentResourceContents;
|
|
74
|
+
export type InlineAttachmentContent = {
|
|
75
|
+
type: 'image';
|
|
76
|
+
data: string;
|
|
77
|
+
mimeType: string;
|
|
78
|
+
} | {
|
|
79
|
+
type: 'resource';
|
|
80
|
+
resource: AttachmentResourceContents;
|
|
81
|
+
};
|
|
82
|
+
export declare function inlineContent(uri: string, mimeType: string, content: Buffer): InlineAttachmentContent;
|
|
83
|
+
/** The URI of an attachment resource. The filename is display-only; lookups use the IDs. */
|
|
84
|
+
export declare function attachmentUri(accountId: string, messageId: string, attachmentId: string, filename: string): string;
|
|
85
|
+
export declare const ATTACHMENT_URI_TEMPLATE = "fluxmail://attachment/{accountId}/{messageId}/{attachmentId}/{filename}";
|
|
86
|
+
/** Limits on PDF text extraction. At most `workers` extractions run at once in a process, across extractors. */
|
|
87
|
+
export declare const PDF_TEXT_LIMITS: {
|
|
88
|
+
maxPages: number;
|
|
89
|
+
maxChars: number;
|
|
90
|
+
heapMb: number;
|
|
91
|
+
timeoutMs: number;
|
|
92
|
+
workers: number;
|
|
93
|
+
};
|
|
94
|
+
/** A PDF page or ascending page range such as 201-400. Check the order with parsePageRange. */
|
|
95
|
+
export declare const PDF_PAGE_RANGE_PATTERN: RegExp;
|
|
96
|
+
export declare const PDF_PAGE_RANGE_MESSAGE = "Use a page or an ascending range such as 201-400.";
|
|
97
|
+
/** The first and last page of a range, or undefined when it is malformed or descending. */
|
|
98
|
+
export declare function parsePageRange(pages: string): {
|
|
99
|
+
first: number;
|
|
100
|
+
last: number;
|
|
101
|
+
} | undefined;
|
|
102
|
+
export interface PdfText {
|
|
103
|
+
text: string;
|
|
104
|
+
firstPage: number;
|
|
105
|
+
lastPage: number;
|
|
106
|
+
totalPages: number;
|
|
107
|
+
cut: boolean;
|
|
108
|
+
}
|
|
109
|
+
/** The text block describing an extraction, or none when extraction failed. */
|
|
110
|
+
export declare function pdfTextContent(filename: string, pdf: PdfText | undefined): Array<{
|
|
111
|
+
type: 'text';
|
|
112
|
+
text: string;
|
|
113
|
+
}>;
|
|
114
|
+
//# sourceMappingURL=results.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"results.d.ts","sourceRoot":"","sources":["../../src/mcp/results.ts"],"names":[],"mappings":"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"}
|