mcp-chrome-bridge
Version:
Chrome Native-Messaging host (Node)
198 lines • 7.37 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.getMessagesByProjectId = getMessagesByProjectId;
exports.getMessagesCountByProjectId = getMessagesCountByProjectId;
exports.createMessage = createMessage;
exports.deleteMessagesByProjectId = deleteMessagesByProjectId;
exports.getMessagesBySessionId = getMessagesBySessionId;
exports.getMessagesCountBySessionId = getMessagesCountBySessionId;
exports.deleteMessagesBySessionId = deleteMessagesBySessionId;
exports.getMessagesByRequestId = getMessagesByRequestId;
/**
* Message Service - Database-backed implementation using Drizzle ORM.
*
* Provides CRUD operations for agent chat messages with:
* - Type-safe database queries
* - Efficient indexed queries
* - Consistent with AgentStoredMessage interface from shared types
*/
const node_crypto_1 = require("node:crypto");
const drizzle_orm_1 = require("drizzle-orm");
const db_1 = require("./db");
// ============================================================
// Type Conversion
// ============================================================
/**
* Convert database row to AgentStoredMessage interface.
*/
function rowToMessage(row) {
var _a;
return {
id: row.id,
projectId: row.projectId,
sessionId: row.sessionId,
conversationId: row.conversationId,
role: row.role,
content: row.content,
messageType: row.messageType,
metadata: row.metadata ? JSON.parse(row.metadata) : undefined,
cliSource: row.cliSource,
requestId: (_a = row.requestId) !== null && _a !== void 0 ? _a : undefined,
createdAt: row.createdAt,
};
}
// ============================================================
// Public API
// ============================================================
/**
* Get messages by project ID with pagination.
* Returns messages sorted by creation time (oldest first).
*/
async function getMessagesByProjectId(projectId, limit = 50, offset = 0) {
const db = (0, db_1.getDb)();
const query = db
.select()
.from(db_1.messages)
.where((0, drizzle_orm_1.eq)(db_1.messages.projectId, projectId))
.orderBy((0, drizzle_orm_1.asc)(db_1.messages.createdAt));
// Apply pagination if specified
if (limit > 0) {
query.limit(limit);
}
if (offset > 0) {
query.offset(offset);
}
const rows = await query;
return rows.map(rowToMessage);
}
/**
* Get the total count of messages for a project.
*/
async function getMessagesCountByProjectId(projectId) {
var _a, _b;
const db = (0, db_1.getDb)();
const result = await db
.select({ count: (0, drizzle_orm_1.count)() })
.from(db_1.messages)
.where((0, drizzle_orm_1.eq)(db_1.messages.projectId, projectId));
return (_b = (_a = result[0]) === null || _a === void 0 ? void 0 : _a.count) !== null && _b !== void 0 ? _b : 0;
}
/**
* Create a new message.
*/
async function createMessage(input) {
var _a, _b, _c, _d;
const db = (0, db_1.getDb)();
const now = new Date().toISOString();
const messageData = {
id: ((_a = input.id) === null || _a === void 0 ? void 0 : _a.trim()) || (0, node_crypto_1.randomUUID)(),
projectId: input.projectId,
sessionId: input.sessionId || '',
conversationId: (_b = input.conversationId) !== null && _b !== void 0 ? _b : null,
role: input.role,
content: input.content,
messageType: input.messageType,
metadata: input.metadata ? JSON.stringify(input.metadata) : null,
cliSource: (_c = input.cliSource) !== null && _c !== void 0 ? _c : null,
requestId: (_d = input.requestId) !== null && _d !== void 0 ? _d : null,
createdAt: input.createdAt || now,
};
await db
.insert(db_1.messages)
.values(messageData)
.onConflictDoUpdate({
target: db_1.messages.id,
set: {
role: messageData.role,
messageType: messageData.messageType,
content: messageData.content,
metadata: messageData.metadata,
sessionId: messageData.sessionId,
conversationId: messageData.conversationId,
cliSource: messageData.cliSource,
requestId: messageData.requestId,
},
});
return rowToMessage(messageData);
}
/**
* Delete messages by project ID.
* Optionally filter by conversation ID.
* Returns the number of deleted messages.
*/
async function deleteMessagesByProjectId(projectId, conversationId) {
const db = (0, db_1.getDb)();
// Get count before deletion
const beforeCount = await getMessagesCountByProjectId(projectId);
if (conversationId) {
await db
.delete(db_1.messages)
.where((0, drizzle_orm_1.and)((0, drizzle_orm_1.eq)(db_1.messages.projectId, projectId), (0, drizzle_orm_1.eq)(db_1.messages.conversationId, conversationId)));
}
else {
await db.delete(db_1.messages).where((0, drizzle_orm_1.eq)(db_1.messages.projectId, projectId));
}
// Get count after deletion to calculate deleted count
const afterCount = await getMessagesCountByProjectId(projectId);
return beforeCount - afterCount;
}
/**
* Get messages by session ID with optional pagination.
* Returns messages sorted by creation time (oldest first).
*
* @param sessionId - The session ID to filter by
* @param limit - Maximum number of messages to return (0 = no limit)
* @param offset - Number of messages to skip
*/
async function getMessagesBySessionId(sessionId, limit = 0, offset = 0) {
const db = (0, db_1.getDb)();
const query = db
.select()
.from(db_1.messages)
.where((0, drizzle_orm_1.eq)(db_1.messages.sessionId, sessionId))
.orderBy((0, drizzle_orm_1.asc)(db_1.messages.createdAt));
if (limit > 0) {
query.limit(limit);
}
if (offset > 0) {
query.offset(offset);
}
const rows = await query;
return rows.map(rowToMessage);
}
/**
* Get count of messages by session ID.
*/
async function getMessagesCountBySessionId(sessionId) {
var _a, _b;
const db = (0, db_1.getDb)();
const result = await db
.select({ count: (0, drizzle_orm_1.count)() })
.from(db_1.messages)
.where((0, drizzle_orm_1.eq)(db_1.messages.sessionId, sessionId));
return (_b = (_a = result[0]) === null || _a === void 0 ? void 0 : _a.count) !== null && _b !== void 0 ? _b : 0;
}
/**
* Delete all messages for a session.
* Returns the number of deleted messages.
*/
async function deleteMessagesBySessionId(sessionId) {
const db = (0, db_1.getDb)();
const beforeCount = await getMessagesCountBySessionId(sessionId);
await db.delete(db_1.messages).where((0, drizzle_orm_1.eq)(db_1.messages.sessionId, sessionId));
const afterCount = await getMessagesCountBySessionId(sessionId);
return beforeCount - afterCount;
}
/**
* Get messages by request ID.
*/
async function getMessagesByRequestId(requestId) {
const db = (0, db_1.getDb)();
const rows = await db
.select()
.from(db_1.messages)
.where((0, drizzle_orm_1.eq)(db_1.messages.requestId, requestId))
.orderBy((0, drizzle_orm_1.asc)(db_1.messages.createdAt));
return rows.map(rowToMessage);
}
//# sourceMappingURL=message-service.js.map