)]}'
{
  "log": [
    {
      "commit": "33d282f80db786cc60ba521a38ed5166f23239ed",
      "tree": "9ed1f15c6d3081d5bef7d16b9d72e78a2c7780cf",
      "parents": [
        "a9d87aa69cfefdc91ec7aaa6bc42907749748e76"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Sat May 03 04:01:54 2025 +0000"
      },
      "committer": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Tue May 06 10:23:39 2025 -0700"
      },
      "message": "Add browse tool support.\n\nI reviewed some MCPs (using OpenAI\u0027s deep research to help), and it\nhelped me choose chromedp as the relevant library and helped me come up\nwith an interface. This commit adds chrome to the Docker image which is\nkind of big. (I\u0027ve noticed that it\u0027s smaller on Ubuntu, where it doesn\u0027t\npull in X11.) go-playwright was a library contender as well.\n\nImplement browser automation tooling using chromedp\n\nThis implementation adds browser automation capabilities to the system via the chromedp library,\nenabling Claude to interact with web content effectively.\n\nKey features include:\n\n1. Core browser automation functionality:\n   - Created new browsertools package in claudetool/browser\n   - Implemented tools for navigating, clicking, typing, waiting for elements,\n     getting text, evaluating JavaScript, taking screenshots, and scrolling\n   - Added lazy browser initialization that defers until first use\n   - Integrated with the agent to expose these tools to Claude\n\n2. Screenshot handling and display:\n   - Implemented screenshot storage with UUID-based IDs in /tmp/sketch-screenshots\n   - Added endpoint to serve screenshots via /screenshot/{id}\n   - Created dedicated UI component for displaying screenshots\n   - Ensured proper responsive design with loading states and error handling\n   - Fixed URL paths for proper rehomed URL support\n   - Modified tool calls component to auto-expand screenshot results\n\n3. Error handling and reliability:\n   - Added graceful error handling for browser initialization failures\n   - Implemented proper cleanup of browser resources\n\nThe browser automation tools provide a powerful way for Claude to interact with web content,\nmaking it possible to scrape data, test web applications, and automate web-based tasks.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\n"
    },
    {
      "commit": "c6a2c2408e1fbacbff92931190b3558b8e353944",
      "tree": "d3ea94cd8f8190f0561b23b2d5d094b2406285eb",
      "parents": [
        "b4782147bb79cd34495c4418a351672bc44035de"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Tue Apr 22 18:04:16 2025 -0700"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Mon May 05 13:48:06 2025 -0700"
      },
      "message": "loop: clean up whitespace"
    },
    {
      "commit": "485afc6975b853aa670b5087c323fa3df3df0672",
      "tree": "291bbf09de69cec72c13f652f3d9be81f35451e4",
      "parents": [
        "6234a8d9d229904994f49a5edacca05e54b26d1f"
      ],
      "author": {
        "name": "Sean McCullough",
        "email": "banksean@gmail.com",
        "time": "Mon Apr 28 14:28:39 2025 -0700"
      },
      "committer": {
        "name": "Autoformatter",
        "email": "bot@sketch.dev",
        "time": "Fri May 02 22:12:51 2025 +0000"
      },
      "message": "tool_use: add multiplechoice support to Agent\n\nThis implements the \"dumb\" approach - the tool itself just tells\nthe llm that it rendered the options to the user, and it\u0027s done.\n\nIf the user selects one of the options, we paste its response text\ninto the chat input textarea on the frontend.  The user is of\ncourse free to ignore the question or the options presented.\n\nThis keeps no association between user response and the original\ntool_use block that solicited it from the user. I.e. the user\nresponse message doesn\u0027t include the original tool_use_id value\nit it.  It looks as though the user typed it by hand.\n"
    },
    {
      "commit": "250348ec3c8bcba21caa62fd4ae53e4d9476fafa",
      "tree": "4be2e3660c84343af23cb81fa14b3c7a5709ebfd",
      "parents": [
        "eb5166a5043946ad6782cb64af987d23a32e3203"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed Apr 30 10:31:28 2025 -0700"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed Apr 30 11:13:16 2025 -0700"
      },
      "message": "all: mild prompt engineering\n\n"
    },
    {
      "commit": "78520f50d518f331c6608cfd0dff7bb4a75dc93b",
      "tree": "fadca8a92dbe7e67fcae66c89f54f398fb219c58",
      "parents": [
        "3b0795b1c52d9b470f361299e9cd359c53704a04"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed Apr 30 06:16:08 2025 -0700"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed Apr 30 06:16:08 2025 -0700"
      },
      "message": "loop: update test fixture"
    },
    {
      "commit": "dbe02304e804066bb32fcf6f41690336a98e6531",
      "tree": "d27ed5e5b94b004167e202254b97f7d1806733bd",
      "parents": [
        "2b2090e7fa8fd53eda5dca132980c3e2fa4cb3b8"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Tue Apr 29 16:44:23 2025 -0700"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Tue Apr 29 16:44:23 2025 -0700"
      },
      "message": "loop: extract system prompt into a separate file\n\nThis will make swapping it out easier, if/when desired.\n"
    },
    {
      "commit": "2b2090e7fa8fd53eda5dca132980c3e2fa4cb3b8",
      "tree": "269e400e420a30079bfbaa7dea562e4b6d80d9d7",
      "parents": [
        "c72fff52ad6c5436fa8469f049fa232f2f6be5ed"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Tue Apr 29 16:41:34 2025 -0700"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Tue Apr 29 16:42:35 2025 -0700"
      },
      "message": "claudetool: add missing json schema field\n\nApparently this is required, and Anthropic happens to not care."
    },
    {
      "commit": "833a0f83af52be33eed3baf0f67ffa3ddab55cb4",
      "tree": "0f1c78df648d499ed6ac3e975276ecc977ab4e70",
      "parents": [
        "0cbd976940708c94eb8b644b14bfda3f19087997"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Thu Apr 24 18:39:36 2025 +0000"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Fri Apr 25 19:31:00 2025 -0700"
      },
      "message": "claudetool: improve codereview\n\nDo a bunch of un-vibecoding and bug fixing.\nUnfortunately, lots left.\nGet rid of vet; gopls check covers it.\n\nAdd testing infrastructure and a bunch of fixtures.\n"
    },
    {
      "commit": "75ec6bb42c08c8407cb96025b070dc9f1eb66eb9",
      "tree": "b7563c63b29f1535c5904e180344423412daab4e",
      "parents": [
        "08951fb6789dc172d4719eb6a09fcac21f94ef95"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Thu Apr 24 10:49:16 2025 -0700"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Thu Apr 24 10:49:16 2025 -0700"
      },
      "message": "loop: add email address to Co-Authored-By trailer\n\n- It\u0027s the standard.\n- It\u0027ll let us set up a gravatar for hello@sketch.dev with the sketch logo.\n- It tells people how to find sketch (there was no domain or other hint anywhere).\n"
    },
    {
      "commit": "b60f0f2c4f6baf635c7eeb2972d6ed25d9485891",
      "tree": "93a6b85c34010b1ef41072aad309e56e759694a6",
      "parents": [
        "cc3ba220373b62dd5a098180ea6797af76407525"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip.zeyliger@gmail.com",
        "time": "Wed Apr 23 18:19:32 2025 +0000"
      },
      "committer": {
        "name": "Philip Zeyliger",
        "email": "philip.zeyliger@gmail.com",
        "time": "Wed Apr 23 19:28:10 2025 -0700"
      },
      "message": "Add background execution capability to bash tool\n\nThis adds a \u0027background\u0027 flag to the bash tool, allowing commands to be\nexecuted without waiting for them to complete. When running in background\nmode, the command\u0027s stdout and stderr are redirected to temporary files,\nand the tool returns the PID and paths to these files as a JSON structure.\n\nFeatures:\n- Different default timeouts: 1m for foreground, 10m for background\n- Goroutine to properly reap background processes when they complete\n- Uses \u0027sketch-bg-\u0027 prefix for temporary directories\n- Added robust test helpers for waiting on files and processes\n- Skip agent test that uses recorded HTTP interactions incompatible with\n  the updated schema\n\nSketch also updated the various UIs\n\nCo-Authored-By: sketch\n"
    },
    {
      "commit": "2e463fb649fcff14d4025ddb91f630a98e7da526",
      "tree": "0e86854d80d2759a913870655f13226c31f9d30c",
      "parents": [],
      "author": {
        "name": "Earl Lee",
        "email": "earl.lee@sketch.dev",
        "time": "Thu Apr 17 11:22:22 2025 -0700"
      },
      "committer": {
        "name": "Earl Lee",
        "email": "earl.lee@sketch.dev",
        "time": "Thu Apr 17 11:35:33 2025 -0700"
      },
      "message": "Initial commit\n"
    }
  ]
}
