@opengeni/runtime 3.0.1 → 4.0.0-canary.35585322809001
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/assets/codemode-client.json +1 -0
- package/dist/chunk-4A4XTKKX.js +1 -0
- package/dist/{chunk-RIJ6DCYS.js → chunk-HCGLD7NH.js} +9817 -9494
- package/dist/chunk-HCGLD7NH.js.map +1 -0
- package/dist/{chunk-FHGLYLBL.js → chunk-SPT3PLMX.js} +1 -87
- package/dist/chunk-SPT3PLMX.js.map +1 -0
- package/dist/{chunk-GB763TSV.js → chunk-TE27J65Q.js} +1 -1
- package/dist/chunk-TE27J65Q.js.map +1 -0
- package/dist/{chunk-46BFUGFL.js → chunk-WIHICNWS.js} +1660 -388
- package/dist/chunk-WIHICNWS.js.map +1 -0
- package/dist/{chunk-UU6EJR52.js → chunk-YU4VRTR4.js} +2 -2
- package/dist/chunk-YU4VRTR4.js.map +1 -0
- package/dist/chunk-ZG2YH25H.js +94 -0
- package/dist/chunk-ZG2YH25H.js.map +1 -0
- package/dist/codex-tool-search.d.ts +5 -4
- package/dist/context-compaction.d.ts +19 -0
- package/dist/gmail-rest-mcp.js +1 -1
- package/dist/index.d.ts +30 -22
- package/dist/index.js +25 -5
- package/dist/lazy-manifest-OEYEHNVY.js +45 -0
- package/dist/lazy-manifest-OEYEHNVY.js.map +1 -0
- package/dist/lazy-manifest.d.ts +6 -0
- package/dist/lazy-tool-transport.d.ts +3 -2
- package/dist/{localSources-PVFCAPN2.js → localSources-TWHTEKGO.js} +3 -2
- package/dist/localSources-TWHTEKGO.js.map +1 -0
- package/dist/metrics.d.ts +6 -0
- package/dist/operational-instructions.d.ts +1 -1
- package/dist/prepared-compaction-request.d.ts +8 -0
- package/dist/provider-history-adapter.d.ts +2 -2
- package/dist/runtime-skills.d.ts +3 -10
- package/dist/sandbox/codemode-client.d.ts +17 -0
- package/dist/sandbox/codemode-token.d.ts +3 -3
- package/dist/sandbox/index.d.ts +2 -1
- package/dist/sandbox/index.js +8 -2
- package/dist/sandbox/materialization-verification-error.d.ts +27 -0
- package/dist/sandbox/provider-command-session.d.ts +44 -2
- package/dist/sandbox/providers/modal-command-control.d.ts +32 -29
- package/dist/sandbox/providers/modal-command-router-wire.d.ts +49 -0
- package/dist/sandbox/providers/modal-command-session.d.ts +2 -1
- package/dist/sandbox/providers/modal-legacy-command-control.d.ts +50 -0
- package/dist/sandbox/providers/modal-materialization-verification.d.ts +7 -0
- package/dist/sandbox/providers/modal.d.ts +0 -8
- package/dist/sandbox/routing/routing-session.d.ts +21 -0
- package/dist/sandbox/turn-tool-cancellation.d.ts +1 -0
- package/dist/skill-library.d.ts +0 -6
- package/dist/skill-library.js +1 -1
- package/dist/workspace-tool-gateway.js +7 -5
- package/package.json +13 -11
- package/src/bundled_artifact_skills/opengeni-documents/SKILL.md +19 -0
- package/src/bundled_artifact_skills/opengeni-documents/references/api.md +22 -0
- package/src/bundled_default_skills/opengeni-client/SKILL.md +349 -0
- package/src/bundled_default_skills/opengeni-client/agents/openai.yaml +4 -0
- package/src/bundled_default_skills/opengeni-client/references/api-workflows.md +256 -0
- package/src/bundled_default_skills/opengeni-client/references/compatibility-and-troubleshooting.md +84 -0
- package/src/bundled_default_skills/opengeni-client/references/customer-skill-template.md +96 -0
- package/src/bundled_default_skills/opengeni-client/references/data-tools-and-credentials.md +99 -0
- package/src/bundled_default_skills/opengeni-client/references/discovery-and-autonomy.md +81 -0
- package/src/bundled_default_skills/opengeni-client/references/external-users-and-connect.md +457 -0
- package/src/bundled_default_skills/opengeni-client/references/isolation-and-authorization.md +77 -0
- package/src/bundled_default_skills/opengeni-client/references/product-integration-shapes.md +232 -0
- package/src/bundled_default_skills/opengeni-client/references/product-shapes-and-ui.md +116 -0
- package/src/bundled_default_skills/opengeni-client/references/runtime-profile-and-verification.md +157 -0
- package/src/bundled_default_skills/opengeni-help/SKILL.md +101 -0
- package/src/bundled_management_skills/opengeni-skills/SKILL.md +33 -3
- package/src/codex-tool-search.ts +13 -5
- package/src/context-compaction.ts +87 -4
- package/src/gmail-rest-mcp.ts +1 -2
- package/src/index.ts +363 -131
- package/src/lazy-manifest.ts +55 -0
- package/src/lazy-tool-transport.ts +15 -2
- package/src/metrics.ts +6 -0
- package/src/model-request-capture.ts +3 -0
- package/src/operational-instructions.ts +11 -2
- package/src/prepared-compaction-request.ts +51 -0
- package/src/provider-history-adapter.ts +12 -3
- package/src/runtime-skills.ts +3 -17
- package/src/sandbox/codemode-client.ts +204 -0
- package/src/sandbox/codemode-token.ts +7 -2
- package/src/sandbox/index.ts +7 -0
- package/src/sandbox/materialization-verification-error.ts +65 -0
- package/src/sandbox/provider-command-session.ts +70 -2
- package/src/sandbox/providers/modal-command-control.ts +386 -242
- package/src/sandbox/providers/modal-command-router-wire.ts +248 -0
- package/src/sandbox/providers/modal-command-session.ts +177 -4
- package/src/sandbox/providers/modal-legacy-command-control.ts +351 -0
- package/src/sandbox/providers/modal-materialization-verification.ts +122 -0
- package/src/sandbox/providers/modal.ts +1 -9
- package/src/sandbox/routing/routing-session.ts +417 -79
- package/src/sandbox/turn-tool-cancellation.ts +38 -2
- package/src/skill-catalog.ts +1 -0
- package/src/skill-library.ts +0 -6
- package/src/workspace-governance.ts +0 -1
- package/src/workspace-skills.ts +114 -74
- package/dist/chunk-46BFUGFL.js.map +0 -1
- package/dist/chunk-FHGLYLBL.js.map +0 -1
- package/dist/chunk-GB763TSV.js.map +0 -1
- package/dist/chunk-RIJ6DCYS.js.map +0 -1
- package/dist/chunk-UU6EJR52.js.map +0 -1
- /package/dist/{localSources-PVFCAPN2.js.map → chunk-4A4XTKKX.js.map} +0 -0
|
@@ -229,7 +229,7 @@ var GMAIL_REST_MCP_TOOLS = [
|
|
|
229
229
|
}
|
|
230
230
|
];
|
|
231
231
|
function isOfficialGmailMcpConfig(url, connectionRef) {
|
|
232
|
-
return canonicalUrl(url) === canonicalUrl(OFFICIAL_GMAIL_MCP_URL) && connectionRef?.providerDomain.toLowerCase() === "gmailmcp.googleapis.com" && connectionRef.kind === "oauth2"
|
|
232
|
+
return canonicalUrl(url) === canonicalUrl(OFFICIAL_GMAIL_MCP_URL) && connectionRef?.providerDomain.toLowerCase() === "gmailmcp.googleapis.com" && connectionRef.kind === "oauth2";
|
|
233
233
|
}
|
|
234
234
|
var GmailRestMcpServer = class {
|
|
235
235
|
constructor(options) {
|
|
@@ -988,4 +988,4 @@ export {
|
|
|
988
988
|
GMAIL_REST_MCP_BRIDGE_ADAPTER,
|
|
989
989
|
gmailRestToolIsMutation
|
|
990
990
|
};
|
|
991
|
-
//# sourceMappingURL=chunk-
|
|
991
|
+
//# sourceMappingURL=chunk-YU4VRTR4.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/gmail-rest-mcp.ts"],"sourcesContent":["import type { McpServerConnectionRef, ToolAuthNeededPayload } from \"@opengeni/contracts\";\nimport {\n defineLocalMcpBridgeDescriptor,\n type LocalMcpBridgeAdapter,\n type LocalMcpBridgeDescriptor,\n type LocalMcpBridgeServer,\n} from \"@opengeni/capabilities\";\nimport { readResponseJsonBounded, type FetchLike } from \"@opengeni/network\";\nimport type { MCPServer } from \"@openai/agents\";\nimport { Buffer } from \"node:buffer\";\n\nexport const OFFICIAL_GMAIL_MCP_URL = \"https://gmailmcp.googleapis.com/mcp/v1\";\nexport const GMAIL_REST_API_BASE = \"https://gmail.googleapis.com/gmail/v1/users/me\";\n\nconst GOOGLE_RESPONSE_MAX_BYTES = 8 * 1024 * 1024;\nconst MAX_BODY_CHARS = 256 * 1024;\nconst MAX_ATTACHMENT_BYTES = 25 * 1024 * 1024;\nconst MAX_PAGE_SIZE = 50;\nconst REQUEST_TIMEOUT_MS = 15_000;\nconst MUTATION_TOOLS = new Set([\n \"create_draft\",\n \"send_message\",\n \"send_draft\",\n \"label_message\",\n \"label_thread\",\n \"unlabel_message\",\n \"unlabel_thread\",\n]);\nconst SENSITIVE_ADD_LABELS = new Set([\"TRASH\", \"SPAM\"]);\n\ntype ResolveCredentialResult =\n | {\n status: \"ok\";\n headers: Record<string, string>;\n connectionId: string;\n authoritySource?: \"host\";\n authorizeProviderRequest?: () => Promise<boolean>;\n expiresAt?: Date | null;\n }\n | {\n status: \"auth_needed\";\n reason: ToolAuthNeededPayload[\"reason\"];\n providerDomain: string;\n authoritySource?: \"host\";\n provider?: string;\n connectionId?: string;\n scopes?: string[];\n resource?: string;\n selectedResources?: McpServerConnectionRef[\"selectedResources\"];\n authorizationUrl?: string;\n };\n\nexport type GmailRestMcpServerOptions = {\n workspaceId: string;\n subjectId?: string;\n serverId: string;\n connectionRef: McpServerConnectionRef;\n resolveCredential: (input: {\n workspaceId: string;\n subjectId?: string;\n serverId: string;\n toolName?: string;\n connectionRef: McpServerConnectionRef;\n destinationUrl: string;\n forceRefresh?: boolean;\n }) => Promise<ResolveCredentialResult>;\n onAuthNeeded?: (payload: ToolAuthNeededPayload) => void | Promise<void>;\n onResolvedConnectionId?: (connectionId: string) => void;\n fetchImpl?: FetchLike;\n};\n\nexport type GmailRestMcpBridgeConfig = {\n readonly url: string;\n readonly connectionRef?: McpServerConnectionRef;\n};\n\nexport type GmailRestMcpBridgeContext = Omit<\n GmailRestMcpServerOptions,\n \"serverId\" | \"connectionRef\"\n> & {\n readonly serverId: string;\n};\n\nexport const GMAIL_REST_MCP_BRIDGE_DESCRIPTOR = defineLocalMcpBridgeDescriptor({\n adapterId: \"gmail-rest\",\n providerId: \"google-gmail\",\n catalogIdentity: `mcp:${OFFICIAL_GMAIL_MCP_URL}`,\n authority: \"connection\",\n toolSurface: \"static_reviewed\",\n mutationReplay: \"safe_reads_only\",\n destinations: [{ origin: \"https://gmail.googleapis.com\", pathPrefix: \"/gmail/v1/users/me/\" }],\n});\n\ntype GmailHeader = { name?: string; value?: string };\ntype GmailPart = {\n mimeType?: string;\n filename?: string;\n headers?: GmailHeader[];\n body?: { attachmentId?: string; size?: number; data?: string };\n parts?: GmailPart[];\n};\ntype GmailMessage = {\n id?: string;\n threadId?: string;\n labelIds?: string[];\n snippet?: string;\n internalDate?: string;\n sizeEstimate?: number;\n payload?: GmailPart;\n};\ntype GmailLabel = {\n id?: string;\n name?: string;\n type?: string;\n color?: { textColor?: string; backgroundColor?: string };\n threadsTotal?: number;\n threadsUnread?: number;\n};\n\ntype GmailTool = Awaited<ReturnType<MCPServer[\"listTools\"]>>[number];\n\nconst messageFormatSchema = {\n type: \"string\",\n enum: [\"MESSAGE_FORMAT_UNSPECIFIED\", \"MINIMAL\", \"FULL_CONTENT\", \"METADATA_ONLY\"],\n description: \"Controls whether metadata, snippets, or full message bodies are returned.\",\n} as const;\n\nconst labelMutationProperties = {\n labelIds: {\n type: \"array\",\n items: { type: \"string\" },\n description: \"Label IDs returned by list_labels.\",\n },\n} as const;\n\nexport const GMAIL_REST_MCP_TOOLS: GmailTool[] = [\n {\n name: \"create_draft\",\n description: \"Creates a Gmail draft. This never sends the message.\",\n inputSchema: {\n type: \"object\",\n required: [],\n additionalProperties: false,\n properties: {\n to: { type: \"array\", items: { type: \"string\" } },\n cc: { type: \"array\", items: { type: \"string\" } },\n bcc: { type: \"array\", items: { type: \"string\" } },\n subject: { type: \"string\" },\n body: { type: \"string\" },\n htmlBody: { type: \"string\" },\n replyToMessageId: { type: \"string\" },\n attachments: {\n type: \"array\",\n items: {\n type: \"object\",\n required: [\"content\"],\n properties: {\n content: { type: \"string\", description: \"Base64-encoded attachment bytes.\" },\n filename: { type: \"string\" },\n mimeType: { type: \"string\" },\n inline: { type: \"boolean\" },\n },\n },\n },\n },\n },\n },\n {\n name: \"send_message\",\n description:\n \"Sends a new email immediately from the connected Gmail account. Requires human approval before it runs; there is no way to un-send.\",\n inputSchema: {\n type: \"object\",\n required: [\"to\"],\n additionalProperties: false,\n properties: {\n to: { type: \"array\", items: { type: \"string\" }, minItems: 1 },\n cc: { type: \"array\", items: { type: \"string\" } },\n bcc: { type: \"array\", items: { type: \"string\" } },\n subject: { type: \"string\" },\n body: { type: \"string\" },\n htmlBody: { type: \"string\" },\n replyToMessageId: { type: \"string\" },\n attachments: {\n type: \"array\",\n items: {\n type: \"object\",\n required: [\"content\"],\n properties: {\n content: { type: \"string\", description: \"Base64-encoded attachment bytes.\" },\n filename: { type: \"string\" },\n mimeType: { type: \"string\" },\n inline: { type: \"boolean\" },\n },\n },\n },\n },\n },\n },\n {\n name: \"send_draft\",\n description:\n \"Sends an existing Gmail draft as-is. Requires human approval before it runs; there is no way to un-send. Use get_message on the draft's message ID to review its content first.\",\n inputSchema: {\n type: \"object\",\n required: [\"draftId\"],\n additionalProperties: false,\n properties: {\n draftId: { type: \"string\" },\n },\n },\n },\n {\n name: \"list_drafts\",\n description: \"Lists Gmail drafts with bounded pagination.\",\n inputSchema: {\n type: \"object\",\n required: [],\n additionalProperties: false,\n properties: {\n pageSize: { type: \"integer\", minimum: 1, maximum: MAX_PAGE_SIZE },\n pageToken: { type: \"string\" },\n query: { type: \"string\" },\n view: {\n type: \"string\",\n enum: [\"DRAFT_VIEW_UNSPECIFIED\", \"DRAFT_VIEW_METADATA_ONLY\", \"DRAFT_VIEW_FULL\"],\n },\n },\n },\n },\n {\n name: \"get_thread\",\n description: \"Retrieves one Gmail thread and its messages.\",\n inputSchema: {\n type: \"object\",\n required: [\"threadId\"],\n additionalProperties: false,\n properties: { threadId: { type: \"string\" }, messageFormat: messageFormatSchema },\n },\n },\n {\n name: \"get_message\",\n description: \"Retrieves one Gmail message by ID.\",\n inputSchema: {\n type: \"object\",\n required: [\"messageId\"],\n additionalProperties: false,\n properties: { messageId: { type: \"string\" }, messageFormat: messageFormatSchema },\n },\n },\n {\n name: \"search_threads\",\n description: \"Searches Gmail threads using Gmail query syntax.\",\n inputSchema: {\n type: \"object\",\n required: [],\n additionalProperties: false,\n properties: {\n query: { type: \"string\" },\n pageSize: { type: \"integer\", minimum: 1, maximum: MAX_PAGE_SIZE },\n pageToken: { type: \"string\" },\n includeTrash: { type: \"boolean\" },\n view: {\n type: \"string\",\n enum: [\"THREAD_VIEW_UNSPECIFIED\", \"THREAD_VIEW_METADATA_ONLY\", \"THREAD_VIEW_MINIMAL\"],\n },\n },\n },\n },\n {\n name: \"label_thread\",\n description: \"Adds non-sensitive labels to a Gmail thread.\",\n inputSchema: {\n type: \"object\",\n required: [\"threadId\", \"labelIds\"],\n additionalProperties: false,\n properties: { threadId: { type: \"string\" }, ...labelMutationProperties },\n },\n },\n {\n name: \"unlabel_thread\",\n description: \"Removes labels from a Gmail thread.\",\n inputSchema: {\n type: \"object\",\n required: [\"threadId\", \"labelIds\"],\n additionalProperties: false,\n properties: { threadId: { type: \"string\" }, ...labelMutationProperties },\n },\n },\n {\n name: \"list_labels\",\n description: \"Lists user-defined Gmail labels with bounded pagination.\",\n inputSchema: {\n type: \"object\",\n properties: {\n pageSize: { type: \"integer\", minimum: 1, maximum: MAX_PAGE_SIZE },\n pageToken: { type: \"string\" },\n },\n required: [],\n additionalProperties: false,\n },\n },\n {\n name: \"label_message\",\n description: \"Adds non-sensitive labels to a Gmail message.\",\n inputSchema: {\n type: \"object\",\n required: [\"messageId\", \"labelIds\"],\n additionalProperties: false,\n properties: { messageId: { type: \"string\" }, ...labelMutationProperties },\n },\n },\n {\n name: \"unlabel_message\",\n description: \"Removes labels from a Gmail message.\",\n inputSchema: {\n type: \"object\",\n required: [\"messageId\", \"labelIds\"],\n additionalProperties: false,\n properties: { messageId: { type: \"string\" }, ...labelMutationProperties },\n },\n },\n];\n\nexport function isOfficialGmailMcpConfig(\n url: string,\n connectionRef: McpServerConnectionRef | undefined,\n): boolean {\n return (\n canonicalUrl(url) === canonicalUrl(OFFICIAL_GMAIL_MCP_URL) &&\n connectionRef?.providerDomain.toLowerCase() === \"gmailmcp.googleapis.com\" &&\n connectionRef.kind === \"oauth2\"\n );\n}\n\nexport class GmailRestMcpServer implements LocalMcpBridgeServer {\n readonly name: string;\n readonly cacheToolsList = false;\n readonly bridge: LocalMcpBridgeDescriptor = GMAIL_REST_MCP_BRIDGE_DESCRIPTOR;\n private readonly fetchImpl: FetchLike;\n\n constructor(private readonly options: GmailRestMcpServerOptions) {\n this.name = `opengeni-gmail-rest-${safeIdentity(options.serverId)}`;\n this.fetchImpl = options.fetchImpl ?? globalThis.fetch.bind(globalThis);\n }\n\n async connect(): Promise<void> {\n const result = await this.options.resolveCredential({\n workspaceId: this.options.workspaceId,\n serverId: this.options.serverId,\n connectionRef: this.options.connectionRef,\n destinationUrl: `${GMAIL_REST_API_BASE}/labels`,\n forceRefresh: false,\n ...(this.options.subjectId ? { subjectId: this.options.subjectId } : {}),\n });\n if (result.status === \"auth_needed\") {\n await this.reportAuthNeeded(result);\n throw new GmailRestAuthError(\"Authentication required for Gmail\");\n }\n this.options.onResolvedConnectionId?.(result.connectionId);\n }\n async close(): Promise<void> {}\n async invalidateToolsCache(): Promise<void> {}\n\n async listTools(): Promise<GmailTool[]> {\n return GMAIL_REST_MCP_TOOLS.map((tool) => ({ ...tool }));\n }\n\n async callTool(toolName: string, args: Record<string, unknown> | null): Promise<any> {\n return (await this.callToolResult(toolName, args)).content;\n }\n\n async callToolResult(toolName: string, args: Record<string, unknown> | null): Promise<any> {\n try {\n const input = args ?? {};\n const output = await this.execute(toolName, input);\n return {\n content: [{ type: \"text\", text: JSON.stringify(output) }],\n structuredContent: output,\n };\n } catch (error) {\n return {\n isError: true,\n content: [{ type: \"text\", text: safeErrorMessage(error) }],\n };\n }\n }\n\n private async execute(toolName: string, args: Record<string, unknown>): Promise<unknown> {\n switch (toolName) {\n case \"list_labels\":\n return await this.listLabels(args);\n case \"get_message\":\n return await this.getMessage(args);\n case \"get_thread\":\n return await this.getThread(args);\n case \"search_threads\":\n return await this.searchThreads(args);\n case \"list_drafts\":\n return await this.listDrafts(args);\n case \"create_draft\":\n return await this.createDraft(args);\n case \"send_message\":\n return await this.sendMessage(args);\n case \"send_draft\":\n return await this.sendDraft(args);\n case \"label_message\":\n return await this.modifyLabels(\"messages\", args, true, false);\n case \"unlabel_message\":\n return await this.modifyLabels(\"messages\", args, false, false);\n case \"label_thread\":\n return await this.modifyLabels(\"threads\", args, true, true);\n case \"unlabel_thread\":\n return await this.modifyLabels(\"threads\", args, false, true);\n default:\n throw new GmailRestInputError(`Unsupported Gmail tool: ${toolName}`);\n }\n }\n\n private async listLabels(args: Record<string, unknown>): Promise<unknown> {\n const pageSize = boundedPageSize(args.pageSize);\n const offset = labelPageOffset(args.pageToken);\n const payload = await this.request<{ labels?: GmailLabel[] }>(\n \"list_labels\",\n `${GMAIL_REST_API_BASE}/labels`,\n {},\n true,\n );\n const labels = (payload.labels ?? [])\n .filter((label) => label.type?.toLowerCase() === \"user\" && Boolean(label.id))\n .map((label) => ({\n labelId: label.id!,\n name: label.name ?? \"\",\n ...(label.color\n ? {\n color: {\n ...(label.color.textColor ? { textColor: label.color.textColor } : {}),\n ...(label.color.backgroundColor\n ? { backgroundColor: label.color.backgroundColor }\n : {}),\n },\n }\n : {}),\n ...(Number.isInteger(label.threadsTotal) ? { threadsTotal: label.threadsTotal } : {}),\n ...(Number.isInteger(label.threadsUnread) ? { threadsUnread: label.threadsUnread } : {}),\n }));\n const page = labels.slice(offset, offset + pageSize);\n const nextOffset = offset + page.length;\n return {\n labels: page,\n ...(nextOffset < labels.length ? { nextPageToken: `opengeni-rest:${nextOffset}` } : {}),\n };\n }\n\n private async getMessage(args: Record<string, unknown>): Promise<unknown> {\n const messageId = requiredId(args.messageId, \"messageId\");\n const view = messageView(args.messageFormat);\n const url = new URL(`${GMAIL_REST_API_BASE}/messages/${encodeURIComponent(messageId)}`);\n url.searchParams.set(\"format\", view === \"full\" ? \"full\" : \"metadata\");\n if (view !== \"full\") {\n for (const header of MESSAGE_HEADERS) url.searchParams.append(\"metadataHeaders\", header);\n }\n const message = await this.request<GmailMessage>(\"get_message\", url, {}, true);\n return projectMessage(message, view);\n }\n\n private async getThread(args: Record<string, unknown>): Promise<unknown> {\n const threadId = requiredId(args.threadId, \"threadId\");\n const view = messageView(args.messageFormat);\n const url = new URL(`${GMAIL_REST_API_BASE}/threads/${encodeURIComponent(threadId)}`);\n url.searchParams.set(\"format\", view === \"full\" ? \"full\" : \"metadata\");\n if (view !== \"full\") {\n for (const header of MESSAGE_HEADERS) url.searchParams.append(\"metadataHeaders\", header);\n }\n const thread = await this.request<{\n id?: string;\n historyId?: string;\n messages?: GmailMessage[];\n }>(\"get_thread\", url, {}, true);\n return {\n id: thread.id ?? threadId,\n historyId: thread.historyId ?? null,\n messages: (thread.messages ?? []).map((message) => projectMessage(message, view)),\n };\n }\n\n private async searchThreads(args: Record<string, unknown>): Promise<unknown> {\n const pageSize = boundedPageSize(args.pageSize);\n const view = threadView(args.view);\n const url = new URL(`${GMAIL_REST_API_BASE}/threads`);\n url.searchParams.set(\"maxResults\", String(pageSize));\n const query = optionalString(args.query, \"query\", 4_096);\n if (query) url.searchParams.set(\"q\", query);\n const pageToken = optionalString(args.pageToken, \"pageToken\", 4_096);\n if (pageToken) url.searchParams.set(\"pageToken\", pageToken);\n if (args.includeTrash === true) url.searchParams.set(\"includeSpamTrash\", \"true\");\n const listed = await this.request<{\n threads?: Array<{ id?: string; snippet?: string; historyId?: string }>;\n nextPageToken?: string;\n resultSizeEstimate?: number;\n }>(\"search_threads\", url, {}, true);\n const threads = await boundedMap(listed.threads ?? [], 5, async (thread) => {\n if (!thread.id) return null;\n const detailUrl = new URL(`${GMAIL_REST_API_BASE}/threads/${encodeURIComponent(thread.id)}`);\n detailUrl.searchParams.set(\"format\", \"metadata\");\n for (const header of MESSAGE_HEADERS)\n detailUrl.searchParams.append(\"metadataHeaders\", header);\n const detail = await this.request<{ id?: string; messages?: GmailMessage[] }>(\n \"search_threads\",\n detailUrl,\n {},\n true,\n );\n return {\n id: detail.id ?? thread.id,\n messages: (detail.messages ?? []).map((message) =>\n projectMessage(message, view === \"metadata\" ? \"metadata\" : \"minimal\"),\n ),\n };\n });\n return {\n threads: threads.filter((thread): thread is NonNullable<typeof thread> => thread !== null),\n ...(listed.nextPageToken ? { nextPageToken: listed.nextPageToken } : {}),\n ...(Number.isFinite(listed.resultSizeEstimate)\n ? { resultCountEstimate: String(listed.resultSizeEstimate) }\n : {}),\n };\n }\n\n private async listDrafts(args: Record<string, unknown>): Promise<unknown> {\n const pageSize = boundedPageSize(args.pageSize);\n const full = draftView(args.view) === \"full\";\n const url = new URL(`${GMAIL_REST_API_BASE}/drafts`);\n url.searchParams.set(\"maxResults\", String(pageSize));\n const query = optionalString(args.query, \"query\", 4_096);\n if (query) url.searchParams.set(\"q\", query);\n const pageToken = optionalString(args.pageToken, \"pageToken\", 4_096);\n if (pageToken) url.searchParams.set(\"pageToken\", pageToken);\n const listed = await this.request<{\n drafts?: Array<{ id?: string; message?: GmailMessage }>;\n nextPageToken?: string;\n }>(\"list_drafts\", url, {}, true);\n const drafts = await boundedMap(listed.drafts ?? [], 5, async (draft) => {\n if (!draft.id) return null;\n const detailUrl = new URL(`${GMAIL_REST_API_BASE}/drafts/${encodeURIComponent(draft.id)}`);\n detailUrl.searchParams.set(\"format\", full ? \"full\" : \"metadata\");\n if (!full) {\n for (const header of MESSAGE_HEADERS)\n detailUrl.searchParams.append(\"metadataHeaders\", header);\n }\n const detail = await this.request<{ id?: string; message?: GmailMessage }>(\n \"list_drafts\",\n detailUrl,\n {},\n true,\n );\n return {\n ...(detail.message ? projectMessage(detail.message, full ? \"full\" : \"metadata\") : {}),\n id: detail.id ?? draft.id,\n };\n });\n return {\n drafts: drafts.filter((draft): draft is NonNullable<typeof draft> => draft !== null),\n ...(listed.nextPageToken ? { nextPageToken: listed.nextPageToken } : {}),\n };\n }\n\n private async createDraft(args: Record<string, unknown>): Promise<unknown> {\n const replyToMessageId = optionalString(args.replyToMessageId, \"replyToMessageId\", 256);\n let reply: GmailMessage | null = null;\n if (replyToMessageId) {\n const url = new URL(\n `${GMAIL_REST_API_BASE}/messages/${encodeURIComponent(replyToMessageId)}`,\n );\n url.searchParams.set(\"format\", \"metadata\");\n for (const header of [\"Message-ID\", \"References\", \"Subject\", \"To\", \"From\"])\n url.searchParams.append(\"metadataHeaders\", header);\n reply = await this.request<GmailMessage>(\"create_draft\", url, {}, true);\n }\n const mime = buildDraftMime(args, reply);\n const created = await this.request<{\n id?: string;\n message?: { id?: string; threadId?: string };\n }>(\n \"create_draft\",\n `${GMAIL_REST_API_BASE}/drafts`,\n {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({\n message: {\n raw: Buffer.from(mime).toString(\"base64url\"),\n ...(reply?.threadId ? { threadId: reply.threadId } : {}),\n },\n }),\n },\n false,\n );\n return { id: created.id ?? null };\n }\n\n /**\n * Sends a freshly composed message immediately. Distinct from create_draft:\n * a message actually needs a recipient, and there is no reviewable\n * intermediate state - the human-approval gate on this tool IS the review.\n */\n private async sendMessage(args: Record<string, unknown>): Promise<unknown> {\n const to = optionalEmailArray(args.to, \"to\");\n if (to.length === 0) {\n throw new GmailRestInputError(\"to is required to send a message\");\n }\n const replyToMessageId = optionalString(args.replyToMessageId, \"replyToMessageId\", 256);\n let reply: GmailMessage | null = null;\n if (replyToMessageId) {\n const url = new URL(\n `${GMAIL_REST_API_BASE}/messages/${encodeURIComponent(replyToMessageId)}`,\n );\n url.searchParams.set(\"format\", \"metadata\");\n for (const header of [\"Message-ID\", \"References\", \"Subject\", \"To\", \"From\"])\n url.searchParams.append(\"metadataHeaders\", header);\n reply = await this.request<GmailMessage>(\"send_message\", url, {}, true);\n }\n const mime = buildDraftMime(args, reply);\n const sent = await this.request<{ id?: string; threadId?: string }>(\n \"send_message\",\n `${GMAIL_REST_API_BASE}/messages/send`,\n {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({\n raw: Buffer.from(mime).toString(\"base64url\"),\n ...(reply?.threadId ? { threadId: reply.threadId } : {}),\n }),\n },\n false,\n );\n return { id: sent.id ?? null, threadId: sent.threadId ?? null };\n }\n\n /** Sends an existing draft exactly as stored; the draft's own content is the review surface. */\n private async sendDraft(args: Record<string, unknown>): Promise<unknown> {\n const draftId = requiredId(args.draftId, \"draftId\");\n const sent = await this.request<{ id?: string; threadId?: string }>(\n \"send_draft\",\n `${GMAIL_REST_API_BASE}/drafts/send`,\n {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ id: draftId }),\n },\n false,\n );\n return { id: sent.id ?? null, threadId: sent.threadId ?? null };\n }\n\n private async modifyLabels(\n resource: \"messages\" | \"threads\",\n args: Record<string, unknown>,\n add: boolean,\n thread: boolean,\n ): Promise<unknown> {\n const idKey = thread ? \"threadId\" : \"messageId\";\n const id = requiredId(args[idKey], idKey);\n const labelIds = requiredStringArray(args.labelIds, \"labelIds\", 100, 256);\n if (add && labelIds.some((label) => SENSITIVE_ADD_LABELS.has(label.toUpperCase()))) {\n throw new GmailRestInputError(\"TRASH and SPAM cannot be added by this reviewed tool\");\n }\n const toolName = `${add ? \"label\" : \"unlabel\"}_${thread ? \"thread\" : \"message\"}`;\n const output = await this.request<GmailMessage>(\n toolName,\n `${GMAIL_REST_API_BASE}/${resource}/${encodeURIComponent(id)}/modify`,\n {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify(add ? { addLabelIds: labelIds } : { removeLabelIds: labelIds }),\n },\n false,\n );\n return {\n id: output.id ?? id,\n threadId: output.threadId ?? (thread ? id : null),\n labelIds: output.labelIds ?? [],\n };\n }\n\n private async reportAuthNeeded(\n result: Extract<ResolveCredentialResult, { status: \"auth_needed\" }>,\n toolName?: string,\n ): Promise<void> {\n await this.options.onAuthNeeded?.({\n serverId: this.options.serverId,\n ...(toolName ? { toolName } : {}),\n providerDomain: result.providerDomain,\n ...(result.provider ? { provider: result.provider } : {}),\n reason: result.reason,\n ...(result.connectionId ? { connectionId: result.connectionId } : {}),\n ...(result.authoritySource === \"host\" || this.options.connectionRef.authoritySource === \"host\"\n ? { authoritySource: \"host\" as const }\n : {}),\n ...(result.scopes ? { scopes: result.scopes } : {}),\n ...(result.resource ? { resource: result.resource } : {}),\n ...(result.selectedResources ? { selectedResources: result.selectedResources } : {}),\n ...(result.authorizationUrl ? { authorizationUrl: result.authorizationUrl } : {}),\n ...(this.options.subjectId ? { subjectId: this.options.subjectId } : {}),\n });\n }\n\n private async request<T>(\n toolName: string,\n urlInput: string | URL,\n init: RequestInit,\n replaySafe: boolean,\n ): Promise<T> {\n const url = new URL(urlInput);\n if (\n url.protocol !== \"https:\" ||\n url.hostname !== \"gmail.googleapis.com\" ||\n !url.pathname.startsWith(\"/gmail/v1/users/me/\")\n ) {\n throw new Error(\"Gmail REST destination binding mismatch\");\n }\n const resolve = async (forceRefresh: boolean) => {\n const result = await this.options.resolveCredential({\n workspaceId: this.options.workspaceId,\n serverId: this.options.serverId,\n connectionRef: this.options.connectionRef,\n destinationUrl: url.toString(),\n toolName,\n forceRefresh,\n ...(this.options.subjectId ? { subjectId: this.options.subjectId } : {}),\n });\n if (result.status === \"auth_needed\") {\n await this.reportAuthNeeded(result, toolName);\n throw new GmailRestAuthError(\"Authentication required for Gmail\");\n }\n this.options.onResolvedConnectionId?.(result.connectionId);\n return result;\n };\n const send = async (headers: Record<string, string>) =>\n await this.fetchImpl(url, {\n ...init,\n headers: { ...headers, ...headersRecord(init.headers) },\n signal: AbortSignal.timeout(REQUEST_TIMEOUT_MS),\n });\n const sendBounded = async (credential: Extract<ResolveCredentialResult, { status: \"ok\" }>) => {\n try {\n if (credential.authorizeProviderRequest && !(await credential.authorizeProviderRequest())) {\n throw new GmailRestAuthError(\"Authentication required for Gmail\");\n }\n return await send(credential.headers);\n } catch (error) {\n if (error instanceof GmailRestAuthError) throw error;\n throw new GmailRestProviderError(\n replaySafe\n ? `Gmail request failed: ${safeProviderTransportMessage(error)}`\n : \"Gmail mutation request failed after submission; outcome is uncertain\",\n );\n }\n };\n const first = await resolve(false);\n let response = await sendBounded(first);\n if (response.status === 401) {\n await response.body?.cancel().catch(() => undefined);\n if (!replaySafe) {\n throw new GmailRestProviderError(\n \"Gmail authentication expired after the mutation was submitted; outcome is uncertain\",\n );\n }\n const refreshed = await resolve(true);\n response = await sendBounded(refreshed);\n }\n const payload = await readResponseJsonBounded<unknown>(\n response,\n GOOGLE_RESPONSE_MAX_BYTES,\n \"Gmail REST response\",\n ).catch((error) => {\n throw new GmailRestProviderError(\n `Gmail returned an unreadable response (${response.status}): ${safeErrorMessage(error)}`,\n );\n });\n if (!response.ok) {\n throw new GmailRestProviderError(gmailProviderError(response.status, payload));\n }\n return payload as T;\n }\n}\n\nexport const GMAIL_REST_MCP_BRIDGE_ADAPTER: LocalMcpBridgeAdapter<\n GmailRestMcpBridgeConfig,\n GmailRestMcpBridgeContext\n> = Object.freeze({\n adapterId: GMAIL_REST_MCP_BRIDGE_DESCRIPTOR.adapterId,\n matches: (config: GmailRestMcpBridgeConfig) =>\n isOfficialGmailMcpConfig(config.url, config.connectionRef),\n create: (config: GmailRestMcpBridgeConfig, context: GmailRestMcpBridgeContext) => {\n if (!config.connectionRef) {\n throw new Error(\"Gmail REST bridge requires a connection reference\");\n }\n return new GmailRestMcpServer({\n ...context,\n connectionRef: config.connectionRef,\n });\n },\n});\n\nconst MESSAGE_HEADERS = [\"Subject\", \"From\", \"To\", \"Cc\", \"Bcc\", \"Date\", \"Message-ID\"];\n\nfunction projectMessage(message: GmailMessage, view: \"metadata\" | \"minimal\" | \"full\") {\n const headers = headerMap(message.payload?.headers);\n const base = {\n id: message.id ?? null,\n threadId: message.threadId ?? null,\n sender: headers.from ?? null,\n toRecipients: splitHeader(headers.to),\n ccRecipients: splitHeader(headers.cc),\n bccRecipients: splitHeader(headers.bcc),\n date: normalizedMessageDate(headers.date),\n labelIds: message.labelIds ?? [],\n internalDate: message.internalDate ?? null,\n sizeEstimate: message.sizeEstimate ?? null,\n };\n if (view === \"metadata\") return base;\n const minimal = { ...base, subject: headers.subject ?? null, snippet: message.snippet ?? null };\n if (view === \"minimal\") return minimal;\n const content = extractContent(message.payload);\n return {\n ...minimal,\n plaintextBody: content.plaintextBody,\n htmlBody: content.htmlBody,\n attachmentIds: content.attachments.flatMap((attachment) =>\n attachment.id ? [attachment.id] : [],\n ),\n attachments: content.attachments,\n };\n}\n\nfunction extractContent(root: GmailPart | undefined): {\n plaintextBody: string | null;\n htmlBody: string | null;\n attachments: Array<{ id: string | null; filename: string; mimeType: string; size: number }>;\n} {\n let plain = \"\";\n let html = \"\";\n const attachments: Array<{\n id: string | null;\n filename: string;\n mimeType: string;\n size: number;\n }> = [];\n const pending = root ? [root] : [];\n let visited = 0;\n while (pending.length > 0 && visited < 2_048) {\n const part = pending.pop()!;\n visited += 1;\n const filename = part.filename?.trim() ?? \"\";\n if (filename || part.body?.attachmentId) {\n attachments.push({\n id: part.body?.attachmentId ?? null,\n filename,\n mimeType: part.mimeType ?? \"application/octet-stream\",\n size: part.body?.size ?? 0,\n });\n } else if (part.body?.data) {\n const decoded = decodeBase64Url(part.body.data);\n if (part.mimeType === \"text/plain\") plain = appendBounded(plain, decoded, MAX_BODY_CHARS);\n if (part.mimeType === \"text/html\") html = appendBounded(html, decoded, MAX_BODY_CHARS);\n }\n for (let index = (part.parts?.length ?? 0) - 1; index >= 0; index -= 1) {\n pending.push(part.parts![index]!);\n }\n }\n return {\n plaintextBody: plain || null,\n htmlBody: html || null,\n attachments,\n };\n}\n\nfunction buildDraftMime(args: Record<string, unknown>, reply: GmailMessage | null): string {\n const to = optionalEmailArray(args.to, \"to\");\n const cc = optionalEmailArray(args.cc, \"cc\");\n const bcc = optionalEmailArray(args.bcc, \"bcc\");\n const replyHeaders = headerMap(reply?.payload?.headers);\n const subject =\n optionalString(args.subject, \"subject\", 998) ?? replySubject(replyHeaders.subject);\n const body = optionalString(args.body, \"body\", 2 * 1024 * 1024) ?? \"\";\n const htmlBody = optionalString(args.htmlBody, \"htmlBody\", 2 * 1024 * 1024);\n const attachments = parseAttachments(args.attachments);\n const headers = [\n ...(to.length ? [`To: ${to.join(\", \")}`] : []),\n ...(cc.length ? [`Cc: ${cc.join(\", \")}`] : []),\n ...(bcc.length ? [`Bcc: ${bcc.join(\", \")}`] : []),\n `Subject: ${encodeHeader(subject)}`,\n \"MIME-Version: 1.0\",\n ];\n const replyMessageId = replyHeaders[\"message-id\"];\n if (replyMessageId) {\n headers.push(`In-Reply-To: ${safeHeaderValue(replyMessageId)}`);\n headers.push(\n `References: ${safeHeaderValue(\n [replyHeaders.references, replyMessageId].filter(Boolean).join(\" \"),\n )}`,\n );\n }\n const bodyEntity = mimeBody(body, htmlBody);\n if (attachments.length === 0) return `${headers.join(\"\\r\\n\")}\\r\\n${bodyEntity}`;\n const boundary = `opengeni-mixed-${crypto.randomUUID()}`;\n headers.push(`Content-Type: multipart/mixed; boundary=\"${boundary}\"`);\n const parts = [`--${boundary}\\r\\n${bodyEntity}`];\n for (const attachment of attachments) {\n const disposition = attachment.inline ? \"inline\" : \"attachment\";\n const filename = attachment.filename ? `; filename=\"${escapeQuoted(attachment.filename)}\"` : \"\";\n parts.push(\n `--${boundary}\\r\\nContent-Type: ${attachment.mimeType}${filename}\\r\\nContent-Transfer-Encoding: base64\\r\\nContent-Disposition: ${disposition}${filename}\\r\\n\\r\\n${wrapBase64(attachment.content.toString(\"base64\"))}`,\n );\n }\n parts.push(`--${boundary}--`);\n return `${headers.join(\"\\r\\n\")}\\r\\n\\r\\n${parts.join(\"\\r\\n\")}`;\n}\n\nfunction mimeBody(plain: string, html: string | undefined): string {\n if (!html) {\n return `Content-Type: text/plain; charset=\"UTF-8\"\\r\\nContent-Transfer-Encoding: base64\\r\\n\\r\\n${wrapBase64(Buffer.from(plain).toString(\"base64\"))}`;\n }\n const boundary = `opengeni-alt-${crypto.randomUUID()}`;\n return [\n `Content-Type: multipart/alternative; boundary=\"${boundary}\"`,\n \"\",\n `--${boundary}`,\n 'Content-Type: text/plain; charset=\"UTF-8\"',\n \"Content-Transfer-Encoding: base64\",\n \"\",\n wrapBase64(Buffer.from(plain).toString(\"base64\")),\n `--${boundary}`,\n 'Content-Type: text/html; charset=\"UTF-8\"',\n \"Content-Transfer-Encoding: base64\",\n \"\",\n wrapBase64(Buffer.from(html).toString(\"base64\")),\n `--${boundary}--`,\n ].join(\"\\r\\n\");\n}\n\nfunction parseAttachments(value: unknown): Array<{\n content: Buffer;\n filename: string;\n mimeType: string;\n inline: boolean;\n}> {\n if (value === undefined) return [];\n if (!Array.isArray(value) || value.length > 100) {\n throw new GmailRestInputError(\"attachments must be an array with at most 100 items\");\n }\n let total = 0;\n return value.map((entry, index) => {\n if (!entry || typeof entry !== \"object\" || Array.isArray(entry)) {\n throw new GmailRestInputError(`attachments[${index}] must be an object`);\n }\n const record = entry as Record<string, unknown>;\n const encoded = requiredString(record.content, `attachments[${index}].content`, 40_000_000);\n const content = decodeAttachmentContent(encoded, index);\n total += content.byteLength;\n if (total > MAX_ATTACHMENT_BYTES) {\n throw new GmailRestInputError(\"combined attachment bytes exceed 25MB\");\n }\n return {\n content,\n filename: optionalString(record.filename, `attachments[${index}].filename`, 255) ?? \"\",\n mimeType: attachmentMimeType(record.mimeType, index),\n inline: record.inline === true,\n };\n });\n}\n\nfunction decodeAttachmentContent(value: string, index: number): Buffer {\n if (!/^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/u.test(value)) {\n throw new GmailRestInputError(`attachments[${index}].content must be valid base64`);\n }\n return Buffer.from(value, \"base64\");\n}\n\nfunction messageView(value: unknown): \"metadata\" | \"minimal\" | \"full\" {\n if (value === undefined || value === \"MESSAGE_FORMAT_UNSPECIFIED\" || value === \"FULL_CONTENT\")\n return \"full\";\n if (value === \"MINIMAL\") return \"minimal\";\n if (value === \"METADATA_ONLY\") return \"metadata\";\n throw new GmailRestInputError(\"messageFormat is invalid\");\n}\n\nfunction threadView(value: unknown): \"metadata\" | \"minimal\" {\n if (value === undefined || value === \"THREAD_VIEW_UNSPECIFIED\" || value === \"THREAD_VIEW_MINIMAL\")\n return \"minimal\";\n if (value === \"THREAD_VIEW_METADATA_ONLY\") return \"metadata\";\n throw new GmailRestInputError(\"view is invalid\");\n}\n\nfunction draftView(value: unknown): \"metadata\" | \"full\" {\n if (value === undefined || value === \"DRAFT_VIEW_UNSPECIFIED\" || value === \"DRAFT_VIEW_FULL\")\n return \"full\";\n if (value === \"DRAFT_VIEW_METADATA_ONLY\") return \"metadata\";\n throw new GmailRestInputError(\"view is invalid\");\n}\n\nfunction boundedPageSize(value: unknown): number {\n if (value === undefined) return 20;\n if (!Number.isInteger(value) || (value as number) < 1 || (value as number) > MAX_PAGE_SIZE) {\n throw new GmailRestInputError(`pageSize must be an integer from 1 to ${MAX_PAGE_SIZE}`);\n }\n return value as number;\n}\n\nfunction labelPageOffset(value: unknown): number {\n const token = optionalString(value, \"pageToken\", 4_096);\n if (!token) return 0;\n const match = /^opengeni-rest:(0|[1-9][0-9]{0,8})$/u.exec(token);\n if (!match) {\n throw new GmailRestInputError(\"pageToken is invalid for the Gmail REST adapter\");\n }\n return Number(match[1]);\n}\n\nfunction requiredId(value: unknown, name: string): string {\n return requiredString(value, name, 256);\n}\n\nfunction requiredString(value: unknown, name: string, max: number): string {\n if (typeof value !== \"string\" || value.length === 0 || value.length > max) {\n throw new GmailRestInputError(\n `${name} must be a non-empty string of at most ${max} characters`,\n );\n }\n return value;\n}\n\nfunction optionalString(value: unknown, name: string, max: number): string | undefined {\n if (value === undefined || value === null || value === \"\") return undefined;\n if (typeof value !== \"string\" || value.length > max) {\n throw new GmailRestInputError(`${name} must be a string of at most ${max} characters`);\n }\n return value;\n}\n\nfunction requiredStringArray(value: unknown, name: string, maxItems: number, maxChars: number) {\n if (!Array.isArray(value) || value.length === 0 || value.length > maxItems) {\n throw new GmailRestInputError(`${name} must contain 1-${maxItems} strings`);\n }\n return value.map((entry, index) => requiredString(entry, `${name}[${index}]`, maxChars));\n}\n\nfunction optionalEmailArray(value: unknown, name: string): string[] {\n if (value === undefined) return [];\n const entries = requiredStringArray(value, name, 100, 320);\n for (const entry of entries) {\n if (!/^[^\\s<>@]+@[^\\s<>@]+\\.[^\\s<>@]+$/u.test(entry)) {\n throw new GmailRestInputError(`${name} contains an invalid plain email address`);\n }\n }\n return entries;\n}\n\nfunction headerMap(headers: GmailHeader[] | undefined): Record<string, string> {\n const out: Record<string, string> = {};\n for (const header of headers ?? []) {\n if (header.name && typeof header.value === \"string\")\n out[header.name.toLowerCase()] = header.value;\n }\n return out;\n}\n\nfunction splitHeader(value: string | undefined): string[] {\n return value\n ? value\n .split(\",\")\n .map((entry) => entry.trim())\n .filter(Boolean)\n : [];\n}\n\nfunction normalizedMessageDate(value: string | undefined): string | null {\n if (!value) return null;\n const date = new Date(value);\n return Number.isNaN(date.getTime()) ? value.slice(0, 998) : date.toISOString().slice(0, 10);\n}\n\nfunction decodeBase64Url(value: string): string {\n return Buffer.from(value, \"base64url\").toString(\"utf8\");\n}\n\nfunction appendBounded(current: string, next: string, limit: number): string {\n if (current.length >= limit) return current;\n const remaining = limit - current.length;\n const appended =\n next.length > remaining\n ? `${next.slice(0, Math.max(0, remaining - 18))}\\n[content truncated]`\n : next;\n return current ? `${current}\\n${appended}`.slice(0, limit) : appended.slice(0, limit);\n}\n\nfunction replySubject(value: string | undefined): string {\n if (!value) return \"\";\n return /^re:/iu.test(value) ? value : `Re: ${value}`;\n}\n\nfunction encodeHeader(value: string): string {\n return /[^\\x20-\\x7e]/u.test(value)\n ? `=?UTF-8?B?${Buffer.from(value).toString(\"base64\")}?=`\n : value.replace(/[\\r\\n]+/gu, \" \");\n}\n\nfunction safeHeaderValue(value: string): string {\n return value.replace(/[\\r\\n]+/gu, \" \").slice(0, 998);\n}\n\nfunction attachmentMimeType(value: unknown, index: number): string {\n const mimeType =\n optionalString(value, `attachments[${index}].mimeType`, 255) ?? \"application/octet-stream\";\n if (!/^[A-Za-z0-9!#$&^_.+-]+\\/[A-Za-z0-9!#$&^_.+-]+$/u.test(mimeType)) {\n throw new GmailRestInputError(`attachments[${index}].mimeType is invalid`);\n }\n return mimeType;\n}\n\nfunction escapeQuoted(value: string): string {\n return value.replace(/[\\r\\n]/gu, \" \").replace(/[\"\\\\]/gu, \"\\\\$&\");\n}\n\nfunction wrapBase64(value: string): string {\n return value.match(/.{1,76}/gu)?.join(\"\\r\\n\") ?? \"\";\n}\n\nfunction headersRecord(value: HeadersInit | undefined): Record<string, string> {\n const out: Record<string, string> = {};\n new Headers(value).forEach((headerValue, name) => {\n out[name] = headerValue;\n });\n return out;\n}\n\nfunction gmailProviderError(status: number, payload: unknown): string {\n const message =\n payload && typeof payload === \"object\" && !Array.isArray(payload)\n ? (payload as { error?: { message?: unknown; status?: unknown } }).error\n : undefined;\n const safe =\n typeof message?.status === \"string\"\n ? message.status\n : typeof message?.message === \"string\"\n ? message.message.slice(0, 240)\n : \"provider request failed\";\n return `Gmail REST request failed (${status}): ${safe}`;\n}\n\nfunction safeErrorMessage(error: unknown): string {\n if (\n error instanceof GmailRestInputError ||\n error instanceof GmailRestProviderError ||\n error instanceof GmailRestAuthError\n )\n return error.message;\n return \"Gmail REST tool failed\";\n}\n\nfunction safeProviderTransportMessage(error: unknown): string {\n if (error instanceof DOMException && error.name === \"TimeoutError\") return \"request timed out\";\n return \"provider transport failed\";\n}\n\nfunction canonicalUrl(value: string): string | null {\n try {\n const url = new URL(value);\n url.hash = \"\";\n url.pathname = url.pathname.replace(/\\/+$/u, \"\") || \"/\";\n return url.toString();\n } catch {\n return null;\n }\n}\n\nfunction safeIdentity(value: string): string {\n return value.replace(/[^a-zA-Z0-9._-]/gu, \"-\").slice(0, 80) || \"gmail\";\n}\n\nasync function boundedMap<T, R>(values: T[], concurrency: number, map: (value: T) => Promise<R>) {\n const output = new Array<R>(values.length);\n let cursor = 0;\n await Promise.all(\n Array.from({ length: Math.min(concurrency, values.length) }, async () => {\n while (cursor < values.length) {\n const index = cursor++;\n output[index] = await map(values[index]!);\n }\n }),\n );\n return output;\n}\n\nclass GmailRestInputError extends Error {}\nclass GmailRestProviderError extends Error {}\nclass GmailRestAuthError extends Error {}\n\nexport function gmailRestToolIsMutation(toolName: string): boolean {\n return MUTATION_TOOLS.has(toolName);\n}\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import {
|
|
2
|
+
Manifest,
|
|
3
|
+
UserError,
|
|
4
|
+
cloneManifest,
|
|
5
|
+
isRecord
|
|
6
|
+
} from "./chunk-UNICCRW5.js";
|
|
7
|
+
|
|
8
|
+
// ../../node_modules/.bun/@openai+agents-core@0.14.3+933c5e7db4cd33c2/node_modules/@openai/agents-core/dist/sandbox/client.mjs
|
|
9
|
+
var DEFAULT_SANDBOX_ARCHIVE_LIMITS = {
|
|
10
|
+
maxInputBytes: 1024 * 1024 * 1024,
|
|
11
|
+
maxExtractedBytes: 4 * 1024 * 1024 * 1024,
|
|
12
|
+
maxMembers: 1e5
|
|
13
|
+
};
|
|
14
|
+
function normalizeSandboxClientCreateArgs(args, manifestOptions) {
|
|
15
|
+
if (args instanceof Manifest) {
|
|
16
|
+
return {
|
|
17
|
+
manifest: args,
|
|
18
|
+
options: manifestOptions,
|
|
19
|
+
snapshot: readSnapshotOption(manifestOptions),
|
|
20
|
+
concurrencyLimits: readConcurrencyLimitsOption(manifestOptions),
|
|
21
|
+
archiveLimits: readArchiveLimitsOption(manifestOptions)
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
const manifest = args?.manifest;
|
|
25
|
+
return {
|
|
26
|
+
manifest: manifest ? manifest instanceof Manifest ? manifest : cloneManifest(manifest) : new Manifest(),
|
|
27
|
+
options: args?.options,
|
|
28
|
+
snapshot: args?.snapshot,
|
|
29
|
+
concurrencyLimits: args?.concurrencyLimits,
|
|
30
|
+
archiveLimits: args?.archiveLimits
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
function resolveSandboxArchiveLimits(limits) {
|
|
34
|
+
if (limits == null) {
|
|
35
|
+
return null;
|
|
36
|
+
}
|
|
37
|
+
validateSandboxArchiveLimits(limits);
|
|
38
|
+
return {
|
|
39
|
+
maxInputBytes: limits.maxInputBytes === void 0 ? DEFAULT_SANDBOX_ARCHIVE_LIMITS.maxInputBytes : limits.maxInputBytes,
|
|
40
|
+
maxExtractedBytes: limits.maxExtractedBytes === void 0 ? DEFAULT_SANDBOX_ARCHIVE_LIMITS.maxExtractedBytes : limits.maxExtractedBytes,
|
|
41
|
+
maxMembers: limits.maxMembers === void 0 ? DEFAULT_SANDBOX_ARCHIVE_LIMITS.maxMembers : limits.maxMembers
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
function validateSandboxArchiveLimits(limits) {
|
|
45
|
+
if (limits == null) {
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
validatePositiveArchiveLimit("maxInputBytes", limits.maxInputBytes);
|
|
49
|
+
validatePositiveArchiveLimit("maxExtractedBytes", limits.maxExtractedBytes);
|
|
50
|
+
validatePositiveArchiveLimit("maxMembers", limits.maxMembers);
|
|
51
|
+
}
|
|
52
|
+
function validatePositiveArchiveLimit(name, value) {
|
|
53
|
+
if (value == null) {
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
if (!Number.isSafeInteger(value) || value < 1) {
|
|
57
|
+
throw new UserError(`archiveLimits.${name} must be at least 1.`);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
function readSnapshotOption(options) {
|
|
61
|
+
if (!isRecord(options)) {
|
|
62
|
+
return void 0;
|
|
63
|
+
}
|
|
64
|
+
return options.snapshot;
|
|
65
|
+
}
|
|
66
|
+
function readConcurrencyLimitsOption(options) {
|
|
67
|
+
if (!isRecord(options)) {
|
|
68
|
+
return void 0;
|
|
69
|
+
}
|
|
70
|
+
return options.concurrencyLimits;
|
|
71
|
+
}
|
|
72
|
+
function readArchiveLimitsOption(options) {
|
|
73
|
+
if (!isRecord(options)) {
|
|
74
|
+
return void 0;
|
|
75
|
+
}
|
|
76
|
+
return options.archiveLimits;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
// ../../node_modules/.bun/@openai+agents-core@0.14.3+933c5e7db4cd33c2/node_modules/@openai/agents-core/dist/sandbox/snapshot.mjs
|
|
80
|
+
var NoopSnapshotSpec = class {
|
|
81
|
+
type = "noop";
|
|
82
|
+
};
|
|
83
|
+
function isNoopSnapshotSpec(spec) {
|
|
84
|
+
return spec?.type === "noop";
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
export {
|
|
88
|
+
normalizeSandboxClientCreateArgs,
|
|
89
|
+
resolveSandboxArchiveLimits,
|
|
90
|
+
validateSandboxArchiveLimits,
|
|
91
|
+
NoopSnapshotSpec,
|
|
92
|
+
isNoopSnapshotSpec
|
|
93
|
+
};
|
|
94
|
+
//# sourceMappingURL=chunk-ZG2YH25H.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../node_modules/.bun/@openai+agents-core@0.14.3+933c5e7db4cd33c2/node_modules/@openai/agents-core/src/sandbox/client.ts","../../../node_modules/.bun/@openai+agents-core@0.14.3+933c5e7db4cd33c2/node_modules/@openai/agents-core/src/sandbox/snapshot.ts"],"sourcesContent":[null,null],"mappings":";;;;;;;;AAuBO,IAAM,iCAA+D;EAC1E,eAAe,OAAO,OAAO;EAC7B,mBAAmB,IAAI,OAAO,OAAO;EACrC,YAAY;;AAwGR,SAAU,iCAGd,MACA,iBAA0B;AAE1B,MAAI,gBAAgB,UAAU;AAC5B,WAAO;MACL,UAAU;MACV,SAAS;MACT,UAAU,mBAAmB,eAAe;MAC5C,mBAAmB,4BAA4B,eAAe;MAC9D,eAAe,wBAAwB,eAAe;;EAE1D;AAEA,QAAM,WAAW,MAAM;AAEvB,SAAO;IACL,UAAU,WACN,oBAAoB,WAClB,WACA,cAAc,QAAQ,IACxB,IAAI,SAAQ;IAChB,SAAS,MAAM;IACf,UAAU,MAAM;IAChB,mBAAmB,MAAM;IACzB,eAAe,MAAM;;AAEzB;AAEM,SAAU,4BACd,QAAoC;AAEpC,MAAI,UAAU,MAAM;AAClB,WAAO;EACT;AACA,+BAA6B,MAAM;AACnC,SAAO;IACL,eACE,OAAO,kBAAkB,SACrB,+BAA+B,gBAC/B,OAAO;IACb,mBACE,OAAO,sBAAsB,SACzB,+BAA+B,oBAC/B,OAAO;IACb,YACE,OAAO,eAAe,SAClB,+BAA+B,aAC/B,OAAO;;AAEjB;AAEM,SAAU,6BACd,QAAoC;AAEpC,MAAI,UAAU,MAAM;AAClB;EACF;AACA,+BAA6B,iBAAiB,OAAO,aAAa;AAClE,+BAA6B,qBAAqB,OAAO,iBAAiB;AAC1E,+BAA6B,cAAc,OAAO,UAAU;AAC9D;AAEA,SAAS,6BACP,MACA,OAAgC;AAEhC,MAAI,SAAS,MAAM;AACjB;EACF;AACA,MAAI,CAAC,OAAO,cAAc,KAAK,KAAK,QAAQ,GAAG;AAC7C,UAAM,IAAI,UAAU,iBAAiB,IAAI,sBAAsB;EACjE;AACF;AAEA,SAAS,mBAAmB,SAAgB;AAC1C,MAAI,CAAC,SAAS,OAAO,GAAG;AACtB,WAAO;EACT;AACA,SAAO,QAAQ;AACjB;AAEA,SAAS,4BACP,SAAgB;AAEhB,MAAI,CAAC,SAAS,OAAO,GAAG;AACtB,WAAO;EACT;AACA,SAAO,QAAQ;AACjB;AAEA,SAAS,wBACP,SAAgB;AAEhB,MAAI,CAAC,SAAS,OAAO,GAAG;AACtB,WAAO;EACT;AACA,SAAO,QAAQ;AACjB;;;AClLM,IAAO,mBAAP,MAAuB;EAClB,OAAO;;AAIZ,SAAU,mBACd,MAAqC;AAErC,SAAO,MAAM,SAAS;AACxB;","names":[]}
|
|
@@ -6,11 +6,12 @@ export declare const CODEX_APPS_TOOL_PREFIX = "codex_apps__";
|
|
|
6
6
|
* server is an authority decision; it does not make every schema from that
|
|
7
7
|
* server eager. Per-turn eager identities are removed from this searchable
|
|
8
8
|
* pool by the runtime before provider projection.
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
9
|
+
* Prepared servers supply their exact bounded-model-name map. Prefix lookup is
|
|
10
|
+
* only the legacy embedded-server fallback. Neither path inspects the global
|
|
11
|
+
* registry, connection metadata, or credentials, and both intersect the
|
|
12
|
+
* already-authorized server set.
|
|
12
13
|
*/
|
|
13
|
-
export declare function isSearchableMcpFunctionTool(tool: unknown, mcpServerIds?: ReadonlySet<string>): tool is Tool & {
|
|
14
|
+
export declare function isSearchableMcpFunctionTool(tool: unknown, mcpServerIds?: ReadonlySet<string>, modelServerIds?: ReadonlyMap<string, string>): tool is Tool & {
|
|
14
15
|
name: string;
|
|
15
16
|
deferLoading?: boolean;
|
|
16
17
|
};
|
|
@@ -194,9 +194,28 @@ export declare class CompactionProviderResponseError extends Error {
|
|
|
194
194
|
readonly status?: number;
|
|
195
195
|
readonly code?: string;
|
|
196
196
|
readonly type?: string;
|
|
197
|
+
/** Provider-named request field that was rejected (`error.param`), bounded. */
|
|
198
|
+
readonly param?: string;
|
|
197
199
|
readonly cause?: unknown;
|
|
198
200
|
constructor(diagnostics?: Record<string, unknown>, cause?: unknown);
|
|
199
201
|
}
|
|
202
|
+
/**
|
|
203
|
+
* Closed, content-free description of a definitive provider rejection of the
|
|
204
|
+
* compaction request. Every field is a bounded provider-owned identifier
|
|
205
|
+
* (status, error type/code, rejected parameter path, request id); the provider
|
|
206
|
+
* message is never carried because it can quote conversation input.
|
|
207
|
+
*/
|
|
208
|
+
export type CompactionProviderRejection = {
|
|
209
|
+
httpStatus: number;
|
|
210
|
+
type: string | null;
|
|
211
|
+
code: string | null;
|
|
212
|
+
param: string | null;
|
|
213
|
+
requestId: string | null;
|
|
214
|
+
};
|
|
215
|
+
export declare function compactionProviderRejectionFromDiagnostics(diagnostics: Record<string, unknown>): CompactionProviderRejection | null;
|
|
216
|
+
export declare function compactionProviderRejection(error: unknown): CompactionProviderRejection | null;
|
|
217
|
+
/** Human-readable, content-free summary such as `HTTP 400 invalid_request_error; param input[3].encrypted_content`. */
|
|
218
|
+
export declare function describeCompactionProviderRejection(rejection: CompactionProviderRejection): string;
|
|
200
219
|
export declare function findCompactionNeededError(error: unknown, seen?: WeakSet<object>): CompactionNeededError | null;
|
|
201
220
|
/**
|
|
202
221
|
* The exact checkpoint input shape: current active history followed by Codex's
|
package/dist/gmail-rest-mcp.js
CHANGED
package/dist/index.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
export { preparedCompactionRequest, queuePreparedCompaction } from "./prepared-compaction-request.js";
|
|
1
2
|
import type { ModelProviderApi, ResolvedModelProvider, Settings } from "@opengeni/config";
|
|
2
3
|
import { type McpOperationPersistence } from "./mcp-operation-dispatch.js";
|
|
3
4
|
export { captureMcpOperationDispatch, hasActiveRecoverableMcpOperation, McpOperationOutcomeUnknownError, runRecoverableMcpOperation, type CapturedMcpOperation, type McpOperationPersistence, type RecoverableMcpOperation, } from "./mcp-operation-dispatch.js";
|
|
@@ -15,7 +16,7 @@ import { type SpillOversizedModelToolResult } from "./tool-result-spill.js";
|
|
|
15
16
|
export { modelToolResultOverflowError, projectAttemptToolResultForCaller, spilledModelToolResult, wrapAttemptToolDefinitions, wrapAttemptToolExecute, type SpillOversizedModelToolResult, } from "./tool-result-spill.js";
|
|
16
17
|
export { CONNECTOR_ATTACHMENT_PROVIDER_RESULT_MAX_BYTES, CONNECTOR_ATTACHMENT_SANITIZED_RESULT_MAX_BYTES, ConnectorAttachmentTransferError, connectorAttachmentSandboxPath, projectConnectorAttachmentTransfers, type ConnectorAttachmentMaterializationRequest, type ConnectorAttachmentMaterializer, type ConnectorAttachmentTransferProjectionOptions, } from "./connector-attachments.js";
|
|
17
18
|
export { GMAIL_REST_API_BASE, GMAIL_REST_MCP_TOOLS, GmailRestMcpServer, OFFICIAL_GMAIL_MCP_URL, gmailRestToolIsMutation, isOfficialGmailMcpConfig, type GmailRestMcpServerOptions, } from "./gmail-rest-mcp.js";
|
|
18
|
-
import { Agent, RunState, RunContext, type AgentInputItem, type CallModelInputFilter, type MCPServer, type Model, type SerializedTool, type Tool } from "@openai/agents";
|
|
19
|
+
import { Agent, RunState, RunContext, type AgentInputItem, type CallModelInputFilter, type MCPServer, type Model, type ModelRequest, type SerializedTool, type Tool } from "@openai/agents";
|
|
19
20
|
import { Capabilities, Manifest, type SandboxClient, type SandboxSessionLike, type SandboxSessionState } from "@openai/agents/sandbox";
|
|
20
21
|
import OpenAI from "openai";
|
|
21
22
|
import { type ProviderContextTokenSignal } from "./context-compaction.js";
|
|
@@ -30,7 +31,7 @@ import type { RuntimeMetricsHooks } from "./metrics.js";
|
|
|
30
31
|
import { resolveTurnModel } from "./model-provider.js";
|
|
31
32
|
import { type WorkspaceSkillSearchPath } from "./workspace-skills.js";
|
|
32
33
|
import { type EffectiveSkillSelection, type RuntimeSkillActivation, type RuntimeSkillIndexEntry } from "./runtime-skills.js";
|
|
33
|
-
export { composeRuntimeSkills, loadNativeToolSkillArtifacts, readRuntimeSkill, skillCatalogFromComposition, type EffectiveSkillSelection, type InstalledSkillActivation, type NativeToolSkillSet, type
|
|
34
|
+
export { composeRuntimeSkills, loadNativeToolSkillArtifacts, readRuntimeSkill, skillCatalogFromComposition, type EffectiveSkillSelection, type InstalledSkillActivation, type NativeToolSkillSet, type RuntimeSkillActivation, type RuntimeSkillArtifact, type RuntimeSkillArtifactFile, type RuntimeSkillComposition, type RuntimeSkillDescriptor, type RuntimeSkillIndexEntry, type SessionSkillActivation, } from "./runtime-skills.js";
|
|
34
35
|
import { type PersistentAgentInstructionInspection } from "./model-context-inspector.js";
|
|
35
36
|
import { type ModelPreparationMeasurement } from "./model-preparation-diagnostics.js";
|
|
36
37
|
import type { ModelResponseUsage, NormalizedRuntimeEvent, SerializedHumanInputInterruption, SerializedInteractionInterventionInterruption } from "./run-events.js";
|
|
@@ -60,7 +61,7 @@ export { OpenSuffixUnresumableError, OPEN_SUFFIX_MAX_JSON_BYTES, assertOpenSuffi
|
|
|
60
61
|
export { normalizeProtocolJsonValue, UnsupportedProtocolJsonValueError } from "./protocol-json.js";
|
|
61
62
|
export { projectHistoryForProvider, ProviderHistoryIncompatibleError, type HistoryProviderApi, } from "./provider-history-adapter.js";
|
|
62
63
|
export { OpenAIChatCompletionsModel, OpenAIResponsesModel } from "@openai/agents";
|
|
63
|
-
export { CompactionNeededError, CompactionProviderResponseError, EmptyCompactionSummaryError, buildCompactionPromptInput, buildCompactionReplacementHistory, compactionReplacementFingerprint, compactionThresholdTokens, clampCompactionThresholdRatio, decideCompaction, buildSummaryItem, buildRemoteCompactionV2PromptInput, buildRemoteV2ReplacementHistory, extractRemoteCompactionV2OutputItem, findCompactionNeededError, isCompactionSummary, isRemoteCompactionItem, isRetainedRemoteV2Message, latestCompactionReplacementFingerprint, prepareCompactionPromptInput, projectRemoteCompactionOverflowRetryInput, isUserMessage, estimateTokens, estimateTokensBreakdown, estimateItemTokens, estimateItemTokenBreakdown, estimateOpaqueEncryptedModelVisibleBytes, estimateOpaqueEncryptedTokens, opaqueEncryptedContentLength, estimateNativeImageTokens, estimateCompleteModelInput, estimateCompleteModelInputTokens, estimateSerializedValueTokens, hasModelGeneratedItem, renderCompactionPromptInputForChat, COMPACTION_SUMMARY_MARKER, COMPACTION_PROMPT, COMPACT_USER_MESSAGE_MAX_TOKENS, REMOTE_V2_RETAINED_MESSAGE_TOKEN_BUDGET, REMOTE_COMPACTION_V2_IMPLEMENTATION, REMOTE_COMPACTION_V2_BETA_FEATURE, DEFAULT_COMPACTION_THRESHOLD_RATIO, MIN_COMPACTION_THRESHOLD_RATIO, MAX_COMPACTION_THRESHOLD_RATIO, SUMMARY_BUFFER_TOKENS, SUMMARY_PREFIX, USER_MESSAGE_TRUNCATION_MARKER, REMOTE_COMPACTION_TOOL_RESULT_OMISSION, UNKNOWN_IMAGE_TOKENS, MAX_NATIVE_IMAGE_TOKENS, } from "./context-compaction.js";
|
|
64
|
+
export { CompactionNeededError, CompactionProviderResponseError, EmptyCompactionSummaryError, compactionProviderRejection, compactionProviderRejectionFromDiagnostics, describeCompactionProviderRejection, type CompactionProviderRejection, buildCompactionPromptInput, buildCompactionReplacementHistory, compactionReplacementFingerprint, compactionThresholdTokens, clampCompactionThresholdRatio, decideCompaction, buildSummaryItem, buildRemoteCompactionV2PromptInput, buildRemoteV2ReplacementHistory, extractRemoteCompactionV2OutputItem, findCompactionNeededError, isCompactionSummary, isRemoteCompactionItem, isRetainedRemoteV2Message, latestCompactionReplacementFingerprint, prepareCompactionPromptInput, projectRemoteCompactionOverflowRetryInput, isUserMessage, estimateTokens, estimateTokensBreakdown, estimateItemTokens, estimateItemTokenBreakdown, estimateOpaqueEncryptedModelVisibleBytes, estimateOpaqueEncryptedTokens, opaqueEncryptedContentLength, estimateNativeImageTokens, estimateCompleteModelInput, estimateCompleteModelInputTokens, estimateSerializedValueTokens, hasModelGeneratedItem, renderCompactionPromptInputForChat, COMPACTION_SUMMARY_MARKER, COMPACTION_PROMPT, COMPACT_USER_MESSAGE_MAX_TOKENS, REMOTE_V2_RETAINED_MESSAGE_TOKEN_BUDGET, REMOTE_COMPACTION_V2_IMPLEMENTATION, REMOTE_COMPACTION_V2_BETA_FEATURE, DEFAULT_COMPACTION_THRESHOLD_RATIO, MIN_COMPACTION_THRESHOLD_RATIO, MAX_COMPACTION_THRESHOLD_RATIO, SUMMARY_BUFFER_TOKENS, SUMMARY_PREFIX, USER_MESSAGE_TRUNCATION_MARKER, REMOTE_COMPACTION_TOOL_RESULT_OMISSION, UNKNOWN_IMAGE_TOKENS, MAX_NATIVE_IMAGE_TOKENS, } from "./context-compaction.js";
|
|
64
65
|
export type { CompactionDecision, ModelInputTokenBreakdown, NativeImageEstimateReason, NativeImageTokenEstimate, CompactionItem, PreparedCompactionPromptInput, RemoteCompactionOverflowRetryInput, } from "./context-compaction.js";
|
|
65
66
|
export { MAX_MODEL_USAGE_TOKEN_COUNT, modelCallUsageTelemetry, modelUsageTokenCountOrNull, normalizeModelCallUsage, } from "./usage-telemetry.js";
|
|
66
67
|
export type { ModelCallUsageInput, ModelCallUsageNormalization, ModelCallUsageTelemetry, } from "./usage-telemetry.js";
|
|
@@ -251,10 +252,9 @@ export declare function serializedToolsForRemoteCompaction(agent: {
|
|
|
251
252
|
* exactly one `{ type: "compaction", encrypted_content }` output item.
|
|
252
253
|
* Must run inside Codex ALS with `remote_compaction_v2` beta + turn metadata.
|
|
253
254
|
*
|
|
254
|
-
*
|
|
255
|
-
*
|
|
256
|
-
*
|
|
257
|
-
* busts the shared tools→instructions prefix and is rejected here.
|
|
255
|
+
* Reuse the complete prepared ordinary request, after sandbox and lazy-tool
|
|
256
|
+
* preparation. Never reconstruct its prefix from Agent configuration. Empty
|
|
257
|
+
* instructions are rejected.
|
|
258
258
|
*
|
|
259
259
|
* Tools are schema context only. This is a single `_fetchResponse` (no tool
|
|
260
260
|
* loop), and extract still requires exactly one compaction item, so a
|
|
@@ -264,18 +264,18 @@ export declare function requestRemoteCompactionV2(settings: Settings, input: Arr
|
|
|
264
264
|
client: OpenAI;
|
|
265
265
|
provider?: ResolvedModelProvider;
|
|
266
266
|
model: string;
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
*/
|
|
271
|
-
systemInstructions: string;
|
|
272
|
-
promptCacheKey?: string;
|
|
273
|
-
/** Model-visible tool schemas for the compact request (CLI parity). */
|
|
274
|
-
tools?: readonly SerializedTool[];
|
|
267
|
+
preparedRequest: Omit<ModelRequest, "input">;
|
|
268
|
+
captureAgent?: object;
|
|
269
|
+
signal?: AbortSignal | undefined;
|
|
275
270
|
onUsage?: (usage: ModelResponseUsage) => void | Promise<void>;
|
|
276
271
|
}): Promise<Record<string, unknown>>;
|
|
277
272
|
/** Bounded provider diagnostics: identifiers and classifications, never messages or model data. */
|
|
278
273
|
export declare function compactionProviderFailureDiagnostics(error: unknown): Record<string, unknown>;
|
|
274
|
+
/**
|
|
275
|
+
* Closed provider rejection families the worker reacts to. Anything else is a
|
|
276
|
+
* bounded status/code/param record with no classification.
|
|
277
|
+
*/
|
|
278
|
+
export type CompactionRejectionReason = "missing_required_reasoning_item" | "encrypted_content_rejected";
|
|
279
279
|
/** Bounded, content-free diagnostics for a semantically empty checkpoint. */
|
|
280
280
|
export declare function compactionResponseDiagnostics(response: unknown, extractedText?: string): Record<string, unknown>;
|
|
281
281
|
/**
|
|
@@ -480,15 +480,11 @@ export type BuildAgentOptions = {
|
|
|
480
480
|
persistentSessionSettings?: PersistentSessionSettings;
|
|
481
481
|
instructionsTemplate?: string;
|
|
482
482
|
sessionInstructions?: string;
|
|
483
|
-
/**
|
|
484
|
-
* Exact Skill activations admitted for this turn. Optional/domain Skills
|
|
485
|
-
* enter only through an explicit installation, Pack owner, or session
|
|
486
|
-
* selection; native tool-bound Skills are derived separately from the exact
|
|
487
|
-
* executable tool catalog.
|
|
488
|
-
*/
|
|
489
483
|
skillActivations?: readonly RuntimeSkillActivation[];
|
|
490
484
|
/** Host-owned descriptors and reader; mutually exclusive with skillActivations. */
|
|
491
485
|
skillCatalog?: readonly SkillCatalogDescriptor[];
|
|
486
|
+
/** Worker has persisted the catalog in conversation history before inference. */
|
|
487
|
+
skillCatalogInHistory?: boolean;
|
|
492
488
|
/**
|
|
493
489
|
* Internal per-attempt cancellation boundary. The worker supplies Temporal's
|
|
494
490
|
* signal so an in-flight shell process is interrupted immediately instead of
|
|
@@ -706,10 +702,14 @@ export type LocalMcpServerRegistration = {
|
|
|
706
702
|
export type ToolPreparationPhase = "server_construction" | "required_connect" | "optional_connect" | "attempt_catalog_build" | "attempt_catalog_persist" | "workspace_gateway_catalog_build";
|
|
707
703
|
export type ToolPreparationPhaseMeasurement = {
|
|
708
704
|
phase: ToolPreparationPhase;
|
|
705
|
+
/** Background preparation starts immediately but is not a first-request dependency. */
|
|
706
|
+
execution: "blocking" | "background";
|
|
709
707
|
outcome: "completed" | "failed";
|
|
710
708
|
durationSeconds: number;
|
|
711
709
|
};
|
|
712
710
|
export type PrepareToolsOptions = {
|
|
711
|
+
/** Frozen, explicitly selected account labels keyed by execution route, not provider. */
|
|
712
|
+
mcpAccountLabels?: ReadonlyMap<string, string>;
|
|
713
713
|
/** Opt-in exact-attempt persistence; absence preserves ordinary MCP execution. */
|
|
714
714
|
mcpOperationPersistence?: McpOperationPersistence;
|
|
715
715
|
/** Live exact-owner control refresh; API remains read/observation authority. */
|
|
@@ -861,6 +861,7 @@ export declare class PrefixedMcpServer implements MCPServer {
|
|
|
861
861
|
private readonly approvalAuthority?;
|
|
862
862
|
private readonly inputWaitYield?;
|
|
863
863
|
private readonly refreshOwnedCommand?;
|
|
864
|
+
private readonly accountLabel?;
|
|
864
865
|
readonly cacheToolsList: boolean;
|
|
865
866
|
readonly customDataExtractor: NonNullable<MCPServer["customDataExtractor"]>;
|
|
866
867
|
readonly toolMetaResolver: NonNullable<MCPServer["toolMetaResolver"]>;
|
|
@@ -872,11 +873,14 @@ export declare class PrefixedMcpServer implements MCPServer {
|
|
|
872
873
|
private loggedListToolsFailure;
|
|
873
874
|
private listedToolSchemaTokens;
|
|
874
875
|
private frozenTools;
|
|
876
|
+
private readonly originalToolNames;
|
|
877
|
+
/** Exact attempt-local classification, including names too long for a prefix. */
|
|
878
|
+
modelToolNames(): Iterable<string>;
|
|
875
879
|
private attemptToolEnvironment;
|
|
876
880
|
private attemptToolSubjectId;
|
|
877
881
|
private readonly resultCustomDataBridge;
|
|
878
882
|
private readonly lifecycleFailures;
|
|
879
|
-
constructor(inner: MCPServer, registryId: string, allowedTools?: string[], bestEffort?: boolean, aggregateToolBudget?: McpAggregateToolListBudget | undefined, aggregateSourceId?: string, recoverySafeSetup?: boolean, connectorAttachmentAuthority?: PrefixedMcpConnectorAttachmentAuthority | undefined, modelToolSchemaAccountingDeferred?: boolean, catalogCallPreflight?: NonNullable<LocalMcpServerRegistration["preflightCall"]> | undefined, approvalAuthority?: unknown, inputWaitYield?: InputWaitYield | undefined, refreshOwnedCommand?: ((commandId: string) => Promise<boolean>) | undefined);
|
|
883
|
+
constructor(inner: MCPServer, registryId: string, allowedTools?: string[], bestEffort?: boolean, aggregateToolBudget?: McpAggregateToolListBudget | undefined, aggregateSourceId?: string, recoverySafeSetup?: boolean, connectorAttachmentAuthority?: PrefixedMcpConnectorAttachmentAuthority | undefined, modelToolSchemaAccountingDeferred?: boolean, catalogCallPreflight?: NonNullable<LocalMcpServerRegistration["preflightCall"]> | undefined, approvalAuthority?: unknown, inputWaitYield?: InputWaitYield | undefined, refreshOwnedCommand?: ((commandId: string) => Promise<boolean>) | undefined, accountLabel?: string | undefined);
|
|
880
884
|
connect(): Promise<void>;
|
|
881
885
|
private connectWithLifecycleMetric;
|
|
882
886
|
close(): Promise<void>;
|
|
@@ -930,6 +934,7 @@ export type PrepareInputOptions = {
|
|
|
930
934
|
* history and any actually pending unresolved tool fails closed.
|
|
931
935
|
*/
|
|
932
936
|
export declare function restoreInterruptedRunState(agent: Agent<any, any>, serializedRunState: string): Promise<RunState<any, any>>;
|
|
937
|
+
export declare const TURN_OPERATIONAL_NOTICE_PREFIX = "[OpenGeni turn-scoped operational notice]\n";
|
|
933
938
|
export declare function prepareRunInput(agent: Agent<any, any>, input: AgentSegmentInput, options?: PrepareInputOptions): Promise<PreparedAgentInput>;
|
|
934
939
|
export type RunAgentStreamOptions = {
|
|
935
940
|
/** Abort the provider/tool loop when the owning activity is cancelled. */
|
|
@@ -1056,6 +1061,8 @@ export declare function runOwnedSandboxSetup(agent: Agent<any, any>, session: Sa
|
|
|
1056
1061
|
environment: Record<string, string>;
|
|
1057
1062
|
preparedInput?: PreparedAgentInput;
|
|
1058
1063
|
fileDownloadsMaterialized?: boolean;
|
|
1064
|
+
/** Lazy setup runs after SDK preparation has already observed the logical manifest. */
|
|
1065
|
+
recordLazyManifest?: boolean;
|
|
1059
1066
|
onRuntimeEvent?: SandboxLifecycleHookContext["onRuntimeEvent"];
|
|
1060
1067
|
gitTokenSeedsOverride?: GitTokenSeeds;
|
|
1061
1068
|
gitTokenSeedOverride?: string;
|
|
@@ -1184,6 +1191,7 @@ export declare function codemodeTokenSeedCommand(options?: {
|
|
|
1184
1191
|
legacyTokenFile?: string;
|
|
1185
1192
|
}): string;
|
|
1186
1193
|
export declare function runCodemodeTokenSeedHook(session: SandboxSessionLike, context: SandboxLifecycleHookContext): Promise<void>;
|
|
1194
|
+
export declare function runManagedCodemodeClientHook(session: SandboxSessionLike, context: SandboxLifecycleHookContext): Promise<void>;
|
|
1187
1195
|
export declare function refreshCodemodeTokenFile(session: CodemodeTokenWriterSession, token: string, options?: {
|
|
1188
1196
|
runAs?: string;
|
|
1189
1197
|
commandRunner?: SandboxLifecycleCommandRunner;
|