feat: Add intelligent auto-router and enhanced integrations

- Add intelligent-router.sh hook for automatic agent routing
- Add AUTO-TRIGGER-SUMMARY.md documentation
- Add FINAL-INTEGRATION-SUMMARY.md documentation
- Complete Prometheus integration (6 commands + 4 tools)
- Complete Dexto integration (12 commands + 5 tools)
- Enhanced Ralph with access to all agents
- Fix /clawd command (removed disable-model-invocation)
- Update hooks.json to v5 with intelligent routing
- 291 total skills now available
- All 21 commands with automatic routing

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
admin
2026-01-28 00:27:56 +04:00
Unverified
parent 3b128ba3bd
commit b52318eeae
1724 changed files with 351216 additions and 0 deletions

View File

@@ -0,0 +1,107 @@
import React from 'react';
import { Sparkles, FlaskConical, Zap } from 'lucide-react';
import type { LLMProvider } from '@dexto/core';
// Provider logo file mapping - single source of truth
// Empty string means "use Bot icon fallback" in components
export const PROVIDER_LOGOS: Record<LLMProvider, string> = {
openai: '/logos/openai.svg',
anthropic: '/logos/claude-color.svg',
google: '/logos/gemini-color.svg',
groq: '/logos/groq.svg',
xai: '/logos/grok.svg',
'openai-compatible': '/logos/openai.svg',
cohere: '/logos/cohere-color.svg',
openrouter: '/logos/openrouter.svg',
litellm: '/logos/litellm.svg',
glama: '/logos/glama.svg',
vertex: '/logos/gemini-color.svg', // Vertex AI uses Gemini logo (primary model family)
bedrock: '/logos/aws-color.svg',
local: '', // Uses Bot icon fallback - local GGUF models via node-llama-cpp
ollama: '/logos/ollama.svg', // Ollama server
dexto: '/logos/dexto/dexto_logo_icon.svg', // Dexto gateway - use Dexto logo
};
// Provider pricing URLs (for quick access from Model Picker)
export const PROVIDER_PRICING_URLS: Partial<Record<LLMProvider, string>> = {
openai: 'https://platform.openai.com/docs/pricing',
anthropic: 'https://www.anthropic.com/pricing#api',
google: 'https://ai.google.dev/gemini-api/docs/pricing',
groq: 'https://groq.com/pricing/',
xai: 'https://docs.x.ai/docs/models',
cohere: 'https://cohere.com/pricing',
openrouter: 'https://openrouter.ai/models',
litellm: 'https://docs.litellm.ai/',
glama: 'https://glama.ai/',
vertex: 'https://cloud.google.com/vertex-ai/generative-ai/pricing',
bedrock: 'https://aws.amazon.com/bedrock/pricing/',
// TODO: make this a valid URL
dexto: 'https://dexto.ai/pricing',
// 'openai-compatible' intentionally omitted (varies by vendor)
};
// Helper: Format pricing from permillion to perthousand tokens
export function formatPricingLines(pricing?: {
inputPerM?: number;
outputPerM?: number;
cacheReadPerM?: number;
cacheWritePerM?: number;
currency?: 'USD';
unit?: 'per_million_tokens';
}): string[] {
if (!pricing) return [];
// Bail early if required pricing fields are missing
if (pricing.inputPerM == null || pricing.outputPerM == null) return [];
const currency = pricing.currency || 'USD';
const cur = currency === 'USD' ? '$' : '';
const lines: string[] = [];
lines.push(
`Cost: ${cur}${pricing.inputPerM.toFixed(2)} in / ${cur}${pricing.outputPerM.toFixed(2)} out per 1M tokens`
);
if (pricing.cacheReadPerM != null) {
lines.push(`Cache read: ${cur}${pricing.cacheReadPerM.toFixed(2)} per 1M tokens`);
}
if (pricing.cacheWritePerM != null) {
lines.push(`Cache write: ${cur}${pricing.cacheWritePerM.toFixed(2)} per 1M tokens`);
}
return lines;
}
// Logos that have hardcoded colors and don't need dark mode inversion
export const COLORED_LOGOS: readonly LLMProvider[] = [
'google',
'cohere',
'anthropic',
'vertex',
'dexto',
] as const;
// Helper to check if a logo needs dark mode inversion
export const needsDarkModeInversion = (provider: LLMProvider): boolean => {
return !COLORED_LOGOS.includes(provider);
};
// Helper to check if a provider has a logo
export const hasLogo = (provider: LLMProvider): boolean => {
return !!PROVIDER_LOGOS[provider];
};
// Model capability icons - sleek emojis for current capabilities
export const CAPABILITY_ICONS = {
// File type capabilities (what we currently use)
image: <span className="text-sm">🖼</span>,
audio: <span className="text-sm">🎵</span>,
pdf: <span className="text-sm">📄</span>,
// Other capabilities we currently have
reasoning: <span className="text-sm">🧠</span>,
experimental: (
<FlaskConical className="h-3.5 w-3.5 text-muted-foreground hover:text-amber-500 transition-colors cursor-help" />
),
new: (
<Sparkles className="h-3.5 w-3.5 text-muted-foreground hover:text-yellow-500 transition-colors cursor-help" />
),
realtime: (
<Zap className="h-3.5 w-3.5 text-muted-foreground hover:text-blue-500 transition-colors cursor-help" />
),
};