{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://www.anguskit.com/schema/anguscopilot/1.0.0/tool.json",
  "title": "AngusCopilot Tool Specification",
  "description": "AngusCopilot Tool 顶层 Spec（specification: anguscopilot-tool/1.0.0）。Tool 是单步原子调用单元。OpenApiTool / McpTool 通常由 Factory 自动生成；此 Spec 用于声明 HttpTool / ScriptTool / JavaTool 等可独立 YAML 化的工具。",

  "type": "object",
  "required": ["specification", "info", "spec"],

  "properties": {

    "specification": {
      "$ref": "common.json#/$defs/SpecificationField",
      "pattern": "^anguscopilot-tool\\/(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-(?:alpha|beta|rc)(?:\\.(?:0|[1-9]\\d*))?)?$"
    },

    "info": { "$ref": "info.json" },

    "spec": {
      "type": "object",
      "required": ["implementation", "input", "output"],
      "properties": {

        "implementation": {
          "description": "Tool 实现类型。",
          "type": "string",
          "enum": ["javaBean", "http", "script"]
        },

        "input": {
          "description": "Tool 输入参数 JSON Schema。",
          "$ref": "common.json#/$defs/JsonSchemaRef"
        },
        "output": {
          "description": "Tool 输出结果 JSON Schema。",
          "$ref": "common.json#/$defs/JsonSchemaRef"
        },

        "safety": {
          "description": "Tool 安全等级。",
          "type": "string",
          "enum": ["safe", "destructive", "sensitive"],
          "default": "safe"
        },

        "streaming": {
          "description": "是否支持流式输出。",
          "type": "boolean",
          "default": false
        },

        "tags": {
          "type": "array",
          "items": { "type": "string" },
          "uniqueItems": true
        },

        "javaBean": {
          "description": "implementation=javaBean 时，引用的 Spring Bean 与方法。",
          "type": "object",
          "required": ["bean", "method"],
          "properties": {
            "bean": { "type": "string" },
            "method": { "type": "string" }
          },
          "unevaluatedProperties": false
        },

        "http": {
          "description": "implementation=http 时，HTTP 端点配置。",
          "type": "object",
          "required": ["url", "method"],
          "properties": {
            "url": { "type": "string", "format": "uri-template" },
            "method": {
              "type": "string",
              "enum": ["GET", "POST", "PUT", "PATCH", "DELETE"]
            },
            "headers": {
              "type": "object",
              "additionalProperties": { "type": "string" }
            },
            "queryTemplate": {
              "type": "object",
              "additionalProperties": { "type": "string" }
            },
            "bodyTemplate": { "type": "string" },
            "credentialRef": { "$ref": "common.json#/$defs/SecretRef" },
            "timeout": { "$ref": "common.json#/$defs/Duration" }
          },
          "unevaluatedProperties": false
        },

        "script": {
          "description": "implementation=script 时，脚本内容与运行时。",
          "type": "object",
          "required": ["language", "source"],
          "properties": {
            "language": {
              "type": "string",
              "enum": ["groovy", "javascript"]
            },
            "source": { "type": "string" },
            "timeout": { "$ref": "common.json#/$defs/Duration" },
            "memoryLimitMb": { "type": "integer", "minimum": 16, "maximum": 1024 }
          },
          "unevaluatedProperties": false
        },

        "rateLimit": {
          "type": "object",
          "properties": {
            "qps": { "type": "number", "exclusiveMinimum": 0 },
            "concurrency": { "type": "integer", "minimum": 1 }
          },
          "unevaluatedProperties": false
        },

        "cache": {
          "type": "object",
          "properties": {
            "enabled": { "type": "boolean", "default": false },
            "ttl": { "$ref": "common.json#/$defs/Duration" },
            "keyTemplate": { "type": "string" }
          },
          "unevaluatedProperties": false
        }
      },
      "patternProperties": { "^x-": true },
      "unevaluatedProperties": false,

      "$comment": "implementation 与配套字段必填检查；DELETE/PUT/POST 默认推导 destructive。",
      "allOf": [
        {
          "if": { "properties": { "implementation": { "const": "javaBean" } }, "required": ["implementation"] },
          "then": { "required": ["javaBean"] }
        },
        {
          "if": { "properties": { "implementation": { "const": "http" } }, "required": ["implementation"] },
          "then": { "required": ["http"] }
        },
        {
          "if": { "properties": { "implementation": { "const": "script" } }, "required": ["implementation"] },
          "then": { "required": ["script"] }
        },
        {
          "$comment": "HTTP DELETE/PUT/POST 默认推导 destructive；若用户显式声明 safe，需明确通过 x-safety-override 字段确认。",
          "if": {
            "properties": {
              "implementation": { "const": "http" },
              "http": {
                "properties": { "method": { "enum": ["DELETE", "PUT", "POST"] } },
                "required": ["method"]
              },
              "safety": { "const": "safe" }
            },
            "required": ["implementation", "http", "safety"]
          },
          "then": {
            "required": ["x-safety-override"],
            "properties": {
              "x-safety-override": { "const": true }
            }
          }
        }
      ]
    }
  },
  "patternProperties": { "^x-": true },
  "unevaluatedProperties": false
}
