feat: DeepSeek API integration + Whale lift (hooks, tool repair, MCP permissions, token tracking)
DeepSeek API: - @ai-sdk/deepseek provider replaces openai-compatible for deepseek-* models - Token tracking: cache_hit/reasoning tokens flow API → DB → WS frames → UI - thinking effort levels (off/low/medium/high/xhigh/max) via AGENTS.md frontmatter - V4 models: deepseek-v4-flash, deepseek-v4-pro - Wired for both chat and coder panes Whale lifts: - Tool input repair (schema-based type coercion, markdown link unwrapping) - Hooks system (6 lifecycle events, shell exec, JSON stdin/stdout contract) - Per-MCP-server permissions (allow/ask/deny) - token tracking UI (cache N, think N in message stats line) Infra: - New DB columns: messages.cache_tokens, messages.reasoning_tokens - New WS frame fields: cache_tokens, reasoning_tokens on message_complete - coder provider snapshot merges DeepSeek models alongside llama-swap
This commit is contained in:
@@ -31,11 +31,14 @@ interface McpToolDef {
|
||||
annotations?: McpToolAnnotations;
|
||||
}
|
||||
|
||||
export type McpPermission = 'allow' | 'ask' | 'deny';
|
||||
|
||||
interface ServerState {
|
||||
client: Client;
|
||||
transport: StreamableHTTPClientTransport | StdioClientTransport;
|
||||
tools: ToolDef<Record<string, unknown>>[];
|
||||
type: 'streamableHttp' | 'stdio';
|
||||
permission: McpPermission;
|
||||
}
|
||||
|
||||
// ---- Module-level state ----
|
||||
@@ -137,6 +140,14 @@ export async function callTool(
|
||||
}
|
||||
}
|
||||
|
||||
/** Return the permission level for a given MCP server. Defaults to 'allow' if unknown. */
|
||||
export function getServerPermission(prefixedToolName: string): McpPermission {
|
||||
const serverName = toolToServer.get(prefixedToolName);
|
||||
if (!serverName) return 'allow';
|
||||
const state = servers.get(serverName);
|
||||
return state?.permission ?? 'allow';
|
||||
}
|
||||
|
||||
/** Return all wrapped ToolDefs from all connected servers, flattened. */
|
||||
export function getTools(): ToolDef<Record<string, unknown>>[] {
|
||||
const all: ToolDef<Record<string, unknown>>[] = [];
|
||||
@@ -214,7 +225,8 @@ async function connectServer(entry: McpServerEntry): Promise<void> {
|
||||
toolToServer.set(wrapped.name, name);
|
||||
}
|
||||
|
||||
servers.set(name, { client, transport, tools, type: config.type });
|
||||
const permission = (config as { permission?: McpPermission }).permission ?? 'allow';
|
||||
servers.set(name, { client, transport, tools, type: config.type, permission });
|
||||
|
||||
log!.info(
|
||||
{ server: name, type: config.type, count: tools.length, names: tools.map((t) => t.name) },
|
||||
|
||||
Reference in New Issue
Block a user