{
  "title": "Website content, ready to compare — settings",
  "type": "object",
  "schemaVersion": 1,
  "properties": {
    "startUrls": {
      "title": "Public pages and optional reference IDs",
      "type": "array",
      "editor": "json",
      "description": "Up to 10 public HTTP(S) URLs or objects {url,externalId}. Empty uses the Python documentation sample. No login, private IPs or custom request credentials.",
      "default": [
        "https://docs.python.org/3/library/urllib.parse.html"
      ],
      "prefill": [
        "https://docs.python.org/3/library/urllib.parse.html"
      ],
      "sectionCaption": "Pages and crawl scope"
    },
    "maxPages": {
      "title": "Maximum page attempts across sources",
      "type": "integer",
      "editor": "number",
      "description": "Global fetch-attempt cap across all roots, including failed/duplicate requests. A capped crawl preserves its prior baseline and cannot establish removals.",
      "default": 10,
      "minimum": 1,
      "maximum": 100
    },
    "maxDepth": {
      "title": "Discovered-link depth",
      "type": "integer",
      "editor": "number",
      "description": "0 means supplied pages only. Higher values follow same-origin links inside the root path (or explicit pathPrefix); completeness is only for this declared scope.",
      "default": 0,
      "minimum": 0,
      "maximum": 5
    },
    "pathPrefix": {
      "title": "Allowed path for discovered links",
      "type": "string",
      "editor": "textfield",
      "description": "Absolute path such as /docs/. Otherwise infer the root directory/path. Not a regex. Applies to links; the supplied start URL itself is always requested."
    },
    "maxPageCharacters": {
      "title": "Maximum extracted characters per page",
      "type": "integer",
      "editor": "number",
      "description": "Larger pages return explicitly truncated content and never replace history. A global 2,000,000-character cap also applies.",
      "default": 100000,
      "minimum": 1000,
      "maximum": 250000
    },
    "chunkCharacters": {
      "title": "Chunk size — characters, not tokens",
      "type": "integer",
      "editor": "number",
      "description": "Approximate maximum Unicode string length, not model tokens. Chunks preserve heading paths; changing this value starts a new comparison scope.",
      "default": 2400,
      "minimum": 500,
      "maximum": 8000
    },
    "comparePrevious": {
      "title": "Compare complete saved scopes",
      "type": "boolean",
      "editor": "checkbox",
      "description": "Opt in to named-store history. First complete run establishes a baseline. Unchanged checks still return and bill a real observation.",
      "default": false,
      "sectionCaption": "Saved comparisons"
    },
    "baselineKey": {
      "title": "Comparison history name",
      "type": "string",
      "editor": "textfield",
      "description": "One writer per namespace. A separate namespace starts independent history. Letters, digits, underscores and hyphens only.",
      "default": "default",
      "pattern": "^[-\\w]{1,80}$"
    },
    "maxRunSeconds": {
      "title": "Run time budget (seconds)",
      "type": "integer",
      "editor": "number",
      "description": "Total work budget, also bounded by the platform deadline minus 25 seconds. Unfinished work is reported.",
      "default": 240,
      "minimum": 30,
      "maximum": 3600,
      "sectionCaption": "Run budget"
    }
  },
  "required": [],
  "description": "For documentation and knowledge-base pipelines, extract public pages into Markdown with stable chunk identities and optional comparisons. Static HTML within the declared depth and path scope. This Actor creates no embeddings and calls no language model."
}
