by harnessclaw
An LLM programming assistant engine built with Go, supporting WebSocket, multi-turn dialogues, tool calling, permission control, and skill extension.
# Add to your Claude Code skills
git clone https://github.com/harnessclaw/harnessclaw-engineAn LLM programming assistant engine built with Go. It provides capabilities via the WebSocket protocol, supporting multi-turn dialogues, tool calling, permission control, and skill extension.
┌───────────-──┐ ┌─────────────┐ ┌─────────────┐
│ WebSocket │ │ HTTP │ │ Feishu │
│ Channel │ │ Channel │ │ Channel │
└──────┬───────┘ └──────┬──────┘ └──────┬──────┘
│ │ │
└──────────────────┼──────────────────┘
▼
┌──────────────────┐
│Router + Middleware│ Auth / RateLimit / Logging
└────────┬─────────┘
▼
┌──────────────────┐
│ Query Engine │ 5-Phase Loop
│ (queryloop.go) │ Preprocessing → LLM Streaming → Error Recovery
└───┬──────────┬───┘ → Tool Execution → Continuation Check
│ │
┌─────▼──-─┐ ┌──▼──────────┐
│ Provider │ │ Tool System │
│ (LLM) │ │ 7 Built-in │
└───────-──┘ └─────────────┘
Dependency Direction: Channel → Router → Engine → Provider / Tool (Unidirectional, no circular dependencies)
No comments yet. Be the first to share your thoughts!
SKILL.md files, supporting YAML frontmatter, parameter substitution, and priority overridego_rebuild/
├── cmd/server/ # Entry point & Integration tests
│ ├── main.go # 11-step startup process
│ └── main_test.go # E2E tests (build tag: integration)
├── configs/
│ └── config.yaml # Default configuration
├── internal/
│ ├── channel/ # Multi-protocol access layer (WebSocket / HTTP / Feishu)
│ ├── command/ # Command registration & Priority system
│ ├── config/ # Viper configuration management (50+ defaults)
│ ├── engine/ # Core query engine
│ │ ├── queryloop.go # QueryEngine main loop (831 lines)
│ │ ├── executor.go # Parallel/Serial tool executor
│ │ ├── compact/ # LLM context compaction
│ │ ├── context/ # System prompt assembly
│ │ └── session/ # Session state & Lifecycle
│ ├── event/ # In-process pub/sub event bus
│ ├── permission/ # 6-step permission pipeline (6 modes)
│ ├── provider/ # LLM Provider abstraction
│ │ ├── anthropic/ # Direct Anthropic SSE client
│ │ ├── bifrost/ # Multi-Provider adapter
│ │ └── retry/ # Exponential backoff + 529 overload switching
│ ├── router/ # Message routing + Middleware chain
│ ├── skill/ # SKILL.md loading & Parameter substitution
│ ├── storage/ # Storage interfaces (Memory implementation)
│ └── tool/ # Tool system
│ ├── tool.go # Tool interface + 10 extension interfaces
│ ├── registry.go # Thread-safe tool registry
│ ├── pool.go # Immutable per-query tool pool
│ └── bash/fileread/fileedit/filewrite/grep/glob/webfetch/skilltool/
├── pkg/
│ ├── types/ # Shared types (Message, Event, ToolCall, Context)
│ └── errors/ # Domain errors (16 error codes)
├── docs/
│ ├── protocols/ # WebSocket protocol specification (v1.4)
├── Makefile # Build/Run/Test/Lint
└── go.mod # Go 1.26.1
# Build
make build # Outputs to ./dist/harnessclaw-engine
# Run (using default configuration)
make run # go run ./cmd/server -config ./configs/config.yaml
# Run directly with a specific configuration file
./dist/harnessclaw-engine -config ./configs/config.yaml
# Unit tests
make test # go test ./... -v -race -count=1
# Coverage report
make test-cover # Generates coverage.html
# Integration tests (requires real LLM API)
go test -tags=integration ./cmd/server/ -v
go test -tags=integration ./internal/provider/bifrost/ -v
make fmt # Format code
make tidy # Tidy go.mod
make lint # Run linters
make vuln # Scan for vulnerabilities
make clean # Clean build artifacts
The configuration file is located at configs/config.yaml. Main configuration items:
| Configuration Item | Description | Default Value |
|--------|------|--------|
| server.port | HTTP server port | 8080 |
| channels.websocket.port | WebSocket port | 8081 |
| channels.websocket.path | WebSocket path | /ws |
| llm.default_provider | LLM Provider | anthropic |
| llm.providers.anthropic.model | Model name | astron-code-latest |
| engine.max_turns | Max tool calls per turn | 50 |
| engine.auto_compact_threshold | Token ratio threshold for auto-compaction | 0.8 |
| session.idle_timeout | Session idle timeout | 30m |
| permission.mode | Permission mode | default |
| tools.* | Individual tool toggles | All true |
Connection Address: ws://host:8081/ws
Client Server
│ │
│── session.create ──────────────────────>│
│<────────────────────── session.created ─│
│ │
│── user.message ────────────────────────>│
│<──────────────────── message.start ─────│
│<──── content.start / content.delta ─────│ (Streaming Text)
│<──────── tool.start / tool.end ─────────│ (Server-side Tool)
│<──────────── tool.call ─────────────────│ (Client-side Tool)
│── tool.result ─────────────────────────>│
│<──── permission.request ────────────────│ (Permission Request)
│── permission.response ─────────────────>│
│<──────────────── content.stop ──────────│
│<──────────────── message.stop ──────────│
│<──────────────── task.end ──────────────│
│ │
│── abort ───────────────────────────────>│ (Interrupt)
For detailed protocol specifications, see docs/protocols/websocket.md.
Apache-2.0 License. See LICENSE for details.