agenthub-multiagent-mcp 1.70.0 → 1.71.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.
@@ -0,0 +1,13 @@
1
+ export declare const ZOHO_MAX_SEND_ATTACHMENTS = 10;
2
+ export declare const ZOHO_MAX_ATTACHMENT_BYTES: number;
3
+ export declare const ZOHO_MAX_SEND_ATTACHMENT_BYTES: number;
4
+ export interface ZohoOutboundAttachment {
5
+ filename: string;
6
+ content_base64: string;
7
+ }
8
+ export declare function readZohoAttachments(paths: string[] | undefined, limits?: {
9
+ count: number;
10
+ perFile: number;
11
+ perMessage: number;
12
+ }): ZohoOutboundAttachment[];
13
+ //# sourceMappingURL=zohoAttachments.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"zohoAttachments.d.ts","sourceRoot":"","sources":["../src/zohoAttachments.ts"],"names":[],"mappings":"AAWA,eAAO,MAAM,yBAAyB,KAAK,CAAC;AAC5C,eAAO,MAAM,yBAAyB,QAAmB,CAAC;AAE1D,eAAO,MAAM,8BAA8B,QAAkB,CAAC;AAE9D,MAAM,WAAW,sBAAsB;IACrC,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,MAAM,EAAE,GAAG,SAAS,EAC3B,MAAM;;;;CAIL,GACA,sBAAsB,EAAE,CAyC1B"}
@@ -0,0 +1,62 @@
1
+ // add-zoho-send-reply-attachments — local files for zoho_send_email.
2
+ //
3
+ // The files are on this machine; the Zoho credentials are on the server. The
4
+ // MCP reads each file and sends it base64-encoded in the one send request (the
5
+ // slack_upload_file pattern). Everything is checked here first so a bad path
6
+ // fails the tool call before any request — never a partial send. The server
7
+ // re-checks the same caps and is authoritative.
8
+ import fs from "fs";
9
+ import path from "path";
10
+ export const ZOHO_MAX_SEND_ATTACHMENTS = 10;
11
+ export const ZOHO_MAX_ATTACHMENT_BYTES = 25 * 1024 * 1024;
12
+ // 7 MB: ~9.4 MB once base64-encoded, under the 10 MB the proxy accepts.
13
+ export const ZOHO_MAX_SEND_ATTACHMENT_BYTES = 7 * 1024 * 1024;
14
+ export function readZohoAttachments(paths, limits = {
15
+ count: ZOHO_MAX_SEND_ATTACHMENTS,
16
+ perFile: ZOHO_MAX_ATTACHMENT_BYTES,
17
+ perMessage: ZOHO_MAX_SEND_ATTACHMENT_BYTES,
18
+ }) {
19
+ if (!paths || paths.length === 0)
20
+ return [];
21
+ if (paths.length > limits.count) {
22
+ throw new Error(`At most ${limits.count} attachments per message; got ${paths.length}.`);
23
+ }
24
+ // Stat everything before reading anything, so the error names the first bad
25
+ // file without having loaded the others into memory.
26
+ let total = 0;
27
+ for (const p of paths) {
28
+ // A prompt-injected agent must not be able to mail out credentials:
29
+ // refuse anything inside a dot-directory or named as a dotfile
30
+ // (~/.ssh, ~/.agenthub/state, .env, ~/.aws, …).
31
+ if (path.resolve(p).split(/[\\/]/).some((seg) => seg.startsWith(".") && seg !== "." && seg !== "..")) {
32
+ throw new Error(`Refusing to attach a hidden file or a file inside a hidden folder: ${p}`);
33
+ }
34
+ let st;
35
+ try {
36
+ st = fs.statSync(p);
37
+ }
38
+ catch {
39
+ throw new Error(`Attachment not found or unreadable: ${p}`);
40
+ }
41
+ if (!st.isFile())
42
+ throw new Error(`Attachment is not a file: ${p}`);
43
+ if (st.size > limits.perFile) {
44
+ throw new Error(`Attachment ${p} is ${st.size} bytes; the per-file cap is ${limits.perFile}.`);
45
+ }
46
+ total += st.size;
47
+ if (total > limits.perMessage) {
48
+ throw new Error(`Attachments total more than the per-message cap of ${limits.perMessage} bytes (exceeded at ${p}).`);
49
+ }
50
+ }
51
+ return paths.map((p) => {
52
+ let content;
53
+ try {
54
+ content = fs.readFileSync(p);
55
+ }
56
+ catch {
57
+ throw new Error(`Attachment not found or unreadable: ${p}`);
58
+ }
59
+ return { filename: path.basename(p), content_base64: content.toString("base64") };
60
+ });
61
+ }
62
+ //# sourceMappingURL=zohoAttachments.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"zohoAttachments.js","sourceRoot":"","sources":["../src/zohoAttachments.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=zohoAttachments.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"zohoAttachments.test.d.ts","sourceRoot":"","sources":["../src/zohoAttachments.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,51 @@
1
+ import { describe, it, expect, beforeEach, afterEach } from "vitest";
2
+ import fs from "fs";
3
+ import os from "os";
4
+ import path from "path";
5
+ import { readZohoAttachments } from "./zohoAttachments.js";
6
+ describe("readZohoAttachments", () => {
7
+ let dir;
8
+ beforeEach(() => {
9
+ dir = fs.mkdtempSync(path.join(os.tmpdir(), "zatt-"));
10
+ });
11
+ afterEach(() => {
12
+ fs.rmSync(dir, { recursive: true, force: true });
13
+ });
14
+ const file = (name, content) => {
15
+ const p = path.join(dir, name);
16
+ fs.writeFileSync(p, content);
17
+ return p;
18
+ };
19
+ it("returns base names and base64 content", () => {
20
+ const out = readZohoAttachments([file("report.docx", "docx"), file("data.xlsx", "xlsx")]);
21
+ expect(out).toEqual([
22
+ { filename: "report.docx", content_base64: Buffer.from("docx").toString("base64") },
23
+ { filename: "data.xlsx", content_base64: Buffer.from("xlsx").toString("base64") },
24
+ ]);
25
+ });
26
+ it("returns nothing for no paths", () => {
27
+ expect(readZohoAttachments(undefined)).toEqual([]);
28
+ expect(readZohoAttachments([])).toEqual([]);
29
+ });
30
+ it("fails naming a missing file", () => {
31
+ const missing = path.join(dir, "nope.pdf");
32
+ expect(() => readZohoAttachments([file("a.pdf", "x"), missing])).toThrow(missing);
33
+ });
34
+ it("refuses hidden files and files in hidden folders", () => {
35
+ fs.mkdirSync(path.join(dir, ".ssh"));
36
+ const key = path.join(dir, ".ssh", "id_ed25519");
37
+ fs.writeFileSync(key, "secret");
38
+ expect(() => readZohoAttachments([key])).toThrow(/hidden/);
39
+ expect(() => readZohoAttachments([file(".env", "K=V")])).toThrow(/hidden/);
40
+ });
41
+ it("refuses a directory", () => {
42
+ expect(() => readZohoAttachments([dir])).toThrow(/not a file/);
43
+ });
44
+ it("enforces the per-file, per-message and count caps", () => {
45
+ const limits = { count: 2, perFile: 5, perMessage: 8 };
46
+ expect(() => readZohoAttachments([file("big.pdf", "123456")], limits)).toThrow(/big\.pdf.*per-file/);
47
+ expect(() => readZohoAttachments([file("a.pdf", "12345"), file("b.pdf", "12345")], limits)).toThrow(/per-message/);
48
+ expect(() => readZohoAttachments([file("1", "1"), file("2", "2"), file("3", "3")], limits)).toThrow(/At most 2/);
49
+ });
50
+ });
51
+ //# sourceMappingURL=zohoAttachments.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"zohoAttachments.test.js","sourceRoot":"","sources":["../src/zohoAttachments.test.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "agenthub-multiagent-mcp",
3
- "version": "1.70.0",
3
+ "version": "1.71.0",
4
4
  "description": "MCP server for AgentHub multi-agent communication",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",