From 293ab54728bee1ae28c2726a0c8f947669bcaacb Mon Sep 17 00:00:00 2001 From: Symb0x76 <9667434@qq.com> Date: Wed, 8 Oct 2025 11:39:34 +0800 Subject: [PATCH] feat(search): FTS support for wechatdb --- Makefile | 177 +- docs/prompt.md | 72 +- internal/chatlog/database/service.go | 8 + internal/chatlog/http/route.go | 111 +- internal/chatlog/http/static/index.htm | 2223 +++++++++-------- internal/errors/errors.go | 2 +- internal/errors/wechatdb_errors.go | 4 + internal/model/search.go | 52 + .../datasource/darwinv3/datasource.go | 4 + internal/wechatdb/datasource/datasource.go | 1 + internal/wechatdb/datasource/v4/datasource.go | 276 ++ .../datasource/windowsv3/datasource.go | 271 ++ internal/wechatdb/repository/search.go | 52 + internal/wechatdb/wechatdb.go | 5 + pkg/util/silk/silk.go | 3 - pkg/util/silk/silk_stub.go | 11 - pkg/util/strings.go | 42 + 17 files changed, 2100 insertions(+), 1214 deletions(-) create mode 100644 internal/model/search.go create mode 100644 internal/wechatdb/repository/search.go delete mode 100644 pkg/util/silk/silk_stub.go diff --git a/Makefile b/Makefile index d6a3338..485b4fa 100644 --- a/Makefile +++ b/Makefile @@ -1,156 +1,75 @@ BINARY_NAME := chatlog GO := go - -# Embed version into binary ifeq ($(VERSION),) - VERSION := $(shell git describe --tags --always --dirty="-dev" 2>/dev/null) -endif -ifeq ($(VERSION),) - VERSION := dev + VERSION := $(shell git describe --tags --always --dirty="-dev") endif LDFLAGS := -ldflags '-X "github.com/sjzar/chatlog/pkg/version.Version=$(VERSION)" -w -s' PLATFORMS := \ - darwin/amd64 \ - darwin/arm64 \ - linux/amd64 \ - linux/arm64 \ - windows/amd64 \ - windows/arm64 + darwin/amd64 \ + darwin/arm64 \ + linux/amd64 \ + linux/arm64 \ + windows/amd64 \ + windows/arm64 UPX_PLATFORMS := \ - darwin/amd64 \ - linux/amd64 \ - linux/arm64 \ - windows/amd64 + darwin/amd64 \ + linux/amd64 \ + linux/arm64 \ + windows/amd64 -# Cross-compiler hints (override if paths differ) -CC_WIN_AMD64 ?= x86_64-w64-mingw32-gcc -CC_WIN_ARM64 ?= aarch64-w64-mingw32-gcc -CC_DARWIN_AMD64 ?= o64-clang -CC_DARWIN_ARM64 ?= oa64-clang +ifeq ($(OS),Windows_NT) + MKDIR_BIN := powershell -NoProfile -Command "New-Item -ItemType Directory -Force -Path 'bin' | Out-Null" + CLEAN_BIN := powershell -NoProfile -Command "if (Test-Path 'bin') { Remove-Item -Recurse -Force 'bin' }" + BINARY_SUFFIX := .exe +else + MKDIR_BIN := mkdir -p bin + CLEAN_BIN := rm -rf bin + BINARY_SUFFIX := +endif -.PHONY: all clean lint tidy test build upx +.PHONY: all clean lint tidy test build crossbuild upx all: clean lint tidy test build clean: - @echo "🧹 Cleaning..." - @rm -rf bin/ + @echo "Cleaning..." + @$(CLEAN_BIN) lint: - @echo "🕵️‍♂️ Running linters..." + @echo "Running linters..." golangci-lint run ./... tidy: - @echo "🧼 Tidying up dependencies..." + @echo "Tidying up dependencies..." $(GO) mod tidy test: - @echo "🧪 Running tests..." + @echo "Running tests..." $(GO) test ./... -cover build: - @echo "🔨 Building for current platform..." - @mkdir -p bin - @CGO_ENABLED=1 $(GO) build -trimpath $(LDFLAGS) -o bin/$(BINARY_NAME) main.go + @echo "Building for current platform..." + @$(MKDIR_BIN) + @CGO_ENABLED=1 $(GO) build --tags "fts5" -trimpath $(LDFLAGS) -o bin/$(BINARY_NAME)$(BINARY_SUFFIX) main.go + @echo "Done!" -buildcross: - @echo "[cross] Interactive cross-compilation selection (Windows/macOS)" - @mkdir -p bin - @printf "\nSelect target platforms to build (enter digits, e.g., 134):\n 1) windows/amd64\n 2) windows/arm64\n 3) darwin/amd64 (macOS Intel)\n 4) darwin/arm64 (Apple Silicon)\n> "; \ - read choices; \ - opts=$$(printf "%s" "$$choices" | tr -cd '1234' | sed 's/./& /g'); \ - for ch in $$opts; do \ - case $$ch in \ - 1) \ - ccbin=$${CC_WIN_AMD64:-x86_64-w64-mingw32-gcc}; \ - : # On Windows host: do not force CC, use local toolchain \ - if [ "$(OS)" = "Windows_NT" ]; then \ - echo "🧭 Host: Windows"; \ - tmp="bin/$(BINARY_NAME)_windows_amd64.exe.new.$$RANDOM"; \ - GOOS=windows GOARCH=amd64 CGO_ENABLED=1 $(GO) build -trimpath $(LDFLAGS) -o "$$tmp" main.go && \ - { mv -f "$$tmp" "bin/$(BINARY_NAME)_windows_amd64.exe" 2>/dev/null || \ - echo "⚠️ Target locked, kept: $$tmp"; }; \ - else \ - if command -v "$$ccbin" >/dev/null 2>&1; then \ - echo "⚙️ Using CC=$$ccbin"; \ - tmp="bin/$(BINARY_NAME)_windows_amd64.exe.new.$$RANDOM"; \ - env CC="$$ccbin" GOOS=windows GOARCH=amd64 CGO_ENABLED=1 $(GO) build -trimpath $(LDFLAGS) -o "$$tmp" main.go && \ - { mv -f "$$tmp" "bin/$(BINARY_NAME)_windows_amd64.exe" 2>/dev/null || \ - echo "⚠️ Target locked, kept: $$tmp"; }; \ - else \ - echo "⏭️ Skip windows/amd64: $$ccbin not found (Arch: sudo pacman -S --needed mingw-w64-gcc)"; \ - fi; \ - fi \ - ;; \ - 2) \ - ccbin=$${CC_WIN_ARM64:-aarch64-w64-mingw32-gcc}; \ - : # windows/arm64 needs aarch64 toolchain \ - if [ "$(OS)" = "Windows_NT" ]; then \ - if command -v "$$ccbin" >/dev/null 2>&1; then \ - echo "⚙️ Using CC=$$ccbin"; \ - tmp="bin/$(BINARY_NAME)_windows_arm64.exe.new.$$RANDOM"; \ - env CC="$$ccbin" GOOS=windows GOARCH=arm64 CGO_ENABLED=1 $(GO) build -trimpath $(LDFLAGS) -o "$$tmp" main.go && \ - { mv -f "$$tmp" "bin/$(BINARY_NAME)_windows_arm64.exe" 2>/dev/null || \ - echo "⚠️ Target locked, kept: $$tmp"; }; \ - else \ - echo "⏭️ Skip windows/arm64: $$ccbin not found (MSYS2: pacman -S mingw-w64-aarch64-gcc)"; \ - fi; \ - else \ - if command -v "$$ccbin" >/dev/null 2>&1; then \ - echo "⚙️ Using CC=$$ccbin"; \ - tmp="bin/$(BINARY_NAME)_windows_arm64.exe.new.$$RANDOM"; \ - env CC="$$ccbin" GOOS=windows GOARCH=arm64 CGO_ENABLED=1 $(GO) build -trimpath $(LDFLAGS) -o "$$tmp" main.go && \ - { mv -f "$$tmp" "bin/$(BINARY_NAME)_windows_arm64.exe" 2>/dev/null || \ - echo "⚠️ Target locked, kept: $$tmp"; }; \ - else \ - echo "⏭️ Skip windows/arm64: $$ccbin not found (Arch: sudo pacman -S --needed mingw-w64-gcc)"; \ - fi; \ - fi \ - ;; \ - 3) \ - ccdarwin=$${CC_DARWIN_AMD64:-o64-clang}; \ - if [ "$(OS)" = "Windows_NT" ] || [ "$$(uname -s 2>/dev/null | tr '[:upper:]' '[:lower:]')" = "linux" ]; then \ - : # Non-macOS hosts need osxcross o64-clang \ - if command -v "$$ccdarwin" >/dev/null 2>&1; then \ - echo "⚙️ Using CC=$$ccdarwin"; \ - env CC="$$ccdarwin" GOOS=darwin GOARCH=amd64 CGO_ENABLED=1 $(GO) build -trimpath $(LDFLAGS) -o bin/$(BINARY_NAME)_darwin_amd64; \ - else \ - echo "⏭️ Skip darwin/amd64: $$ccdarwin not found (need osxcross)"; \ - fi; \ - else \ - : # macOS host: try system clang \ - if command -v clang >/dev/null 2>&1; then \ - echo "⚙️ Using CC=clang"; \ - env CC=clang GOOS=darwin GOARCH=amd64 CGO_ENABLED=1 $(GO) build -trimpath $(LDFLAGS) -o bin/$(BINARY_NAME)_darwin_amd64; \ - else \ - echo "⏭️ Skip darwin/amd64: clang not found"; \ - fi; \ - fi \ - ;; \ - 4) \ - ccdarwin=$${CC_DARWIN_ARM64:-oa64-clang}; \ - if [ "$(OS)" = "Windows_NT" ] || [ "$$(uname -s 2>/dev/null | tr '[:upper:]' '[:lower:]')" = "linux" ]; then \ - : # Non-macOS hosts need osxcross oa64-clang \ - if command -v "$$ccdarwin" >/dev/null 2>&1; then \ - echo "⚙️ Using CC=$$ccdarwin"; \ - env CC="$$ccdarwin" GOOS=darwin GOARCH=arm64 CGO_ENABLED=1 $(GO) build -trimpath $(LDFLAGS) -o bin/$(BINARY_NAME)_darwin_arm64; \ - else \ - echo "⏭️ Skip darwin/arm64: $$ccdarwin not found (need osxcross)"; \ - fi; \ - else \ - : # macOS host: try system clang \ - if command -v clang >/dev/null 2>&1; then \ - echo "⚙️ Using CC=clang"; \ - env CC=clang GOOS=darwin GOARCH=arm64 CGO_ENABLED=1 $(GO) build -trimpath $(LDFLAGS) -o bin/$(BINARY_NAME)_darwin_arm64; \ - else \ - echo "⏭️ Skip darwin/arm64: clang not found"; \ - fi; \ - fi \ - ;; \ - *) \ - echo "❓ Unknown option: $$ch (valid: 1 2 3 4)"; \ - ;; \ - esac; \ - done \ No newline at end of file +crossbuild: clean + @echo "Building for multiple platforms..." + @$(MKDIR_BIN) + for platform in $(PLATFORMS); do \ + os=$$(echo $$platform | cut -d/ -f1); \ + arch=$$(echo $$platform | cut -d/ -f2); \ + float=$$(echo $$platform | cut -d/ -f3); \ + output_name=bin/chatlog_$${os}_$${arch}; \ + [ "$$float" != "" ] && output_name=$$output_name_$$float; \ + [ "$$os" = "windows" ] && output_name=$$output_name.exe; \ + echo "Building for $$os/$$arch..."; \ + echo "Building for $$output_name..."; \ + @GOOS=$$os GOARCH=$$arch CGO_ENABLED=1 GOARM=$$float $(GO) build --tags "fts5" -trimpath $(LDFLAGS) -o $$output_name main.go ; \ + if [ "$(ENABLE_UPX)" = "1" ] && echo "$(UPX_PLATFORMS)" | grep -q "$$os/$$arch"; then \ + echo "Compressing binary $$output_name..." && upx --best $$output_name; \ + fi; \ + done + @echo "Done!" \ No newline at end of file diff --git a/docs/prompt.md b/docs/prompt.md index 2ff14e2..68ee0d2 100644 --- a/docs/prompt.md +++ b/docs/prompt.md @@ -1,70 +1,80 @@ # Prompt 指南 ## 概述 -优秀的 `prompt` 可以极大的提高 `chatlog` 使用体验,收集了部分群友分享的 `prompt`,供大家参考。 -在处理聊天记录时,尽量选择上下文长度足够的 LLM,例如 `Gemini 2.5 Pro`、`Claude 3.5 Sonnet` 等。 + +优秀的 `prompt` 可以极大的提高 `chatlog` 使用体验,收集了部分群友分享的 `prompt`,供大家参考。 +在处理聊天记录时,尽量选择上下文长度足够的 LLM,例如 `Gemini 2.5 Pro`、`Claude 3.5 Sonnet` 等。 欢迎大家在 [Discussions](https://github.com/sjzar/chatlog/discussions/47) 中分享自己的使用方式,共同进步。 - ## 群聊总结 + 作者:@eyaeya ```md 你是一个中文的群聊总结的助手,你可以为一个微信的群聊记录,提取并总结每个时间段大家在重点讨论的话题内容。 -请帮我将 "" 在