)]}'
{
  "log": [
    {
      "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": "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": "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": "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": "9373c07a6d2fc97c2fad41e8228a7f2e8bc10ccb",
      "tree": "f7485f9715aee87c185ba2113b2eab6c41b1398d",
      "parents": [
        "b7c5875548da5057eac0405bf4e0ae8bbc43667c"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Thu May 01 10:27:01 2025 -0700"
      },
      "committer": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Thu May 01 12:13:31 2025 -0700"
      },
      "message": "Update tests for agent\u0027s new iterator implementation\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\n\nThe commit 4eb6bb6c9ac switched from outbox channels to a subscriber model\nwith message iterators. This commit updates all existing tests to use the\nnew iterator implementation and adds new tests specifically for the iterator\nfunctionality.\n\n- Modified agent_test.go to use new iterator approach\n- Modified agent_git_test.go to check history array directly\n- Added new iterator_test.go to test iterator-specific functionality\n\nFix issues found by code review\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\n\n- Fix context leak by properly using cancel function\n- Modernize for loops using range over int\n- Use fmt.Appendf instead of []byte(fmt.Sprintf)\n\nOptimize slow tests to improve test execution time\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\n\nThis commit optimizes the test suite to reduce execution time:\n\n1. Reduces TestGitCommitTracking test time by using fewer git commits\n   (20 instead of 110) which cuts the test time by 77%.\n\n2. Improves iterator tests by using channels for synchronization instead\n   of time.Sleep, reducing TestIteratorWithNewMessages from 200ms to nearly 0ms.\n\n3. Reduces timeouts and sleeps in other iterator tests.\n\nTotal test execution time reduced by more than 60% (from 2.3s to 0.9s).\n"
    },
    {
      "commit": "b7c5875548da5057eac0405bf4e0ae8bbc43667c",
      "tree": "a0b9eb0f68de826d7b51a5e8f5eaa7976fb48de3",
      "parents": [
        "5228b5850d8453c225e5611918fcd00b747c65cc"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Thu May 01 10:10:17 2025 -0700"
      },
      "committer": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Thu May 01 12:13:31 2025 -0700"
      },
      "message": "agent plumbing: convert outbox to subscribers and an iterator\n\nWaitForMessage() could only work for one thread, because it was using a\nsingular channel for outboxes. This was fine when we only had one user,\nbut WaitForMessageCount() was kinda similar, and had its own thing, and\nI want to rework how polling works and need another user.\n\nAnyway, this one is hand-coded, because Sketch really struggled\nwith getting the iterator convincingly safe. In a follow-up commit,\nI\u0027ll try to get Sketch to write some tests.\n"
    },
    {
      "commit": "96b60dd7e71c7db55dfe4cff86265eab02e54e9f",
      "tree": "3ee9ddbbe4b260b7000f194e369b527ce658cd66",
      "parents": [
        "bce3a13a7c16ffdb602b66550e6b3479d34fb9b0"
      ],
      "author": {
        "name": "Sean McCullough",
        "email": "banksean@gmail.com",
        "time": "Wed Apr 30 09:49:10 2025 -0700"
      },
      "committer": {
        "name": "Sean McCullough",
        "email": "banksean@gmail.com",
        "time": "Wed Apr 30 15:20:35 2025 -0700"
      },
      "message": "Add StateMachine tracking to Agent control flow\n\nThis commit integrates the existing StateMachine type with the Agent\nto provide state tracking and validation throughout the conversation\ncontrol flow. This allows for better monitoring and debugging of the\nAgent\u0027s behavior during execution.\n\nThis commit adds tests to verify the correct behavior of the state\nmachine integration with the Agent type:\n\n1. A test for basic state transitions\n2. A test for a complete processTurn flow with a simple response\n3. A test for a processTurn flow with tool use\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\n"
    },
    {
      "commit": "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": "9f4b8089f93f39300b819ccf83cf64a7a867c0dc",
      "tree": "c1f00c2b00892efd2656196ebbc37c433d138658",
      "parents": [
        "bc6b629676e97d1789cff9a1d945b5faf680372e"
      ],
      "author": {
        "name": "Sean McCullough",
        "email": "banksean@gmail.com",
        "time": "Wed Apr 30 17:34:07 2025 +0000"
      },
      "committer": {
        "name": "Sean McCullough",
        "email": "banksean@gmail.com",
        "time": "Wed Apr 30 11:28:34 2025 -0700"
      },
      "message": "agent.go: don\u0027t panic on nil initialResp\n\na.processUserMessage(ctx) appears to return nil, nil under\ncertain circumstances, and this causes a panic in processTurn().\n\nThis change makes it log the error instead of panicing.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\n"
    },
    {
      "commit": "885a16a8e37fe82dac66a7db729be202f6ce4bea",
      "tree": "eff84390d70dda2a09c79faffad2ba0850c1b763",
      "parents": [
        "0d95d3a268ffad82b7c645200804fb43ed088a81"
      ],
      "author": {
        "name": "Sean McCullough",
        "email": "banksean@gmail.com",
        "time": "Wed Apr 30 02:49:25 2025 +0000"
      },
      "committer": {
        "name": "Sean McCullough",
        "email": "banksean@gmail.com",
        "time": "Wed Apr 30 09:41:22 2025 -0700"
      },
      "message": "Refactor loop/agent.go to reduce complexity\n\n- Restructured Agent.InnerLoop into smaller, more focused functions\n- Renamed InnerLoop to processTurn to better reflect its purpose\n- Extracted helper methods for different responsibilities\n- Improved code organization and testability\n- Each extracted function now handles a single responsibility\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\n"
    },
    {
      "commit": "99a9a0285fe449f047fbc93766f37e6ea7af21df",
      "tree": "ba255c9b05449c09d137cd6cf81edf58469542a1",
      "parents": [
        "f98d7305e73ecec9a78f94f527693d5adfb89159"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip.zeyliger@gmail.com",
        "time": "Sun Apr 27 15:15:25 2025 +0000"
      },
      "committer": {
        "name": "Philip Zeyliger",
        "email": "philip.zeyliger@gmail.com",
        "time": "Sun Apr 27 20:00:22 2025 -0700"
      },
      "message": "Implement tracking of outstanding LLM and Tool calls\n\nThis commit implements a listener pattern between ant.convo and the Agent for tracking outstanding calls.\n\n* Added fields to the Agent struct to track outstanding LLM calls and Tool calls\n* Implemented the listener methods to properly track and update these fields\n* Added methods to retrieve the counts and names\n* Updated the State struct in loophttp.go to expose this information\n* Added a unit test to verify the tracking functionality\n* Created UI components with lightbulb and wrench icons to display call status\n* Added numerical indicators that always show when there are active calls\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\n"
    },
    {
      "commit": "2e463fb649fcff14d4025ddb91f630a98e7da526",
      "tree": "0e86854d80d2759a913870655f13226c31f9d30c",
      "parents": [],
      "author": {
        "name": "Earl Lee",
        "email": "earl.lee@sketch.dev",
        "time": "Thu Apr 17 11:22:22 2025 -0700"
      },
      "committer": {
        "name": "Earl Lee",
        "email": "earl.lee@sketch.dev",
        "time": "Thu Apr 17 11:35:33 2025 -0700"
      },
      "message": "Initial commit\n"
    }
  ]
}
