)]}'
{
  "log": [
    {
      "commit": "15cc2e75ed6dc840c78bc7f2b2075d40d5f22470",
      "tree": "a579c6d3b89f8f0fa3d2c705f6ca4140a92918e9",
      "parents": [
        "e84d5c7972cb24586842473e62668ca9c689d6d2"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Fri May 30 16:02:11 2025 +0000"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Fri May 30 11:41:51 2025 -0700"
      },
      "message": "cmd/sketch: add -p flag as synonym for -prompt\n\nAdd a shorthand -p flag that provides the same functionality as the\nexisting -prompt flag for improved command-line usability.\n\nImplementation:\n- Added flag.StringVar for -p flag pointing to the same prompt field\n- Both flags are functionally equivalent and can be used interchangeably\n- Standard Go flag behavior applies: when both flags are used, last one wins\n- Help text clearly indicates -p is an alias for -prompt\n\nThis change provides users with a more convenient way to specify prompts\nwithout changing any existing functionality or breaking compatibility.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: s3baf82e835ea6829k\n"
    },
    {
      "commit": "7871e2fd09acf3790cc292d955cdd8fee86f2fdb",
      "tree": "4b6d2b2cde2a75144d7892dc80b6d19369872805",
      "parents": [
        "855afffc57824d79d25c432bb850474fcfffd4d3"
      ],
      "author": {
        "name": "Autoformatter",
        "email": "bot@sketch.dev",
        "time": "Fri May 30 15:58:50 2025 +0000"
      },
      "committer": {
        "name": "Autoformatter",
        "email": "bot@sketch.dev",
        "time": "Fri May 30 15:58:50 2025 +0000"
      },
      "message": "all: fix formatting\n"
    },
    {
      "commit": "b421a24f862d91101b9e5b4738f93693e18672eb",
      "tree": "2ccccb673504f5d5d3ca689816e95c92fd3c3041",
      "parents": [
        "00bcaef0355aaff1daea17ac0631fd17cabb0235"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Thu May 29 23:22:55 2025 +0000"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Fri May 30 08:58:07 2025 -0700"
      },
      "message": "all: remove anthropic edit tool support\n\nThe Anthropic str_replace_editor tool implementation has rotted;\nit would require a bit of work to upgrade it for Claude 4.\n\nRemove it for now.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: s6129e8703301600dk"
    },
    {
      "commit": "112b92376c97b8da64cc1c954896957cfc479f3d",
      "tree": "1497eb8b2927f1334d712aabb19625db11a148bf",
      "parents": [
        "d203b7de7d49cc5da03440d5a00b2efd0f8bb2c8"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Fri May 23 11:26:33 2025 -0700"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Thu May 29 12:50:41 2025 -0700"
      },
      "message": "loop: add todo checklist\n\nThis should improve Sketch\u0027s executive function and user communication."
    },
    {
      "commit": "12989b0cf7cb542f1286d53c3dce86ae1d56773b",
      "tree": "70b7cde65a4378b532c498725099a8a6380d74e6",
      "parents": [
        "4acf00626f50c342dc35f8525732074cf10e4d1a"
      ],
      "author": {
        "name": "Pokey Rule",
        "email": "755842+pokey@users.noreply.github.com",
        "time": "Fri May 23 11:27:47 2025 +0100"
      },
      "committer": {
        "name": "Pokey Rule",
        "email": "755842+pokey@users.noreply.github.com",
        "time": "Fri May 23 11:27:47 2025 +0100"
      },
      "message": "fix: read API key from environment in host mode when not using skaband\n\nWhen running sketch in the default container mode with -skaband-addr\u003d,\nthe system was failing with \u0027x-api-key header is required\u0027 because the\nrunInHostMode function wasn\u0027t reading the ANTHROPIC_API_KEY environment\nvariable when skaband wasn\u0027t being used.\n\nThis change adds the missing logic to read the API key from environment\nvariables (ANTHROPIC_API_KEY for claude, or GEMINI_API_KEY for gemini)\nwhen skabandAddr is empty, matching the behavior in runInUnsafeMode.\n\nThe fix ensures that commands like:\nenvdir /path/to/env go run ./cmd/sketch -skaband-addr\u003d -prompt \u0027task\u0027\nnow work correctly by passing the API key to the Docker container\u0027s\ndockerfile creation process.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: s592f0c893cafc931k\n"
    },
    {
      "commit": "716bfee93847e19465723af2d7c553d23c9984df",
      "tree": "6a14fd9aa287ec8fe7a1b50655a3a864151da43d",
      "parents": [
        "bc8c8dc5bc7abca6fa523c5ca45c9fd2c09384c2"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Wed May 21 18:32:31 2025 -0700"
      },
      "committer": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Wed May 21 18:32:31 2025 -0700"
      },
      "message": "Fix agent init of git repo from recent change.\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": "272a90ee1a74bda5618d4866e03f4b7067947784",
      "tree": "9baf4f84ce80b1c7073a95b6959f6dd11ab3b48b",
      "parents": [
        "d3ac112a45111abf0e57c327d55e2cc66a136abb"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Fri May 16 14:49:51 2025 -0700"
      },
      "committer": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Fri May 16 14:51:40 2025 -0700"
      },
      "message": "Add Monaco diff-view, the saga ...\n\nI set out to use Monaco to support the diff view. diff2html is lovely,\nbut there were a ton of usability improvements I wanted to make (line\nnumbers not making things double spaced, choosing which diff, editing\nthe right-hand side), and it seemed a dead end. Furthermore, Phabricator\nand Gerrit\u0027s experience is that diffs should be shown file by file,\nbecause you\u0027ll inevitably see a diff with a file that\u0027s too large, and\nthe GitHub PR view often breaks on big changes... so I wanted to show\nfiles diff-by-diff, with \"infinite\" context when unchanged sections are\nexpanded. So...\n\nUltimately, all of this was sketch-coded over maybe 30 Sketch sessions.\nI threw away a lot of branches. My git reflog is a superfund site.\n\nPrompting whole-hog didn\u0027t work. Or, rather, it made significant\nprogress, but something very serious wouldn\u0027t work, and I couldn\u0027t\nfigure out what, and nor could Sketch.\n\nInstead, I started by adding a new webcomponent that was just a\nplaceholder. Then, using https://rodydavis.com/posts/lit-monaco-editor,\nI nudged Sketch into adding Monaco to it. Sketch pulled out:\n\n   You\u0027re right, I should properly read the blog post before implementing the\n   solution. Let me check the referenced blog post.\n\nI worked heavily in the demo environment at first, but here I ran into\nthe issue that we have two different esbuild systems: one is vite and\none is esbuild.go, and they\u0027re configured differently enough.\n\nMonaco is unusable and confusingly so when its CSS isn\u0027t loaded. The right\nway to load it, I\u0027ve found, is via\n\n  @import url(\u0027./static/monaco/min/vs/editor/editor.main.css\u0027);\n\nI spent more time than I care to admit noticing that originally\nthis wasn\u0027t relative, and when we use a skaband setting, the\npaths need to be relative-aware.\n\nThe paths to the various workers need to be similarly correctly placed.\n\nGetting Sketch to build demo data but not put testing code into production\ncode was tricky. (I threw away a lot of efforts and factories and singletons...)\n\nWhen I set out to do the git commit selection, I wanted to do a bunch of\nbackend /git/* handlers. These were easy enough to code in sketch. I had\nto convince Sketch to put them in git_tools.go and not in the agent.\nIt doesn\u0027t really matter: these functions to parse git are pretty stateless,\nbut it\u0027s less work to have them separate. Sketch was mediocre at writing\ntests for them. Did you know that our container has an older version\nof git that doesn\u0027t have the same options to decorate ref names? Yeah, nor did\nI.\n\nHandling unstaged changes was fun. git diff --raw shows unstaged files\nas having identity 0000. Ideally we\u0027d be using jj and there\u0027d be\na synthetic commit, but instead uncommitted-possible files are read\nby content.\n\nA real big challenge was getting the Monaco view to use the right vertical and\nhorizontal space. I did this many, many times. I don\u0027t claim to understand flex\nand the virtual dom, and :host, and all the interactions. It would fix one\nthing and break another. The chat window would shrink. The terminal would\nshrink.\n\nScreenshot support was excellent. I eventually added paste support just so\nthat I could expedite my workflow, and Sketch coded that easily on the first\npass with minor feedback.\n\nI learned the hard way that Safari\u0027s support for WebComponents/shadow\ndom in its web inspector is rough. See https://fediverse.zachleat.com/@zachleat/114518629612122858\n\nI also learned the hard way that Chrome doesn\u0027t use fonts loaded in CSS\nin a shadow dom. That\u0027s why the codicon font had to be in the global\nstyle sheet.\n\nKudos to John Reese who kindly allowed me, a long time ago, to adapt a\nshell script he had at work to look over diffs into https://github.com/philz/git-vimdiff.\nThat\u0027s the inspiration for having the \"new code\" be editable when you\u0027re\nreviewing it; why shouldn\u0027t it be!?!\n\nThere are a handful of follow up tasks:\n\n* We lose state when we switch to the Chat view and back.\n* Need URL-based support for where we are.\n* Maybe need shortcut keys to move between diffs and changes.\n* Maybe need caching or look-ahead for downloading the next or previous\n  file.\n* We spend too much vertical real estate on all the diff selections;\n  could we scroll it out of the way, collapse it, tighten it, etc.\n* The workers sometimes throw errors into the console. I think they\u0027re\n  harmless and merely need to be caught and suppressed.\n* Needing to commit changes when things are saved is weird. Should we\n  commit automatically? Amend the previous commit? Have a button for\n  that? Show the git dirty state?\n* Our JS bundle is big. We could maybe delay loading the monaco bundle\n  to help.\n\nThanks for coming to my TED talk.\n"
    },
    {
      "commit": "0ead54d4591b9de1dedb897302f3ffaf36454c8e",
      "tree": "aebc7418f3d60df3fcdafab155412f123454bb26",
      "parents": [
        "5eccd68ca894e5591bd6cc689bbb12b97a869464"
      ],
      "author": {
        "name": "David Crawshaw",
        "email": "david@zentus.com",
        "time": "Fri May 16 13:58:36 2025 -0700"
      },
      "committer": {
        "name": "David Crawshaw",
        "email": "david@zentus.com",
        "time": "Fri May 16 13:58:36 2025 -0700"
      },
      "message": "cmd/sketch: move NewSessionID function\n"
    },
    {
      "commit": "5eccd68ca894e5591bd6cc689bbb12b97a869464",
      "tree": "dde938683a329c38ecf657e585169b75479c8629",
      "parents": [
        "044a62e8e3d28a573c624d722f0fde38c30a19e2"
      ],
      "author": {
        "name": "David Crawshaw",
        "email": "david@zentus.com",
        "time": "Fri May 16 07:09:30 2025 -0700"
      },
      "committer": {
        "name": "David Crawshaw",
        "email": "david@zentus.com",
        "time": "Fri May 16 07:09:36 2025 -0700"
      },
      "message": "cmd/sketch: invert bool to fix open flag default behavior\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": "da796543d8e7087e428b1e55b8f70bc8edf206ae",
      "tree": "f68455c66d785be6099920e9c878883d84d79255",
      "parents": [
        "7bb1bf0dfe872ae2209308f6524edb206143b37e"
      ],
      "author": {
        "name": "Marc-Antoine Ruel",
        "email": "maruel@gmail.com",
        "time": "Wed May 14 08:20:11 2025 -0400"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed May 14 15:03:09 2025 -0700"
      },
      "message": "sketch: default -open\u003dfalse when SSH_CONNECTION is set, improve help\n\nI use sketch over ssh so I don\u0027t want a ton of web browsers window open remotely."
    },
    {
      "commit": "2044abb8f2f9d8bf4f42deb2b6c47b4ce847d6d1",
      "tree": "2c498d749cec371399e8fe1d725f935eaa945298",
      "parents": [
        "c0a1e53bae35673dc77d69ba936f064439e25e1c"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed May 14 17:31:20 2025 +0000"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed May 14 10:33:19 2025 -0700"
      },
      "message": "cmd/sketch: increase default budget from  to 0\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: s512e21ba98e811ddk\n"
    },
    {
      "commit": "49edc92f95cab092a7ee62c350c6e69275b50cc8",
      "tree": "946b8359f6187ed630c4d08fa05e91fe1bc5a48d",
      "parents": [
        "52eeb15cf2f70caaadc4e0722a3b687ad9a91981"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Wed May 14 09:45:45 2025 -0700"
      },
      "committer": {
        "name": "Autoformatter",
        "email": "bot@sketch.dev",
        "time": "Wed May 14 16:46:49 2025 +0000"
      },
      "message": "agent: move \"sketch-base\" into git\n\nThe agent\u0027s notion of \"initial commit\" is kind of special, in that it\nis used as the \"base\" for a bunch of git operations. It\u0027s hard for\nthe user to change (we only provide a workflow via restart), yet\nsometimes you want to do just that.\n\nSo, instead we put it as data inside of it, named as a tag sketch-base.\nIt\u0027s abusing tags, but branches are no better.\n"
    },
    {
      "commit": "b529e733365034174f0e5c99e3f0fce347b34c5d",
      "tree": "69491005dfacfdbabfbb244ac72468d85a5f7a99",
      "parents": [
        "d2f54c2e43ad3ad2c9b389068c1555c3e7f231f2"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed May 07 22:06:46 2025 +0000"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed May 07 19:17:50 2025 -0700"
      },
      "message": "loop: disable multiple choice tool in oneshot mode\n\nThis change disables the multiple choice tool when Sketch is running in one-shot mode.\nIt adds an OneShot flag to the AgentConfig struct and conditionally includes\nthe multiple choice tool based on this flag.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\n"
    },
    {
      "commit": "a23587b969adfacca40bd443b74fa37d2d91dc79",
      "tree": "ce1bac36e1e50390e14f1e3a6c7d1543c5f5dbd7",
      "parents": [
        "07e98cc3bbb33571af4f30b402c611ded849a323"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed May 07 12:42:53 2025 +0000"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed May 07 14:00:16 2025 -0700"
      },
      "message": "cmd/sketch: make browser flag default behavior conditional on one-shot mode\n\n- If the flag is explicitly set (either true or false), respect that choice\n- If the flag is not set:\n  - In normal mode, default to true (open browser)\n  - In one-shot mode, default to false (don\u0027t open browser)\n\nThis change prevents the browser from opening automatically when in one-shot\nmode unless explicitly requested with -open\u003dtrue.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e"
    },
    {
      "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": "961cc9e4d4b527d1924d8919d9294fc53eebab40",
      "tree": "81e01c5ae3e1c122155079346a0cf0c2b016e632",
      "parents": [
        "c5b8ed462121e5f0d3abcf0ea17c00bb9e8b8846"
      ],
      "author": {
        "name": "David Crawshaw",
        "email": "david@zentus.com",
        "time": "Mon May 05 14:33:33 2025 -0700"
      },
      "committer": {
        "name": "David Crawshaw",
        "email": "david@zentus.com",
        "time": "Mon May 05 14:38:11 2025 -0700"
      },
      "message": "skabandclient: send model name on start of session\n\nFor #60\n"
    },
    {
      "commit": "c5b8ed462121e5f0d3abcf0ea17c00bb9e8b8846",
      "tree": "b1723cd55a140fd1707f274ab71972f6a48994ea",
      "parents": [
        "d7970e62c34243aaa9c7a6405ceedfb9a073a783"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Mon May 05 20:28:34 2025 +0000"
      },
      "committer": {
        "name": "Autoformatter",
        "email": "bot@sketch.dev",
        "time": "Mon May 05 21:06:35 2025 +0000"
      },
      "message": "Add -termui\u003dfalse flag to prevent panic in non-TTY environments\n\n- Added -termui flag to control terminal UI usage (defaults to true)\n- Added PTY detection to automatically disable terminal UI in non-TTY environments\n\nSketch did some weird stuff here, so this isn\u0027t particularly co-authored\nby sketch.\n"
    },
    {
      "commit": "b4782147bb79cd34495c4418a351672bc44035de",
      "tree": "57e11cb271a479c09f577df246ceb619b451a99f",
      "parents": [
        "f396a0014767e7efe619e01a0f1ad371147b385b"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Mon May 05 19:16:54 2025 +0000"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Mon May 05 13:48:06 2025 -0700"
      },
      "message": "experiment: add simple way to toggle experimental features"
    },
    {
      "commit": "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": "b5f6a00fb7e274681ef67600e9d9969a6161add7",
      "tree": "1ace0bfd616105c14e7c87dc5a7bb3b7028fe182",
      "parents": [
        "5a23406f6959384e3edc402eaf9c271648195786"
      ],
      "author": {
        "name": "David Crawshaw",
        "email": "david@zentus.com",
        "time": "Mon May 05 08:27:16 2025 -0700"
      },
      "committer": {
        "name": "David Crawshaw",
        "email": "david@zentus.com",
        "time": "Mon May 05 08:27:17 2025 -0700"
      },
      "message": "dockerimg: use --progress\u003dquiet to always show docker build failure\n\nIn non-verbose mode, --progress\u003dquiet is very quiet when everything\nworks, but prints an actual error when something fails (e.g. the\ndockerfile is bad or you ran out of space).\n\nWhile here, remove the partial stdout/stderr plumbing that did not\nquite work (because the code sometimes used os.Stdout/os.Stderr\ndirectly).\n\nFor #37\nFor #41\n"
    },
    {
      "commit": "5a23406f6959384e3edc402eaf9c271648195786",
      "tree": "dc6ff3715a427f7ee2a3645ea712f0a7da9705d2",
      "parents": [
        "3b4d2b8f8b805d4fb28e0b5854bb2c0494a8ea26"
      ],
      "author": {
        "name": "David Crawshaw",
        "email": "david@zentus.com",
        "time": "Sun May 04 17:52:08 2025 +0000"
      },
      "committer": {
        "name": "David Crawshaw",
        "email": "david@zentus.com",
        "time": "Sun May 04 13:00:22 2025 -0700"
      },
      "message": "ll/gem: implement Gemini Pro 2.5 support\n\nStill to do:\n- container support\n- sketch.dev support\n\nFor #60\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\n"
    },
    {
      "commit": "ab50e9b5718ccc211266b95587634f688425b745",
      "tree": "6d6a24b34c57e7de2b9da7b686f1c792f1e0534c",
      "parents": [
        "16fa8b48f6c9f54f579bbc5bb22223443422f2e1"
      ],
      "author": {
        "name": "David Crawshaw",
        "email": "david@zentus.com",
        "time": "Sat May 03 10:26:42 2025 -0700"
      },
      "committer": {
        "name": "David Crawshaw",
        "email": "david@zentus.com",
        "time": "Sat May 03 10:26:43 2025 -0700"
      },
      "message": "cmd/sketch: remove colima check\n\nOrbstack works too.\n"
    },
    {
      "commit": "485afc6975b853aa670b5087c323fa3df3df0672",
      "tree": "291bbf09de69cec72c13f652f3d9be81f35451e4",
      "parents": [
        "6234a8d9d229904994f49a5edacca05e54b26d1f"
      ],
      "author": {
        "name": "Sean McCullough",
        "email": "banksean@gmail.com",
        "time": "Mon Apr 28 14:28:39 2025 -0700"
      },
      "committer": {
        "name": "Autoformatter",
        "email": "bot@sketch.dev",
        "time": "Fri May 02 22:12:51 2025 +0000"
      },
      "message": "tool_use: add multiplechoice support to Agent\n\nThis implements the \"dumb\" approach - the tool itself just tells\nthe llm that it rendered the options to the user, and it\u0027s done.\n\nIf the user selects one of the options, we paste its response text\ninto the chat input textarea on the frontend.  The user is of\ncourse free to ignore the question or the options presented.\n\nThis keeps no association between user response and the original\ntool_use block that solicited it from the user. I.e. the user\nresponse message doesn\u0027t include the original tool_use_id value\nit it.  It looks as though the user typed it by hand.\n"
    },
    {
      "commit": "6234a8d9d229904994f49a5edacca05e54b26d1f",
      "tree": "02465eaa4a3162b25ab4f952f782f92b2c5d9222",
      "parents": [
        "25f6ff1b44e739e64d8b86cc4ea11bf8c631265c"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Fri May 02 14:31:20 2025 -0700"
      },
      "committer": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Fri May 02 14:35:31 2025 -0700"
      },
      "message": "Sketch inception wiring: make it easier to run unsafe sketch inside Sketch\n\nBy renaming the api key env variable, you can run \"sketch -unsafe\"\nboth with and without skaband without removing /.dockerenv and\nre-writing env variables. Previously this was painful. We\u0027re using\n\"--outside-hostname\" to indicate the fact that we\u0027re an \"inside sketch\".\n"
    },
    {
      "commit": "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": "d72563ac30bab6471121f561f3bb41991a3c91d1",
      "tree": "617927db29a9c42f886a4a02557494d4cf47541b",
      "parents": [
        "c8e4ab08aeb36ac34133c627b352ac9352142960"
      ],
      "author": {
        "name": "Sean McCullough",
        "email": "banksean@gmail.com",
        "time": "Fri May 02 09:37:15 2025 -0700"
      },
      "committer": {
        "name": "Sean McCullough",
        "email": "banksean@gmail.com",
        "time": "Fri May 02 09:37:15 2025 -0700"
      },
      "message": "cmd/main: don\u0027t send slogs to stdout, ever\n"
    },
    {
      "commit": "c8e4ab08aeb36ac34133c627b352ac9352142960",
      "tree": "6f503aee50eec0f14f179f37169a531f3dde36b8",
      "parents": [
        "fa67fe5ec3ac9ad434054035285d4d53f9211d7f"
      ],
      "author": {
        "name": "Sean McCullough",
        "email": "banksean@gmail.com",
        "time": "Fri May 02 16:11:37 2025 +0000"
      },
      "committer": {
        "name": "Sean McCullough",
        "email": "banksean@gmail.com",
        "time": "Fri May 02 09:17:29 2025 -0700"
      },
      "message": "Restructure main.go to separate host and container code\n\nThis commit reorganizes the cmd/sketch/main.go file to clearly separate the\nexecution paths for host and container environments. The changes include:\n\n1. Created dedicated functions for each execution path:\n   - runInHostMode: Handles execution on the host, launching container\n   - runInContainerMode: Handles execution inside the container\n   - runInUnsafeMode: Handles execution directly on host without container\n   - setupAndRunAgent: Common setup code for container and unsafe modes\n\n2. Added clear function names and comments to indicate where code runs\n3. Maintained existing functionality while making control flow explicit\n4. Preserved all command-line flags and their handling\n5. Kept the same behavior for all execution paths\n6. Moved CLI flag parsing into a dedicated function\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\n"
    },
    {
      "commit": "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": "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": "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": "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": "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": "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": "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": "5fdd024fa3d3df5fe5a2c216672d912b6aade60a",
      "tree": "08e20aa0006bb422603693557cbfa7b2d92ae55a",
      "parents": [
        "b74c4f6e1c93afca3d37a6b68c717d41a51fa612"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip.zeyliger@gmail.com",
        "time": "Fri Apr 25 19:31:58 2025 -0700"
      },
      "committer": {
        "name": "Philip Zeyliger",
        "email": "philip.zeyliger@gmail.com",
        "time": "Fri Apr 25 19:38:09 2025 -0700"
      },
      "message": "Sketch \"inception\" support.\n\nI wanted to tell Sketch-in-container to run\n\n\tgo run ./cmd/sketch -unsafe -skaband-addr\u003d -one-shot \u0027what is todays date\u0027\"\n\nand have it work. And now it does.\n\nThe underlying complexity is whether \"inDocker\" is enough to know\n\"isInsideSketch\", so I separated that as far as necessary. The skaband\nstuff is still complicated.\n\nIt might be preferable to use env variables for all outside-\u003einside\ncommunication rather than use flags sometimes and variables sometimes\n(like, for keys), but here we are.\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": "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": "faa39bec76f463c0e2c9b06f567a596d47af0d50",
      "tree": "cd05540a4622b7277a79c05c9f7ce58c9b4dcbd4",
      "parents": [
        "01ed5bee0c121852d0e2ab3836a08acab68397e4"
      ],
      "author": {
        "name": "David Crawshaw",
        "email": "david@zentus.com",
        "time": "Fri Apr 25 08:06:38 2025 -0700"
      },
      "committer": {
        "name": "David Crawshaw",
        "email": "david@zentus.com",
        "time": "Fri Apr 25 08:06:57 2025 -0700"
      },
      "message": "cmd/sketch: only show structured logs printf if --unsafe\n\nThe inner sketch binary running in docker runs with --unsafe.\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": "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": "7b43662d9959e1f5c7dd2b390474192b442d5801",
      "tree": "da0c55ff81e5bd1f16cabcba6ccf0d7623a34c49",
      "parents": [
        "75ec6bb42c08c8407cb96025b070dc9f1eb66eb9"
      ],
      "author": {
        "name": "David Crawshaw",
        "email": "david@zentus.com",
        "time": "Thu Apr 24 17:49:01 2025 +0000"
      },
      "committer": {
        "name": "David Crawshaw",
        "email": "david@zentus.com",
        "time": "Thu Apr 24 11:00:07 2025 -0700"
      },
      "message": "Only print skaband connection messages when verbose flag is set\n\nCo-Authored-By: sketch\nOnly print the \u0027skaband connected\u0027 and disconnected messages if the verbose flag is set.\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": "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": "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": "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": "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."
    },
    {
      "commit": "d140295fa7d794f5b30feb4eee2f45f9cc9ff383",
      "tree": "659e3d00a94eb2aee0da202efaf2e33477c0e895",
      "parents": [
        "37dc4cf04df5dee6feff005d68a4a24e55be8990"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip.zeyliger@gmail.com",
        "time": "Wed Apr 23 03:54:37 2025 +0000"
      },
      "committer": {
        "name": "Philip Zeyliger",
        "email": "philip.zeyliger@gmail.com",
        "time": "Wed Apr 23 06:40:17 2025 -0700"
      },
      "message": "sketch: Propagate host vs. runtime OS/WorkingDir/Hostname\n\nIf you have a bunch of sketch sessions, you need to know where they were\nlaunched. The container hostnames (some random thing) and working dirs (always /app)\naren\u0027t very helpful, so we want to keep around both. I\u0027ve updated the UI\nto show them as well.\n\nThis commit chooses \"Host\" and \"Runtime\" as the names of the \"Outside\"\nand \"Inside\" sketch. I\u0027m open to suggestions for better names.\n\nCo-Authored-By: sketch, but it did a so-so job\n"
    },
    {
      "commit": "5e227dd8f494194284b4b545c02e09bc79909d41",
      "tree": "cbe3fb6cb160fea4379e822fcca2cfcbe5bc51cf",
      "parents": [
        "e8d6b80c8804353641c0d999d1897e29b068bbdc"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip.zeyliger@gmail.com",
        "time": "Mon Apr 21 15:55:29 2025 -0700"
      },
      "committer": {
        "name": "Philip Zeyliger",
        "email": "philip.zeyliger@gmail.com",
        "time": "Mon Apr 21 20:04:53 2025 -0700"
      },
      "message": "sketch: Linux support\n\nTogether with 8a89e1cbd3e7c9bbe1c561e88141527a0c894e06, this\nshould resolve https://github.com/boldsoftware/sketch/issues/3,\nin supporting Linux.\n\nTo test on a Mac, run \"limactl shell default go run ./cmd/sketch -verbose\", assuming\nyou have a lima default VM with sketch\u0027s dependencies already prepped.\n\nThe issues we encountered were:\n\n1. Explicit checks for \"is Colima installed\", \"is docker installed\",\n   etc. Easy enough to fix these.\n\n2. When go\u0027s toolchain builds, it puts the output in different places\n   depending whether it\u0027s cross-compiled or not. Fine, we adapt.\n   Note that os.Rename() doesn\u0027t always work, and we fall back to\n   copy/delete. Mode has to be set appropriately to, to make the\n   /bin/sketch executable executable.\n\n   Re-building is kind of silly: we could use /proc/self/exe, for\n   example, or cross-mount the binary into the container, or any\n   number of other things. That said, here we keep the paths the same.\n\n3. Docker networking setup for the git server. The host git repo\n   is served with git\u0027s cgi-bin wrapper. host.docker.internal\n   seems to work different in colima vs Ubuntu\u0027s docker.io, so\n   an extra command line flag to docker was added. Then,\n   it turns out that our git server checks that the remote is\n   127.0.0.1, which seems to be how Colima does its networking,\n   but isn\u0027t the case for Docker in general. To handle this, we\n   use HTTP Basic Auth with a random password. (Git also has\n   an \"http.extraHeader\" configuration, but basic auth seems just\n   as good and more obvious.)\n\nIncidentally, I\u0027m also adding the git remote as a git remote\nnamed \"sketch-host\" to make it easier to work with in the terminal,\nif necessary.\n"
    },
    {
      "commit": "8a89e1cbd3e7c9bbe1c561e88141527a0c894e06",
      "tree": "06e01294a87f29acb808a1d479a627a8c0711f35",
      "parents": [
        "176de79e7d3d6a894babccc5d8dc8bb9bf133828"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip.zeyliger@gmail.com",
        "time": "Mon Apr 21 15:27:13 2025 -0700"
      },
      "committer": {
        "name": "Philip Zeyliger",
        "email": "philip.zeyliger@gmail.com",
        "time": "Mon Apr 21 15:35:02 2025 -0700"
      },
      "message": "sketch: support Linux with -unsafe\n\nhostReqsCheck wants too much in unsafe mode, and Colima doesn\u0027t make\nsense for Linux anwyay, so let\u0027s fix that.\n\nCo-Authored-By: sketch\n"
    },
    {
      "commit": "d9f1337ec3317a60df50d8ba4eefb448473d62fa",
      "tree": "67b60b05d8e2e3fb01293f68dfc5d08600a28dda",
      "parents": [
        "db8c5abcc18082bcbf47247e8d50889a32e65e06"
      ],
      "author": {
        "name": "Sean McCullough",
        "email": "banksean@gmail.com",
        "time": "Mon Apr 21 15:08:49 2025 -0700"
      },
      "committer": {
        "name": "Sean McCullough",
        "email": "banksean@gmail.com",
        "time": "Mon Apr 21 15:21:40 2025 -0700"
      },
      "message": "webui: auto-generate types.ts from go structs\n"
    },
    {
      "commit": "86b56862f8d3e192646a17548ef5294582c31f8f",
      "tree": "d0235f3f56695de8e6281ba3f57a663847204f33",
      "parents": [
        "f5bb3d3f1aa33e2a066c4139675f096f73c1f9d4"
      ],
      "author": {
        "name": "Sean McCullough",
        "email": "banksean@gmail.com",
        "time": "Fri Apr 18 13:04:03 2025 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Apr 18 13:04:03 2025 -0700"
      },
      "message": "loop/webui: swtich to web components impl (#1)\n\n* loop/webui: swtich to web components impl\n\nThis change reorganizes the original vibe-coded\nfrontend code into a structure that\u0027s much\neasier for a human to read and reason about,\nwhile retaining the user-visible functionality\nof its vibe-coded predecessor. Perhaps most\nimportantly, this change makes the code testable.\n\nSome other notable details:\n\nThis does not use any of the popular large web\nframeworks, but instead follows more of an\n\"a la carte\" approach: leverage features\nthat already exist in modern web browsers,\nlike custom elements and shadow DOM.\n\nTemplating and basic component lifecycle\nmanagement are provided by lit.\n\nState management is nothing fancy. It\ndoesn\u0027t use any library or framework, just\na basic \"Events up, properties down\"\napproach.\n\n* fix bad esbuild.go merge\n\n* loop/webui: don\u0027t bundle src/web-components/demo\n\n* loop/webui: don\u0027t \u0027npm ci\u0027 dev deps in the container\n\n* rebase to main, undo README.md changes, add webuil.Build() call to LaunchContainer()"
    },
    {
      "commit": "2e463fb649fcff14d4025ddb91f630a98e7da526",
      "tree": "0e86854d80d2759a913870655f13226c31f9d30c",
      "parents": [],
      "author": {
        "name": "Earl Lee",
        "email": "earl.lee@sketch.dev",
        "time": "Thu Apr 17 11:22:22 2025 -0700"
      },
      "committer": {
        "name": "Earl Lee",
        "email": "earl.lee@sketch.dev",
        "time": "Thu Apr 17 11:35:33 2025 -0700"
      },
      "message": "Initial commit\n"
    }
  ]
}
