diff --git a/src/approval-contract.ts b/src/approval-contract.ts index 654f955..c1565e7 100644 --- a/src/approval-contract.ts +++ b/src/approval-contract.ts @@ -1 +1,4 @@ export const APPROVAL_BATCH_LIMIT = 20; +export const XFT_ATTACHMENT_MAX_FILE_BYTES = 50 * 1024 * 1024; +export const XFT_ATTACHMENT_MAX_FILES_PER_SUBMISSION = 10; +export const XFT_ATTACHMENT_MAX_TOTAL_BYTES = 50 * 1024 * 1024; diff --git a/src/bridge.ts b/src/bridge.ts index d26e191..0710188 100644 --- a/src/bridge.ts +++ b/src/bridge.ts @@ -12,14 +12,14 @@ import { StreamableHTTPClientTransport } from "@modelcontextprotocol/sdk/client/ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js"; import { z } from "zod"; -import { APPROVAL_BATCH_LIMIT } from "./approval-contract.js"; -import { isDirectEntrypoint } from "./entrypoint.js"; -import { APPLICATION_VERSION } from "./version.js"; import { + APPROVAL_BATCH_LIMIT, XFT_ATTACHMENT_MAX_FILE_BYTES, XFT_ATTACHMENT_MAX_FILES_PER_SUBMISSION, XFT_ATTACHMENT_MAX_TOTAL_BYTES, -} from "./xft.js"; +} from "./approval-contract.js"; +import { isDirectEntrypoint } from "./entrypoint.js"; +import { APPLICATION_VERSION } from "./version.js"; interface BridgeState { client?: { client_id: string; client_secret?: string }; diff --git a/src/server.ts b/src/server.ts index 4f8c916..f0beef7 100644 --- a/src/server.ts +++ b/src/server.ts @@ -9,7 +9,11 @@ import { requireBearerAuth } from "@modelcontextprotocol/sdk/server/auth/middlew import type { AuthInfo } from "@modelcontextprotocol/sdk/server/auth/types.js"; import { isInitializeRequest } from "@modelcontextprotocol/sdk/types.js"; import { z } from "zod"; -import { APPROVAL_BATCH_LIMIT } from "./approval-contract.js"; +import { + APPROVAL_BATCH_LIMIT, + XFT_ATTACHMENT_MAX_FILE_BYTES, + XFT_ATTACHMENT_MAX_FILES_PER_SUBMISSION, +} from "./approval-contract.js"; import { ApprovalService } from "./approval-service.js"; import { ApprovalSafetyError, XftApiError, errorMessage } from "./errors.js"; import type { AppConfig } from "./config.js"; @@ -23,7 +27,6 @@ import type { AuthenticatedDingTalkUser } from "./xft.js"; import { InvoiceDeduplicationService, InvoiceDedupStore, invoiceDedupDatabasePath } from "./invoice-dedup.js"; import { APPLICATION_VERSION } from "./version.js"; import { SignedReferenceCodec } from "./signed-reference.js"; -import { XFT_ATTACHMENT_MAX_FILE_BYTES, XFT_ATTACHMENT_MAX_FILES_PER_SUBMISSION } from "./xft.js"; type TransportEntry = | { kind: "streamable"; transport: StreamableHTTPServerTransport; userId: string; createdAt: number; lastSeenAt: number } diff --git a/src/unified-approval.ts b/src/unified-approval.ts index 78b4354..c1aafca 100644 --- a/src/unified-approval.ts +++ b/src/unified-approval.ts @@ -1,12 +1,14 @@ import { createCipheriv, createDecipheriv, createHash, createHmac, randomBytes } from "node:crypto"; -import { APPROVAL_BATCH_LIMIT } from "./approval-contract.js"; +import { + APPROVAL_BATCH_LIMIT, + XFT_ATTACHMENT_MAX_FILE_BYTES, + XFT_ATTACHMENT_MAX_FILES_PER_SUBMISSION, + XFT_ATTACHMENT_MAX_TOTAL_BYTES, +} from "./approval-contract.js"; import type { AppConfig } from "./config.js"; import { ApprovalSafetyError, XftSessionExpiredError, errorMessage } from "./errors.js"; import { ApprovalService, type ApprovalHistoryItem, type ProcessApprovalItem, type TodoItem } from "./approval-service.js"; import { - XFT_ATTACHMENT_MAX_FILE_BYTES, - XFT_ATTACHMENT_MAX_FILES_PER_SUBMISSION, - XFT_ATTACHMENT_MAX_TOTAL_BYTES, type ApprovalHistoryRange, type ApprovalHistoryScope, type AuthenticatedDingTalkUser, diff --git a/src/xft-open-api.ts b/src/xft-open-api.ts index 0750e57..bfacdd5 100644 --- a/src/xft-open-api.ts +++ b/src/xft-open-api.ts @@ -1,5 +1,9 @@ import { createHash, randomBytes } from "node:crypto"; import smCrypto from "sm-crypto"; +import { + XFT_ATTACHMENT_MAX_FILE_BYTES, + XFT_ATTACHMENT_MAX_FILES_PER_SUBMISSION, +} from "./approval-contract.js"; import type { AppConfig } from "./config.js"; import { ApprovalSafetyError, XftApiError, errorMessage } from "./errors.js"; import { isRecord as isObject, filterQuery } from "./json.js"; @@ -14,8 +18,6 @@ import { type XftApprovalProvider, type XftHistoryItem, type XftSubmissionField, - XFT_ATTACHMENT_MAX_FILE_BYTES, - XFT_ATTACHMENT_MAX_FILES_PER_SUBMISSION, type XftResolvedSubmissionAttachment, type XftSubmissionAttachmentUpload, type XftSubmissionKind, diff --git a/src/xft.ts b/src/xft.ts index ca856af..ce4fec9 100644 --- a/src/xft.ts +++ b/src/xft.ts @@ -65,10 +65,6 @@ export type XftSubmissionKind = | "common_reimburse" | "travel_reimburse"; -export const XFT_ATTACHMENT_MAX_FILE_BYTES = 50 * 1024 * 1024; -export const XFT_ATTACHMENT_MAX_FILES_PER_SUBMISSION = 10; -export const XFT_ATTACHMENT_MAX_TOTAL_BYTES = 50 * 1024 * 1024; - export interface XftSubmissionTemplate { eventSeqId: string; eventNumber: string;