# Credential-free e2e config template. e2e/playwright.config.mock.ts copies this
# to an ignored runtime path; the in-process fake model (e2e/setup/fake-model.js)
# overrides each run, so the placeholder baseURL below is never contacted.
version: 1.3.11
cache: true

interface:
  # Exercises the cost row in the context usage gauge (off by default).
  # Mock models price at the default rate, so synthetic usage yields a value.
  contextCost: true

# Enables the memory feature so the MEMORIES.USE permission is granted and the
# ephemeral memory badge (inline set_memory/delete_memory tools) is available.
# memory.spec.ts toggles it via the tools dropdown.
memory:
  personalize: true
  tokenLimit: 10000

mcpSettings:
  # Deliberately excludes 127.0.0.1, so the URL-based `e2e-http` server below is blocked
  # at boot (stored as inspectionFailed). mcp-allowlist-override.spec.ts adds that origin
  # via an admin-panel config override and asserts the server reinitializes — proving the
  # admin override is honored by inspection/connection. stdio servers skip this check.
  allowedDomains:
    - https://allowed.example.com

mcpServers:
  e2e-memory:
    type: stdio
    command: node
    args:
      - e2e/setup/fake-mcp-server.js
    title: E2E Memory
    description: Local MCP fixture used by mock end-to-end tests.
    timeout: 30000
  e2e-http:
    type: streamable-http
    url: http://127.0.0.1:8765/mcp
    title: E2E HTTP
    description: Local HTTP MCP fixture for allowlist-override e2e tests.
    timeout: 30000

endpoints:
  # Default capabilities plus run_in_background (off by default upstream) so the
  # background tool-call e2e can opt an MCP tool into detached dispatch.
  agents:
    capabilities:
      - deferred_tools
      - execute_code
      - file_search
      - web_search
      - artifacts
      - subagents
      - actions
      - context
      - skills
      - memory
      - ask_user_question
      - tools
      - chain
      - ocr
      - run_in_background
    # Keep the shared mock profile non-interactive except for the dedicated
    # approval probe. This exercises real HITL pause/resume without wedging the
    # existing file-authoring, steering, background-tool, or MCP specs.
    toolApproval:
      enabled: true
      mode: bypass
      ask:
        - approval_probe_mcp_e2e-memory
      reason: E2E approval required before running {tool}.
      hooks:
        - module: e2e/setup/tool-approval-hook.js
          matcher: ^approval_probe_mcp_e2e-memory$
  custom:
    - name: 'Mock Provider A'
      apiKey: 'e2e-mock-key-a'
      baseURL: 'http://127.0.0.1:8889/v1'
      models:
        default:
          - 'mock-model-a'
        fetch: false
      titleConvo: false
      modelDisplayLabel: 'Mock Provider A'
      customParams:
        defaultParamsEndpoint: anthropic

    - name: 'Mock Provider B'
      apiKey: 'e2e-mock-key-b'
      baseURL: 'http://127.0.0.1:8889/v1'
      models:
        default:
          - 'mock-model-b'
        fetch: false
      titleConvo: false
      modelDisplayLabel: 'Mock Provider B'

    # No model spec mirrors this endpoint's label, so it stays unambiguous in the
    # selector and gives e2e tests a real ephemeral endpoint → model option.
    - name: 'Mock Provider C'
      apiKey: 'e2e-mock-key-c'
      baseURL: 'http://127.0.0.1:8889/v1'
      models:
        default:
          - 'mock-model-c'
        fetch: false
      titleConvo: false
      modelDisplayLabel: 'Mock Provider C'

    # Second non-spec endpoint so e2e tests can switch between two real
    # ephemeral endpoints (e.g. MCP selection persistence across switches).
    - name: 'Mock Provider D'
      apiKey: 'e2e-mock-key-d'
      baseURL: 'http://127.0.0.1:8889/v1'
      models:
        default:
          - 'mock-model-d'
        fetch: false
      titleConvo: false
      modelDisplayLabel: 'Mock Provider D'

    # Activity labels are enabled ONLY here. They get a dedicated endpoint
    # because a label collapses its tool group (a labeled block auto-collapses
    # even at one call), which hides the tool cards other specs assert on —
    # enabling this on a shared endpoint broke steering.spec.ts. Provider D is
    # the unlabeled control. The label call is the one request that leaves the
    # process (e2e/setup/fake-label-server.js serves the baseURL below), and
    # `activityModel` differs from the chat model so a spec can prove the label
    # ran on the configured model rather than the agent's.
    - name: 'Mock Provider E'
      apiKey: 'e2e-mock-key-e'
      baseURL: 'http://127.0.0.1:8889/v1'
      models:
        default:
          - 'mock-model-e'
        fetch: false
      titleConvo: false
      modelDisplayLabel: 'Mock Provider E'
      activityLabel: true
      activityModel: 'mock-label-model'

modelSpecs:
  prioritize: true
  # Enforcement would reject sends from the non-spec paths addedEndpoints
  # exposes below (buildEndpointOption requires a spec when enforce is true).
  enforce: false
  # Surfaces the endpoints menu (modelSelect defaults on when addedEndpoints is
  # set) limited to entries that don't collide with the spec labels above.
  addedEndpoints:
    - 'Mock Provider C'
    - 'Mock Provider D'
    - 'Mock Provider E'
    - 'agents'
  list:
    - name: 'e2e-mock-provider-a'
      label: 'Mock Provider A'
      preset:
        endpoint: 'Mock Provider A'
        model: 'mock-model-a'

    - name: 'e2e-mock-provider-b'
      label: 'Mock Provider B'
      preset:
        endpoint: 'Mock Provider B'
        model: 'mock-model-b'

    - name: 'e2e-icon-spec'
      label: 'E2E Icon Spec'
      iconURL: '/assets/openai.svg'
      preset:
        endpoint: 'Mock Provider A'
        model: 'mock-model-a'

    - name: 'e2e-skill-scope'
      label: 'E2E Skill Scope'
      preset:
        endpoint: 'Mock Provider A'
        model: 'mock-model-a'
      skills:
        - 'e2e-model-spec-allowed'
        - 'e2e-deployment-skill'
        - 'e2e-model-spec-missing'
        - 'e2e-model-spec-inaccessible'

    - name: 'e2e-soft-default'
      label: 'E2E Soft Default'
      softDefault: true
      preset:
        endpoint: 'Mock Provider A'
        model: 'mock-model-a'

    - name: 'e2e-branded'
      label: 'E2E Branded'
      description: '<strong>Branded</strong> answers <img src="/assets/openai.svg" alt="brand icon">'
      showOnLanding: true
      preset:
        endpoint: 'Mock Provider A'
        model: 'mock-model-a'

    - name: 'e2e-starters'
      label: 'E2E Starters'
      conversation_starters:
        - 'E2E_REPLY:starter'
        - 'Plan my week'
        - 'Third starter prompt'
        - 'Fourth starter prompt'
        - 'Fifth starter beyond the cap'
      preset:
        endpoint: 'Mock Provider A'
        model: 'mock-model-a'
