sync: Agent Architecture Overhaul - AI SDK 6 + workflow optimization

Synced from private repo (feature/ai-sdk-6-upgrade):
- Upgrade AI SDK 5 → 6 (packages + API changes)
- Add sqliteQuery tool for flexible read-only queries
- New WorkflowExecutor with workflow-specific tools
- 83% token reduction for workflow execution
- Remove mini-rah dead code (simplified architecture)
- Add context management usage endpoint
- Fix Connect workflow instructions
- Clickable node references in workflow UI

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
“BeeRad”
2026-01-12 20:59:27 +11:00
co-authored by Claude Opus 4.5
parent f9271aeeb4
commit 3f0426ecf4
27 changed files with 3607 additions and 2279 deletions
+2 -2
View File
@@ -1,5 +1,5 @@
import { NextRequest } from 'next/server';
import { streamText, convertToCoreMessages } from 'ai';
import { streamText, convertToModelMessages } from 'ai';
import { createAnthropic } from '@ai-sdk/anthropic';
import { createOpenAI } from '@ai-sdk/openai';
import { getHelperTools, getDefaultToolNamesForRole } from '@/tools/infrastructure/registry';
@@ -265,7 +265,7 @@ export async function POST(request: NextRequest) {
} : {})
}));
const coreMessages = convertToCoreMessages(sanitizedMessages);
const coreMessages = await convertToModelMessages(sanitizedMessages);
const allMessages = [...systemMessages, ...coreMessages];
// Debug logging (can be removed in production)
+28
View File
@@ -0,0 +1,28 @@
import { NextRequest } from 'next/server';
import { getSQLiteClient } from '@/services/database/sqlite-client';
export async function GET(request: NextRequest) {
const sessionId = request.nextUrl.searchParams.get('sessionId');
if (!sessionId) {
return Response.json({ inputTokens: 0 });
}
try {
const sqlite = getSQLiteClient();
const row = sqlite.prepare(`
SELECT json_extract(metadata, '$.input_tokens') as input_tokens
FROM chats
WHERE thread_id LIKE ?
ORDER BY created_at DESC
LIMIT 1
`).get(`%${sessionId}%`) as { input_tokens: number | null } | undefined;
return Response.json({
inputTokens: row?.input_tokens ?? 0
});
} catch (error) {
console.error('Usage fetch error:', error);
return Response.json({ inputTokens: 0 });
}
}