AkurAI Build
Menu

popagent

public

Latest change 7fe5fe2acff014eed98cc59694a021837a6713c6 - Serialize code-intelligence sessions per repository and self-heal corrupt or locked indexes by AkurAI Build

import type { IMastraLogger } from "@mastra/core/logger";
import { PinoLogger } from "@mastra/loggers";
import { MastraStorageExporter, Observability, SamplingStrategyType } from "@mastra/observability";
import { AGENT_CONTEXT_KEYS } from "./agent-context";

export const OBSERVABILITY_SENSITIVE_FIELDS = [
  "password", "token", "secret", "key", "apikey", "auth", "authorization",
  "bearer", "bearertoken", "jwt", "credential", "clientsecret", "privatekey",
  "refresh", "ssn", "value",
];

/**
 * Mastra warnings that describe expected, correctly-handled behaviour. They
 * still land in the log, at info, so operators are not paged by them:
 * - a specialist's requested delegation budget is capped to the configured
 *   specialist step budget every time the Orchistrator asks for more.
 */
const EXPECTED_WARNINGS = [
  /^Delegation maxSteps exceeds sub-agent default, capping$/,
];

class PopagentLogger extends PinoLogger {
  override warn(message: string, args?: Record<string, unknown>): void {
    if (EXPECTED_WARNINGS.some((pattern) => pattern.test(message))) {
      super.info(message, args);
      return;
    }
    super.warn(message, args);
  }
}

export const logger = new PopagentLogger({
  name: "popagent",
  level: process.env.POPAGENT_ISOLATED_TEST === "1" ? "silent" : "info",
  prettyPrint: process.env.NODE_ENV !== "production",
  redact: {
    paths: [
      "authorization",
      "headers.authorization",
      "apiKey",
      "token",
      "secret",
      "value",
      "password",
    ],
    censor: "[REDACTED]",
  },
});

let activeLogger: IMastraLogger = logger;
export const appLogger = () => activeLogger;
export const setAppLogger = (next: IMastraLogger) => { activeLogger = next; };

export const observability = new Observability({
  configs: {
    default: {
      serviceName: "popagent",
      sampling: { type: SamplingStrategyType.ALWAYS },
      exporters: [new MastraStorageExporter({ strategy: "auto" })],
      requestContextKeys: [
        AGENT_CONTEXT_KEYS.resourceId,
        AGENT_CONTEXT_KEYS.sessionId,
        AGENT_CONTEXT_KEYS.turnId,
        AGENT_CONTEXT_KEYS.model,
        AGENT_CONTEXT_KEYS.workspaceId,
        AGENT_CONTEXT_KEYS.executionSource,
        AGENT_CONTEXT_KEYS.taskId,
        AGENT_CONTEXT_KEYS.scheduleId,
      ],
      serializationOptions: {
        maxStringLength: 4_096,
        maxDepth: 8,
        maxArrayLength: 100,
        maxObjectKeys: 75,
      },
      logging: { enabled: true, level: "info" },
    },
  },
  sensitiveDataFilter: {
    sensitiveFields: OBSERVABILITY_SENSITIVE_FIELDS,
    redactionStyle: "full",
    redactionToken: "[REDACTED]",
  },
});