{"version":3,"file":"tools-command.mjs","names":[],"sources":["../../../src/commands/tools-command.ts"],"sourcesContent":["/**\n * Tools commands — list, inspect, enable, disable, and delete user-defined tools.\n *\n * /tools            — List all user-defined tools (default action)\n * /tools list       — Same as above\n * /tools info <name> — Show details for a specific user tool\n * /tools enable <name>  — Enable a disabled user tool\n * /tools disable <name> — Disable a user tool (keeps definition, stops execution)\n * /tools delete <name>  — Delete a user tool permanently\n *\n * Tool creation is done via the LLM (natural language) — the agent calls\n * UserToolService.create() based on user intent. This command is for\n * management only.\n */\n\nimport { getUserToolService, type UserTool } from '../services/user-tool-service.js';\n\n// ─── Helpers ────────────────────────────────────────────────────────────\n\nfunction formatToolSummary(tool: UserTool): string {\n  const status = tool.enabled ? 'enabled' : 'disabled';\n  const type = tool.definition.type;\n  const uses = tool.usageCount;\n  const budget = tool.maxBudgetUsd;\n  const tags = tool.tags.length > 0 ? ` [${tool.tags.join(', ')}]` : '';\n  return `  **${tool.name}** (${type}, ${status}) — ${tool.description.slice(0, 60)}${tool.description.length > 60 ? '...' : ''}\\n    Uses: ${uses} | Budget: $${budget}/exec${tags}`;\n}\n\nfunction formatToolDetail(tool: UserTool): string {\n  const lines: string[] = [];\n  lines.push(`**${tool.label}** (\\`${tool.name}\\`)`);\n  lines.push(`  Type: ${tool.definition.type}`);\n  lines.push(`  Status: ${tool.enabled ? 'enabled' : 'disabled'}`);\n  lines.push(`  Description: ${tool.description}`);\n  lines.push(`  Created by: ${tool.createdBy}`);\n  lines.push(`  Uses: ${tool.usageCount} | Budget: $${tool.maxBudgetUsd}/exec`);\n  lines.push(`  Write tool: ${tool.isWrite ? 'yes' : 'no'}`);\n  if (tool.tags.length > 0) lines.push(`  Tags: ${tool.tags.join(', ')}`);\n\n  // Parameters\n  if (tool.params.length > 0) {\n    lines.push(`  Parameters:`);\n    for (const p of tool.params) {\n      const req = p.required ? 'required' : 'optional';\n      const def = p.default !== undefined ? ` (default: ${p.default})` : '';\n      lines.push(`    - ${p.name} (${p.type}, ${req})${def}: ${p.description}`);\n    }\n  } else {\n    lines.push(`  Parameters: none`);\n  }\n\n  // Definition details\n  switch (tool.definition.type) {\n    case 'api_connector':\n      lines.push(`  Endpoint: ${tool.definition.method} ${tool.definition.baseUrl}${tool.definition.path}`);\n      if (tool.definition.resultPath) lines.push(`  Result path: ${tool.definition.resultPath}`);\n      break;\n    case 'composed':\n      lines.push(`  Steps (${tool.definition.steps.length}):`);\n      for (let i = 0; i < tool.definition.steps.length; i++) {\n        const s = tool.definition.steps[i]!;\n        lines.push(`    ${i + 1}. ${s.label} → ${s.tool}`);\n      }\n      break;\n    case 'custom':\n      lines.push(`  Behavior: ${tool.definition.behavior.slice(0, 120)}${tool.definition.behavior.length > 120 ? '...' : ''}`);\n      lines.push(`  Allowed tools: ${tool.definition.allowedTools.join(', ')}`);\n      lines.push(`  Max calls: ${tool.definition.maxCalls ?? 5}`);\n      break;\n  }\n\n  const created = new Date(tool.createdAt).toLocaleDateString();\n  const updated = new Date(tool.updatedAt).toLocaleDateString();\n  lines.push(`  Created: ${created} | Updated: ${updated}`);\n\n  return lines.join('\\n');\n}\n\n// ─── Commands ───────────────────────────────────────────────────────────\n\nexport const toolsCommand = {\n  name: 'tools',\n  description: 'Manage user-defined tools: list, info, enable, disable, delete',\n  acceptsArgs: true,\n  requireAuth: true,\n  handler: async (ctx?: any) => {\n    const rawArgs = (ctx?.args ?? '').trim();\n    const parts = rawArgs.split(/\\s+/);\n    const subcommand = parts[0] || 'list';\n    const arg = parts.slice(1).join(' ');\n\n    const service = getUserToolService();\n\n    switch (subcommand) {\n      case 'list': {\n        const tools = service.list();\n        if (tools.length === 0) {\n          return {\n            text: '**User Tools:** None defined yet.\\n\\n' +\n              'Ask the agent to create a tool for you in natural language, e.g.:\\n' +\n              '  \"Create a tool that checks the ETH price on CoinGecko\"\\n' +\n              '  \"Make a composed tool that swaps ETH→USDC then checks my balance\"',\n          };\n        }\n\n        const enabled = tools.filter(t => t.enabled);\n        const disabled = tools.filter(t => !t.enabled);\n\n        const sections: string[] = [];\n        sections.push(`**User Tools** (${tools.length} total, ${enabled.length} enabled)`);\n\n        if (enabled.length > 0) {\n          sections.push(`\\n**Enabled:**\\n${enabled.map(formatToolSummary).join('\\n')}`);\n        }\n        if (disabled.length > 0) {\n          sections.push(`\\n**Disabled:**\\n${disabled.map(formatToolSummary).join('\\n')}`);\n        }\n\n        sections.push('\\nUse `/tools info <name>` for details, `/tools enable|disable|delete <name>` to manage.');\n\n        return { text: sections.join('\\n') };\n      }\n\n      case 'info': {\n        if (!arg) return { text: 'Usage: `/tools info <tool_name>`' };\n        const tool = service.getByName(arg);\n        if (!tool) return { text: `No user tool named \"${arg}\" found.` };\n        return { text: formatToolDetail(tool) };\n      }\n\n      case 'enable': {\n        if (!arg) return { text: 'Usage: `/tools enable <tool_name>`' };\n        const tool = service.getByName(arg);\n        if (!tool) return { text: `No user tool named \"${arg}\" found.` };\n        if (tool.enabled) return { text: `Tool \"${arg}\" is already enabled.` };\n        service.update(tool.id, { enabled: true });\n        return { text: `Tool \"${arg}\" has been enabled. It will be available for the agent to use.` };\n      }\n\n      case 'disable': {\n        if (!arg) return { text: 'Usage: `/tools disable <tool_name>`' };\n        const tool = service.getByName(arg);\n        if (!tool) return { text: `No user tool named \"${arg}\" found.` };\n        if (!tool.enabled) return { text: `Tool \"${arg}\" is already disabled.` };\n        service.update(tool.id, { enabled: false });\n        return { text: `Tool \"${arg}\" has been disabled. It won't be available until re-enabled.` };\n      }\n\n      case 'delete': {\n        if (!arg) return { text: 'Usage: `/tools delete <tool_name>`' };\n        const tool = service.getByName(arg);\n        if (!tool) return { text: `No user tool named \"${arg}\" found.` };\n        service.delete(tool.id);\n        return { text: `Tool \"${arg}\" has been permanently deleted.` };\n      }\n\n      default:\n        return {\n          text: `Unknown subcommand: \"${subcommand}\".\\n\\n` +\n            'Available: `list`, `info <name>`, `enable <name>`, `disable <name>`, `delete <name>`',\n        };\n    }\n  },\n};\n"],"mappings":"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"}