)]}'
{
  "log": [
    {
      "commit": "75a58c53140a75ff78375abea618fe163b5c3935",
      "tree": "ffc0e6cb23295ffc6477b0d4c7d2217802cf625e",
      "parents": [
        "6bc3f391b5eb688c0baafcfbacdcf9ab60a493e5"
      ],
      "author": {
        "name": "Yang Luo",
        "email": "hsluoyz@gmail.com",
        "time": "Mon Aug 17 11:30:52 2026 +0800"
      },
      "committer": {
        "name": "Yang Luo",
        "email": "hsluoyz@gmail.com",
        "time": "Mon Aug 17 11:30:52 2026 +0800"
      },
      "message": "fix(channel): restore the deleted upstream url helpers\n"
    },
    {
      "commit": "6bc3f391b5eb688c0baafcfbacdcf9ab60a493e5",
      "tree": "ad71d6dd5a4b6384b6b0aeb62a9403ced6522782",
      "parents": [
        "a292e2d2677461271d5748d8e6c2c9ef522e55b4"
      ],
      "author": {
        "name": "Yang Luo",
        "email": "hsluoyz@gmail.com",
        "time": "Mon Aug 17 11:21:12 2026 +0800"
      },
      "committer": {
        "name": "Yang Luo",
        "email": "hsluoyz@gmail.com",
        "time": "Mon Aug 17 11:21:12 2026 +0800"
      },
      "message": "chore(i18n): keep only en and zh locales\n"
    },
    {
      "commit": "a292e2d2677461271d5748d8e6c2c9ef522e55b4",
      "tree": "e95ddbb4d04fb80e8b3bb3a06d8e2e546e27a825",
      "parents": [
        "9152178969ab32f70ab29f2e091798c5e549ba50"
      ],
      "author": {
        "name": "Yang Luo",
        "email": "hsluoyz@gmail.com",
        "time": "Mon Aug 17 11:17:50 2026 +0800"
      },
      "committer": {
        "name": "Yang Luo",
        "email": "hsluoyz@gmail.com",
        "time": "Mon Aug 17 11:17:50 2026 +0800"
      },
      "message": "feat(auth): make casdoor optional and default to built-in sign-in\n"
    },
    {
      "commit": "9152178969ab32f70ab29f2e091798c5e549ba50",
      "tree": "3b34ab5514d46c8d55431a69fbf58e91dfd0a23a",
      "parents": [
        "2f09a1cdb5b95e1f8310fbb338b751d1da7141ba"
      ],
      "author": {
        "name": "Yang Luo",
        "email": "hsluoyz@gmail.com",
        "time": "Sun Aug 16 23:38:57 2026 +0800"
      },
      "committer": {
        "name": "Yang Luo",
        "email": "hsluoyz@gmail.com",
        "time": "Sun Aug 16 23:38:57 2026 +0800"
      },
      "message": "fix(channel): stop doubling the /v1 prefix in upstream urls\n"
    },
    {
      "commit": "2f09a1cdb5b95e1f8310fbb338b751d1da7141ba",
      "tree": "b12962c55b6d7227728132c7b910a6fc021b2c50",
      "parents": [
        "4ef0a8a8bdf00866d7daeae595f321eecb8a6277"
      ],
      "author": {
        "name": "Yang Luo",
        "email": "hsluoyz@gmail.com",
        "time": "Sat Aug 15 14:50:38 2026 +0800"
      },
      "committer": {
        "name": "Yang Luo",
        "email": "hsluoyz@gmail.com",
        "time": "Sat Aug 15 14:50:38 2026 +0800"
      },
      "message": "fix(web): make the records page reach the whole window and stop it flickering\n\nThe page could only ever show 200 records. getAgentRecords defaulted to that\nlimit and the caller never passed one, so with a 1000 record window the older\n800 were unreachable through the UI with no control to ask for them. The limit\nis now a filter like the others, carried in the URL so a view can be shared.\n\nThe three second poll also raised the table\u0027s loading state on every tick, which\ncovered the rows being read and left the refresh button spinning forever.\nBackground refreshes are now silent, and auto refresh can be turned off.\n\nAgentsPage asked for agent:Unpatched, a key that exists in neither locale, so a\nsuccessful unpatch rendered the raw key. It now uses translated phrases that\nread as status rather than as the internal verb.\n\nThe payload block hardcoded a light grey that disappears against a dark\nbackground; it uses a translucent overlay instead.\n\nRecords live only in memory, which operators discovered by losing them across a\nrestart, so the page now says so up front.\n"
    },
    {
      "commit": "4ef0a8a8bdf00866d7daeae595f321eecb8a6277",
      "tree": "008a08b3a93ee73f58923cdd48de67bd5ed2c11d",
      "parents": [
        "b9bff1c20e0f5523bef573c33b042c6e1de87be3"
      ],
      "author": {
        "name": "Yang Luo",
        "email": "hsluoyz@gmail.com",
        "time": "Sat Aug 15 14:46:36 2026 +0800"
      },
      "committer": {
        "name": "Yang Luo",
        "email": "hsluoyz@gmail.com",
        "time": "Sat Aug 15 14:46:36 2026 +0800"
      },
      "message": "perf(agentmonitor): keep status off the poll path and prune stale cursors\n\npoll held the manager mutex for the whole pass, including the directory walk,\nthe file reads and the record parsing. CodexMonitorStatus needs the same mutex\nand the agents page asks for it every few seconds, so reading the UI queued\nbehind disk IO. Status also walked the sessions directory itself, so displaying\na row cost a second full scan.\n\nThe manager now has two locks with a strict order. pollMutex makes the poller\nthe single writer of cursor state and covers the IO; mutex only guards the maps\nand is taken in short bursts. Status answers from a summary the poller records\nat the end of each pass, so it performs no IO at all and never touches cursor\nfields the poller is writing.\n\nCursors were also never removed. Rollout directories only grow, so every file\never seen kept an entry that was serialized back to the state file on each\ndirty poll. Cursors whose file is gone are now dropped as part of the pass.\n\nThe remaining hardcoded one second tickers move to the configured interval.\n"
    },
    {
      "commit": "b9bff1c20e0f5523bef573c33b042c6e1de87be3",
      "tree": "a337fa441988aac40da5475390e2e1cdf34a476c",
      "parents": [
        "cc37cf47adeb03d5549d45fcfc5feae8b2bbbf56"
      ],
      "author": {
        "name": "Yang Luo",
        "email": "hsluoyz@gmail.com",
        "time": "Sat Aug 15 14:39:03 2026 +0800"
      },
      "committer": {
        "name": "Yang Luo",
        "email": "hsluoyz@gmail.com",
        "time": "Sat Aug 15 14:39:03 2026 +0800"
      },
      "message": "feat(agentmonitor): make the record window and poll interval configurable\n\nRecordCapacity was a const, so the only bound on the live window was 1000\nrecords against a 64 KiB payload cap: a busy host could hold roughly 64 MiB with\nno way for an operator to trade retention for memory. The file tailers polled on\na hardcoded one second tick, which is expensive on hosts with a long agent\nhistory and cannot be relaxed.\n\nBoth are now read from app.conf as agentRecordCapacity and\nagentMonitorPollSeconds, with the poll default relaxed to five seconds. Session\ndirectories only ever grow and are only ever appended to, so a slower tick costs\na little freshness and saves a great deal of disk traffic.\n\nResizing the ring buffer keeps the most recent records that still fit rather\nthan discarding the window.\n"
    },
    {
      "commit": "cc37cf47adeb03d5549d45fcfc5feae8b2bbbf56",
      "tree": "5c0fc9d1092ba0d3c8d7eb46853ace8d2e2a94c6",
      "parents": [
        "757ab6a591df2ac395191480b9559b55f1a3a0fb"
      ],
      "author": {
        "name": "Yang Luo",
        "email": "hsluoyz@gmail.com",
        "time": "Sat Aug 15 14:06:36 2026 +0800"
      },
      "committer": {
        "name": "Yang Luo",
        "email": "hsluoyz@gmail.com",
        "time": "Sat Aug 15 14:06:36 2026 +0800"
      },
      "message": "feat(agentpatch): tell operators what patching Claude Code changes\n\nclaudeCodePatcher was the only patcher without PatchNotice, so its row fell back\nto the generic \"Enables audit-only monitoring for this agent\" and offered no\nfollow-up. Claude Desktop and OpenClaw both said what they change and that a\nrestart is needed, which made Claude Code look like it needed nothing, when in\nfact sessions already running keep using the settings they loaded at startup.\n"
    },
    {
      "commit": "757ab6a591df2ac395191480b9559b55f1a3a0fb",
      "tree": "a4e0a3d90ad2608f2335e887b0e30ee0b4f11324",
      "parents": [
        "78ee914c0a13cc962085bf8a47f1adef904b70a3"
      ],
      "author": {
        "name": "Yang Luo",
        "email": "hsluoyz@gmail.com",
        "time": "Sat Aug 15 14:05:52 2026 +0800"
      },
      "committer": {
        "name": "Yang Luo",
        "email": "hsluoyz@gmail.com",
        "time": "Sat Aug 15 14:05:52 2026 +0800"
      },
      "message": "fix(agentpatch): authenticate agent record ingestion\n\n/api/add-agent-record treated a loopback socket as authorization. That is not a\nboundary in either direction. Behind nginx or a Docker port mapping every\nexternal request arrives from 127.0.0.1, and because CORS allows any origin with\ncredentials, any web page the operator visits can POST to 127.0.0.1:17000\ndirectly. Either one lets an attacker forge activity, and an audit trail that\ncan be poisoned is worth nothing.\n\nPatch now mints a per-installation token, persists it beside the other patch\nstate, and passes it to the reporter it configures. Hooks, the MCP recorder and\nthe OpenClaw handler present it in a header, the endpoint verifies it in\nconstant time, and Unpatch revokes it so a hook left behind cannot keep\nreporting. The token also pins which agent a reporter may speak for.\n\nRequests carrying a forwarding header are refused outright, so loopback means\nthe peer really is local.\n\nrecordsURL now validates httpport instead of formatting whatever it finds,\nbecause an invalid value was being baked into agent configuration files.\n"
    },
    {
      "commit": "78ee914c0a13cc962085bf8a47f1adef904b70a3",
      "tree": "3b1073b59b6b19ac570dc3ee45eb5dde6a16247e",
      "parents": [
        "417a18e9539f99e54346c41f5712de62eef37e43"
      ],
      "author": {
        "name": "Yang Luo",
        "email": "hsluoyz@gmail.com",
        "time": "Sat Aug 15 14:02:43 2026 +0800"
      },
      "committer": {
        "name": "Yang Luo",
        "email": "hsluoyz@gmail.com",
        "time": "Sat Aug 15 14:02:43 2026 +0800"
      },
      "message": "fix(agentpatch): never wedge unpatch when a config changed after patch\n\nverifyPatchOwnership refused the whole revert when any patched file no longer\nhashed to what Patch wrote. Claude Desktop rewrites claude_desktop_config.json\nwhenever the user edits their MCP servers, so that condition is reached in\nnormal use, and because Apply reverts first the installation could then neither\nbe unpatched nor patched again, with no force option and no guidance.\n\nrollback now restores only the files the patch still owns, leaves externally\nchanged files exactly as they are, and always clears the tracked state, so a\ntarget can never get stuck. Skipped files are reported as PartialRevertError so\nthe operator is told what to clean up by hand.\n\nThe Claude Desktop patcher no longer backs up the whole config either. It owns\none mcpServers key and adds or deletes exactly that, which is reliable no matter\nwhat else rewrote the file, and it discards manifests left by the old scheme\nwithout restoring them over the current configuration.\n"
    },
    {
      "commit": "417a18e9539f99e54346c41f5712de62eef37e43",
      "tree": "79f7930c0cf4b74ff15f54beef0ed542aac27ad0",
      "parents": [
        "00220596b6b7d63d416717daccac3eae2cc4e23c"
      ],
      "author": {
        "name": "Yang Luo",
        "email": "hsluoyz@gmail.com",
        "time": "Sat Aug 15 14:01:19 2026 +0800"
      },
      "committer": {
        "name": "Yang Luo",
        "email": "hsluoyz@gmail.com",
        "time": "Sat Aug 15 14:01:19 2026 +0800"
      },
      "message": "fix(agentpatch): resolve the owner home strictly and verify patch targets\n\nhomeOf fell back to os.UserHomeDir() whenever user.Lookup failed. Lookup\nroutinely fails for DOMAIN\\user on Windows, so patching an installation owned\nby another account silently wrote the hook into the home of whichever account\nruns Gateway: the operator saw Patched while nothing was collected and an\nunrelated settings.json had been rewritten. An unresolvable owner is now an\nerror, with a fallback only when the owner really is the current account.\n\nPatchAgent and UnpatchAgent also took the agentId/path/owner triple straight\nfrom the request body. Combined with the home lookup that is a write primitive\ninto any account\u0027s home, so the target is now matched against the discovered\ninstallations before it is used.\n"
    },
    {
      "commit": "00220596b6b7d63d416717daccac3eae2cc4e23c",
      "tree": "8e6cdb7e72ad3b121aeec4b305e49e95e5c357d6",
      "parents": [
        "78687bb1878275911cd8b72fcec315c37cc61cdf"
      ],
      "author": {
        "name": "Paperlz",
        "email": "2305927848@qq.com",
        "time": "Sat Aug 15 13:33:59 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Aug 15 13:33:59 2026 +0800"
      },
      "message": "feat: add agent patch monitoring (#196)"
    },
    {
      "commit": "78687bb1878275911cd8b72fcec315c37cc61cdf",
      "tree": "ed95c6985e9bccb8c6b2eac24e9d20b0704093d3",
      "parents": [
        "147ebfe25fedec56a3221070fb0f15ea67755bed"
      ],
      "author": {
        "name": "Paperlz",
        "email": "2305927848@qq.com",
        "time": "Thu Aug 13 15:04:22 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Aug 13 15:04:22 2026 +0800"
      },
      "message": "feat: add cross-platform AI agent detection- #192 (#192)"
    },
    {
      "commit": "147ebfe25fedec56a3221070fb0f15ea67755bed",
      "tree": "de6d944692c63d27b4873ed92fe2d83d7c45720e",
      "parents": [
        "d0713e352e88d4311b051fe3b7fcfd942b338a48"
      ],
      "author": {
        "name": "Ziyang Dong",
        "email": "bainianbei@gmail.com",
        "time": "Thu Aug 13 13:41:25 2026 +0800"
      },
      "committer": {
        "name": "Yang Luo",
        "email": "hsluoyz@gmail.com",
        "time": "Thu Aug 13 13:58:14 2026 +0800"
      },
      "message": "feat: add unified LLM API proxy endpoint /v1/chat/completions (#190)\n"
    },
    {
      "commit": "d0713e352e88d4311b051fe3b7fcfd942b338a48",
      "tree": "ba80dbf7a4001479f1c3cbb6d7bac084274e9427",
      "parents": [
        "a2387e68d0258164ce7bb9fe313a4ac094c7a1c0"
      ],
      "author": {
        "name": "Ziyang Dong",
        "email": "bainianbei@gmail.com",
        "time": "Wed Aug 12 15:26:32 2026 +0800"
      },
      "committer": {
        "name": "Yang Luo",
        "email": "hsluoyz@gmail.com",
        "time": "Wed Aug 12 15:50:19 2026 +0800"
      },
      "message": "feat: add channel management for LLM API gateway (#187)\n"
    },
    {
      "commit": "a2387e68d0258164ce7bb9fe313a4ac094c7a1c0",
      "tree": "4f136f24fb080201342c5830819c7c5573a284ef",
      "parents": [
        "1c9b67563dad81e79e7f3d5f6f52b07fcb91708f"
      ],
      "author": {
        "name": "Yang Luo",
        "email": "hsluoyz@gmail.com",
        "time": "Mon Aug 10 21:51:25 2026 +0800"
      },
      "committer": {
        "name": "Yang Luo",
        "email": "hsluoyz@gmail.com",
        "time": "Mon Aug 10 21:51:25 2026 +0800"
      },
      "message": "chore: rename to Casbin Gateway\n"
    },
    {
      "commit": "1c9b67563dad81e79e7f3d5f6f52b07fcb91708f",
      "tree": "415d3cc0cfdb8bc84a4b8a4bb3c89e69f202dc24",
      "parents": [
        "6f2a12ac30f50713014568eb4903939528f353bd"
      ],
      "author": {
        "name": "Yang Luo",
        "email": "hsluoyz@gmail.com",
        "time": "Mon Aug 10 21:42:48 2026 +0800"
      },
      "committer": {
        "name": "Yang Luo",
        "email": "hsluoyz@gmail.com",
        "time": "Mon Aug 10 21:42:48 2026 +0800"
      },
      "message": "feat: update repo path\n"
    },
    {
      "commit": "6f2a12ac30f50713014568eb4903939528f353bd",
      "tree": "3d1f668a88985908e2a4b42f41cfd46e4e1a8ef0",
      "parents": [
        "e9f1e0a784ee33c7e905140a93d6ad70629bde13"
      ],
      "author": {
        "name": "Ziyang Dong",
        "email": "bainianbei@gmail.com",
        "time": "Mon Aug 10 21:21:02 2026 +0800"
      },
      "committer": {
        "name": "Yang Luo",
        "email": "hsluoyz@gmail.com",
        "time": "Mon Aug 10 21:29:57 2026 +0800"
      },
      "message": "ci: replace semantic-release with manual tag-triggered release (#180)\n"
    },
    {
      "commit": "e9f1e0a784ee33c7e905140a93d6ad70629bde13",
      "tree": "2438b0da48f3f316580d23f3c0e138aec6a6708c",
      "parents": [
        "e0c1c0c628830b40311f853a10dbf82a201657c0"
      ],
      "author": {
        "name": "Ziyang Dong",
        "email": "bainianbei@gmail.com",
        "time": "Mon Aug 10 20:50:51 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Aug 10 20:50:51 2026 +0800"
      },
      "message": "docs: add DISCLAIMER and NOTICE (#181)"
    },
    {
      "commit": "e0c1c0c628830b40311f853a10dbf82a201657c0",
      "tree": "2a379a7250b4e1823b4217a2d314672820bfe76b",
      "parents": [
        "b4d745cc0ef9ee607414ef06d509c857565c8d55"
      ],
      "author": {
        "name": "Yang Luo",
        "email": "hsluoyz@gmail.com",
        "time": "Mon May 04 23:07:22 2026 +0800"
      },
      "committer": {
        "name": "Yang Luo",
        "email": "hsluoyz@gmail.com",
        "time": "Mon May 04 23:07:22 2026 +0800"
      },
      "message": "fix: support opendata repos\n"
    },
    {
      "commit": "b4d745cc0ef9ee607414ef06d509c857565c8d55",
      "tree": "35e3731d637280070fd6fd2d4b3137978d46f0cc",
      "parents": [
        "4f6f95691f4b8e67c0f279eba23824dd70a3a091"
      ],
      "author": {
        "name": "Yang Luo",
        "email": "hsluoyz@gmail.com",
        "time": "Tue Apr 28 02:59:11 2026 +0800"
      },
      "committer": {
        "name": "Yang Luo",
        "email": "hsluoyz@gmail.com",
        "time": "Tue Apr 28 02:59:11 2026 +0800"
      },
      "message": "fix: improve upload cdn print\n"
    },
    {
      "commit": "4f6f95691f4b8e67c0f279eba23824dd70a3a091",
      "tree": "0d9d0bc17ac71400779a91d8a167b154a2bf3323",
      "parents": [
        "3561e266d8abed574b070058d5f5a698daa51416"
      ],
      "author": {
        "name": "Yang Luo",
        "email": "hsluoyz@gmail.com",
        "time": "Tue Apr 28 02:17:15 2026 +0800"
      },
      "committer": {
        "name": "Yang Luo",
        "email": "hsluoyz@gmail.com",
        "time": "Tue Apr 28 02:17:15 2026 +0800"
      },
      "message": "feat: add casdoor_ to isFrontendBaseDirEnabledRepo()\n"
    },
    {
      "commit": "3561e266d8abed574b070058d5f5a698daa51416",
      "tree": "4e5f3f328c53d44892a319515020a83f7fb2b8bd",
      "parents": [
        "87936ab4c85831252685c72d580d8feab3f103ca"
      ],
      "author": {
        "name": "Yang Luo",
        "email": "hsluoyz@gmail.com",
        "time": "Sun Mar 29 21:23:34 2026 +0800"
      },
      "committer": {
        "name": "Yang Luo",
        "email": "hsluoyz@gmail.com",
        "time": "Sun Mar 29 21:31:52 2026 +0800"
      },
      "message": "feat: add UrlPathRule\n"
    },
    {
      "commit": "87936ab4c85831252685c72d580d8feab3f103ca",
      "tree": "6aa285e50e4e694e09d449155b52845b4f1918bf",
      "parents": [
        "bc0c102403579272d46d90ee19519a2545299cbe"
      ],
      "author": {
        "name": "Paweł Markowski",
        "email": "pm4public@gmail.com",
        "time": "Mon Feb 16 12:43:24 2026 +0100"
      },
      "committer": {
        "name": "Yang Luo",
        "email": "hsluoyz@gmail.com",
        "time": "Sun Mar 29 21:31:48 2026 +0800"
      },
      "message": "feat: fix dockerfile missing package (tzdata) (#160)\n\n"
    },
    {
      "commit": "bc0c102403579272d46d90ee19519a2545299cbe",
      "tree": "b7e804d63b08d2be0dae6af2326c49d640846509",
      "parents": [
        "723f2479594386c691d1e87cb8da321980502d70"
      ],
      "author": {
        "name": "Yang Luo",
        "email": "hsluoyz@gmail.com",
        "time": "Thu Jan 29 23:12:08 2026 +0800"
      },
      "committer": {
        "name": "Yang Luo",
        "email": "hsluoyz@gmail.com",
        "time": "Thu Jan 29 23:12:08 2026 +0800"
      },
      "message": "feat: fix CORS issue (#157)\n"
    },
    {
      "commit": "723f2479594386c691d1e87cb8da321980502d70",
      "tree": "99d6373bc0bb60647d31328b2ec192aab011d2f4",
      "parents": [
        "e96692bc760b7774dae815c3fd662f14df132ec5"
      ],
      "author": {
        "name": "Yang Luo",
        "email": "hsluoyz@gmail.com",
        "time": "Thu Jan 29 22:48:45 2026 +0800"
      },
      "committer": {
        "name": "Yang Luo",
        "email": "hsluoyz@gmail.com",
        "time": "Thu Jan 29 22:48:45 2026 +0800"
      },
      "message": "feat: add HSTS header to HTTPS responses (#156)\n"
    },
    {
      "commit": "e96692bc760b7774dae815c3fd662f14df132ec5",
      "tree": "e8144ada79a09de8e36dc4be691fbc1c46fe4b22",
      "parents": [
        "f9b8b685ef2c32daea3546657a7b1902b2cfa181"
      ],
      "author": {
        "name": "Yang Luo",
        "email": "hsluoyz@gmail.com",
        "time": "Thu Jan 29 22:35:44 2026 +0800"
      },
      "committer": {
        "name": "Yang Luo",
        "email": "hsluoyz@gmail.com",
        "time": "Thu Jan 29 22:35:44 2026 +0800"
      },
      "message": "feat: add Secure flag to cookies (#153)\n"
    },
    {
      "commit": "f9b8b685ef2c32daea3546657a7b1902b2cfa181",
      "tree": "364ec2eb4147172751c89eaadf5058034a9f16d8",
      "parents": [
        "7f93e98e911a5d225e1d82b1569ade171196f87d"
      ],
      "author": {
        "name": "DacongDA",
        "email": "dacongda1@sina.com",
        "time": "Thu Jan 29 16:40:44 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jan 29 16:40:44 2026 +0800"
      },
      "message": "feat: improve /debug/vars handling (#142)\n\n"
    },
    {
      "commit": "7f93e98e911a5d225e1d82b1569ade171196f87d",
      "tree": "caf38a04c037122850d26da8d2db2f49105c1562",
      "parents": [
        "d203db953862ca648380ca80e3feda4fdde841ae"
      ],
      "author": {
        "name": "Yang Luo",
        "email": "hsluoyz@gmail.com",
        "time": "Wed Dec 24 22:29:48 2025 +0800"
      },
      "committer": {
        "name": "Yang Luo",
        "email": "hsluoyz@gmail.com",
        "time": "Wed Dec 24 22:29:48 2025 +0800"
      },
      "message": "feat: fix Kubernetes deployment: wait-for-it timeout, add complete manifests (#136)\n"
    },
    {
      "commit": "d203db953862ca648380ca80e3feda4fdde841ae",
      "tree": "0b51f5598fab0ded9eaf24992965cfc9c5e90f02",
      "parents": [
        "1f6b0d65a7eab49ffb8696231deda0a4f443ded2"
      ],
      "author": {
        "name": "Yang Luo",
        "email": "hsluoyz@gmail.com",
        "time": "Mon Dec 15 01:39:30 2025 +0800"
      },
      "committer": {
        "name": "Yang Luo",
        "email": "hsluoyz@gmail.com",
        "time": "Mon Dec 15 01:39:30 2025 +0800"
      },
      "message": "Set useProxy to true in cert renew\n"
    },
    {
      "commit": "1f6b0d65a7eab49ffb8696231deda0a4f443ded2",
      "tree": "5428849268c60987840b56dbfbb5fcc6c2982d97",
      "parents": [
        "ea2bc2ae7b79ff7706fbbe6931f8fbb1a4daf9b5"
      ],
      "author": {
        "name": "Yang Luo",
        "email": "hsluoyz@gmail.com",
        "time": "Mon Dec 15 00:48:15 2025 +0800"
      },
      "committer": {
        "name": "Yang Luo",
        "email": "hsluoyz@gmail.com",
        "time": "Mon Dec 15 00:48:15 2025 +0800"
      },
      "message": "fix: improve isCertNearExpire to 7 days\n"
    },
    {
      "commit": "ea2bc2ae7b79ff7706fbbe6931f8fbb1a4daf9b5",
      "tree": "85d7cc9fd8a94d901865d2c6fe8b7e616d4beb9f",
      "parents": [
        "d574f15ac5d13cbab28d54c8713eb833858ab290"
      ],
      "author": {
        "name": "Yang Luo",
        "email": "hsluoyz@gmail.com",
        "time": "Thu Nov 20 01:04:25 2025 +0800"
      },
      "committer": {
        "name": "Yang Luo",
        "email": "hsluoyz@gmail.com",
        "time": "Thu Nov 20 01:04:25 2025 +0800"
      },
      "message": "fix: fix shortcut file check to handle deleted shortcuts with existing bat files (#134)\n"
    },
    {
      "commit": "d574f15ac5d13cbab28d54c8713eb833858ab290",
      "tree": "c61aca0e4219095dd19e1a4a766dfedb977ad7c1",
      "parents": [
        "46ae7bfefda7d5ef19086b5e1f43824b865f96b7"
      ],
      "author": {
        "name": "Yang Luo",
        "email": "hsluoyz@gmail.com",
        "time": "Wed Nov 19 23:45:47 2025 +0800"
      },
      "committer": {
        "name": "Yang Luo",
        "email": "hsluoyz@gmail.com",
        "time": "Wed Nov 19 23:45:47 2025 +0800"
      },
      "message": "feat: fix encoding for Windows tasklist output in IsWindowTitleActive() (#132)\n"
    },
    {
      "commit": "46ae7bfefda7d5ef19086b5e1f43824b865f96b7",
      "tree": "bb4ea53e23f4df4b36d187ba2592721c93348fe8",
      "parents": [
        "600b7cdf766fb762b9039b4ca679f19354b322d0"
      ],
      "author": {
        "name": "Yang Luo",
        "email": "hsluoyz@gmail.com",
        "time": "Wed Nov 19 23:38:48 2025 +0800"
      },
      "committer": {
        "name": "Yang Luo",
        "email": "hsluoyz@gmail.com",
        "time": "Wed Nov 19 23:38:48 2025 +0800"
      },
      "message": "Fix bug in GetNode(site.Node)\n"
    },
    {
      "commit": "600b7cdf766fb762b9039b4ca679f19354b322d0",
      "tree": "3cc56c4a63093d4a5715df4d7971a8bab4a07cfd",
      "parents": [
        "79605009bf3f0a0a6e6bcc4cc72d8d9ca652a0b6"
      ],
      "author": {
        "name": "Yang Luo",
        "email": "hsluoyz@gmail.com",
        "time": "Wed Nov 19 22:46:28 2025 +0800"
      },
      "committer": {
        "name": "Yang Luo",
        "email": "hsluoyz@gmail.com",
        "time": "Wed Nov 19 22:49:28 2025 +0800"
      },
      "message": "fix: add Node.UpgradeMode field to control site upgrade timing (#130)\n"
    },
    {
      "commit": "79605009bf3f0a0a6e6bcc4cc72d8d9ca652a0b6",
      "tree": "6e174a920c6b832ed51f16b630ea070ad91093f3",
      "parents": [
        "006bc9f7f729799f670b45e4a21858b73a572a70"
      ],
      "author": {
        "name": "Yang Luo",
        "email": "hsluoyz@gmail.com",
        "time": "Wed Nov 19 22:23:11 2025 +0800"
      },
      "committer": {
        "name": "Yang Luo",
        "email": "hsluoyz@gmail.com",
        "time": "Wed Nov 19 22:23:11 2025 +0800"
      },
      "message": "fix: improve node list page\n"
    },
    {
      "commit": "006bc9f7f729799f670b45e4a21858b73a572a70",
      "tree": "013d740bfd90bda9b98cc45c5c3324163e5a02af",
      "parents": [
        "4c947b88213b852cc932a6b2f51e9f56c7547fb8"
      ],
      "author": {
        "name": "Yang Luo",
        "email": "hsluoyz@gmail.com",
        "time": "Wed Nov 19 22:22:45 2025 +0800"
      },
      "committer": {
        "name": "Yang Luo",
        "email": "hsluoyz@gmail.com",
        "time": "Wed Nov 19 22:22:45 2025 +0800"
      },
      "message": "feat: prevent duplicate process starts during compilation by checking window title (#128)\n"
    },
    {
      "commit": "4c947b88213b852cc932a6b2f51e9f56c7547fb8",
      "tree": "9e1499bfe66e19ae2d2a4bd9e604718e8a62c488",
      "parents": [
        "ed491156a00e4d3706971347a89be68d2ced1d24"
      ],
      "author": {
        "name": "Yang Luo",
        "email": "hsluoyz@gmail.com",
        "time": "Wed Nov 19 20:58:37 2025 +0800"
      },
      "committer": {
        "name": "Yang Luo",
        "email": "hsluoyz@gmail.com",
        "time": "Wed Nov 19 20:58:37 2025 +0800"
      },
      "message": "feat: add Node pages (#126)\n"
    },
    {
      "commit": "ed491156a00e4d3706971347a89be68d2ced1d24",
      "tree": "62f0020b5e423663c0edcbb26fb48775e1c4409f",
      "parents": [
        "26146f61a57761e63fea1c14467351810c16dcb2"
      ],
      "author": {
        "name": "Yang Luo",
        "email": "hsluoyz@gmail.com",
        "time": "Wed Nov 19 16:43:17 2025 +0800"
      },
      "committer": {
        "name": "Yang Luo",
        "email": "hsluoyz@gmail.com",
        "time": "Wed Nov 19 16:43:17 2025 +0800"
      },
      "message": "Rename Node to NodeItem\n"
    },
    {
      "commit": "26146f61a57761e63fea1c14467351810c16dcb2",
      "tree": "bd65f708fb26e09cce3a459f02b79eeefa036fcd",
      "parents": [
        "18325289fdf45107d44bd1f739e12ad86be0d5e6"
      ],
      "author": {
        "name": "Yang Luo",
        "email": "hsluoyz@gmail.com",
        "time": "Mon Nov 10 23:52:25 2025 +0800"
      },
      "committer": {
        "name": "Yang Luo",
        "email": "hsluoyz@gmail.com",
        "time": "Mon Nov 10 23:52:25 2025 +0800"
      },
      "message": "feat: fix duplicate CI runs on PRs by restricting workflow triggers to specific branches (#123)\n"
    },
    {
      "commit": "18325289fdf45107d44bd1f739e12ad86be0d5e6",
      "tree": "83ae0452928915d611a572ceceb93128645fb201",
      "parents": [
        "e0e44147f3915c605cce09a1bb420b020555f247"
      ],
      "author": {
        "name": "Yang Luo",
        "email": "hsluoyz@gmail.com",
        "time": "Mon Nov 10 23:40:05 2025 +0800"
      },
      "committer": {
        "name": "Yang Luo",
        "email": "hsluoyz@gmail.com",
        "time": "Mon Nov 10 23:40:05 2025 +0800"
      },
      "message": "Fix Docker build failure when semantic-release skips version creation (#121)\n"
    },
    {
      "commit": "e0e44147f3915c605cce09a1bb420b020555f247",
      "tree": "d82b9e36f21a7f55105c16b75747c7a0fccd832d",
      "parents": [
        "96d0ad8613ca3ae0aab2f47b96b2c012daa323f3"
      ],
      "author": {
        "name": "Yang Luo",
        "email": "hsluoyz@gmail.com",
        "time": "Mon Nov 10 14:31:32 2025 +0800"
      },
      "committer": {
        "name": "Yang Luo",
        "email": "hsluoyz@gmail.com",
        "time": "Mon Nov 10 14:31:32 2025 +0800"
      },
      "message": "Improve GetGlobalSites logic\n"
    },
    {
      "commit": "96d0ad8613ca3ae0aab2f47b96b2c012daa323f3",
      "tree": "5776741a3776af98125d2348850489bb3e63ea11",
      "parents": [
        "7f55f5390ce466d745f5c0710f014825a3646393"
      ],
      "author": {
        "name": "Copilot",
        "email": "198982749+Copilot@users.noreply.github.com",
        "time": "Thu Oct 30 17:21:31 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 30 17:21:31 2025 +0800"
      },
      "message": "fix: harden TLS configuration to disable weak cipher suites (#119)\n\n"
    },
    {
      "commit": "7f55f5390ce466d745f5c0710f014825a3646393",
      "tree": "5cf67e15ad8137506c1b704ac472b56d4779a417",
      "parents": [
        "11d94af8f54d12a8d0b608a4e37ceff05681ee1d"
      ],
      "author": {
        "name": "Copilot",
        "email": "198982749+Copilot@users.noreply.github.com",
        "time": "Thu Oct 30 14:35:07 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 30 14:35:07 2025 +0800"
      },
      "message": "fix: disable 3DES cipher suites (#117)\n\n"
    },
    {
      "commit": "11d94af8f54d12a8d0b608a4e37ceff05681ee1d",
      "tree": "0feecbbb887613d16c14d43cda6950c06d5d338f",
      "parents": [
        "e26fa78edb2caa973a31e8dfcf65391bea3536ae"
      ],
      "author": {
        "name": "Copilot",
        "email": "198982749+Copilot@users.noreply.github.com",
        "time": "Thu Oct 30 13:40:06 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 30 13:40:06 2025 +0800"
      },
      "message": "feat: set TLS minimum version to 1.2 for HTTPS gateway (#112)\n\n"
    },
    {
      "commit": "e26fa78edb2caa973a31e8dfcf65391bea3536ae",
      "tree": "05ca1c4b5130ed33344eab5dd8e5205c0f6b9505",
      "parents": [
        "eb7a505b31e9046fb73b2b9d0fefa6cdcca58143"
      ],
      "author": {
        "name": "Copilot",
        "email": "198982749+Copilot@users.noreply.github.com",
        "time": "Thu Oct 30 01:59:53 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 30 01:59:53 2025 +0800"
      },
      "message": "feat: add InitSelfGuard() (#108)\n\n"
    },
    {
      "commit": "eb7a505b31e9046fb73b2b9d0fefa6cdcca58143",
      "tree": "788a27559494ba93433a08389e60653fe4c93114",
      "parents": [
        "730612ca62b4a6148efb6fdf06dd1ba2d0e65ecc"
      ],
      "author": {
        "name": "Copilot",
        "email": "198982749+Copilot@users.noreply.github.com",
        "time": "Sat Oct 25 18:59:16 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Oct 25 18:59:16 2025 +0800"
      },
      "message": "feat: add IsVerbose field to Rule for detailed debug output (#106)\n\n"
    },
    {
      "commit": "730612ca62b4a6148efb6fdf06dd1ba2d0e65ecc",
      "tree": "942d33de96622162c1c87d21e6e82feddc5aaaf6",
      "parents": [
        "2f8d0535d86e152fa498d53289a09d1cf63f3404"
      ],
      "author": {
        "name": "Copilot",
        "email": "198982749+Copilot@users.noreply.github.com",
        "time": "Sat Oct 25 18:37:23 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Oct 25 18:37:23 2025 +0800"
      },
      "message": "feat: fix StopOldInstance bug to check gateway ports before binding (#104)\n\n"
    },
    {
      "commit": "2f8d0535d86e152fa498d53289a09d1cf63f3404",
      "tree": "0132efc66a7d582febdbfc00a722162e530f3baf",
      "parents": [
        "208e41812bb17d8ac61fedc90224ec4800d48df4"
      ],
      "author": {
        "name": "Copilot",
        "email": "198982749+Copilot@users.noreply.github.com",
        "time": "Sat Oct 25 18:16:11 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Oct 25 18:16:11 2025 +0800"
      },
      "message": "feat: fix IsAbroadIp() to return false for intranet IPs (#100)\n\n"
    },
    {
      "commit": "208e41812bb17d8ac61fedc90224ec4800d48df4",
      "tree": "049b7cbdd46719441a6244134afed3afe6bce51a",
      "parents": [
        "ccad01d038536b867832e408cf98230c042b94e4"
      ],
      "author": {
        "name": "Copilot",
        "email": "198982749+Copilot@users.noreply.github.com",
        "time": "Sat Oct 25 18:12:35 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Oct 25 18:12:35 2025 +0800"
      },
      "message": "feat: fix CI: restrict release-and-push job to master branch only (#102)\n\n"
    },
    {
      "commit": "ccad01d038536b867832e408cf98230c042b94e4",
      "tree": "b2d67d9298d6bd75b738dc344c061051d6b34cca",
      "parents": [
        "2b8f74ef397d78bd36ef594d5096e04e4e0ed44a"
      ],
      "author": {
        "name": "Copilot",
        "email": "198982749+Copilot@users.noreply.github.com",
        "time": "Sat Oct 25 18:07:43 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Oct 25 18:07:43 2025 +0800"
      },
      "message": "feat: support StopOldInstance() to kill old process on startup (#96)\n\n"
    },
    {
      "commit": "2b8f74ef397d78bd36ef594d5096e04e4e0ed44a",
      "tree": "7b3c8702fc26893b6735035d4f0b481c42723f32",
      "parents": [
        "ee3e82888b635650f37c365962cd90ca705fece3"
      ],
      "author": {
        "name": "Copilot",
        "email": "198982749+Copilot@users.noreply.github.com",
        "time": "Sat Oct 25 17:43:02 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Oct 25 17:43:02 2025 +0800"
      },
      "message": "feat: update IpRuleTable.js to add \"is abroad\" operator to the operator dropdown (#94)\n\n"
    },
    {
      "commit": "ee3e82888b635650f37c365962cd90ca705fece3",
      "tree": "2b39c7f0fcab19cda1b05081606ae39e242c9340",
      "parents": [
        "1c4a7856f96628a1cee0ddc727591ead9645a313"
      ],
      "author": {
        "name": "Yang Luo",
        "email": "hsluoyz@gmail.com",
        "time": "Sat Oct 25 17:38:50 2025 +0800"
      },
      "committer": {
        "name": "Yang Luo",
        "email": "hsluoyz@gmail.com",
        "time": "Sat Oct 25 17:38:50 2025 +0800"
      },
      "message": "fix: improve logRequest IP logging\n"
    },
    {
      "commit": "1c4a7856f96628a1cee0ddc727591ead9645a313",
      "tree": "8fc3d369279492ff901f4e08ff55be10ffb9f5f7",
      "parents": [
        "532406a87638cb785aee222be3944289fab89881"
      ],
      "author": {
        "name": "Copilot",
        "email": "198982749+Copilot@users.noreply.github.com",
        "time": "Sat Oct 25 17:15:50 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Oct 25 17:15:50 2025 +0800"
      },
      "message": "feat: add \"is abroad\" operator to IP rules (#92)\n\n"
    },
    {
      "commit": "532406a87638cb785aee222be3944289fab89881",
      "tree": "305d4c2378a7542d48c1a1666aae2346e7afa61f",
      "parents": [
        "131363d0ed98097a1a48728fb80b09c0a6b4d141"
      ],
      "author": {
        "name": "Yang Luo",
        "email": "hsluoyz@gmail.com",
        "time": "Sat Oct 25 15:44:47 2025 +0800"
      },
      "committer": {
        "name": "Yang Luo",
        "email": "hsluoyz@gmail.com",
        "time": "Sat Oct 25 15:44:47 2025 +0800"
      },
      "message": "fix: add refreshRuleMap in StartMonitorSitesLoop()\n"
    },
    {
      "commit": "131363d0ed98097a1a48728fb80b09c0a6b4d141",
      "tree": "f06f81d4414c7cf805cd329137dbb7bcc9fdb012",
      "parents": [
        "f9ae159e3affa0679bcfa4bf4f3d7ed08bfb2c2f"
      ],
      "author": {
        "name": "Yang Luo",
        "email": "hsluoyz@gmail.com",
        "time": "Sat Oct 25 15:19:45 2025 +0800"
      },
      "committer": {
        "name": "Yang Luo",
        "email": "hsluoyz@gmail.com",
        "time": "Sat Oct 25 15:19:45 2025 +0800"
      },
      "message": "feat: improve site list page, rule list page\n"
    },
    {
      "commit": "f9ae159e3affa0679bcfa4bf4f3d7ed08bfb2c2f",
      "tree": "39afd008fb4fdc13740882019ce81622be313e75",
      "parents": [
        "f335fca8faff494aaea210a64bb8b1fdd8bd1fe8"
      ],
      "author": {
        "name": "Yang Luo",
        "email": "hsluoyz@gmail.com",
        "time": "Sat Oct 25 14:55:58 2025 +0800"
      },
      "committer": {
        "name": "Yang Luo",
        "email": "hsluoyz@gmail.com",
        "time": "Sat Oct 25 14:55:58 2025 +0800"
      },
      "message": "fix: fix bug in status code in handleRequest()\n"
    },
    {
      "commit": "f335fca8faff494aaea210a64bb8b1fdd8bd1fe8",
      "tree": "df56c4633e149c559fb7e7a575f5968020eb6671",
      "parents": [
        "dd654ff24babef0cae920b978e51d278307c32f1"
      ],
      "author": {
        "name": "Yang Luo",
        "email": "hsluoyz@gmail.com",
        "time": "Sat Oct 25 14:43:25 2025 +0800"
      },
      "committer": {
        "name": "Yang Luo",
        "email": "hsluoyz@gmail.com",
        "time": "Sat Oct 25 14:43:25 2025 +0800"
      },
      "message": "feat: refactor ActionResult to RuleResult\n"
    },
    {
      "commit": "dd654ff24babef0cae920b978e51d278307c32f1",
      "tree": "dceb4d83d9572e6056d7a757b53db92eac09496f",
      "parents": [
        "e302b1020a9ac13e918f18ed48baf153b05c33f3"
      ],
      "author": {
        "name": "Yang Luo",
        "email": "hsluoyz@gmail.com",
        "time": "Sat Oct 25 12:53:25 2025 +0800"
      },
      "committer": {
        "name": "Yang Luo",
        "email": "hsluoyz@gmail.com",
        "time": "Sat Oct 25 12:53:25 2025 +0800"
      },
      "message": "feat: remove Action object\n"
    },
    {
      "commit": "e302b1020a9ac13e918f18ed48baf153b05c33f3",
      "tree": "233df91bd2435d13752170385f5c2cdb546de41f",
      "parents": [
        "15631ade83f4c329dae6618dce799123bf197730"
      ],
      "author": {
        "name": "Yang Luo",
        "email": "hsluoyz@gmail.com",
        "time": "Sat Oct 25 11:59:54 2025 +0800"
      },
      "committer": {
        "name": "Yang Luo",
        "email": "hsluoyz@gmail.com",
        "time": "Sat Oct 25 11:59:54 2025 +0800"
      },
      "message": "Fix bug in CheckRules()\n"
    },
    {
      "commit": "15631ade83f4c329dae6618dce799123bf197730",
      "tree": "515224d4891a2bbbd963c66c3ab59c2b96466c14",
      "parents": [
        "91012bb457bcf616c17de5e38040973182ba484b"
      ],
      "author": {
        "name": "Yang Luo",
        "email": "hsluoyz@gmail.com",
        "time": "Sat Oct 25 11:45:25 2025 +0800"
      },
      "committer": {
        "name": "Yang Luo",
        "email": "hsluoyz@gmail.com",
        "time": "Sat Oct 25 11:45:25 2025 +0800"
      },
      "message": "Improve check rules code\n"
    },
    {
      "commit": "91012bb457bcf616c17de5e38040973182ba484b",
      "tree": "0cb1204cfe9769459a163558cda2011c5c26a0f0",
      "parents": [
        "d31afdf4962ffc9a6d9cdbde85d7433de532ef32"
      ],
      "author": {
        "name": "Yang Luo",
        "email": "hsluoyz@gmail.com",
        "time": "Sat Oct 25 10:53:05 2025 +0800"
      },
      "committer": {
        "name": "Yang Luo",
        "email": "hsluoyz@gmail.com",
        "time": "Sat Oct 25 10:53:05 2025 +0800"
      },
      "message": "Update i18n files\n"
    },
    {
      "commit": "d31afdf4962ffc9a6d9cdbde85d7433de532ef32",
      "tree": "bd81804db84e676e6077ab15f9d580565791cc48",
      "parents": [
        "ddeca8d7ea375c191a1e37a64cd2cd1c345785ce"
      ],
      "author": {
        "name": "Yang Luo",
        "email": "hsluoyz@gmail.com",
        "time": "Sat Oct 25 10:51:21 2025 +0800"
      },
      "committer": {
        "name": "Yang Luo",
        "email": "hsluoyz@gmail.com",
        "time": "Sat Oct 25 10:51:21 2025 +0800"
      },
      "message": "Fix GetAcmeClient() bug\n"
    },
    {
      "commit": "ddeca8d7ea375c191a1e37a64cd2cd1c345785ce",
      "tree": "f4a70921a5ce4dcefef29d41262197d9b6010528",
      "parents": [
        "d96bdae382d6066afd286848da6980b440a766d9"
      ],
      "author": {
        "name": "Yang Luo",
        "email": "hsluoyz@gmail.com",
        "time": "Sat Oct 25 10:51:04 2025 +0800"
      },
      "committer": {
        "name": "Yang Luo",
        "email": "hsluoyz@gmail.com",
        "time": "Sat Oct 25 10:51:04 2025 +0800"
      },
      "message": "Add Action.UpdatedTime\n"
    },
    {
      "commit": "d96bdae382d6066afd286848da6980b440a766d9",
      "tree": "4c79532750173fea1e9c11292dbc35d4845f7101",
      "parents": [
        "4c3d9957d8c8e43368cd5240465acb9659e01f53"
      ],
      "author": {
        "name": "Yang Luo",
        "email": "hsluoyz@gmail.com",
        "time": "Sat Oct 25 10:50:51 2025 +0800"
      },
      "committer": {
        "name": "Yang Luo",
        "email": "hsluoyz@gmail.com",
        "time": "Sat Oct 25 10:50:51 2025 +0800"
      },
      "message": "Can modify rule and action names now\n"
    },
    {
      "commit": "4c3d9957d8c8e43368cd5240465acb9659e01f53",
      "tree": "81f266fd0d19871a05b6ece320a0a848346088e9",
      "parents": [
        "f01b9d01373375cdebcdb45ddbef28777931f566"
      ],
      "author": {
        "name": "Yang Luo",
        "email": "hsluoyz@gmail.com",
        "time": "Fri Sep 12 20:12:11 2025 +0800"
      },
      "committer": {
        "name": "Yang Luo",
        "email": "hsluoyz@gmail.com",
        "time": "Fri Sep 12 20:12:20 2025 +0800"
      },
      "message": "feat: improve host field UI for site list page\n"
    },
    {
      "commit": "f01b9d01373375cdebcdb45ddbef28777931f566",
      "tree": "faa3ca4ab84a1fff9c2bf0f63ae12da45212ab9e",
      "parents": [
        "bb8043cbc3127f06cce5022116c993b94dec0c73"
      ],
      "author": {
        "name": "ShixingZhou",
        "email": "53111724+FlySky-z@users.noreply.github.com",
        "time": "Sun Sep 07 19:33:18 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Sep 07 19:33:18 2025 +0800"
      },
      "message": "feat: fix semantic release CI script (#82)\n\n"
    },
    {
      "commit": "bb8043cbc3127f06cce5022116c993b94dec0c73",
      "tree": "d07fb37c9aa81a52434ffc5315fa9983240d2655",
      "parents": [
        "66add4791ad88db6d4bb29af4537c8fdcd955b79"
      ],
      "author": {
        "name": "Yang Luo",
        "email": "hsluoyz@gmail.com",
        "time": "Sun Sep 07 14:20:18 2025 +0800"
      },
      "committer": {
        "name": "Yang Luo",
        "email": "hsluoyz@gmail.com",
        "time": "Sun Sep 07 14:20:18 2025 +0800"
      },
      "message": "feat: fix DashboardDetailPage crash bug on empty data\n"
    },
    {
      "commit": "66add4791ad88db6d4bb29af4537c8fdcd955b79",
      "tree": "7439b239e1b6760a9b7afdcdf31b32661c6d1335",
      "parents": [
        "c3140ee46e9a6f26cedac459cc23d3dd60870b23"
      ],
      "author": {
        "name": "Yang Luo",
        "email": "hsluoyz@gmail.com",
        "time": "Tue Aug 05 21:39:20 2025 +0800"
      },
      "committer": {
        "name": "Yang Luo",
        "email": "hsluoyz@gmail.com",
        "time": "Tue Aug 05 21:39:20 2025 +0800"
      },
      "message": "Add \"med2\" to isFrontendBaseDirEnabledRepo()\n"
    },
    {
      "commit": "c3140ee46e9a6f26cedac459cc23d3dd60870b23",
      "tree": "fea5c6579d4e01f6643a0520aea3ba6c9c918df1",
      "parents": [
        "98453552d9b6e1559d91c723c1279cd44f5b405b"
      ],
      "author": {
        "name": "Yang Luo",
        "email": "hsluoyz@gmail.com",
        "time": "Sat Jun 28 21:41:05 2025 +0800"
      },
      "committer": {
        "name": "Yang Luo",
        "email": "hsluoyz@gmail.com",
        "time": "Sat Jun 28 21:41:05 2025 +0800"
      },
      "message": "Add proxy for TestGetClient()\n"
    },
    {
      "commit": "98453552d9b6e1559d91c723c1279cd44f5b405b",
      "tree": "8cc39a0ab70eb15d1d1da2748167b430b8320771",
      "parents": [
        "edee9291715eb54716d3e1a6acec638800ce48d0"
      ],
      "author": {
        "name": "Yang Luo",
        "email": "hsluoyz@gmail.com",
        "time": "Sun Jun 08 17:45:30 2025 +0800"
      },
      "committer": {
        "name": "Yang Luo",
        "email": "hsluoyz@gmail.com",
        "time": "Sun Jun 08 17:45:30 2025 +0800"
      },
      "message": "Improve gitCreateDatabaseCloud()\n"
    },
    {
      "commit": "edee9291715eb54716d3e1a6acec638800ce48d0",
      "tree": "76b97a8a7f3123eeb3384024a384b2a7858ce931",
      "parents": [
        "47b2ff652e3891164294fd41d0206e20201234ff"
      ],
      "author": {
        "name": "Yang Luo",
        "email": "hsluoyz@gmail.com",
        "time": "Sun Jun 08 17:38:22 2025 +0800"
      },
      "committer": {
        "name": "Yang Luo",
        "email": "hsluoyz@gmail.com",
        "time": "Sun Jun 08 17:38:22 2025 +0800"
      },
      "message": "Remove wmic in getPid()\n"
    },
    {
      "commit": "47b2ff652e3891164294fd41d0206e20201234ff",
      "tree": "e1d2dbd9c70f0cb7ecd0f6d03574a354cbd32a96",
      "parents": [
        "baf451788d36c5c5e1722b0d0bd89a24f030da57"
      ],
      "author": {
        "name": "Yang Luo",
        "email": "hsluoyz@gmail.com",
        "time": "Sun May 25 11:54:47 2025 +0800"
      },
      "committer": {
        "name": "Yang Luo",
        "email": "hsluoyz@gmail.com",
        "time": "Sun May 25 11:54:47 2025 +0800"
      },
      "message": "Support org name in updateAppConfFile()\n"
    },
    {
      "commit": "baf451788d36c5c5e1722b0d0bd89a24f030da57",
      "tree": "2f3242dc53f858709c5ebc9f5ab56279aab7b20a",
      "parents": [
        "91ce5ed5ecdbca4e7cd6f4eed36d8796713f0240"
      ],
      "author": {
        "name": "Yang Luo",
        "email": "hsluoyz@gmail.com",
        "time": "Sat May 24 22:53:50 2025 +0800"
      },
      "committer": {
        "name": "Yang Luo",
        "email": "hsluoyz@gmail.com",
        "time": "Sat May 24 22:53:50 2025 +0800"
      },
      "message": "Fix DB existed bug in gitCreateDatabaseCloud()\n"
    },
    {
      "commit": "91ce5ed5ecdbca4e7cd6f4eed36d8796713f0240",
      "tree": "4f690b6414c0816ed0377ab5c125c956c10c247b",
      "parents": [
        "2e09cc4b964d6a8cd59dd5f6942d4fd5eab579ca"
      ],
      "author": {
        "name": "Yang Luo",
        "email": "hsluoyz@gmail.com",
        "time": "Sat May 24 22:36:54 2025 +0800"
      },
      "committer": {
        "name": "Yang Luo",
        "email": "hsluoyz@gmail.com",
        "time": "Sat May 24 22:36:54 2025 +0800"
      },
      "message": "Improve updateAppConfFile()\n"
    },
    {
      "commit": "2e09cc4b964d6a8cd59dd5f6942d4fd5eab579ca",
      "tree": "542b0d687e51fadcdb47428d9d93a602c72ddb58",
      "parents": [
        "6242c143d25527a0f1495137c00f2fe8dda048fd"
      ],
      "author": {
        "name": "Yang Luo",
        "email": "hsluoyz@gmail.com",
        "time": "Sat May 24 20:43:37 2025 +0800"
      },
      "committer": {
        "name": "Yang Luo",
        "email": "hsluoyz@gmail.com",
        "time": "Sat May 24 21:02:36 2025 +0800"
      },
      "message": "Improve addDatabaseUser()\n"
    },
    {
      "commit": "6242c143d25527a0f1495137c00f2fe8dda048fd",
      "tree": "7553d9028ef5924fa64367c866111ba0da40b9d8",
      "parents": [
        "82a00a1fc15a2a3459f88d88570070e7d8ba6fd9"
      ],
      "author": {
        "name": "Yang Luo",
        "email": "hsluoyz@gmail.com",
        "time": "Sat May 24 13:35:58 2025 +0800"
      },
      "committer": {
        "name": "Yang Luo",
        "email": "hsluoyz@gmail.com",
        "time": "Sat May 24 13:35:58 2025 +0800"
      },
      "message": "Update code to support 40000\n"
    },
    {
      "commit": "82a00a1fc15a2a3459f88d88570070e7d8ba6fd9",
      "tree": "e31cb177849484ad5d1dce8631808ca54f8bc88a",
      "parents": [
        "f1aa13ec24909051b7b082cb934e45b222e9f51b"
      ],
      "author": {
        "name": "Yang Luo",
        "email": "hsluoyz@gmail.com",
        "time": "Sat May 24 00:19:35 2025 +0800"
      },
      "committer": {
        "name": "Yang Luo",
        "email": "hsluoyz@gmail.com",
        "time": "Sat May 24 00:21:45 2025 +0800"
      },
      "message": "Add gitCreateDatabaseCloud()\n"
    },
    {
      "commit": "f1aa13ec24909051b7b082cb934e45b222e9f51b",
      "tree": "070f0ee5b303f056dc3141f6e2d3d6ace02f3f4c",
      "parents": [
        "78581155476da4ff3cb4ee6532692cf48e5ccb33"
      ],
      "author": {
        "name": "Yang Luo",
        "email": "hsluoyz@gmail.com",
        "time": "Fri May 23 23:55:12 2025 +0800"
      },
      "committer": {
        "name": "Yang Luo",
        "email": "hsluoyz@gmail.com",
        "time": "Fri May 23 23:55:12 2025 +0800"
      },
      "message": "Fix cycle import\n"
    },
    {
      "commit": "78581155476da4ff3cb4ee6532692cf48e5ccb33",
      "tree": "2b49522bbb3d63b3ff36c55bddd0a08b1f6dcbf2",
      "parents": [
        "659fa89a9d209939a9c9a72f4775955423892ef3"
      ],
      "author": {
        "name": "Yang Luo",
        "email": "hsluoyz@gmail.com",
        "time": "Fri May 23 23:29:16 2025 +0800"
      },
      "committer": {
        "name": "Yang Luo",
        "email": "hsluoyz@gmail.com",
        "time": "Fri May 23 23:30:26 2025 +0800"
      },
      "message": "Refactor run code\n"
    },
    {
      "commit": "659fa89a9d209939a9c9a72f4775955423892ef3",
      "tree": "6b60fdca2c728b9b5767d48f1994fb2b4c08999a",
      "parents": [
        "5fea838b78ac524d333074b9a9b6a2e1cd91ac46"
      ],
      "author": {
        "name": "Yang Luo",
        "email": "hsluoyz@gmail.com",
        "time": "Mon May 05 17:44:52 2025 +0800"
      },
      "committer": {
        "name": "Yang Luo",
        "email": "hsluoyz@gmail.com",
        "time": "Mon May 05 17:44:52 2025 +0800"
      },
      "message": "Improve isFrontendBaseDirEnabledRepo()\n"
    },
    {
      "commit": "5fea838b78ac524d333074b9a9b6a2e1cd91ac46",
      "tree": "81abd38cd52bde4b8458caa8c2ed820d60a3b48c",
      "parents": [
        "424d7cfeba6921b357eaeef4a7a347b3d26e523d"
      ],
      "author": {
        "name": "Yang Luo",
        "email": "hsluoyz@gmail.com",
        "time": "Mon May 05 14:10:57 2025 +0800"
      },
      "committer": {
        "name": "Yang Luo",
        "email": "hsluoyz@gmail.com",
        "time": "Mon May 05 14:10:57 2025 +0800"
      },
      "message": "Add isFrontendBaseDirEnabledRepo()\n"
    },
    {
      "commit": "424d7cfeba6921b357eaeef4a7a347b3d26e523d",
      "tree": "6714a9915f657667f268d7481a8c71113080c486",
      "parents": [
        "e8ccedb4fc415afb224b7536159b56f6e921d35e"
      ],
      "author": {
        "name": "Yang Luo",
        "email": "hsluoyz@gmail.com",
        "time": "Thu Apr 03 00:38:23 2025 +0800"
      },
      "committer": {
        "name": "Yang Luo",
        "email": "hsluoyz@gmail.com",
        "time": "Thu Apr 03 00:38:23 2025 +0800"
      },
      "message": "Add path arg to wrapRepoError()\n"
    },
    {
      "commit": "e8ccedb4fc415afb224b7536159b56f6e921d35e",
      "tree": "4b2dd5fc15103fd790cb1b646aec43617aad2f72",
      "parents": [
        "9ea22994ed0bb47c13cf53bb0977dfe34df45123"
      ],
      "author": {
        "name": "Yang Luo",
        "email": "hsluoyz@gmail.com",
        "time": "Tue Mar 25 19:59:49 2025 +0800"
      },
      "committer": {
        "name": "Yang Luo",
        "email": "hsluoyz@gmail.com",
        "time": "Tue Mar 25 19:59:49 2025 +0800"
      },
      "message": "Add \"/MP_verify_\" challenge\n"
    },
    {
      "commit": "9ea22994ed0bb47c13cf53bb0977dfe34df45123",
      "tree": "ff9855d64fc4b67c948009390016515b674493a4",
      "parents": [
        "d47def85cb90a1d89801dad26a56b368c1a1199d"
      ],
      "author": {
        "name": "Yang Luo",
        "email": "hsluoyz@gmail.com",
        "time": "Tue Mar 04 12:29:21 2025 +0800"
      },
      "committer": {
        "name": "Yang Luo",
        "email": "hsluoyz@gmail.com",
        "time": "Tue Mar 04 12:29:21 2025 +0800"
      },
      "message": "Improve site list\n"
    },
    {
      "commit": "d47def85cb90a1d89801dad26a56b368c1a1199d",
      "tree": "79811e196ca72d604b69eb7e02145d15d7b52245",
      "parents": [
        "13651a77e876c6325ad75dc49e7d0238dda7018d"
      ],
      "author": {
        "name": "Yang Luo",
        "email": "hsluoyz@gmail.com",
        "time": "Mon Mar 03 09:22:05 2025 +0800"
      },
      "committer": {
        "name": "Yang Luo",
        "email": "hsluoyz@gmail.com",
        "time": "Mon Mar 03 09:22:05 2025 +0800"
      },
      "message": "Set pagination to 1000\n"
    },
    {
      "commit": "13651a77e876c6325ad75dc49e7d0238dda7018d",
      "tree": "7eca25884fc1e850a3d40759d0d01e508935764f",
      "parents": [
        "c49fee45791c0af3d8ae496f20fbf052874b399f"
      ],
      "author": {
        "name": "Yang Luo",
        "email": "hsluoyz@gmail.com",
        "time": "Fri Feb 28 12:35:22 2025 +0800"
      },
      "committer": {
        "name": "Yang Luo",
        "email": "hsluoyz@gmail.com",
        "time": "Fri Feb 28 12:35:31 2025 +0800"
      },
      "message": "feat: improve stopProcess() for casibase\n"
    },
    {
      "commit": "c49fee45791c0af3d8ae496f20fbf052874b399f",
      "tree": "04368901c3204e75c29000acb929d66358a80ed1",
      "parents": [
        "8b6f4f779a971b13b3f2b22ccff9ef162e8aea45"
      ],
      "author": {
        "name": "Yang Luo",
        "email": "hsluoyz@gmail.com",
        "time": "Tue Jan 07 21:28:17 2025 +0800"
      },
      "committer": {
        "name": "Yang Luo",
        "email": "hsluoyz@gmail.com",
        "time": "Tue Jan 07 21:28:17 2025 +0800"
      },
      "message": "feat: improve stopProcess()\n"
    },
    {
      "commit": "8b6f4f779a971b13b3f2b22ccff9ef162e8aea45",
      "tree": "8ebbbf8a4be0f832d2d6b00d0da82e2f33b20cbf",
      "parents": [
        "92a0dc8ad5fe5a512f5e8f2d52f6e2a0a24c2214"
      ],
      "author": {
        "name": "Love98",
        "email": "77888749+love98ooo@users.noreply.github.com",
        "time": "Sat Sep 28 15:11:02 2024 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Sep 28 15:11:02 2024 +0800"
      },
      "message": "feat: add dashboard to selected menu key (#81)\n\n"
    },
    {
      "commit": "92a0dc8ad5fe5a512f5e8f2d52f6e2a0a24c2214",
      "tree": "a1203788510019e4941fe104038ceb978533d441",
      "parents": [
        "69b6af264ba5d8e2596f43c7572aa3fe12d7f870"
      ],
      "author": {
        "name": "Love98",
        "email": "77888749+love98ooo@users.noreply.github.com",
        "time": "Fri Sep 27 22:46:25 2024 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Sep 27 22:46:25 2024 +0800"
      },
      "message": "feat: support health check and alert for sites (#79)\n\n* feat: support health check for sites\r\n\r\n* feat: refactor out health-check and provider\r\n\r\n* feat: clean up code and support SMS\r\n\r\n* feat: support send alert with specific providers"
    },
    {
      "commit": "69b6af264ba5d8e2596f43c7572aa3fe12d7f870",
      "tree": "fb5195fa795545c51873d573a04549671f9ba2d9",
      "parents": [
        "3a211f250ea3587a0160dada2283b8342c0d2990"
      ],
      "author": {
        "name": "Love98",
        "email": "77888749+love98ooo@users.noreply.github.com",
        "time": "Fri Sep 27 01:02:44 2024 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Sep 27 01:02:44 2024 +0800"
      },
      "message": "feat: update casdoor sdk to v0.52.0 (#80)\n\n* feat: update casdoor sdk to v0.52.0\r\n\r\n* feat: simplify del obj in casdoor"
    },
    {
      "commit": "3a211f250ea3587a0160dada2283b8342c0d2990",
      "tree": "45417d8e0a254459cb23cd3f605dde002bb032e8",
      "parents": [
        "855e225df63a0592032d06a191c488b8756d99d8"
      ],
      "author": {
        "name": "Love98",
        "email": "77888749+love98ooo@users.noreply.github.com",
        "time": "Mon Sep 23 21:01:12 2024 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Sep 23 21:01:12 2024 +0800"
      },
      "message": "feat: rename Captcha to CAPTCHA (#78)\n\n"
    },
    {
      "commit": "855e225df63a0592032d06a191c488b8756d99d8",
      "tree": "d6a723833e048401589903222577d3e5752fa837",
      "parents": [
        "ab9caf5cd59933edf1382e470cc64df88f56f571"
      ],
      "author": {
        "name": "Love98",
        "email": "77888749+love98ooo@users.noreply.github.com",
        "time": "Tue Sep 17 21:22:53 2024 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Sep 17 21:22:53 2024 +0800"
      },
      "message": "feat: remove arm64 DockerHub image (#77)\n\n"
    },
    {
      "commit": "ab9caf5cd59933edf1382e470cc64df88f56f571",
      "tree": "88368b9a8a115e08187129d626d023755c526114",
      "parents": [
        "e57f538c3406fe98fb6182afae3a9cf37c3ca937"
      ],
      "author": {
        "name": "Gucheng",
        "email": "85475922+nomeguy@users.noreply.github.com",
        "time": "Tue Sep 17 19:48:10 2024 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Sep 17 19:48:10 2024 +0800"
      },
      "message": "docs: fix Docker link"
    },
    {
      "commit": "e57f538c3406fe98fb6182afae3a9cf37c3ca937",
      "tree": "b19ff2ef665fd5bdd9ac88f534884855b9283674",
      "parents": [
        "7aa147999fc363da9b145f27fffe667861e78e8c"
      ],
      "author": {
        "name": "Love98",
        "email": "77888749+love98ooo@users.noreply.github.com",
        "time": "Tue Sep 17 14:20:19 2024 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Sep 17 14:20:19 2024 +0800"
      },
      "message": "feat(Dockerfile): remove npmmirror and update base version (#76)\n\n1. remove npmmirror\r\n2. synchronize the node and golang version to the version used by casdoor"
    },
    {
      "commit": "7aa147999fc363da9b145f27fffe667861e78e8c",
      "tree": "fed11e53e1085404d0732941eda361e4ebbc1b3b",
      "parents": [
        "d6c659b0d3fa5113ee061cfbf601a575c1744931"
      ],
      "author": {
        "name": "Love98",
        "email": "77888749+love98ooo@users.noreply.github.com",
        "time": "Tue Sep 17 13:18:23 2024 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Sep 17 13:18:23 2024 +0800"
      },
      "message": "feat: re-generate yarn.lock to fix CI error (#75)\n\n* fix: double released in ci.yml make previous version equal to current version\r\n\r\n* fix: update yarn.lock to fix docker build"
    },
    {
      "commit": "d6c659b0d3fa5113ee061cfbf601a575c1744931",
      "tree": "43b8f569e64cb37722a50d6d0a6fd6e734d60e31",
      "parents": [
        "4d353b4a42b59146ac2e9ce3058fca8e66f33ab8"
      ],
      "author": {
        "name": "Love98",
        "email": "77888749+love98ooo@users.noreply.github.com",
        "time": "Tue Sep 17 11:38:06 2024 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Sep 17 11:38:06 2024 +0800"
      },
      "message": "feat: fix CI script for failed Dockerhub release (#74)\n\n"
    },
    {
      "commit": "4d353b4a42b59146ac2e9ce3058fca8e66f33ab8",
      "tree": "90518f1295f7de18586277959ff2b6011c8233c8",
      "parents": [
        "a4b42f3a0b445a74887e6dacfff28e7068517f69"
      ],
      "author": {
        "name": "Love98",
        "email": "77888749+love98ooo@users.noreply.github.com",
        "time": "Sun Sep 15 17:26:09 2024 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Sep 15 17:26:09 2024 +0800"
      },
      "message": "feat: add action object (#73)\n\n* feat: support new action in proxy.go\r\n\r\n* feat: support rule action in the frontend\r\n\r\n* chore: rename ActionId into Id and update empty action type into allow"
    },
    {
      "commit": "a4b42f3a0b445a74887e6dacfff28e7068517f69",
      "tree": "2da5df5b9f0ea7413c60d9e5796474619b82cb46",
      "parents": [
        "a9b1f4ea65ec1a8baa95c72882018ab46e19b6aa"
      ],
      "author": {
        "name": "Love98",
        "email": "77888749+love98ooo@users.noreply.github.com",
        "time": "Thu Sep 05 20:31:38 2024 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Sep 05 20:31:38 2024 +0800"
      },
      "message": "feat: add action object (#72)\n\n* feat: add action object\r\n\r\n* feat: remove updatedTime and set createdTime at the frontend"
    },
    {
      "commit": "a9b1f4ea65ec1a8baa95c72882018ab46e19b6aa",
      "tree": "b6d30ed4608f431de92c426950cf591b26b18db1",
      "parents": [
        "1671f43473bc29392ca257d46602eae20f532acd"
      ],
      "author": {
        "name": "Love98",
        "email": "77888749+love98ooo@users.noreply.github.com",
        "time": "Tue Aug 27 22:42:42 2024 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Aug 27 22:42:42 2024 +0800"
      },
      "message": "feat: support CAPTCHA action via Casdoor (#71)\n\n* feat: support CAPTCHA action via Casdoor\r\n\r\n* update: update google/uuid to 1.6.0\r\n\r\n* feat: add apache header\r\n\r\n* fix: go test error"
    }
  ],
  "next": "1671f43473bc29392ca257d46602eae20f532acd"
}
