)]}'
{
  "log": [
    {
      "commit": "c5b8ed462121e5f0d3abcf0ea17c00bb9e8b8846",
      "tree": "b1723cd55a140fd1707f274ab71972f6a48994ea",
      "parents": [
        "d7970e62c34243aaa9c7a6405ceedfb9a073a783"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Mon May 05 20:28:34 2025 +0000"
      },
      "committer": {
        "name": "Autoformatter",
        "email": "bot@sketch.dev",
        "time": "Mon May 05 21:06:35 2025 +0000"
      },
      "message": "Add -termui\u003dfalse flag to prevent panic in non-TTY environments\n\n- Added -termui flag to control terminal UI usage (defaults to true)\n- Added PTY detection to automatically disable terminal UI in non-TTY environments\n\nSketch did some weird stuff here, so this isn\u0027t particularly co-authored\nby sketch.\n"
    },
    {
      "commit": "d7970e62c34243aaa9c7a6405ceedfb9a073a783",
      "tree": "aaf5359fe136652624580e48d240d732790de3c2",
      "parents": [
        "e2518e5c7b80d3f0d8f3017e34b19e59d6deeac6"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Thu May 01 01:56:28 2025 +0000"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Mon May 05 13:48:06 2025 -0700"
      },
      "message": "claudetool: change title tool to precommit, add commit style guidance\n"
    },
    {
      "commit": "e2518e5c7b80d3f0d8f3017e34b19e59d6deeac6",
      "tree": "4d23f4326e76a8f587b4a148aa4347cdc9d243f6",
      "parents": [
        "503b5e3543f69cc56c05bd02ce48666259d01f90"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Tue Apr 29 11:13:40 2025 -0700"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Mon May 05 13:48:06 2025 -0700"
      },
      "message": "claudetool: add experimental LLM reviewer stage"
    },
    {
      "commit": "503b5e3543f69cc56c05bd02ce48666259d01f90",
      "tree": "b1d5efec44e4ff2d6094758b7ccb8d306055c53a",
      "parents": [
        "d7e56386b4243bb6b2f303ef824418bae971a836"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Mon May 05 13:30:55 2025 -0700"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Mon May 05 13:48:06 2025 -0700"
      },
      "message": "loop: add not_done experiment\n\nThis attempts to get the LLM to introspect a bit more\nwhile calling the done tool, encouraging it to change\nitself mind if it thinks better of its progress\nwhile working through the checklist.\n"
    },
    {
      "commit": "d7e56386b4243bb6b2f303ef824418bae971a836",
      "tree": "cb2d5668a2bdb0b4b1c86864c846dbeb9708d6ef",
      "parents": [
        "c6a2c2408e1fbacbff92931190b3558b8e353944"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Mon May 05 13:22:08 2025 -0700"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Mon May 05 13:48:06 2025 -0700"
      },
      "message": "loop: pull done tool description out into a constant"
    },
    {
      "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": "b4782147bb79cd34495c4418a351672bc44035de",
      "tree": "57e11cb271a479c09f577df246ceb619b451a99f",
      "parents": [
        "f396a0014767e7efe619e01a0f1ad371147b385b"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Mon May 05 19:16:54 2025 +0000"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Mon May 05 13:48:06 2025 -0700"
      },
      "message": "experiment: add simple way to toggle experimental features"
    },
    {
      "commit": "f396a0014767e7efe619e01a0f1ad371147b385b",
      "tree": "533d363b29b4acef954a614db612220f757f8ec9",
      "parents": [
        "1dc21374a34fab022eb9138a73ad6b7b566701ec"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Mon May 05 13:12:11 2025 -0700"
      },
      "committer": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Mon May 05 13:13:33 2025 -0700"
      },
      "message": "Explaining how to use -docker-args to facilitate some additional sketch inception.\n"
    },
    {
      "commit": "1dc21374a34fab022eb9138a73ad6b7b566701ec",
      "tree": "37e6edd33743e35bd62d1d6b3ed4166e3464cd42",
      "parents": [
        "8fd510465d87574f64135c16d67f4b6d519a9a83"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Mon May 05 19:54:44 2025 +0000"
      },
      "committer": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Mon May 05 13:13:33 2025 -0700"
      },
      "message": "Add docker-args flag to pass arguments to docker create command\n\nThis change allows users to pass additional arguments to the docker create command,\nwhich can be useful for customizing the container environment (e.g. adding volumes,\nsetting resource limits, etc).\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\n\nUpdate docker-args flag to handle space-separated arguments with escaping\n\n- Created parseDockerArgs function to handle space-separated arguments with quotes and escaping\n- Added comprehensive tests for argument parsing\n- Updated CLI help text to reflect the new format\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\n"
    },
    {
      "commit": "8fd510465d87574f64135c16d67f4b6d519a9a83",
      "tree": "65a17d20a1a8e514e8545941dfd4ca264700a2e0",
      "parents": [
        "a4b19f822c6c46bd46e4b0f47983a3ee72374d72"
      ],
      "author": {
        "name": "David Crawshaw",
        "email": "david@zentus.com",
        "time": "Mon May 05 12:52:43 2025 -0700"
      },
      "committer": {
        "name": "David Crawshaw",
        "email": "david@zentus.com",
        "time": "Mon May 05 12:56:58 2025 -0700"
      },
      "message": "dockerimg: do not include tmp-sketch-dockerfile in image\n\nFixes #39\n"
    },
    {
      "commit": "a4b19f822c6c46bd46e4b0f47983a3ee72374d72",
      "tree": "ec40da15725ee8f81681cd10f10702eb9f770ecc",
      "parents": [
        "995704692a260e7792a6116d19882bc1943e08b4"
      ],
      "author": {
        "name": "Sean McCullough",
        "email": "banksean@gmail.com",
        "time": "Mon May 05 10:22:59 2025 -0700"
      },
      "committer": {
        "name": "Sean McCullough",
        "email": "banksean@gmail.com",
        "time": "Mon May 05 10:40:05 2025 -0700"
      },
      "message": "termui: always call ui.updatePrompt\n\nFixes #62\n"
    },
    {
      "commit": "995704692a260e7792a6116d19882bc1943e08b4",
      "tree": "54d2b592cb77cf09cc462da3df92849a7095ea37",
      "parents": [
        "50608b1df40053cb18d91a8493872a7ce9243655"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Mon May 05 10:26:14 2025 -0700"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Mon May 05 10:26:21 2025 -0700"
      },
      "message": "dockerimg: remove configurability from open browser request\n\nInnie is untrusted, so we can\u0027t let it provide a url to open (duh).\nThere\u0027s a chicken-and-egg problem here: we need to start the git\nserver before launching the container, but we need the container\nport information to store the ps1URL on the git server.\nSolve it with a little sync/atomic. There\u0027s a logical race here,\nbut if we lose the race, the behavior is that nothing happens,\nat which point the user tries again and it works.\nGood enough for now.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e"
    },
    {
      "commit": "50608b1df40053cb18d91a8493872a7ce9243655",
      "tree": "d2955631951755d2a6f69aa2bfd26f2ca073ac5c",
      "parents": [
        "b7a066339b6a4c032524ae772aab3619edcc9c65"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Sat May 03 22:55:49 2025 +0000"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Mon May 05 10:19:34 2025 -0700"
      },
      "message": "dockerimg: fix typo in SSHTheater name"
    },
    {
      "commit": "b7a066339b6a4c032524ae772aab3619edcc9c65",
      "tree": "6c8cb3cf9aa54c3e509ba79ad272668d9c08b458",
      "parents": [
        "b2064de1fff42fe1f34c28a3eb0c61ee220c967d"
      ],
      "author": {
        "name": "David Crawshaw",
        "email": "david@zentus.com",
        "time": "Mon May 05 09:52:20 2025 -0700"
      },
      "committer": {
        "name": "David Crawshaw",
        "email": "david@zentus.com",
        "time": "Mon May 05 09:52:20 2025 -0700"
      },
      "message": "dockerimg: update tests for last commit\n"
    },
    {
      "commit": "b2064de1fff42fe1f34c28a3eb0c61ee220c967d",
      "tree": "5681149ab83059f4cd6757f89c5def153edd282c",
      "parents": [
        "66cf74eb3912a3b8edbff6e3d9b2d93f43e037a7"
      ],
      "author": {
        "name": "David Crawshaw",
        "email": "david@zentus.com",
        "time": "Mon May 05 09:12:19 2025 -0700"
      },
      "committer": {
        "name": "David Crawshaw",
        "email": "david@zentus.com",
        "time": "Mon May 05 09:12:20 2025 -0700"
      },
      "message": "dockerimg: more Dockerfile robustness\n\nLLM-generated RUN commands such as\n\n\tRUN . .venv/bin/activate \u0026\u0026 uv pip sync requirements.txt || true\n\nwere failing when .venv didn\u0027t exist, because under the default\ndebian shell (dash), sourcing a non-existant file causes a command\nto fail even with `|| true`.\n\nMake things a little easier for the LLM by switching to bash.\nAdditionally, configure bash with set +e for the duration of the\nLLM-generated extra_cmds.\n"
    },
    {
      "commit": "66cf74eb3912a3b8edbff6e3d9b2d93f43e037a7",
      "tree": "8cb4690778c2bbd78d827a9a61e4e24a10634704",
      "parents": [
        "93fec60318b49e975e311f0980ed6f166fd6af45"
      ],
      "author": {
        "name": "David Crawshaw",
        "email": "david@zentus.com",
        "time": "Mon May 05 08:48:39 2025 -0700"
      },
      "committer": {
        "name": "David Crawshaw",
        "email": "david@zentus.com",
        "time": "Mon May 05 08:48:39 2025 -0700"
      },
      "message": "dockerimg: do not allocate a TTY in one-shot mode\n"
    },
    {
      "commit": "93fec60318b49e975e311f0980ed6f166fd6af45",
      "tree": "a45bda2677470c79ac5b9bc5ddc19208742b2ce9",
      "parents": [
        "b5f6a00fb7e274681ef67600e9d9969a6161add7"
      ],
      "author": {
        "name": "David Crawshaw",
        "email": "david@zentus.com",
        "time": "Mon May 05 08:40:06 2025 -0700"
      },
      "committer": {
        "name": "David Crawshaw",
        "email": "david@zentus.com",
        "time": "Mon May 05 08:40:06 2025 -0700"
      },
      "message": "termui: export TermUI\n"
    },
    {
      "commit": "b5f6a00fb7e274681ef67600e9d9969a6161add7",
      "tree": "1ace0bfd616105c14e7c87dc5a7bb3b7028fe182",
      "parents": [
        "5a23406f6959384e3edc402eaf9c271648195786"
      ],
      "author": {
        "name": "David Crawshaw",
        "email": "david@zentus.com",
        "time": "Mon May 05 08:27:16 2025 -0700"
      },
      "committer": {
        "name": "David Crawshaw",
        "email": "david@zentus.com",
        "time": "Mon May 05 08:27:17 2025 -0700"
      },
      "message": "dockerimg: use --progress\u003dquiet to always show docker build failure\n\nIn non-verbose mode, --progress\u003dquiet is very quiet when everything\nworks, but prints an actual error when something fails (e.g. the\ndockerfile is bad or you ran out of space).\n\nWhile here, remove the partial stdout/stderr plumbing that did not\nquite work (because the code sometimes used os.Stdout/os.Stderr\ndirectly).\n\nFor #37\nFor #41\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": "bdfb126de211f5f2fabb39498de00acde5faf58f",
      "tree": "665cedc4a7148c2ba86e915be96e1cc1d8a01450",
      "parents": [
        "cf291fafd7142308f27ec5805251f2e2bdeded6b"
      ],
      "author": {
        "name": "Sean McCullough",
        "email": "banksean@gmail.com",
        "time": "Sat May 03 20:15:41 2025 -0700"
      },
      "committer": {
        "name": "Sean McCullough",
        "email": "banksean@gmail.com",
        "time": "Sat May 03 20:15:41 2025 -0700"
      },
      "message": "sshserver: s/log/slog\n"
    },
    {
      "commit": "cf291fafd7142308f27ec5805251f2e2bdeded6b",
      "tree": "f18805cbe3583f62e423c5a0b17a3be3a757df54",
      "parents": [
        "d0a3cd609ca36baebd066d6fd83c153293c459eb"
      ],
      "author": {
        "name": "Sean McCullough",
        "email": "banksean@gmail.com",
        "time": "Sat May 03 17:55:48 2025 -0700"
      },
      "committer": {
        "name": "Sean McCullough",
        "email": "banksean@gmail.com",
        "time": "Sat May 03 17:59:43 2025 -0700"
      },
      "message": "sshserver: add scp support\n\nfixes https://github.com/boldsoftware/sketch/issues/53\n"
    },
    {
      "commit": "d0a3cd609ca36baebd066d6fd83c153293c459eb",
      "tree": "88dae925d5fc157cef66a7e4bdd5ee1bc047c7ba",
      "parents": [
        "4bdd9aaaa4156bcf9863df9eadb809c0bd7a0573"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Sat May 03 15:46:45 2025 -0700"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Sat May 03 15:46:45 2025 -0700"
      },
      "message": "browser: switch printf to slog\n\nShould fix #52"
    },
    {
      "commit": "4bdd9aaaa4156bcf9863df9eadb809c0bd7a0573",
      "tree": "f4a7a6b28a833b573376aba2deced94c534bae05",
      "parents": [
        "c7e7796dec4b12e0009705eaa563ee85b7a27f08"
      ],
      "author": {
        "name": "David Crawshaw",
        "email": "david@zentus.com",
        "time": "Sat May 03 21:33:09 2025 +0000"
      },
      "committer": {
        "name": "David Crawshaw",
        "email": "david@zentus.com",
        "time": "Sat May 03 22:24:36 2025 +0000"
      },
      "message": "dockerimg: simplify pushdockerimg by requiring it run on linux\n\nReplace the complex Mac/Colima-based Docker build script with a simpler\nversion that works on vanilla Ubuntu. The new script:\n\n1. Provides setup instructions for Ubuntu environments\n2. Builds and pushes multi-architecture images in a single command\n3. Eliminates the need for multiple VMs/contexts\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nSigned-off-by: David Crawshaw \u003cdavid@zentus.com\u003e\n"
    },
    {
      "commit": "c7e7796dec4b12e0009705eaa563ee85b7a27f08",
      "tree": "40d6f7047740554f5ea776a611148e6444457ecf",
      "parents": [
        "ca535584da37312f2f826c2c6bb8fec81f22b4ef"
      ],
      "author": {
        "name": "David Crawshaw",
        "email": "david@zentus.com",
        "time": "Sat May 03 13:20:18 2025 -0700"
      },
      "committer": {
        "name": "David Crawshaw",
        "email": "david@zentus.com",
        "time": "Sat May 03 13:22:56 2025 -0700"
      },
      "message": "dockerimg: remove tmp-sketch-binary-linux\n\nThis is a remnant from when we tried to include the sketch\nbinary in the container image we built. Instead of doing\nthat, we `docker cp` the sketch binary into the container\nevery time we run it. (This is to make sure that sketch is\nalways fresh when we are developing it, and do not find\nourselves stuck on the docker image cache.)\n\nBecause of the docker cp step, there is no longer any\nneed to give the binary a funny name and include it in the\ndirectory we build the container from. So stop doing that.\n\nA bonus is that sketch will stop accidentally adding it\nto commits.\n\nFixes #39\n"
    },
    {
      "commit": "ca535584da37312f2f826c2c6bb8fec81f22b4ef",
      "tree": "8a84914e564e7a8edf0eb2aeaba9b2b93838d971",
      "parents": [
        "99231ba279ce3ebf5cb87494c3cde1f6e27257fc"
      ],
      "author": {
        "name": "David Crawshaw",
        "email": "david@zentus.com",
        "time": "Sat May 03 13:04:34 2025 -0700"
      },
      "committer": {
        "name": "David Crawshaw",
        "email": "david@zentus.com",
        "time": "Sat May 03 13:06:55 2025 -0700"
      },
      "message": "dockerimg: set http.postBuffer for git inside container\n\nWe sometimes see failures with git push from the innie to the outie.\nIt appears to be when there is a big binary in the commit\n(which is usually because of a different bug).\nThe internet suggests the HTTP POST limit in the git client\nmay be an issue (1MB in the git version in debian bookworm),\nso let\u0027s bump it up.\n"
    },
    {
      "commit": "99231ba279ce3ebf5cb87494c3cde1f6e27257fc",
      "tree": "c3ec8e1e62e772d3c51d86769476586328ab402c",
      "parents": [
        "ab50e9b5718ccc211266b95587634f688425b745"
      ],
      "author": {
        "name": "David Crawshaw",
        "email": "david@zentus.com",
        "time": "Sat May 03 10:48:26 2025 -0700"
      },
      "committer": {
        "name": "David Crawshaw",
        "email": "david@zentus.com",
        "time": "Sat May 03 10:48:28 2025 -0700"
      },
      "message": "dockerimg: be more robust to http connection errors\n\nE.g. on linux you can see \"read: connection reset by peer\" when\nthe server is in startup.\n"
    },
    {
      "commit": "ab50e9b5718ccc211266b95587634f688425b745",
      "tree": "6d6a24b34c57e7de2b9da7b686f1c792f1e0534c",
      "parents": [
        "16fa8b48f6c9f54f579bbc5bb22223443422f2e1"
      ],
      "author": {
        "name": "David Crawshaw",
        "email": "david@zentus.com",
        "time": "Sat May 03 10:26:42 2025 -0700"
      },
      "committer": {
        "name": "David Crawshaw",
        "email": "david@zentus.com",
        "time": "Sat May 03 10:26:43 2025 -0700"
      },
      "message": "cmd/sketch: remove colima check\n\nOrbstack works too.\n"
    },
    {
      "commit": "16fa8b48f6c9f54f579bbc5bb22223443422f2e1",
      "tree": "8ac9a487881b49baa423465c19fc1be72534aa78",
      "parents": [
        "66439b0d8001d4685270681804900e81a5e68c6d"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Fri May 02 04:28:16 2025 +0000"
      },
      "committer": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Fri May 02 20:32:06 2025 -0700"
      },
      "message": "Overhaul UI with chat-like interface\n\nMajor UI improvements:\n- Revamp timeline messages with chat-like interface\n  - User messages now on right with white text on blue background\n  - Agent/tool messages on left with black text on grey background\n  - Chat bubbles extend up to 80% of screen width\n  - Maintain left-aligned text for code readability\n  - Move metadata to outer gutters\n  - Show turn duration for end-of-turn messages\n  - Integrate tool calls within agent message bubbles\n  - Add thinking indicator with animated dots when LLM is processing\n  - Replace buttons with intuitive icons (copy, info, etc.)\n\n- Improve tool call presentation\n  - Simplify to single row design with all essential info\n  - Add clear status indicators for success/pending/error\n  - Fix horizontal scrolling for long commands and outputs\n  - Prevent tool name truncation\n  - Improve spacing and alignment throughout\n\n- Enhance header and status displays\n  - Move Last Commit to dedicated third column in header grid\n  - Add proper labeling with two-row structure\n  - Provide consistent styling across all status elements\n\n- Other UI refinements\n  - Add root URL redirection to demo page\n  - Fix spacing throughout the interface\n  - Optimize CSS for better performance\n  - Ensure consistent styling across components\n  - Improve command output display and wrapping\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\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": "11c97f29a0bfd8fbdffafb8ea32c2759ea32325f",
      "tree": "35357491158589f82d702c025b2c6df0ee17bf15",
      "parents": [
        "e114af53e743edc45f0111ce80f977f9a46401d9"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Fri May 02 16:36:46 2025 -0700"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Fri May 02 16:49:03 2025 -0700"
      },
      "message": "browser: don\u0027t open empty URLs\n\nThis happens with -skabandaddr\u003d\u0027\u0027.\n"
    },
    {
      "commit": "e114af53e743edc45f0111ce80f977f9a46401d9",
      "tree": "926ad7a1649ed3aa863c0ddc2ec949df207ee33e",
      "parents": [
        "2d4c48f10948cf07634dc743c3af30806f59bdd2"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Fri May 02 16:44:12 2025 -0700"
      },
      "committer": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Fri May 02 16:44:53 2025 -0700"
      },
      "message": "Minor update to CONTRIBUTING.md\n"
    },
    {
      "commit": "2d4c48f10948cf07634dc743c3af30806f59bdd2",
      "tree": "91372ee95d0a81d6d1a9545fc7e190f708d921af",
      "parents": [
        "88a6efc5c37b09fafafdef69466d81540e33d9b5"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Fri May 02 23:35:03 2025 +0000"
      },
      "committer": {
        "name": "Autoformatter",
        "email": "bot@sketch.dev",
        "time": "Fri May 02 23:37:16 2025 +0000"
      },
      "message": "Remove Charts tab and related Vega components from Sketch\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\n\n- Removed Charts tab from navigation\n- Removed sketch-charts component and vega-embed component\n- Removed vega, vega-lite, and vega-embed dependencies from package.json\n- Removed all associated code and UI elements\n"
    },
    {
      "commit": "88a6efc5c37b09fafafdef69466d81540e33d9b5",
      "tree": "a8b774741dd7a0af23479a4b0dc2062e5279e2f0",
      "parents": [
        "485afc6975b853aa670b5087c323fa3df3df0672"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Fri May 02 16:01:44 2025 -0700"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Fri May 02 16:01:44 2025 -0700"
      },
      "message": "ant: delete\n\nSomehow I managed to miss this in 4f84ab729ddbf428b0e891940f08f70b4edee05c."
    },
    {
      "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": "6234a8d9d229904994f49a5edacca05e54b26d1f",
      "tree": "02465eaa4a3162b25ab4f952f782f92b2c5d9222",
      "parents": [
        "25f6ff1b44e739e64d8b86cc4ea11bf8c631265c"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Fri May 02 14:31:20 2025 -0700"
      },
      "committer": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Fri May 02 14:35:31 2025 -0700"
      },
      "message": "Sketch inception wiring: make it easier to run unsafe sketch inside Sketch\n\nBy renaming the api key env variable, you can run \"sketch -unsafe\"\nboth with and without skaband without removing /.dockerenv and\nre-writing env variables. Previously this was painful. We\u0027re using\n\"--outside-hostname\" to indicate the fact that we\u0027re an \"inside sketch\".\n"
    },
    {
      "commit": "25f6ff1b44e739e64d8b86cc4ea11bf8c631265c",
      "tree": "2255018ca38ba211e57eb9e76e87b82d61a0c826",
      "parents": [
        "d01d1341abf9b2e62f0b4cc821277dc4c40c6225"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Fri May 02 04:24:10 2025 +0000"
      },
      "committer": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Fri May 02 14:25:31 2025 -0700"
      },
      "message": "Implement Server-Sent Events (SSE) for Real-time Agent Communication\n\n- Add server-side SSE endpoint (/stream?from\u003dN) for streaming state updates and messages\n- Replace polling with SSE in frontend for real-time updates with significant performance improvements\n- Implement efficient connection handling with backoff strategy for reconnections\n- Add visual network status indicator in UI to show connection state\n- Use non-blocking goroutine with channel pattern to handle SSE message delivery\n- Ensure proper message sequencing and state synchronization between client and server\n- Fix test suite to accommodate the new streaming architecture\n- Update mocks to use conversation.Budget instead of ant.Budget\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\n"
    },
    {
      "commit": "d01d1341abf9b2e62f0b4cc821277dc4c40c6225",
      "tree": "915117881cab1f87dd6a44a7d697d86e3af46d74",
      "parents": [
        "3e213085e04f5ddfc07933ce07826ba38ab0ddad"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Fri May 02 13:53:36 2025 -0700"
      },
      "committer": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Fri May 02 14:01:03 2025 -0700"
      },
      "message": "Default to CI\u003d1 for \"npm test\"\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"
    },
    {
      "commit": "44f9b4cec11e269a52fbfc099989ab425b8e125f",
      "tree": "ba09fbf38260b04067a7715e23083fb4a8bf733f",
      "parents": [
        "1c81423e72f7a4abb53fb6ae014ee6987a9f89d1"
      ],
      "author": {
        "name": "Autoformatter",
        "email": "bot@sketch.dev",
        "time": "Fri May 02 18:58:20 2025 +0000"
      },
      "committer": {
        "name": "Autoformatter",
        "email": "bot@sketch.dev",
        "time": "Fri May 02 18:58:20 2025 +0000"
      },
      "message": "all: fix formatting\n"
    },
    {
      "commit": "1c81423e72f7a4abb53fb6ae014ee6987a9f89d1",
      "tree": "feac6c0e442d2ad5d1f89b6533e470d6579eb628",
      "parents": [
        "dc372f3f962771b1e30212847371db837d758c2e"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Fri May 02 18:34:27 2025 +0000"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Fri May 02 11:54:04 2025 -0700"
      },
      "message": "webui: add average dollars per hour to Dollar Usage Over Time chart\n\nAdd calculation and display of average dollars per hour rate to the\nDollar Usage Over Time chart in the web UI.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e"
    },
    {
      "commit": "dc372f3f962771b1e30212847371db837d758c2e",
      "tree": "a7c98e40b6fcbb5d3aa8fed99f2363eea6182f78",
      "parents": [
        "6c2bb84114e1387e8751d6d2db33bcfc89f2dde5"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Fri May 02 18:35:48 2025 +0000"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Fri May 02 11:53:13 2025 -0700"
      },
      "message": "loop: the end of a subconvo is not an End of Turn\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e"
    },
    {
      "commit": "6c2bb84114e1387e8751d6d2db33bcfc89f2dde5",
      "tree": "c04895af3c7717c3c2d8cffd37dc09eb5e09a476",
      "parents": [
        "21cbc4502295d17bdd31f8083ac11841ce498265"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Fri May 02 18:37:20 2025 +0000"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Fri May 02 11:49:50 2025 -0700"
      },
      "message": "webui: add Escape key handler to dismiss empty line comments\n\nDismiss the line comment input box when the Escape key is pressed\nand the text input is empty.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e"
    },
    {
      "commit": "21cbc4502295d17bdd31f8083ac11841ce498265",
      "tree": "a9708c640843a22be50ec8bccbe463e764f8748b",
      "parents": [
        "d72563ac30bab6471121f561f3bb41991a3c91d1"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Fri May 02 10:54:54 2025 -0700"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Fri May 02 10:54:54 2025 -0700"
      },
      "message": "ant: add missing sleep during backoff (oops!)"
    },
    {
      "commit": "d72563ac30bab6471121f561f3bb41991a3c91d1",
      "tree": "617927db29a9c42f886a4a02557494d4cf47541b",
      "parents": [
        "c8e4ab08aeb36ac34133c627b352ac9352142960"
      ],
      "author": {
        "name": "Sean McCullough",
        "email": "banksean@gmail.com",
        "time": "Fri May 02 09:37:15 2025 -0700"
      },
      "committer": {
        "name": "Sean McCullough",
        "email": "banksean@gmail.com",
        "time": "Fri May 02 09:37:15 2025 -0700"
      },
      "message": "cmd/main: don\u0027t send slogs to stdout, ever\n"
    },
    {
      "commit": "c8e4ab08aeb36ac34133c627b352ac9352142960",
      "tree": "6f503aee50eec0f14f179f37169a531f3dde36b8",
      "parents": [
        "fa67fe5ec3ac9ad434054035285d4d53f9211d7f"
      ],
      "author": {
        "name": "Sean McCullough",
        "email": "banksean@gmail.com",
        "time": "Fri May 02 16:11:37 2025 +0000"
      },
      "committer": {
        "name": "Sean McCullough",
        "email": "banksean@gmail.com",
        "time": "Fri May 02 09:17:29 2025 -0700"
      },
      "message": "Restructure main.go to separate host and container code\n\nThis commit reorganizes the cmd/sketch/main.go file to clearly separate the\nexecution paths for host and container environments. The changes include:\n\n1. Created dedicated functions for each execution path:\n   - runInHostMode: Handles execution on the host, launching container\n   - runInContainerMode: Handles execution inside the container\n   - runInUnsafeMode: Handles execution directly on host without container\n   - setupAndRunAgent: Common setup code for container and unsafe modes\n\n2. Added clear function names and comments to indicate where code runs\n3. Maintained existing functionality while making control flow explicit\n4. Preserved all command-line flags and their handling\n5. Kept the same behavior for all execution paths\n6. Moved CLI flag parsing into a dedicated function\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\n"
    },
    {
      "commit": "fa67fe5ec3ac9ad434054035285d4d53f9211d7f",
      "tree": "5b7e5c85d71e5927a580213ca11398973e544e13",
      "parents": [
        "a352ca65720f937cdc733414bce393d22f9a787c"
      ],
      "author": {
        "name": "David Crawshaw",
        "email": "david@zentus.com",
        "time": "Thu May 01 20:42:08 2025 +0000"
      },
      "committer": {
        "name": "David Crawshaw",
        "email": "david@zentus.com",
        "time": "Fri May 02 09:08:37 2025 -0700"
      },
      "message": "dockerimg: remove buildx dependencies from Dockerfile\n\nMain changes:\n1. Removed --mount\u003dtype\u003dcache for apt-get operations and added cleanup steps\n2. Removed --mount\u003dtype\u003dcache for Go tools installation\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\n"
    },
    {
      "commit": "a352ca65720f937cdc733414bce393d22f9a787c",
      "tree": "8a67740ce6713463bd768610853ce8c2ed46fc09",
      "parents": [
        "4e14f6ce01fe783d47df4fa3326273b328a96656"
      ],
      "author": {
        "name": "David Crawshaw",
        "email": "david@zentus.com",
        "time": "Fri May 02 09:04:32 2025 -0700"
      },
      "committer": {
        "name": "David Crawshaw",
        "email": "david@zentus.com",
        "time": "Fri May 02 09:04:32 2025 -0700"
      },
      "message": ".clabot: remove recheck comment, doesn\u0027t seem to work\n"
    },
    {
      "commit": "4e14f6ce01fe783d47df4fa3326273b328a96656",
      "tree": "bdd5060bfa84812c64b66f02a62404117d928593",
      "parents": [
        "b5cb954c45aac1494c1e660a08edd3cc3e3066ce"
      ],
      "author": {
        "name": "David Crawshaw",
        "email": "david@zentus.com",
        "time": "Fri May 02 09:01:18 2025 -0700"
      },
      "committer": {
        "name": "David Crawshaw",
        "email": "david@zentus.com",
        "time": "Fri May 02 09:01:25 2025 -0700"
      },
      "message": ".clabot: fix json, explicit recheck comment\n"
    },
    {
      "commit": "b5cb954c45aac1494c1e660a08edd3cc3e3066ce",
      "tree": "6b52051573a523749ac76d1d4c8c2ade73dc9d01",
      "parents": [
        "6e7fe9b071669b6687b6e55efe781e392ee12e8c"
      ],
      "author": {
        "name": "M-A",
        "email": "maruel@gmail.com",
        "time": "Fri May 02 11:32:34 2025 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri May 02 08:32:34 2025 -0700"
      },
      "message": "readme: add pkg.go.dev badge (#46)\n\nSince the go.mod uses a custom URL, it\u0027s easier to provide the badge for\nnew users to direct to the right URL."
    },
    {
      "commit": "6e7fe9b071669b6687b6e55efe781e392ee12e8c",
      "tree": "e7007a9d46da8410a40622be513be9cda3c98460",
      "parents": [
        "2e3290c322e1e40f65e25a320031d576f87d1fd7"
      ],
      "author": {
        "name": "David Crawshaw",
        "email": "david@zentus.com",
        "time": "Fri May 02 08:21:08 2025 -0700"
      },
      "committer": {
        "name": "David Crawshaw",
        "email": "david@zentus.com",
        "time": "Fri May 02 08:21:08 2025 -0700"
      },
      "message": ".clabot: add crawshaw\n"
    },
    {
      "commit": "2e3290c322e1e40f65e25a320031d576f87d1fd7",
      "tree": "430706db96084154df22e97e931f4f2f11648c9b",
      "parents": [
        "78f6c40f1e134b9ac38a675b6dc0f5155ad495e9"
      ],
      "author": {
        "name": "David Crawshaw",
        "email": "david@zentus.com",
        "time": "Fri May 02 07:58:16 2025 -0700"
      },
      "committer": {
        "name": "David Crawshaw",
        "email": "david@zentus.com",
        "time": "Fri May 02 07:58:41 2025 -0700"
      },
      "message": ".clabot: add\n"
    },
    {
      "commit": "78f6c40f1e134b9ac38a675b6dc0f5155ad495e9",
      "tree": "5fd7caba94b012f029a2b04668a05c7d3d5a83a8",
      "parents": [
        "2fde465a8a7099e3e121ecc552d6420d8c4636cb"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Thu May 01 21:20:40 2025 -0700"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Thu May 01 21:20:40 2025 -0700"
      },
      "message": "termui: add remote to fetch\n\nQuick hotfix thanks to Phil.\n"
    },
    {
      "commit": "2fde465a8a7099e3e121ecc552d6420d8c4636cb",
      "tree": "35ef77eef0818029ec53abd91b5f6bbcc2547d43",
      "parents": [
        "2bdc95355f3ace09daab7c5a3413ee64e4fd979d"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Thu May 01 17:50:34 2025 -0700"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Thu May 01 17:51:19 2025 -0700"
      },
      "message": "claudetool: redact initial commit hash in test fixtures\n\nThis was causing failures when switching between Go versions,\nbecause the go version ends up in the go.mod, which changes\nthe git hash.\n"
    },
    {
      "commit": "2bdc95355f3ace09daab7c5a3413ee64e4fd979d",
      "tree": "563da155a41ff97f8a40209e8101f62dcc253ce8",
      "parents": [
        "495cb96343f76189ab7e484234d6dc1a3b5a787c"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Thu May 01 23:19:21 2025 +0000"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Thu May 01 17:51:19 2025 -0700"
      },
      "message": "termui: add git fetch --prune before calculating cherry-pick refs\n\nThis change adds a best-effort git fetch --prune before resolving git refs\nin the getGitRefName function. This ensures that the cherry-pick command\ndisplayed to the user at the end of a session uses up-to-date refs rather\nthan potentially stale ones.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e"
    },
    {
      "commit": "495cb96343f76189ab7e484234d6dc1a3b5a787c",
      "tree": "c5e2ac64da4c2aa7247cf17c9d78ba39105c75d9",
      "parents": [
        "4d5e9978fce2feb262663b9d0455c06546723ddc"
      ],
      "author": {
        "name": "Sean McCullough",
        "email": "banksean@gmail.com",
        "time": "Thu May 01 16:25:53 2025 -0700"
      },
      "committer": {
        "name": "Sean McCullough",
        "email": "banksean@gmail.com",
        "time": "Thu May 01 16:27:44 2025 -0700"
      },
      "message": "sketch-app-shell: fetch \"cancel\" not \"/cancel\"\n\nFixes https://github.com/boldsoftware/sketch/issues/22\n"
    },
    {
      "commit": "4d5e9978fce2feb262663b9d0455c06546723ddc",
      "tree": "dfa4824a78b33a01c5c0d72d4077cfec78010a62",
      "parents": [
        "2772f63c725cdc47f644f68a9e684e798e54b543"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Thu May 01 15:56:37 2025 -0700"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Thu May 01 16:09:09 2025 -0700"
      },
      "message": "all: make tests accept OUTER_SKETCH_ANTHROPIC_API_KEY\n\nInner sketch already has an ANTHROPIC_API_KEY...but it is the\nsketch anthropic key, not the anthropic anthropic key. Blarg!\n\n"
    },
    {
      "commit": "2772f63c725cdc47f644f68a9e684e798e54b543",
      "tree": "de19240644faff057235a90933c8ace9e71c72cf",
      "parents": [
        "e2c7f722803ef4d483a21859e8fc6329645851e0"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Thu May 01 21:42:35 2025 +0000"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Thu May 01 16:09:09 2025 -0700"
      },
      "message": "dockerimg: add support for passing env vars to Docker via git config\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e"
    },
    {
      "commit": "e2c7f722803ef4d483a21859e8fc6329645851e0",
      "tree": "95a3f6831f4adacfc4a280e2699dac01d9a1dcab",
      "parents": [
        "a3dcd86d1c05e95ee9c058a43262458a92160898"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Thu May 01 21:58:41 2025 +0000"
      },
      "committer": {
        "name": "Autoformatter",
        "email": "bot@sketch.dev",
        "time": "Thu May 01 22:04:35 2025 +0000"
      },
      "message": "webui: make input box focus on page load\n\nAdd a window.load event listener in the firstUpdated lifecycle method to ensure\nthe chat input gets focused when the page loads completely.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\n"
    },
    {
      "commit": "a3dcd86d1c05e95ee9c058a43262458a92160898",
      "tree": "86a49759e93940a80c940703a0d03a7084a90dd1",
      "parents": [
        "8da3d456505ec29a27d73720731a929cfab46b3f"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed Apr 30 19:47:16 2025 +0000"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Thu May 01 12:39:18 2025 -0700"
      },
      "message": "ant: improve encapsulation\n\n- Replace string literals with package constants for message roles and content types.\n- Create UserStringMessage helper function to simplify user message creation\n- Replace manual Content creation with ant.StringContent()\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\n"
    },
    {
      "commit": "8da3d456505ec29a27d73720731a929cfab46b3f",
      "tree": "f8525ee72a97bf67f8b8fd1fb917f3861c553ebc",
      "parents": [
        "9373c07a6d2fc97c2fad41e8228a7f2e8bc10ccb"
      ],
      "author": {
        "name": "Sean McCullough",
        "email": "banksean@gmail.com",
        "time": "Thu May 01 12:28:57 2025 -0700"
      },
      "committer": {
        "name": "Sean McCullough",
        "email": "banksean@gmail.com",
        "time": "Thu May 01 12:28:57 2025 -0700"
      },
      "message": "readme: use non-expiring discord invite\n"
    },
    {
      "commit": "9373c07a6d2fc97c2fad41e8228a7f2e8bc10ccb",
      "tree": "f7485f9715aee87c185ba2113b2eab6c41b1398d",
      "parents": [
        "b7c5875548da5057eac0405bf4e0ae8bbc43667c"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Thu May 01 10:27:01 2025 -0700"
      },
      "committer": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Thu May 01 12:13:31 2025 -0700"
      },
      "message": "Update tests for agent\u0027s new iterator implementation\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\n\nThe commit 4eb6bb6c9ac switched from outbox channels to a subscriber model\nwith message iterators. This commit updates all existing tests to use the\nnew iterator implementation and adds new tests specifically for the iterator\nfunctionality.\n\n- Modified agent_test.go to use new iterator approach\n- Modified agent_git_test.go to check history array directly\n- Added new iterator_test.go to test iterator-specific functionality\n\nFix issues found by code review\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\n\n- Fix context leak by properly using cancel function\n- Modernize for loops using range over int\n- Use fmt.Appendf instead of []byte(fmt.Sprintf)\n\nOptimize slow tests to improve test execution time\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\n\nThis commit optimizes the test suite to reduce execution time:\n\n1. Reduces TestGitCommitTracking test time by using fewer git commits\n   (20 instead of 110) which cuts the test time by 77%.\n\n2. Improves iterator tests by using channels for synchronization instead\n   of time.Sleep, reducing TestIteratorWithNewMessages from 200ms to nearly 0ms.\n\n3. Reduces timeouts and sleeps in other iterator tests.\n\nTotal test execution time reduced by more than 60% (from 2.3s to 0.9s).\n"
    },
    {
      "commit": "b7c5875548da5057eac0405bf4e0ae8bbc43667c",
      "tree": "a0b9eb0f68de826d7b51a5e8f5eaa7976fb48de3",
      "parents": [
        "5228b5850d8453c225e5611918fcd00b747c65cc"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Thu May 01 10:10:17 2025 -0700"
      },
      "committer": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Thu May 01 12:13:31 2025 -0700"
      },
      "message": "agent plumbing: convert outbox to subscribers and an iterator\n\nWaitForMessage() could only work for one thread, because it was using a\nsingular channel for outboxes. This was fine when we only had one user,\nbut WaitForMessageCount() was kinda similar, and had its own thing, and\nI want to rework how polling works and need another user.\n\nAnyway, this one is hand-coded, because Sketch really struggled\nwith getting the iterator convincingly safe. In a follow-up commit,\nI\u0027ll try to get Sketch to write some tests.\n"
    },
    {
      "commit": "5228b5850d8453c225e5611918fcd00b747c65cc",
      "tree": "f51bd5eb893b7830987a8593ab42f76a812e9bd5",
      "parents": [
        "a1e0e49213c07f74618f0e0f324e707792858e0c"
      ],
      "author": {
        "name": "David Crawshaw",
        "email": "david@zentus.com",
        "time": "Thu May 01 11:18:12 2025 -0700"
      },
      "committer": {
        "name": "David Crawshaw",
        "email": "david@zentus.com",
        "time": "Thu May 01 12:02:42 2025 -0700"
      },
      "message": "dockerimg: add SKETCH\u003d1 to sketch container\n\nAlso remove some extra files debian.\n"
    },
    {
      "commit": "a1e0e49213c07f74618f0e0f324e707792858e0c",
      "tree": "9bddcd7afb99b196c6e7238be9bcbf509d2256ff",
      "parents": [
        "76ccdfd8bbbcd9aa2c069e5560f3b9e2284ee900"
      ],
      "author": {
        "name": "Sean McCullough",
        "email": "banksean@gmail.com",
        "time": "Thu May 01 10:51:08 2025 -0700"
      },
      "committer": {
        "name": "Sean McCullough",
        "email": "banksean@gmail.com",
        "time": "Thu May 01 10:51:08 2025 -0700"
      },
      "message": "loop/agent.go: don\u0027t panic on nil toolResp\n"
    },
    {
      "commit": "76ccdfd8bbbcd9aa2c069e5560f3b9e2284ee900",
      "tree": "2c4a7e2102aaa361aecb0fcccbbb5e2c78dbe6dd",
      "parents": [
        "453a62f584a738ab243ddae8dc0736a673aa3c08"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Thu May 01 17:14:18 2025 +0000"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Thu May 01 10:15:17 2025 -0700"
      },
      "message": "Add git fetch prune to improve Docker container initialization\n\nThis change modifies the agent initialization to run \u0027git fetch --prune sketch-host\u0027\ninstead of \u0027git fetch sketch-host\u0027 when running in Docker. This ensures that\nleftover remote branches from the sketch host are properly cleaned up.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\n"
    },
    {
      "commit": "453a62f584a738ab243ddae8dc0736a673aa3c08",
      "tree": "8aee39ca2bb66aea1ca9f7ffd36a1c6f0e39d7da",
      "parents": [
        "b1e81578a465535d081d42f314036d5accc43b28"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Thu May 01 10:14:33 2025 -0700"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Thu May 01 10:14:33 2025 -0700"
      },
      "message": "termui: fix output for keyword search terms\n"
    },
    {
      "commit": "b1e81578a465535d081d42f314036d5accc43b28",
      "tree": "3e6d7f3b6ea7366f1e73bcdd243a645298a005d4",
      "parents": [
        "a687c1b2da8f7b29fce5ab1929316e8d4c2550f9"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Thu May 01 00:53:27 2025 +0000"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Thu May 01 10:00:53 2025 -0700"
      },
      "message": "termui: use explicit coordination for clean shutdown\n\nExiting currently has race conditions, which sometimes swallow output.\nAdd explicit coordination.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\n"
    },
    {
      "commit": "a687c1b2da8f7b29fce5ab1929316e8d4c2550f9",
      "tree": "319ecc91ea84ba51020eca6f3fd1770d98ee55e2",
      "parents": [
        "6866c790c1f8f38e160eac01ff7be2cfaed1fc9e"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed Apr 30 20:59:29 2025 +0000"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Thu May 01 09:52:44 2025 -0700"
      },
      "message": "termui: check sketch-host remote when formatting cherry-pick command\n\nUpdate getGitRefName function to look for commit references in the\nsketch-host remote when local branch names are not available.\nThis makes the cherry-pick command display more user-friendly\nby using remote branch names when possible.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e"
    },
    {
      "commit": "6866c790c1f8f38e160eac01ff7be2cfaed1fc9e",
      "tree": "3d5a3b8e2665357c077a95b5bf8be3b280d839b8",
      "parents": [
        "c76a392d48f0070ccb011b04cbf25114671a8af4"
      ],
      "author": {
        "name": "Pokey Rule",
        "email": "755842+pokey@users.noreply.github.com",
        "time": "Thu May 01 15:27:35 2025 +0100"
      },
      "committer": {
        "name": "Pokey Rule",
        "email": "755842+pokey@users.noreply.github.com",
        "time": "Thu May 01 15:27:35 2025 +0100"
      },
      "message": "webui: Finish removing aria snapshot testing\n"
    },
    {
      "commit": "c76a392d48f0070ccb011b04cbf25114671a8af4",
      "tree": "f8efdf643ac4cb6eef2acfb0227127887e8903a7",
      "parents": [
        "bc4947e41d50b5e1a8089600808047715b828305"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Thu May 01 01:18:56 2025 +0000"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed Apr 30 18:25:41 2025 -0700"
      },
      "message": "dockerimg: restore sketch_context docker label\n\nThe sketch_context label was removed in commit 2a5bd6d (switch to debian base image)\nbut the code that reads this label in findOrBuildDockerImage was left intact.\n\nThis was causing Docker to always rebuild images since the label it was checking\nfor no longer existed in the Dockerfile template.\n\nRestore the label and updates the template.Execute call to pass the required\nInitFilesHash parameter.\n\nUpdates #43\n"
    },
    {
      "commit": "bc4947e41d50b5e1a8089600808047715b828305",
      "tree": "beef5beca05e5714a3c1f16822bf1b2f388c2436",
      "parents": [
        "d9d4581952edb59469a8402910783570be852fb8"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed Apr 30 18:23:11 2025 -0700"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed Apr 30 18:23:11 2025 -0700"
      },
      "message": "cmd/go2ts: fix typo\n\nIt is now an ex-🍁.\n"
    },
    {
      "commit": "d9d4581952edb59469a8402910783570be852fb8",
      "tree": "7b06cf74a10d3d812152c21fc72ced395a3e5024",
      "parents": [
        "48c84c9a4df29b1e51c7fdca81053dd9cd0c2446"
      ],
      "author": {
        "name": "Sean McCullough",
        "email": "banksean@gmail.com",
        "time": "Wed Apr 30 16:53:41 2025 -0700"
      },
      "committer": {
        "name": "Sean McCullough",
        "email": "banksean@gmail.com",
        "time": "Wed Apr 30 18:00:55 2025 -0700"
      },
      "message": "webui: add current Agent state to call-status tooltip\n"
    },
    {
      "commit": "48c84c9a4df29b1e51c7fdca81053dd9cd0c2446",
      "tree": "6d6a4700838bca627acb74e1e35bfd1051c2ab8e",
      "parents": [
        "936ba626345d9480698e7fced548224973b8a0a5"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed Apr 30 16:15:27 2025 -0700"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed Apr 30 17:19:01 2025 -0700"
      },
      "message": ".github/workflows: remove vibe-coded nonsense\n\nThis conditional is unnecessary.\nThe only way to reach this is if\nwe are fixing up the formatting,\nat which point pushing back the\nchanges are entirely reasonable.\n"
    },
    {
      "commit": "936ba626345d9480698e7fced548224973b8a0a5",
      "tree": "04364304baefa8903aa23a846bfe4149b3010ea8",
      "parents": [
        "88c61bdd046f257e849aebf2fbe3be7c9c6f06ef"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed Apr 30 20:53:21 2025 +0000"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed Apr 30 17:19:01 2025 -0700"
      },
      "message": ".github/workflows: thread formatted HEAD commit to test sub-actions\n\nThread the commit SHA from the formatting job to the test jobs in GitHub workflows.\nThis ensures that when auto-formatting runs in the queue-main and queue-dev workflows,\ntests run against the newly formatted code rather than the original code.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\n"
    },
    {
      "commit": "88c61bdd046f257e849aebf2fbe3be7c9c6f06ef",
      "tree": "49e9927a2973ce5d4f1bef2c8ae16b892a633eee",
      "parents": [
        "3e2111b1e18a39a4eba4a0afa0327b6a67acf802"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed Apr 30 13:40:34 2025 -0700"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed Apr 30 17:19:01 2025 -0700"
      },
      "message": ".github/workflows: fail if go generate creates a diff\n\nTODO: treat that as a formatting step, and auto-run?"
    },
    {
      "commit": "3e2111b1e18a39a4eba4a0afa0327b6a67acf802",
      "tree": "6add6c3a0583877f173f1f2baf6ceeb8c39b3f69",
      "parents": [
        "e54b00af5cf711c2171a26ed0f29a8ce83d50fb4"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed Apr 30 17:53:28 2025 +0000"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed Apr 30 17:13:18 2025 -0700"
      },
      "message": "all: support popping a browser from termui\n\n- Add \u0027browser\u0027, \u0027open\u0027, and \u0027b\u0027 command aliases to termui\n- Open the current conversation URL in default browser\n- Add help documentation for the new command\n\nAdd browser launch endpoint to Git server for Docker support.\n\nWe\u0027ll probably want to set up a proper mux for the no-longer-just-git\nserver pretty soon.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\n"
    },
    {
      "commit": "e54b00af5cf711c2171a26ed0f29a8ce83d50fb4",
      "tree": "e34f4ce054e3cbb8ae3dce09e4cc906977a86ec9",
      "parents": [
        "93bb66a204ba666fbef0e8590b9f210c267fe5f8"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed Apr 30 16:48:02 2025 -0700"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed Apr 30 17:13:09 2025 -0700"
      },
      "message": "browser: simplify API\n\nThe context is doing nothing here."
    },
    {
      "commit": "93bb66a204ba666fbef0e8590b9f210c267fe5f8",
      "tree": "b6da2ac70bfeaaed68c497420a5cc648a5453ad7",
      "parents": [
        "40ffb847b6f04e6e28db42e8dea5985d5636f4e5"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed Apr 30 16:29:05 2025 -0700"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed Apr 30 16:34:16 2025 -0700"
      },
      "message": ".github: don\u0027t run workflows on queue-dev-* either\n"
    },
    {
      "commit": "40ffb847b6f04e6e28db42e8dea5985d5636f4e5",
      "tree": "ea1d352b8c6d49146bce8edf2310251a4e5dd889",
      "parents": [
        "4c1015ae484d3561db076b12113ca442ec97d9c5"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed Apr 30 16:28:44 2025 -0700"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed Apr 30 16:34:16 2025 -0700"
      },
      "message": ".github: let my autoformatter muck with the quotes"
    },
    {
      "commit": "4c1015ae484d3561db076b12113ca442ec97d9c5",
      "tree": "40b555bdddec809d21350737be7d8a1d1839baf7",
      "parents": [
        "d33ee13991bc7d4c923f12df35032796b8400903"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed Apr 30 16:28:21 2025 -0700"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed Apr 30 16:34:16 2025 -0700"
      },
      "message": ".github: delete extraneous whitespace"
    },
    {
      "commit": "d33ee13991bc7d4c923f12df35032796b8400903",
      "tree": "3b96724eb5a284e995919ccb1f5fa3cef5073993",
      "parents": [
        "78707d6ea7bcd323719358dee3445130fa719037"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed Apr 30 16:26:10 2025 -0700"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed Apr 30 16:34:16 2025 -0700"
      },
      "message": "webui: tweak welcome screen wording\n\n(more tweaks welcome!)"
    },
    {
      "commit": "78707d6ea7bcd323719358dee3445130fa719037",
      "tree": "5d51a7c3c33e61d13b32dc7b4dca273c788079d8",
      "parents": [
        "96b60dd7e71c7db55dfe4cff86265eab02e54e9f"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed Apr 30 21:06:49 2025 +0000"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed Apr 30 16:21:05 2025 -0700"
      },
      "message": "browser: small new package\n\nMove browser opening functionality from dockerimg to a new browser package.\nUpdated all references to use browser.Open directly.\nThis avoids importing dockerimg widely.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e"
    },
    {
      "commit": "96b60dd7e71c7db55dfe4cff86265eab02e54e9f",
      "tree": "3ee9ddbbe4b260b7000f194e369b527ce658cd66",
      "parents": [
        "bce3a13a7c16ffdb602b66550e6b3479d34fb9b0"
      ],
      "author": {
        "name": "Sean McCullough",
        "email": "banksean@gmail.com",
        "time": "Wed Apr 30 09:49:10 2025 -0700"
      },
      "committer": {
        "name": "Sean McCullough",
        "email": "banksean@gmail.com",
        "time": "Wed Apr 30 15:20:35 2025 -0700"
      },
      "message": "Add StateMachine tracking to Agent control flow\n\nThis commit integrates the existing StateMachine type with the Agent\nto provide state tracking and validation throughout the conversation\ncontrol flow. This allows for better monitoring and debugging of the\nAgent\u0027s behavior during execution.\n\nThis commit adds tests to verify the correct behavior of the state\nmachine integration with the Agent type:\n\n1. A test for basic state transitions\n2. A test for a complete processTurn flow with a simple response\n3. A test for a processTurn flow with tool use\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\n"
    },
    {
      "commit": "bce3a13a7c16ffdb602b66550e6b3479d34fb9b0",
      "tree": "b83cf1209a5add2b71bc8b5a58d389bed460dd24",
      "parents": [
        "2a5bd6d3e22db146385bea9902e9dd9bc982377d"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Wed Apr 30 22:03:39 2025 +0000"
      },
      "committer": {
        "name": "Autoformatter",
        "email": "bot@sketch.dev",
        "time": "Wed Apr 30 22:10:21 2025 +0000"
      },
      "message": "Modernize and streamline Sketch top bar UI\n\nComprehensive improvements to the top bar interface:\n\nRemoved Elements:\n- Poll checkbox and all polling UI controls\n- Network status indicator and all status messages\n- Dotted underlines from tooltip elements\n\nButton Improvements:\n- Added SVG icons to Restart and Stop buttons\n- Made buttons responsive (text hides below 1400px)\n- Stop button now disabled when no active calls\n\nLayout Simplification:\n- Simplified hostname display (outside hostname only)\n- Simplified working directory display (outside directory only)\n- Repositioned tab chooser for better layout\n- Improved responsive behavior across viewport sizes\n\nEnhanced Features:\n- Added GitHub repo auto-detection with clickable links\n- Improved VSCode integration with button styling\n- Changed \u0027SSH Connection\u0027 to \u0027Connect to Container\u0027\n- Enhanced tooltips with more descriptive text\n\nThe UI is now cleaner, more responsive, and provides a better user experience\nacross different screen sizes.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\n"
    },
    {
      "commit": "2a5bd6d3e22db146385bea9902e9dd9bc982377d",
      "tree": "0d51ce5180913d1fc9d0acba122aed1894c546b7",
      "parents": [
        "320113391429ba3531aa772e4e32ba41998afbaa"
      ],
      "author": {
        "name": "David Crawshaw",
        "email": "david@zentus.com",
        "time": "Wed Apr 30 14:29:46 2025 -0700"
      },
      "committer": {
        "name": "David Crawshaw",
        "email": "david@zentus.com",
        "time": "Wed Apr 30 15:05:04 2025 -0700"
      },
      "message": "dockerimg: switch to a debian base image\n\nDeveloping on a musl-based alpine image seems to suck.\nA lot of python stuff doesn\u0027t work.\nEven when told it\u0027s alpine, LLMs still want to apt-get install things.\n\nAlong with switching to debian, simplify everything.\nWe *always* use debian bookwork now. If there are python\nthings, the LLM needs to install them on top of the model.\nThis will make fallback mode easier: if a build fails, then we\ndrop ExtraCmds and try again. (Future work.)\n\nWhile here: avoid using docker buildx in tests because\nit seems to vary a lot version-to-version.\n"
    },
    {
      "commit": "320113391429ba3531aa772e4e32ba41998afbaa",
      "tree": "169a0fe052fec20295a2e6ea51fed967ac205531",
      "parents": [
        "efda3961932b3c8d8fb169d9e043bc68c3dd1845"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Wed Apr 30 20:59:40 2025 +0000"
      },
      "committer": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Wed Apr 30 14:05:19 2025 -0700"
      },
      "message": "Amend notification logic to only show for end-of-turn messages without parent_conversation_id\n\nThis change modifies the notification logic to only show notifications when:\n1. The message has end_of_turn \u003d true (which was already being checked)\n2. The message does not have a parent_conversation_id (new condition)\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\n"
    },
    {
      "commit": "efda3961932b3c8d8fb169d9e043bc68c3dd1845",
      "tree": "2e5b037faaca7470ceca85d23219263045667bcd",
      "parents": [
        "db5e9b482194a801524a99af9fee06911147ff26"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed Apr 30 13:09:42 2025 -0700"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed Apr 30 13:21:23 2025 -0700"
      },
      "message": ".github/workflows: add a dev queue for GitHub Actions hacking\n"
    },
    {
      "commit": "db5e9b482194a801524a99af9fee06911147ff26",
      "tree": "af8fa1a7783a404d8c14e347c8fbf8abd02e0e80",
      "parents": [
        "2c4db099e6763cf18f0c57876298b9f5c70ed925"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Wed Apr 30 19:58:13 2025 +0000"
      },
      "committer": {
        "name": "Autoformatter",
        "email": "bot@sketch.dev",
        "time": "Wed Apr 30 20:16:43 2025 +0000"
      },
      "message": "Implement notifications feature with toggle and focus handling\n\n- Change notifications to be disabled by default\n- Replace checkbox with bell icon (with cross when disabled)\n- Add window focus detection to only send notifications when window is not focused\n- Update notification toggle to handle clicks directly\n- Ensure notifications are only sent based on configuration and window focus state\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\n"
    },
    {
      "commit": "2c4db099e6763cf18f0c57876298b9f5c70ed925",
      "tree": "ae4408992dd74fa0b5392523d2e6713e388326e7",
      "parents": [
        "b74b526b579320c08ad85cc8b4bdd719c9d6d7c8"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Mon Apr 28 16:57:50 2025 -0700"
      },
      "committer": {
        "name": "Autoformatter",
        "email": "bot@sketch.dev",
        "time": "Wed Apr 30 19:59:45 2025 +0000"
      },
      "message": "Restart conversation support.\n\nThe idea here is to let the user restart the conversation, possibly with\na better prompt. This is a common manual workflow, and I\u0027d like to make\nit easier.\n\nI hand wrote the agent.go stuff, but Sketch wrote the rest.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\n"
    },
    {
      "commit": "b74b526b579320c08ad85cc8b4bdd719c9d6d7c8",
      "tree": "e3aebac4b65ecd8cfd4fe7e6298bfb451bf5cf90",
      "parents": [
        "104897387b99f047d011c74050a6da59b7f80982"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed Apr 30 12:53:46 2025 -0700"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed Apr 30 12:53:46 2025 -0700"
      },
      "message": ".github/workflows: further parameterize\n\nIf anyone else wants to re-use this code, this\u0027ll make it easier\nto copy/paste."
    },
    {
      "commit": "104897387b99f047d011c74050a6da59b7f80982",
      "tree": "dd6250079a048d7a8e85a2a0d27e11495d307551",
      "parents": [
        "9f4b8089f93f39300b819ccf83cf64a7a867c0dc"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed Apr 30 12:49:10 2025 -0700"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed Apr 30 12:49:10 2025 -0700"
      },
      "message": ".github/workflows: delete unnecessary \u0027git config\u0027 calls\n\nNo git commits happening here."
    },
    {
      "commit": "9f4b8089f93f39300b819ccf83cf64a7a867c0dc",
      "tree": "c1f00c2b00892efd2656196ebbc37c433d138658",
      "parents": [
        "bc6b629676e97d1789cff9a1d945b5faf680372e"
      ],
      "author": {
        "name": "Sean McCullough",
        "email": "banksean@gmail.com",
        "time": "Wed Apr 30 17:34:07 2025 +0000"
      },
      "committer": {
        "name": "Sean McCullough",
        "email": "banksean@gmail.com",
        "time": "Wed Apr 30 11:28:34 2025 -0700"
      },
      "message": "agent.go: don\u0027t panic on nil initialResp\n\na.processUserMessage(ctx) appears to return nil, nil under\ncertain circumstances, and this causes a panic in processTurn().\n\nThis change makes it log the error instead of panicing.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\n"
    },
    {
      "commit": "bc6b629676e97d1789cff9a1d945b5faf680372e",
      "tree": "fd18173bc59f5aae31ee53fae1681e6e8c3c1470",
      "parents": [
        "f830c9d8e7cbe4cbf8146f9e2f1c5fcb57292865"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Wed Apr 30 18:00:15 2025 +0000"
      },
      "committer": {
        "name": "Autoformatter",
        "email": "bot@sketch.dev",
        "time": "Wed Apr 30 18:24:23 2025 +0000"
      },
      "message": "Add browser notifications for agent messages with EndOfTurn\u003dtrue\n\nWhen a message with EndOfTurn\u003dtrue is received, show a system notification using the browser Notifications API. Include the sketch title and beginning of the message content in the notification. Added a toggle for users to enable/disable notifications.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\n"
    },
    {
      "commit": "f830c9d8e7cbe4cbf8146f9e2f1c5fcb57292865",
      "tree": "86aa808f441f06ead73786aa15019a518e13eb07",
      "parents": [
        "85068949181b59b1c5617cb9de353511e3f5fab1"
      ],
      "author": {
        "name": "Autoformatter",
        "email": "bot@sketch.dev",
        "time": "Wed Apr 30 18:16:01 2025 +0000"
      },
      "committer": {
        "name": "Autoformatter",
        "email": "bot@sketch.dev",
        "time": "Wed Apr 30 18:16:01 2025 +0000"
      },
      "message": "all: fix formatting\n"
    },
    {
      "commit": "85068949181b59b1c5617cb9de353511e3f5fab1",
      "tree": "5628365152b718f81759ad711bcfc74d39442723",
      "parents": [
        "e81233fa9bfbacf6756c00105eae08f6f0e36656"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed Apr 30 10:51:27 2025 -0700"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed Apr 30 11:13:16 2025 -0700"
      },
      "message": "termui: add a line to the help menu telling the user to chat"
    },
    {
      "commit": "e81233fa9bfbacf6756c00105eae08f6f0e36656",
      "tree": "292e17f26f8110df08b131ec43f287ea6ed8c8c6",
      "parents": [
        "250348ec3c8bcba21caa62fd4ae53e4d9476fafa"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed Apr 30 04:05:41 2025 +0000"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed Apr 30 11:13:16 2025 -0700"
      },
      "message": "Add gentle pulsing animation to activity notification icons\n\n- Added CSS keyframes animation for a subtle pulsing effect\n- Applied the animation to both LLM (thinking) and tool call indicators when active\n- The animation scales the icons slightly and adjusts opacity to create a gentle pulse\n- Makes it clearer that these are activity notifications\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\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": "eb5166a5043946ad6782cb64af987d23a32e3203",
      "tree": "cd4b20e220c211f845545e33ccd03739c7331d71",
      "parents": [
        "3cae7d97036513e4743083da7bb232a2aa566e82"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed Apr 30 17:04:20 2025 +0000"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed Apr 30 11:13:16 2025 -0700"
      },
      "message": "Shrink title text to reduce truncation in header\n\nReduces the chat title font size from 16px to 14px to help it fit better\nin the top left corner of the UI without getting cut off.\n\nAlso increases the title container max-width from 25% to 30% to provide\nmore space for longer titles.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\n"
    }
  ],
  "next": "3cae7d97036513e4743083da7bb232a2aa566e82"
}
