@struktoai/mirage-core
Version:
A Unified Virtual Filesystem For AI Agents
101 lines • 4.55 kB
JavaScript
// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========
import { encodeBase64 } from "../../utils/base64.js";
import { gmailBase, googlePost } from "../google/client.js";
import { extractHeader, getMessageProcessed, getMessageRaw } from "./messages.js";
const ENC = new TextEncoder();
function base64UrlEncode(bytes) {
return encodeBase64(bytes).replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/, '');
}
function buildMime(headers, body) {
const lines = [];
lines.push('MIME-Version: 1.0');
lines.push('Content-Type: text/plain; charset="utf-8"');
lines.push('Content-Transfer-Encoding: 7bit');
for (const [k, v] of Object.entries(headers)) {
if (v !== '')
lines.push(`${k}: ${v}`);
}
lines.push('');
lines.push(body);
return lines.join('\r\n');
}
export async function sendMessage(tokenManager, to, subject, body) {
const mime = buildMime({ To: to, Subject: subject }, body);
const raw = base64UrlEncode(ENC.encode(mime));
const url = `${gmailBase(tokenManager)}/users/me/messages/send`;
return googlePost(tokenManager, url, { raw });
}
export async function replyMessage(tokenManager, messageId, body) {
const rawMsg = await getMessageRaw(tokenManager, messageId);
const headers = rawMsg.payload?.headers ?? [];
const to = extractHeader(headers, 'From');
let subject = extractHeader(headers, 'Subject');
if (!subject.toLowerCase().startsWith('re:'))
subject = `Re: ${subject}`;
const threadId = rawMsg.threadId ?? '';
const msgIdHeader = extractHeader(headers, 'Message-ID');
const mimeHeaders = { To: to, Subject: subject };
if (msgIdHeader !== '') {
mimeHeaders['In-Reply-To'] = msgIdHeader;
mimeHeaders.References = msgIdHeader;
}
const mime = buildMime(mimeHeaders, body);
const raw = base64UrlEncode(ENC.encode(mime));
const payload = { raw };
if (threadId !== '')
payload.threadId = threadId;
const url = `${gmailBase(tokenManager)}/users/me/messages/send`;
return googlePost(tokenManager, url, payload);
}
export async function replyAllMessage(tokenManager, messageId, body) {
const rawMsg = await getMessageRaw(tokenManager, messageId);
const headers = rawMsg.payload?.headers ?? [];
const sender = extractHeader(headers, 'From');
const originalTo = extractHeader(headers, 'To');
const originalCc = extractHeader(headers, 'Cc');
let subject = extractHeader(headers, 'Subject');
if (!subject.toLowerCase().startsWith('re:'))
subject = `Re: ${subject}`;
const threadId = rawMsg.threadId ?? '';
const msgIdHeader = extractHeader(headers, 'Message-ID');
const allTo = [sender, originalTo].filter((s) => s !== '').join(', ');
const mimeHeaders = { To: allTo, Subject: subject };
if (originalCc !== '')
mimeHeaders.Cc = originalCc;
if (msgIdHeader !== '') {
mimeHeaders['In-Reply-To'] = msgIdHeader;
mimeHeaders.References = msgIdHeader;
}
const mime = buildMime(mimeHeaders, body);
const raw = base64UrlEncode(ENC.encode(mime));
const payload = { raw };
if (threadId !== '')
payload.threadId = threadId;
const url = `${gmailBase(tokenManager)}/users/me/messages/send`;
return googlePost(tokenManager, url, payload);
}
export async function forwardMessage(tokenManager, messageId, to) {
const processed = await getMessageProcessed(tokenManager, messageId);
let subject = processed.subject;
if (!subject.toLowerCase().startsWith('fwd:'))
subject = `Fwd: ${subject}`;
const fwdBody = `---------- Forwarded message ----------\n` +
`From: ${processed.from.email}\n` +
`Date: ${processed.date}\n` +
`Subject: ${processed.subject}\n\n` +
processed.body_text;
return sendMessage(tokenManager, to, subject, fwdBody);
}
//# sourceMappingURL=send.js.map