)]}'
{
  "log": [
    {
      "commit": "31785aed38e0f63fa736430c6240c8a76b8285dc",
      "tree": "35916d3dbedaeac296ece3dd57610efd82c99c8d",
      "parents": [
        "5c7f95714f34ea327b8f300238da6491dedd6adb"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Tue May 06 01:50:58 2025 +0000"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Mon May 12 19:17:50 2025 -0700"
      },
      "message": "loop: add knowledge_base tool for on-demand information\n\nThe knowledge_base tool provides a way for agents to access specialized information\nwhen needed. Initial topics include:\n\n- sketch: how to use Sketch, including SSH, secrets, and file management\n- go_iterators: information about Go\u0027s iterator feature added in Go 1.22\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\n"
    },
    {
      "commit": "72252cbcb97840d724133be67c4c69cc69ebb2d3",
      "tree": "a361499dc3fa6b9af2be3e74cfd59fd8ba34690e",
      "parents": [
        "7ce5fb76d8748ebf73c5adf9d6cd8eb67716fba8"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Sat May 10 17:00:08 2025 -0700"
      },
      "committer": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Sat May 10 17:00:08 2025 -0700"
      },
      "message": "llm and everything: Update ToolResult to use []Content instead of string for multimodal support\n\nThis was a journey. The sketch-generated summary below is acceptable,\nbut I want to tell you about it in my voice too. The goal was to send\nscreenshots to Claude, so that it could... look at them. Currently\nthe take screenshot and read screenshot tools are different, and they\u0027ll\nneed to be renamed/prompt-engineered a bit, but that\u0027s all fine.\n\nThe miserable part was that we had to change the return value\nof tool from string to Content[], and this crosses several layers:\n - llm.Tool\n - llm.Content\n - ant.Content \u0026 openai and gemini friends\n - AgentMessage [we left this alone]\n\nExtra fun is that Claude\u0027s API for sending images has nested Content\nfields, and empty string and missing needs to be distinguished for the\nText field (because lots of shell commands return the empty string!).\n\nFor the UI, I made us transform the results into a string, dropping\nimages. This would have been yet more churn for not much obvious\nbenefit. Plus, it was going to break skaband\u0027s compatibility, and ...\nyet more work.\n\nOpenAI and Gemini don\u0027t obviously support images in this same way,\nso they just don\u0027t get the tools.\n\n~~~~~~~~~~ Sketch said:\n\nThis architectural change transforms tool results from plain strings to []Content arrays, enabling multimodal interaction in the system. Key changes include:\n\n- Core structural changes:\n  - Modified ToolResult type from string to []Content across all packages\n  - Added MediaType field to Content struct for MIME type support\n  - Created TextContent and ImageContent helper functions\n  - Updated all tool.Run implementations to return []Content\n\n- Image handling:\n  - Implemented base64 image support in Anthropic adapter\n  - Added proper media type detection and content formatting\n  - Created browser_read_image tool for displaying screenshots\n  - Updated browser_screenshot to provide usable image paths\n\n- Adapter improvements:\n  - Updated all LLM adapters (ANT, OAI, GEM) to handle content arrays\n  - Added specialized image content handling in the Anthropic adapter\n  - Ensured proper JSON serialization/deserialization for all content types\n  - Improved test coverage for content arrays\n\n- UI enhancements:\n  - Added omitempty tags to reduce JSON response size\n  - Updated TypeScript types to handle array content\n  - Made field naming consistent (tool_error vs is_error)\n  - Preserved backward compatibility for existing consumers\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: s1a2b3c4d5e6f7g8h\n"
    },
    {
      "commit": "7ce5fb76d8748ebf73c5adf9d6cd8eb67716fba8",
      "tree": "1890bd46f87cf7261ba5a6aaa3fd2d110e7d67cc",
      "parents": [
        "022b3638c2d2691d60f430d8984959c91eee46ab"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Sat May 10 06:26:22 2025 -0700"
      },
      "committer": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Sat May 10 06:26:29 2025 -0700"
      },
      "message": "Revert \"llm: add service.ModelName\"\n\nTurns out I don\u0027t need this.\n\nThis reverts commit 022b3638c2d2691d60f430d8984959c91eee46ab.\n"
    },
    {
      "commit": "022b3638c2d2691d60f430d8984959c91eee46ab",
      "tree": "7459ef27d1e6d2ed83773acb9a33741fddbd730c",
      "parents": [
        "a997be617bd5548a307c708cdba325ea6562acec"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Sat May 10 06:14:21 2025 -0700"
      },
      "committer": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Sat May 10 06:14:49 2025 -0700"
      },
      "message": "llm: add service.ModelName\n"
    },
    {
      "commit": "8236cbc9eadb1bf775bbfa24ccf04be2c69faaaf",
      "tree": "8d0024ce5d69622f452315947c4db5b815bad2b0",
      "parents": [
        "d74572d85c7bbb52b36dfc29338f42dc723caba8"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Fri May 09 09:57:57 2025 -0700"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Fri May 09 11:47:36 2025 -0700"
      },
      "message": "llm/oai: add several more models\n"
    },
    {
      "commit": "4d54493fe3808ecd0c6a9a4d0bbcc7786e97b094",
      "tree": "9877409fc95aaa32aed882426ea15464b8036e34",
      "parents": [
        "a4ad8af8b08a54326bbbd99d57110a42c459c54e"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed May 07 13:33:53 2025 +0000"
      },
      "committer": {
        "name": "Autoformatter",
        "email": "bot@sketch.dev",
        "time": "Thu May 08 19:25:30 2025 +0000"
      },
      "message": "all: support hiding subconvo output\n\nSome of it is systematically noisy.\n"
    },
    {
      "commit": "fa66703d711e53c923109cd78a165ed58cbb29da",
      "tree": "49eb4fe2e8891df4c43e0f6d1516736d4778bbed",
      "parents": [
        "6aaf6afdee5d097c23d5e80314ea13cf37bea491"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed May 07 14:13:27 2025 -0700"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed May 07 14:13:27 2025 -0700"
      },
      "message": "llm/oai: add Mistral Medium 3 to oai models\n"
    },
    {
      "commit": "a9d87aa69cfefdc91ec7aaa6bc42907749748e76",
      "tree": "0575b15619881ac1bedfc71dd552c05b64bbe152",
      "parents": [
        "df6d7b4a0d5fcf59cfed41cd518bb9489f80da5e"
      ],
      "author": {
        "name": "David Crawshaw",
        "email": "david@zentus.com",
        "time": "Tue May 06 10:08:56 2025 -0700"
      },
      "committer": {
        "name": "David Crawshaw",
        "email": "david@zentus.com",
        "time": "Tue May 06 10:08:56 2025 -0700"
      },
      "message": "llm/gem: remove unused field\n"
    },
    {
      "commit": "29fea840fbe3c279e1480d5f78cff4be697b7ca5",
      "tree": "44e4598253553f92de4dd089409f821243b1ca0f",
      "parents": [
        "5cca56ff3aec7785494c6a9fcd4e846900968ed1"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Tue May 06 01:51:09 2025 +0000"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Mon May 05 18:53:08 2025 -0700"
      },
      "message": "llm/ant: replace fmt.Printf with slog in retry logic\n\nBreaks termui.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\n"
    },
    {
      "commit": "3659d8714d31bad050d36043b67efd76a8d53b77",
      "tree": "2803c54c63628e397e63bdbbe4fa2647a4d5f556",
      "parents": [
        "021557a7d33dacd4fedb9a4677fc93c48569d57a"
      ],
      "author": {
        "name": "David Crawshaw",
        "email": "david@zentus.com",
        "time": "Mon May 05 17:52:23 2025 -0700"
      },
      "committer": {
        "name": "David Crawshaw",
        "email": "david@zentus.com",
        "time": "Mon May 05 17:52:27 2025 -0700"
      },
      "message": "all: more gemini key plumbing\n"
    },
    {
      "commit": "021557a7d33dacd4fedb9a4677fc93c48569d57a",
      "tree": "13a020ae99f9f86de4b2b10d919427c9287f3de8",
      "parents": [
        "5a7b3698b523365fe070ffcd1019c704c2c3a7b5"
      ],
      "author": {
        "name": "Sean McCullough",
        "email": "banksean@gmail.com",
        "time": "Mon May 05 23:20:53 2025 +0000"
      },
      "committer": {
        "name": "Sean McCullough",
        "email": "banksean@gmail.com",
        "time": "Mon May 05 16:58:53 2025 -0700"
      },
      "message": "Allow multiplechoice tool to end the model turn\n\nAdd EndsTurn field to llm.Tool to indicate if a tool should force the end of a turn.\nSet the multiplechoice tool to end the turn by setting EndsTurn\u003dtrue.\nUpdate OnResponse to check for tools that should end the turn.\n\nTranscript of the chat for this change:\nhttps://sketch.dev/messages/1f4n-17a3-hmfx-71gg\n\nNote that I did ask it to investigate an alternative approach, but decided\nthis one (explicit EndsTurn field on Tool) was a better trade-off than\nthe alternative (altering the Tool.Run signature).\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\n"
    },
    {
      "commit": "5a23406f6959384e3edc402eaf9c271648195786",
      "tree": "dc6ff3715a427f7ee2a3645ea712f0a7da9705d2",
      "parents": [
        "3b4d2b8f8b805d4fb28e0b5854bb2c0494a8ea26"
      ],
      "author": {
        "name": "David Crawshaw",
        "email": "david@zentus.com",
        "time": "Sun May 04 17:52:08 2025 +0000"
      },
      "committer": {
        "name": "David Crawshaw",
        "email": "david@zentus.com",
        "time": "Sun May 04 13:00:22 2025 -0700"
      },
      "message": "ll/gem: implement Gemini Pro 2.5 support\n\nStill to do:\n- container support\n- sketch.dev support\n\nFor #60\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\n"
    },
    {
      "commit": "3b4d2b8f8b805d4fb28e0b5854bb2c0494a8ea26",
      "tree": "d09f99b13a29133fdc5053eac7e256fa9cc723d0",
      "parents": [
        "bdfb126de211f5f2fabb39498de00acde5faf58f"
      ],
      "author": {
        "name": "David Crawshaw",
        "email": "david@zentus.com",
        "time": "Sun May 04 10:48:25 2025 -0700"
      },
      "committer": {
        "name": "David Crawshaw",
        "email": "david@zentus.com",
        "time": "Sun May 04 10:48:25 2025 -0700"
      },
      "message": "gemini: basic gemini API wrapper\n"
    },
    {
      "commit": "66439b0d8001d4685270681804900e81a5e68c6d",
      "tree": "6a70f80ee9187ccaa3b0969133d236ac0e1654f6",
      "parents": [
        "11c97f29a0bfd8fbdffafb8ea32c2759ea32325f"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Fri May 02 18:35:32 2025 -0700"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Fri May 02 18:35:32 2025 -0700"
      },
      "message": "llm/oai: remove unused parameter\n"
    },
    {
      "commit": "3e213085e04f5ddfc07933ce07826ba38ab0ddad",
      "tree": "97bf035a1f849e55b14d0b45f66a4f215cf26018",
      "parents": [
        "4f84ab729ddbf428b0e891940f08f70b4edee05c"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Fri May 02 13:22:02 2025 -0700"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Fri May 02 13:22:02 2025 -0700"
      },
      "message": "llm/oai: add together.ai Qwen3 support"
    },
    {
      "commit": "4f84ab729ddbf428b0e891940f08f70b4edee05c",
      "tree": "f2e52e4a01c188ada1f5acf8b2a013029b999495",
      "parents": [
        "44f9b4cec11e269a52fbfc099989ab425b8e125f"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Tue Apr 22 16:40:54 2025 -0700"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Fri May 02 12:57:44 2025 -0700"
      },
      "message": "all: support openai-compatible models\n\nThe support is rather minimal at this point:\nOnly hard-coded models, only -unsafe, only -skabandaddr\u003d\"\".\n\nThe \"shared\" LLM package is strongly Claude-flavored.\n\nWe can fix all of this and more over time, if we are inspired to.\n(Maybe we\u0027ll switch to https://github.com/maruel/genai?)\n\nThe goal for now is to get the rough structure in place.\nI\u0027ve rebased and rebuilt this more times than I care to remember.\n"
    }
  ]
}
