minder-cli 0.5.0__tar.gz → 0.5.2__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.5.0 → minder_cli-0.5.2}/PKG-INFO +6 -9
- {minder_cli-0.5.0 → minder_cli-0.5.2}/README.md +5 -8
- {minder_cli-0.5.0 → minder_cli-0.5.2}/pyproject.toml +1 -1
- {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/application/admin/use_cases.py +3 -5
- minder_cli-0.5.2/src/minder/bootstrap/agent_seeder.py +25 -0
- {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/bootstrap/transport.py +119 -45
- {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/continuity.py +3 -3
- {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/learning/error_learner.py +1 -1
- {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/learning/quality_optimizer.py +1 -1
- {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/learning/skill_synthesizer.py +1 -1
- {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/models/__init__.py +5 -0
- minder_cli-0.5.2/src/minder/models/agent.py +47 -0
- minder_cli-0.5.2/src/minder/presentation/cli/commands/agent.py +339 -0
- minder_cli-0.5.2/src/minder/presentation/http/admin/agents.py +114 -0
- {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/presentation/http/admin/memories.py +3 -7
- {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/presentation/http/admin/routes.py +2 -0
- {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/presentation/http/admin/search.py +3 -7
- {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/presentation/http/admin/skills.py +2 -7
- {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/resources/__init__.py +1 -1
- {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/server.py +4 -1
- {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/store/interfaces.py +29 -0
- {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/store/mongodb/indexes.py +6 -0
- {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/store/mongodb/operational_store.py +94 -0
- {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/store/relational.py +106 -1
- {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/tools/__init__.py +0 -3
- minder_cli-0.5.2/src/minder/tools/agents.py +104 -0
- {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/tools/memory.py +6 -8
- {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/tools/registry.py +34 -15
- minder_cli-0.5.2/src/minder/tools/seeds/__init__.py +0 -0
- minder_cli-0.5.2/src/minder/tools/seeds/default_agents.py +108 -0
- {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/tools/skills.py +12 -19
- minder_cli-0.5.0/src/minder/presentation/cli/commands/agent.py +0 -418
- minder_cli-0.5.0/src/minder/tools/search.py +0 -15
- {minder_cli-0.5.0 → minder_cli-0.5.2}/.gitignore +0 -0
- {minder_cli-0.5.0 → minder_cli-0.5.2}/LICENSE +0 -0
- {minder_cli-0.5.0 → minder_cli-0.5.2}/README-pypi.md +0 -0
- {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/__init__.py +0 -0
- {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/api/routers/prompts.py +0 -0
- {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/application/__init__.py +0 -0
- {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/application/admin/__init__.py +0 -0
- {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/application/admin/dto.py +0 -0
- {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/application/admin/jobs.py +0 -0
- {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/auth/__init__.py +0 -0
- {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/auth/context.py +0 -0
- {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/auth/middleware.py +0 -0
- {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/auth/principal.py +0 -0
- {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/auth/rate_limiter.py +0 -0
- {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/auth/rbac.py +0 -0
- {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/auth/service.py +0 -0
- {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/bootstrap/__init__.py +0 -0
- {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/bootstrap/providers.py +0 -0
- {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/cache/__init__.py +0 -0
- {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/cache/providers.py +0 -0
- {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/chunking/__init__.py +0 -0
- {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/chunking/code_splitter.py +0 -0
- {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/chunking/splitter.py +0 -0
- {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/cli.py +0 -0
- {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/config.py +0 -0
- {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/context_compactor.py +0 -0
- {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/dev.py +0 -0
- {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/embedding/__init__.py +0 -0
- {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/embedding/base.py +0 -0
- {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/embedding/local.py +0 -0
- {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/embedding/openai.py +0 -0
- {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/graph/__init__.py +0 -0
- {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/graph/edges.py +0 -0
- {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/graph/executor.py +0 -0
- {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/graph/graph.py +0 -0
- {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/graph/nodes/__init__.py +0 -0
- {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/graph/nodes/clarification.py +0 -0
- {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/graph/nodes/evaluator.py +0 -0
- {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/graph/nodes/guard.py +0 -0
- {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/graph/nodes/llm.py +0 -0
- {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/graph/nodes/planning.py +0 -0
- {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/graph/nodes/reasoning.py +0 -0
- {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/graph/nodes/reflection.py +0 -0
- {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/graph/nodes/reranker.py +0 -0
- {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/graph/nodes/retriever.py +0 -0
- {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/graph/nodes/verification.py +0 -0
- {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/graph/nodes/workflow_planner.py +0 -0
- {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/graph/runtime.py +0 -0
- {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/graph/state.py +0 -0
- {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/learning/__init__.py +0 -0
- {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/learning/pattern_extractor.py +0 -0
- {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/llm/__init__.py +0 -0
- {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/llm/base.py +0 -0
- {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/llm/factory.py +0 -0
- {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/llm/llama_cpp_llm.py +0 -0
- {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/llm/openai.py +0 -0
- {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/models/base.py +0 -0
- {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/models/client.py +0 -0
- {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/models/document.py +0 -0
- {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/models/error.py +0 -0
- {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/models/graph.py +0 -0
- {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/models/history.py +0 -0
- {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/models/job.py +0 -0
- {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/models/prompt.py +0 -0
- {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/models/repository.py +0 -0
- {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/models/rule.py +0 -0
- {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/models/session.py +0 -0
- {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/models/skill.py +0 -0
- {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/models/user.py +0 -0
- {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/models/workflow.py +0 -0
- {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/observability/__init__.py +0 -0
- {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/observability/audit.py +0 -0
- {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/observability/logging.py +0 -0
- {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/observability/metrics.py +0 -0
- {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/observability/tracing.py +0 -0
- {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/presentation/__init__.py +0 -0
- {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/presentation/cli/__init__.py +0 -0
- {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/presentation/cli/commands/auth.py +0 -0
- {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/presentation/cli/commands/ide.py +0 -0
- {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/presentation/cli/commands/mcp.py +0 -0
- {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/presentation/cli/commands/sync.py +0 -0
- {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/presentation/cli/commands/update.py +0 -0
- {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/presentation/cli/main.py +0 -0
- {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/presentation/cli/utils/common.py +0 -0
- {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/presentation/cli/utils/config.py +0 -0
- {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/presentation/cli/utils/git.py +0 -0
- {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/presentation/cli/utils/version.py +0 -0
- {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/presentation/http/__init__.py +0 -0
- {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/presentation/http/admin/__init__.py +0 -0
- {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/presentation/http/admin/api.py +0 -0
- {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/presentation/http/admin/context.py +0 -0
- {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/presentation/http/admin/dashboard.py +0 -0
- {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/presentation/http/admin/jobs.py +0 -0
- {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/presentation/http/admin/prompts.py +0 -0
- {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/presentation/http/admin/runtime.py +0 -0
- {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/prompts/__init__.py +0 -0
- {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/prompts/formatter.py +0 -0
- {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/retrieval/__init__.py +0 -0
- {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/retrieval/hybrid.py +0 -0
- {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/retrieval/mmr.py +0 -0
- {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/retrieval/multi_hop.py +0 -0
- {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/runtime.py +0 -0
- {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/store/__init__.py +0 -0
- {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/store/document.py +0 -0
- {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/store/error.py +0 -0
- {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/store/feedback.py +0 -0
- {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/store/graph.py +0 -0
- {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/store/history.py +0 -0
- {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/store/milvus/__init__.py +0 -0
- {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/store/milvus/client.py +0 -0
- {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/store/milvus/collections.py +0 -0
- {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/store/milvus/vector_store.py +0 -0
- {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/store/mongodb/__init__.py +0 -0
- {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/store/mongodb/client.py +0 -0
- {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/store/mongodb/graph_store.py +0 -0
- {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/store/repo_state.py +0 -0
- {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/store/rule.py +0 -0
- {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/store/vector.py +0 -0
- {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/tools/auth.py +0 -0
- {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/tools/graph.py +0 -0
- {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/tools/ingest.py +0 -0
- {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/tools/query.py +0 -0
- {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/tools/repo_scanner.py +0 -0
- {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/tools/session.py +0 -0
- {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/tools/workflow.py +0 -0
- {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/transport/__init__.py +0 -0
- {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/transport/base.py +0 -0
- {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/transport/sse.py +0 -0
- {minder_cli-0.5.0 → minder_cli-0.5.2}/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.5.
|
|
3
|
+
Version: 0.5.2
|
|
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
|
|
@@ -66,25 +66,22 @@ Developer → minder-cli → Minder Server ←→ AI agents (Codex / Copilot / C
|
|
|
66
66
|
│
|
|
67
67
|
┌─────┴──────┐
|
|
68
68
|
│ │
|
|
69
|
-
|
|
69
|
+
llama.cpp llama.cpp
|
|
70
70
|
(LLM gen) (embedding)
|
|
71
71
|
```
|
|
72
72
|
|
|
73
|
-
- **LLM inference**:
|
|
74
|
-
- **Embedding inference**:
|
|
73
|
+
- **LLM inference**: llama-cpp-python — GGUF models auto-downloaded from HuggingFace, hardware-accelerated (Metal on Mac, CPU elsewhere)
|
|
74
|
+
- **Embedding inference**: llama-cpp-python — dedicated GGUF embedding model, in-process, no HTTP overhead
|
|
75
75
|
|
|
76
76
|
## Quick Start
|
|
77
77
|
|
|
78
78
|
### Run the server
|
|
79
79
|
|
|
80
80
|
```bash
|
|
81
|
-
# 1.
|
|
82
|
-
./scripts/download_models.sh
|
|
83
|
-
|
|
84
|
-
# 2. Start infra (MongoDB + Redis + Milvus)
|
|
81
|
+
# 1. Start infra (MongoDB + Redis + Milvus)
|
|
85
82
|
docker compose -f docker/docker-compose.local.yml up -d
|
|
86
83
|
|
|
87
|
-
#
|
|
84
|
+
# 2. Run Minder Server (GGUF models auto-download on first start)
|
|
88
85
|
uv run python -m minder.server
|
|
89
86
|
```
|
|
90
87
|
|
|
@@ -27,25 +27,22 @@ Developer → minder-cli → Minder Server ←→ AI agents (Codex / Copilot / C
|
|
|
27
27
|
│
|
|
28
28
|
┌─────┴──────┐
|
|
29
29
|
│ │
|
|
30
|
-
|
|
30
|
+
llama.cpp llama.cpp
|
|
31
31
|
(LLM gen) (embedding)
|
|
32
32
|
```
|
|
33
33
|
|
|
34
|
-
- **LLM inference**:
|
|
35
|
-
- **Embedding inference**:
|
|
34
|
+
- **LLM inference**: llama-cpp-python — GGUF models auto-downloaded from HuggingFace, hardware-accelerated (Metal on Mac, CPU elsewhere)
|
|
35
|
+
- **Embedding inference**: llama-cpp-python — dedicated GGUF embedding model, in-process, no HTTP overhead
|
|
36
36
|
|
|
37
37
|
## Quick Start
|
|
38
38
|
|
|
39
39
|
### Run the server
|
|
40
40
|
|
|
41
41
|
```bash
|
|
42
|
-
# 1.
|
|
43
|
-
./scripts/download_models.sh
|
|
44
|
-
|
|
45
|
-
# 2. Start infra (MongoDB + Redis + Milvus)
|
|
42
|
+
# 1. Start infra (MongoDB + Redis + Milvus)
|
|
46
43
|
docker compose -f docker/docker-compose.local.yml up -d
|
|
47
44
|
|
|
48
|
-
#
|
|
45
|
+
# 2. Run Minder Server (GGUF models auto-download on first start)
|
|
49
46
|
uv run python -m minder.server
|
|
50
47
|
```
|
|
51
48
|
|
|
@@ -66,21 +66,19 @@ _UNSET: Any = object() # sentinel for optional update fields
|
|
|
66
66
|
DASHBOARD_TOOL_SCOPE_OPTIONS = [tool.name for tool in SCOPEABLE_TOOLS]
|
|
67
67
|
|
|
68
68
|
DASHBOARD_TOOL_SCOPE_PRESETS: dict[str, list[str]] = {
|
|
69
|
-
"Query Only": ["
|
|
69
|
+
"Query Only": ["minder_search_code", "minder_search_errors", "minder_memory_recall"],
|
|
70
70
|
"Read Only": [
|
|
71
|
-
"minder_query",
|
|
72
71
|
"minder_search_code",
|
|
73
72
|
"minder_search_errors",
|
|
74
|
-
"minder_search",
|
|
75
73
|
"minder_memory_recall",
|
|
74
|
+
"minder_skill_recall",
|
|
76
75
|
"minder_workflow_get",
|
|
77
76
|
],
|
|
78
77
|
"Full Dev Assistant": [
|
|
79
|
-
"minder_query",
|
|
80
78
|
"minder_search_code",
|
|
81
79
|
"minder_search_errors",
|
|
82
|
-
"minder_search",
|
|
83
80
|
"minder_memory_recall",
|
|
81
|
+
"minder_skill_recall",
|
|
84
82
|
"minder_workflow_get",
|
|
85
83
|
"minder_workflow_step",
|
|
86
84
|
],
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"""Seed default SubAgent definitions on first startup."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import logging
|
|
6
|
+
|
|
7
|
+
from minder.store.interfaces import IOperationalStore
|
|
8
|
+
from minder.tools.seeds.default_agents import DEFAULT_AGENTS
|
|
9
|
+
|
|
10
|
+
logger = logging.getLogger(__name__)
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
async def seed_default_agents(store: IOperationalStore) -> None:
|
|
14
|
+
"""Insert default agents only if they do not already exist.
|
|
15
|
+
|
|
16
|
+
Never overwrites user-modified defaults — guards by name existence check.
|
|
17
|
+
"""
|
|
18
|
+
for defn in DEFAULT_AGENTS:
|
|
19
|
+
name = defn["name"]
|
|
20
|
+
existing = await store.get_agent_by_name(name)
|
|
21
|
+
if existing is not None:
|
|
22
|
+
logger.debug("SubAgent %r already exists, skipping seed", name)
|
|
23
|
+
continue
|
|
24
|
+
await store.create_agent(**defn)
|
|
25
|
+
logger.info("Seeded default SubAgent: %r", name)
|
|
@@ -19,12 +19,12 @@ from minder.store.interfaces import (
|
|
|
19
19
|
IVectorStore,
|
|
20
20
|
)
|
|
21
21
|
from minder.store.repo_state import RepoStateStore
|
|
22
|
+
from minder.tools.agents import AgentTools
|
|
22
23
|
from minder.tools.auth import AuthTools
|
|
23
24
|
from minder.tools.graph import GraphTools
|
|
24
25
|
from minder.tools.memory import MemoryTools
|
|
25
26
|
from minder.tools.query import QueryTools
|
|
26
27
|
from minder.tools.registry import TOOL_DESCRIPTIONS
|
|
27
|
-
from minder.tools.search import SearchTools
|
|
28
28
|
from minder.tools.session import SessionTools
|
|
29
29
|
from minder.tools.skills import SkillTools
|
|
30
30
|
from minder.tools.workflow import WorkflowTools
|
|
@@ -42,12 +42,12 @@ def build_transport(
|
|
|
42
42
|
auth_service = AuthService(store, config, cache=cache)
|
|
43
43
|
cache_provider = cache or LRUCacheProvider()
|
|
44
44
|
repo_state_store = RepoStateStore(config.workflow.repo_state_dir)
|
|
45
|
+
agent_tools = AgentTools(store)
|
|
45
46
|
auth_tools = AuthTools(store, auth_service)
|
|
46
47
|
session_tools = SessionTools(store)
|
|
47
48
|
workflow_tools = WorkflowTools(store, repo_state_store)
|
|
48
49
|
memory_tools = MemoryTools(store, config)
|
|
49
50
|
skill_tools = SkillTools(store, config)
|
|
50
|
-
search_tools = SearchTools(store, config)
|
|
51
51
|
graph_tools = GraphTools(graph_store, store)
|
|
52
52
|
query_tools = QueryTools(
|
|
53
53
|
store,
|
|
@@ -518,37 +518,6 @@ def build_transport(
|
|
|
518
518
|
excerpt_kind=excerpt_kind,
|
|
519
519
|
)
|
|
520
520
|
|
|
521
|
-
async def minder_search(
|
|
522
|
-
*, user=None, query: str, limit: int = 5
|
|
523
|
-
) -> list[dict[str, Any]]: # noqa: ANN001
|
|
524
|
-
del user
|
|
525
|
-
return await search_tools.minder_search(query, limit=limit)
|
|
526
|
-
|
|
527
|
-
async def minder_query(
|
|
528
|
-
*,
|
|
529
|
-
user=None,
|
|
530
|
-
principal: Principal | None = None,
|
|
531
|
-
query: str,
|
|
532
|
-
repo_path: str,
|
|
533
|
-
session_id: str | None = None,
|
|
534
|
-
repo_id: str | None = None,
|
|
535
|
-
workflow_name: str | None = None,
|
|
536
|
-
) -> dict[str, Any]: # noqa: ANN001
|
|
537
|
-
if user is None and principal is None:
|
|
538
|
-
raise AuthError("AUTH_MISSING_TOKEN", "Authenticated principal required")
|
|
539
|
-
ensure_client_repo_access(principal, repo_path=repo_path)
|
|
540
|
-
return await query_tools.minder_query(
|
|
541
|
-
query,
|
|
542
|
-
repo_path=repo_path,
|
|
543
|
-
session_id=uuid.UUID(session_id) if session_id else None,
|
|
544
|
-
user_id=user.id if user else None,
|
|
545
|
-
repo_id=uuid.UUID(repo_id) if repo_id else None,
|
|
546
|
-
workflow_name=workflow_name,
|
|
547
|
-
allowed_repo_scopes=(
|
|
548
|
-
principal.repo_scope if isinstance(principal, ClientPrincipal) else None
|
|
549
|
-
),
|
|
550
|
-
)
|
|
551
|
-
|
|
552
521
|
async def minder_search_code(
|
|
553
522
|
*,
|
|
554
523
|
user=None,
|
|
@@ -801,18 +770,6 @@ def build_transport(
|
|
|
801
770
|
require_auth=True,
|
|
802
771
|
description=TOOL_DESCRIPTIONS["minder_skill_import_git"],
|
|
803
772
|
)
|
|
804
|
-
transport.register_tool(
|
|
805
|
-
"minder_search",
|
|
806
|
-
minder_search,
|
|
807
|
-
require_auth=True,
|
|
808
|
-
description=TOOL_DESCRIPTIONS["minder_search"],
|
|
809
|
-
)
|
|
810
|
-
transport.register_tool(
|
|
811
|
-
"minder_query",
|
|
812
|
-
minder_query,
|
|
813
|
-
require_auth=True,
|
|
814
|
-
description=TOOL_DESCRIPTIONS["minder_query"],
|
|
815
|
-
)
|
|
816
773
|
transport.register_tool(
|
|
817
774
|
"minder_search_code",
|
|
818
775
|
minder_search_code,
|
|
@@ -838,6 +795,123 @@ def build_transport(
|
|
|
838
795
|
description=TOOL_DESCRIPTIONS["minder_find_impact"],
|
|
839
796
|
)
|
|
840
797
|
|
|
798
|
+
async def minder_agent_list(
|
|
799
|
+
*,
|
|
800
|
+
user=None, # noqa: ANN001
|
|
801
|
+
workflow_step: str | None = None,
|
|
802
|
+
tag: str | None = None,
|
|
803
|
+
is_default: bool | None = None,
|
|
804
|
+
) -> list[dict[str, Any]]:
|
|
805
|
+
del user
|
|
806
|
+
return await agent_tools.minder_agent_list(
|
|
807
|
+
workflow_step=workflow_step,
|
|
808
|
+
tag=tag,
|
|
809
|
+
is_default=is_default,
|
|
810
|
+
)
|
|
811
|
+
|
|
812
|
+
async def minder_agent_get(
|
|
813
|
+
*,
|
|
814
|
+
user=None, # noqa: ANN001
|
|
815
|
+
name: str,
|
|
816
|
+
) -> dict[str, Any] | None:
|
|
817
|
+
del user
|
|
818
|
+
return await agent_tools.minder_agent_get(name)
|
|
819
|
+
|
|
820
|
+
async def minder_agent_store(
|
|
821
|
+
*,
|
|
822
|
+
user=None, # noqa: ANN001
|
|
823
|
+
name: str,
|
|
824
|
+
title: str,
|
|
825
|
+
description: str,
|
|
826
|
+
system_prompt: str,
|
|
827
|
+
tools: list[str] | None = None,
|
|
828
|
+
workflow_steps: list[str] | None = None,
|
|
829
|
+
artifact_types: list[str] | None = None,
|
|
830
|
+
tags: list[str] | None = None,
|
|
831
|
+
is_default: bool = False,
|
|
832
|
+
) -> dict[str, Any]:
|
|
833
|
+
del user
|
|
834
|
+
return await agent_tools.minder_agent_store(
|
|
835
|
+
name,
|
|
836
|
+
title=title,
|
|
837
|
+
description=description,
|
|
838
|
+
system_prompt=system_prompt,
|
|
839
|
+
tools=tools,
|
|
840
|
+
workflow_steps=workflow_steps,
|
|
841
|
+
artifact_types=artifact_types,
|
|
842
|
+
tags=tags,
|
|
843
|
+
is_default=is_default,
|
|
844
|
+
)
|
|
845
|
+
|
|
846
|
+
async def minder_agent_update(
|
|
847
|
+
*,
|
|
848
|
+
user=None, # noqa: ANN001
|
|
849
|
+
name: str,
|
|
850
|
+
title: str | None = None,
|
|
851
|
+
description: str | None = None,
|
|
852
|
+
system_prompt: str | None = None,
|
|
853
|
+
tools: list[str] | None = None,
|
|
854
|
+
workflow_steps: list[str] | None = None,
|
|
855
|
+
artifact_types: list[str] | None = None,
|
|
856
|
+
tags: list[str] | None = None,
|
|
857
|
+
is_default: bool | None = None,
|
|
858
|
+
) -> dict[str, Any] | None:
|
|
859
|
+
del user
|
|
860
|
+
kwargs = {
|
|
861
|
+
k: v
|
|
862
|
+
for k, v in {
|
|
863
|
+
"title": title,
|
|
864
|
+
"description": description,
|
|
865
|
+
"system_prompt": system_prompt,
|
|
866
|
+
"tools": tools,
|
|
867
|
+
"workflow_steps": workflow_steps,
|
|
868
|
+
"artifact_types": artifact_types,
|
|
869
|
+
"tags": tags,
|
|
870
|
+
"is_default": is_default,
|
|
871
|
+
}.items()
|
|
872
|
+
if v is not None
|
|
873
|
+
}
|
|
874
|
+
return await agent_tools.minder_agent_update(name, **kwargs)
|
|
875
|
+
|
|
876
|
+
async def minder_agent_delete(
|
|
877
|
+
*,
|
|
878
|
+
user=None, # noqa: ANN001
|
|
879
|
+
name: str,
|
|
880
|
+
) -> dict[str, Any]:
|
|
881
|
+
del user
|
|
882
|
+
return await agent_tools.minder_agent_delete(name)
|
|
883
|
+
|
|
884
|
+
transport.register_tool(
|
|
885
|
+
"minder_agent_list",
|
|
886
|
+
minder_agent_list,
|
|
887
|
+
require_auth=True,
|
|
888
|
+
description=TOOL_DESCRIPTIONS["minder_agent_list"],
|
|
889
|
+
)
|
|
890
|
+
transport.register_tool(
|
|
891
|
+
"minder_agent_get",
|
|
892
|
+
minder_agent_get,
|
|
893
|
+
require_auth=True,
|
|
894
|
+
description=TOOL_DESCRIPTIONS["minder_agent_get"],
|
|
895
|
+
)
|
|
896
|
+
transport.register_tool(
|
|
897
|
+
"minder_agent_store",
|
|
898
|
+
minder_agent_store,
|
|
899
|
+
require_auth=True,
|
|
900
|
+
description=TOOL_DESCRIPTIONS["minder_agent_store"],
|
|
901
|
+
)
|
|
902
|
+
transport.register_tool(
|
|
903
|
+
"minder_agent_update",
|
|
904
|
+
minder_agent_update,
|
|
905
|
+
require_auth=True,
|
|
906
|
+
description=TOOL_DESCRIPTIONS["minder_agent_update"],
|
|
907
|
+
)
|
|
908
|
+
transport.register_tool(
|
|
909
|
+
"minder_agent_delete",
|
|
910
|
+
minder_agent_delete,
|
|
911
|
+
require_auth=True,
|
|
912
|
+
description=TOOL_DESCRIPTIONS["minder_agent_delete"],
|
|
913
|
+
)
|
|
914
|
+
|
|
841
915
|
ResourceRegistry.register(transport.app, store, graph_store=graph_store)
|
|
842
916
|
PromptRegistry.register(transport.app, store=store)
|
|
843
917
|
return transport
|
|
@@ -52,10 +52,10 @@ def allowed_tools_for_step(step_name: str | None) -> list[str]:
|
|
|
52
52
|
if "test" in normalized:
|
|
53
53
|
return base_tools + ["minder_search_code", "minder_search_errors"]
|
|
54
54
|
if "implement" in normalized:
|
|
55
|
-
return base_tools + ["minder_search_code", "
|
|
55
|
+
return base_tools + ["minder_search_code", "minder_skill_recall"]
|
|
56
56
|
if "review" in normalized:
|
|
57
|
-
return base_tools + ["
|
|
58
|
-
return base_tools + ["
|
|
57
|
+
return base_tools + ["minder_skill_recall", "minder_search_code"]
|
|
58
|
+
return base_tools + ["minder_memory_recall", "minder_search_code"]
|
|
59
59
|
|
|
60
60
|
|
|
61
61
|
def forbidden_actions_for_step(
|
|
@@ -27,7 +27,7 @@ class ErrorLearner:
|
|
|
27
27
|
if not failures:
|
|
28
28
|
return None
|
|
29
29
|
|
|
30
|
-
existing = await self._store.
|
|
30
|
+
existing = await self._store.list_skills_by_kind(is_memory=False)
|
|
31
31
|
error_count = sum(
|
|
32
32
|
1 for s in existing if _ERROR_TAG in (getattr(s, "tags", []) or [])
|
|
33
33
|
)
|
|
@@ -61,7 +61,7 @@ class QualityOptimizer:
|
|
|
61
61
|
) -> list[dict[str, Any]]:
|
|
62
62
|
query_emb = self._embedder.embed(query)
|
|
63
63
|
updated: list[dict[str, Any]] = []
|
|
64
|
-
for skill in await self._store.
|
|
64
|
+
for skill in await self._store.list_skills_by_kind(is_memory=False):
|
|
65
65
|
tags = list(getattr(skill, "tags", []) or [])
|
|
66
66
|
if _PATTERN_TAG not in tags:
|
|
67
67
|
continue
|
|
@@ -30,7 +30,7 @@ class SkillSynthesizer:
|
|
|
30
30
|
content = _render_pattern(pattern)
|
|
31
31
|
embedding = self._embedder.embed(f"{title}\n{content}")
|
|
32
32
|
|
|
33
|
-
for skill in await self._store.
|
|
33
|
+
for skill in await self._store.list_skills_by_kind(is_memory=False):
|
|
34
34
|
tags = list(getattr(skill, "tags", []) or [])
|
|
35
35
|
if _SYNTHESIS_TAG not in tags:
|
|
36
36
|
continue
|
|
@@ -62,9 +62,14 @@ from .graph import (
|
|
|
62
62
|
GraphNodeSchema as GraphNodeSchema,
|
|
63
63
|
)
|
|
64
64
|
|
|
65
|
+
# SubAgent
|
|
66
|
+
from .agent import SubAgent as SubAgent, SubAgentSchema as SubAgentSchema
|
|
67
|
+
|
|
65
68
|
__all__ = [
|
|
66
69
|
"Base",
|
|
67
70
|
"AuditLog",
|
|
71
|
+
"SubAgent",
|
|
72
|
+
"SubAgentSchema",
|
|
68
73
|
"AuditLogSchema",
|
|
69
74
|
"AdminJob",
|
|
70
75
|
"AdminJobSchema",
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import uuid
|
|
2
|
+
from datetime import datetime, UTC
|
|
3
|
+
from typing import Any, List
|
|
4
|
+
from sqlalchemy.orm import Mapped, mapped_column
|
|
5
|
+
from sqlalchemy import Boolean, String, DateTime, UUID, JSON, func, Text
|
|
6
|
+
from pydantic import Field
|
|
7
|
+
|
|
8
|
+
from .base import Base, BaseModelMeta
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class SubAgentSchema(BaseModelMeta):
|
|
12
|
+
id: uuid.UUID = Field(default_factory=uuid.uuid4)
|
|
13
|
+
name: str
|
|
14
|
+
title: str
|
|
15
|
+
description: str
|
|
16
|
+
system_prompt: str
|
|
17
|
+
tools: List[str] = Field(default_factory=list)
|
|
18
|
+
workflow_steps: List[str] = Field(default_factory=list)
|
|
19
|
+
artifact_types: List[str] = Field(default_factory=list)
|
|
20
|
+
tags: List[str] = Field(default_factory=list)
|
|
21
|
+
is_default: bool = False
|
|
22
|
+
created_at: datetime = Field(default_factory=lambda: datetime.now(UTC))
|
|
23
|
+
updated_at: datetime = Field(default_factory=lambda: datetime.now(UTC))
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
class SubAgent(Base):
|
|
27
|
+
__tablename__ = "subagents"
|
|
28
|
+
|
|
29
|
+
id: Mapped[uuid.UUID] = mapped_column(
|
|
30
|
+
UUID(as_uuid=True), primary_key=True, default=uuid.uuid4
|
|
31
|
+
)
|
|
32
|
+
company_id: Mapped[str] = mapped_column(String, index=True, default="default")
|
|
33
|
+
name: Mapped[str] = mapped_column(String, unique=True, index=True)
|
|
34
|
+
title: Mapped[str] = mapped_column(String)
|
|
35
|
+
description: Mapped[str] = mapped_column(Text)
|
|
36
|
+
system_prompt: Mapped[str] = mapped_column(Text)
|
|
37
|
+
tools: Mapped[List[Any]] = mapped_column(JSON, default=list)
|
|
38
|
+
workflow_steps: Mapped[List[Any]] = mapped_column(JSON, default=list)
|
|
39
|
+
artifact_types: Mapped[List[Any]] = mapped_column(JSON, default=list)
|
|
40
|
+
tags: Mapped[List[Any]] = mapped_column(JSON, default=list)
|
|
41
|
+
is_default: Mapped[bool] = mapped_column(Boolean, default=False, server_default="0")
|
|
42
|
+
created_at: Mapped[datetime] = mapped_column(
|
|
43
|
+
DateTime(timezone=True), server_default=func.now()
|
|
44
|
+
)
|
|
45
|
+
updated_at: Mapped[datetime] = mapped_column(
|
|
46
|
+
DateTime(timezone=True), server_default=func.now(), onupdate=func.now()
|
|
47
|
+
)
|