)]}'
{
  "commit": "7bbbd2fdacce2cc81679c6d57a770a1091fc6663",
  "tree": "8c590b112ace08633a00779b12affe9555f87946",
  "parents": [
    "b2ee721a2cd30181b2759c00f359d115e2859a8c"
  ],
  "author": {
    "name": "Vikram Koka",
    "email": "vikram@astronomer.io",
    "time": "Wed Aug 12 21:45:31 2026 -0700"
  },
  "committer": {
    "name": "Vikram Koka",
    "email": "vikram@astronomer.io",
    "time": "Wed Aug 12 21:45:31 2026 -0700"
  },
  "message": "Add BaseManagedAgentToolset for vendor-managed AI agents\n\nCloud vendors now run agents on the user\u0027s behalf -- Snowflake Cortex Agents,\nAmazon Bedrock AgentCore, Azure AI Foundry hosted agents, Vertex AI Agent\nEngine. Their reasoning loops execute on the vendor\u0027s infrastructure, so they\nare not something AgentOperator can run, only something an Airflow task can\nconsult. Each provider that has added support so far arrived at a different\nidentity scheme, request shape, and invoke verb, so a Dag author who learns one\nlearns nothing transferable about the next.\n\nRather than unify them behind an operator facade -- their invocation semantics\ngenuinely differ, from sync request/response to async jobs writing to object\nstorage to stateful sessions -- converge them at the tool boundary, where a\nsingle call with validated arguments and a serialisable result is the same shape\neverywhere. Provider packages subclass this contract so credentials keep\nflowing through their own hooks and no new connection types are needed.\n\nErrors are deliberately sorted into three buckets rather than two: what the\ncalling model can fix by rephrasing, what is terminal, and what is transient\nand belongs to Airflow\u0027s task retry. Collapsing the third into either of the\nothers is how these implementations go wrong.\n\nDurable replay is opt-in per implementation, since a managed agent may act on\nsystems Airflow cannot observe and replaying a cached answer could skip a side\neffect.\n\nAlso promotes the private tool-result serialiser out of HookToolset into the\nshared tool_definition utils so both toolsets use one implementation.\n",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "34a8b43f417273d87db4152052b2fa03bb5c2365",
      "old_mode": 33188,
      "old_path": "providers/common/ai/docs/toolsets.rst",
      "new_id": "eb393713bd8aec1b58b899a1ec2b8a802451233a",
      "new_mode": 33188,
      "new_path": "providers/common/ai/docs/toolsets.rst"
    },
    {
      "type": "modify",
      "old_id": "b6133e2e2e458e1e75aa152d22e79ffa44f02006",
      "old_mode": 33188,
      "old_path": "providers/common/ai/provider.yaml",
      "new_id": "5335de6179b198ff0b0c4b23f0b003aa1b528328",
      "new_mode": 33188,
      "new_path": "providers/common/ai/provider.yaml"
    },
    {
      "type": "modify",
      "old_id": "d0412fb2a48672c87928a528d64d8c86cf069b1b",
      "old_mode": 33188,
      "old_path": "providers/common/ai/src/airflow/providers/common/ai/exceptions.py",
      "new_id": "d02748d4a3aabad6ec1c31c27053a5fac8de2fb1",
      "new_mode": 33188,
      "new_path": "providers/common/ai/src/airflow/providers/common/ai/exceptions.py"
    },
    {
      "type": "modify",
      "old_id": "6c30fa4a7336c4621135f12e92cd141442d4fbb9",
      "old_mode": 33188,
      "old_path": "providers/common/ai/src/airflow/providers/common/ai/toolsets/__init__.py",
      "new_id": "362692de249d682ffc15ea0a6118a33b9225aba3",
      "new_mode": 33188,
      "new_path": "providers/common/ai/src/airflow/providers/common/ai/toolsets/__init__.py"
    },
    {
      "type": "modify",
      "old_id": "63037e1a4f8f9d31f1abeb46381e5377f11d29d6",
      "old_mode": 33188,
      "old_path": "providers/common/ai/src/airflow/providers/common/ai/toolsets/hook.py",
      "new_id": "13412b82c3509ff6bd81a3081044a8eff1adfcb3",
      "new_mode": 33188,
      "new_path": "providers/common/ai/src/airflow/providers/common/ai/toolsets/hook.py"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "03ff1c54f3c5396011aa2c9c82d596a1ee0f1e5b",
      "new_mode": 33188,
      "new_path": "providers/common/ai/src/airflow/providers/common/ai/toolsets/managed_agent.py"
    },
    {
      "type": "modify",
      "old_id": "9f4fb04b87b4403accb54f219b5433d773020e5a",
      "old_mode": 33188,
      "old_path": "providers/common/ai/src/airflow/providers/common/ai/utils/tool_definition.py",
      "new_id": "28639701d943e926ffc131991805004c761dbdba",
      "new_mode": 33188,
      "new_path": "providers/common/ai/src/airflow/providers/common/ai/utils/tool_definition.py"
    },
    {
      "type": "modify",
      "old_id": "ae2d4c6f86754bc680cfc7b80e6ac303c2414ae5",
      "old_mode": 33188,
      "old_path": "providers/common/ai/tests/unit/common/ai/toolsets/test_hook.py",
      "new_id": "b8ce959db02ecb87e0769cc4d264457b96c3d1f7",
      "new_mode": 33188,
      "new_path": "providers/common/ai/tests/unit/common/ai/toolsets/test_hook.py"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "cfc7904badd412ff22883ac41bdae3d16eb73dd1",
      "new_mode": 33188,
      "new_path": "providers/common/ai/tests/unit/common/ai/toolsets/test_managed_agent.py"
    }
  ]
}
