MCP Terminal Server
by dillip285
- genkit-tools
- cli
- src
- utils
/**
* Copyright 2024 Google LLC
*
* 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.
*/
import {
LocalFileTraceStore,
startTelemetryServer,
} from '@genkit-ai/telemetry-server';
import { Status } from '@genkit-ai/tools-common';
import {
GenkitToolsError,
RuntimeManager,
} from '@genkit-ai/tools-common/manager';
import { logger } from '@genkit-ai/tools-common/utils';
import getPort, { makeRange } from 'get-port';
/**
* Returns the telemetry server address either based on environment setup or starts one.
*
* This function is not idempotent. Typically you want to make sure it's called only once per cli instance.
*/
export async function resolveTelemetryServer(): Promise<string> {
let telemetryServerUrl = process.env.GENKIT_TELEMETRY_SERVER;
if (!telemetryServerUrl) {
const telemetryPort = await getPort({ port: makeRange(4033, 4999) });
telemetryServerUrl = `http://localhost:${telemetryPort}`;
startTelemetryServer({
port: telemetryPort,
traceStore: new LocalFileTraceStore(),
});
}
return telemetryServerUrl;
}
/**
* Starts the runtime manager and its dependencies.
*/
export async function startManager(
manageHealth?: boolean
): Promise<RuntimeManager> {
const telemetryServerUrl = await resolveTelemetryServer();
const manager = RuntimeManager.create({ telemetryServerUrl, manageHealth });
return manager;
}
/**
* Runs the given function with a runtime manager.
*/
export async function runWithManager(
fn: (manager: RuntimeManager) => Promise<void>
) {
let manager: RuntimeManager;
try {
manager = await startManager(false); // Don't manage health in this case.
} catch (e) {
process.exit(1);
}
try {
await fn(manager);
} catch (err) {
logger.info('Command exited with an Error:');
const error = err as GenkitToolsError;
if (typeof error.data === 'object') {
const errorStatus = error.data as Status;
const { code, details, message } = errorStatus;
logger.info(`\tCode: ${code}`);
logger.info(`\tMessage: ${message}`);
logger.info(`\tTrace: http://localhost:4200/traces/${details.traceId}\n`);
} else {
logger.info(`\tMessage: ${error.data}\n`);
}
logger.error('Stack trace:');
logger.error(`${error.stack}`);
}
}