- enforce canonical dimensions across app and MCP surfaces - prioritize title-first node search in UI and query tools - add regression tests for ranking and dimension validation
65 lines
2.1 KiB
TypeScript
65 lines
2.1 KiB
TypeScript
import { tool } from 'ai';
|
|
import { z } from 'zod';
|
|
import { getInternalApiBaseUrl } from '@/services/runtime/apiBase';
|
|
|
|
export const createDimensionTool = tool({
|
|
description: 'Create a new dimension only when the user explicitly instructs you to do so. Always provide a description explaining what belongs in this category.',
|
|
inputSchema: z.object({
|
|
name: z.string().describe('Dimension name'),
|
|
description: z.string().min(1).max(500).describe('Dimension description explaining what content belongs in this dimension (required, max 500 characters)')
|
|
}),
|
|
execute: async (params) => {
|
|
console.log('📁 CreateDimension tool called with params:', JSON.stringify(params, null, 2));
|
|
try {
|
|
const trimmedName = params.name.trim();
|
|
if (!trimmedName) {
|
|
return {
|
|
success: false,
|
|
error: 'Dimension name is required',
|
|
data: null
|
|
};
|
|
}
|
|
|
|
// Call POST /api/dimensions
|
|
const response = await fetch(`${getInternalApiBaseUrl()}/api/dimensions`, {
|
|
method: 'POST',
|
|
headers: { 'Content-Type': 'application/json' },
|
|
body: JSON.stringify({
|
|
name: trimmedName,
|
|
description: params.description.trim()
|
|
})
|
|
});
|
|
|
|
if (!response.ok) {
|
|
let errorMessage = 'Failed to create dimension';
|
|
try {
|
|
const errorResult = await response.json();
|
|
errorMessage = errorResult.error || errorMessage;
|
|
} catch {
|
|
// If response is not JSON (e.g., HTML error page), use status text
|
|
errorMessage = `Failed to create dimension: ${response.status} ${response.statusText}`;
|
|
}
|
|
return {
|
|
success: false,
|
|
error: errorMessage,
|
|
data: null
|
|
};
|
|
}
|
|
|
|
const result = await response.json();
|
|
|
|
return {
|
|
success: true,
|
|
data: result.data,
|
|
message: `Created dimension "${trimmedName}"${params.description ? ' with description' : ''}`
|
|
};
|
|
} catch (error) {
|
|
return {
|
|
success: false,
|
|
error: error instanceof Error ? error.message : 'Failed to create dimension',
|
|
data: null
|
|
};
|
|
}
|
|
}
|
|
});
|