)]}'
{
  "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()",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "309f705d646d03d5e48ec1f22a48b0f39853d49a",
      "old_mode": 33188,
      "old_path": ".gitignore",
      "new_id": "a56a7ef437dc60c77d16cefb82f3fcc35192b083",
      "new_mode": 33188,
      "new_path": ".gitignore"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "195949bdfcbfc614409c6927edfc0e47627e6599",
      "new_mode": 33188,
      "new_path": ".vscode/tasks.json"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "ead3ff50cf61a79dbda762d69180afe6104c91c5",
      "new_mode": 33188,
      "new_path": "cmd/bundle-analyzer/main.go"
    },
    {
      "type": "modify",
      "old_id": "0fd7ee1ff9cb77dd597984616038eec375d82451",
      "old_mode": 33188,
      "old_path": "loop/server/loophttp.go",
      "new_id": "6edae0cd0b63e62823f50d390c0bad7aadcb4c55",
      "new_mode": 33188,
      "new_path": "loop/server/loophttp.go"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "a60030e3cbb16893d47710e64a0759386c6c9cfc",
      "new_mode": 33188,
      "new_path": "loop/webui/.gitignore"
    },
    {
      "type": "modify",
      "old_id": "51b4bb7cfbe77c24cc2d6648d85235f10300eeb7",
      "old_mode": 33188,
      "old_path": "loop/webui/Makefile",
      "new_id": "662cfe771f987dfbf9cb3fb0371e8f0049878f76",
      "new_mode": 33188,
      "new_path": "loop/webui/Makefile"
    },
    {
      "type": "modify",
      "old_id": "ca42afa33519c00bcbf4faec32ff7c71906b9546",
      "old_mode": 33188,
      "old_path": "loop/webui/esbuild.go",
      "new_id": "d4af63635002fa49b846786060ece1f36750a206",
      "new_mode": 33188,
      "new_path": "loop/webui/esbuild.go"
    },
    {
      "type": "modify",
      "old_id": "27de4c5c7ae027dd40fe27955bdc2b2d2f9cf168",
      "old_mode": 33188,
      "old_path": "loop/webui/package-lock.json",
      "new_id": "53b806f8f573fab6ab9d8e47d5539bf3983f07bb",
      "new_mode": 33188,
      "new_path": "loop/webui/package-lock.json"
    },
    {
      "type": "modify",
      "old_id": "06cc3c02aec39a6eafef3ffb2e1f5304e552b69b",
      "old_mode": 33188,
      "old_path": "loop/webui/package.json",
      "new_id": "44d3a78bc1651acac610f62d65117e08c0973c3f",
      "new_mode": 33188,
      "new_path": "loop/webui/package.json"
    },
    {
      "type": "delete",
      "old_id": "12a703d900da8159c30e75acbd2c4d87ae177f62",
      "old_mode": 33188,
      "old_path": "loop/webui/postcss.config.js",
      "new_id": "0000000000000000000000000000000000000000",
      "new_mode": 0,
      "new_path": "/dev/null"
    },
    {
      "type": "modify",
      "old_id": "861a8cdf0ed52d145aa99686a6390210abfb61c4",
      "old_mode": 33188,
      "old_path": "loop/webui/readme.md",
      "new_id": "b904934bc60334a3f0c707718e93969164739b83",
      "new_mode": 33188,
      "new_path": "loop/webui/readme.md"
    },
    {
      "type": "rename",
      "old_id": "2130c21072154f1f78349a4add3327539c6910dd",
      "old_mode": 33188,
      "old_path": "loop/webui/src/timeline/data.ts",
      "new_id": "2130c21072154f1f78349a4add3327539c6910dd",
      "new_mode": 33188,
      "new_path": "loop/webui/src/data.ts",
      "score": 100
    },
    {
      "type": "delete",
      "old_id": "a1f62a0ce6990a970f65aab4c55d3a14200aa0c7",
      "old_mode": 33188,
      "old_path": "loop/webui/src/index.html",
      "new_id": "0000000000000000000000000000000000000000",
      "new_mode": 0,
      "new_path": "/dev/null"
    },
    {
      "type": "delete",
      "old_id": "176b454371a6f6683b1915c816b8f2626e4064e1",
      "old_mode": 33188,
      "old_path": "loop/webui/src/input.css",
      "new_id": "0000000000000000000000000000000000000000",
      "new_mode": 0,
      "new_path": "/dev/null"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "6a9f1c347da46058f81551d0bfcea3aab97a4baa",
      "new_mode": 33188,
      "new_path": "loop/webui/src/sketch-app-shell.html"
    },
    {
      "type": "delete",
      "old_id": "2928c447688b4421cf952818999ceb0c79643c52",
      "old_mode": 33188,
      "old_path": "loop/webui/src/timeline.css",
      "new_id": "0000000000000000000000000000000000000000",
      "new_mode": 0,
      "new_path": "/dev/null"
    },
    {
      "type": "delete",
      "old_id": "46144c1ca2379d9a2f45083f238e630057f2b6cd",
      "old_mode": 33188,
      "old_path": "loop/webui/src/timeline.html",
      "new_id": "0000000000000000000000000000000000000000",
      "new_mode": 0,
      "new_path": "/dev/null"
    },
    {
      "type": "delete",
      "old_id": "eef2726cff3865851ddfd7f7a77af048ec9d4b00",
      "old_mode": 33188,
      "old_path": "loop/webui/src/timeline.ts",
      "new_id": "0000000000000000000000000000000000000000",
      "new_mode": 0,
      "new_path": "/dev/null"
    },
    {
      "type": "delete",
      "old_id": "0ed56e8f873406ce8a1795dabde743bd6ce8c16f",
      "old_mode": 33188,
      "old_path": "loop/webui/src/timeline/charts.ts",
      "new_id": "0000000000000000000000000000000000000000",
      "new_mode": 0,
      "new_path": "/dev/null"
    },
    {
      "type": "delete",
      "old_id": "f4303f2d9a53a423a4b58a7384e70ff242f901ce",
      "old_mode": 33188,
      "old_path": "loop/webui/src/timeline/commits.ts",
      "new_id": "0000000000000000000000000000000000000000",
      "new_mode": 0,
      "new_path": "/dev/null"
    },
    {
      "type": "delete",
      "old_id": "12f90ecbf86f97ae943e0545c06be2b4508c1456",
      "old_mode": 33188,
      "old_path": "loop/webui/src/timeline/components/collapsible.ts",
      "new_id": "0000000000000000000000000000000000000000",
      "new_mode": 0,
      "new_path": "/dev/null"
    },
    {
      "type": "delete",
      "old_id": "d9b994bc361b385e9d7c39f1ca11b58e2c9c2c45",
      "old_mode": 33188,
      "old_path": "loop/webui/src/timeline/copybutton.ts",
      "new_id": "0000000000000000000000000000000000000000",
      "new_mode": 0,
      "new_path": "/dev/null"
    },
    {
      "type": "delete",
      "old_id": "1460dc36d26076d89ad14f3fe8bac6e6446ca794",
      "old_mode": 33188,
      "old_path": "loop/webui/src/timeline/diffviewer.ts",
      "new_id": "0000000000000000000000000000000000000000",
      "new_mode": 0,
      "new_path": "/dev/null"
    },
    {
      "type": "delete",
      "old_id": "d9480c59b6762e472fe48a375c0fef31520ffe63",
      "old_mode": 33188,
      "old_path": "loop/webui/src/timeline/icons/index.ts",
      "new_id": "0000000000000000000000000000000000000000",
      "new_mode": 0,
      "new_path": "/dev/null"
    },
    {
      "type": "delete",
      "old_id": "a3d24b7d5d9b58535832fa32fb039bbe9c4ee67b",
      "old_mode": 33188,
      "old_path": "loop/webui/src/timeline/index.ts",
      "new_id": "0000000000000000000000000000000000000000",
      "new_mode": 0,
      "new_path": "/dev/null"
    },
    {
      "type": "delete",
      "old_id": "8199b699c354f46688e7055f7deb1738aa6ffb16",
      "old_mode": 33188,
      "old_path": "loop/webui/src/timeline/markdown/renderer.ts",
      "new_id": "0000000000000000000000000000000000000000",
      "new_mode": 0,
      "new_path": "/dev/null"
    },
    {
      "type": "delete",
      "old_id": "f2770eea0d58e0eddeb61050b8487bf8d83c10cd",
      "old_mode": 33188,
      "old_path": "loop/webui/src/timeline/renderer.ts",
      "new_id": "0000000000000000000000000000000000000000",
      "new_mode": 0,
      "new_path": "/dev/null"
    },
    {
      "type": "delete",
      "old_id": "df3b8f9a820f49d77f267ea4f2cc4ca3cf3d7565",
      "old_mode": 33188,
      "old_path": "loop/webui/src/timeline/scroll.ts",
      "new_id": "0000000000000000000000000000000000000000",
      "new_mode": 0,
      "new_path": "/dev/null"
    },
    {
      "type": "delete",
      "old_id": "5df88bd3461f7a3cdcd270bc64938a0a0fdefc32",
      "old_mode": 33188,
      "old_path": "loop/webui/src/timeline/toolcalls.ts",
      "new_id": "0000000000000000000000000000000000000000",
      "new_mode": 0,
      "new_path": "/dev/null"
    },
    {
      "type": "delete",
      "old_id": "81d47d0e79e332b52937828416f82cc5b2c3d7e1",
      "old_mode": 33188,
      "old_path": "loop/webui/src/timeline/types.ts",
      "new_id": "0000000000000000000000000000000000000000",
      "new_mode": 0,
      "new_path": "/dev/null"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "f91c9af961f231b64aa5bd77da1bc54397eee48b",
      "new_mode": 33188,
      "new_path": "loop/webui/src/types.ts"
    },
    {
      "type": "rename",
      "old_id": "ff505f924e186703d03ddf0d88504bb4f80aa7eb",
      "old_mode": 33188,
      "old_path": "loop/webui/src/timeline/utils.ts",
      "new_id": "ff505f924e186703d03ddf0d88504bb4f80aa7eb",
      "new_mode": 33188,
      "new_path": "loop/webui/src/utils.ts",
      "score": 100
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "bb9750ee24bfdb119d133460f7d34c9436a867c6",
      "new_mode": 33188,
      "new_path": "loop/webui/src/web-components/demo/demo.css"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "3f728c049e35cd7aa600fcf4f2a4533993b35823",
      "new_mode": 33188,
      "new_path": "loop/webui/src/web-components/demo/index.html"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "8e3c33c4ecc6f4036197912cd3d43ebebd6ff479",
      "new_mode": 33188,
      "new_path": "loop/webui/src/web-components/demo/readme.md"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "092ad7c0e07b58f33f16a6cfe80d2602a96dd494",
      "new_mode": 33188,
      "new_path": "loop/webui/src/web-components/demo/sketch-app-shell.demo.html"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "b525785c1b58201a07f83425ff868230b2ec013e",
      "new_mode": 33188,
      "new_path": "loop/webui/src/web-components/demo/sketch-charts.demo.html"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "4806035429ca44ca908fd648bb1ab87c4c59e13b",
      "new_mode": 33188,
      "new_path": "loop/webui/src/web-components/demo/sketch-chat-input.demo.html"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "bd2544debecc2fbaeef064400ca898840f28d76e",
      "new_mode": 33188,
      "new_path": "loop/webui/src/web-components/demo/sketch-container-status.demo.html"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "63b53955eec8a979331f1cc86bbd4b01dbcee4af",
      "new_mode": 33188,
      "new_path": "loop/webui/src/web-components/demo/sketch-diff-view.demo.html"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "9926b0e820acedcb778a74fc925cfc0ed6c7eae7",
      "new_mode": 33188,
      "new_path": "loop/webui/src/web-components/demo/sketch-network-status.demo.html"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "466f9102af9077e75e5c635b645b96ffcb98f8b7",
      "new_mode": 33188,
      "new_path": "loop/webui/src/web-components/demo/sketch-timeline-message.demo.html"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "427181d160f207fb660d6d1e20e301aa05a6e0a7",
      "new_mode": 33188,
      "new_path": "loop/webui/src/web-components/demo/sketch-timeline.demo.html"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "a72babc5c76c9318efb1c4d9059411511c7e3553",
      "new_mode": 33188,
      "new_path": "loop/webui/src/web-components/demo/sketch-tool-calls.demo.html"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "dac6831ecb370c27b50da6e17edef4c8f9f7bce4",
      "new_mode": 33188,
      "new_path": "loop/webui/src/web-components/demo/sketch-view-mode-select.demo.html"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "2c7b111ecb431e44fea7d3a6dfc7963ef045d9f8",
      "new_mode": 33188,
      "new_path": "loop/webui/src/web-components/sketch-app-shell.ts"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "3bde418cd8c7d598881068d4688a871196c04c6a",
      "new_mode": 33188,
      "new_path": "loop/webui/src/web-components/sketch-charts.ts"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "7d93c170488786989fa386848de9875748ee850f",
      "new_mode": 33188,
      "new_path": "loop/webui/src/web-components/sketch-chat-input.test.ts"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "3e75b52007a21a034942b289c082c7ccf4629a9a",
      "new_mode": 33188,
      "new_path": "loop/webui/src/web-components/sketch-chat-input.ts"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "3a898eed07d48c1514b31484352b1a59fc8faf15",
      "new_mode": 33188,
      "new_path": "loop/webui/src/web-components/sketch-container-status.test.ts"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "c0f9626ce12423da50936e6a74277e4951effebb",
      "new_mode": 33188,
      "new_path": "loop/webui/src/web-components/sketch-container-status.ts"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "562eb1e221649c6de6674d2f0ac743f8a548d353",
      "new_mode": 33188,
      "new_path": "loop/webui/src/web-components/sketch-diff-view.ts"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "a580a8f6c8b0cc44f46a7ebef2b862e6c059c2df",
      "new_mode": 33188,
      "new_path": "loop/webui/src/web-components/sketch-network-status.test.ts"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "4b01e5edaaef1267098a3029b82f36c295e48f4b",
      "new_mode": 33188,
      "new_path": "loop/webui/src/web-components/sketch-network-status.ts"
    },
    {
      "type": "rename",
      "old_id": "fbe9a7d1b29533abadc85e55e0641da9db7c8a72",
      "old_mode": 33188,
      "old_path": "loop/webui/src/timeline/terminal.ts",
      "new_id": "788521d0e18be1d88ceb2e77fe9d0f620e2d7104",
      "new_mode": 33188,
      "new_path": "loop/webui/src/web-components/sketch-terminal.ts",
      "score": 73
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "3f306966bdd47021b846e60a289b19ab64894435",
      "new_mode": 33188,
      "new_path": "loop/webui/src/web-components/sketch-timeline-message.test.ts"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "cd2985a10e8925ad3e756e95a89852768d1b32df",
      "new_mode": 33188,
      "new_path": "loop/webui/src/web-components/sketch-timeline-message.ts"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "8122db743bde44bc369651530254c11a4ad53b7d",
      "new_mode": 33188,
      "new_path": "loop/webui/src/web-components/sketch-timeline.ts"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "a8d0accf49e5d793fb720750eff32e601f37cced",
      "new_mode": 33188,
      "new_path": "loop/webui/src/web-components/sketch-tool-calls.ts"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "beb0b6710eb7a785bd0bd8a72b50ae4620692e7e",
      "new_mode": 33188,
      "new_path": "loop/webui/src/web-components/sketch-view-mode-select.test.ts"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "b55282a6ac694f393e1dd91a549d4ace9a96250c",
      "new_mode": 33188,
      "new_path": "loop/webui/src/web-components/sketch-view-mode-select.ts"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "04f008715066fe2097241e302e6eb7962d1d6beb",
      "new_mode": 33188,
      "new_path": "loop/webui/src/web-components/vega-embed.ts"
    },
    {
      "type": "delete",
      "old_id": "91d9b4bbdaf929089b1f43f517064960006b9ae9",
      "old_mode": 33188,
      "old_path": "loop/webui/tailwind.config.js",
      "new_id": "0000000000000000000000000000000000000000",
      "new_mode": 0,
      "new_path": "/dev/null"
    },
    {
      "type": "modify",
      "old_id": "810eb41d5d865928484a68b339a6ef52c8e3c712",
      "old_mode": 33188,
      "old_path": "loop/webui/tsconfig.json",
      "new_id": "8b79a514cb575261cf764263c6829590af4e23e5",
      "new_mode": 33188,
      "new_path": "loop/webui/tsconfig.json"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "a1f598b9bc291cbef5931631b402a423aa2fc2eb",
      "new_mode": 33188,
      "new_path": "loop/webui/web-dev-server.config.mjs"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "64886f8433e7df2a1b7065290915efc6f7bac022",
      "new_mode": 33188,
      "new_path": "loop/webui/web-test-runner.config.mjs"
    }
  ]
}
