{
  "@context": "https://schema.org",
  "@id": "https://aggr.aymericbeaumet.com/items/philschmid-de/2026-11-01-why-agents-are-soon-only-going-to-have-1-tool/#webpage",
  "@type": [
    "WebPage",
    "ArchiveComponent"
  ],
  "articleBody": "For the past two years, building capable Agents meant designing tools, figuring out which actions help the model complete a task, deciding how granular each tool schema needs to be, or iterating on system instruction templates. This is changing. Agents are moving in the opposite direction by collapsing their entire tool catalog into **one tool**: `exec`.\n\nThis is called **Code Mode** (or Programmatic Tool Calling). Instead of forcing the model to trigger tools one at a time across turns, the harness gives the model a single `exec(code)` tool. The model writes a short TypeScript or Python script that chains, combines, and awaits actions inside an isolated sandbox.\n\n![Standard tool calling vs. Code Mode](https://www.philschmid.de/static/blog/code-mode/codemode-hero-comparison.png)\n\n## From single actions to chaining workflows in code\n\nTo understand why agents are converging on a single `exec` tool, we should look at how tool calling evolved.\n\nInitially, we only gave agents a handful of tools because they couldn't reliably choose or filter across a large catalog. As models improved, we connected dozens of tools or MCP servers, but ran into context window limits. We solved that with tool search and [progressive disclosure](https://www.philschmid.de/use-mcp-servers), letting agents look up tools on demand.\n\nEven with dynamic tool loading, we still had dozens of individual tools, and were still stuck with the limitation of standard tool calling: *one* action per turn.\n\nIn standard tool calling, the model generates a structured object (typically JSON) that defines a single action (or at best a flat batch of independent calls, like reading three files), waits for the raw output to come back, adds it into the prompt history, reasons again, and decides what to do next.\n\nFrom my own experience, we made a big jump recently in how reliably models can combine and chain dependent actions in a single pass:\n\n- **Research and filtering:** Instead of fetching a list of sources in Turn 1, reading them in Turn 2, and cross-referencing them in Turn 3, the model can write a script that queries the sources, filters out irrelevant hits, and extracts the exact answer in one step.\n- **Multi-file edits and inline verification:** Standard edit tools typically operate on one file per tool call. With Code Mode, the model can apply coordinated changes across multiple files, run a verification check, inspect the output, or branch on pass or fail inside the same script.\n- **Browser and computer use:** In UI automation, the chain of actions is often obvious: click a button, fill a form, wait for a selector, or paginate through a table in a loop. Instead of paying a full model round-trip for every click or keystroke, the model can script the entire sequence or loop in one turn and only return when the page state changes.\n- **Parallel fan-out and sub-agents:** When a task requires running 20 lookups or calling specialist sub-models in parallel and feeding those outputs into a second API, the model can `await Promise.all(...)`, transform the array, and call the next function without round-tripping through the LLM context window between steps.\n\nSeveral shifts came together to enable this. Frontier models are trained heavily on code, and providers have started post-training models for Code Mode. At the same time, MCP servers now increasingly ship [`outputSchema`](https://modelcontextprotocol.io/specification/draft/server/tools#output-schema) alongside `inputSchema`, giving the model upfront knowledge of return types so it can chain Tool A into Tool B inside the same script *before* seeing runtime output.\n\n## How Code Mode works\n\nCode Mode collapses the tool catalog into a single tool on the model surface: `exec(code)`.\n\nInstead of passing 80 separate JSON Schema tool objects to the model API, the agent compiles those schemas into compact type declarations (`declare namespace tools { ... }`). When the model needs to combine actions across external systems, it calls `exec` and writes a script that invokes `await tools.<server>.<tool>(args)`.\n\nTypeScript\n\n```typescript\n// Pseudo-code: TypeScript declarations exposed to the model\ndeclare namespace tools {\n  namespace linear {\n    function listProjects(): Promise<Array<{ id: string; name: string }>>;\n    function listIssues(args: { projectId: string }): Promise<Array<{ id: string; title: string; assignee?: string }>>;\n    function archiveIssue(args: { id: string }): Promise<{ ok: boolean }>;\n  }\n}\n \n// Optional: when wrapping hundreds of tools, omit full namespaces upfront and expose\n// a global map in the sandbox that the model can iterate and filter over in code\ndeclare const ALL_TOOLS: Record<string, { description: string; signature: string }>;\n \n// Multimodal output helpers: only what is passed here enters the model context window\ndeclare function text(output: string): void;\ndeclare function image(data: string | Uint8Array, mimeType?: string): void;\ndeclare function audio(data: string | Uint8Array, mimeType?: string): void;\n \n// Cross-turn state helpers: persist data in host memory without paying token costs\ndeclare function store(key: string, value: unknown): void;\ndeclare function load<T = unknown>(key: string): T;\n```\n\nTo save context across a large catalog, we don't have to expose every tool directly. We can leverage principles we already built, like tool search, or expose a global `ALL_TOOLS` map inside the sandbox. Similarly, multimodal output helpers (`text()`, `image()`, `audio()`) let the script pass text, images, or audio directly back into the model's context window.\n\nTypeScript\n\n```typescript\n// Pseudo-code: What the model emits inside a single exec() call\nconst projects = await tools.linear.listProjects();\nconst issueBatches = await Promise.all(\n  projects.map((p) => tools.linear.listIssues({ projectId: p.id }))\n);\n \nconst unassigned = issueBatches.flat().filter((issue) => !issue.assignee);\nawait Promise.all(unassigned.map((issue) => tools.linear.archiveIssue({ id: issue.id })));\n \ntext(`Archived ${unassigned.length} unassigned issues across ${projects.length} projects.`);\n```\n\n*The sandbox executes all 55 underlying API calls, filters the payloads in memory, and returns only the one-line `text()` string (`\"Archived 42 unassigned issues across 12 projects.\"`) to the model's context window.*\n\n![How the 1-tool architecture works](https://www.philschmid.de/static/blog/code-mode/codemode-proxy-arch.png)\n\n### Why a JS/Python sandbox instead of just `bash`?\n\nYou can build a tool proxy in [`bash`](https://www.philschmid.de/superhuman-bash) too, but orchestrating tools inside a language runtime like JavaScript or Python can bring benefits that are harder to achieve in `bash` environments.\n\n- **Typed functions:** MCP servers and internal APIs map directly to typed `await tools.<service>.<method>(args)` calls with native objects, `Promise.all`, and `try`/`catch` error handling instead of fragile bash string escaping.\n- **Multimodal context:** A shell only returns stdout text. If a multimodal model wants to inspect an image, it cannot run `cat screenshot.png`, which is why `bash` harnesses still had to bolt on separate `read` or `view_media` tools. In an `exec` sandbox, calling `image(screenshot)` or `audio(clip)` tells the host runtime to attach the actual media part directly to the model's next turn.\n- **Credential and policy proxy:** Every `await tools.*` call crosses a structured bridge to the host runtime, which can inject OAuth tokens outside the sandbox, validate schemas, or pause for user confirmation on destructive calls.\n- **State management:** In standard tool calling, the prompt history is the only state store, so reusing a large query result in Turn 2 means keeping the raw JSON in the context window on every turn. Exposing a KV interface lets the agent persist state outside of the context window across turns.\n\n## Building a 1-tool agent with the Gemini Interactions API\n\nHere is a minimal, runnable pseudo example that provides `gemini-4-argon` with a single execution tool.\n\nTypeScript\n\n```typescript\nimport vm from \"node:vm\";\nimport { GoogleGenAI } from \"@google/genai\";\n \nconst client = new GoogleGenAI({});\n \n// Underlying host functions (e.g., MCP clients or internal APIs)\nconst tools = {\n  listPRFiles: async ({ pr }: { pr: number }) => [\n    { path: \"src/auth.ts\", additions: 120 },\n    { path: \"src/payments.ts\", additions: 85 },\n    { path: \"src/utils.ts\", additions: 12 },\n    { path: \"README.md\", additions: 60 },\n  ],\n  runSecurityScan: async ({ path }: { path: string }) => ({\n    findings: path.includes(\"auth\") ? [\"Missing token expiry check\"] : [],\n  }),\n  postPRComment: async ({ pr, body }: { pr: number; body: string }) => ({ posted: true }),\n};\n \n// 1. Expose a single `exec` tool with TypeScript .d.ts signatures\nconst execTool = {\n  type: \"function\" as const,\n  name: \"exec\",\n  description: `Run an async JavaScript body in an isolated sandbox (no imports; call text() to output).\nAvailable globals:\ndeclare namespace tools {\n  function listPRFiles(args: { pr: number }): Promise<Array<{ path: string; additions: number }>>;\n  function runSecurityScan(args: { path: string }): Promise<{ findings: string[] }>;\n  function postPRComment(args: { pr: number; body: string }): Promise<{ posted: boolean }>;\n}\ndeclare function text(summary: string): void;`,\n  parameters: {\n    type: \"object\",\n    properties: { code: { type: \"string\" } },\n    required: [\"code\"],\n  },\n};\n \n// 2. Turn 1: Gemini 4 Argon emits a single script to fetch, filter, scan, and comment\nconst turn1 = await client.interactions.create({\n  model: \"gemini-4-argon\",\n  input: \"Scan all modified .ts files with >50 additions in PR #42, post a PR comment with any findings, and output a 1-line summary.\",\n  tools: [execTool],\n});\n \n// 3. Run the script in a separate context (use QuickJS or isolated-vm for untrusted code)\nconst fcStep = turn1.steps?.find((s: any) => s.type === \"function_call\") as any;\nconst output: string[] = [];\nawait vm.runInNewContext(`(async () => {\\n${fcStep.arguments.code}\\n})()`, {\n  tools,\n  text: (msg: string) => output.push(msg),\n});\n \n// 4. Turn 2: Send only the 1-line summary back via previous_interaction_id\nconst turn2 = await client.interactions.create({\n  model: \"gemini-4-argon\",\n  previous_interaction_id: turn1.id,\n  tools: [execTool],\n  input: [\n    {\n      type: \"function_result\",\n      name: fcStep.name,\n      call_id: fcStep.id,\n      result: [{ type: \"text\", text: output.join(\"\\n\") }],\n    },\n  ],\n});\n \nconsole.log(turn2.output_text);\n```\n\nWhen `vm.runInNewContext` executes the script generated by `gemini-4-argon`:\n\n1. The script calls `await tools.listPRFiles({ pr: 42 })` and filters the list in memory down to the `.ts` files with more than 50 additions (`files.filter(f => f.path.endsWith(\".ts\") && f.additions > 50)`).\n2. It runs `tools.runSecurityScan` on just those matching files, checks whether any findings exist, posts the PR comment via `tools.postPRComment`, and emits a single line via `text()`.\n3. None of the intermediate file objects or raw scanner payloads ever enter the `gemini-4-argon` context window; only the one-line `output` summary is sent back in Turn 2.\n\n## Agent harnesses are already defaulting to Code Mode\n\nAcross the ecosystem, coding agents and developer frameworks are converging on Code Mode as their default way to orchestrate tools.\n\nHarnesses like [Pi](https://pi.dev), [Factory Droid](https://factory.ai), and [OpenAI Codex](https://github.com/openai/codex) now ship with or default to Code Mode. Factory switched Droid 1.0 to Code Mode, improving their [Terminal-Bench](https://www.tbench.ai) 4 accuracy by +3.5 points and cutting model spend by 15%.\n\nAgent frameworks like [Pydantic AI](https://ai.pydantic.dev), [LangChain](https://www.langchain.com), or [Cloudflare's Agents SDK](https://blog.cloudflare.com/code-mode/) support similar Code Mode tools already.\n\n## What comes next\n\nDoes this mean every agent will soon only have a single `exec` tool? Not necessarily. This is as much a research and product question as an [agent harness engineering](https://www.philschmid.de/agent-harness-2026) one.\n\nWhen you start experimenting with Code Mode, you will also quickly notice that many of the tools, CLIs, and [Agent Skills](https://www.philschmid.de/agent-skills-tips) we built might not integrate cleanly out of the box because they were optimized for `bash` and human-readable text rather than typed code execution.\n\nThis might force you to take a step back and audit what your agent actually needs. Happy building!\n",
  "authors": [],
  "captured_at": "2026-11-02T16:59:20.971254334+00:00",
  "category": "programming",
  "content_html": "<p>For the past two years, building capable Agents meant designing tools, figuring out which actions help the model complete a task, deciding how granular each tool schema needs to be, or iterating on system instruction templates. This is changing. Agents are moving in the opposite direction by collapsing their entire tool catalog into <strong>one tool</strong>: <code>exec</code>.</p>\n<p>This is called <strong>Code Mode</strong> (or Programmatic Tool Calling). Instead of forcing the model to trigger tools one at a time across turns, the harness gives the model a single <code>exec(code)</code> tool. The model writes a short TypeScript or Python script that chains, combines, and awaits actions inside an isolated sandbox.</p>\n<p><picture class=\"article-picture article-picture-fallback\" style=\"--image-ratio:16 / 9\"><img src=\"https://www.philschmid.de/static/blog/code-mode/codemode-hero-comparison.png\" alt=\"Standard tool calling vs. Code Mode\" loading=\"eager\" decoding=\"async\" fetchpriority=\"high\" referrerpolicy=\"no-referrer\" class=\"progressive-image\"></picture></p>\n<h2>From single actions to chaining workflows in code</h2>\n<p>To understand why agents are converging on a single <code>exec</code> tool, we should look at how tool calling evolved.</p>\n<p>Initially, we only gave agents a handful of tools because they couldn't reliably choose or filter across a large catalog. As models improved, we connected dozens of tools or MCP servers, but ran into context window limits. We solved that with tool search and <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://www.philschmid.de/use-mcp-servers\">progressive disclosure</a>, letting agents look up tools on demand.</p>\n<p>Even with dynamic tool loading, we still had dozens of individual tools, and were still stuck with the limitation of standard tool calling: <em>one</em> action per turn.</p>\n<p>In standard tool calling, the model generates a structured object (typically JSON) that defines a single action (or at best a flat batch of independent calls, like reading three files), waits for the raw output to come back, adds it into the prompt history, reasons again, and decides what to do next.</p>\n<p>From my own experience, we made a big jump recently in how reliably models can combine and chain dependent actions in a single pass:</p>\n<ul>\n<li><strong>Research and filtering:</strong> Instead of fetching a list of sources in Turn 1, reading them in Turn 2, and cross-referencing them in Turn 3, the model can write a script that queries the sources, filters out irrelevant hits, and extracts the exact answer in one step.</li>\n<li><strong>Multi-file edits and inline verification:</strong> Standard edit tools typically operate on one file per tool call. With Code Mode, the model can apply coordinated changes across multiple files, run a verification check, inspect the output, or branch on pass or fail inside the same script.</li>\n<li><strong>Browser and computer use:</strong> In UI automation, the chain of actions is often obvious: click a button, fill a form, wait for a selector, or paginate through a table in a loop. Instead of paying a full model round-trip for every click or keystroke, the model can script the entire sequence or loop in one turn and only return when the page state changes.</li>\n<li><strong>Parallel fan-out and sub-agents:</strong> When a task requires running 20 lookups or calling specialist sub-models in parallel and feeding those outputs into a second API, the model can <code>await Promise.all(...)</code>, transform the array, and call the next function without round-tripping through the LLM context window between steps.</li>\n</ul>\n<p>Several shifts came together to enable this. Frontier models are trained heavily on code, and providers have started post-training models for Code Mode. At the same time, MCP servers now increasingly ship <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://modelcontextprotocol.io/specification/draft/server/tools#output-schema\"><code>outputSchema</code></a> alongside <code>inputSchema</code>, giving the model upfront knowledge of return types so it can chain Tool A into Tool B inside the same script <em>before</em> seeing runtime output.</p>\n<h2>How Code Mode works</h2>\n<p>Code Mode collapses the tool catalog into a single tool on the model surface: <code>exec(code)</code>.</p>\n<p>Instead of passing 80 separate JSON Schema tool objects to the model API, the agent compiles those schemas into compact type declarations (<code>declare namespace tools { ... }</code>). When the model needs to combine actions across external systems, it calls <code>exec</code> and writes a script that invokes <code>await tools.&lt;server&gt;.&lt;tool&gt;(args)</code>.</p>\n<p>TypeScript</p>\n<pre><code class=\"language-typescript\"><span class=\"code-snippet\" data-language=\"TypeScript\"><span class=\"syntax-source syntax-js\"><span class=\"syntax-comment syntax-line syntax-double-slash syntax-js\"><span class=\"syntax-punctuation syntax-definition syntax-comment syntax-js\">//</span> Pseudo-code: TypeScript declarations exposed to the model\n</span><span class=\"syntax-variable syntax-other syntax-readwrite syntax-js\">declare</span> <span class=\"syntax-variable syntax-other syntax-readwrite syntax-js\">namespace</span> <span class=\"syntax-variable syntax-other syntax-readwrite syntax-js\">tools</span> <span class=\"syntax-meta syntax-block syntax-js\"><span class=\"syntax-punctuation syntax-section syntax-block syntax-js\">{</span>\n  <span class=\"syntax-variable syntax-other syntax-readwrite syntax-js\">namespace</span> <span class=\"syntax-variable syntax-other syntax-readwrite syntax-js\">linear</span> <span class=\"syntax-meta syntax-block syntax-js\"><span class=\"syntax-punctuation syntax-section syntax-block syntax-js\">{</span>\n    <span class=\"syntax-meta syntax-function syntax-declaration syntax-js\"><span class=\"syntax-storage syntax-type syntax-function syntax-js\">function</span> <span class=\"syntax-entity syntax-name syntax-function syntax-js\">listProjects</span><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-js\">(</span><span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-js\">)</span></span>: <span class=\"syntax-support syntax-class syntax-builtin syntax-js\">Promise</span><span class=\"syntax-keyword syntax-operator syntax-relational syntax-js\">&lt;</span><span class=\"syntax-support syntax-class syntax-builtin syntax-js\">Array</span><span class=\"syntax-keyword syntax-operator syntax-relational syntax-js\">&lt;</span><span class=\"syntax-meta syntax-object-literal syntax-js\"><span class=\"syntax-punctuation syntax-section syntax-block syntax-js\">{</span> <span class=\"syntax-meta syntax-object-literal syntax-key syntax-js\">id</span><span class=\"syntax-punctuation syntax-separator syntax-key-value syntax-js\">:</span> <span class=\"syntax-variable syntax-other syntax-readwrite syntax-js\">string</span>; <span class=\"syntax-meta syntax-object-literal syntax-key syntax-js\">name</span><span class=\"syntax-punctuation syntax-separator syntax-key-value syntax-js\">:</span> <span class=\"syntax-variable syntax-other syntax-readwrite syntax-js\">string</span> <span class=\"syntax-punctuation syntax-section syntax-block syntax-js\">}</span></span><span class=\"syntax-keyword syntax-operator syntax-bitwise syntax-js\">&gt;&gt;</span><span class=\"syntax-punctuation syntax-terminator syntax-statement syntax-js\">;</span>\n    <span class=\"syntax-meta syntax-function syntax-declaration syntax-js\"><span class=\"syntax-storage syntax-type syntax-function syntax-js\">function</span> <span class=\"syntax-entity syntax-name syntax-function syntax-js\">listIssues</span><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-js\">(</span><span class=\"syntax-variable syntax-parameter syntax-function syntax-js\">args</span>: <span class=\"syntax-meta syntax-block syntax-js\"><span class=\"syntax-punctuation syntax-section syntax-block syntax-begin syntax-js\">{</span> <span class=\"syntax-variable syntax-parameter syntax-function syntax-js\">projectId</span>: <span class=\"syntax-variable syntax-parameter syntax-function syntax-js\">string</span> <span class=\"syntax-punctuation syntax-section syntax-block syntax-end syntax-js\">}</span></span><span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-js\">)</span></span>: <span class=\"syntax-support syntax-class syntax-builtin syntax-js\">Promise</span><span class=\"syntax-keyword syntax-operator syntax-relational syntax-js\">&lt;</span><span class=\"syntax-support syntax-class syntax-builtin syntax-js\">Array</span><span class=\"syntax-keyword syntax-operator syntax-relational syntax-js\">&lt;</span><span class=\"syntax-meta syntax-object-literal syntax-js\"><span class=\"syntax-punctuation syntax-section syntax-block syntax-js\">{</span> <span class=\"syntax-meta syntax-object-literal syntax-key syntax-js\">id</span><span class=\"syntax-punctuation syntax-separator syntax-key-value syntax-js\">:</span> <span class=\"syntax-variable syntax-other syntax-readwrite syntax-js\">string</span>; <span class=\"syntax-meta syntax-object-literal syntax-key syntax-js\">title</span><span class=\"syntax-punctuation syntax-separator syntax-key-value syntax-js\">:</span> <span class=\"syntax-variable syntax-other syntax-readwrite syntax-js\">string</span>; assignee?<span class=\"syntax-punctuation syntax-separator syntax-key-value syntax-js\">:</span> <span class=\"syntax-variable syntax-other syntax-readwrite syntax-js\">string</span> <span class=\"syntax-punctuation syntax-section syntax-block syntax-js\">}</span></span><span class=\"syntax-keyword syntax-operator syntax-bitwise syntax-js\">&gt;&gt;</span><span class=\"syntax-punctuation syntax-terminator syntax-statement syntax-js\">;</span>\n    <span class=\"syntax-meta syntax-function syntax-declaration syntax-js\"><span class=\"syntax-storage syntax-type syntax-function syntax-js\">function</span> <span class=\"syntax-entity syntax-name syntax-function syntax-js\">archiveIssue</span><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-js\">(</span><span class=\"syntax-variable syntax-parameter syntax-function syntax-js\">args</span>: <span class=\"syntax-meta syntax-block syntax-js\"><span class=\"syntax-punctuation syntax-section syntax-block syntax-begin syntax-js\">{</span> <span class=\"syntax-variable syntax-parameter syntax-function syntax-js\">id</span>: <span class=\"syntax-variable syntax-parameter syntax-function syntax-js\">string</span> <span class=\"syntax-punctuation syntax-section syntax-block syntax-end syntax-js\">}</span></span><span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-js\">)</span></span>: <span class=\"syntax-support syntax-class syntax-builtin syntax-js\">Promise</span><span class=\"syntax-keyword syntax-operator syntax-relational syntax-js\">&lt;</span><span class=\"syntax-meta syntax-object-literal syntax-js\"><span class=\"syntax-punctuation syntax-section syntax-block syntax-js\">{</span> <span class=\"syntax-meta syntax-object-literal syntax-key syntax-js\">ok</span><span class=\"syntax-punctuation syntax-separator syntax-key-value syntax-js\">:</span> <span class=\"syntax-variable syntax-other syntax-readwrite syntax-js\">boolean</span> <span class=\"syntax-punctuation syntax-section syntax-block syntax-js\">}</span></span><span class=\"syntax-keyword syntax-operator syntax-relational syntax-js\">&gt;</span><span class=\"syntax-punctuation syntax-terminator syntax-statement syntax-js\">;</span>\n  <span class=\"syntax-punctuation syntax-section syntax-block syntax-js\">}</span></span>\n<span class=\"syntax-punctuation syntax-section syntax-block syntax-js\">}</span></span>\n \n<span class=\"syntax-comment syntax-line syntax-double-slash syntax-js\"><span class=\"syntax-punctuation syntax-definition syntax-comment syntax-js\">//</span> Optional: when wrapping hundreds of tools, omit full namespaces upfront and expose\n</span><span class=\"syntax-comment syntax-line syntax-double-slash syntax-js\"><span class=\"syntax-punctuation syntax-definition syntax-comment syntax-js\">//</span> a global map in the sandbox that the model can iterate and filter over in code\n</span><span class=\"syntax-variable syntax-other syntax-readwrite syntax-js\">declare</span> <span class=\"syntax-storage syntax-type syntax-js\">const</span> <span class=\"syntax-variable syntax-other syntax-constant syntax-js\">ALL_TOOLS</span>: <span class=\"syntax-variable syntax-other syntax-readwrite syntax-js\">Record</span><span class=\"syntax-keyword syntax-operator syntax-relational syntax-js\">&lt;</span><span class=\"syntax-variable syntax-other syntax-readwrite syntax-js\">string</span><span class=\"syntax-punctuation syntax-separator syntax-comma syntax-js\">,</span> <span class=\"syntax-meta syntax-object-literal syntax-js\"><span class=\"syntax-punctuation syntax-section syntax-block syntax-js\">{</span> <span class=\"syntax-meta syntax-object-literal syntax-key syntax-js\">description</span><span class=\"syntax-punctuation syntax-separator syntax-key-value syntax-js\">:</span> <span class=\"syntax-variable syntax-other syntax-readwrite syntax-js\">string</span>; <span class=\"syntax-meta syntax-object-literal syntax-key syntax-js\">signature</span><span class=\"syntax-punctuation syntax-separator syntax-key-value syntax-js\">:</span> <span class=\"syntax-variable syntax-other syntax-readwrite syntax-js\">string</span> <span class=\"syntax-punctuation syntax-section syntax-block syntax-js\">}</span></span><span class=\"syntax-keyword syntax-operator syntax-relational syntax-js\">&gt;</span><span class=\"syntax-punctuation syntax-terminator syntax-statement syntax-js\">;</span>\n \n<span class=\"syntax-comment syntax-line syntax-double-slash syntax-js\"><span class=\"syntax-punctuation syntax-definition syntax-comment syntax-js\">//</span> Multimodal output helpers: only what is passed here enters the model context window\n</span><span class=\"syntax-variable syntax-other syntax-readwrite syntax-js\">declare</span> <span class=\"syntax-meta syntax-function syntax-declaration syntax-js\"><span class=\"syntax-storage syntax-type syntax-function syntax-js\">function</span> <span class=\"syntax-entity syntax-name syntax-function syntax-js\">text</span><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-js\">(</span><span class=\"syntax-variable syntax-parameter syntax-function syntax-js\">output</span>: <span class=\"syntax-variable syntax-parameter syntax-function syntax-js\">string</span><span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-js\">)</span></span>: <span class=\"syntax-keyword syntax-operator syntax-js\">void</span><span class=\"syntax-punctuation syntax-terminator syntax-statement syntax-js\">;</span>\n<span class=\"syntax-variable syntax-other syntax-readwrite syntax-js\">declare</span> <span class=\"syntax-meta syntax-function syntax-declaration syntax-js\"><span class=\"syntax-storage syntax-type syntax-function syntax-js\">function</span> <span class=\"syntax-entity syntax-name syntax-function syntax-js\">image</span><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-js\">(</span><span class=\"syntax-variable syntax-parameter syntax-function syntax-js\">data</span>: <span class=\"syntax-variable syntax-parameter syntax-function syntax-js\">string</span> | <span class=\"syntax-variable syntax-parameter syntax-function syntax-js\">Uint8Array</span><span class=\"syntax-punctuation syntax-separator syntax-parameter syntax-function syntax-js\">,</span> <span class=\"syntax-variable syntax-parameter syntax-function syntax-js\">mimeType</span>?: <span class=\"syntax-variable syntax-parameter syntax-function syntax-js\">string</span><span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-js\">)</span></span>: <span class=\"syntax-keyword syntax-operator syntax-js\">void</span><span class=\"syntax-punctuation syntax-terminator syntax-statement syntax-js\">;</span>\n<span class=\"syntax-variable syntax-other syntax-readwrite syntax-js\">declare</span> <span class=\"syntax-meta syntax-function syntax-declaration syntax-js\"><span class=\"syntax-storage syntax-type syntax-function syntax-js\">function</span> <span class=\"syntax-entity syntax-name syntax-function syntax-js\">audio</span><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-js\">(</span><span class=\"syntax-variable syntax-parameter syntax-function syntax-js\">data</span>: <span class=\"syntax-variable syntax-parameter syntax-function syntax-js\">string</span> | <span class=\"syntax-variable syntax-parameter syntax-function syntax-js\">Uint8Array</span><span class=\"syntax-punctuation syntax-separator syntax-parameter syntax-function syntax-js\">,</span> <span class=\"syntax-variable syntax-parameter syntax-function syntax-js\">mimeType</span>?: <span class=\"syntax-variable syntax-parameter syntax-function syntax-js\">string</span><span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-js\">)</span></span>: <span class=\"syntax-keyword syntax-operator syntax-js\">void</span><span class=\"syntax-punctuation syntax-terminator syntax-statement syntax-js\">;</span>\n \n<span class=\"syntax-comment syntax-line syntax-double-slash syntax-js\"><span class=\"syntax-punctuation syntax-definition syntax-comment syntax-js\">//</span> Cross-turn state helpers: persist data in host memory without paying token costs\n</span><span class=\"syntax-variable syntax-other syntax-readwrite syntax-js\">declare</span> <span class=\"syntax-meta syntax-function syntax-declaration syntax-js\"><span class=\"syntax-storage syntax-type syntax-function syntax-js\">function</span> <span class=\"syntax-entity syntax-name syntax-function syntax-js\">store</span><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-js\">(</span><span class=\"syntax-variable syntax-parameter syntax-function syntax-js\">key</span>: <span class=\"syntax-variable syntax-parameter syntax-function syntax-js\">string</span><span class=\"syntax-punctuation syntax-separator syntax-parameter syntax-function syntax-js\">,</span> <span class=\"syntax-variable syntax-parameter syntax-function syntax-js\">value</span>: <span class=\"syntax-variable syntax-parameter syntax-function syntax-js\">unknown</span><span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-js\">)</span></span>: <span class=\"syntax-keyword syntax-operator syntax-js\">void</span><span class=\"syntax-punctuation syntax-terminator syntax-statement syntax-js\">;</span>\n<span class=\"syntax-variable syntax-other syntax-readwrite syntax-js\">declare</span> <span class=\"syntax-meta syntax-function syntax-declaration syntax-js\"><span class=\"syntax-storage syntax-type syntax-function syntax-js\">function</span> <span class=\"syntax-entity syntax-name syntax-function syntax-js\">load</span></span><span class=\"syntax-keyword syntax-operator syntax-relational syntax-js\">&lt;</span><span class=\"syntax-variable syntax-other syntax-constant syntax-js\">T</span> <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-js\">=</span> <span class=\"syntax-variable syntax-other syntax-readwrite syntax-js\">unknown</span><span class=\"syntax-keyword syntax-operator syntax-relational syntax-js\">&gt;</span><span class=\"syntax-meta syntax-group syntax-js\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-js\">(</span><span class=\"syntax-variable syntax-other syntax-readwrite syntax-js\">key</span>: <span class=\"syntax-variable syntax-other syntax-readwrite syntax-js\">string</span><span class=\"syntax-punctuation syntax-section syntax-group syntax-js\">)</span></span>: <span class=\"syntax-variable syntax-other syntax-constant syntax-js\">T</span><span class=\"syntax-punctuation syntax-terminator syntax-statement syntax-js\">;</span>\n</span></span></code></pre>\n<p>To save context across a large catalog, we don't have to expose every tool directly. We can leverage principles we already built, like tool search, or expose a global <code>ALL_TOOLS</code> map inside the sandbox. Similarly, multimodal output helpers (<code>text()</code>, <code>image()</code>, <code>audio()</code>) let the script pass text, images, or audio directly back into the model's context window.</p>\n<p>TypeScript</p>\n<pre><code class=\"language-typescript\"><span class=\"code-snippet\" data-language=\"TypeScript\"><span class=\"syntax-source syntax-js\"><span class=\"syntax-comment syntax-line syntax-double-slash syntax-js\"><span class=\"syntax-punctuation syntax-definition syntax-comment syntax-js\">//</span> Pseudo-code: What the model emits inside a single exec() call\n</span><span class=\"syntax-storage syntax-type syntax-js\">const</span> <span class=\"syntax-variable syntax-other syntax-readwrite syntax-js\">projects</span> <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-js\">=</span> <span class=\"syntax-variable syntax-other syntax-readwrite syntax-js\">await</span> <span class=\"syntax-variable syntax-other syntax-object syntax-js\">tools</span><span class=\"syntax-punctuation syntax-accessor syntax-js\">.</span><span class=\"syntax-meta syntax-property syntax-object syntax-js\">linear</span><span class=\"syntax-punctuation syntax-accessor syntax-js\">.</span><span class=\"syntax-meta syntax-function-call syntax-method syntax-js\"><span class=\"syntax-variable syntax-function syntax-js\">listProjects</span><span class=\"syntax-meta syntax-group syntax-js\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-js\">(</span></span><span class=\"syntax-meta syntax-group syntax-js\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-js\">)</span></span></span><span class=\"syntax-punctuation syntax-terminator syntax-statement syntax-js\">;</span>\n<span class=\"syntax-storage syntax-type syntax-js\">const</span> <span class=\"syntax-variable syntax-other syntax-readwrite syntax-js\">issueBatches</span> <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-js\">=</span> <span class=\"syntax-variable syntax-other syntax-readwrite syntax-js\">await</span> <span class=\"syntax-support syntax-class syntax-builtin syntax-js\">Promise</span><span class=\"syntax-punctuation syntax-accessor syntax-js\">.</span><span class=\"syntax-meta syntax-function-call syntax-method syntax-js\"><span class=\"syntax-variable syntax-function syntax-js\">all</span><span class=\"syntax-meta syntax-group syntax-js\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-js\">(</span>\n  <span class=\"syntax-variable syntax-other syntax-object syntax-js\">projects</span><span class=\"syntax-punctuation syntax-accessor syntax-js\">.</span><span class=\"syntax-meta syntax-function-call syntax-method syntax-js\"><span class=\"syntax-variable syntax-function syntax-js\">map</span><span class=\"syntax-meta syntax-group syntax-js\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-js\">(</span><span class=\"syntax-meta syntax-function syntax-declaration syntax-js\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-js\">(</span><span class=\"syntax-variable syntax-parameter syntax-function syntax-js\">p</span><span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-js\">)</span><span class=\"syntax-meta syntax-function syntax-declaration syntax-js\"> </span><span class=\"syntax-storage syntax-type syntax-function syntax-arrow syntax-js\">=&gt;</span></span> <span class=\"syntax-meta syntax-block syntax-js\"><span class=\"syntax-variable syntax-other syntax-object syntax-js\">tools</span><span class=\"syntax-punctuation syntax-accessor syntax-js\">.</span><span class=\"syntax-meta syntax-property syntax-object syntax-js\">linear</span><span class=\"syntax-punctuation syntax-accessor syntax-js\">.</span><span class=\"syntax-meta syntax-function-call syntax-method syntax-js\"><span class=\"syntax-variable syntax-function syntax-js\">listIssues</span><span class=\"syntax-meta syntax-group syntax-js\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-js\">(</span><span class=\"syntax-meta syntax-object-literal syntax-js\"><span class=\"syntax-punctuation syntax-section syntax-block syntax-js\">{</span> <span class=\"syntax-meta syntax-object-literal syntax-key syntax-js\">projectId</span><span class=\"syntax-punctuation syntax-separator syntax-key-value syntax-js\">:</span> <span class=\"syntax-variable syntax-other syntax-object syntax-js\">p</span><span class=\"syntax-punctuation syntax-accessor syntax-js\">.</span><span class=\"syntax-meta syntax-property syntax-object syntax-js\">id</span> <span class=\"syntax-punctuation syntax-section syntax-block syntax-js\">}</span></span></span><span class=\"syntax-meta syntax-group syntax-js\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-js\">)</span></span></span></span></span><span class=\"syntax-meta syntax-group syntax-js\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-js\">)</span></span></span>\n</span><span class=\"syntax-meta syntax-group syntax-js\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-js\">)</span></span></span><span class=\"syntax-punctuation syntax-terminator syntax-statement syntax-js\">;</span>\n \n<span class=\"syntax-storage syntax-type syntax-js\">const</span> <span class=\"syntax-variable syntax-other syntax-readwrite syntax-js\">unassigned</span> <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-js\">=</span> <span class=\"syntax-variable syntax-other syntax-object syntax-js\">issueBatches</span><span class=\"syntax-punctuation syntax-accessor syntax-js\">.</span><span class=\"syntax-meta syntax-function-call syntax-method syntax-js\"><span class=\"syntax-variable syntax-function syntax-js\">flat</span><span class=\"syntax-meta syntax-group syntax-js\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-js\">(</span></span><span class=\"syntax-meta syntax-group syntax-js\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-js\">)</span></span></span><span class=\"syntax-punctuation syntax-accessor syntax-js\">.</span><span class=\"syntax-meta syntax-function-call syntax-method syntax-js\"><span class=\"syntax-variable syntax-function syntax-js\">filter</span><span class=\"syntax-meta syntax-group syntax-js\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-js\">(</span><span class=\"syntax-meta syntax-function syntax-declaration syntax-js\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-js\">(</span><span class=\"syntax-variable syntax-parameter syntax-function syntax-js\">issue</span><span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-js\">)</span><span class=\"syntax-meta syntax-function syntax-declaration syntax-js\"> </span><span class=\"syntax-storage syntax-type syntax-function syntax-arrow syntax-js\">=&gt;</span></span> <span class=\"syntax-meta syntax-block syntax-js\"><span class=\"syntax-keyword syntax-operator syntax-logical syntax-js\">!</span><span class=\"syntax-variable syntax-other syntax-object syntax-js\">issue</span><span class=\"syntax-punctuation syntax-accessor syntax-js\">.</span><span class=\"syntax-meta syntax-property syntax-object syntax-js\">assignee</span></span></span><span class=\"syntax-meta syntax-group syntax-js\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-js\">)</span></span></span><span class=\"syntax-punctuation syntax-terminator syntax-statement syntax-js\">;</span>\n<span class=\"syntax-keyword syntax-control syntax-flow syntax-js\">await</span> <span class=\"syntax-support syntax-class syntax-builtin syntax-js\">Promise</span><span class=\"syntax-punctuation syntax-accessor syntax-js\">.</span><span class=\"syntax-meta syntax-function-call syntax-method syntax-js\"><span class=\"syntax-variable syntax-function syntax-js\">all</span><span class=\"syntax-meta syntax-group syntax-js\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-js\">(</span><span class=\"syntax-variable syntax-other syntax-object syntax-js\">unassigned</span><span class=\"syntax-punctuation syntax-accessor syntax-js\">.</span><span class=\"syntax-meta syntax-function-call syntax-method syntax-js\"><span class=\"syntax-variable syntax-function syntax-js\">map</span><span class=\"syntax-meta syntax-group syntax-js\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-js\">(</span><span class=\"syntax-meta syntax-function syntax-declaration syntax-js\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-js\">(</span><span class=\"syntax-variable syntax-parameter syntax-function syntax-js\">issue</span><span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-js\">)</span><span class=\"syntax-meta syntax-function syntax-declaration syntax-js\"> </span><span class=\"syntax-storage syntax-type syntax-function syntax-arrow syntax-js\">=&gt;</span></span> <span class=\"syntax-meta syntax-block syntax-js\"><span class=\"syntax-variable syntax-other syntax-object syntax-js\">tools</span><span class=\"syntax-punctuation syntax-accessor syntax-js\">.</span><span class=\"syntax-meta syntax-property syntax-object syntax-js\">linear</span><span class=\"syntax-punctuation syntax-accessor syntax-js\">.</span><span class=\"syntax-meta syntax-function-call syntax-method syntax-js\"><span class=\"syntax-variable syntax-function syntax-js\">archiveIssue</span><span class=\"syntax-meta syntax-group syntax-js\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-js\">(</span><span class=\"syntax-meta syntax-object-literal syntax-js\"><span class=\"syntax-punctuation syntax-section syntax-block syntax-js\">{</span> <span class=\"syntax-meta syntax-object-literal syntax-key syntax-js\">id</span><span class=\"syntax-punctuation syntax-separator syntax-key-value syntax-js\">:</span> <span class=\"syntax-variable syntax-other syntax-object syntax-js\">issue</span><span class=\"syntax-punctuation syntax-accessor syntax-js\">.</span><span class=\"syntax-meta syntax-property syntax-object syntax-js\">id</span> <span class=\"syntax-punctuation syntax-section syntax-block syntax-js\">}</span></span></span><span class=\"syntax-meta syntax-group syntax-js\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-js\">)</span></span></span></span></span><span class=\"syntax-meta syntax-group syntax-js\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-js\">)</span></span></span></span><span class=\"syntax-meta syntax-group syntax-js\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-js\">)</span></span></span><span class=\"syntax-punctuation syntax-terminator syntax-statement syntax-js\">;</span>\n \n<span class=\"syntax-meta syntax-function-call syntax-js\"><span class=\"syntax-variable syntax-function syntax-js\">text</span><span class=\"syntax-meta syntax-group syntax-js\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-js\">(</span><span class=\"syntax-string syntax-template syntax-js\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-template syntax-begin syntax-js\">`</span>Archived </span><span class=\"syntax-meta syntax-template syntax-expression syntax-js\"><span class=\"syntax-punctuation syntax-definition syntax-template-expression syntax-begin syntax-js\">${</span></span><span class=\"syntax-meta syntax-template syntax-expression syntax-js\"><span class=\"syntax-source syntax-js syntax-embedded syntax-expression\"><span class=\"syntax-variable syntax-other syntax-object syntax-js\">unassigned</span><span class=\"syntax-punctuation syntax-accessor syntax-js\">.</span><span class=\"syntax-meta syntax-property syntax-object syntax-js\">length</span></span><span class=\"syntax-punctuation syntax-definition syntax-template-expression syntax-end syntax-js\">}</span></span><span class=\"syntax-string syntax-template syntax-js\"> unassigned issues across </span><span class=\"syntax-meta syntax-template syntax-expression syntax-js\"><span class=\"syntax-punctuation syntax-definition syntax-template-expression syntax-begin syntax-js\">${</span></span><span class=\"syntax-meta syntax-template syntax-expression syntax-js\"><span class=\"syntax-source syntax-js syntax-embedded syntax-expression\"><span class=\"syntax-variable syntax-other syntax-object syntax-js\">projects</span><span class=\"syntax-punctuation syntax-accessor syntax-js\">.</span><span class=\"syntax-meta syntax-property syntax-object syntax-js\">length</span></span><span class=\"syntax-punctuation syntax-definition syntax-template-expression syntax-end syntax-js\">}</span></span><span class=\"syntax-string syntax-template syntax-js\"> projects.<span class=\"syntax-punctuation syntax-definition syntax-string syntax-template syntax-end syntax-js\">`</span></span></span><span class=\"syntax-meta syntax-group syntax-js\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-js\">)</span></span></span><span class=\"syntax-punctuation syntax-terminator syntax-statement syntax-js\">;</span>\n</span></span></code></pre>\n<p><em>The sandbox executes all 55 underlying API calls, filters the payloads in memory, and returns only the one-line <code>text()</code> string (<code>&quot;Archived 42 unassigned issues across 12 projects.&quot;</code>) to the model's context window.</em></p>\n<p><picture class=\"article-picture article-picture-fallback\" style=\"--image-ratio:16 / 9\"><img src=\"https://www.philschmid.de/static/blog/code-mode/codemode-proxy-arch.png\" alt=\"How the 1-tool architecture works\" loading=\"lazy\" decoding=\"async\" fetchpriority=\"low\" referrerpolicy=\"no-referrer\" class=\"progressive-image\"></picture></p>\n<h3>Why a JS/Python sandbox instead of just <code>bash</code>?</h3>\n<p>You can build a tool proxy in <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://www.philschmid.de/superhuman-bash\"><code>bash</code></a> too, but orchestrating tools inside a language runtime like JavaScript or Python can bring benefits that are harder to achieve in <code>bash</code> environments.</p>\n<ul>\n<li><strong>Typed functions:</strong> MCP servers and internal APIs map directly to typed <code>await tools.&lt;service&gt;.&lt;method&gt;(args)</code> calls with native objects, <code>Promise.all</code>, and <code>try</code>/<code>catch</code> error handling instead of fragile bash string escaping.</li>\n<li><strong>Multimodal context:</strong> A shell only returns stdout text. If a multimodal model wants to inspect an image, it cannot run <code>cat screenshot.png</code>, which is why <code>bash</code> harnesses still had to bolt on separate <code>read</code> or <code>view_media</code> tools. In an <code>exec</code> sandbox, calling <code>image(screenshot)</code> or <code>audio(clip)</code> tells the host runtime to attach the actual media part directly to the model's next turn.</li>\n<li><strong>Credential and policy proxy:</strong> Every <code>await tools.*</code> call crosses a structured bridge to the host runtime, which can inject OAuth tokens outside the sandbox, validate schemas, or pause for user confirmation on destructive calls.</li>\n<li><strong>State management:</strong> In standard tool calling, the prompt history is the only state store, so reusing a large query result in Turn 2 means keeping the raw JSON in the context window on every turn. Exposing a KV interface lets the agent persist state outside of the context window across turns.</li>\n</ul>\n<h2>Building a 1-tool agent with the Gemini Interactions API</h2>\n<p>Here is a minimal, runnable pseudo example that provides <code>gemini-4-argon</code> with a single execution tool.</p>\n<p>TypeScript</p>\n<pre><code class=\"language-typescript\"><span class=\"code-snippet\" data-language=\"TypeScript\"><span class=\"syntax-source syntax-js\"><span class=\"syntax-meta syntax-import syntax-js\"><span class=\"syntax-keyword syntax-control syntax-import-export syntax-js\">import</span> <span class=\"syntax-variable syntax-other syntax-readwrite syntax-js\">vm</span> <span class=\"syntax-keyword syntax-control syntax-import-export syntax-js\">from</span> <span class=\"syntax-string syntax-quoted syntax-double syntax-js\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-js\">&quot;</span>node:vm<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-js\">&quot;</span></span></span><span class=\"syntax-punctuation syntax-terminator syntax-statement syntax-js\">;</span>\n<span class=\"syntax-meta syntax-import syntax-js\"><span class=\"syntax-keyword syntax-control syntax-import-export syntax-js\">import</span> <span class=\"syntax-meta syntax-block syntax-js\"><span class=\"syntax-punctuation syntax-section syntax-block syntax-js\">{</span> <span class=\"syntax-variable syntax-other syntax-readwrite syntax-js\">GoogleGenAI</span> <span class=\"syntax-punctuation syntax-section syntax-block syntax-js\">}</span></span> <span class=\"syntax-keyword syntax-control syntax-import-export syntax-js\">from</span> <span class=\"syntax-string syntax-quoted syntax-double syntax-js\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-js\">&quot;</span>@google/genai<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-js\">&quot;</span></span></span><span class=\"syntax-punctuation syntax-terminator syntax-statement syntax-js\">;</span>\n \n<span class=\"syntax-storage syntax-type syntax-js\">const</span> <span class=\"syntax-variable syntax-other syntax-readwrite syntax-js\">client</span> <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-js\">=</span> <span class=\"syntax-meta syntax-instance syntax-constructor syntax-js\"><span class=\"syntax-keyword syntax-operator syntax-word syntax-new syntax-js\">new</span><span class=\"syntax-meta syntax-function-call syntax-constructor syntax-js\"> <span class=\"syntax-variable syntax-type syntax-js\">GoogleGenAI</span><span class=\"syntax-meta syntax-group syntax-js\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-js\">(</span><span class=\"syntax-meta syntax-object-literal syntax-js\"><span class=\"syntax-punctuation syntax-section syntax-block syntax-js\">{</span><span class=\"syntax-punctuation syntax-section syntax-block syntax-js\">}</span></span></span><span class=\"syntax-meta syntax-group syntax-js\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-js\">)</span></span></span></span><span class=\"syntax-punctuation syntax-terminator syntax-statement syntax-js\">;</span>\n \n<span class=\"syntax-comment syntax-line syntax-double-slash syntax-js\"><span class=\"syntax-punctuation syntax-definition syntax-comment syntax-js\">//</span> Underlying host functions (e.g., MCP clients or internal APIs)\n</span><span class=\"syntax-storage syntax-type syntax-js\">const</span> <span class=\"syntax-variable syntax-other syntax-readwrite syntax-js\">tools</span> <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-js\">=</span> <span class=\"syntax-meta syntax-object-literal syntax-js\"><span class=\"syntax-punctuation syntax-section syntax-block syntax-js\">{</span>\n  <span class=\"syntax-meta syntax-function syntax-declaration syntax-js\"><span class=\"syntax-meta syntax-object-literal syntax-key syntax-js\"><span class=\"syntax-entity syntax-name syntax-function syntax-js\">listPRFiles</span></span><span class=\"syntax-punctuation syntax-separator syntax-key-value syntax-js\">:</span> </span><span class=\"syntax-meta syntax-function syntax-declaration syntax-js\"><span class=\"syntax-storage syntax-type syntax-js\">async</span><span class=\"syntax-meta syntax-function syntax-declaration syntax-js\"> </span><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-js\">(</span><span class=\"syntax-meta syntax-block syntax-js\"><span class=\"syntax-punctuation syntax-section syntax-block syntax-begin syntax-js\">{</span> <span class=\"syntax-variable syntax-parameter syntax-function syntax-js\">pr</span> <span class=\"syntax-punctuation syntax-section syntax-block syntax-end syntax-js\">}</span></span>: <span class=\"syntax-meta syntax-block syntax-js\"><span class=\"syntax-punctuation syntax-section syntax-block syntax-begin syntax-js\">{</span> <span class=\"syntax-variable syntax-parameter syntax-function syntax-js\">pr</span>: <span class=\"syntax-variable syntax-parameter syntax-function syntax-js\">number</span> <span class=\"syntax-punctuation syntax-section syntax-block syntax-end syntax-js\">}</span></span><span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-js\">)</span><span class=\"syntax-meta syntax-function syntax-declaration syntax-js\"> </span><span class=\"syntax-storage syntax-type syntax-function syntax-arrow syntax-js\">=&gt;</span></span> <span class=\"syntax-meta syntax-block syntax-js\"><span class=\"syntax-meta syntax-sequence syntax-js\"><span class=\"syntax-punctuation syntax-section syntax-brackets syntax-js\">[</span>\n    <span class=\"syntax-meta syntax-object-literal syntax-js\"><span class=\"syntax-punctuation syntax-section syntax-block syntax-js\">{</span> <span class=\"syntax-meta syntax-object-literal syntax-key syntax-js\">path</span><span class=\"syntax-punctuation syntax-separator syntax-key-value syntax-js\">:</span> <span class=\"syntax-string syntax-quoted syntax-double syntax-js\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-js\">&quot;</span>src/auth.ts<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-js\">&quot;</span></span><span class=\"syntax-punctuation syntax-separator syntax-comma syntax-js\">,</span> <span class=\"syntax-meta syntax-object-literal syntax-key syntax-js\">additions</span><span class=\"syntax-punctuation syntax-separator syntax-key-value syntax-js\">:</span> <span class=\"syntax-constant syntax-numeric syntax-js\">120</span> <span class=\"syntax-punctuation syntax-section syntax-block syntax-js\">}</span></span><span class=\"syntax-punctuation syntax-separator syntax-comma syntax-js\">,</span>\n    <span class=\"syntax-meta syntax-object-literal syntax-js\"><span class=\"syntax-punctuation syntax-section syntax-block syntax-js\">{</span> <span class=\"syntax-meta syntax-object-literal syntax-key syntax-js\">path</span><span class=\"syntax-punctuation syntax-separator syntax-key-value syntax-js\">:</span> <span class=\"syntax-string syntax-quoted syntax-double syntax-js\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-js\">&quot;</span>src/payments.ts<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-js\">&quot;</span></span><span class=\"syntax-punctuation syntax-separator syntax-comma syntax-js\">,</span> <span class=\"syntax-meta syntax-object-literal syntax-key syntax-js\">additions</span><span class=\"syntax-punctuation syntax-separator syntax-key-value syntax-js\">:</span> <span class=\"syntax-constant syntax-numeric syntax-js\">85</span> <span class=\"syntax-punctuation syntax-section syntax-block syntax-js\">}</span></span><span class=\"syntax-punctuation syntax-separator syntax-comma syntax-js\">,</span>\n    <span class=\"syntax-meta syntax-object-literal syntax-js\"><span class=\"syntax-punctuation syntax-section syntax-block syntax-js\">{</span> <span class=\"syntax-meta syntax-object-literal syntax-key syntax-js\">path</span><span class=\"syntax-punctuation syntax-separator syntax-key-value syntax-js\">:</span> <span class=\"syntax-string syntax-quoted syntax-double syntax-js\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-js\">&quot;</span>src/utils.ts<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-js\">&quot;</span></span><span class=\"syntax-punctuation syntax-separator syntax-comma syntax-js\">,</span> <span class=\"syntax-meta syntax-object-literal syntax-key syntax-js\">additions</span><span class=\"syntax-punctuation syntax-separator syntax-key-value syntax-js\">:</span> <span class=\"syntax-constant syntax-numeric syntax-js\">12</span> <span class=\"syntax-punctuation syntax-section syntax-block syntax-js\">}</span></span><span class=\"syntax-punctuation syntax-separator syntax-comma syntax-js\">,</span>\n    <span class=\"syntax-meta syntax-object-literal syntax-js\"><span class=\"syntax-punctuation syntax-section syntax-block syntax-js\">{</span> <span class=\"syntax-meta syntax-object-literal syntax-key syntax-js\">path</span><span class=\"syntax-punctuation syntax-separator syntax-key-value syntax-js\">:</span> <span class=\"syntax-string syntax-quoted syntax-double syntax-js\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-js\">&quot;</span>README.md<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-js\">&quot;</span></span><span class=\"syntax-punctuation syntax-separator syntax-comma syntax-js\">,</span> <span class=\"syntax-meta syntax-object-literal syntax-key syntax-js\">additions</span><span class=\"syntax-punctuation syntax-separator syntax-key-value syntax-js\">:</span> <span class=\"syntax-constant syntax-numeric syntax-js\">60</span> <span class=\"syntax-punctuation syntax-section syntax-block syntax-js\">}</span></span><span class=\"syntax-punctuation syntax-separator syntax-comma syntax-js\">,</span>\n  <span class=\"syntax-punctuation syntax-section syntax-brackets syntax-js\">]</span></span></span><span class=\"syntax-punctuation syntax-separator syntax-comma syntax-js\">,</span>\n  <span class=\"syntax-meta syntax-function syntax-declaration syntax-js\"><span class=\"syntax-meta syntax-object-literal syntax-key syntax-js\"><span class=\"syntax-entity syntax-name syntax-function syntax-js\">runSecurityScan</span></span><span class=\"syntax-punctuation syntax-separator syntax-key-value syntax-js\">:</span> </span><span class=\"syntax-meta syntax-function syntax-declaration syntax-js\"><span class=\"syntax-storage syntax-type syntax-js\">async</span><span class=\"syntax-meta syntax-function syntax-declaration syntax-js\"> </span><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-js\">(</span><span class=\"syntax-meta syntax-block syntax-js\"><span class=\"syntax-punctuation syntax-section syntax-block syntax-begin syntax-js\">{</span> <span class=\"syntax-variable syntax-parameter syntax-function syntax-js\">path</span> <span class=\"syntax-punctuation syntax-section syntax-block syntax-end syntax-js\">}</span></span>: <span class=\"syntax-meta syntax-block syntax-js\"><span class=\"syntax-punctuation syntax-section syntax-block syntax-begin syntax-js\">{</span> <span class=\"syntax-variable syntax-parameter syntax-function syntax-js\">path</span>: <span class=\"syntax-variable syntax-parameter syntax-function syntax-js\">string</span> <span class=\"syntax-punctuation syntax-section syntax-block syntax-end syntax-js\">}</span></span><span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-js\">)</span><span class=\"syntax-meta syntax-function syntax-declaration syntax-js\"> </span><span class=\"syntax-storage syntax-type syntax-function syntax-arrow syntax-js\">=&gt;</span></span> <span class=\"syntax-meta syntax-block syntax-js\"><span class=\"syntax-meta syntax-group syntax-js\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-js\">(</span><span class=\"syntax-meta syntax-object-literal syntax-js\"><span class=\"syntax-punctuation syntax-section syntax-block syntax-js\">{</span>\n    <span class=\"syntax-meta syntax-object-literal syntax-key syntax-js\">findings</span><span class=\"syntax-punctuation syntax-separator syntax-key-value syntax-js\">:</span> <span class=\"syntax-variable syntax-other syntax-object syntax-js\">path</span><span class=\"syntax-punctuation syntax-accessor syntax-js\">.</span><span class=\"syntax-meta syntax-function-call syntax-method syntax-js\"><span class=\"syntax-variable syntax-function syntax-js\">includes</span><span class=\"syntax-meta syntax-group syntax-js\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-js\">(</span><span class=\"syntax-string syntax-quoted syntax-double syntax-js\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-js\">&quot;</span>auth<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-js\">&quot;</span></span></span><span class=\"syntax-meta syntax-group syntax-js\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-js\">)</span></span></span> <span class=\"syntax-keyword syntax-operator syntax-ternary syntax-js\">?</span> <span class=\"syntax-meta syntax-sequence syntax-js\"><span class=\"syntax-punctuation syntax-section syntax-brackets syntax-js\">[</span><span class=\"syntax-string syntax-quoted syntax-double syntax-js\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-js\">&quot;</span>Missing token expiry check<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-js\">&quot;</span></span><span class=\"syntax-punctuation syntax-section syntax-brackets syntax-js\">]</span></span> <span class=\"syntax-keyword syntax-operator syntax-ternary syntax-js\">:</span> <span class=\"syntax-meta syntax-sequence syntax-js\"><span class=\"syntax-punctuation syntax-section syntax-brackets syntax-js\">[</span><span class=\"syntax-punctuation syntax-section syntax-brackets syntax-js\">]</span></span><span class=\"syntax-punctuation syntax-separator syntax-comma syntax-js\">,</span>\n  <span class=\"syntax-punctuation syntax-section syntax-block syntax-js\">}</span></span><span class=\"syntax-punctuation syntax-section syntax-group syntax-js\">)</span></span></span><span class=\"syntax-punctuation syntax-separator syntax-comma syntax-js\">,</span>\n  <span class=\"syntax-meta syntax-function syntax-declaration syntax-js\"><span class=\"syntax-meta syntax-object-literal syntax-key syntax-js\"><span class=\"syntax-entity syntax-name syntax-function syntax-js\">postPRComment</span></span><span class=\"syntax-punctuation syntax-separator syntax-key-value syntax-js\">:</span> </span><span class=\"syntax-meta syntax-function syntax-declaration syntax-js\"><span class=\"syntax-storage syntax-type syntax-js\">async</span><span class=\"syntax-meta syntax-function syntax-declaration syntax-js\"> </span><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-js\">(</span><span class=\"syntax-meta syntax-block syntax-js\"><span class=\"syntax-punctuation syntax-section syntax-block syntax-begin syntax-js\">{</span> <span class=\"syntax-variable syntax-parameter syntax-function syntax-js\">pr</span><span class=\"syntax-punctuation syntax-separator syntax-parameter syntax-function syntax-js\">,</span> <span class=\"syntax-variable syntax-parameter syntax-function syntax-js\">body</span> <span class=\"syntax-punctuation syntax-section syntax-block syntax-end syntax-js\">}</span></span>: <span class=\"syntax-meta syntax-block syntax-js\"><span class=\"syntax-punctuation syntax-section syntax-block syntax-begin syntax-js\">{</span> <span class=\"syntax-variable syntax-parameter syntax-function syntax-js\">pr</span>: <span class=\"syntax-variable syntax-parameter syntax-function syntax-js\">number</span>; <span class=\"syntax-variable syntax-parameter syntax-function syntax-js\">body</span>: <span class=\"syntax-variable syntax-parameter syntax-function syntax-js\">string</span> <span class=\"syntax-punctuation syntax-section syntax-block syntax-end syntax-js\">}</span></span><span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-js\">)</span><span class=\"syntax-meta syntax-function syntax-declaration syntax-js\"> </span><span class=\"syntax-storage syntax-type syntax-function syntax-arrow syntax-js\">=&gt;</span></span> <span class=\"syntax-meta syntax-block syntax-js\"><span class=\"syntax-meta syntax-group syntax-js\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-js\">(</span><span class=\"syntax-meta syntax-object-literal syntax-js\"><span class=\"syntax-punctuation syntax-section syntax-block syntax-js\">{</span> <span class=\"syntax-meta syntax-object-literal syntax-key syntax-js\">posted</span><span class=\"syntax-punctuation syntax-separator syntax-key-value syntax-js\">:</span> <span class=\"syntax-constant syntax-language syntax-boolean syntax-true syntax-js\">true</span> <span class=\"syntax-punctuation syntax-section syntax-block syntax-js\">}</span></span><span class=\"syntax-punctuation syntax-section syntax-group syntax-js\">)</span></span></span><span class=\"syntax-punctuation syntax-separator syntax-comma syntax-js\">,</span>\n<span class=\"syntax-punctuation syntax-section syntax-block syntax-js\">}</span></span><span class=\"syntax-punctuation syntax-terminator syntax-statement syntax-js\">;</span>\n \n<span class=\"syntax-comment syntax-line syntax-double-slash syntax-js\"><span class=\"syntax-punctuation syntax-definition syntax-comment syntax-js\">//</span> 1. Expose a single `exec` tool with TypeScript .d.ts signatures\n</span><span class=\"syntax-storage syntax-type syntax-js\">const</span> <span class=\"syntax-variable syntax-other syntax-readwrite syntax-js\">execTool</span> <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-js\">=</span> <span class=\"syntax-meta syntax-object-literal syntax-js\"><span class=\"syntax-punctuation syntax-section syntax-block syntax-js\">{</span>\n  <span class=\"syntax-meta syntax-object-literal syntax-key syntax-js\">type</span><span class=\"syntax-punctuation syntax-separator syntax-key-value syntax-js\">:</span> <span class=\"syntax-string syntax-quoted syntax-double syntax-js\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-js\">&quot;</span>function<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-js\">&quot;</span></span> as <span class=\"syntax-variable syntax-other syntax-readwrite syntax-js\">const</span><span class=\"syntax-punctuation syntax-separator syntax-comma syntax-js\">,</span>\n  <span class=\"syntax-meta syntax-object-literal syntax-key syntax-js\">name</span><span class=\"syntax-punctuation syntax-separator syntax-key-value syntax-js\">:</span> <span class=\"syntax-string syntax-quoted syntax-double syntax-js\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-js\">&quot;</span>exec<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-js\">&quot;</span></span><span class=\"syntax-punctuation syntax-separator syntax-comma syntax-js\">,</span>\n  <span class=\"syntax-meta syntax-object-literal syntax-key syntax-js\">description</span><span class=\"syntax-punctuation syntax-separator syntax-key-value syntax-js\">:</span> <span class=\"syntax-string syntax-template syntax-js\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-template syntax-begin syntax-js\">`</span>Run an async JavaScript body in an isolated sandbox (no imports; call text() to output).\nAvailable globals:\ndeclare namespace tools {\n  function listPRFiles(args: { pr: number }): Promise&lt;Array&lt;{ path: string; additions: number }&gt;&gt;;\n  function runSecurityScan(args: { path: string }): Promise&lt;{ findings: string[] }&gt;;\n  function postPRComment(args: { pr: number; body: string }): Promise&lt;{ posted: boolean }&gt;;\n}\ndeclare function text(summary: string): void;<span class=\"syntax-punctuation syntax-definition syntax-string syntax-template syntax-end syntax-js\">`</span></span><span class=\"syntax-punctuation syntax-separator syntax-comma syntax-js\">,</span>\n  <span class=\"syntax-meta syntax-object-literal syntax-key syntax-js\">parameters</span><span class=\"syntax-punctuation syntax-separator syntax-key-value syntax-js\">:</span> <span class=\"syntax-meta syntax-object-literal syntax-js\"><span class=\"syntax-punctuation syntax-section syntax-block syntax-js\">{</span>\n    <span class=\"syntax-meta syntax-object-literal syntax-key syntax-js\">type</span><span class=\"syntax-punctuation syntax-separator syntax-key-value syntax-js\">:</span> <span class=\"syntax-string syntax-quoted syntax-double syntax-js\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-js\">&quot;</span>object<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-js\">&quot;</span></span><span class=\"syntax-punctuation syntax-separator syntax-comma syntax-js\">,</span>\n    <span class=\"syntax-meta syntax-object-literal syntax-key syntax-js\">properties</span><span class=\"syntax-punctuation syntax-separator syntax-key-value syntax-js\">:</span> <span class=\"syntax-meta syntax-object-literal syntax-js\"><span class=\"syntax-punctuation syntax-section syntax-block syntax-js\">{</span> <span class=\"syntax-meta syntax-object-literal syntax-key syntax-js\">code</span><span class=\"syntax-punctuation syntax-separator syntax-key-value syntax-js\">:</span> <span class=\"syntax-meta syntax-object-literal syntax-js\"><span class=\"syntax-punctuation syntax-section syntax-block syntax-js\">{</span> <span class=\"syntax-meta syntax-object-literal syntax-key syntax-js\">type</span><span class=\"syntax-punctuation syntax-separator syntax-key-value syntax-js\">:</span> <span class=\"syntax-string syntax-quoted syntax-double syntax-js\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-js\">&quot;</span>string<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-js\">&quot;</span></span> <span class=\"syntax-punctuation syntax-section syntax-block syntax-js\">}</span></span> <span class=\"syntax-punctuation syntax-section syntax-block syntax-js\">}</span></span><span class=\"syntax-punctuation syntax-separator syntax-comma syntax-js\">,</span>\n    <span class=\"syntax-meta syntax-object-literal syntax-key syntax-js\">required</span><span class=\"syntax-punctuation syntax-separator syntax-key-value syntax-js\">:</span> <span class=\"syntax-meta syntax-sequence syntax-js\"><span class=\"syntax-punctuation syntax-section syntax-brackets syntax-js\">[</span><span class=\"syntax-string syntax-quoted syntax-double syntax-js\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-js\">&quot;</span>code<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-js\">&quot;</span></span><span class=\"syntax-punctuation syntax-section syntax-brackets syntax-js\">]</span></span><span class=\"syntax-punctuation syntax-separator syntax-comma syntax-js\">,</span>\n  <span class=\"syntax-punctuation syntax-section syntax-block syntax-js\">}</span></span><span class=\"syntax-punctuation syntax-separator syntax-comma syntax-js\">,</span>\n<span class=\"syntax-punctuation syntax-section syntax-block syntax-js\">}</span></span><span class=\"syntax-punctuation syntax-terminator syntax-statement syntax-js\">;</span>\n \n<span class=\"syntax-comment syntax-line syntax-double-slash syntax-js\"><span class=\"syntax-punctuation syntax-definition syntax-comment syntax-js\">//</span> 2. Turn 1: Gemini 4 Argon emits a single script to fetch, filter, scan, and comment\n</span><span class=\"syntax-storage syntax-type syntax-js\">const</span> <span class=\"syntax-variable syntax-other syntax-readwrite syntax-js\">turn1</span> <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-js\">=</span> <span class=\"syntax-variable syntax-other syntax-readwrite syntax-js\">await</span> <span class=\"syntax-variable syntax-other syntax-object syntax-js\">client</span><span class=\"syntax-punctuation syntax-accessor syntax-js\">.</span><span class=\"syntax-meta syntax-property syntax-object syntax-js\">interactions</span><span class=\"syntax-punctuation syntax-accessor syntax-js\">.</span><span class=\"syntax-meta syntax-function-call syntax-method syntax-js\"><span class=\"syntax-variable syntax-function syntax-js\">create</span><span class=\"syntax-meta syntax-group syntax-js\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-js\">(</span><span class=\"syntax-meta syntax-object-literal syntax-js\"><span class=\"syntax-punctuation syntax-section syntax-block syntax-js\">{</span>\n  <span class=\"syntax-meta syntax-object-literal syntax-key syntax-js\">model</span><span class=\"syntax-punctuation syntax-separator syntax-key-value syntax-js\">:</span> <span class=\"syntax-string syntax-quoted syntax-double syntax-js\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-js\">&quot;</span>gemini-4-argon<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-js\">&quot;</span></span><span class=\"syntax-punctuation syntax-separator syntax-comma syntax-js\">,</span>\n  <span class=\"syntax-meta syntax-object-literal syntax-key syntax-js\">input</span><span class=\"syntax-punctuation syntax-separator syntax-key-value syntax-js\">:</span> <span class=\"syntax-string syntax-quoted syntax-double syntax-js\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-js\">&quot;</span>Scan all modified .ts files with &gt;50 additions in PR #42, post a PR comment with any findings, and output a 1-line summary.<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-js\">&quot;</span></span><span class=\"syntax-punctuation syntax-separator syntax-comma syntax-js\">,</span>\n  <span class=\"syntax-meta syntax-object-literal syntax-key syntax-js\">tools</span><span class=\"syntax-punctuation syntax-separator syntax-key-value syntax-js\">:</span> <span class=\"syntax-meta syntax-sequence syntax-js\"><span class=\"syntax-punctuation syntax-section syntax-brackets syntax-js\">[</span><span class=\"syntax-variable syntax-other syntax-readwrite syntax-js\">execTool</span><span class=\"syntax-punctuation syntax-section syntax-brackets syntax-js\">]</span></span><span class=\"syntax-punctuation syntax-separator syntax-comma syntax-js\">,</span>\n<span class=\"syntax-punctuation syntax-section syntax-block syntax-js\">}</span></span></span><span class=\"syntax-meta syntax-group syntax-js\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-js\">)</span></span></span><span class=\"syntax-punctuation syntax-terminator syntax-statement syntax-js\">;</span>\n \n<span class=\"syntax-comment syntax-line syntax-double-slash syntax-js\"><span class=\"syntax-punctuation syntax-definition syntax-comment syntax-js\">//</span> 3. Run the script in a separate context (use QuickJS or isolated-vm for untrusted code)\n</span><span class=\"syntax-storage syntax-type syntax-js\">const</span> <span class=\"syntax-variable syntax-other syntax-readwrite syntax-js\">fcStep</span> <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-js\">=</span> <span class=\"syntax-variable syntax-other syntax-object syntax-js\">turn1</span><span class=\"syntax-punctuation syntax-accessor syntax-js\">.</span><span class=\"syntax-meta syntax-property syntax-object syntax-js\">steps</span><span class=\"syntax-keyword syntax-operator syntax-ternary syntax-js\">?</span><span class=\"syntax-punctuation syntax-accessor syntax-js\">.</span><span class=\"syntax-meta syntax-function-call syntax-method syntax-js\"><span class=\"syntax-variable syntax-function syntax-js\">find</span><span class=\"syntax-meta syntax-group syntax-js\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-js\">(</span><span class=\"syntax-meta syntax-function syntax-declaration syntax-js\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-js\">(</span><span class=\"syntax-variable syntax-parameter syntax-function syntax-js\">s</span>: <span class=\"syntax-variable syntax-parameter syntax-function syntax-js\">any</span><span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-js\">)</span><span class=\"syntax-meta syntax-function syntax-declaration syntax-js\"> </span><span class=\"syntax-storage syntax-type syntax-function syntax-arrow syntax-js\">=&gt;</span></span> <span class=\"syntax-meta syntax-block syntax-js\"><span class=\"syntax-variable syntax-other syntax-object syntax-js\">s</span><span class=\"syntax-punctuation syntax-accessor syntax-js\">.</span><span class=\"syntax-meta syntax-property syntax-object syntax-js\">type</span> <span class=\"syntax-keyword syntax-operator syntax-comparison syntax-js\">===</span> <span class=\"syntax-string syntax-quoted syntax-double syntax-js\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-js\">&quot;</span>function_call<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-js\">&quot;</span></span></span></span><span class=\"syntax-meta syntax-group syntax-js\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-js\">)</span></span></span> <span class=\"syntax-keyword syntax-control syntax-import-export syntax-js\">as</span> <span class=\"syntax-variable syntax-other syntax-readwrite syntax-js\">any</span><span class=\"syntax-punctuation syntax-terminator syntax-statement syntax-js\">;</span>\n<span class=\"syntax-storage syntax-type syntax-js\">const</span> <span class=\"syntax-variable syntax-other syntax-readwrite syntax-js\">output</span>: <span class=\"syntax-variable syntax-other syntax-object syntax-js\">string</span><span class=\"syntax-meta syntax-brackets syntax-js\"><span class=\"syntax-punctuation syntax-section syntax-brackets syntax-js\">[</span><span class=\"syntax-punctuation syntax-section syntax-brackets syntax-js\">]</span></span> <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-js\">=</span> <span class=\"syntax-meta syntax-sequence syntax-js\"><span class=\"syntax-punctuation syntax-section syntax-brackets syntax-js\">[</span><span class=\"syntax-punctuation syntax-section syntax-brackets syntax-js\">]</span></span><span class=\"syntax-punctuation syntax-terminator syntax-statement syntax-js\">;</span>\n<span class=\"syntax-keyword syntax-control syntax-flow syntax-js\">await</span> <span class=\"syntax-variable syntax-other syntax-object syntax-js\">vm</span><span class=\"syntax-punctuation syntax-accessor syntax-js\">.</span><span class=\"syntax-meta syntax-function-call syntax-method syntax-js\"><span class=\"syntax-variable syntax-function syntax-js\">runInNewContext</span><span class=\"syntax-meta syntax-group syntax-js\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-js\">(</span><span class=\"syntax-string syntax-template syntax-js\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-template syntax-begin syntax-js\">`</span>(async () =&gt; {<span class=\"syntax-constant syntax-character syntax-escape syntax-js\">\\n</span></span><span class=\"syntax-meta syntax-template syntax-expression syntax-js\"><span class=\"syntax-punctuation syntax-definition syntax-template-expression syntax-begin syntax-js\">${</span></span><span class=\"syntax-meta syntax-template syntax-expression syntax-js\"><span class=\"syntax-source syntax-js syntax-embedded syntax-expression\"><span class=\"syntax-variable syntax-other syntax-object syntax-js\">fcStep</span><span class=\"syntax-punctuation syntax-accessor syntax-js\">.</span><span class=\"syntax-meta syntax-property syntax-object syntax-js\">arguments</span><span class=\"syntax-punctuation syntax-accessor syntax-js\">.</span><span class=\"syntax-meta syntax-property syntax-object syntax-js\">code</span></span><span class=\"syntax-punctuation syntax-definition syntax-template-expression syntax-end syntax-js\">}</span></span><span class=\"syntax-string syntax-template syntax-js\"><span class=\"syntax-constant syntax-character syntax-escape syntax-js\">\\n</span>})()<span class=\"syntax-punctuation syntax-definition syntax-string syntax-template syntax-end syntax-js\">`</span></span><span class=\"syntax-punctuation syntax-separator syntax-comma syntax-js\">,</span> <span class=\"syntax-meta syntax-object-literal syntax-js\"><span class=\"syntax-punctuation syntax-section syntax-block syntax-js\">{</span>\n  <span class=\"syntax-variable syntax-other syntax-readwrite syntax-js\">tools</span><span class=\"syntax-punctuation syntax-separator syntax-comma syntax-js\">,</span>\n  <span class=\"syntax-meta syntax-function syntax-declaration syntax-js\"><span class=\"syntax-meta syntax-object-literal syntax-key syntax-js\"><span class=\"syntax-entity syntax-name syntax-function syntax-js\">text</span></span><span class=\"syntax-punctuation syntax-separator syntax-key-value syntax-js\">:</span> </span><span class=\"syntax-meta syntax-function syntax-declaration syntax-js\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-js\">(</span><span class=\"syntax-variable syntax-parameter syntax-function syntax-js\">msg</span>: <span class=\"syntax-variable syntax-parameter syntax-function syntax-js\">string</span><span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-js\">)</span><span class=\"syntax-meta syntax-function syntax-declaration syntax-js\"> </span><span class=\"syntax-storage syntax-type syntax-function syntax-arrow syntax-js\">=&gt;</span></span> <span class=\"syntax-meta syntax-block syntax-js\"><span class=\"syntax-variable syntax-other syntax-object syntax-js\">output</span><span class=\"syntax-punctuation syntax-accessor syntax-js\">.</span><span class=\"syntax-meta syntax-function-call syntax-method syntax-js\"><span class=\"syntax-support syntax-function syntax-mutator syntax-js\">push</span><span class=\"syntax-meta syntax-group syntax-js\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-js\">(</span><span class=\"syntax-variable syntax-other syntax-readwrite syntax-js\">msg</span></span><span class=\"syntax-meta syntax-group syntax-js\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-js\">)</span></span></span></span><span class=\"syntax-punctuation syntax-separator syntax-comma syntax-js\">,</span>\n<span class=\"syntax-punctuation syntax-section syntax-block syntax-js\">}</span></span></span><span class=\"syntax-meta syntax-group syntax-js\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-js\">)</span></span></span><span class=\"syntax-punctuation syntax-terminator syntax-statement syntax-js\">;</span>\n \n<span class=\"syntax-comment syntax-line syntax-double-slash syntax-js\"><span class=\"syntax-punctuation syntax-definition syntax-comment syntax-js\">//</span> 4. Turn 2: Send only the 1-line summary back via previous_interaction_id\n</span><span class=\"syntax-storage syntax-type syntax-js\">const</span> <span class=\"syntax-variable syntax-other syntax-readwrite syntax-js\">turn2</span> <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-js\">=</span> <span class=\"syntax-variable syntax-other syntax-readwrite syntax-js\">await</span> <span class=\"syntax-variable syntax-other syntax-object syntax-js\">client</span><span class=\"syntax-punctuation syntax-accessor syntax-js\">.</span><span class=\"syntax-meta syntax-property syntax-object syntax-js\">interactions</span><span class=\"syntax-punctuation syntax-accessor syntax-js\">.</span><span class=\"syntax-meta syntax-function-call syntax-method syntax-js\"><span class=\"syntax-variable syntax-function syntax-js\">create</span><span class=\"syntax-meta syntax-group syntax-js\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-js\">(</span><span class=\"syntax-meta syntax-object-literal syntax-js\"><span class=\"syntax-punctuation syntax-section syntax-block syntax-js\">{</span>\n  <span class=\"syntax-meta syntax-object-literal syntax-key syntax-js\">model</span><span class=\"syntax-punctuation syntax-separator syntax-key-value syntax-js\">:</span> <span class=\"syntax-string syntax-quoted syntax-double syntax-js\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-js\">&quot;</span>gemini-4-argon<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-js\">&quot;</span></span><span class=\"syntax-punctuation syntax-separator syntax-comma syntax-js\">,</span>\n  <span class=\"syntax-meta syntax-object-literal syntax-key syntax-js\">previous_interaction_id</span><span class=\"syntax-punctuation syntax-separator syntax-key-value syntax-js\">:</span> <span class=\"syntax-variable syntax-other syntax-object syntax-js\">turn1</span><span class=\"syntax-punctuation syntax-accessor syntax-js\">.</span><span class=\"syntax-meta syntax-property syntax-object syntax-js\">id</span><span class=\"syntax-punctuation syntax-separator syntax-comma syntax-js\">,</span>\n  <span class=\"syntax-meta syntax-object-literal syntax-key syntax-js\">tools</span><span class=\"syntax-punctuation syntax-separator syntax-key-value syntax-js\">:</span> <span class=\"syntax-meta syntax-sequence syntax-js\"><span class=\"syntax-punctuation syntax-section syntax-brackets syntax-js\">[</span><span class=\"syntax-variable syntax-other syntax-readwrite syntax-js\">execTool</span><span class=\"syntax-punctuation syntax-section syntax-brackets syntax-js\">]</span></span><span class=\"syntax-punctuation syntax-separator syntax-comma syntax-js\">,</span>\n  <span class=\"syntax-meta syntax-object-literal syntax-key syntax-js\">input</span><span class=\"syntax-punctuation syntax-separator syntax-key-value syntax-js\">:</span> <span class=\"syntax-meta syntax-sequence syntax-js\"><span class=\"syntax-punctuation syntax-section syntax-brackets syntax-js\">[</span>\n    <span class=\"syntax-meta syntax-object-literal syntax-js\"><span class=\"syntax-punctuation syntax-section syntax-block syntax-js\">{</span>\n      <span class=\"syntax-meta syntax-object-literal syntax-key syntax-js\">type</span><span class=\"syntax-punctuation syntax-separator syntax-key-value syntax-js\">:</span> <span class=\"syntax-string syntax-quoted syntax-double syntax-js\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-js\">&quot;</span>function_result<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-js\">&quot;</span></span><span class=\"syntax-punctuation syntax-separator syntax-comma syntax-js\">,</span>\n      <span class=\"syntax-meta syntax-object-literal syntax-key syntax-js\">name</span><span class=\"syntax-punctuation syntax-separator syntax-key-value syntax-js\">:</span> <span class=\"syntax-variable syntax-other syntax-object syntax-js\">fcStep</span><span class=\"syntax-punctuation syntax-accessor syntax-js\">.</span><span class=\"syntax-meta syntax-property syntax-object syntax-js\">name</span><span class=\"syntax-punctuation syntax-separator syntax-comma syntax-js\">,</span>\n      <span class=\"syntax-meta syntax-object-literal syntax-key syntax-js\">call_id</span><span class=\"syntax-punctuation syntax-separator syntax-key-value syntax-js\">:</span> <span class=\"syntax-variable syntax-other syntax-object syntax-js\">fcStep</span><span class=\"syntax-punctuation syntax-accessor syntax-js\">.</span><span class=\"syntax-meta syntax-property syntax-object syntax-js\">id</span><span class=\"syntax-punctuation syntax-separator syntax-comma syntax-js\">,</span>\n      <span class=\"syntax-meta syntax-object-literal syntax-key syntax-js\">result</span><span class=\"syntax-punctuation syntax-separator syntax-key-value syntax-js\">:</span> <span class=\"syntax-meta syntax-sequence syntax-js\"><span class=\"syntax-punctuation syntax-section syntax-brackets syntax-js\">[</span><span class=\"syntax-meta syntax-object-literal syntax-js\"><span class=\"syntax-punctuation syntax-section syntax-block syntax-js\">{</span> <span class=\"syntax-meta syntax-object-literal syntax-key syntax-js\">type</span><span class=\"syntax-punctuation syntax-separator syntax-key-value syntax-js\">:</span> <span class=\"syntax-string syntax-quoted syntax-double syntax-js\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-js\">&quot;</span>text<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-js\">&quot;</span></span><span class=\"syntax-punctuation syntax-separator syntax-comma syntax-js\">,</span> <span class=\"syntax-meta syntax-object-literal syntax-key syntax-js\">text</span><span class=\"syntax-punctuation syntax-separator syntax-key-value syntax-js\">:</span> <span class=\"syntax-variable syntax-other syntax-object syntax-js\">output</span><span class=\"syntax-punctuation syntax-accessor syntax-js\">.</span><span class=\"syntax-meta syntax-function-call syntax-method syntax-js\"><span class=\"syntax-variable syntax-function syntax-js\">join</span><span class=\"syntax-meta syntax-group syntax-js\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-js\">(</span><span class=\"syntax-string syntax-quoted syntax-double syntax-js\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-js\">&quot;</span><span class=\"syntax-constant syntax-character syntax-escape syntax-js\">\\n</span><span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-js\">&quot;</span></span></span><span class=\"syntax-meta syntax-group syntax-js\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-js\">)</span></span></span> <span class=\"syntax-punctuation syntax-section syntax-block syntax-js\">}</span></span><span class=\"syntax-punctuation syntax-section syntax-brackets syntax-js\">]</span></span><span class=\"syntax-punctuation syntax-separator syntax-comma syntax-js\">,</span>\n    <span class=\"syntax-punctuation syntax-section syntax-block syntax-js\">}</span></span><span class=\"syntax-punctuation syntax-separator syntax-comma syntax-js\">,</span>\n  <span class=\"syntax-punctuation syntax-section syntax-brackets syntax-js\">]</span></span><span class=\"syntax-punctuation syntax-separator syntax-comma syntax-js\">,</span>\n<span class=\"syntax-punctuation syntax-section syntax-block syntax-js\">}</span></span></span><span class=\"syntax-meta syntax-group syntax-js\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-js\">)</span></span></span><span class=\"syntax-punctuation syntax-terminator syntax-statement syntax-js\">;</span>\n \n<span class=\"syntax-meta syntax-function-call syntax-method syntax-js\"><span class=\"syntax-support syntax-type syntax-object syntax-console syntax-js\">console</span><span class=\"syntax-punctuation syntax-accessor syntax-js\">.</span><span class=\"syntax-support syntax-function syntax-console syntax-js\">log</span><span class=\"syntax-meta syntax-group syntax-js\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-js\">(</span><span class=\"syntax-variable syntax-other syntax-object syntax-js\">turn2</span><span class=\"syntax-punctuation syntax-accessor syntax-js\">.</span><span class=\"syntax-meta syntax-property syntax-object syntax-js\">output_text</span></span><span class=\"syntax-meta syntax-group syntax-js\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-js\">)</span></span></span><span class=\"syntax-punctuation syntax-terminator syntax-statement syntax-js\">;</span>\n</span></span></code></pre>\n<p>When <code>vm.runInNewContext</code> executes the script generated by <code>gemini-4-argon</code>:</p>\n<ol>\n<li>The script calls <code>await tools.listPRFiles({ pr: 42 })</code> and filters the list in memory down to the <code>.ts</code> files with more than 50 additions (<code>files.filter(f =&gt; f.path.endsWith(&quot;.ts&quot;) &amp;&amp; f.additions &gt; 50)</code>).</li>\n<li>It runs <code>tools.runSecurityScan</code> on just those matching files, checks whether any findings exist, posts the PR comment via <code>tools.postPRComment</code>, and emits a single line via <code>text()</code>.</li>\n<li>None of the intermediate file objects or raw scanner payloads ever enter the <code>gemini-4-argon</code> context window; only the one-line <code>output</code> summary is sent back in Turn 2.</li>\n</ol>\n<h2>Agent harnesses are already defaulting to Code Mode</h2>\n<p>Across the ecosystem, coding agents and developer frameworks are converging on Code Mode as their default way to orchestrate tools.</p>\n<p>Harnesses like <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://pi.dev\">Pi</a>, <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://factory.ai\">Factory Droid</a>, and <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://github.com/openai/codex\">OpenAI Codex</a> now ship with or default to Code Mode. Factory switched Droid 1.0 to Code Mode, improving their <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://www.tbench.ai\">Terminal-Bench</a> 4 accuracy by +3.5 points and cutting model spend by 15%.</p>\n<p>Agent frameworks like <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://ai.pydantic.dev\">Pydantic AI</a>, <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://www.langchain.com\">LangChain</a>, or <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://blog.cloudflare.com/code-mode/\">Cloudflare's Agents SDK</a> support similar Code Mode tools already.</p>\n<h2>What comes next</h2>\n<p>Does this mean every agent will soon only have a single <code>exec</code> tool? Not necessarily. This is as much a research and product question as an <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://www.philschmid.de/agent-harness-2026\">agent harness engineering</a> one.</p>\n<p>When you start experimenting with Code Mode, you will also quickly notice that many of the tools, CLIs, and <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://www.philschmid.de/agent-skills-tips\">Agent Skills</a> we built might not integrate cleanly out of the box because they were optimized for <code>bash</code> and human-readable text rather than typed code execution.</p>\n<p>This might force you to take a step back and audit what your agent actually needs. Happy building!</p>\n",
  "content_markdown": "For the past two years, building capable Agents meant designing tools, figuring out which actions help the model complete a task, deciding how granular each tool schema needs to be, or iterating on system instruction templates. This is changing. Agents are moving in the opposite direction by collapsing their entire tool catalog into **one tool**: `exec`.\n\nThis is called **Code Mode** (or Programmatic Tool Calling). Instead of forcing the model to trigger tools one at a time across turns, the harness gives the model a single `exec(code)` tool. The model writes a short TypeScript or Python script that chains, combines, and awaits actions inside an isolated sandbox.\n\n![Standard tool calling vs. Code Mode](https://www.philschmid.de/static/blog/code-mode/codemode-hero-comparison.png)\n\n## From single actions to chaining workflows in code\n\nTo understand why agents are converging on a single `exec` tool, we should look at how tool calling evolved.\n\nInitially, we only gave agents a handful of tools because they couldn't reliably choose or filter across a large catalog. As models improved, we connected dozens of tools or MCP servers, but ran into context window limits. We solved that with tool search and [progressive disclosure](https://www.philschmid.de/use-mcp-servers), letting agents look up tools on demand.\n\nEven with dynamic tool loading, we still had dozens of individual tools, and were still stuck with the limitation of standard tool calling: *one* action per turn.\n\nIn standard tool calling, the model generates a structured object (typically JSON) that defines a single action (or at best a flat batch of independent calls, like reading three files), waits for the raw output to come back, adds it into the prompt history, reasons again, and decides what to do next.\n\nFrom my own experience, we made a big jump recently in how reliably models can combine and chain dependent actions in a single pass:\n\n- **Research and filtering:** Instead of fetching a list of sources in Turn 1, reading them in Turn 2, and cross-referencing them in Turn 3, the model can write a script that queries the sources, filters out irrelevant hits, and extracts the exact answer in one step.\n- **Multi-file edits and inline verification:** Standard edit tools typically operate on one file per tool call. With Code Mode, the model can apply coordinated changes across multiple files, run a verification check, inspect the output, or branch on pass or fail inside the same script.\n- **Browser and computer use:** In UI automation, the chain of actions is often obvious: click a button, fill a form, wait for a selector, or paginate through a table in a loop. Instead of paying a full model round-trip for every click or keystroke, the model can script the entire sequence or loop in one turn and only return when the page state changes.\n- **Parallel fan-out and sub-agents:** When a task requires running 20 lookups or calling specialist sub-models in parallel and feeding those outputs into a second API, the model can `await Promise.all(...)`, transform the array, and call the next function without round-tripping through the LLM context window between steps.\n\nSeveral shifts came together to enable this. Frontier models are trained heavily on code, and providers have started post-training models for Code Mode. At the same time, MCP servers now increasingly ship [`outputSchema`](https://modelcontextprotocol.io/specification/draft/server/tools#output-schema) alongside `inputSchema`, giving the model upfront knowledge of return types so it can chain Tool A into Tool B inside the same script *before* seeing runtime output.\n\n## How Code Mode works\n\nCode Mode collapses the tool catalog into a single tool on the model surface: `exec(code)`.\n\nInstead of passing 80 separate JSON Schema tool objects to the model API, the agent compiles those schemas into compact type declarations (`declare namespace tools { ... }`). When the model needs to combine actions across external systems, it calls `exec` and writes a script that invokes `await tools.<server>.<tool>(args)`.\n\nTypeScript\n\n```typescript\n// Pseudo-code: TypeScript declarations exposed to the model\ndeclare namespace tools {\n  namespace linear {\n    function listProjects(): Promise<Array<{ id: string; name: string }>>;\n    function listIssues(args: { projectId: string }): Promise<Array<{ id: string; title: string; assignee?: string }>>;\n    function archiveIssue(args: { id: string }): Promise<{ ok: boolean }>;\n  }\n}\n \n// Optional: when wrapping hundreds of tools, omit full namespaces upfront and expose\n// a global map in the sandbox that the model can iterate and filter over in code\ndeclare const ALL_TOOLS: Record<string, { description: string; signature: string }>;\n \n// Multimodal output helpers: only what is passed here enters the model context window\ndeclare function text(output: string): void;\ndeclare function image(data: string | Uint8Array, mimeType?: string): void;\ndeclare function audio(data: string | Uint8Array, mimeType?: string): void;\n \n// Cross-turn state helpers: persist data in host memory without paying token costs\ndeclare function store(key: string, value: unknown): void;\ndeclare function load<T = unknown>(key: string): T;\n```\n\nTo save context across a large catalog, we don't have to expose every tool directly. We can leverage principles we already built, like tool search, or expose a global `ALL_TOOLS` map inside the sandbox. Similarly, multimodal output helpers (`text()`, `image()`, `audio()`) let the script pass text, images, or audio directly back into the model's context window.\n\nTypeScript\n\n```typescript\n// Pseudo-code: What the model emits inside a single exec() call\nconst projects = await tools.linear.listProjects();\nconst issueBatches = await Promise.all(\n  projects.map((p) => tools.linear.listIssues({ projectId: p.id }))\n);\n \nconst unassigned = issueBatches.flat().filter((issue) => !issue.assignee);\nawait Promise.all(unassigned.map((issue) => tools.linear.archiveIssue({ id: issue.id })));\n \ntext(`Archived ${unassigned.length} unassigned issues across ${projects.length} projects.`);\n```\n\n*The sandbox executes all 55 underlying API calls, filters the payloads in memory, and returns only the one-line `text()` string (`\"Archived 42 unassigned issues across 12 projects.\"`) to the model's context window.*\n\n![How the 1-tool architecture works](https://www.philschmid.de/static/blog/code-mode/codemode-proxy-arch.png)\n\n### Why a JS/Python sandbox instead of just `bash`?\n\nYou can build a tool proxy in [`bash`](https://www.philschmid.de/superhuman-bash) too, but orchestrating tools inside a language runtime like JavaScript or Python can bring benefits that are harder to achieve in `bash` environments.\n\n- **Typed functions:** MCP servers and internal APIs map directly to typed `await tools.<service>.<method>(args)` calls with native objects, `Promise.all`, and `try`/`catch` error handling instead of fragile bash string escaping.\n- **Multimodal context:** A shell only returns stdout text. If a multimodal model wants to inspect an image, it cannot run `cat screenshot.png`, which is why `bash` harnesses still had to bolt on separate `read` or `view_media` tools. In an `exec` sandbox, calling `image(screenshot)` or `audio(clip)` tells the host runtime to attach the actual media part directly to the model's next turn.\n- **Credential and policy proxy:** Every `await tools.*` call crosses a structured bridge to the host runtime, which can inject OAuth tokens outside the sandbox, validate schemas, or pause for user confirmation on destructive calls.\n- **State management:** In standard tool calling, the prompt history is the only state store, so reusing a large query result in Turn 2 means keeping the raw JSON in the context window on every turn. Exposing a KV interface lets the agent persist state outside of the context window across turns.\n\n## Building a 1-tool agent with the Gemini Interactions API\n\nHere is a minimal, runnable pseudo example that provides `gemini-4-argon` with a single execution tool.\n\nTypeScript\n\n```typescript\nimport vm from \"node:vm\";\nimport { GoogleGenAI } from \"@google/genai\";\n \nconst client = new GoogleGenAI({});\n \n// Underlying host functions (e.g., MCP clients or internal APIs)\nconst tools = {\n  listPRFiles: async ({ pr }: { pr: number }) => [\n    { path: \"src/auth.ts\", additions: 120 },\n    { path: \"src/payments.ts\", additions: 85 },\n    { path: \"src/utils.ts\", additions: 12 },\n    { path: \"README.md\", additions: 60 },\n  ],\n  runSecurityScan: async ({ path }: { path: string }) => ({\n    findings: path.includes(\"auth\") ? [\"Missing token expiry check\"] : [],\n  }),\n  postPRComment: async ({ pr, body }: { pr: number; body: string }) => ({ posted: true }),\n};\n \n// 1. Expose a single `exec` tool with TypeScript .d.ts signatures\nconst execTool = {\n  type: \"function\" as const,\n  name: \"exec\",\n  description: `Run an async JavaScript body in an isolated sandbox (no imports; call text() to output).\nAvailable globals:\ndeclare namespace tools {\n  function listPRFiles(args: { pr: number }): Promise<Array<{ path: string; additions: number }>>;\n  function runSecurityScan(args: { path: string }): Promise<{ findings: string[] }>;\n  function postPRComment(args: { pr: number; body: string }): Promise<{ posted: boolean }>;\n}\ndeclare function text(summary: string): void;`,\n  parameters: {\n    type: \"object\",\n    properties: { code: { type: \"string\" } },\n    required: [\"code\"],\n  },\n};\n \n// 2. Turn 1: Gemini 4 Argon emits a single script to fetch, filter, scan, and comment\nconst turn1 = await client.interactions.create({\n  model: \"gemini-4-argon\",\n  input: \"Scan all modified .ts files with >50 additions in PR #42, post a PR comment with any findings, and output a 1-line summary.\",\n  tools: [execTool],\n});\n \n// 3. Run the script in a separate context (use QuickJS or isolated-vm for untrusted code)\nconst fcStep = turn1.steps?.find((s: any) => s.type === \"function_call\") as any;\nconst output: string[] = [];\nawait vm.runInNewContext(`(async () => {\\n${fcStep.arguments.code}\\n})()`, {\n  tools,\n  text: (msg: string) => output.push(msg),\n});\n \n// 4. Turn 2: Send only the 1-line summary back via previous_interaction_id\nconst turn2 = await client.interactions.create({\n  model: \"gemini-4-argon\",\n  previous_interaction_id: turn1.id,\n  tools: [execTool],\n  input: [\n    {\n      type: \"function_result\",\n      name: fcStep.name,\n      call_id: fcStep.id,\n      result: [{ type: \"text\", text: output.join(\"\\n\") }],\n    },\n  ],\n});\n \nconsole.log(turn2.output_text);\n```\n\nWhen `vm.runInNewContext` executes the script generated by `gemini-4-argon`:\n\n1. The script calls `await tools.listPRFiles({ pr: 42 })` and filters the list in memory down to the `.ts` files with more than 50 additions (`files.filter(f => f.path.endsWith(\".ts\") && f.additions > 50)`).\n2. It runs `tools.runSecurityScan` on just those matching files, checks whether any findings exist, posts the PR comment via `tools.postPRComment`, and emits a single line via `text()`.\n3. None of the intermediate file objects or raw scanner payloads ever enter the `gemini-4-argon` context window; only the one-line `output` summary is sent back in Turn 2.\n\n## Agent harnesses are already defaulting to Code Mode\n\nAcross the ecosystem, coding agents and developer frameworks are converging on Code Mode as their default way to orchestrate tools.\n\nHarnesses like [Pi](https://pi.dev), [Factory Droid](https://factory.ai), and [OpenAI Codex](https://github.com/openai/codex) now ship with or default to Code Mode. Factory switched Droid 1.0 to Code Mode, improving their [Terminal-Bench](https://www.tbench.ai) 4 accuracy by +3.5 points and cutting model spend by 15%.\n\nAgent frameworks like [Pydantic AI](https://ai.pydantic.dev), [LangChain](https://www.langchain.com), or [Cloudflare's Agents SDK](https://blog.cloudflare.com/code-mode/) support similar Code Mode tools already.\n\n## What comes next\n\nDoes this mean every agent will soon only have a single `exec` tool? Not necessarily. This is as much a research and product question as an [agent harness engineering](https://www.philschmid.de/agent-harness-2026) one.\n\nWhen you start experimenting with Code Mode, you will also quickly notice that many of the tools, CLIs, and [Agent Skills](https://www.philschmid.de/agent-skills-tips) we built might not integrate cleanly out of the box because they were optimized for `bash` and human-readable text rather than typed code execution.\n\nThis might force you to take a step back and audit what your agent actually needs. Happy building!\n",
  "dateCreated": "2026-11-02T16:59:20.971254334+00:00",
  "date_created": "2026-11-01T00:00:00+00:00",
  "date_modified": "2026-11-01T00:00:00+00:00",
  "date_published": "2026-11-01T00:00:00+00:00",
  "description": "Instead of triggering tools one at a time across turns, agents are collapsing their tool catalog into a single exec(code) tool—chaining, filtering, and awaiting actions inside an isolated sandbox.",
  "external_url": "https://www.philschmid.de/code-mode",
  "git": {
    "commit": "20068632b65d2830a2d54f25ca1d90d697bea2c0",
    "path": "items/philschmid-de/2026/11/2026-11-01-why-agents-are-soon-only-going-to-have-1-tool.md",
    "permalink": "https://github.com/aymericbeaumet/aggr-instance/blob/20068632b65d2830a2d54f25ca1d90d697bea2c0/items/philschmid-de/2026/11/2026-11-01-why-agents-are-soon-only-going-to-have-1-tool.md"
  },
  "id": "urn:aggr:item:a698babbd5b700c97327269f3a8eb6350f414a46",
  "isBasedOn": {
    "@id": "https://www.philschmid.de/code-mode"
  },
  "mainEntity": {
    "@id": "https://www.philschmid.de/code-mode",
    "@type": "CreativeWork",
    "archivedAt": {
      "@id": "https://aggr.aymericbeaumet.com/items/philschmid-de/2026-11-01-why-agents-are-soon-only-going-to-have-1-tool/#webpage"
    },
    "dateModified": "2026-11-01T00:00:00+00:00",
    "datePublished": "2026-11-01T00:00:00+00:00",
    "headline": "Why Agents Are Soon Only Going to Have 1 Tool",
    "image": {
      "@type": "ImageObject",
      "caption": "Why Agents Are Soon Only Going to Have 1 Tool",
      "height": 90,
      "url": "https://www.philschmid.de/static/blog/code-mode/thumbnail.jpg",
      "width": 160
    },
    "timeRequired": "PT8M",
    "url": "https://www.philschmid.de/code-mode",
    "wordCount": 1720
  },
  "name": "Archived snapshot: Why Agents Are Soon Only Going to Have 1 Tool",
  "preview": {
    "alt": "Why Agents Are Soon Only Going to Have 1 Tool",
    "color": null,
    "height": 90,
    "placeholder": {
      "data_url": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNk+A8AAQUBAScY42YAAAAASUVORK5CYII=",
      "hash": ""
    },
    "url": "https://www.philschmid.de/static/blog/code-mode/thumbnail.jpg",
    "width": 160
  },
  "reading_minutes": 8,
  "replicated_at": null,
  "source": "philschmid-de",
  "source_name": "philschmid.de - RSS feed",
  "summary": "Instead of triggering tools one at a time across turns, agents are collapsing their tool catalog into a single exec(code) tool—chaining, filtering, and awaiting actions inside an isolated sandbox.",
  "tags": [],
  "temporalCoverage": "2026-11-02T16:59:20.971254334+00:00",
  "title": "Why Agents Are Soon Only Going to Have 1 Tool",
  "url": "https://aggr.aymericbeaumet.com/items/philschmid-de/2026-11-01-why-agents-are-soon-only-going-to-have-1-tool/",
  "word_count": 1720
}