)]}'
{
  "log": [
    {
      "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"
    },
    {
      "commit": "3cae7d97036513e4743083da7bb232a2aa566e82",
      "tree": "bd75e33df4f46fc4ea8f59a03268904dd178d1fb",
      "parents": [
        "e634d266ace9afe0f8485c13ed0aae6bcfc0a8f8"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed Apr 30 09:54:29 2025 -0700"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed Apr 30 11:13:16 2025 -0700"
      },
      "message": "cmd/sketch: make -open default to true"
    },
    {
      "commit": "e634d266ace9afe0f8485c13ed0aae6bcfc0a8f8",
      "tree": "b2b8d92b5365c13e5cb0abbeb14c85d8b1a9e992",
      "parents": [
        "42f7a7c93682a4ed04c62688e1475cd6ebc04de5"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed Apr 30 09:52:24 2025 -0700"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed Apr 30 11:13:16 2025 -0700"
      },
      "message": "webui: add go2ts go:generate line\n\nThis way I\u0027m way more likely to actually run it.\nAnd I think it means CI will check it too.\n"
    },
    {
      "commit": "42f7a7c93682a4ed04c62688e1475cd6ebc04de5",
      "tree": "e2c65947daa4012b98c6a884149c393332fd2f0c",
      "parents": [
        "23b6a2d690a4e208ec21604a5dd6a59bd1129ab5"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed Apr 30 10:29:21 2025 -0700"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed Apr 30 11:13:16 2025 -0700"
      },
      "message": "loop: enforce rather than fix branch formatting\n\nThis way the UI will always be correct;\nthe UI runs off the LLM response, not the fixed version.\n"
    },
    {
      "commit": "23b6a2d690a4e208ec21604a5dd6a59bd1129ab5",
      "tree": "b1aa365e89aa6a9af0596a6f4ab72d0dd4021dcb",
      "parents": [
        "2978ab21bc1c0d589343468c59bb072934d8b8c7"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed Apr 30 04:07:52 2025 +0000"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed Apr 30 11:13:16 2025 -0700"
      },
      "message": "termui: remove path from prompt\n\nCurious whether anyone gets sad about its removal.\nI prefer the simpler version.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e"
    },
    {
      "commit": "2978ab21bc1c0d589343468c59bb072934d8b8c7",
      "tree": "3b598bd3a64eedd0602ce7ed9a01bca2a9096ef2",
      "parents": [
        "c2d26106a9bf0ce453589899640432314779b060"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed Apr 30 10:29:32 2025 -0700"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed Apr 30 11:13:16 2025 -0700"
      },
      "message": "termui: fix up emoji spacing a little"
    },
    {
      "commit": "c2d26106a9bf0ce453589899640432314779b060",
      "tree": "6e1d3216316f5df066d22c8aa62f6f014e249def",
      "parents": [
        "81eacc409f4f5ec758493769c8d1a31e94aaeafa"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed Apr 30 06:19:43 2025 -0700"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed Apr 30 11:13:16 2025 -0700"
      },
      "message": "termui: turn the user from a faceless gray menace into a superhero\n"
    },
    {
      "commit": "81eacc409f4f5ec758493769c8d1a31e94aaeafa",
      "tree": "fe7c7dc73de6421c92ac2009f82a90d8e72df19f",
      "parents": [
        "3a89ba89acee96cd963a0e64d812f4ba7943d6d6"
      ],
      "author": {
        "name": "Autoformatter",
        "email": "bot@sketch.dev",
        "time": "Wed Apr 30 18:10:50 2025 +0000"
      },
      "committer": {
        "name": "Autoformatter",
        "email": "bot@sketch.dev",
        "time": "Wed Apr 30 18:10:50 2025 +0000"
      },
      "message": "all: fix formatting\n"
    },
    {
      "commit": "3a89ba89acee96cd963a0e64d812f4ba7943d6d6",
      "tree": "9139f02cd222fcdfc7d3d4a2d2820a8198a7a754",
      "parents": [
        "d01f67c2669a8b408c382e40465c152855e89125"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Wed Apr 30 17:52:29 2025 +0000"
      },
      "committer": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Wed Apr 30 11:10:03 2025 -0700"
      },
      "message": "build(deps-dev): bump vite from 6.3.2 to 6.3.4 in /webui\n\nBumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) from 6.3.2 to 6.3.4.\n- [Release notes](https://github.com/vitejs/vite/releases)\n- [Changelog](https://github.com/vitejs/vite/blob/main/packages/vite/CHANGELOG.md)\n- [Commits](https://github.com/vitejs/vite/commits/v6.3.4/packages/vite)\n\n---\nupdated-dependencies:\n- dependency-name: vite\n  dependency-version: 6.3.4\n  dependency-type: direct:development\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e"
    },
    {
      "commit": "d01f67c2669a8b408c382e40465c152855e89125",
      "tree": "a2224097e2c2551504fd1f7b9987454756dba038",
      "parents": [
        "7910eef0b83f5ce15af3c1a9fa6b6f29165d335e"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Wed Apr 30 17:50:33 2025 +0000"
      },
      "committer": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Wed Apr 30 11:10:03 2025 -0700"
      },
      "message": "ci: amend single commits when auto-formatting queue-main branches\n\nModify the formatting workflow to check the number of commits since\nthe merge-base with origin/main. If there\u0027s exactly one commit\nsince the merge-base, amend that commit instead of adding a new\nformatting commit. For multiple commits, continue to add a new\ncommit as before.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\n"
    },
    {
      "commit": "7910eef0b83f5ce15af3c1a9fa6b6f29165d335e",
      "tree": "9294b377622f118053e05650a56e2e8bcc66eb4b",
      "parents": [
        "d20ded51d0564fd3955320e6bfc6c90e5c190680"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Wed Apr 30 17:50:33 2025 +0000"
      },
      "committer": {
        "name": "Autoformatter",
        "email": "bot@sketch.dev",
        "time": "Wed Apr 30 17:54:50 2025 +0000"
      },
      "message": "ci: amend single commits when auto-formatting queue-main branches\n\nModify the formatting workflow to check the number of commits since\nthe merge-base with origin/main. If there\u0027s exactly one commit\nsince the merge-base, amend that commit instead of adding a new\nformatting commit. For multiple commits, continue to add a new\ncommit as before.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\n"
    },
    {
      "commit": "d20ded51d0564fd3955320e6bfc6c90e5c190680",
      "tree": "41f521575bd7c56c56583465b1bd7b633c4ef8bf",
      "parents": [
        "abc093cae60860c6837dd2af64715b5f0197a460"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Wed Apr 30 17:38:36 2025 +0000"
      },
      "committer": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Wed Apr 30 10:50:47 2025 -0700"
      },
      "message": "webui: Don\u0027t auto-expand last message\n\nFix for issue #32. This removes the auto-expansion behavior of\nthe last message in the timeline which was causing messages to\nkeep expanding and contracting in a jarring way.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\n"
    },
    {
      "commit": "abc093cae60860c6837dd2af64715b5f0197a460",
      "tree": "fc5f6223379fa0d5dee10f3eb130721a7a7ace04",
      "parents": [
        "cf57096f6e7f836c9f4ab6cb4d31d754569fae4b"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Wed Apr 30 10:46:27 2025 -0700"
      },
      "committer": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Wed Apr 30 10:47:19 2025 -0700"
      },
      "message": "Left-align \u0027How to use Sketch\u0027 paragraphs\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\n\nLeft-align the paragraphs in the \u0027How to use Sketch\u0027 section while keeping the title centered.\n"
    },
    {
      "commit": "cf57096f6e7f836c9f4ab6cb4d31d754569fae4b",
      "tree": "4dd87e7cf4e8c3f3a48dd3a6ecdb63379f15921c",
      "parents": [
        "47b71c9ceed71bbae94e5754f7005c829ff9071b"
      ],
      "author": {
        "name": "Autoformatter",
        "email": "bot@sketch.dev",
        "time": "Wed Apr 30 17:27:39 2025 +0000"
      },
      "committer": {
        "name": "Autoformatter",
        "email": "bot@sketch.dev",
        "time": "Wed Apr 30 17:27:39 2025 +0000"
      },
      "message": "all: fix formatting\n"
    },
    {
      "commit": "47b71c9ceed71bbae94e5754f7005c829ff9071b",
      "tree": "ce80acde442236a78e240584309b557163a5cbf8",
      "parents": [
        "edc88dcc56ebdb1a2d9887728d0b5133b6131fbb"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Wed Apr 30 15:43:39 2025 +0000"
      },
      "committer": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Wed Apr 30 10:23:06 2025 -0700"
      },
      "message": "Display last commit in UI top bar\n\nAdded a feature to display the last commit information in the sketch UI top bar.\nWhen a commit message is received, the UI now shows either the pushed branch name\nor the commit hash in the top bar next to the cost display. Clicking on this element\ncopies the branch name or commit hash to the clipboard.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\n"
    },
    {
      "commit": "edc88dcc56ebdb1a2d9887728d0b5133b6131fbb",
      "tree": "a5b44389b3ac59022c3006d8347c36626cc7019e",
      "parents": [
        "885a16a8e37fe82dac66a7db729be202f6ce4bea"
      ],
      "author": {
        "name": "Sean McCullough",
        "email": "banksean@gmail.com",
        "time": "Wed Apr 30 02:55:01 2025 +0000"
      },
      "committer": {
        "name": "Sean McCullough",
        "email": "banksean@gmail.com",
        "time": "Wed Apr 30 09:41:22 2025 -0700"
      },
      "message": "Rename cancelInnerLoop to cancelTurn to match refactored naming\n\n- Updated all references to cancelInnerLoop and CancelInnerLoop\n- Changed method and variable names to match the new processTurn naming\n- Updated references in related files: server/loophttp.go and termui/termui.go\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\n"
    },
    {
      "commit": "885a16a8e37fe82dac66a7db729be202f6ce4bea",
      "tree": "eff84390d70dda2a09c79faffad2ba0850c1b763",
      "parents": [
        "0d95d3a268ffad82b7c645200804fb43ed088a81"
      ],
      "author": {
        "name": "Sean McCullough",
        "email": "banksean@gmail.com",
        "time": "Wed Apr 30 02:49:25 2025 +0000"
      },
      "committer": {
        "name": "Sean McCullough",
        "email": "banksean@gmail.com",
        "time": "Wed Apr 30 09:41:22 2025 -0700"
      },
      "message": "Refactor loop/agent.go to reduce complexity\n\n- Restructured Agent.InnerLoop into smaller, more focused functions\n- Renamed InnerLoop to processTurn to better reflect its purpose\n- Extracted helper methods for different responsibilities\n- Improved code organization and testability\n- Each extracted function now handles a single responsibility\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\n"
    },
    {
      "commit": "0d95d3a268ffad82b7c645200804fb43ed088a81",
      "tree": "ac9a63b6648a2555382769bcd9ce157170291224",
      "parents": [
        "9c0fc89eea578d71389edb4fd7d92eb73816f528"
      ],
      "author": {
        "name": "Sean McCullough",
        "email": "banksean@gmail.com",
        "time": "Wed Apr 30 16:22:28 2025 +0000"
      },
      "committer": {
        "name": "Sean McCullough",
        "email": "banksean@gmail.com",
        "time": "Wed Apr 30 16:22:35 2025 +0000"
      },
      "message": "Improve SSH config file safety in dockerimg/ssh_theater.go\n\n- Add SafeWriteFile method to the FileSystem interface that:\n  - Writes data to a temporary file first\n  - Syncs to disk to ensure data is written\n  - Creates a backup of the original file (if it exists)\n  - Safely renames the temporary file to the target\n\n- Update all file modification operations to use SafeWriteFile:\n  - addContainerToSSHConfig\n  - removeContainerFromSSHConfig\n  - addContainerToKnownHosts\n  - removeContainerFromKnownHosts\n  - CheckForIncludeWithFS\n\nThis change reduces the risk of corruption if the process is interrupted\nwhile modifying configuration files.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\n"
    },
    {
      "commit": "9c0fc89eea578d71389edb4fd7d92eb73816f528",
      "tree": "b5537fe6f3456ec941dde88d1bb65792212875f8",
      "parents": [
        "c796e7fb2df221dbef753556a3077da81a7fbe0c"
      ],
      "author": {
        "name": "Sean McCullough",
        "email": "banksean@gmail.com",
        "time": "Wed Apr 30 08:48:42 2025 -0700"
      },
      "committer": {
        "name": "Sean McCullough",
        "email": "banksean@gmail.com",
        "time": "Wed Apr 30 08:48:42 2025 -0700"
      },
      "message": "fmt\n"
    },
    {
      "commit": "c796e7fb2df221dbef753556a3077da81a7fbe0c",
      "tree": "652c542588c3bba3ad9897c4f5e5d231fbde7aed",
      "parents": [
        "78520f50d518f331c6608cfd0dff7bb4a75dc93b"
      ],
      "author": {
        "name": "Sean McCullough",
        "email": "banksean@gmail.com",
        "time": "Wed Apr 30 08:44:06 2025 -0700"
      },
      "committer": {
        "name": "Sean McCullough",
        "email": "banksean@gmail.com",
        "time": "Wed Apr 30 08:44:55 2025 -0700"
      },
      "message": "ssh_theater: fix tests\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": "3b0795b1c52d9b470f361299e9cd359c53704a04",
      "tree": "9fab2d27f829cb93fba774f65f4a1426fec3ce05",
      "parents": [
        "74b012128c939c8fd119a4af2205451105a19ad3"
      ],
      "author": {
        "name": "Sean McCullough",
        "email": "banksean@gmail.com",
        "time": "Tue Apr 29 19:09:23 2025 -0700"
      },
      "committer": {
        "name": "Sean McCullough",
        "email": "banksean@gmail.com",
        "time": "Tue Apr 29 19:39:22 2025 -0700"
      },
      "message": "ssh_theater: auto-add Include to ~/.ssh/config\n"
    },
    {
      "commit": "74b012128c939c8fd119a4af2205451105a19ad3",
      "tree": "a1b3d989ec446adc6a2b6233452c64324546ec1f",
      "parents": [
        "fff269b875d14dd6fbd1b90050739679f4bc2061"
      ],
      "author": {
        "name": "Sean McCullough",
        "email": "banksean@gmail.com",
        "time": "Tue Apr 29 18:40:53 2025 -0700"
      },
      "committer": {
        "name": "Sean McCullough",
        "email": "banksean@gmail.com",
        "time": "Tue Apr 29 19:27:20 2025 -0700"
      },
      "message": "ssh_theather: use ~/.config/sketch not ~/.sketch\n"
    },
    {
      "commit": "fff269b875d14dd6fbd1b90050739679f4bc2061",
      "tree": "ee3155adc63e627cf2fe8e24a4bf1a5d7776b5c7",
      "parents": [
        "47b193683089f6ca98877af497f7800d4a26f4a9"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed Apr 30 01:49:39 2025 +0000"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Tue Apr 29 19:06:19 2025 -0700"
      },
      "message": "Update title tool to reject branch names that already exist\n\nAdded a check to the title tool to verify that branches do not already exist\nbefore setting them, which prevents potential issues with duplicate branch names.\nIncludes a new unit test to validate this behavior.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e"
    },
    {
      "commit": "47b193683089f6ca98877af497f7800d4a26f4a9",
      "tree": "43b4b54c7b32650ff7ea9256c0aca7a793d68246",
      "parents": [
        "0137a7f2a025a2ac08e536b207ded2d58e928e32"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed Apr 30 01:34:14 2025 +0000"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Tue Apr 29 19:06:19 2025 -0700"
      },
      "message": "Display branch name alongside title in termui and webui\n\nThis change adds the branch name alongside the title in both the terminal UI and the web UI, following up on commit a9b3822fd2cfdc035e7daa8b59496f9838a4b2c6 which added the branch_name parameter to the title tool.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\n"
    },
    {
      "commit": "0137a7f2a025a2ac08e536b207ded2d58e928e32",
      "tree": "3834c7b2a22a9e9564e67120346ae8e9eb9354fc",
      "parents": [
        "d499fd6e12374193df2d769d12753bbd1ddd1493"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed Apr 30 01:16:35 2025 +0000"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Tue Apr 29 19:06:19 2025 -0700"
      },
      "message": "Improve git cherry-pick display with abbreviated SHA/branch references\n\nThis change modifies how git cherry-pick commands are displayed in the UI.\nInstead of showing full SHA hashes, it now attempts to:\n1. Show branch/tag names if available\n2. Fall back to abbreviated SHA via git rev-parse --short\n3. Use the original full SHA only if the above methods fail\n\nThis makes cherry-pick commands more readable and user-friendly.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\n"
    },
    {
      "commit": "d499fd6e12374193df2d769d12753bbd1ddd1493",
      "tree": "e8c2a8a134773164910b78b4606bd196c55d6d5f",
      "parents": [
        "dae19073cfdc420af8da311c4f3974ac6db77b46"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed Apr 30 01:31:29 2025 +0000"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Tue Apr 29 19:06:19 2025 -0700"
      },
      "message": "Add permission callback to Bash tool to enforce title setting before git commits\n\n- Convert Bash tool from a plain variable to a struct with a permission callback function\n- Add a constructor for creating Bash tools with custom callback functions\n- Implement a permission check in agent.go that verifies a branch name has been set before allowing git commits\n- If no branch name is set and a git commit command is attempted, return an error instructing to use the title tool first\n- Maintain backward compatibility for tests with BashRun function\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\n"
    },
    {
      "commit": "dae19073cfdc420af8da311c4f3974ac6db77b46",
      "tree": "d2744d5ff7a9477e34537d7be9b772a3d3de522b",
      "parents": [
        "a9b3822fd2cfdc035e7daa8b59496f9838a4b2c6"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed Apr 30 01:08:57 2025 +0000"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Tue Apr 29 19:06:19 2025 -0700"
      },
      "message": "Add WillRunGitCommit function to bashkit\n\nThis function inspects a bash script to determine if it will run \u0027git commit\u0027 commands.\nThe implementation is similar to the existing Check function but is kept separate as requested.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\n"
    },
    {
      "commit": "a9b3822fd2cfdc035e7daa8b59496f9838a4b2c6",
      "tree": "9fc7773eb4c012398133633e41e6f1551f621996",
      "parents": [
        "1ae976bde49d4f0dc48146c1e3d3f38201e1f830"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Tue Apr 29 18:05:06 2025 -0700"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Tue Apr 29 18:05:06 2025 -0700"
      },
      "message": "Add branch_name parameter to title tool\n\nModified the title tool to accept a branch_name parameter, which allows specifying\na custom branch name slug instead of deriving it from the title. The branch name\nis still cleaned to ensure it\u0027s valid.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e"
    },
    {
      "commit": "1ae976bde49d4f0dc48146c1e3d3f38201e1f830",
      "tree": "9d6235d7b3a16df5b968c271ca318147ac293412",
      "parents": [
        "e2d24ab80f34e25f602b306ea8e8b765101d8585"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed Apr 30 00:06:43 2025 +0000"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Tue Apr 29 17:59:55 2025 -0700"
      },
      "message": "loop: fiddle with titleToBranch\n\nAdd support for numbers.\nUse strings.Map.\n"
    },
    {
      "commit": "e2d24ab80f34e25f602b306ea8e8b765101d8585",
      "tree": "0ba0f2f3874069024baf1af857ec67d045ea813d",
      "parents": [
        "dbe02304e804066bb32fcf6f41690336a98e6531"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed Apr 30 00:01:41 2025 +0000"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Tue Apr 29 17:41:18 2025 -0700"
      },
      "message": "dockerimg: add \u0027apk add grep\u0027\n\nClaude wants to use lots of grep features that the busybox version lacks.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\n"
    },
    {
      "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": "c72fff52ad6c5436fa8469f049fa232f2f6be5ed",
      "tree": "2f42838fc0af2f4954a64b8edcc4c8e09ec08af4",
      "parents": [
        "d3906e2e0a18197148089f384b188135b07559be"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Tue Apr 29 20:17:54 2025 +0000"
      },
      "committer": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Tue Apr 29 16:24:19 2025 -0700"
      },
      "message": "Add SSH connection information to web UI\n\nThis commit implements:\n1. Added SSH information display to the web UI info button\n2. Shows SSH connection information only when running inside Docker container\n3. Constructs the full SSH hostname as \"sketch-[session_id]\"\n4. Added copy-to-clipboard buttons for SSH commands\n5. Styles the VSCode URL as a proper clickable link\n6. Shows a warning message when SSH is not available\n7. Modified container naming to use only SessionID instead of imgName+SessionID\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\n"
    },
    {
      "commit": "d3906e2e0a18197148089f384b188135b07559be",
      "tree": "a26fb2fec665d3965e09a7cb53a95fd708db944a",
      "parents": [
        "7b6044969c696e1707a25c170eebd67fda919e34"
      ],
      "author": {
        "name": "Sean McCullough",
        "email": "banksean@gmail.com",
        "time": "Tue Apr 29 17:32:14 2025 +0000"
      },
      "committer": {
        "name": "Sean McCullough",
        "email": "banksean@gmail.com",
        "time": "Tue Apr 29 15:31:42 2025 -0700"
      },
      "message": "Add @click handler to stopButton in sketch-app-shell.ts\n\nThe stop button now sends a POST request to the /stop endpoint when clicked.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\n"
    },
    {
      "commit": "7b6044969c696e1707a25c170eebd67fda919e34",
      "tree": "3c8d8672a42ca507fbe668f6735125644ff68bcd",
      "parents": [
        "dc507a303e2ffc2fb934d8717fef6b551193a416"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Tue Apr 29 11:45:59 2025 -0700"
      },
      "committer": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Tue Apr 29 11:51:09 2025 -0700"
      },
      "message": "bin/sk-ls.sh: Show currently running sketches in Docker and what they\u0027re up to\n"
    },
    {
      "commit": "dc507a303e2ffc2fb934d8717fef6b551193a416",
      "tree": "3248ed4b91d509c69963a1cae666a5bf254c66e0",
      "parents": [
        "5cf49264f156f65ac3948393d7da5c509e34b2b2"
      ],
      "author": {
        "name": "Autoformatter",
        "email": "bot@sketch.dev",
        "time": "Tue Apr 29 18:38:53 2025 +0000"
      },
      "committer": {
        "name": "Autoformatter",
        "email": "bot@sketch.dev",
        "time": "Tue Apr 29 18:38:53 2025 +0000"
      },
      "message": "all: fix formatting\n"
    },
    {
      "commit": "5cf49264f156f65ac3948393d7da5c509e34b2b2",
      "tree": "3e0d0c06b9e89a2e97a16812a5f7c75274c85989",
      "parents": [
        "570c3f8350204169007585e0f4a65f1f0085e504"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Tue Apr 29 18:35:55 2025 +0000"
      },
      "committer": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Tue Apr 29 11:38:12 2025 -0700"
      },
      "message": "Add welcome box with usage instructions to empty chat window\n\nThe welcome box provides a clear introduction with a title \u0027How to use Sketch\u0027\nand helpful instructions about how Sketch works when a user first opens the\napplication and there are no messages in the chat.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\n"
    },
    {
      "commit": "570c3f8350204169007585e0f4a65f1f0085e504",
      "tree": "6c2b3d914cf94fa3c4b23ce73a7f8b613592f3e0",
      "parents": [
        "c2b6bdfdf9ff99becdb9f227dd04af015d9d3370"
      ],
      "author": {
        "name": "Autoformatter",
        "email": "bot@sketch.dev",
        "time": "Tue Apr 29 18:26:50 2025 +0000"
      },
      "committer": {
        "name": "Autoformatter",
        "email": "bot@sketch.dev",
        "time": "Tue Apr 29 18:26:50 2025 +0000"
      },
      "message": "all: fix formatting\n"
    },
    {
      "commit": "c2b6bdfdf9ff99becdb9f227dd04af015d9d3370",
      "tree": "6624e0dab07667f2cdc5d2471863d34acb69ec84",
      "parents": [
        "1b47aa2aa46bf1aad16c79d36a9baf60fc69e905"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Tue Apr 29 11:17:47 2025 -0700"
      },
      "committer": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Tue Apr 29 11:24:36 2025 -0700"
      },
      "message": "Improve status bar icons for LLM and tool calls\n\n- Replace notification-style number badges with background and color changes\n- Use SVG icons instead of emoji\n- Improve visual appearance when active/inactive\n- Update tests accordingly\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\n"
    },
    {
      "commit": "1b47aa2aa46bf1aad16c79d36a9baf60fc69e905",
      "tree": "10cfc03414feef2c7adf723be101b136a7c387c5",
      "parents": [
        "2dc86b9bda41cf30926833b044d8669d92273b20"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Mon Apr 28 19:25:38 2025 +0000"
      },
      "committer": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Tue Apr 29 11:24:29 2025 -0700"
      },
      "message": "Add initial-commit CLI flag for specifying git reference\n\nThis adds a new -initial-commit flag to the sketch CLI which allows specifying\na different git reference besides HEAD as the starting point. The flag is\nincompatible with -unsafe mode and will show an error if both are used.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\n"
    },
    {
      "commit": "2dc86b9bda41cf30926833b044d8669d92273b20",
      "tree": "e8ebd9c7710b6cfa311d7fcdb1c26b2a2b482162",
      "parents": [
        "50a1d62e0dc285c69b7c495e4a01a47fa3561692"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Tue Apr 29 14:11:58 2025 +0000"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Tue Apr 29 10:48:31 2025 -0700"
      },
      "message": "Update codereview tool UI to show different icons based on result content\n\nAdded cross-linking comments between the UI component and differential.go\nto ensure they stay in sync going forward.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e"
    },
    {
      "commit": "50a1d62e0dc285c69b7c495e4a01a47fa3561692",
      "tree": "3a3e261735a063208430e457a0fbf93c1d30f58c",
      "parents": [
        "5fabc74b668752dc68e05a9a452cc15cf62077f7"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Tue Apr 29 09:59:03 2025 -0700"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Tue Apr 29 09:59:13 2025 -0700"
      },
      "message": "loop: don\u0027t panic when LLM API call fails\n\nAnd refactor a touch."
    },
    {
      "commit": "5fabc74b668752dc68e05a9a452cc15cf62077f7",
      "tree": "dd5db2975b59ff8076922be0eb441326ace547da",
      "parents": [
        "d4b1cc76714b5e139e539259673afe7d74afa1cb"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Tue Apr 29 14:09:50 2025 +0000"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Tue Apr 29 09:49:43 2025 -0700"
      },
      "message": "webui: make tool call failures less \"error\"-y\n\nIt\u0027s unnecessarily red/jarring.\nThis now matches the termui.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e"
    },
    {
      "commit": "d4b1cc76714b5e139e539259673afe7d74afa1cb",
      "tree": "69e30a90339000e8a42fba993acff1c58a7d2e98",
      "parents": [
        "15272c1ddf6eba4e8d9b2697a3e6af09752a6cf1"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Tue Apr 29 13:49:18 2025 +0000"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Tue Apr 29 06:53:26 2025 -0700"
      },
      "message": "Sort git rev-list by time and limit results for related files\n\nSort the git rev-list by time (descending) and limit the result to max 100\ncommits in the related files calculation. This limits runtime and favors\nrecent commits, which are more likely to be relevant.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\n"
    },
    {
      "commit": "15272c1ddf6eba4e8d9b2697a3e6af09752a6cf1",
      "tree": "c8022595159550121c43087cdfab1620d9ae6539",
      "parents": [
        "9c07e1d30f7f576bd7679a155873f6419743e6a6"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Mon Apr 28 19:36:15 2025 -0700"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Mon Apr 28 19:36:15 2025 -0700"
      },
      "message": "claudetool: add two more \"related files\" todos"
    },
    {
      "commit": "9c07e1d30f7f576bd7679a155873f6419743e6a6",
      "tree": "e962e6cb86fdaca7fbb4359efd025b39a47de74e",
      "parents": [
        "ffecb1e9fbaca84d7f142aa294fa795c324587af"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Mon Apr 28 19:25:37 2025 -0700"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Mon Apr 28 19:25:37 2025 -0700"
      },
      "message": "loop: prevent panic on double Agent.Init"
    },
    {
      "commit": "ffecb1e9fbaca84d7f142aa294fa795c324587af",
      "tree": "00bcb908d9a6b2d09b0ebf7bc3d1024f5cd9a16d",
      "parents": [
        "ffb58a30bd18ff8e21d228ac072dc636cb0510c8"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Mon Apr 28 18:59:14 2025 +0000"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Mon Apr 28 16:15:34 2025 -0700"
      },
      "message": "claudetool: add \"related files\" detection to codereview tool\n\n"
    },
    {
      "commit": "ffb58a30bd18ff8e21d228ac072dc636cb0510c8",
      "tree": "b635557939e4def2f3195167cc3743ed2f845fd2",
      "parents": [
        "fa40c418792b77f186a03a056fbb81853e83d84d"
      ],
      "author": {
        "name": "Sean McCullough",
        "email": "banksean@gmail.com",
        "time": "Mon Apr 28 13:50:56 2025 -0700"
      },
      "committer": {
        "name": "Sean McCullough",
        "email": "banksean@gmail.com",
        "time": "Mon Apr 28 14:35:33 2025 -0700"
      },
      "message": "webui: show more summary-text in tool cards\n"
    },
    {
      "commit": "fa40c418792b77f186a03a056fbb81853e83d84d",
      "tree": "d4f3d4409e93ba61d0171d4757b81339852e2fee",
      "parents": [
        "ea3fc200402ef92fb2d35c9b56ab77e77a983338"
      ],
      "author": {
        "name": "Sean McCullough",
        "email": "banksean@gmail.com",
        "time": "Mon Apr 28 20:10:04 2025 +0000"
      },
      "committer": {
        "name": "Sean McCullough",
        "email": "banksean@gmail.com",
        "time": "Mon Apr 28 13:53:46 2025 -0700"
      },
      "message": "webui: +sketch-tool-card-multiple-choice\n\nThis is just the frontend part of the multiple-choice tool.\nSince the actual tool call isn\u0027t implemented yet, the only\nway to exercise this code is via the demo page.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\n"
    },
    {
      "commit": "ea3fc200402ef92fb2d35c9b56ab77e77a983338",
      "tree": "c95a9faf8d5cebb0e22d96cef4f17aec02089145",
      "parents": [
        "015b882721adf65cad5a11838d1d72c98e99c6f6"
      ],
      "author": {
        "name": "Sean McCullough",
        "email": "banksean@gmail.com",
        "time": "Mon Apr 28 12:53:37 2025 -0700"
      },
      "committer": {
        "name": "Sean McCullough",
        "email": "banksean@gmail.com",
        "time": "Mon Apr 28 12:54:22 2025 -0700"
      },
      "message": "dockerimg: fix vscode:// links\n\nThis adds an undocumented parameter that makes vsc open a new window\ninstead of replacing your current vsc window with the link.\n"
    },
    {
      "commit": "015b882721adf65cad5a11838d1d72c98e99c6f6",
      "tree": "f3f553b73f01d592755ce245d1819a2d0feb5349",
      "parents": [
        "22bd8eb83b7c779d9d2396c75cc344124e150aee"
      ],
      "author": {
        "name": "Sean McCullough",
        "email": "banksean@gmail.com",
        "time": "Mon Apr 28 12:29:08 2025 -0700"
      },
      "committer": {
        "name": "Sean McCullough",
        "email": "banksean@gmail.com",
        "time": "Mon Apr 28 12:29:08 2025 -0700"
      },
      "message": "webui: fix \u0027build\u0027 and \u0027dev\u0027 npm scripts\n"
    },
    {
      "commit": "22bd8eb83b7c779d9d2396c75cc344124e150aee",
      "tree": "81fc507d28db05b011d463745e125e6126260fb0",
      "parents": [
        "0dcebe1bf2ec5d6f85aa71fb46367e2adf8f4947"
      ],
      "author": {
        "name": "Sean McCullough",
        "email": "banksean@gmail.com",
        "time": "Mon Apr 28 10:36:37 2025 -0700"
      },
      "committer": {
        "name": "Sean McCullough",
        "email": "banksean@gmail.com",
        "time": "Mon Apr 28 10:36:37 2025 -0700"
      },
      "message": "sshserver: fix env for ssh pty sessions\n"
    }
  ],
  "next": "0dcebe1bf2ec5d6f85aa71fb46367e2adf8f4947"
}
