{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://docs.px.dev/schemas/pxl-script.json",
  "title": "Pixie PxL Script",
  "description": "Schema representing a Pixie PxL script definition including its source code, arguments, and execution metadata. PxL is a Python-dialect domain-specific language for querying eBPF-collected telemetry data in Kubernetes clusters.",
  "type": "object",
  "required": ["pxl"],
  "properties": {
    "id": {
      "type": "string",
      "format": "uuid",
      "description": "Unique identifier of the PxL script."
    },
    "name": {
      "type": "string",
      "description": "Human-readable name of the PxL script.",
      "maxLength": 200
    },
    "description": {
      "type": "string",
      "description": "Description of what the script does and what telemetry data it queries."
    },
    "pxl": {
      "type": "string",
      "description": "Source code of the PxL script. Must be valid PxL, a Python-dialect DSL. Scripts typically import the px module, create DataFrames from Pixie tables, apply filters and aggregations, and call px.display() to output results.",
      "minLength": 1
    },
    "vis": {
      "$ref": "#/$defs/VisSpec",
      "description": "Optional visualization specification describing how to render the script's output in the Pixie UI."
    },
    "args": {
      "type": "array",
      "description": "List of argument definitions for parameterizing the script.",
      "items": {
        "$ref": "#/$defs/ScriptArg"
      }
    },
    "hidden": {
      "type": "boolean",
      "description": "If true, the script is hidden from the Pixie Live UI script selector."
    },
    "orgID": {
      "type": "string",
      "format": "uuid",
      "description": "Identifier of the organization that owns this script."
    },
    "createdAt": {
      "type": "string",
      "format": "date-time",
      "description": "Timestamp when the script was created."
    },
    "updatedAt": {
      "type": "string",
      "format": "date-time",
      "description": "Timestamp when the script was last updated."
    }
  },
  "$defs": {
    "ScriptArg": {
      "type": "object",
      "description": "An argument definition for a parameterized PxL script, enabling scripts to accept runtime input values.",
      "required": ["name"],
      "properties": {
        "name": {
          "type": "string",
          "description": "Name of the argument, matching the parameter name in the PxL script function signature."
        },
        "description": {
          "type": "string",
          "description": "Human-readable description of what this argument controls."
        },
        "defaultValue": {
          "type": "string",
          "description": "Default value for this argument when not provided by the caller."
        },
        "validValues": {
          "type": "array",
          "description": "Optional list of valid values for this argument, used to populate dropdowns in the UI.",
          "items": {
            "type": "string"
          }
        },
        "semantic_type": {
          "type": "string",
          "description": "Semantic type hint for argument rendering in the Pixie Live UI.",
          "enum": [
            "ST_NONE",
            "ST_SERVICE_NAME",
            "ST_POD_NAME",
            "ST_POD_PHASE",
            "ST_NODE_NAME",
            "ST_NAMESPACE_NAME",
            "ST_SCRIPT_REFERENCE",
            "ST_DURATION_NS",
            "ST_BYTES",
            "ST_PERCENT",
            "ST_THROUGHPUT_PER_NS",
            "ST_THROUGHPUT_BYTES_PER_NS",
            "ST_QUANTILES",
            "ST_IP_ADDRESS",
            "ST_PORT",
            "ST_HTTP_RESP_STATUS",
            "ST_HTTP_RESP_MESSAGE",
            "ST_HTTP_REQ_METHOD",
            "ST_HTTP_CONTENT_TYPE"
          ]
        }
      }
    },
    "VisSpec": {
      "type": "object",
      "description": "Visualization specification defining how to render a PxL script's output in the Pixie Live UI.",
      "properties": {
        "variables": {
          "type": "array",
          "description": "Variable definitions for the visualization, bound to script arguments.",
          "items": {
            "$ref": "#/$defs/VisVariable"
          }
        },
        "widgets": {
          "type": "array",
          "description": "Widget definitions describing how each output table should be visualized.",
          "items": {
            "$ref": "#/$defs/VisWidget"
          }
        },
        "globalFuncOutputName": {
          "type": "string",
          "description": "Name of the global function to call when the visualization renders."
        }
      }
    },
    "VisVariable": {
      "type": "object",
      "description": "A variable in the visualization spec, binding a UI control to a PxL script argument.",
      "required": ["name", "type"],
      "properties": {
        "name": {
          "type": "string",
          "description": "Name of the variable, matching a PxL script argument name."
        },
        "type": {
          "type": "string",
          "description": "Type of the variable controlling which UI widget is rendered.",
          "enum": [
            "PX_STRING",
            "PX_STRINGLIST",
            "PX_BOOL",
            "PX_INT64",
            "PX_FLOAT64",
            "PX_SERVICE",
            "PX_POD",
            "PX_NODE",
            "PX_NAMESPACE",
            "PX_DURATION_NS",
            "PX_LIST"
          ]
        },
        "description": {
          "type": "string",
          "description": "Description displayed in the UI for this variable."
        },
        "defaultValue": {
          "type": "string",
          "description": "Default value for the variable."
        }
      }
    },
    "VisWidget": {
      "type": "object",
      "description": "A visualization widget displaying PxL script output in the Pixie Live UI.",
      "required": ["name"],
      "properties": {
        "name": {
          "type": "string",
          "description": "Name of the widget, used as a label in the UI."
        },
        "position": {
          "$ref": "#/$defs/WidgetPosition"
        },
        "func": {
          "$ref": "#/$defs/WidgetFunc"
        },
        "displaySpec": {
          "$ref": "#/$defs/DisplaySpec"
        }
      }
    },
    "WidgetPosition": {
      "type": "object",
      "description": "Position and dimensions of a widget in the dashboard grid layout.",
      "properties": {
        "x": {
          "type": "integer",
          "description": "Horizontal position in grid columns.",
          "minimum": 0
        },
        "y": {
          "type": "integer",
          "description": "Vertical position in grid rows.",
          "minimum": 0
        },
        "w": {
          "type": "integer",
          "description": "Width in grid columns.",
          "minimum": 1
        },
        "h": {
          "type": "integer",
          "description": "Height in grid rows.",
          "minimum": 1
        }
      }
    },
    "WidgetFunc": {
      "type": "object",
      "description": "Reference to a PxL function that produces data for this widget.",
      "required": ["name"],
      "properties": {
        "name": {
          "type": "string",
          "description": "Name of the PxL function to call."
        },
        "args": {
          "type": "array",
          "description": "Arguments to pass to the PxL function, bound to visualization variables.",
          "items": {
            "type": "object",
            "properties": {
              "name": {
                "type": "string",
                "description": "Argument name matching the PxL function parameter."
              },
              "variable": {
                "type": "string",
                "description": "Name of the visualization variable to bind to this argument."
              },
              "value": {
                "type": "string",
                "description": "Literal value for this argument."
              }
            }
          }
        }
      }
    },
    "DisplaySpec": {
      "type": "object",
      "description": "Display configuration for a visualization widget specifying chart type and axes.",
      "properties": {
        "@type": {
          "type": "string",
          "description": "Protobuf type URL identifying the display specification type.",
          "examples": [
            "types.px.dev/px.vispb.TimeseriesChart",
            "types.px.dev/px.vispb.BarChart",
            "types.px.dev/px.vispb.Table",
            "types.px.dev/px.vispb.StatChart",
            "types.px.dev/px.vispb.ScatterPlotChart"
          ]
        },
        "title": {
          "type": "string",
          "description": "Chart title displayed in the UI."
        }
      }
    }
  },
  "examples": [
    {
      "name": "HTTP Overview",
      "description": "Shows an overview of HTTP traffic in the cluster including request rates, latency, and error rates.",
      "pxl": "import px\ndf = px.DataFrame(table='http_events', start_time='-5m')\ndf = df[['time_', 'upid', 'req_path', 'req_method', 'resp_status', 'resp_latency_ns']]\npx.display(df, 'http_events')",
      "args": [
        {
          "name": "start_time",
          "description": "Start time for the query window.",
          "defaultValue": "-5m",
          "semantic_type": "ST_DURATION_NS"
        }
      ]
    }
  ]
}
