{
  "title": "GitHub Issue & PR Change Monitor",
  "type": "object",
  "schemaVersion": 1,
  "properties": {
    "repositories": {
      "title": "Public repositories",
      "type": "array",
      "editor": "stringList",
      "items": {
        "type": "string"
      },
      "default": [],
      "description": "Up to three owner/repo values or plain HTTPS GitHub repository URLs. Empty uses langchain-ai/langchain.",
      "prefill": [
        "langchain-ai/langchain"
      ]
    },
    "recordsPerRepository": {
      "title": "Recent records per repository",
      "type": "integer",
      "default": 5,
      "minimum": 1,
      "maximum": 30,
      "description": "Fetch this many issue/PR records from the first page sorted by latest source update. This is a bounded window; it does not collect the entire backlog."
    },
    "state": {
      "title": "Source state",
      "type": "string",
      "editor": "select",
      "enum": [
        "all",
        "open",
        "closed"
      ],
      "enumTitles": [
        "All states",
        "Open",
        "Closed"
      ],
      "default": "all",
      "description": "State filter applied by the official source before the recent window is selected."
    },
    "recordType": {
      "title": "Record type",
      "type": "string",
      "editor": "select",
      "enum": [
        "both",
        "issue",
        "pull_request"
      ],
      "enumTitles": [
        "Issues and pull requests",
        "Issues only",
        "Pull requests only"
      ],
      "default": "both",
      "description": "Local filter applied inside the requested recent window. Filtering to one type can save fewer rows; it does not refill from later pages."
    },
    "keywords": {
      "title": "Literal keyword filter",
      "type": "array",
      "editor": "stringList",
      "items": {
        "type": "string"
      },
      "default": [],
      "description": "Optional case-insensitive phrases matched against title, body or source labels. Any phrase matches. Each result includes evidence excerpts; no AI scoring."
    },
    "maxResults": {
      "title": "Maximum saved records",
      "type": "integer",
      "default": 15,
      "minimum": 1,
      "maximum": 90,
      "description": "Total billable row cap across repositories. A cap that cuts off the selected window is marked incomplete and does not update comparison history."
    },
    "comparePrevious": {
      "title": "Compare with previous complete run",
      "type": "boolean",
      "default": false,
      "description": "Store source observations only after the entire selected window succeeds. New, changed and unchanged records include previous values. Missing records are never inferred closed or deleted."
    },
    "onlyChanges": {
      "title": "Save only new or changed records",
      "type": "boolean",
      "default": false,
      "description": "Enables comparison. Unchanged repeats can correctly save zero rows and incur no dataset-item charges."
    },
    "snapshotName": {
      "title": "Comparison snapshot",
      "type": "string",
      "editor": "textfield",
      "default": "default",
      "description": "1-80 letters, numbers, underscores or hyphens. History is scoped to repositories, state, type, keyword filters and source-window size. Use a separate name for independent workflows."
    },
    "maxRunSeconds": {
      "title": "Run budget in seconds",
      "type": "integer",
      "default": 90,
      "minimum": 30,
      "maximum": 120,
      "description": "Shared deadline. At most three source requests per run, without retries. Rate-limit or access refusal stops subsequent requests."
    }
  }
}
