minder-cli 0.3.4__tar.gz → 0.3.8__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {minder_cli-0.3.4 → minder_cli-0.3.8}/PKG-INFO +57 -41
- {minder_cli-0.3.4 → minder_cli-0.3.8}/pyproject.toml +2 -2
- {minder_cli-0.3.4 → minder_cli-0.3.8}/src/minder/config.py +1 -1
- {minder_cli-0.3.4 → minder_cli-0.3.8}/src/minder/graph/state.py +1 -0
- {minder_cli-0.3.4 → minder_cli-0.3.8}/src/minder/llm/litert.py +8 -4
- {minder_cli-0.3.4 → minder_cli-0.3.8}/src/minder/tools/query.py +32 -0
- {minder_cli-0.3.4 → minder_cli-0.3.8}/.gitignore +0 -0
- {minder_cli-0.3.4 → minder_cli-0.3.8}/LICENSE +0 -0
- {minder_cli-0.3.4 → minder_cli-0.3.8}/README-pypi.md +0 -0
- {minder_cli-0.3.4 → minder_cli-0.3.8}/README.md +0 -0
- {minder_cli-0.3.4 → minder_cli-0.3.8}/src/minder/__init__.py +0 -0
- {minder_cli-0.3.4 → minder_cli-0.3.8}/src/minder/api/routers/prompts.py +0 -0
- {minder_cli-0.3.4 → minder_cli-0.3.8}/src/minder/application/__init__.py +0 -0
- {minder_cli-0.3.4 → minder_cli-0.3.8}/src/minder/application/admin/__init__.py +0 -0
- {minder_cli-0.3.4 → minder_cli-0.3.8}/src/minder/application/admin/dto.py +0 -0
- {minder_cli-0.3.4 → minder_cli-0.3.8}/src/minder/application/admin/jobs.py +0 -0
- {minder_cli-0.3.4 → minder_cli-0.3.8}/src/minder/application/admin/use_cases.py +0 -0
- {minder_cli-0.3.4 → minder_cli-0.3.8}/src/minder/auth/__init__.py +0 -0
- {minder_cli-0.3.4 → minder_cli-0.3.8}/src/minder/auth/context.py +0 -0
- {minder_cli-0.3.4 → minder_cli-0.3.8}/src/minder/auth/middleware.py +0 -0
- {minder_cli-0.3.4 → minder_cli-0.3.8}/src/minder/auth/principal.py +0 -0
- {minder_cli-0.3.4 → minder_cli-0.3.8}/src/minder/auth/rate_limiter.py +0 -0
- {minder_cli-0.3.4 → minder_cli-0.3.8}/src/minder/auth/rbac.py +0 -0
- {minder_cli-0.3.4 → minder_cli-0.3.8}/src/minder/auth/service.py +0 -0
- {minder_cli-0.3.4 → minder_cli-0.3.8}/src/minder/bootstrap/__init__.py +0 -0
- {minder_cli-0.3.4 → minder_cli-0.3.8}/src/minder/bootstrap/providers.py +0 -0
- {minder_cli-0.3.4 → minder_cli-0.3.8}/src/minder/bootstrap/transport.py +0 -0
- {minder_cli-0.3.4 → minder_cli-0.3.8}/src/minder/cache/__init__.py +0 -0
- {minder_cli-0.3.4 → minder_cli-0.3.8}/src/minder/cache/providers.py +0 -0
- {minder_cli-0.3.4 → minder_cli-0.3.8}/src/minder/chunking/__init__.py +0 -0
- {minder_cli-0.3.4 → minder_cli-0.3.8}/src/minder/chunking/code_splitter.py +0 -0
- {minder_cli-0.3.4 → minder_cli-0.3.8}/src/minder/chunking/splitter.py +0 -0
- {minder_cli-0.3.4 → minder_cli-0.3.8}/src/minder/cli.py +0 -0
- {minder_cli-0.3.4 → minder_cli-0.3.8}/src/minder/continuity.py +0 -0
- {minder_cli-0.3.4 → minder_cli-0.3.8}/src/minder/dev.py +0 -0
- {minder_cli-0.3.4 → minder_cli-0.3.8}/src/minder/embedding/__init__.py +0 -0
- {minder_cli-0.3.4 → minder_cli-0.3.8}/src/minder/embedding/base.py +0 -0
- {minder_cli-0.3.4 → minder_cli-0.3.8}/src/minder/embedding/local.py +0 -0
- {minder_cli-0.3.4 → minder_cli-0.3.8}/src/minder/embedding/openai.py +0 -0
- {minder_cli-0.3.4 → minder_cli-0.3.8}/src/minder/graph/__init__.py +0 -0
- {minder_cli-0.3.4 → minder_cli-0.3.8}/src/minder/graph/edges.py +0 -0
- {minder_cli-0.3.4 → minder_cli-0.3.8}/src/minder/graph/executor.py +0 -0
- {minder_cli-0.3.4 → minder_cli-0.3.8}/src/minder/graph/graph.py +0 -0
- {minder_cli-0.3.4 → minder_cli-0.3.8}/src/minder/graph/nodes/__init__.py +0 -0
- {minder_cli-0.3.4 → minder_cli-0.3.8}/src/minder/graph/nodes/evaluator.py +0 -0
- {minder_cli-0.3.4 → minder_cli-0.3.8}/src/minder/graph/nodes/guard.py +0 -0
- {minder_cli-0.3.4 → minder_cli-0.3.8}/src/minder/graph/nodes/llm.py +0 -0
- {minder_cli-0.3.4 → minder_cli-0.3.8}/src/minder/graph/nodes/planning.py +0 -0
- {minder_cli-0.3.4 → minder_cli-0.3.8}/src/minder/graph/nodes/reasoning.py +0 -0
- {minder_cli-0.3.4 → minder_cli-0.3.8}/src/minder/graph/nodes/reranker.py +0 -0
- {minder_cli-0.3.4 → minder_cli-0.3.8}/src/minder/graph/nodes/retriever.py +0 -0
- {minder_cli-0.3.4 → minder_cli-0.3.8}/src/minder/graph/nodes/verification.py +0 -0
- {minder_cli-0.3.4 → minder_cli-0.3.8}/src/minder/graph/nodes/workflow_planner.py +0 -0
- {minder_cli-0.3.4 → minder_cli-0.3.8}/src/minder/graph/runtime.py +0 -0
- {minder_cli-0.3.4 → minder_cli-0.3.8}/src/minder/llm/__init__.py +0 -0
- {minder_cli-0.3.4 → minder_cli-0.3.8}/src/minder/llm/base.py +0 -0
- {minder_cli-0.3.4 → minder_cli-0.3.8}/src/minder/llm/factory.py +0 -0
- {minder_cli-0.3.4 → minder_cli-0.3.8}/src/minder/llm/openai.py +0 -0
- {minder_cli-0.3.4 → minder_cli-0.3.8}/src/minder/models/__init__.py +0 -0
- {minder_cli-0.3.4 → minder_cli-0.3.8}/src/minder/models/base.py +0 -0
- {minder_cli-0.3.4 → minder_cli-0.3.8}/src/minder/models/client.py +0 -0
- {minder_cli-0.3.4 → minder_cli-0.3.8}/src/minder/models/document.py +0 -0
- {minder_cli-0.3.4 → minder_cli-0.3.8}/src/minder/models/error.py +0 -0
- {minder_cli-0.3.4 → minder_cli-0.3.8}/src/minder/models/graph.py +0 -0
- {minder_cli-0.3.4 → minder_cli-0.3.8}/src/minder/models/history.py +0 -0
- {minder_cli-0.3.4 → minder_cli-0.3.8}/src/minder/models/job.py +0 -0
- {minder_cli-0.3.4 → minder_cli-0.3.8}/src/minder/models/prompt.py +0 -0
- {minder_cli-0.3.4 → minder_cli-0.3.8}/src/minder/models/repository.py +0 -0
- {minder_cli-0.3.4 → minder_cli-0.3.8}/src/minder/models/rule.py +0 -0
- {minder_cli-0.3.4 → minder_cli-0.3.8}/src/minder/models/session.py +0 -0
- {minder_cli-0.3.4 → minder_cli-0.3.8}/src/minder/models/skill.py +0 -0
- {minder_cli-0.3.4 → minder_cli-0.3.8}/src/minder/models/user.py +0 -0
- {minder_cli-0.3.4 → minder_cli-0.3.8}/src/minder/models/workflow.py +0 -0
- {minder_cli-0.3.4 → minder_cli-0.3.8}/src/minder/observability/__init__.py +0 -0
- {minder_cli-0.3.4 → minder_cli-0.3.8}/src/minder/observability/audit.py +0 -0
- {minder_cli-0.3.4 → minder_cli-0.3.8}/src/minder/observability/logging.py +0 -0
- {minder_cli-0.3.4 → minder_cli-0.3.8}/src/minder/observability/metrics.py +0 -0
- {minder_cli-0.3.4 → minder_cli-0.3.8}/src/minder/observability/tracing.py +0 -0
- {minder_cli-0.3.4 → minder_cli-0.3.8}/src/minder/presentation/__init__.py +0 -0
- {minder_cli-0.3.4 → minder_cli-0.3.8}/src/minder/presentation/cli/__init__.py +0 -0
- {minder_cli-0.3.4 → minder_cli-0.3.8}/src/minder/presentation/cli/commands/auth.py +0 -0
- {minder_cli-0.3.4 → minder_cli-0.3.8}/src/minder/presentation/cli/commands/ide.py +0 -0
- {minder_cli-0.3.4 → minder_cli-0.3.8}/src/minder/presentation/cli/commands/mcp.py +0 -0
- {minder_cli-0.3.4 → minder_cli-0.3.8}/src/minder/presentation/cli/commands/sync.py +0 -0
- {minder_cli-0.3.4 → minder_cli-0.3.8}/src/minder/presentation/cli/commands/update.py +0 -0
- {minder_cli-0.3.4 → minder_cli-0.3.8}/src/minder/presentation/cli/main.py +0 -0
- {minder_cli-0.3.4 → minder_cli-0.3.8}/src/minder/presentation/cli/utils/common.py +0 -0
- {minder_cli-0.3.4 → minder_cli-0.3.8}/src/minder/presentation/cli/utils/config.py +0 -0
- {minder_cli-0.3.4 → minder_cli-0.3.8}/src/minder/presentation/cli/utils/git.py +0 -0
- {minder_cli-0.3.4 → minder_cli-0.3.8}/src/minder/presentation/cli/utils/version.py +0 -0
- {minder_cli-0.3.4 → minder_cli-0.3.8}/src/minder/presentation/http/__init__.py +0 -0
- {minder_cli-0.3.4 → minder_cli-0.3.8}/src/minder/presentation/http/admin/__init__.py +0 -0
- {minder_cli-0.3.4 → minder_cli-0.3.8}/src/minder/presentation/http/admin/api.py +0 -0
- {minder_cli-0.3.4 → minder_cli-0.3.8}/src/minder/presentation/http/admin/context.py +0 -0
- {minder_cli-0.3.4 → minder_cli-0.3.8}/src/minder/presentation/http/admin/dashboard.py +0 -0
- {minder_cli-0.3.4 → minder_cli-0.3.8}/src/minder/presentation/http/admin/jobs.py +0 -0
- {minder_cli-0.3.4 → minder_cli-0.3.8}/src/minder/presentation/http/admin/memories.py +0 -0
- {minder_cli-0.3.4 → minder_cli-0.3.8}/src/minder/presentation/http/admin/prompts.py +0 -0
- {minder_cli-0.3.4 → minder_cli-0.3.8}/src/minder/presentation/http/admin/routes.py +0 -0
- {minder_cli-0.3.4 → minder_cli-0.3.8}/src/minder/presentation/http/admin/runtime.py +0 -0
- {minder_cli-0.3.4 → minder_cli-0.3.8}/src/minder/presentation/http/admin/search.py +0 -0
- {minder_cli-0.3.4 → minder_cli-0.3.8}/src/minder/presentation/http/admin/skills.py +0 -0
- {minder_cli-0.3.4 → minder_cli-0.3.8}/src/minder/prompts/__init__.py +0 -0
- {minder_cli-0.3.4 → minder_cli-0.3.8}/src/minder/prompts/formatter.py +0 -0
- {minder_cli-0.3.4 → minder_cli-0.3.8}/src/minder/resources/__init__.py +0 -0
- {minder_cli-0.3.4 → minder_cli-0.3.8}/src/minder/retrieval/__init__.py +0 -0
- {minder_cli-0.3.4 → minder_cli-0.3.8}/src/minder/retrieval/hybrid.py +0 -0
- {minder_cli-0.3.4 → minder_cli-0.3.8}/src/minder/retrieval/mmr.py +0 -0
- {minder_cli-0.3.4 → minder_cli-0.3.8}/src/minder/retrieval/multi_hop.py +0 -0
- {minder_cli-0.3.4 → minder_cli-0.3.8}/src/minder/runtime.py +0 -0
- {minder_cli-0.3.4 → minder_cli-0.3.8}/src/minder/server.py +0 -0
- {minder_cli-0.3.4 → minder_cli-0.3.8}/src/minder/store/__init__.py +0 -0
- {minder_cli-0.3.4 → minder_cli-0.3.8}/src/minder/store/document.py +0 -0
- {minder_cli-0.3.4 → minder_cli-0.3.8}/src/minder/store/error.py +0 -0
- {minder_cli-0.3.4 → minder_cli-0.3.8}/src/minder/store/feedback.py +0 -0
- {minder_cli-0.3.4 → minder_cli-0.3.8}/src/minder/store/graph.py +0 -0
- {minder_cli-0.3.4 → minder_cli-0.3.8}/src/minder/store/history.py +0 -0
- {minder_cli-0.3.4 → minder_cli-0.3.8}/src/minder/store/interfaces.py +0 -0
- {minder_cli-0.3.4 → minder_cli-0.3.8}/src/minder/store/milvus/__init__.py +0 -0
- {minder_cli-0.3.4 → minder_cli-0.3.8}/src/minder/store/milvus/client.py +0 -0
- {minder_cli-0.3.4 → minder_cli-0.3.8}/src/minder/store/milvus/collections.py +0 -0
- {minder_cli-0.3.4 → minder_cli-0.3.8}/src/minder/store/milvus/vector_store.py +0 -0
- {minder_cli-0.3.4 → minder_cli-0.3.8}/src/minder/store/mongodb/__init__.py +0 -0
- {minder_cli-0.3.4 → minder_cli-0.3.8}/src/minder/store/mongodb/client.py +0 -0
- {minder_cli-0.3.4 → minder_cli-0.3.8}/src/minder/store/mongodb/indexes.py +0 -0
- {minder_cli-0.3.4 → minder_cli-0.3.8}/src/minder/store/mongodb/operational_store.py +0 -0
- {minder_cli-0.3.4 → minder_cli-0.3.8}/src/minder/store/relational.py +0 -0
- {minder_cli-0.3.4 → minder_cli-0.3.8}/src/minder/store/repo_state.py +0 -0
- {minder_cli-0.3.4 → minder_cli-0.3.8}/src/minder/store/rule.py +0 -0
- {minder_cli-0.3.4 → minder_cli-0.3.8}/src/minder/store/vector.py +0 -0
- {minder_cli-0.3.4 → minder_cli-0.3.8}/src/minder/tools/__init__.py +0 -0
- {minder_cli-0.3.4 → minder_cli-0.3.8}/src/minder/tools/auth.py +0 -0
- {minder_cli-0.3.4 → minder_cli-0.3.8}/src/minder/tools/graph.py +0 -0
- {minder_cli-0.3.4 → minder_cli-0.3.8}/src/minder/tools/ingest.py +0 -0
- {minder_cli-0.3.4 → minder_cli-0.3.8}/src/minder/tools/memory.py +0 -0
- {minder_cli-0.3.4 → minder_cli-0.3.8}/src/minder/tools/registry.py +0 -0
- {minder_cli-0.3.4 → minder_cli-0.3.8}/src/minder/tools/repo_scanner.py +0 -0
- {minder_cli-0.3.4 → minder_cli-0.3.8}/src/minder/tools/search.py +0 -0
- {minder_cli-0.3.4 → minder_cli-0.3.8}/src/minder/tools/session.py +0 -0
- {minder_cli-0.3.4 → minder_cli-0.3.8}/src/minder/tools/skills.py +0 -0
- {minder_cli-0.3.4 → minder_cli-0.3.8}/src/minder/tools/workflow.py +0 -0
- {minder_cli-0.3.4 → minder_cli-0.3.8}/src/minder/transport/__init__.py +0 -0
- {minder_cli-0.3.4 → minder_cli-0.3.8}/src/minder/transport/base.py +0 -0
- {minder_cli-0.3.4 → minder_cli-0.3.8}/src/minder/transport/sse.py +0 -0
- {minder_cli-0.3.4 → minder_cli-0.3.8}/src/minder/transport/stdio.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: minder-cli
|
|
3
|
-
Version: 0.3.
|
|
3
|
+
Version: 0.3.8
|
|
4
4
|
Summary: Minder CLI is the command-line interface for the Minder self-hosted MCP platform.
|
|
5
5
|
Project-URL: Homepage, https://github.com/hiimtrung/minder
|
|
6
6
|
Project-URL: Repository, https://github.com/hiimtrung/minder
|
|
@@ -37,83 +37,99 @@ Requires-Dist: zipp>=3.21.0; extra == 'server'
|
|
|
37
37
|
Requires-Dist: zstandard>=0.25.0; extra == 'server'
|
|
38
38
|
Description-Content-Type: text/markdown
|
|
39
39
|
|
|
40
|
-
#
|
|
40
|
+
# Minder
|
|
41
41
|
|
|
42
42
|
[](https://pypi.org/project/minder-cli/)
|
|
43
43
|
[](https://opensource.org/licenses/Apache-2.0)
|
|
44
44
|
|
|
45
|
-
**
|
|
45
|
+
**Minder** is a self-hosted MCP (Model Context Protocol) platform for repository-aware engineering intelligence.
|
|
46
46
|
|
|
47
|
-
|
|
47
|
+
It combines a local-first inference stack, a persistent memory and workflow engine, and a developer-facing CLI into a single deployable unit.
|
|
48
48
|
|
|
49
|
-
##
|
|
49
|
+
## What's in this repo
|
|
50
50
|
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
51
|
+
| Component | Description |
|
|
52
|
+
|-----------|-------------|
|
|
53
|
+
| **Minder Server** | MCP gateway — SSE + stdio transport, RAG pipeline, workflow engine, memory, admin HTTP |
|
|
54
|
+
| **Minder CLI** (`minder-cli` on PyPI) | Edge CLI — IDE scaffold, repo sync, login, self-update |
|
|
55
|
+
| **Minder Dashboard** | Astro admin console — client management, onboarding, skill catalog |
|
|
54
56
|
|
|
55
|
-
|
|
56
|
-
pipx install minder-cli
|
|
57
|
-
```
|
|
57
|
+
## Architecture
|
|
58
58
|
|
|
59
|
-
|
|
59
|
+
```
|
|
60
|
+
Developer → minder-cli → Minder Server ←→ AI agents (Codex / Copilot / Claude)
|
|
61
|
+
│
|
|
62
|
+
┌──────────────┼──────────────┐
|
|
63
|
+
│ │ │
|
|
64
|
+
MongoDB Redis Milvus
|
|
65
|
+
(graph/memory) (cache) (vector search)
|
|
66
|
+
│
|
|
67
|
+
┌─────┴──────┐
|
|
68
|
+
│ │
|
|
69
|
+
LiteRT-LM FastEmbed
|
|
70
|
+
(LLM gen) (embedding)
|
|
71
|
+
```
|
|
60
72
|
|
|
61
|
-
|
|
73
|
+
- **LLM inference**: LiteRT-LM (Google AI Edge) — on-device, hardware-accelerated, no HTTP overhead
|
|
74
|
+
- **Embedding inference**: FastEmbed running natively in-process (`mxbai-embed-large-v1`) — zero-dependency ONNX acceleration
|
|
62
75
|
|
|
63
76
|
## Quick Start
|
|
64
77
|
|
|
65
|
-
###
|
|
78
|
+
### Run the server
|
|
66
79
|
|
|
67
80
|
```bash
|
|
68
|
-
|
|
81
|
+
# 1. Download the LiteRT-LM model
|
|
82
|
+
./scripts/download_models.sh
|
|
83
|
+
|
|
84
|
+
# 2. Start infra (MongoDB + Redis + Milvus)
|
|
85
|
+
docker compose -f docker/docker-compose.local.yml up -d
|
|
86
|
+
|
|
87
|
+
# 3. Run Minder Server
|
|
88
|
+
uv run python -m minder.server
|
|
69
89
|
```
|
|
70
90
|
|
|
71
|
-
|
|
91
|
+
Or use the one-command release installer (Docker only, no local uv needed):
|
|
72
92
|
|
|
73
93
|
```bash
|
|
74
|
-
|
|
75
|
-
minder install-ide --target vscode --target claude-code
|
|
94
|
+
curl -fsSL https://raw.githubusercontent.com/hiimtrung/minder/main/scripts/release/install-minder-release.sh | bash
|
|
76
95
|
```
|
|
77
96
|
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
### 3. Sync a repository
|
|
97
|
+
### Connect the CLI
|
|
81
98
|
|
|
82
99
|
```bash
|
|
83
|
-
|
|
84
|
-
|
|
100
|
+
# Install
|
|
101
|
+
uv tool install minder-cli
|
|
85
102
|
|
|
86
|
-
|
|
103
|
+
# Log in with your client key
|
|
104
|
+
minder login --client-key mkc_your_key --server-url http://localhost:8800/sse
|
|
87
105
|
|
|
88
|
-
|
|
106
|
+
# Set up IDE integration (VS Code, Cursor, Claude Code)
|
|
107
|
+
minder install-ide --target vscode --target claude-code
|
|
89
108
|
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
| `minder install-ide` | Scaffold MCP assets for VS Code / Cursor / Claude Code |
|
|
94
|
-
| `minder sync` | Index a repository into the Minder Server |
|
|
95
|
-
| `minder check-update` | Check for available CLI and server updates |
|
|
96
|
-
| `minder self-update` | Update CLI or server in place |
|
|
109
|
+
# Sync a repository
|
|
110
|
+
minder sync --repo-id <uuid>
|
|
111
|
+
```
|
|
97
112
|
|
|
98
|
-
## MCP Tools
|
|
113
|
+
## MCP Tools
|
|
99
114
|
|
|
100
|
-
|
|
115
|
+
When connected, Minder exposes these tools to your AI agents:
|
|
101
116
|
|
|
102
117
|
| Tool | Description |
|
|
103
118
|
|------|-------------|
|
|
104
119
|
| `minder_query` | Full RAG pipeline: retrieve → reason → verify → respond |
|
|
105
|
-
| `minder_search_code` | Semantic code search across indexed
|
|
120
|
+
| `minder_search_code` | Semantic code search across indexed repos |
|
|
106
121
|
| `minder_memory_recall` | Retrieve persisted engineering memory |
|
|
107
122
|
| `minder_workflow_get` | Read current workflow state |
|
|
108
123
|
| `minder_session_restore` | Restore session continuity across context windows |
|
|
109
124
|
|
|
110
|
-
##
|
|
125
|
+
## Documentation
|
|
111
126
|
|
|
112
|
-
- [
|
|
113
|
-
- [Server Setup
|
|
114
|
-
- [Local Dev Setup](
|
|
115
|
-
- [
|
|
127
|
+
- [System Design](docs/system-design.md)
|
|
128
|
+
- [Server Setup](docs/minder-server.md)
|
|
129
|
+
- [Local Dev Setup](docs/guides/local-setup.md)
|
|
130
|
+
- [Production Deployment](docs/guides/production-deployment.md)
|
|
131
|
+
- [Admin & Client Onboarding](docs/guides/admin-client-onboarding.md)
|
|
116
132
|
|
|
117
133
|
## License
|
|
118
134
|
|
|
119
|
-
Apache License 2.0. See [LICENSE](
|
|
135
|
+
Apache License 2.0. See [LICENSE](LICENSE) for details.
|
|
@@ -4,9 +4,9 @@ build-backend = "hatchling.build"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "minder-cli"
|
|
7
|
-
version = "0.3.
|
|
7
|
+
version = "0.3.8"
|
|
8
8
|
description = "Minder CLI is the command-line interface for the Minder self-hosted MCP platform."
|
|
9
|
-
readme = "README
|
|
9
|
+
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.14"
|
|
11
11
|
keywords = ["mcp", "cli", "ai", "code-search", "workflow"]
|
|
12
12
|
classifiers = [
|
|
@@ -46,7 +46,7 @@ class LLMConfig(BaseModel):
|
|
|
46
46
|
litert_model_path: str = "~/.minder/models/gemma-4-E2B-it.litertlm"
|
|
47
47
|
litert_backend: str = "auto" # "auto" (GPU on Mac, CPU elsewhere) | "cpu" | "gpu"
|
|
48
48
|
litert_cache_dir: str = "~/.minder/cache/litert"
|
|
49
|
-
context_length: int =
|
|
49
|
+
context_length: int = 32768
|
|
50
50
|
temperature: float = 0.1
|
|
51
51
|
openai_api_key: Optional[str] = None
|
|
52
52
|
openai_model: str = "gpt-4o-mini"
|
|
@@ -28,7 +28,7 @@ logger = logging.getLogger(__name__)
|
|
|
28
28
|
|
|
29
29
|
_ENGINE_CACHE: dict[str, Any] = {}
|
|
30
30
|
_CONVERSATION_CACHE: OrderedDict[uuid.UUID, Any] = OrderedDict()
|
|
31
|
-
MAX_CACHED_CONVERSATIONS =
|
|
31
|
+
MAX_CACHED_CONVERSATIONS = 3
|
|
32
32
|
|
|
33
33
|
|
|
34
34
|
class LiteRTModelLLM:
|
|
@@ -39,7 +39,7 @@ class LiteRTModelLLM:
|
|
|
39
39
|
model_path: str = "~/.minder/models/gemma-4-E2B-it.litertlm",
|
|
40
40
|
backend: str = "cpu",
|
|
41
41
|
cache_dir: str = "~/.minder/cache/litert",
|
|
42
|
-
context_length: int =
|
|
42
|
+
context_length: int = 32768,
|
|
43
43
|
) -> None:
|
|
44
44
|
self._model_path = str(Path(model_path).expanduser())
|
|
45
45
|
self._backend = backend
|
|
@@ -189,12 +189,14 @@ class LiteRTModelLLM:
|
|
|
189
189
|
|
|
190
190
|
reasoning_output = getattr(state, "reasoning_output", {}) or {}
|
|
191
191
|
prompt = reasoning_output.get("prompt") or state.query
|
|
192
|
+
chat_history = getattr(state, "chat_history", []) or []
|
|
192
193
|
text = self.complete_text(
|
|
193
194
|
str(prompt),
|
|
194
195
|
max_tokens=256,
|
|
195
196
|
temperature=0.1,
|
|
196
197
|
fallback=fallback,
|
|
197
198
|
session_id=state.session_id,
|
|
199
|
+
chat_history=chat_history,
|
|
198
200
|
)
|
|
199
201
|
|
|
200
202
|
return {
|
|
@@ -235,11 +237,12 @@ class LiteRTModelLLM:
|
|
|
235
237
|
try:
|
|
236
238
|
reasoning_output = getattr(state, "reasoning_output", {}) or {}
|
|
237
239
|
prompt = str(reasoning_output.get("prompt") or state.query)
|
|
240
|
+
chat_history = getattr(state, "chat_history", []) or []
|
|
238
241
|
|
|
239
242
|
# Use session cache if available. Reusing the conversation preserves the KV-cache state.
|
|
240
243
|
# For linear conversations, we don't pass 'messages' to send_message_async because
|
|
241
244
|
# it builds on top of the existing state in the Conversation object.
|
|
242
|
-
conv = self._get_conversation(state.session_id, initial_messages=
|
|
245
|
+
conv = self._get_conversation(state.session_id, initial_messages=chat_history)
|
|
243
246
|
|
|
244
247
|
for chunk in conv.send_message_async(prompt):
|
|
245
248
|
for item in chunk.get("content", []):
|
|
@@ -267,13 +270,14 @@ class LiteRTModelLLM:
|
|
|
267
270
|
temperature: float = 0.1,
|
|
268
271
|
fallback: str = "",
|
|
269
272
|
session_id: uuid.UUID | None = None,
|
|
273
|
+
chat_history: list[dict[str, Any]] | None = None,
|
|
270
274
|
) -> str:
|
|
271
275
|
"""Simple text-in/text-out completion."""
|
|
272
276
|
if self.runtime != "litert":
|
|
273
277
|
return fallback
|
|
274
278
|
|
|
275
279
|
try:
|
|
276
|
-
conv = self._get_conversation(session_id, initial_messages=[])
|
|
280
|
+
conv = self._get_conversation(session_id, initial_messages=chat_history or [])
|
|
277
281
|
response = conv.send_message(prompt)
|
|
278
282
|
return cast(str, response["content"][0]["text"])
|
|
279
283
|
except Exception as e:
|
|
@@ -86,6 +86,21 @@ class QueryTools:
|
|
|
86
86
|
"query_reasoning",
|
|
87
87
|
self._store,
|
|
88
88
|
)
|
|
89
|
+
chat_history = []
|
|
90
|
+
if session_id:
|
|
91
|
+
try:
|
|
92
|
+
history_docs = await self._store.list_history_for_session(session_id)
|
|
93
|
+
chat_history = [
|
|
94
|
+
{
|
|
95
|
+
"role": str(getattr(doc, "role", "")).replace("assistant", "model"),
|
|
96
|
+
"content": str(getattr(doc, "content", "")),
|
|
97
|
+
}
|
|
98
|
+
for doc in history_docs
|
|
99
|
+
if getattr(doc, "role", "") and getattr(doc, "content", "")
|
|
100
|
+
]
|
|
101
|
+
except Exception:
|
|
102
|
+
pass
|
|
103
|
+
|
|
89
104
|
state = GraphState(
|
|
90
105
|
query=query,
|
|
91
106
|
session_id=session_id,
|
|
@@ -93,6 +108,7 @@ class QueryTools:
|
|
|
93
108
|
repo_id=repo_id,
|
|
94
109
|
repo_path=repo_path,
|
|
95
110
|
workflow_context=workflow_context,
|
|
111
|
+
chat_history=chat_history,
|
|
96
112
|
metadata={
|
|
97
113
|
"verification_payload": verification_payload,
|
|
98
114
|
"max_attempts": max_attempts,
|
|
@@ -181,6 +197,21 @@ class QueryTools:
|
|
|
181
197
|
"query_reasoning",
|
|
182
198
|
self._store,
|
|
183
199
|
)
|
|
200
|
+
chat_history = []
|
|
201
|
+
if session_id:
|
|
202
|
+
try:
|
|
203
|
+
history_docs = await self._store.list_history_for_session(session_id)
|
|
204
|
+
chat_history = [
|
|
205
|
+
{
|
|
206
|
+
"role": str(getattr(doc, "role", "")).replace("assistant", "model"),
|
|
207
|
+
"content": str(getattr(doc, "content", "")),
|
|
208
|
+
}
|
|
209
|
+
for doc in history_docs
|
|
210
|
+
if getattr(doc, "role", "") and getattr(doc, "content", "")
|
|
211
|
+
]
|
|
212
|
+
except Exception:
|
|
213
|
+
pass
|
|
214
|
+
|
|
184
215
|
state = GraphState(
|
|
185
216
|
query=query,
|
|
186
217
|
session_id=session_id,
|
|
@@ -188,6 +219,7 @@ class QueryTools:
|
|
|
188
219
|
repo_id=repo_id,
|
|
189
220
|
repo_path=repo_path,
|
|
190
221
|
workflow_context=workflow_context,
|
|
222
|
+
chat_history=chat_history,
|
|
191
223
|
metadata={
|
|
192
224
|
"verification_payload": verification_payload,
|
|
193
225
|
"max_attempts": max_attempts,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|