@memberjunction/a2aserver
Version:
MemberJunction Agent-To-Agent (A2A) Server Implementation
82 lines • 3.81 kB
JavaScript
import dotenv from 'dotenv';
dotenv.config({ quiet: true });
import { z } from 'zod';
import { cosmiconfigSync } from 'cosmiconfig';
import { LogError, LogStatus } from '@memberjunction/core';
import { mergeConfigs } from '@memberjunction/config';
import { DEFAULT_SERVER_CONFIG } from '@memberjunction/server';
const explorer = cosmiconfigSync('mj');
const databaseSettingsInfoSchema = z.object({
connectionTimeout: z.number(),
requestTimeout: z.number(),
dbReadOnlyUsername: z.string().optional(),
dbReadOnlyPassword: z.string().optional(),
});
const a2aServerEntityCapabilitySchema = z.object({
entityName: z.string().optional(),
schemaName: z.string().optional(),
get: z.boolean().optional().default(false),
create: z.boolean().optional().default(false),
update: z.boolean().optional().default(false),
delete: z.boolean().optional().default(false),
runView: z.boolean().optional().default(false),
});
const a2aServerAgentCapabilitySchema = z.object({
agentName: z.string().optional(),
discover: z.boolean().optional().default(false),
execute: z.boolean().optional().default(false),
monitor: z.boolean().optional().default(false),
cancel: z.boolean().optional().default(false),
});
const a2aServerInfoSchema = z.object({
port: z.coerce.number().optional().default(3200),
entityCapabilities: z.array(a2aServerEntityCapabilitySchema).optional(),
agentCapabilities: z.array(a2aServerAgentCapabilitySchema).optional(),
enableA2AServer: z.boolean().optional().default(false),
agentName: z.string().optional().default("MemberJunction"),
agentDescription: z.string().optional().default("MemberJunction A2A Agent"),
streamingEnabled: z.boolean().optional().default(true),
userEmail: z.string().optional().describe("Email address of the user to use for entity operations"),
});
const configInfoSchema = z.object({
databaseSettings: databaseSettingsInfoSchema,
dbHost: z.string().default('localhost'),
dbDatabase: z.string(),
dbPort: z.number({ coerce: true }).default(1433),
dbUsername: z.string(),
dbPassword: z.string(),
dbReadOnlyUsername: z.string().optional(),
dbReadOnlyPassword: z.string().optional(),
dbTrustServerCertificate: z.coerce
.boolean()
.default(false)
.transform((v) => (v ? 'Y' : 'N')),
dbInstanceName: z.string().optional(),
// A2A Server settings
a2aServerSettings: a2aServerInfoSchema.optional(),
mjCoreSchema: z.string(),
});
export const configInfo = loadConfig();
export const { dbUsername, dbPassword, dbHost, dbDatabase, dbPort, dbTrustServerCertificate, dbInstanceName, a2aServerSettings, mjCoreSchema: mj_core_schema, dbReadOnlyUsername, dbReadOnlyPassword, } = configInfo;
export function loadConfig() {
const configSearchResult = explorer.search(process.cwd());
// Start with DEFAULT_SERVER_CONFIG as base
let mergedConfig = DEFAULT_SERVER_CONFIG;
// If user config exists, merge it with defaults
if (configSearchResult && !configSearchResult.isEmpty) {
LogStatus(`A2A Server: Config file found at ${configSearchResult.filepath}`);
// Merge user config with defaults (user config takes precedence)
mergedConfig = mergeConfigs(DEFAULT_SERVER_CONFIG, configSearchResult.config);
}
else {
LogStatus(`A2A Server: No config file found, using DEFAULT_SERVER_CONFIG`);
}
// Validate the merged configuration
const configParsing = configInfoSchema.safeParse(mergedConfig);
if (!configParsing.success) {
LogError('Error parsing config file', '', JSON.stringify(configParsing.error.issues, null, 2));
throw new Error('Configuration validation failed');
}
return configParsing.data;
}
//# sourceMappingURL=config.js.map