)]}'
{
  "log": [
    {
      "commit": "33032d3d37b25537fe85f0afd9238ca2ece4bd71",
      "tree": "ced0b94bd250cd612122b8134e308400b158f1b2",
      "parents": [
        "a3e28fb8e570ab7e43f84d2f5c5fcecb81d00618"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Fri May 30 16:28:21 2025 +0000"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Fri May 30 12:34:24 2025 -0700"
      },
      "message": "cmd/sketch: fix budget propagation from host to container\n\nFix the -max-dollars flag not being respected in container mode. The issue\nwas that budget configuration was not being passed from the outer sketch\n(host) to the inner sketch (container).\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: s0eade317323b3951k"
    },
    {
      "commit": "c7cdd77f99dece73f223597263f8495c15d7f35f",
      "tree": "4d2198c9cf904872a7284e8e68b3f2899e6e5d35",
      "parents": [
        "495c1fa247565e21b36bcb847c6cd3f08e0e196f"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Thu May 29 19:43:10 2025 +0000"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Thu May 29 15:41:54 2025 -0700"
      },
      "message": "dockerimg: add emoji fonts to base image\n\nAdd emoji font packages to the Docker base image to support\nemoji rendering in browser screenshots:\n\n- fonts-noto-color-emoji: Color emoji font from Google\n- fonts-symbola: Symbolic font with Unicode 9.0 emoji characters\n- fc-cache -f -v: Force font cache refresh\n\nThis follows the typical Ubuntu emoji font installation pattern:\napt-get install -y fonts-noto-color-emoji \u0026\u0026 fc-cache -f -v\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: sea5a1179c771a14bk\n"
    },
    {
      "commit": "b6bc113f9ebb00084285e8c3aeaf2fd4a648afc0",
      "tree": "842b5318ef6aba197cf922464995cfcc0fbbc5b0",
      "parents": [
        "71c73b513bc51a5cf6108394a84fcf143cc5e3f8"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Thu May 29 13:24:52 2025 -0700"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Thu May 29 15:12:34 2025 -0700"
      },
      "message": "dockerimg: improve docs on how to publish a new image"
    },
    {
      "commit": "9500617d20b037b9ad1f88eb7550068679832a4d",
      "tree": "15593d668443d3df4f6d223bd753c216f5f0274a",
      "parents": [
        "e89b3080f934a4bc70a0cfa85ffff49ac78d6f2b"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Wed May 28 20:05:46 2025 -0700"
      },
      "committer": {
        "name": "Philip Zeyliger",
        "email": "philip.zeyliger@gmail.com",
        "time": "Wed May 28 20:26:29 2025 -0700"
      },
      "message": "dockerimg: fix Chromium support with multi-stage Docker build\n\nOMG, people, OMG. So, an earlier commit moved us to Ubuntu, and it turns\nout that \"apt-get install chromium-browser\" or whatever just does\nnothing, and tells you to use the snap. Snap requires systemd, and if\nyou\u0027re using containers, you don\u0027t usually have systemd, and ... yeah,\nno screenshots. There are no great stories for where to get Chromium.\nThere\u0027s a dude who publishes the Mint Linux packages in a compatible way\nfor Ubuntu. I chose instead the headless-chrome from a Docker build\nrecommended by the Chromedp library that we use to control Chromium.\n\nI\u0027m a bit snappy about all of this.\n\n...\n\nReplace Ubuntu 24 snap-based Chromium installation with chromedp/headless-shell\nto resolve container compatibility issues where snaps don\u0027t work properly.\n\nChanges include:\n\n1. Multi-stage Dockerfile.base build:\n   - Stage 1: Extract headless-shell from docker.io/chromedp/headless-shell:stable\n   - Stage 2: Main Ubuntu 24.04 application image with required Chrome dependencies\n   - Remove chromium package from apt-get install (replaced with headless-shell)\n   - Add required libraries: libglib2.0-0, libnss3, libx11-6, libxcomposite1,\n     libxdamage1, libxext6, libxi6, libxrandr2, libgbm1, libgtk-3-0\n   - Add headless-shell to PATH so chromedp can find it automatically\n\n2. Updated documentation in browse/README.md:\n   - Document Docker multi-stage build approach\n   - Clarify requirements for Docker vs local development\n\nBenefits:\n- Resolves Ubuntu 24 snap incompatibility issues in containers\n- Provides self-contained Chrome installation without system dependencies\n- Maintains backward compatibility for local development\n- Uses proven chromedp/headless-shell for reliable browser automation\n- Eliminates need for manual Chrome/Chromium installation in containers\n- No code changes needed in browse.go - chromedp finds headless-shell via PATH\n\nThe headless-shell binary is automatically discovered by chromedp\u0027s default\nexecutable search since it\u0027s added to PATH in the Docker environment.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: se4808dca7afba802k\n"
    },
    {
      "commit": "a442ce32ac95d7e8337fba0a82f94cbd60be1296",
      "tree": "03207a7855e0db3afe0baa13f8e13f9d693d0974",
      "parents": [
        "574eda8d743b07cb0e0e11540d4f1b7db7eeb68c"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Wed May 28 02:48:26 2025 +0000"
      },
      "committer": {
        "name": "Philip Zeyliger",
        "email": "philip.zeyliger@gmail.com",
        "time": "Wed May 28 10:54:50 2025 -0700"
      },
      "message": "dockerimg: change base container image to ubuntu 24.04 with go 1.24.3\n\nChanges the base Docker image from golang:1.24-bookworm (Debian 12) to\nubuntu:24.04 (Noble Numbat - current LTS) and installs Go 1.24.3 manually.\n\nChanges include:\n\n1. Updated FROM ubuntu:24.04 to use current Ubuntu LTS instead of Debian\n2. Added ca-certificates and wget for Go downloads\n3. Manual Go 1.24.3 installation from official golang.org tarball\n4. Proper GOROOT, GOPATH, and PATH environment setup\n5. Created GOPATH directory structure\n\nThis provides a cleaner foundation based on the current Ubuntu LTS\nwhile maintaining full Go development capabilities. The manual Go\ninstallation gives more control over the exact Go version used and\neliminates dependency on the golang base image layers.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: s0bc05e04441c24a6k\n"
    },
    {
      "commit": "3d2eff03a428424a31173b0f30f3d647a570b455",
      "tree": "ac703dc76e758d99604bc5cc9514bbf2daaf96cd",
      "parents": [
        "ab6a811066a89a1e499253a7f854e6dd0a777ce5"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Tue May 27 09:30:31 2025 -0700"
      },
      "committer": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Tue May 27 09:30:31 2025 -0700"
      },
      "message": "sketch: avoid using tty when termui is false.\n\nWhen using with -termui\u003dfalse -verbose, the terminal does weird shit,\nand there\u0027s a ladder effect. It\u0027s because a tty is being allocated\nsomehow. We don\u0027t need a tty unless we\u0027re using termui, so tightening up\nthe if/else on when we pass \"-t\" to Docker.\n\nThe logic here is detailed, so apologies if I got it wrong.\n"
    },
    {
      "commit": "ab6a811066a89a1e499253a7f854e6dd0a777ce5",
      "tree": "c7ad7a41b2cb9518b3460a1e9b4e8252b48942df",
      "parents": [
        "83b2d35b61eb68c0d633a10c2f5b7c0905e584df"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Sat May 24 12:22:00 2025 -0700"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Sat May 24 12:28:01 2025 -0700"
      },
      "message": "all: update tests for claude 4"
    },
    {
      "commit": "3e6a4c4abe8714ebb04c0d4834bcc7230f4d4a03",
      "tree": "cf5b7dc0ed2ac2c55a949962d19416bae8553809",
      "parents": [
        "f4f929a48d358acb206a6cbc91dfdee813c45aed"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Fri May 23 17:29:57 2025 +0000"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Fri May 23 11:30:07 2025 -0700"
      },
      "message": "dockerimg: mount Go caches for faster Docker race builds\n\nWhen building sketch binary with race detector in Docker, the system\nwas downloading all modules and rebuilding from scratch every time,\nmaking repeated builds slow and inefficient.\n\nThis adds host Go cache mounting to buildLinuxSketchBinWithDocker by:\n- Getting host GOCACHE and GOMODCACHE directories using \u0027go env\u0027\n- Mounting them as volumes in the Docker container:\n  -v $GOCACHE:/root/.cache/go-build\n  -v $GOMODCACHE:/go/pkg/mod\n\nThe optimization ensures:\n- First race build: Downloads modules (same time as before)\n- Subsequent race builds: Reuses cached modules (much faster)\n- Build artifacts persist between Docker container runs\n\nAdds helper functions getHostGoCacheDir() and getHostGoModCacheDir()\nto retrieve cache paths from the host environment, with proper error\nhandling and path validation.\n\nIncludes unit test to verify cache directory detection works correctly\non all platforms where Go is installed.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: sd279e56e1574e4e1k\n"
    },
    {
      "commit": "f4f929a48d358acb206a6cbc91dfdee813c45aed",
      "tree": "8f078c859c7f2b3bca003e39faf6cfeb46001147",
      "parents": [
        "3b5646ff27d0e644396524b8ca2c9a4c5891726c"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Fri May 23 17:19:26 2025 +0000"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Fri May 23 11:30:07 2025 -0700"
      },
      "message": "dockerimg: fix VCS stamping error when building with race detector\n\nWhen building the sketch binary with race detector enabled in Docker,\nGo\u0027s VCS stamping feature was failing with \u0027error obtaining VCS status:\nexit status 128\u0027 because it couldn\u0027t properly determine the Git status\nin the mounted repository (especially in detached HEAD states).\n\nThis adds -buildvcs\u003dfalse to the Docker build command to disable VCS\nstamping when building with the race detector, which avoids the error\nwhile still enabling race detection functionality.\n\nThe fix changes the Docker build command from:\n  go build -race -o /tmp/sketch-out/sketch sketch.dev/cmd/sketch\nto:\n  go build -buildvcs\u003dfalse -race -o /tmp/sketch-out/sketch sketch.dev/cmd/sketch\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: sb8b2e8656c0802f6k\n"
    },
    {
      "commit": "4acf00626f50c342dc35f8525732074cf10e4d1a",
      "tree": "4096c36933030c1c238098a7cb2214adc86421c4",
      "parents": [
        "9bca61ef623ea8cd72a906752be73af572af02a9"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Thu May 22 13:53:46 2025 -0700"
      },
      "committer": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Thu May 22 13:53:46 2025 -0700"
      },
      "message": "dockerimg: Add race detector support to sketch binary build\n\nRun this with:\n\n\tgo run -race ./cmd/sketch -C $(pwd) -verbose -termui\u003dfalse\n\n-race requires CGO which makes cross compilation miserable, so, we punt,\nand we use the container to do it.\n\nThe big TODO is that there\u0027s no go caching, so it\u0027s kinda slower than it\nneeds to be. This is probably fixable with a docker volume.\n\nWhen the host binary is built with the race detector enabled (-race flag),\nthe inner sketch binary that runs in Docker will also be built with the race\ndetector. This helps with debugging race conditions in the inner binary.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: s822ae1a915dcc857k\n"
    },
    {
      "commit": "bc8c8dc5bc7abca6fa523c5ca45c9fd2c09384c2",
      "tree": "d59b7b3ef6965949376481cfa6108fee7312f6fd",
      "parents": [
        "1a648f34a53216a9ed88792d583fad50246f3d4b"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Wed May 21 13:19:13 2025 -0700"
      },
      "committer": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Wed May 21 13:40:03 2025 -0700"
      },
      "message": "sketch main: migrating things from /init into cmdline flags\n\nAs much as possible, I want NewAgent() to take as many arguments as it\ncan, and try to avoid doing different things with Init().\n\nYou can\u0027t quite do everything because the port that Docker has\nopen for forwarding starts as \"0\" and we call \"docker port\" to find it,\nbut besides that, almost everything is knowable up front.\n"
    },
    {
      "commit": "ac761c9dd5ad664b09d8588261a09d4aecdace5d",
      "tree": "343cae654689288c8ff6807b036150f7e22a08ae",
      "parents": [
        "e10f0e6c540ac0f6c038a4a6b729e9401dd39e52"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Fri May 16 18:58:45 2025 +0000"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed May 21 11:37:49 2025 -0700"
      },
      "message": "cmd/sketch: add mount flag for container volumes\n\nAdd a mount flag that simplifies mounting host directories into the container.\nWhen specified with format /path/on/host:/path/in/container it\u0027s automatically\nconverted to a docker volume mount argument (-v) in the docker invocation.\nThis simplifies volume mounting compared to the more generic docker-args flag.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: s67251d45fd28831ek\n"
    },
    {
      "commit": "da514fccdf1135cfa52a869b892855aac117ee05",
      "tree": "7846b18cc33a04bc5c94098a6a135a513b18d2c7",
      "parents": [
        "9df94b5cf626971b7a84cd1b743ee49f5ae8e009"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip.zeyliger@gmail.com",
        "time": "Mon May 19 19:21:07 2025 -0700"
      },
      "committer": {
        "name": "Philip Zeyliger",
        "email": "philip.zeyliger@gmail.com",
        "time": "Mon May 19 19:25:20 2025 -0700"
      },
      "message": "Update dockerfile tests.\n"
    },
    {
      "commit": "9df94b5cf626971b7a84cd1b743ee49f5ae8e009",
      "tree": "49a54416207ef2418b9684fb6289e54a35badfc0",
      "parents": [
        "fbe6478d2829fcc7e5e7cc0c1b87721927b18d57"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip.zeyliger@gmail.com",
        "time": "Sun May 18 03:43:14 2025 +0000"
      },
      "committer": {
        "name": "Philip Zeyliger",
        "email": "philip.zeyliger@gmail.com",
        "time": "Mon May 19 19:25:20 2025 -0700"
      },
      "message": "dockerimg: Extract base Dockerfile to separate file\n\nExtract the dockerfileBase constant into a Dockerfile.base file and use Go embed\ndirectives to include it in the code. This improves maintainability by separating\nthe Docker configuration from the Go code while preserving the same functionality.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: se66b902985dca8a1k\n"
    },
    {
      "commit": "fbe6478d2829fcc7e5e7cc0c1b87721927b18d57",
      "tree": "7b8090ef32ba34fa29d0f3a4ebc4582f739a7270",
      "parents": [
        "d6d12d188814c114ed4b2acb1df2d201c1cf96b5"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Tue May 13 18:24:31 2025 -0700"
      },
      "committer": {
        "name": "Philip Zeyliger",
        "email": "philip.zeyliger@gmail.com",
        "time": "Mon May 19 19:25:20 2025 -0700"
      },
      "message": "docker: Add lsof and ss to base docker image\n\nThese are tools that the agent seems to want. It doesn\u0027t\ndo a great job of installing them, but they\u0027re pretty useful.\n"
    },
    {
      "commit": "d6d12d188814c114ed4b2acb1df2d201c1cf96b5",
      "tree": "2e2bc28d9882efe47d95c992f66b1c8f0d705540",
      "parents": [
        "e9eaf6c556fe058ccc6f9aa60b7db0f4a3ec77d3"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Mon May 19 19:19:21 2025 -0700"
      },
      "committer": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Mon May 19 19:19:21 2025 -0700"
      },
      "message": "Fail clearly when repo has no commits. (#109, #84)\n"
    },
    {
      "commit": "cabfa5520708460e4537216df26be15262c855e6",
      "tree": "27785b2f11ce1b0c360a781c4a1b2a8e2c513049",
      "parents": [
        "397871d299216f63dc38a9cc6f2ca386d0f4bd75"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Mon May 19 16:14:28 2025 -0700"
      },
      "committer": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Mon May 19 16:14:28 2025 -0700"
      },
      "message": "Pass -verbose flag to innie to see logs.\n"
    },
    {
      "commit": "87d29ef5b027120ea0857a9aa5661a3fab7b25b9",
      "tree": "1e7a7555b3c2cf9e764c9a62fe02e31b6667f27e",
      "parents": [
        "8c4636270be67625cc27ce356f6da1a11e245069"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Fri May 16 20:25:28 2025 -0700"
      },
      "committer": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Fri May 16 20:26:06 2025 -0700"
      },
      "message": "docker: use consistent ephemeral port for SSH\n\nI sense that some versions of docker interpret -p 22 as 22:22\nand some as 0:22. We already use 0:80 for HTTP, so let\u0027s do the same\nfor SSH.\n\nThis is an optimistic fix for a user issue.\n"
    },
    {
      "commit": "613c0f5288dd0e18dc9fee09254161d78fc7acb7",
      "tree": "e909ee44b0e1f0a6c14e7fab714450326a7e0b3f",
      "parents": [
        "bd7b625d4ca17b5cb5207b4917a6e61ea398f2d0"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Thu May 15 16:36:22 2025 -0700"
      },
      "committer": {
        "name": "Autoformatter",
        "email": "bot@sketch.dev",
        "time": "Thu May 15 23:42:04 2025 +0000"
      },
      "message": "logging: make -verbose -termui\u003dfalse log to stdout\n\nCommit d72563ac30bab6471121f561f3bb41991a3c91d1 made it so we never send\nlogs to stdout/stderr, but I prefer them on stderr when possible. So, if\ntermui isn\u0027t enabled, let\u0027s send them to stderr. --termui used to not be\npropogated; now it is.\n"
    },
    {
      "commit": "e3c2f22ee87eb9830dad42ca0388b9743923ec59",
      "tree": "6e6b8fe475c62eac64d6600fb8be82affec545ce",
      "parents": [
        "956626d63041ec76d3994bd3fda02448e49aab46"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Thu May 15 20:54:52 2025 +0000"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Thu May 15 14:41:38 2025 -0700"
      },
      "message": "skabandclient: fix handling of empty skaband-addr\n\nThis had regressed considerably.\n\nFixes #96\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: s4d698cae3417a4f9k"
    },
    {
      "commit": "64f2aa8db137ee801120fe38b19f60103a2326dd",
      "tree": "b322e422ac17af0e9ed0e59ea9f6d91d40291f5c",
      "parents": [
        "b81d7d476ff2d104d34d3a637f2bd826a2a89eaf"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed May 14 18:31:05 2025 +0000"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed May 14 13:53:29 2025 -0700"
      },
      "message": "loop: make multiplechoice tool calls end the turn\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: s8d507faf9c095824sk\n"
    },
    {
      "commit": "7013e9ee282ef58104f91d64d85d4aec62f9c022",
      "tree": "baa2d5484c5a5e7add5f9caef2833a3da4abbe29",
      "parents": [
        "00442413a2d0e6d6978982f9eeec0268e533ba56"
      ],
      "author": {
        "name": "Sean McCullough",
        "email": "banksean@gmail.com",
        "time": "Wed May 14 02:03:58 2025 +0000"
      },
      "committer": {
        "name": "Sean McCullough",
        "email": "banksean@gmail.com",
        "time": "Wed May 14 11:15:45 2025 -0700"
      },
      "message": "ssh: use local CA, add mutual container/host auth\n\nSee loop/server/local_ssh.md for a detailed description of how sketch uses\nnow uses a local CA to sign each container certificate instead of adding\na new entry to known_hosts for each container.\n\nThis also adds another layer of security by having the container\u0027s ssh\nserver verify that incoming ssh connections have valid host certificates,\nwhereas prior to this change the authentication was only one-way (verifying\nthat the sketch container you think you\u0027re ssh\u0027ing into really is the one\nyou think you\u0027re ssh\u0027ing into).\n\nThis is somewhat inspired by https://github.com/FiloSottile/mkcert - which\nplays a similar role as ssh_theater.go local for ssh connections, but mkcert\nuses a local CA to address local development use cases for TLS/https rather\nthan for ssh.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: sc7b3928295277d5dk\n"
    },
    {
      "commit": "00442413a2d0e6d6978982f9eeec0268e533ba56",
      "tree": "7cafceb162da7db94b4e13a848e512c2d2bfc797",
      "parents": [
        "7c58b02af6c7b7b2a8b237cdce6a3ff4c352401a"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Wed May 14 11:03:23 2025 -0700"
      },
      "committer": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Wed May 14 11:04:04 2025 -0700"
      },
      "message": "Log host URL in verbose mode.\n"
    },
    {
      "commit": "7c58b02af6c7b7b2a8b237cdce6a3ff4c352401a",
      "tree": "a73c5f8f8e57f6cc9117195c63aa434374c43e36",
      "parents": [
        "2044abb8f2f9d8bf4f42deb2b6c47b4ce847d6d1"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed May 14 17:30:39 2025 +0000"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed May 14 10:34:28 2025 -0700"
      },
      "message": "dockerimg: Use temp dir for temporary Dockerfile\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: s9af68b5763c2d5f0k\n"
    },
    {
      "commit": "3e9d80c6b6315ccf1754996e9b691555915d9839",
      "tree": "9772d13103aa61fe4ffee76c3d25a54f5bd22b66",
      "parents": [
        "84a8ae60f6553c409089095e6e3baa33075c4fd4"
      ],
      "author": {
        "name": "Sean McCullough",
        "email": "banksean@gmail.com",
        "time": "Tue May 13 23:35:23 2025 +0000"
      },
      "committer": {
        "name": "Sean McCullough",
        "email": "banksean@gmail.com",
        "time": "Tue May 13 17:03:37 2025 -0700"
      },
      "message": "dockerimg: update SSHTheater to use Ed25519 keys\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: sa8eb476bc38e0479k\n"
    },
    {
      "commit": "c31e29689eaf26e7904e074bf8dcb3f02150c1ac",
      "tree": "b935adaff69405877a3eb669550d1ea5d81f066a",
      "parents": [
        "7fb3499f45c55be818fe6d439fe61fa82ee59572"
      ],
      "author": {
        "name": "Pokey Rule",
        "email": "755842+pokey@users.noreply.github.com",
        "time": "Tue May 13 10:53:33 2025 +0000"
      },
      "committer": {
        "name": "Pokey Rule",
        "email": "755842+pokey@users.noreply.github.com",
        "time": "Tue May 13 10:54:18 2025 +0000"
      },
      "message": "dockerimg: print LLM output in verbose mode\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: s6f2e9c028be5b8b5k\n"
    },
    {
      "commit": "53b02a6f0c62a8df188fde4a79414099f9d0da95",
      "tree": "e8958aaffe7a251cc9975850543963448c23241f",
      "parents": [
        "ff2df6a1f379812b360f6f3d3e40e4b65aef369c"
      ],
      "author": {
        "name": "David Crawshaw",
        "email": "david@zentus.com",
        "time": "Mon May 12 14:46:29 2025 -0700"
      },
      "committer": {
        "name": "David Crawshaw",
        "email": "david@zentus.com",
        "time": "Mon May 12 15:12:02 2025 -0700"
      },
      "message": "dockerimg: more exacting prompt for building a dockerfile\n\nThis morning\u0027s claude moving target has forgotten how a Dockerfile\nworks, and it tries injecting direct shell into the file. Tell it\neverything should start with RUN.\n\nFor #83\nFor #85\n"
    },
    {
      "commit": "ff2df6a1f379812b360f6f3d3e40e4b65aef369c",
      "tree": "3245cee772c43f37919c81820bda6286ed317130",
      "parents": [
        "39bcf01eb98e2949d383b65d1651bf804308cc0f"
      ],
      "author": {
        "name": "David Crawshaw",
        "email": "david@zentus.com",
        "time": "Mon May 12 14:45:29 2025 -0700"
      },
      "committer": {
        "name": "David Crawshaw",
        "email": "david@zentus.com",
        "time": "Mon May 12 14:45:33 2025 -0700"
      },
      "message": "dockerimg: improve errors if dockerfile fails to build\n\nUpdates #83\n"
    },
    {
      "commit": "a9a786b458e989a1ea2d6e8e2b35fb24b79de2cf",
      "tree": "38e4d49a92543141ab9864d580bd237ab0fd5170",
      "parents": [
        "e31d2a95da49b58cabe4675335c2de80039007ec"
      ],
      "author": {
        "name": "Pokey Rule",
        "email": "755842+pokey@users.noreply.github.com",
        "time": "Mon May 12 10:52:34 2025 +0100"
      },
      "committer": {
        "name": "Pokey Rule",
        "email": "755842+pokey@users.noreply.github.com",
        "time": "Mon May 12 11:21:29 2025 +0100"
      },
      "message": "dockerimg: Fix development version detection when run with -C flag\n\nWhen running sketch with the `-C` flag to change directories, the check for\ndevelopment version should happen in the sketch directory, not the\ntarget directory.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\n"
    },
    {
      "commit": "72252cbcb97840d724133be67c4c69cc69ebb2d3",
      "tree": "a361499dc3fa6b9af2be3e74cfd59fd8ba34690e",
      "parents": [
        "7ce5fb76d8748ebf73c5adf9d6cd8eb67716fba8"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Sat May 10 17:00:08 2025 -0700"
      },
      "committer": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Sat May 10 17:00:08 2025 -0700"
      },
      "message": "llm and everything: Update ToolResult to use []Content instead of string for multimodal support\n\nThis was a journey. The sketch-generated summary below is acceptable,\nbut I want to tell you about it in my voice too. The goal was to send\nscreenshots to Claude, so that it could... look at them. Currently\nthe take screenshot and read screenshot tools are different, and they\u0027ll\nneed to be renamed/prompt-engineered a bit, but that\u0027s all fine.\n\nThe miserable part was that we had to change the return value\nof tool from string to Content[], and this crosses several layers:\n - llm.Tool\n - llm.Content\n - ant.Content \u0026 openai and gemini friends\n - AgentMessage [we left this alone]\n\nExtra fun is that Claude\u0027s API for sending images has nested Content\nfields, and empty string and missing needs to be distinguished for the\nText field (because lots of shell commands return the empty string!).\n\nFor the UI, I made us transform the results into a string, dropping\nimages. This would have been yet more churn for not much obvious\nbenefit. Plus, it was going to break skaband\u0027s compatibility, and ...\nyet more work.\n\nOpenAI and Gemini don\u0027t obviously support images in this same way,\nso they just don\u0027t get the tools.\n\n~~~~~~~~~~ Sketch said:\n\nThis architectural change transforms tool results from plain strings to []Content arrays, enabling multimodal interaction in the system. Key changes include:\n\n- Core structural changes:\n  - Modified ToolResult type from string to []Content across all packages\n  - Added MediaType field to Content struct for MIME type support\n  - Created TextContent and ImageContent helper functions\n  - Updated all tool.Run implementations to return []Content\n\n- Image handling:\n  - Implemented base64 image support in Anthropic adapter\n  - Added proper media type detection and content formatting\n  - Created browser_read_image tool for displaying screenshots\n  - Updated browser_screenshot to provide usable image paths\n\n- Adapter improvements:\n  - Updated all LLM adapters (ANT, OAI, GEM) to handle content arrays\n  - Added specialized image content handling in the Anthropic adapter\n  - Ensured proper JSON serialization/deserialization for all content types\n  - Improved test coverage for content arrays\n\n- UI enhancements:\n  - Added omitempty tags to reduce JSON response size\n  - Updated TypeScript types to handle array content\n  - Made field naming consistent (tool_error vs is_error)\n  - Preserved backward compatibility for existing consumers\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: s1a2b3c4d5e6f7g8h\n"
    },
    {
      "commit": "51e8e2b0c970ef488094a33b3c259583fe142dc5",
      "tree": "6ecd15e35a40aece2c24231a0540466c7117292d",
      "parents": [
        "d03318d51ca1e707698f1aab8d18ed83fc159cbe"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Fri May 09 21:41:12 2025 +0000"
      },
      "committer": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Fri May 09 15:06:33 2025 -0700"
      },
      "message": "dockerimg: Run git fetch when .git/info/refs is requested\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: sca37f0dfd43f13e9k\n"
    },
    {
      "commit": "078e85ae683cfcb6f0cc45dfbb7dd02aafec0046",
      "tree": "750dbf13e8d47fefc1566a9922e7a393a0661b9c",
      "parents": [
        "15c9528318131e8b903199fa7dfe82dbe7b2ed91"
      ],
      "author": {
        "name": "Sean McCullough",
        "email": "banksean@gmail.com",
        "time": "Thu May 08 17:28:34 2025 -0700"
      },
      "committer": {
        "name": "Sean McCullough",
        "email": "banksean@gmail.com",
        "time": "Thu May 08 17:28:34 2025 -0700"
      },
      "message": "ssh_theater: only edit conf if host doesn\u0027t resolve\n"
    },
    {
      "commit": "15c9528318131e8b903199fa7dfe82dbe7b2ed91",
      "tree": "15997f3dd5578e975288f30b5659e95b4c84c3bf",
      "parents": [
        "220a36d6404a3a86af2537ca8572b9e28c77bcb6"
      ],
      "author": {
        "name": "Sean McCullough",
        "email": "banksean@gmail.com",
        "time": "Thu May 08 16:48:38 2025 -0700"
      },
      "committer": {
        "name": "Sean McCullough",
        "email": "banksean@gmail.com",
        "time": "Thu May 08 16:48:38 2025 -0700"
      },
      "message": "ssh_theater: ask the user before editing config\n"
    },
    {
      "commit": "4936de3834a2c70db563d19975c072bb42d953cc",
      "tree": "b4e4e9eb513236636c523ca70d7e2983157af156",
      "parents": [
        "593ca6455ea14bf48f6ae4ff6f5d3296c6befa7b"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed May 07 13:50:04 2025 +0000"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed May 07 14:02:13 2025 -0700"
      },
      "message": "all: make update_tests.sh scripts location-independent\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\n"
    },
    {
      "commit": "31f152493929b3b171c140c2e0e22dbcf9059cac",
      "tree": "80eefea2e5f1977e89d7bec71efc0c85562bc77d",
      "parents": [
        "4962f153fa0d6812543addd690be8dba8c04a406"
      ],
      "author": {
        "name": "David Crawshaw",
        "email": "david@zentus.com",
        "time": "Tue May 06 16:03:49 2025 -0700"
      },
      "committer": {
        "name": "David Crawshaw",
        "email": "david@zentus.com",
        "time": "Tue May 06 16:10:02 2025 -0700"
      },
      "message": "dockerimg: always show build output\n\nThe previous --progress\u003dplain was a bit too quiet, it also depended\non installing buildx which brew does not do by default.\n"
    },
    {
      "commit": "33d282f80db786cc60ba521a38ed5166f23239ed",
      "tree": "9ed1f15c6d3081d5bef7d16b9d72e78a2c7780cf",
      "parents": [
        "a9d87aa69cfefdc91ec7aaa6bc42907749748e76"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Sat May 03 04:01:54 2025 +0000"
      },
      "committer": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Tue May 06 10:23:39 2025 -0700"
      },
      "message": "Add browse tool support.\n\nI reviewed some MCPs (using OpenAI\u0027s deep research to help), and it\nhelped me choose chromedp as the relevant library and helped me come up\nwith an interface. This commit adds chrome to the Docker image which is\nkind of big. (I\u0027ve noticed that it\u0027s smaller on Ubuntu, where it doesn\u0027t\npull in X11.) go-playwright was a library contender as well.\n\nImplement browser automation tooling using chromedp\n\nThis implementation adds browser automation capabilities to the system via the chromedp library,\nenabling Claude to interact with web content effectively.\n\nKey features include:\n\n1. Core browser automation functionality:\n   - Created new browsertools package in claudetool/browser\n   - Implemented tools for navigating, clicking, typing, waiting for elements,\n     getting text, evaluating JavaScript, taking screenshots, and scrolling\n   - Added lazy browser initialization that defers until first use\n   - Integrated with the agent to expose these tools to Claude\n\n2. Screenshot handling and display:\n   - Implemented screenshot storage with UUID-based IDs in /tmp/sketch-screenshots\n   - Added endpoint to serve screenshots via /screenshot/{id}\n   - Created dedicated UI component for displaying screenshots\n   - Ensured proper responsive design with loading states and error handling\n   - Fixed URL paths for proper rehomed URL support\n   - Modified tool calls component to auto-expand screenshot results\n\n3. Error handling and reliability:\n   - Added graceful error handling for browser initialization failures\n   - Implemented proper cleanup of browser resources\n\nThe browser automation tools provide a powerful way for Claude to interact with web content,\nmaking it possible to scrape data, test web applications, and automate web-based tasks.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\n"
    },
    {
      "commit": "b1cca6f19bf38a7c22793648012598b6a2baf9fb",
      "tree": "82af4bf88162497862d862b8831fdd12820fd26f",
      "parents": [
        "29fea840fbe3c279e1480d5f78cff4be697b7ca5"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Tue May 06 01:52:55 2025 +0000"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Mon May 05 18:54:20 2025 -0700"
      },
      "message": "dockerimg: pass -x flag to inner sketch to enable experimental features\n\nThe -x flag needs to be passed from the outer sketch process to the inner sketch process\nto ensure experimental features are correctly enabled across both processes.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e"
    },
    {
      "commit": "3659d8714d31bad050d36043b67efd76a8d53b77",
      "tree": "2803c54c63628e397e63bdbbe4fa2647a4d5f556",
      "parents": [
        "021557a7d33dacd4fedb9a4677fc93c48569d57a"
      ],
      "author": {
        "name": "David Crawshaw",
        "email": "david@zentus.com",
        "time": "Mon May 05 17:52:23 2025 -0700"
      },
      "committer": {
        "name": "David Crawshaw",
        "email": "david@zentus.com",
        "time": "Mon May 05 17:52:27 2025 -0700"
      },
      "message": "all: more gemini key plumbing\n"
    },
    {
      "commit": "5a7b3698b523365fe070ffcd1019c704c2c3a7b5",
      "tree": "1b90d8fd84b6e9c24a6a131e1a89afc4416e0b52",
      "parents": [
        "f53875fa18db64d5fa73f3b163314c1bb021db34"
      ],
      "author": {
        "name": "David Crawshaw",
        "email": "david@zentus.com",
        "time": "Mon May 05 16:49:15 2025 -0700"
      },
      "committer": {
        "name": "David Crawshaw",
        "email": "david@zentus.com",
        "time": "Mon May 05 16:50:08 2025 -0700"
      },
      "message": "cmd/sketch, dockerimg: more gemini key plumbing\n\nNext up: SKETCH_* env vars\n\nFor #60\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": "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": "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": "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": "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": "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": "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": "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": "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": "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": "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": "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": "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": "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": "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": "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": "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": "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": "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": "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": "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": "0dcebe1bf2ec5d6f85aa71fb46367e2adf8f4947",
      "tree": "03bb39dc484e95c56f9dd5b4a6c75aa295736cdd",
      "parents": [
        "fefde5770a9f6484e23c926b408f86ca8aa388ae"
      ],
      "author": {
        "name": "Pokey Rule",
        "email": "755842+pokey@users.noreply.github.com",
        "time": "Mon Apr 28 14:51:04 2025 +0100"
      },
      "committer": {
        "name": "Pokey Rule",
        "email": "755842+pokey@users.noreply.github.com",
        "time": "Mon Apr 28 14:51:04 2025 +0100"
      },
      "message": "Add support for passing prompt without -one-shot\n\nAdded `-prompt` option\n"
    },
    {
      "commit": "5bff650e0d5603dc77efccb4b4610648aa83cbf6",
      "tree": "5475e933d40bb3577c01952772d0f49301d37b60",
      "parents": [
        "1112949adc2bb120a001a925c0c4e9e18def0ee6"
      ],
      "author": {
        "name": "David Crawshaw",
        "email": "david@zentus.com",
        "time": "Sat Apr 26 09:11:40 2025 -0700"
      },
      "committer": {
        "name": "David Crawshaw",
        "email": "david@zentus.com",
        "time": "Sat Apr 26 09:11:40 2025 -0700"
      },
      "message": "fix oddball formatter complaints\n"
    },
    {
      "commit": "1112949adc2bb120a001a925c0c4e9e18def0ee6",
      "tree": "591396d3d0932a475dc1db5d79b2b96b649daaba",
      "parents": [
        "5fdd024fa3d3df5fe5a2c216672d912b6aade60a"
      ],
      "author": {
        "name": "David Crawshaw",
        "email": "david@zentus.com",
        "time": "Fri Apr 25 20:41:53 2025 -0700"
      },
      "committer": {
        "name": "David Crawshaw",
        "email": "david@zentus.com",
        "time": "Fri Apr 25 20:43:00 2025 -0700"
      },
      "message": "dockerimg: use a default image from a public registry\n\nIf the LLM chooses our default alpine Go image, we save some\nwork by instead starting from a sketch docker image pushed\nto ghcr.io.\n"
    },
    {
      "commit": "b74c4f6e1c93afca3d37a6b68c717d41a51fa612",
      "tree": "8e5c31de6634a56bec23e026d8fd8515d92eb173",
      "parents": [
        "833a0f83af52be33eed3baf0f67ffa3ddab55cb4"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip.zeyliger@gmail.com",
        "time": "Fri Apr 25 19:18:49 2025 -0700"
      },
      "committer": {
        "name": "Philip Zeyliger",
        "email": "philip.zeyliger@gmail.com",
        "time": "Fri Apr 25 19:38:09 2025 -0700"
      },
      "message": "make -one-shot command line work with both -unsafe and regular\n\nThe \"-one\" option had atrophied in a variety of ways, against both\nunsafe and dockerized environments. I resurrected it, and simplified\nthe flag handling slightly by using just one flag.\n"
    },
    {
      "commit": "0cbd976940708c94eb8b644b14bfda3f19087997",
      "tree": "c52d063201ece6aa1b9691e2dac5a5d31ceab1a3",
      "parents": [
        "33f717263a1b7172ed8e0182481adb1b1ededb7a"
      ],
      "author": {
        "name": "Sean McCullough",
        "email": "banksean@gmail.com",
        "time": "Fri Apr 25 16:30:20 2025 -0700"
      },
      "committer": {
        "name": "Sean McCullough",
        "email": "banksean@gmail.com",
        "time": "Fri Apr 25 16:30:20 2025 -0700"
      },
      "message": "rename a file that was driving me crazy\n"
    },
    {
      "commit": "33f717263a1b7172ed8e0182481adb1b1ededb7a",
      "tree": "6c3e212689dc203318fff3d4be6e6a5eb750f226",
      "parents": [
        "2cba69514b40c49a7a71102962b917c8a9eb4194"
      ],
      "author": {
        "name": "Autoformatter",
        "email": "bot@sketch.dev",
        "time": "Fri Apr 25 23:23:22 2025 +0000"
      },
      "committer": {
        "name": "Autoformatter",
        "email": "bot@sketch.dev",
        "time": "Fri Apr 25 23:23:22 2025 +0000"
      },
      "message": "all: fix formatting\n"
    },
    {
      "commit": "2cba69514b40c49a7a71102962b917c8a9eb4194",
      "tree": "b623b2f6dca84a875a40758361617111b724edda",
      "parents": [
        "6f2bf8aa1d1105d292b8fb7961fc30b41d15cc79"
      ],
      "author": {
        "name": "Sean McCullough",
        "email": "banksean@gmail.com",
        "time": "Fri Apr 25 20:32:10 2025 +0000"
      },
      "committer": {
        "name": "Sean McCullough",
        "email": "banksean@gmail.com",
        "time": "Fri Apr 25 16:19:49 2025 -0700"
      },
      "message": "Add unit tests for dockerimg/sshtheater.go with refactoring for testability\n\nRefactored the code to use dependency injection to make it more testable, including:\n- Created FileSystem and KeyGenerator interfaces\n- Added RealFileSystem and RealKeyGenerator implementations\n- Refactored SSHTheater to use these interfaces\n- Added comprehensive unit tests for all functionality\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\n"
    },
    {
      "commit": "6f2bf8aa1d1105d292b8fb7961fc30b41d15cc79",
      "tree": "87b89de8e93958c878f92bafeb32e67d0f407134",
      "parents": [
        "5c70bfe5601e9919e598025ac56984e1b2e21040"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip.zeyliger@gmail.com",
        "time": "Fri Apr 25 15:29:46 2025 -0700"
      },
      "committer": {
        "name": "Philip Zeyliger",
        "email": "philip.zeyliger@gmail.com",
        "time": "Fri Apr 25 15:32:56 2025 -0700"
      },
      "message": "sketch: fix double space in SSH warning\n"
    },
    {
      "commit": "df2d3dccd3f2f97fd4b8ab3bd153fbef15becea0",
      "tree": "fd3749e53b40131d8b9e6da9045c59fbcbc31ef2",
      "parents": [
        "6e42f32893e061a36f67aa0abbb8c62b402262c2"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Fri Apr 25 12:31:35 2025 -0700"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Fri Apr 25 13:23:52 2025 -0700"
      },
      "message": "dockerimg: add extra space for terminals that render emojis wide"
    },
    {
      "commit": "176a5105d3f5e515ea782b054f1ab853a8afc399",
      "tree": "591e6bd3eebe72b4706a86977ff29c23dcdd72de",
      "parents": [
        "6bc2eb24313de1455fc5b6c2ea231b86fb5d1329"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip.zeyliger@gmail.com",
        "time": "Thu Apr 24 20:32:37 2025 -0700"
      },
      "committer": {
        "name": "Philip Zeyliger",
        "email": "philip.zeyliger@gmail.com",
        "time": "Fri Apr 25 11:43:58 2025 -0700"
      },
      "message": "Add force-rebuild flag to allow user to rebuild docker container explicitly.\n"
    },
    {
      "commit": "f5e28f67b3f569c73b1b020b5783872371bd0c3c",
      "tree": "174b42b12dadc6bbd96257aa0f7cdde722d09609",
      "parents": [
        "faa39bec76f463c0e2c9b06f567a596d47af0d50"
      ],
      "author": {
        "name": "Sean McCullough",
        "email": "banksean@gmail.com",
        "time": "Fri Apr 25 10:48:00 2025 -0700"
      },
      "committer": {
        "name": "Sean McCullough",
        "email": "banksean@gmail.com",
        "time": "Fri Apr 25 10:48:00 2025 -0700"
      },
      "message": "sshtheater: check for Include line in ~/.ssh/config\n"
    },
    {
      "commit": "7d5a6301a256823ab4b26a68dbd166f0d0737409",
      "tree": "99abfc40814eb152f9e3442d7f75ef8a5e306002",
      "parents": [
        "4854c6535a320f6fbfe8baee02af509367e4236c"
      ],
      "author": {
        "name": "Sean McCullough",
        "email": "banksean@gmail.com",
        "time": "Thu Apr 24 21:27:51 2025 -0700"
      },
      "committer": {
        "name": "Sean McCullough",
        "email": "banksean@gmail.com",
        "time": "Thu Apr 24 21:29:46 2025 -0700"
      },
      "message": "SSHTheater: fix known_hosts update issue\n"
    },
    {
      "commit": "4854c6535a320f6fbfe8baee02af509367e4236c",
      "tree": "6ef13e82fb6597c443b31c350af8e390a8d0062f",
      "parents": [
        "53786efbbbb2fbc3edb91ba639894e713b293140"
      ],
      "author": {
        "name": "Sean McCullough",
        "email": "banksean@gmail.com",
        "time": "Thu Apr 24 18:37:02 2025 -0700"
      },
      "committer": {
        "name": "Sean McCullough",
        "email": "banksean@gmail.com",
        "time": "Thu Apr 24 20:49:55 2025 -0700"
      },
      "message": "dockerimg: +SSHTheater, auto-configures local ssh\n\n- removes the old cli flags for pointing sketch at existing ssh key files\n- generates key pairs for both the container ssh server and the user if\n  these don\u0027t already exist in ~/.sketch/\n- automatically edits ~/.sketch/known_hosts and ~/.sketch/ssh_config to\n  add entries when you start a sketch container and remove them when you\u0027re\n  done\n- does not make any edits to default ~/.ssh/config files, so you\u0027ll have\n  to manually add line to you default ssh config file like:\n  `Include HOME_DIR/.sketch/ssh_config`\n  in order to have your ssh tools pick up what sketch is putting down.\n"
    },
    {
      "commit": "53786efbbbb2fbc3edb91ba639894e713b293140",
      "tree": "1442ed25c365a61cd35f9c2a0052cebb6fa66083",
      "parents": [
        "f91095a6a873a4d2faa91d075e93abd4761bc7b5"
      ],
      "author": {
        "name": "David Crawshaw",
        "email": "david@zentus.com",
        "time": "Thu Apr 24 12:52:51 2025 -0700"
      },
      "committer": {
        "name": "David Crawshaw",
        "email": "david@zentus.com",
        "time": "Thu Apr 24 12:52:55 2025 -0700"
      },
      "message": "dockerimg: use emoji in container debug info\n\nThis should potentially be removed (or moved to --verbose) but I am\nstill using it semi-reguarly during debugging.\nShould probably be removed in a few weeks by default.\n"
    },
    {
      "commit": "094e4d291369d5a04375e1fd9c95f17a236532a0",
      "tree": "f9321e4ecaf73a0d764225012847f8ef6916fd9f",
      "parents": [
        "1d06132f5a79950ab8a64eb72219363fb63ca92f"
      ],
      "author": {
        "name": "David Crawshaw",
        "email": "david@zentus.com",
        "time": "Thu Apr 24 11:35:14 2025 -0700"
      },
      "committer": {
        "name": "David Crawshaw",
        "email": "david@zentus.com",
        "time": "Thu Apr 24 11:35:17 2025 -0700"
      },
      "message": "cmd/sketch, dockerimg: remove unhelpful initial debug messages\n"
    },
    {
      "commit": "7660e4e48978ed32452ed444514238c41c27c0c9",
      "tree": "ae9c6be37e2c2d4b593d5cc75eeb73457d911771",
      "parents": [
        "fe3e9f7d8480ea2ed8cfa68a310a7d8bf6162160"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Thu Apr 24 10:34:17 2025 -0700"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Thu Apr 24 10:34:17 2025 -0700"
      },
      "message": "dockerimg: use more modern APIs\n\n- bytes.Lines instead of bufio.NewScanner\n- bytes.CutPrefix instead of HasPrefix/TrimPrefix\n\nSimpler, cheaper.\n\nThere is a slight change in that bytes.Lines includes the\ntrailing newline, and bufio.Scanner does not.\nBut we only do prefix work to start, and then we do a TrimSpace,\nso this ends up being a wash.\n"
    },
    {
      "commit": "6ed6adbe65a26268ef8f74c99b4bc777417f500c",
      "tree": "9083c17b22b0a699556b20f660bd3911fffd4c22",
      "parents": [
        "5d6af87c7c4f2ccdfe9d2ba2d0d74356b213d1d5"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip.zeyliger@gmail.com",
        "time": "Wed Apr 23 19:56:38 2025 -0700"
      },
      "committer": {
        "name": "Philip Zeyliger",
        "email": "philip.zeyliger@gmail.com",
        "time": "Wed Apr 23 19:56:38 2025 -0700"
      },
      "message": "Fix -open to point to skaband addr when configured for the container case\n\nWe were opening on the skaband address if using -unsafe but\nnot doing the same in the container case.\n"
    },
    {
      "commit": "5d6af87c7c4f2ccdfe9d2ba2d0d74356b213d1d5",
      "tree": "79ccaf9095d50c100935d05af3158e018fe537ac",
      "parents": [
        "2032b1c1971ceb85ca14b20273a3783729fba3e3"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip.zeyliger@gmail.com",
        "time": "Wed Apr 23 19:48:34 2025 -0700"
      },
      "committer": {
        "name": "Philip Zeyliger",
        "email": "philip.zeyliger@gmail.com",
        "time": "Wed Apr 23 19:48:34 2025 -0700"
      },
      "message": "Only print Dockerfile in verbose mode\n\nThis is sneaky because verbose controls where stdout/stderr goes, for\nbetter or worse.\n"
    },
    {
      "commit": "2032b1c1971ceb85ca14b20273a3783729fba3e3",
      "tree": "0486e9222643ffcbbd34286148f4a7913a169668",
      "parents": [
        "4f50a68ac73677c0022b2b3da8b4667cee01c11b"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip.zeyliger@gmail.com",
        "time": "Wed Apr 23 19:40:42 2025 -0700"
      },
      "committer": {
        "name": "Philip Zeyliger",
        "email": "philip.zeyliger@gmail.com",
        "time": "Wed Apr 23 19:40:42 2025 -0700"
      },
      "message": "Move webui from /loop/webui to /webui\n\nThanks, perl (and git mv):\n\n\tperl -pi -e s,loop/webui,webui,g $(git grep -l loop/webui)\n"
    },
    {
      "commit": "cc3ba220373b62dd5a098180ea6797af76407525",
      "tree": "f2e5dcea13fb8da2b652d79d7f5f0bf762c8a395",
      "parents": [
        "18532b212b8c108cc1c8bfcbaf5804a5c4156655"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip.zeyliger@gmail.com",
        "time": "Wed Apr 23 14:52:21 2025 -0700"
      },
      "committer": {
        "name": "Philip Zeyliger",
        "email": "philip.zeyliger@gmail.com",
        "time": "Wed Apr 23 19:28:10 2025 -0700"
      },
      "message": "sketch: Add python3 to our container image\n"
    },
    {
      "commit": "18532b212b8c108cc1c8bfcbaf5804a5c4156655",
      "tree": "3667714104cdd0bc0f8078a0ea619676e0764c7f",
      "parents": [
        "d013131a2892d175fcecc270d51e526c617dc170"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip.zeyliger@gmail.com",
        "time": "Wed Apr 23 21:11:46 2025 +0000"
      },
      "committer": {
        "name": "Philip Zeyliger",
        "email": "philip.zeyliger@gmail.com",
        "time": "Wed Apr 23 19:28:10 2025 -0700"
      },
      "message": "Rename Host/Runtime hostname fields to Outside/Inside pattern\n\nThis renames all hostname/OS/working directory fields to follow the\nOutside/Inside naming pattern rather than Host/Runtime naming pattern.\n\n- HostHostname -\u003e OutsideHostname\n- RuntimeHostname -\u003e InsideHostname\n- HostOS -\u003e OutsideOS\n- RuntimeOS -\u003e InsideOS\n- HostWorkingDir -\u003e OutsideWorkingDir\n- RuntimeWorkingDir -\u003e InsideWorkingDir\n\nThis includes related method names, struct fields, and JavaScript properties.\n\nCo-Authored-By: sketch\n"
    },
    {
      "commit": "d013131a2892d175fcecc270d51e526c617dc170",
      "tree": "60e67016511ba28c67848ed84cc99e65467712ed",
      "parents": [
        "e4fa0e35235147cc76c7011f7aa91fa03a5b05bc"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip.zeyliger@gmail.com",
        "time": "Wed Apr 23 21:14:01 2025 +0000"
      },
      "committer": {
        "name": "Philip Zeyliger",
        "email": "philip.zeyliger@gmail.com",
        "time": "Wed Apr 23 19:22:24 2025 -0700"
      },
      "message": "Use bufio.Scanner instead of strings.Split for line iteration\n\nImprove efficiency when iterating over log lines by using bufio.Scanner\ninstead of splitting the entire log string and then iterating over it.\n\nCo-Authored-By: sketch\n"
    },
    {
      "commit": "e4fa0e35235147cc76c7011f7aa91fa03a5b05bc",
      "tree": "5043a0cdd1c1222e01aaf255cffd7d8f659ee49d",
      "parents": [
        "ae3480fee8b8ebf867a1097868d0032ff4b51324"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip.zeyliger@gmail.com",
        "time": "Wed Apr 23 14:15:55 2025 -0700"
      },
      "committer": {
        "name": "Philip Zeyliger",
        "email": "philip.zeyliger@gmail.com",
        "time": "Wed Apr 23 19:22:24 2025 -0700"
      },
      "message": "sketch: print Dockerfile contents\n\nIt\u0027s a bit of inside baseball, but building the Docker image\nis slow enough that it\u0027d be nice to stare at what it\u0027s doing,\neven in the simplest form.\n"
    },
    {
      "commit": "ae3480fee8b8ebf867a1097868d0032ff4b51324",
      "tree": "468d02673f8e9fff21fd33d9a343ef4125d646ac",
      "parents": [
        "5544d146e1ebe2747ae282e611f8d0a2c23f2b6c"
      ],
      "author": {
        "name": "Sean McCullough",
        "email": "banksean@gmail.com",
        "time": "Wed Apr 23 15:28:20 2025 -0700"
      },
      "committer": {
        "name": "Sean McCullough",
        "email": "banksean@gmail.com",
        "time": "Wed Apr 23 15:57:49 2025 -0700"
      },
      "message": "allow random (ephemeral) host ports for ssh server\n\nalso fixes an issue with authorized_keys files that\ncontain multiple pks: it now checks all of them not\njust the first one it parses.\n"
    },
    {
      "commit": "5544d146e1ebe2747ae282e611f8d0a2c23f2b6c",
      "tree": "23af22bf29c6df663dda31b35d88e04a2a6ba60b",
      "parents": [
        "73db6056606c17e78973e124681a86754ed466d9"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed Apr 23 14:15:45 2025 -0700"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed Apr 23 14:16:45 2025 -0700"
      },
      "message": "dockerimg: clean up linux binary"
    },
    {
      "commit": "baa2b590cc3a5f63bc52c3324f2835666b9ae450",
      "tree": "69b313aab41b2f3d3cd27c72ce7d09f6b6453aa6",
      "parents": [
        "97188fc1955f036e57c42a2f345b3c01fc5f0dc0"
      ],
      "author": {
        "name": "Sean McCullough",
        "email": "banksean@gmail.com",
        "time": "Wed Apr 23 10:40:08 2025 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Apr 23 10:40:08 2025 -0700"
      },
      "message": "sketch: initial container ssh support (#15)\n\nAdds an in-process ssh server to the sketch agent running inside\nthe container.\n\nThe ssh server implementation uses https://github.com/gliderlabs/ssh/\n\nThis change does not automatically generate any keys (this may come later).\nYou specify the server identity private key and the user\u0027s authorized public\nkeys on the sketch command line.\n\nThe host sketch process reads these files from the cli flags at startup. Once\nthe container is launched, it passes these keys to to the container\nsketch process via new /init POST body fields."
    }
  ],
  "next": "d140295fa7d794f5b30feb4eee2f45f9cc9ff383"
}
