Skip to content

Configuration Schema

Alessio Rocchi edited this page Jan 29, 2026 · 2 revisions

Configuration Schema

Complete configuration schema reference.


Full Schema

interface AgentStackConfig {
  version: string;
  providers: ProvidersConfig;
  memory: MemoryConfig;
  agents: AgentsConfig;
  github: GitHubConfig;
  plugins: PluginsConfig;
  mcp: MCPConfig;
  auth: AuthConfig;
  hooks: HooksConfig;
  driftDetection?: DriftDetectionConfig;
  consensus?: ConsensusConfig;
  resourceExhaustion?: ResourceExhaustionConfig;
}

interface ProvidersConfig {
  default: string;
  anthropic?: {
    apiKey: string;
    model?: string;
    maxTokens?: number;
    temperature?: number;
  };
  openai?: {
    apiKey: string;
    model?: string;
    maxTokens?: number;
    temperature?: number;
  };
  ollama?: {
    baseUrl: string;
    model?: string;
    maxTokens?: number;
    temperature?: number;
  };
}

interface MemoryConfig {
  path: string;
  defaultNamespace: string;
  vectorSearch?: {
    enabled: boolean;
    provider: 'openai' | 'ollama';
    model?: string;
    dimensions?: number;
  };
  options?: {
    verbose?: boolean;
    fileMustExist?: boolean;
    timeout?: number;
  };
}

interface AgentsConfig {
  maxConcurrent: number;
  defaultTimeout: number;
  retryAttempts?: number;
  retryDelay?: number;
}

interface GitHubConfig {
  enabled: boolean;
  useGhCli?: boolean;
  token?: string;
}

interface PluginsConfig {
  enabled: boolean;
  directory: string;
  autoload?: boolean;
}

interface MCPConfig {
  transport: 'stdio' | 'http';
  port?: number;
  host?: string;
  verbose?: boolean;
  timeout?: number;
}

interface AuthConfig {
  enabled: boolean;
  jwtSecret?: string;
  accessTokenExpiry?: string;
  refreshTokenExpiry?: string;
}

interface HooksConfig {
  sessionStart: boolean;
  sessionEnd: boolean;
  preTask: boolean;
  postTask: boolean;
}

interface DriftDetectionConfig {
  enabled: boolean;
  threshold?: number;           // Default: 0.95
  warningThreshold?: number;    // Default: undefined (no warning)
  ancestorDepth?: number;       // Default: 3
  behavior?: 'warn' | 'prevent'; // Default: 'warn'
  asyncEmbedding?: boolean;     // Default: true
}

interface ConsensusConfig {
  enabled: boolean;
  requireForRiskLevels?: TaskRiskLevel[]; // Default: ['high', 'medium']
  reviewerStrategy?: 'adversarial' | 'different-model' | 'human';
  timeout?: number;             // Default: 300000 (5 minutes)
  maxDepth?: number;            // Default: 5
  autoReject?: boolean;         // Default: false
  highRiskAgentTypes?: string[];
  mediumRiskAgentTypes?: string[];
  highRiskPatterns?: string[];
  mediumRiskPatterns?: string[];
}

interface ResourceExhaustionConfig {
  enabled: boolean;
  warningThresholdPercent?: number; // Default: 0.8
  checkIntervalMs?: number;         // Default: 60000
  pauseOnIntervention?: boolean;    // Default: true
  autoTerminate?: boolean;          // Default: false
  thresholds?: ResourceThresholds;
}

interface ResourceThresholds {
  maxFilesAccessed?: number;           // Default: 100
  maxApiCalls?: number;                // Default: 50
  maxSubtasksSpawned?: number;         // Default: 20
  maxTokensConsumed?: number;          // Default: 100000
  maxTimeWithoutDeliverableMs?: number; // Default: 300000
}

type TaskRiskLevel = 'low' | 'medium' | 'high';

Example

{
  "version": "1.0.0",
  "providers": {
    "default": "anthropic",
    "anthropic": {
      "apiKey": "${ANTHROPIC_API_KEY}",
      "model": "claude-sonnet-4-20250514"
    }
  },
  "memory": {
    "path": "./data/aistack.db",
    "defaultNamespace": "default",
    "vectorSearch": {
      "enabled": true,
      "provider": "openai"
    }
  },
  "agents": {
    "maxConcurrent": 10,
    "defaultTimeout": 300
  },
  "github": {
    "enabled": true,
    "useGhCli": true
  },
  "plugins": {
    "enabled": true,
    "directory": "./plugins"
  },
  "mcp": {
    "transport": "stdio"
  },
  "auth": {
    "enabled": true,
    "jwtSecret": "${JWT_SECRET}"
  },
  "hooks": {
    "sessionStart": true,
    "sessionEnd": true,
    "preTask": true,
    "postTask": true
  },
  "driftDetection": {
    "enabled": true,
    "threshold": 0.95,
    "warningThreshold": 0.85,
    "ancestorDepth": 3,
    "behavior": "warn",
    "asyncEmbedding": true
  },
  "consensus": {
    "enabled": true,
    "requireForRiskLevels": ["high", "medium"],
    "reviewerStrategy": "adversarial",
    "timeout": 300000,
    "maxDepth": 5,
    "autoReject": false,
    "highRiskAgentTypes": ["coder", "devops", "security-auditor"],
    "mediumRiskAgentTypes": ["architect", "coordinator", "analyst"],
    "highRiskPatterns": ["delete", "remove", "drop", "deploy", "production"],
    "mediumRiskPatterns": ["modify", "update", "change", "configure"]
  },
  "resourceExhaustion": {
    "enabled": true,
    "warningThresholdPercent": 0.8,
    "checkIntervalMs": 60000,
    "pauseOnIntervention": true,
    "autoTerminate": false,
    "thresholds": {
      "maxFilesAccessed": 100,
      "maxApiCalls": 50,
      "maxSubtasksSpawned": 20,
      "maxTokensConsumed": 100000,
      "maxTimeWithoutDeliverableMs": 300000
    }
  }
}

Related:

Clone this wiki locally