)]}'
{
  "log": [
    {
      "commit": "7027307b381e2b8421c95ebb2f872b8e3c567f3e",
      "tree": "7f9027f4ba1f57b305ebfba47d3b0d920093de95",
      "parents": [
        "837699bf55d27975e9e5b881b8794683bb1b10c8"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Wed May 28 18:26:14 2025 +0000"
      },
      "committer": {
        "name": "Autoformatter",
        "email": "bot@sketch.dev",
        "time": "Wed May 28 22:47:10 2025 +0000"
      },
      "message": "webui: replace hardcoded Monaco language map with dynamic detection\n\nReplace the static language mapping in the Monaco diff editor with\nMonaco\u0027s built-in language registry for automatic language detection.\n\nChanges:\n1. Remove hardcoded langMap that only supported 8 languages (js, ts, py,\n   html, css, json, md, go)\n2. Implement dynamic language detection using monaco.languages.getLanguages()\n3. Cache language list for performance since it doesn\u0027t change at runtime\n4. Maintain exact extension matching including the dot prefix (.js, .ts, etc.)\n5. Preserve fallback to \u0027plaintext\u0027 for unknown extensions\n\nBenefits:\n- Automatically supports all languages Monaco knows about (40+ languages)\n- No maintenance burden when Monaco adds new language support\n- Removes duplication between Monaco\u0027s registry and our hardcoded map\n- Better future-proofing as Monaco language support evolves\n\nThe implementation uses Monaco\u0027s ILanguageExtensionPoint interface which\nprovides language.extensions arrays for each registered language. This\nis more reliable than maintaining our own mapping and ensures consistency\nwith Monaco\u0027s actual language support.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\n\nChange-ID: sca31f0ae899ae54dk\n"
    },
    {
      "commit": "d85e97d97d2e88415bf1a87557278afd14f6d202",
      "tree": "88e36c41930314fc74901b9de9794ad8ac49c2ba",
      "parents": [
        "a442ce32ac95d7e8337fba0a82f94cbd60be1296"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Wed May 28 17:59:08 2025 +0000"
      },
      "committer": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Wed May 28 11:17:24 2025 -0700"
      },
      "message": "webui: remove unused language property from Monaco editor\n\nRemove dead code - the language property was never set when the component\nis used, so it always defaulted to \u0027javascript\u0027 and was never meaningful.\n\nThe getLanguageForFile method now uses a simpler fallback:\nlangMap[extension] || \u0027plaintext\u0027\n\nSince filenames always have extensions in practice, this removes an\nunnecessary intermediate fallback that was never actually used.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: s16c137c6267b58a5k\n"
    },
    {
      "commit": "afeafea91f20db4e5b99620df98baa1628bfeaf1",
      "tree": "7ba3f14d663cbc73bf78f8986bb5d3afe332e7b2",
      "parents": [
        "4c7865b4763552f4294e7a3738b796ea918a7c3d"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Fri May 23 20:27:39 2025 +0000"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Fri May 23 14:25:55 2025 -0700"
      },
      "message": "webui: change Monaco editor comment submit button from Submit to Add\n\nUpdates the Monaco editor\u0027s comment submission button text from \u0027Submit\u0027\nto \u0027Add\u0027 for better consistency with the UI and more concise labeling.\n\nThe button functionality remains unchanged - it still submits comments\non selected code sections in the Monaco editor view.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: seca3827c274ff3cdk\n"
    },
    {
      "commit": "8c4636270be67625cc27ce356f6da1a11e245069",
      "tree": "f6a4db58f1eb71033410150daa7290d4e41aca0a",
      "parents": [
        "5e3570280bf3bb0f84482ff9556739d34eb08093"
      ],
      "author": {
        "name": "Autoformatter",
        "email": "bot@sketch.dev",
        "time": "Fri May 16 21:54:17 2025 +0000"
      },
      "committer": {
        "name": "Autoformatter",
        "email": "bot@sketch.dev",
        "time": "Fri May 16 21:54:17 2025 +0000"
      },
      "message": "all: fix formatting\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"
    }
  ]
}
