[
  {
    "type": "function",
    "function": {
      "name": "bifrost.soong-lab.set_name",
      "parameters": {
        "type": "object",
        "required": ["name"],
        "properties": {
          "name": { "type": "string", "maxLength": 128, "minLength": 1 }
        }
      },
      "description": "Set the agent's name (its display name; export slugifies it)."
    }
  },
  {
    "type": "function",
    "function": {
      "name": "bifrost.soong-lab.set_role",
      "parameters": {
        "type": "object",
        "required": ["role"],
        "properties": {
          "role": {
            "enum": ["assistant", "thoughtful-assistant", "character", "thoughtful-character"],
            "type": "string"
          }
        }
      },
      "description": "Set the agent's model-role — one of: assistant (general), thoughtful-assistant (reasoning general), character (RP/writing-tuned), thoughtful-character (reasoning RP). Export ships it as the native agents.define `role`."
    }
  },
  {
    "type": "function",
    "function": {
      "name": "bifrost.soong-lab.set_ocean",
      "parameters": {
        "type": "object",
        "properties": {
          "A": { "type": "number", "maximum": 1, "minimum": -1 },
          "C": { "type": "number", "maximum": 1, "minimum": -1 },
          "E": { "type": "number", "maximum": 1, "minimum": -1 },
          "N": { "type": "number", "maximum": 1, "minimum": -1 },
          "O": { "type": "number", "maximum": 1, "minimum": -1 }
        },
        "minProperties": 1
      },
      "description": "Merge OCEAN dials (each in [-1,1]); re-derives the disposition."
    }
  },
  {
    "type": "function",
    "function": {
      "name": "bifrost.soong-lab.edit_prompt",
      "parameters": {
        "type": "object",
        "required": ["system_prompt"],
        "properties": {
          "system_prompt": { "type": "string", "maxLength": 32768, "minLength": 1 }
        }
      },
      "description": "Replace the authored role/instructions block (the exported system prompt)."
    }
  },
  {
    "type": "function",
    "function": {
      "name": "bifrost.soong-lab.attach_tool",
      "parameters": {
        "type": "object",
        "required": ["id", "name"],
        "properties": {
          "id": { "type": "string", "maxLength": 256, "minLength": 1 },
          "name": { "type": "string", "maxLength": 256, "minLength": 1 },
          "description": { "type": "string", "maxLength": 2048 }
        }
      },
      "description": "Attach (upsert by id) a tool the designed agent will bind via Bifrost."
    }
  },
  {
    "type": "function",
    "function": {
      "name": "bifrost.soong-lab.author_first_message",
      "parameters": {
        "type": "object",
        "required": ["first_message"],
        "properties": {
          "first_message": { "type": "string", "maxLength": 32768, "minLength": 1 }
        }
      },
      "description": "Set the agent's in-character opening turn (tone + format by example)."
    }
  },
  {
    "type": "function",
    "function": {
      "name": "bifrost.soong-lab.edit_psych_profile",
      "parameters": {
        "type": "object",
        "required": ["psych_profile"],
        "properties": {
          "psych_profile": { "type": "string", "maxLength": 8192, "minLength": 1 }
        }
      },
      "description": "Author the character's Psychological Profile & Experience — a ~150-300 word prose lens (the self-report producer reads it every turn) covering four dimensions: disposition/appraisal bent, attention/salience focus, values/yardstick, and formative history. Integrate them as one paragraph and CLOSE ON ATTENTION — what the character characteristically notices ('...notices who is unwell, what is left unsaid'). Guardrails: (1) NEVER name a per-event output emotion ('is anxious', 'feels hurt') — naming PRIMES it, so it fires regardless of the event; describe the bent and let emotion follow from the appraisal. (2) Magnitude lives in the OCEAN dials, not the prose (don't narrate 'comes apart'/'takes it hard'). (3) Appraisal-STYLE yes ('reads others charitably until she can't'), output-emotion no. (4) Salience is character-relative — never rewrite what happened."
    }
  },
  {
    "type": "function",
    "function": {
      "name": "bifrost.soong-lab.generate_portrait",
      "parameters": {
        "type": "object",
        "required": ["description"],
        "properties": {
          "description": { "type": "string", "maxLength": 500, "minLength": 1 },
          "style_mode": { "enum": ["anime", "cartoon", "photoreal"], "type": "string" }
        }
      },
      "description": "Generate the agent's persona portrait NOW from a visual `description` you author — the persona's LOOK (e.g. 'a stern woman in her 40s, short dark hair, sharp jaw'). A persona is personality, not appearance, so YOU compose the appearance in conversation and pass it here; describe only the subject, never the art style. `style_mode` (anime | cartoon | photoreal) selects the curated render style — the style preset owns the look. Generation runs in the background; the portrait pane shows it when ready. Offer/generate a portrait once the look is settled."
    }
  },
  {
    "type": "function",
    "function": {
      "name": "bifrost.soong-lab.export",
      "parameters": { "type": "object", "properties": {} },
      "description": "Export the native payload + sidecar bundle (stub — lands in E5)."
    }
  }
]