)]}'
{
  "log": [
    {
      "commit": "75b45f5665fad8d386d36f88bf7dc37808a8dcac",
      "tree": "484353433b24d7906740ea22108f6873257f3a4b",
      "parents": [
        "c3b65d73caf6ea873ef6981aa926ef8ea9d31e83"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Thu Jul 17 15:47:32 2025 -0700"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Thu Jul 17 18:04:23 2025 -0700"
      },
      "message": "cmd/sketch: keep public keys separate per skaband\n\nChange the layering a bit.\nAlways create a public key, for better telemetry.\nKeep separate things separate.\nThis could use a touch more refactoring,\nbut good enough for today.\n"
    },
    {
      "commit": "f2814eabe9d341a7d5f8805c41f0628bda9d1056",
      "tree": "bb1a5ffac41f41f30b4b3d789c44c571ffc8ae54",
      "parents": [
        "d5f0a3ece70bc4f09d1941e08e66af882e540866"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Mon Jun 30 10:16:50 2025 -0700"
      },
      "committer": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Mon Jun 30 10:16:50 2025 -0700"
      },
      "message": "Let MCP servers use env variables; pass along model key for /attach as well\n"
    },
    {
      "commit": "59789951fdf8f9a5c834b4d079f0394c2bc42dd3",
      "tree": "860ea2a1d15206f178f4b7a5583f89a11eb127d7",
      "parents": [
        "4a055c57328b47ebf3b02530b2e9fb723108fde3"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Sat Jun 28 20:02:23 2025 -0700"
      },
      "committer": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Sat Jun 28 20:02:38 2025 -0700"
      },
      "message": "Add ValidateSessionID\n"
    },
    {
      "commit": "0113be559976cfb1ce0e78a9a69c19a6394b2c3d",
      "tree": "103ea687419bd792471f057727d2f174428b4215",
      "parents": [
        "8ad17ba9f185be76a4e715d9f21868b0cf27b366"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Sat Jun 07 23:53:41 2025 +0000"
      },
      "committer": {
        "name": "Autoformatter",
        "email": "bot@sketch.dev",
        "time": "Mon Jun 09 19:47:55 2025 +0000"
      },
      "message": "webui: add skaband navigation link with image to desktop and mobile\n\nAdd conditional linking functionality to make the \u0027sketch\u0027 title in both desktop\nand mobile web UI clickable when a skaband address is configured, displaying\nthe sketch.dev.png image alongside the text for enhanced branding and navigation\nback to the skaband dashboard.\n\nProblem Analysis:\nWhen users access sketch through skaband (the hosted service), they lose easy\nnavigation back to their skaband dashboard since the sketch title in the header\nwas always static text. This created a disconnected experience between the\nskaband interface and individual sketch sessions, and lacked visual branding\nconsistency with the hosted service. The feature needed to work in both\ncontainer mode and unsafe mode deployments.\n\nImplementation Changes:\n\n1. Backend Infrastructure:\n   - Added SkabandAddr() method to CodingAgent interface for state management\n   - Enhanced State struct with skaband_addr field (with omitempty for clean JSON)\n   - Modified getState() function to include agent\u0027s skaband address in responses\n   - Updated mockAgent in tests to support new SkabandAddr() method\n\n2. SkabandClient Integration:\n   - Added Addr() method to SkabandClient to expose stored skaband server address\n   - Updated Agent.SkabandAddr() to get address from existing SkabandClient\n   - Leverages existing skaband infrastructure used for session history tools\n   - No duplicate storage or additional configuration required\n\n3. TypeScript Type Updates:\n   - Regenerated webui/src/types.ts to include skaband_addr field in State interface\n   - Maintained backward compatibility with existing state structure\n   - Auto-generated types ensure type safety across Go/TypeScript boundary\n\n4. Desktop Web UI Enhancement:\n   - Modified sketch-app-shell.ts to conditionally render sketch title as link\n   - Added conditional logic: renders link with image when skaband_addr exists\n   - Uses target\u003d\u0027_blank\u0027 and rel\u003d\u0027noopener noreferrer\u0027 for secure external linking\n   - Displays skaband_addr/sketch.dev.png image alongside \u0027sketch\u0027 text\n   - Maintains existing appearance and behavior when no skaband address configured\n\n5. Mobile Web UI Implementation:\n   - Added skabandAddr property to mobile-title component\n   - Implemented conditional rendering matching desktop functionality\n   - Mobile-optimized CSS with appropriate image sizing (18px vs 20px desktop)\n   - Integrated with existing mobile-shell state management infrastructure\n\n6. CSS Styling Integration:\n   - Added .banner-title a styles for seamless link appearance with flexbox layout\n   - Configured color: inherit to match existing title styling\n   - Added hover effects with opacity transition and underline for user feedback\n   - Image styling with rounded corners and appropriate dimensions\n   - Mobile-responsive design with media queries for different screen sizes\n\n7. Test Coverage:\n   - Updated test infrastructure to support new SkabandAddr() method\n   - Comprehensive testing of state endpoint with and without skaband address\n   - Verified omitempty behavior for clean JSON responses\n   - All existing tests continue passing without modification\n\nTechnical Details:\n- Uses omitempty JSON tag to exclude empty skaband addresses from API responses\n- Leverages existing containerState property in web components for state access\n- Maintains full backward compatibility with non-skaband sketch deployments\n- Clean separation between configuration, state management, and presentation layers\n- Flexbox layout for proper image and text alignment in banner links\n\nSecurity Considerations:\n- External links use target\u003d\u0027_blank\u0027 with rel\u003d\u0027noopener noreferrer\u0027\n- No user input validation needed since skaband_addr comes from server configuration\n- Link destination controlled by deployment configuration, not user input\n- Image source follows same security model as main skaband address\n\nBenefits:\n- Seamless navigation between sketch sessions and skaband dashboard\n- Enhanced visual branding with sketch.dev.png image display\n- Improved user experience for hosted skaband users across all device types\n- Mobile-optimized responsive design for touch interfaces\n- Zero impact on standalone sketch deployments\n- Uses existing, tested skaband infrastructure without additional complexity\n\nTesting:\n- Verified end-to-end functionality with real sketch.dev skaband server\n- Confirmed web UI displays clickable sketch logo link in desktop and mobile views\n- Tested state endpoint returns correct skaband_addr from SkabandClient\n- Validated responsive design across different screen sizes\n- All Go tests and TypeScript compilation successful\n\nThis enhancement provides intuitive navigation for skaband users while\nmaintaining the existing experience for standalone sketch deployments,\ncreating a more cohesive and visually branded interface across all deployment\nmodes and device types.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: sa6158676609fe9f0k\n"
    },
    {
      "commit": "c17ffe37ff9ac2c5e0f19a67854b77955976c1bb",
      "tree": "2318aae7918bd74a4391b0faac4355f0e861b7d5",
      "parents": [
        "2a32f01e45169200bfb252031ca880ef09d7c0c2"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip.zeyliger@gmail.com",
        "time": "Thu Jun 05 19:49:13 2025 -0700"
      },
      "committer": {
        "name": "Philip Zeyliger",
        "email": "philip.zeyliger@gmail.com",
        "time": "Thu Jun 05 19:49:46 2025 -0700"
      },
      "message": "sketch: add session history tools using markdown table API\n\nAdd session history tools to allow the LLM to access previous sketch sessions:\n- New list_recent_sketch_sessions and read_sketch_session tools\n- Integration with skaband client for session data retrieval\n- Session history tools automatically added when skaband client available\n- Updated agent configuration to include skaband client\n- Client handles plain text markdown table response from API\n- Display server-generated markdown table directly to LLM\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: s693acdfdaaa392c8k\n"
    },
    {
      "commit": "574eda8d743b07cb0e0e11540d4f1b7db7eeb68c",
      "tree": "8bb3cfafc2bca4c11c4deca4ea5f92e1af16282a",
      "parents": [
        "fa306776f93d607b88d4472f06ea788f69507945"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed May 28 10:30:43 2025 -0700"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed May 28 10:36:09 2025 -0700"
      },
      "message": "skabandclient: fix typos"
    },
    {
      "commit": "e9eaf6c556fe058ccc6f9aa60b7db0f4a3ec77d3",
      "tree": "22527d450d724872458b9258b9ec92d323ba3ed4",
      "parents": [
        "cabfa5520708460e4537216df26be15262c855e6"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Mon May 19 16:14:39 2025 -0700"
      },
      "committer": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Mon May 19 16:14:39 2025 -0700"
      },
      "message": "Add skaband heartbeat support.\n\nWe want Sketch to re-connect if its connection to skaband is busted. To\ndo so, we expect a heartbeat from skaband, and, if we\u0027ve missed it, we\nshut down the connection and re-connect.\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": "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": "fe3e9f7d8480ea2ed8cfa68a310a7d8bf6162160",
      "tree": "68fad2b385959732fc3ecf5acd697a6a89aaf551",
      "parents": [
        "b9ac849c781135bfd08e71d0b0b4355433006d1f"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip.zeyliger@gmail.com",
        "time": "Thu Apr 24 09:02:05 2025 -0700"
      },
      "committer": {
        "name": "Philip Zeyliger",
        "email": "philip.zeyliger@gmail.com",
        "time": "Thu Apr 24 09:48:13 2025 -0700"
      },
      "message": "fix possible nil dereference\n\nI\u0027ve been seeing a stack track panic in these lines. Trying\nto be explicit about everything I can see being busted,\nto try to narrow it down. It reproduces with dying network\nconnections, but not yet reliably enough that I have steps.\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"
    }
  ]
}
