minder-cli 0.4.9__tar.gz → 0.5.1__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.
Files changed (165) hide show
  1. {minder_cli-0.4.9 → minder_cli-0.5.1}/PKG-INFO +7 -11
  2. {minder_cli-0.4.9 → minder_cli-0.5.1}/README.md +5 -8
  3. {minder_cli-0.4.9 → minder_cli-0.5.1}/pyproject.toml +2 -3
  4. {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/application/admin/use_cases.py +3 -5
  5. minder_cli-0.5.1/src/minder/bootstrap/agent_seeder.py +25 -0
  6. {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/bootstrap/transport.py +119 -45
  7. {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/config.py +8 -10
  8. {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/continuity.py +4 -4
  9. {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/embedding/local.py +53 -33
  10. minder_cli-0.5.1/src/minder/graph/executor.py +247 -0
  11. {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/graph/graph.py +2 -2
  12. {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/learning/error_learner.py +1 -1
  13. {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/learning/quality_optimizer.py +1 -1
  14. {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/learning/skill_synthesizer.py +1 -1
  15. {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/llm/__init__.py +2 -2
  16. {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/llm/factory.py +7 -10
  17. minder_cli-0.5.1/src/minder/llm/llama_cpp_llm.py +257 -0
  18. {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/models/__init__.py +5 -0
  19. minder_cli-0.5.1/src/minder/models/agent.py +47 -0
  20. minder_cli-0.5.1/src/minder/presentation/cli/commands/agent.py +339 -0
  21. minder_cli-0.5.1/src/minder/presentation/http/admin/agents.py +114 -0
  22. {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/presentation/http/admin/context.py +2 -2
  23. {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/presentation/http/admin/memories.py +5 -9
  24. {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/presentation/http/admin/routes.py +2 -0
  25. {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/presentation/http/admin/search.py +3 -7
  26. {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/presentation/http/admin/skills.py +2 -7
  27. {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/prompts/formatter.py +1 -1
  28. {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/resources/__init__.py +1 -1
  29. minder_cli-0.5.1/src/minder/runtime.py +66 -0
  30. {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/server.py +13 -22
  31. {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/store/interfaces.py +29 -0
  32. {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/store/mongodb/indexes.py +6 -0
  33. {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/store/mongodb/operational_store.py +94 -0
  34. {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/store/relational.py +106 -1
  35. {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/tools/__init__.py +0 -3
  36. minder_cli-0.5.1/src/minder/tools/agents.py +104 -0
  37. {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/tools/memory.py +8 -10
  38. {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/tools/query.py +2 -2
  39. {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/tools/registry.py +34 -15
  40. minder_cli-0.5.1/src/minder/tools/seeds/__init__.py +0 -0
  41. minder_cli-0.5.1/src/minder/tools/seeds/default_agents.py +108 -0
  42. {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/tools/skills.py +14 -21
  43. minder_cli-0.4.9/src/minder/graph/executor.py +0 -138
  44. minder_cli-0.4.9/src/minder/llm/litert.py +0 -331
  45. minder_cli-0.4.9/src/minder/presentation/cli/commands/agent.py +0 -418
  46. minder_cli-0.4.9/src/minder/runtime.py +0 -15
  47. minder_cli-0.4.9/src/minder/tools/search.py +0 -15
  48. {minder_cli-0.4.9 → minder_cli-0.5.1}/.gitignore +0 -0
  49. {minder_cli-0.4.9 → minder_cli-0.5.1}/LICENSE +0 -0
  50. {minder_cli-0.4.9 → minder_cli-0.5.1}/README-pypi.md +0 -0
  51. {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/__init__.py +0 -0
  52. {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/api/routers/prompts.py +0 -0
  53. {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/application/__init__.py +0 -0
  54. {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/application/admin/__init__.py +0 -0
  55. {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/application/admin/dto.py +0 -0
  56. {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/application/admin/jobs.py +0 -0
  57. {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/auth/__init__.py +0 -0
  58. {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/auth/context.py +0 -0
  59. {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/auth/middleware.py +0 -0
  60. {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/auth/principal.py +0 -0
  61. {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/auth/rate_limiter.py +0 -0
  62. {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/auth/rbac.py +0 -0
  63. {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/auth/service.py +0 -0
  64. {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/bootstrap/__init__.py +0 -0
  65. {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/bootstrap/providers.py +0 -0
  66. {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/cache/__init__.py +0 -0
  67. {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/cache/providers.py +0 -0
  68. {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/chunking/__init__.py +0 -0
  69. {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/chunking/code_splitter.py +0 -0
  70. {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/chunking/splitter.py +0 -0
  71. {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/cli.py +0 -0
  72. {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/context_compactor.py +0 -0
  73. {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/dev.py +0 -0
  74. {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/embedding/__init__.py +0 -0
  75. {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/embedding/base.py +0 -0
  76. {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/embedding/openai.py +0 -0
  77. {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/graph/__init__.py +0 -0
  78. {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/graph/edges.py +0 -0
  79. {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/graph/nodes/__init__.py +0 -0
  80. {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/graph/nodes/clarification.py +0 -0
  81. {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/graph/nodes/evaluator.py +0 -0
  82. {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/graph/nodes/guard.py +0 -0
  83. {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/graph/nodes/llm.py +0 -0
  84. {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/graph/nodes/planning.py +0 -0
  85. {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/graph/nodes/reasoning.py +0 -0
  86. {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/graph/nodes/reflection.py +0 -0
  87. {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/graph/nodes/reranker.py +0 -0
  88. {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/graph/nodes/retriever.py +0 -0
  89. {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/graph/nodes/verification.py +0 -0
  90. {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/graph/nodes/workflow_planner.py +0 -0
  91. {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/graph/runtime.py +0 -0
  92. {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/graph/state.py +0 -0
  93. {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/learning/__init__.py +0 -0
  94. {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/learning/pattern_extractor.py +0 -0
  95. {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/llm/base.py +0 -0
  96. {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/llm/openai.py +0 -0
  97. {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/models/base.py +0 -0
  98. {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/models/client.py +0 -0
  99. {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/models/document.py +0 -0
  100. {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/models/error.py +0 -0
  101. {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/models/graph.py +0 -0
  102. {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/models/history.py +0 -0
  103. {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/models/job.py +0 -0
  104. {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/models/prompt.py +0 -0
  105. {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/models/repository.py +0 -0
  106. {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/models/rule.py +0 -0
  107. {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/models/session.py +0 -0
  108. {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/models/skill.py +0 -0
  109. {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/models/user.py +0 -0
  110. {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/models/workflow.py +0 -0
  111. {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/observability/__init__.py +0 -0
  112. {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/observability/audit.py +0 -0
  113. {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/observability/logging.py +0 -0
  114. {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/observability/metrics.py +0 -0
  115. {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/observability/tracing.py +0 -0
  116. {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/presentation/__init__.py +0 -0
  117. {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/presentation/cli/__init__.py +0 -0
  118. {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/presentation/cli/commands/auth.py +0 -0
  119. {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/presentation/cli/commands/ide.py +0 -0
  120. {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/presentation/cli/commands/mcp.py +0 -0
  121. {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/presentation/cli/commands/sync.py +0 -0
  122. {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/presentation/cli/commands/update.py +0 -0
  123. {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/presentation/cli/main.py +0 -0
  124. {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/presentation/cli/utils/common.py +0 -0
  125. {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/presentation/cli/utils/config.py +0 -0
  126. {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/presentation/cli/utils/git.py +0 -0
  127. {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/presentation/cli/utils/version.py +0 -0
  128. {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/presentation/http/__init__.py +0 -0
  129. {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/presentation/http/admin/__init__.py +0 -0
  130. {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/presentation/http/admin/api.py +0 -0
  131. {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/presentation/http/admin/dashboard.py +0 -0
  132. {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/presentation/http/admin/jobs.py +0 -0
  133. {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/presentation/http/admin/prompts.py +0 -0
  134. {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/presentation/http/admin/runtime.py +0 -0
  135. {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/prompts/__init__.py +0 -0
  136. {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/retrieval/__init__.py +0 -0
  137. {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/retrieval/hybrid.py +0 -0
  138. {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/retrieval/mmr.py +0 -0
  139. {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/retrieval/multi_hop.py +0 -0
  140. {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/store/__init__.py +0 -0
  141. {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/store/document.py +0 -0
  142. {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/store/error.py +0 -0
  143. {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/store/feedback.py +0 -0
  144. {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/store/graph.py +0 -0
  145. {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/store/history.py +0 -0
  146. {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/store/milvus/__init__.py +0 -0
  147. {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/store/milvus/client.py +0 -0
  148. {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/store/milvus/collections.py +0 -0
  149. {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/store/milvus/vector_store.py +0 -0
  150. {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/store/mongodb/__init__.py +0 -0
  151. {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/store/mongodb/client.py +0 -0
  152. {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/store/mongodb/graph_store.py +0 -0
  153. {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/store/repo_state.py +0 -0
  154. {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/store/rule.py +0 -0
  155. {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/store/vector.py +0 -0
  156. {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/tools/auth.py +0 -0
  157. {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/tools/graph.py +0 -0
  158. {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/tools/ingest.py +0 -0
  159. {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/tools/repo_scanner.py +0 -0
  160. {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/tools/session.py +0 -0
  161. {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/tools/workflow.py +0 -0
  162. {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/transport/__init__.py +0 -0
  163. {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/transport/base.py +0 -0
  164. {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/transport/sse.py +0 -0
  165. {minder_cli-0.4.9 → minder_cli-0.5.1}/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.4.9
3
+ Version: 0.5.1
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
@@ -19,10 +19,9 @@ Requires-Dist: fastapi>=0.136.0
19
19
  Requires-Dist: httpx>=0.28.0
20
20
  Provides-Extra: server
21
21
  Requires-Dist: aiosqlite>=0.21.0; extra == 'server'
22
- Requires-Dist: fastembed>=0.5.1; extra == 'server'
23
22
  Requires-Dist: langgraph>=1.1.8; extra == 'server'
24
23
  Requires-Dist: litellm>=1.83.1; extra == 'server'
25
- Requires-Dist: litert-lm-api-nightly>=0.10; extra == 'server'
24
+ Requires-Dist: llama-cpp-python>=0.3.7; extra == 'server'
26
25
  Requires-Dist: mcp>=1.26.0; extra == 'server'
27
26
  Requires-Dist: motor>=3.7.0; extra == 'server'
28
27
  Requires-Dist: passlib[bcrypt]>=1.7.4; extra == 'server'
@@ -67,25 +66,22 @@ Developer → minder-cli → Minder Server ←→ AI agents (Codex / Copilot / C
67
66
 
68
67
  ┌─────┴──────┐
69
68
  │ │
70
- LiteRT-LM FastEmbed
69
+ llama.cpp llama.cpp
71
70
  (LLM gen) (embedding)
72
71
  ```
73
72
 
74
- - **LLM inference**: LiteRT-LM (Google AI Edge) on-device, hardware-accelerated, no HTTP overhead
75
- - **Embedding inference**: FastEmbed running natively in-process (`mxbai-embed-large-v1`) zero-dependency ONNX acceleration
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
76
75
 
77
76
  ## Quick Start
78
77
 
79
78
  ### Run the server
80
79
 
81
80
  ```bash
82
- # 1. Download the LiteRT-LM model
83
- ./scripts/download_models.sh
84
-
85
- # 2. Start infra (MongoDB + Redis + Milvus)
81
+ # 1. Start infra (MongoDB + Redis + Milvus)
86
82
  docker compose -f docker/docker-compose.local.yml up -d
87
83
 
88
- # 3. Run Minder Server
84
+ # 2. Run Minder Server (GGUF models auto-download on first start)
89
85
  uv run python -m minder.server
90
86
  ```
91
87
 
@@ -27,25 +27,22 @@ Developer → minder-cli → Minder Server ←→ AI agents (Codex / Copilot / C
27
27
 
28
28
  ┌─────┴──────┐
29
29
  │ │
30
- LiteRT-LM FastEmbed
30
+ llama.cpp llama.cpp
31
31
  (LLM gen) (embedding)
32
32
  ```
33
33
 
34
- - **LLM inference**: LiteRT-LM (Google AI Edge) on-device, hardware-accelerated, no HTTP overhead
35
- - **Embedding inference**: FastEmbed running natively in-process (`mxbai-embed-large-v1`) zero-dependency ONNX acceleration
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. Download the LiteRT-LM model
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
- # 3. Run Minder Server
45
+ # 2. Run Minder Server (GGUF models auto-download on first start)
49
46
  uv run python -m minder.server
50
47
  ```
51
48
 
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "minder-cli"
7
- version = "0.4.9"
7
+ version = "0.5.1"
8
8
  description = "Minder CLI is the command-line interface for the Minder self-hosted MCP platform."
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.14"
@@ -26,10 +26,9 @@ dependencies = [
26
26
  [project.optional-dependencies]
27
27
  server = [
28
28
  "aiosqlite>=0.21.0",
29
- "fastembed>=0.5.1",
30
29
  "langgraph>=1.1.8",
31
30
  "litellm>=1.83.1",
32
- "litert-lm-api-nightly>=0.10",
31
+ "llama-cpp-python>=0.3.7",
33
32
  "mcp>=1.26.0",
34
33
  "motor>=3.7.0",
35
34
  "passlib[bcrypt]>=1.7.4",
@@ -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": ["minder_query", "minder_search_code", "minder_search_errors"],
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
@@ -31,21 +31,19 @@ class AuthConfig(BaseModel):
31
31
 
32
32
 
33
33
  class EmbeddingConfig(BaseModel):
34
- provider: str = "fastembed"
35
- runtime: str = "auto" # "auto" | "fastembed" | "mock"
36
- fastembed_model: str = "mixedbread-ai/mxbai-embed-large-v1"
37
- fastembed_cache_dir: str = "~/.minder/cache/fastembed"
38
- dimensions: int = 1024
34
+ provider: str = "llama_cpp"
35
+ runtime: str = "auto" # "auto" | "llama_cpp" | "mock"
36
+ llama_cpp_model_repo: str = "ggml-org/embeddinggemma-300M-GGUF"
37
+ llama_cpp_model_file: str = "*.gguf"
38
+ dimensions: int = 768
39
39
  openai_api_key: Optional[str] = None
40
40
  openai_model: str = "text-embedding-3-small"
41
41
 
42
42
 
43
43
  class LLMConfig(BaseModel):
44
- provider: str = "litert" # "litert" | "openai"
45
- # LiteRT-LM fields
46
- litert_model_path: str = "~/.minder/models/gemma-4-E2B-it.litertlm"
47
- litert_backend: str = "auto" # "auto" (GPU on Mac, CPU elsewhere) | "cpu" | "gpu"
48
- litert_cache_dir: str = "~/.minder/cache/litert"
44
+ provider: str = "llama_cpp" # "llama_cpp" | "openai"
45
+ llama_cpp_model_repo: str = "ggml-org/gemma-4-E2B-it-GGUF"
46
+ llama_cpp_model_file: str = "*.gguf"
49
47
  context_length: int = 16384
50
48
  temperature: float = 0.1
51
49
  openai_api_key: Optional[str] = None
@@ -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", "minder_query"]
55
+ return base_tools + ["minder_search_code", "minder_skill_recall"]
56
56
  if "review" in normalized:
57
- return base_tools + ["minder_query", "minder_search_code"]
58
- return base_tools + ["minder_search", "minder_search_code"]
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(
@@ -325,7 +325,7 @@ class ContinuitySynthesizer:
325
325
  ).items()
326
326
  },
327
327
  }, {
328
- "provider": "litert_lm",
328
+ "provider": self._config.llm.provider,
329
329
  "model": self._config.llm.provider,
330
330
  "runtime": self._llm.runtime,
331
331
  }
@@ -1,5 +1,5 @@
1
1
  """
2
- Local Embedding provider — delegates to FastEmbed using ONNX runtime.
2
+ Local Embedding provider — delegates to llama-cpp-python using GGUF models.
3
3
 
4
4
  Falls back to a deterministic hash-based stub if initialization fails.
5
5
  """
@@ -11,9 +11,10 @@ import hashlib
11
11
  import logging
12
12
  import math
13
13
  from collections import OrderedDict
14
- from pathlib import Path
15
14
  from typing import Any
16
15
 
16
+ from minder.runtime import llama_cpp_usable
17
+
17
18
  logger = logging.getLogger(__name__)
18
19
 
19
20
 
@@ -26,42 +27,53 @@ MAX_TEXT_LENGTH = 8000 # Safety truncation to avoid over-context (~2000 tokens)
26
27
  class LocalEmbeddingProvider:
27
28
  def __init__(
28
29
  self,
29
- fastembed_model: str = "mixedbread-ai/mxbai-embed-large-v1",
30
- fastembed_cache_dir: str = "~/.minder/cache/fastembed",
31
- dimensions: int = 1024,
30
+ llama_cpp_model_repo: str = "ggml-org/embeddinggemma-300M-GGUF",
31
+ llama_cpp_model_file: str = "*Q4_K_M.gguf",
32
+ dimensions: int = 768,
32
33
  runtime: str = "auto",
33
34
  ) -> None:
34
- self._model_name = fastembed_model
35
- self._cache_dir = str(Path(fastembed_cache_dir).expanduser())
35
+ self._model_repo = llama_cpp_model_repo
36
+ self._model_file = llama_cpp_model_file
36
37
  self._dimensions = dimensions
37
38
  self._runtime = runtime
38
39
  self._model: Any | None = None
39
- self._init_model()
40
+ self._initialized = False
41
+
42
+ def _ensure_initialized(self) -> None:
43
+ if not self._initialized:
44
+ self._init_model()
45
+ self._initialized = True
40
46
 
41
47
  def _init_model(self) -> None:
42
48
  if self._runtime == "mock":
43
49
  return
44
50
 
45
- cache_key = f"{self._model_name}:{self._cache_dir}"
51
+ cache_key = f"{self._model_repo}:{self._model_file}"
46
52
  if cache_key in _MODEL_CACHE:
47
53
  self._model = _MODEL_CACHE[cache_key]
48
54
  return
49
55
 
56
+ if not llama_cpp_usable():
57
+ logger.warning(
58
+ "CPU does not support AVX2; llama.cpp unavailable. Using mock embedding."
59
+ )
60
+ return
61
+
50
62
  try:
51
- from fastembed import TextEmbedding # type: ignore[import-not-found]
52
-
53
- # Optimize for speed and resource usage:
54
- # - threads=4 limits CPU usage while maintaining good throughput
55
- # - lazy_load=False ensures first request is fast
56
- self._model = TextEmbedding(
57
- model_name=self._model_name,
58
- cache_dir=self._cache_dir,
59
- threads=4,
63
+ from llama_cpp import Llama
64
+
65
+ logger.info("Initializing Llama.cpp embedding engine for %s", self._model_repo)
66
+ self._model = Llama.from_pretrained(
67
+ repo_id=self._model_repo,
68
+ filename=self._model_file,
69
+ embedding=True,
70
+ verbose=False,
60
71
  )
61
72
  _MODEL_CACHE[cache_key] = self._model
62
73
  except Exception as e:
63
74
  logger.warning(
64
- f"Failed to initialize FastEmbed model {self._model_name}: {e}. Using mock."
75
+ "Failed to initialize Llama.cpp model %s: %s. Using mock.",
76
+ self._model_repo, e,
65
77
  )
66
78
  self._model = None
67
79
 
@@ -69,9 +81,10 @@ class LocalEmbeddingProvider:
69
81
  def runtime(self) -> str:
70
82
  if self._runtime != "auto":
71
83
  return self._runtime
72
- return "fastembed" if self._model is not None else "mock"
84
+ return "llama_cpp" if self._model is not None else "mock"
73
85
 
74
86
  def embed(self, text: str) -> list[float]:
87
+ self._ensure_initialized()
75
88
  if not text:
76
89
  return [0.0] * self._dimensions
77
90
 
@@ -85,16 +98,14 @@ class LocalEmbeddingProvider:
85
98
 
86
99
  # 3. Perform embedding
87
100
  embedding: list[float]
88
- if self.runtime == "fastembed" and self._model is not None:
101
+ if self.runtime == "llama_cpp" and self._model is not None:
89
102
  try:
90
- # FastEmbed returns a generator of numpy arrays
91
- embeddings = list(self._model.embed([safe_text]))
92
- if embeddings:
93
- embedding = embeddings[0].tolist()[: self._dimensions]
94
- else:
95
- embedding = self._hash_embed(safe_text)
103
+ # llama_cpp returns a dict with 'data'
104
+ result = self._model.create_embedding(safe_text)
105
+ vector = result["data"][0]["embedding"]
106
+ embedding = vector[: self._dimensions]
96
107
  except Exception as e:
97
- logger.warning(f"FastEmbed failed during inference: {e}")
108
+ logger.warning(f"Llama.cpp failed during embedding inference: {e}")
98
109
  embedding = self._hash_embed(safe_text)
99
110
  else:
100
111
  embedding = self._hash_embed(safe_text)
@@ -107,6 +118,7 @@ class LocalEmbeddingProvider:
107
118
  return embedding
108
119
 
109
120
  def embed_many(self, texts: list[str]) -> list[list[float]]:
121
+ self._ensure_initialized()
110
122
  if not texts:
111
123
  return []
112
124
 
@@ -130,17 +142,19 @@ class LocalEmbeddingProvider:
130
142
  return results
131
143
 
132
144
  # 2. Batch embed the missing ones
133
- if self.runtime == "fastembed" and self._model is not None:
145
+ if self.runtime == "llama_cpp" and self._model is not None:
134
146
  try:
135
- embeddings = list(self._model.embed(to_embed_texts))
147
+ # pass list of strings directly
148
+ res = self._model.create_embedding(to_embed_texts)
149
+ embeddings = [data["embedding"] for data in res["data"]]
136
150
  for i, emb in enumerate(embeddings):
137
151
  idx = to_embed_indices[i]
138
- vector = emb.tolist()[: self._dimensions]
152
+ vector = emb[: self._dimensions]
139
153
  results[idx] = vector
140
154
  # Update cache
141
155
  _EMBEDDING_CACHE[to_embed_texts[i]] = vector
142
156
  except Exception as e:
143
- logger.warning(f"FastEmbed batch failed: {e}")
157
+ logger.warning(f"Llama.cpp batch embedding failed: {e}")
144
158
  for i, idx in enumerate(to_embed_indices):
145
159
  vector = self._hash_embed(to_embed_texts[i])
146
160
  results[idx] = vector
@@ -178,7 +192,13 @@ class LocalEmbeddingProvider:
178
192
  def clear_caches() -> None:
179
193
  """Clear global model and embedding caches to reclaim memory."""
180
194
  global _MODEL_CACHE, _EMBEDDING_CACHE
195
+ for model in _MODEL_CACHE.values():
196
+ try:
197
+ if hasattr(model, "close"):
198
+ model.close()
199
+ except Exception:
200
+ pass
181
201
  _MODEL_CACHE.clear()
182
202
  _EMBEDDING_CACHE.clear()
183
203
  gc.collect()
184
- logger.debug("Cleared FastEmbed global caches.")
204
+ logger.debug("Cleared Llama.cpp embedding global caches.")