Replaces the single 800-line tools.ts and its switch dispatcher with a Theia-inspired registry pattern — each tool domain is its own file, and dispatch is a plain Map.get() call with no central routing function. New structure in src/tools/: registry.ts — ToolDefinition (with handler), registerTool(), executeTool(), ALL_TOOLS context.ts — ToolContext, MemoryUpdate interfaces security.ts — PROTECTED_* constants + assertGiteaWritable/assertCoolifyDeployable utils.ts — safeResolve(), EXCLUDED set file.ts — read_file, write_file, replace_in_file, list_directory, find_files, search_code shell.ts — execute_command git.ts — git_commit_and_push coolify.ts — coolify_*, list_all_apps, get_app_status, deploy_app gitea.ts — gitea_*, list_repos, list_all_issues, read_repo_file agent.ts — spawn_agent, get_job_status memory.ts — save_memory index.ts — barrel with side-effect imports + re-exports Adding a new tool now requires only a new file + registerTool() call. No switch statement, no shared array to edit. External API unchanged. Made-with: Cursor
28 lines
1.1 KiB
TypeScript
28 lines
1.1 KiB
TypeScript
import { registerTool } from './registry';
|
|
|
|
registerTool({
|
|
name: 'save_memory',
|
|
description: 'Persist an important fact about this project to long-term memory. Use this to save decisions, tech stack choices, feature descriptions, constraints, or goals so they are remembered across conversations.',
|
|
parameters: {
|
|
type: 'object',
|
|
properties: {
|
|
key: { type: 'string', description: 'Short unique label (e.g. "primary_language", "auth_strategy", "deploy_target")' },
|
|
type: {
|
|
type: 'string',
|
|
enum: ['tech_stack', 'decision', 'feature', 'goal', 'constraint', 'note'],
|
|
description: 'Category of the memory item'
|
|
},
|
|
value: { type: 'string', description: 'The fact to remember (1-3 sentences)' }
|
|
},
|
|
required: ['key', 'type', 'value']
|
|
},
|
|
async handler(args, ctx) {
|
|
ctx.memoryUpdates.push({
|
|
key: String(args.key),
|
|
type: String(args.type),
|
|
value: String(args.value)
|
|
});
|
|
return { saved: true, key: args.key, type: args.type };
|
|
}
|
|
});
|