edge:
  id: "edge-example"
  name: "Example Edge"

server:
  listen: "0.0.0.0:9090"
  # advertise_host is the host other components (Node bootstrap, OpenAI client)
  # use to reach this edge. Empty means resolve automatically from interfaces.
  advertise_host: ""

# bootstrap is the artifact/bootstrap channel iop-edge can render in
# bootstrap commands and `env` output. Leave artifact_base_url empty until a
# field channel is provisioned.
bootstrap:
  artifact_base_url: ""

tls:
  enabled: false

logging:
  level: "info"
  pretty: true
  # path is the edge log file. Empty falls back to <binary-dir>/logs/edge.log
  # for the bundled dev binary; explicit values win.
  path: ""

metrics:
  port: 19092

# control_plane connects this Edge to a Control Plane instance.
# Set enabled: true and wire_addr to the Control Plane TCP endpoint to
# activate the outbound connector. Leave enabled: false (default) for
# standalone / local-only Edge deployments.
control_plane:
  enabled: false
  wire_addr: ""
  reconnect_interval_sec: 5

# refresh enables the Edge-local admin API used by `iop-edge config refresh`.
# Keep it loopback-only unless an operator-specific access control layer is added.
refresh:
  enabled: false
  listen: "127.0.0.1:19093"

a2a:
  enabled: false
  listen: "0.0.0.0:8081"
  path: "/a2a"
  node: ""
  adapter: "cli"
  session_id: "a2a"
  timeout_sec: 120
  bearer_token: ""

openai:
  enabled: false
  listen: "0.0.0.0:18081"
  bearer_token: ""
  node: ""
  adapter: "ollama"
  target: ""
  models: []
  # Legacy/compatibility model_routes (discouraged for new deploys).
  # model_routes was the adapter/target route catalog that mapped external model
  # ids to adapter + target. It is superseded by the provider-pool approach:
  #   1. Define canonical routing keys with models[].
  #   2. Declare provider candidates with nodes[].providers[].
  #   3. Link them via models[].providers[provider_id] = served_model.
  # For details see the Provider-pool section below.
  # This block is a backward-compat fallback only. New deploys should use
  # top-level models[] + nodes[].providers[].
  session_id: "openai"
  timeout_sec: 120
  strict_output: true
  strict_stream_buffer: false

# === Provider-pool (models[] / nodes[].providers[]) — recommended ===
# Top-level models[] defines canonical routing keys and their provider-pool mapping.
# Each entry id is the external model id; providers map maps provider id → served model.
#
# Example:
#   models:
#     - id: "qwen3.6:35b"
#       display_name: "Qwen 3.6 35B"
#       providers:
#         vllm-gpu: "nvidia/Qwen3.6-35B-A3B-NVFP4"
#         ollama-local: "qwen3.6:35b"
#
# nodes[].providers[] defines each provider candidate with catalog and execution fields (Provider-First).
# nodes[].providers[].id is the stable provider identity referenced by models[].providers keys.
# nodes[].providers[].type — runtime type (vllm, ollama, lemonade, sglang, openai_api, cli).
# nodes[].providers[].category — "api", "cli", or "local_inference".
# nodes[].providers[].endpoint / base_url / command — type-specific execution fields.
# nodes[].providers[].models — served model names this provider can serve.
# nodes[].providers[].health — observed health state string.
# nodes[].providers[].capacity — provider-pool max concurrent execution slots; 0 is not dispatchable.
# nodes[].providers[].max_queue — max queue depth (per-provider).
# nodes[].providers[].queue_timeout_ms — queue timeout in milliseconds.
# nodes[].providers[].lifecycle_capabilities — coarse lifecycle capabilities list.
# nodes[].providers[].enabled — on/off dispatch switch; omit or true = enabled, false = excluded from
#   dispatch pool. Disabled providers appear in status with status=disabled, capacity=0. Does not
#   stop adapter processes. Classified as live-apply (no restart required) on config refresh.

console:
  adapter: "cli"
  target: "codex"
  session_id: "default"
  background: false
  timeout_sec: 240

# Top-level models[] defines canonical routing keys and their provider-pool mapping.
# models[].id is the external model id; providers maps provider id → served model.
models:
  - id: "qwen3.6:35b"
    display_name: "Qwen 3.6 35B"
    providers:
      mac-mlx-vllm: "mlx-community/Qwen3.6-35B-A3B-4bit"
  # Example: CLI providers (codex, codex-exec) do not serve models.
  # They are declared in nodes[].providers[] for dispatch, not in models[].
  #   - id: "codex-task"
  #     providers:
  #       codex: "app-server"
  #       codex-exec: "exec"

nodes:
  # id is the stable node identity; omitting it falls back to an auto UUID (dev only).
  # agent_kind selects the registration kind; omitting it defaults to "generic-node".
  # Allowed values: "generic-node" (default).
  #
  # Provider-First example (recommended):
  - id: "node-example-01"
    alias: "example-node"
    token: "<node-token>"
    agent_kind: "generic-node"
    providers:
      - id: "claude-tui"
        type: "cli"
        category: "cli"
        command: "claude"
        args:
          - "--dangerously-skip-permissions"
        env:
          - "TERM=xterm-256color"
        mode: "persistent-lazy"
        capacity: 1
      - id: "codex"
        type: "cli"
        category: "cli"
        command: "codex"
        args:
          - "app-server"
        mode: "codex-app-server"
        capacity: 1
      - id: "codex-exec"
        type: "cli"
        category: "cli"
        command: "codex"
        args:
          - "exec"
          - "--json"
        resume_args:
          - "exec"
          - "resume"
          - "--json"
        output_format: "codex-json"
        mode: "codex-exec"
        capacity: 1
      # Mac MLX vLLM provider (local GPU inference).
      # Tracked secrets (API key, etc.) are not stored in this file.
      - id: "mac-mlx-vllm"
        type: "openai_api"
        category: "local_inference"
        endpoint: "http://127.0.0.1:8002/v1"
        models:
          - "mlx-community/Qwen3.6-35B-A3B-4bit"
        health: "healthy"
        capacity: 3
    # Legacy adapters configuration (compat override example):
    # adapters:
    #   cli:
    #     enabled: true
    #     profiles:
    #       claude-tui:
    #         command: "claude"
    #         args:
    #           - "--dangerously-skip-permissions"
    #         env:
    #           - "TERM=xterm-256color"
    #         persistent: true
    #         terminal: true
    #         response_idle_timeout_ms: 5000
    #         startup_idle_timeout_ms: 5000
    #         mode: "persistent-lazy"
    #       codex:
    #         command: "codex"
    #         args:
    #           - "app-server"
    #         mode: "codex-app-server"
    #       codex-exec:
    #         command: "codex"
    #         args:
    #           - "exec"
    #           - "--json"
    #         resume_args:
    #           - "exec"
    #           - "resume"
    #           - "--json"
    #         output_format: "codex-json"
    #         mode: "codex-exec"
    runtime:
      concurrency: 1

# === Provider-pool example (recommended) ===
# Full example node with provider pool (Provider-First).
# nodes[].providers[].id is the stable provider identity referenced by models[].providers keys.
# nodes:
#   - id: "node-gpu-01"
#     alias: "gpu-node"
#     providers:
#       - id: "vllm-gpu"
#         type: "vllm"
#         category: "api"
#         endpoint: "http://127.0.0.1:8000/v1"
#         models:
#           - "nvidia/Qwen3.6-35B-A3B-NVFP4"
#         health: "healthy"
#         capacity: 4
#         max_queue: 16
#         queue_timeout_ms: 30000
#         priority: 1
#         request_timeout_ms: 120000
#         lifecycle_capabilities: ["scale_up", "scale_down"]
#         # enabled: false  # exclude from dispatch pool (live-apply)
#       - id: "ollama-local"
#         type: "ollama"
#         category: "local_inference"
#         base_url: "http://127.0.0.1:11434"
#         models:
#           - "qwen3.6:35b"
#         health: "healthy"
#         capacity: 2
#         max_queue: 8
#         queue_timeout_ms: 30000
#         priority: 2
#
# === Legacy adapters (compat override example — discouraged for new deploys) ===
# Only use when explicit adapter instance override or compatibility before compilation is required.
#   - id: "node-vllm-01"
#     alias: "vllm-gpu-node"
#     token: "<node-token>"
#     adapters:
#       openai_compat_instances:
#         - name: "vllm-gpu"
#           enabled: true
#           provider: "vllm"
#           endpoint: "http://127.0.0.1:8000/v1"
#           capacity: 4
#           max_queue: 16
#           queue_timeout_ms: 30000
#     providers:
#       - id: "vllm-gpu-legacy"
#         type: "vllm"
#         category: "api"
#         adapter: "vllm-gpu"
#         models:
#           - "nvidia/Qwen3.6-35B-A3B-NVFP4"
