- port retrieval, validation, and eval improvements relevant to os - align prompts and dimensions with the flat single-agent model - replace the old eval suite with the focused core scenarios Generated with Codex
94 lines
3.2 KiB
TypeScript
94 lines
3.2 KiB
TypeScript
import { tool } from 'ai';
|
|
import { z } from 'zod';
|
|
import { edgeService } from '@/services/database/edges';
|
|
import { validateEdgeExplanation } from '@/services/database/quality';
|
|
|
|
export const updateEdgeTool = tool({
|
|
description: 'Update an edge explanation and/or source. Explanations must explicitly state the relationship.',
|
|
inputSchema: z.object({
|
|
edge_id: z.number().describe('The ID of the edge to update'),
|
|
updates: z.object({
|
|
explanation: z.string().optional().describe('Updated relationship explanation'),
|
|
context: z.record(z.any()).optional().describe('Updated context information for this edge - can include explanation, relationship type, strength, notes, etc.'),
|
|
source: z.enum(['user', 'ai_similarity', 'helper_name']).optional().describe('Updated source classification for this edge'),
|
|
}).describe('Fields to update on the edge')
|
|
}),
|
|
execute: async (params) => {
|
|
console.log('📝 UpdateEdge tool called with params:', JSON.stringify(params, null, 2));
|
|
|
|
try {
|
|
// Validate that edge exists before updating
|
|
const existingEdge = await edgeService.getEdgeById(params.edge_id);
|
|
if (!existingEdge) {
|
|
return {
|
|
success: false,
|
|
error: `Edge with ID ${params.edge_id} not found`,
|
|
data: null
|
|
};
|
|
}
|
|
|
|
// Filter out undefined values from updates
|
|
const cleanUpdates = Object.fromEntries(
|
|
Object.entries(params.updates).filter(([_, value]) => value !== undefined)
|
|
);
|
|
|
|
if (Object.keys(cleanUpdates).length === 0) {
|
|
return {
|
|
success: false,
|
|
error: 'No valid updates provided',
|
|
data: existingEdge
|
|
};
|
|
}
|
|
|
|
if (typeof cleanUpdates.explanation === 'string') {
|
|
const explanationError = validateEdgeExplanation(cleanUpdates.explanation);
|
|
if (explanationError) {
|
|
return {
|
|
success: false,
|
|
error: explanationError,
|
|
data: existingEdge
|
|
};
|
|
}
|
|
}
|
|
|
|
if (
|
|
!cleanUpdates.explanation &&
|
|
cleanUpdates.context &&
|
|
typeof cleanUpdates.context === 'object' &&
|
|
!Array.isArray(cleanUpdates.context) &&
|
|
typeof cleanUpdates.context.explanation === 'string'
|
|
) {
|
|
const explanationError = validateEdgeExplanation(cleanUpdates.context.explanation);
|
|
if (explanationError) {
|
|
return {
|
|
success: false,
|
|
error: explanationError,
|
|
data: existingEdge
|
|
};
|
|
}
|
|
}
|
|
|
|
// Update the edge
|
|
const updatedEdge = await edgeService.updateEdge(params.edge_id, cleanUpdates);
|
|
|
|
// Build descriptive message
|
|
const updateDescriptions = [];
|
|
if (cleanUpdates.context) updateDescriptions.push('context');
|
|
if (cleanUpdates.source) updateDescriptions.push(`source to ${cleanUpdates.source}`);
|
|
|
|
return {
|
|
success: true,
|
|
data: updatedEdge,
|
|
message: `Updated edge ${params.edge_id}: ${updateDescriptions.join(', ')}`
|
|
};
|
|
} catch (error) {
|
|
console.error('UpdateEdge tool error:', error);
|
|
return {
|
|
success: false,
|
|
error: error instanceof Error ? error.message : 'Failed to update edge',
|
|
data: null
|
|
};
|
|
}
|
|
}
|
|
});
|