UNPKG

life

Version:

Life.js is the first fullstack framework to build agentic web applications. It is minimal, extensible, and typesafe. Well, everything you love.

1 lines 10.3 kB
{"version":3,"sources":["../telemetry/clients/node.ts","../telemetry/helpers/patch-console.ts","../shared/process-stats.ts"],"sourcesContent":["import { AsyncLocalStorage } from \"node:async_hooks\";\nimport os from \"node:os\";\nimport z from \"zod\";\nimport { agentServerConfig } from \"@/agent/server/config\";\nimport packageJson from \"../../package.json\" with { type: \"json\" };\nimport type { TelemetryResource, TelemetryScopeAttributes, TelemetrySpan } from \"../types\";\nimport { defineScopes, TelemetryClient } from \"./base\";\n\nconst baseAgentServerAttributesSchema = z.object({\n agentName: z.string(),\n agentId: z.string(),\n agentSha: z.string(),\n agentConfig: agentServerConfig.schema.transform((c) => agentServerConfig.toTelemetry(c)),\n transportProviderName: z.string(),\n llmProviderName: z.string(),\n sttProviderName: z.string(),\n eouProviderName: z.string(),\n ttsProviderName: z.string(),\n vadProviderName: z.string(),\n});\n\n/**\n * The list of valid telemetry scopes in the Node.js part of the Life.js codebase.\n * Ensure consistency and typesafety.\n */\nexport const telemetryNodeScopesDefinition = defineScopes({\n compiler: {\n displayName: \"Compiler\",\n requiredAttributesSchema: z.object({\n watch: z.boolean(),\n }),\n },\n cli: {\n displayName: \"CLI\",\n requiredAttributesSchema: z.object({\n command: z.string(), // e.g. \"dev\", \"build\", \"start\", \"init\"\n args: z.array(z.string()),\n }),\n },\n server: {\n displayName: \"Server\",\n requiredAttributesSchema: z.object({\n watch: z.boolean(),\n }),\n },\n webrtc: {\n displayName: \"WebRTC\",\n requiredAttributesSchema: z.object(),\n },\n \"agent.process\": {\n displayName: (attributes) =>\n `Agent Process (${attributes?.agentId?.replace(\"agent_\", \"\").slice(0, 6)})`,\n requiredAttributesSchema: z.object({\n agentId: z.string(),\n }),\n },\n \"agent.server\": {\n displayName: (attributes) =>\n `Agent (${attributes?.agentName} - ${attributes?.agentId?.replace(\"agent_\", \"\").slice(0, 6)})`,\n requiredAttributesSchema: baseAgentServerAttributesSchema,\n },\n \"plugin.server\": {\n displayName: (attributes) => `Plugin (${attributes?.pluginName})`,\n requiredAttributesSchema: baseAgentServerAttributesSchema.extend({\n pluginName: z.string(),\n pluginServerConfig: z.any(),\n }),\n },\n});\n\nexport class TelemetryNodeClient extends TelemetryClient {\n readonly #spanDataContext = new AsyncLocalStorage<TelemetrySpan | undefined>();\n\n constructor(scope: string) {\n super(telemetryNodeScopesDefinition, scope);\n }\n\n protected getResource() {\n return {\n platform: \"node\",\n environment: (process.env.NODE_ENV || \"development\") as TelemetryResource[\"environment\"],\n isCi: Boolean(process.env.CI),\n nodeVersion: process.version,\n lifeVersion: packageJson.version,\n osName: os.platform(),\n osVersion: os.release(),\n cpuCount: os.cpus().length,\n cpuArchitecture: os.arch(),\n schemaVersion: \"1\",\n } as const;\n }\n\n protected getCurrentSpanData() {\n return this.#spanDataContext.getStore();\n }\n\n protected runWithSpanData(spanData: TelemetrySpan | undefined, fn: () => unknown) {\n return this.#spanDataContext.run(spanData, fn);\n }\n}\n\nexport function createTelemetryClient<Scope extends keyof typeof telemetryNodeScopesDefinition>(\n scope: Scope,\n requiredAttributes: TelemetryScopeAttributes<\n (typeof telemetryNodeScopesDefinition)[Scope][\"requiredAttributesSchema\"]\n >,\n) {\n const client = new TelemetryNodeClient(scope);\n for (const [key, value] of Object.entries(requiredAttributes)) client.setAttribute(key, value);\n return client;\n}\n\n// Register the anonymous data consumer if the project has not opted out\n// if (!process.env.LIFE_TELEMETRY_DISABLED) {\n// TelemetryNodeClient.registerGlobalConsumer(new AnonymousDataConsumer());\n// }\n","import chalk from \"chalk\";\nimport type { TelemetryClient } from \"../clients/base\";\nimport type { TelemetryLogInput } from \"../types\";\n\nexport const pipeConsoleToTelemetryClient = (telemetry: TelemetryClient) => {\n const consoleMethods = [\"log\", \"error\", \"warn\", \"info\", \"debug\"] as const;\n for (const method of consoleMethods) {\n console[method] = (...args: unknown[]) => {\n const logLine = args.map((arg) => String(arg)).join(\" \");\n let logFn: (input: TelemetryLogInput) => void;\n if (method === \"error\") logFn = telemetry.log.error;\n else if (method === \"warn\") logFn = telemetry.log.warn;\n else if (method === \"info\") logFn = telemetry.log.info;\n else if (method === \"debug\") logFn = telemetry.log.debug;\n else logFn = telemetry.log.info;\n logFn({ message: `${chalk.italic.gray(`(from console.${method})`)} ${logLine}` });\n };\n }\n};\n","import os from \"node:os\";\nimport * as op from \"@/shared/operation\";\n\n/**\n * Accurately track the CPU and memory usage of the current process.\n */\nexport class ProcessStats {\n #lastCpuUsage = process.cpuUsage();\n #lastSampleTime = Date.now();\n readonly #cpu = {\n usedPercent: 0,\n usedNs: 0,\n };\n\n constructor() {\n this.#updateCpuStats();\n const interval = setInterval(() => this.#updateCpuStats(), 1000);\n interval.unref();\n }\n\n #updateCpuStats(): void {\n const currentCpuUsage = process.cpuUsage();\n const currentTime = Date.now();\n const deltaTime = currentTime - this.#lastSampleTime;\n\n if (deltaTime > 0) {\n const deltaCpu =\n currentCpuUsage.user -\n this.#lastCpuUsage.user +\n (currentCpuUsage.system - this.#lastCpuUsage.system);\n const cpuPercent = (deltaCpu / (deltaTime * 1000)) * 100;\n this.#cpu.usedPercent = Math.min(100, Math.max(0, cpuPercent));\n }\n\n this.#cpu.usedNs = (currentCpuUsage.user + currentCpuUsage.system) * 1000;\n this.#lastCpuUsage = currentCpuUsage;\n this.#lastSampleTime = currentTime;\n }\n\n get() {\n try {\n const memoryUsed = process.memoryUsage().rss;\n const totalMemory = os.totalmem();\n const freeMemory = os.freemem();\n return op.success({\n cpu: this.#cpu,\n memory: {\n usedPercent: (memoryUsed / totalMemory) * 100,\n totalBytes: totalMemory,\n freeBytes: freeMemory,\n usedBytes: memoryUsed,\n },\n });\n } catch (error) {\n return op.failure({ code: \"Unknown\", cause: error });\n }\n }\n}\n"],"mappings":"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","names":["os","os"]}