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.
Files changed (162) hide show
  1. {minder_cli-0.5.0 → minder_cli-0.5.2}/PKG-INFO +6 -9
  2. {minder_cli-0.5.0 → minder_cli-0.5.2}/README.md +5 -8
  3. {minder_cli-0.5.0 → minder_cli-0.5.2}/pyproject.toml +1 -1
  4. {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/application/admin/use_cases.py +3 -5
  5. minder_cli-0.5.2/src/minder/bootstrap/agent_seeder.py +25 -0
  6. {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/bootstrap/transport.py +119 -45
  7. {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/continuity.py +3 -3
  8. {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/learning/error_learner.py +1 -1
  9. {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/learning/quality_optimizer.py +1 -1
  10. {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/learning/skill_synthesizer.py +1 -1
  11. {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/models/__init__.py +5 -0
  12. minder_cli-0.5.2/src/minder/models/agent.py +47 -0
  13. minder_cli-0.5.2/src/minder/presentation/cli/commands/agent.py +339 -0
  14. minder_cli-0.5.2/src/minder/presentation/http/admin/agents.py +114 -0
  15. {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/presentation/http/admin/memories.py +3 -7
  16. {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/presentation/http/admin/routes.py +2 -0
  17. {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/presentation/http/admin/search.py +3 -7
  18. {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/presentation/http/admin/skills.py +2 -7
  19. {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/resources/__init__.py +1 -1
  20. {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/server.py +4 -1
  21. {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/store/interfaces.py +29 -0
  22. {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/store/mongodb/indexes.py +6 -0
  23. {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/store/mongodb/operational_store.py +94 -0
  24. {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/store/relational.py +106 -1
  25. {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/tools/__init__.py +0 -3
  26. minder_cli-0.5.2/src/minder/tools/agents.py +104 -0
  27. {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/tools/memory.py +6 -8
  28. {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/tools/registry.py +34 -15
  29. minder_cli-0.5.2/src/minder/tools/seeds/__init__.py +0 -0
  30. minder_cli-0.5.2/src/minder/tools/seeds/default_agents.py +108 -0
  31. {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/tools/skills.py +12 -19
  32. minder_cli-0.5.0/src/minder/presentation/cli/commands/agent.py +0 -418
  33. minder_cli-0.5.0/src/minder/tools/search.py +0 -15
  34. {minder_cli-0.5.0 → minder_cli-0.5.2}/.gitignore +0 -0
  35. {minder_cli-0.5.0 → minder_cli-0.5.2}/LICENSE +0 -0
  36. {minder_cli-0.5.0 → minder_cli-0.5.2}/README-pypi.md +0 -0
  37. {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/__init__.py +0 -0
  38. {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/api/routers/prompts.py +0 -0
  39. {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/application/__init__.py +0 -0
  40. {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/application/admin/__init__.py +0 -0
  41. {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/application/admin/dto.py +0 -0
  42. {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/application/admin/jobs.py +0 -0
  43. {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/auth/__init__.py +0 -0
  44. {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/auth/context.py +0 -0
  45. {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/auth/middleware.py +0 -0
  46. {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/auth/principal.py +0 -0
  47. {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/auth/rate_limiter.py +0 -0
  48. {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/auth/rbac.py +0 -0
  49. {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/auth/service.py +0 -0
  50. {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/bootstrap/__init__.py +0 -0
  51. {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/bootstrap/providers.py +0 -0
  52. {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/cache/__init__.py +0 -0
  53. {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/cache/providers.py +0 -0
  54. {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/chunking/__init__.py +0 -0
  55. {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/chunking/code_splitter.py +0 -0
  56. {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/chunking/splitter.py +0 -0
  57. {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/cli.py +0 -0
  58. {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/config.py +0 -0
  59. {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/context_compactor.py +0 -0
  60. {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/dev.py +0 -0
  61. {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/embedding/__init__.py +0 -0
  62. {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/embedding/base.py +0 -0
  63. {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/embedding/local.py +0 -0
  64. {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/embedding/openai.py +0 -0
  65. {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/graph/__init__.py +0 -0
  66. {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/graph/edges.py +0 -0
  67. {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/graph/executor.py +0 -0
  68. {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/graph/graph.py +0 -0
  69. {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/graph/nodes/__init__.py +0 -0
  70. {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/graph/nodes/clarification.py +0 -0
  71. {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/graph/nodes/evaluator.py +0 -0
  72. {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/graph/nodes/guard.py +0 -0
  73. {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/graph/nodes/llm.py +0 -0
  74. {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/graph/nodes/planning.py +0 -0
  75. {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/graph/nodes/reasoning.py +0 -0
  76. {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/graph/nodes/reflection.py +0 -0
  77. {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/graph/nodes/reranker.py +0 -0
  78. {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/graph/nodes/retriever.py +0 -0
  79. {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/graph/nodes/verification.py +0 -0
  80. {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/graph/nodes/workflow_planner.py +0 -0
  81. {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/graph/runtime.py +0 -0
  82. {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/graph/state.py +0 -0
  83. {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/learning/__init__.py +0 -0
  84. {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/learning/pattern_extractor.py +0 -0
  85. {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/llm/__init__.py +0 -0
  86. {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/llm/base.py +0 -0
  87. {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/llm/factory.py +0 -0
  88. {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/llm/llama_cpp_llm.py +0 -0
  89. {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/llm/openai.py +0 -0
  90. {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/models/base.py +0 -0
  91. {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/models/client.py +0 -0
  92. {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/models/document.py +0 -0
  93. {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/models/error.py +0 -0
  94. {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/models/graph.py +0 -0
  95. {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/models/history.py +0 -0
  96. {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/models/job.py +0 -0
  97. {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/models/prompt.py +0 -0
  98. {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/models/repository.py +0 -0
  99. {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/models/rule.py +0 -0
  100. {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/models/session.py +0 -0
  101. {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/models/skill.py +0 -0
  102. {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/models/user.py +0 -0
  103. {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/models/workflow.py +0 -0
  104. {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/observability/__init__.py +0 -0
  105. {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/observability/audit.py +0 -0
  106. {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/observability/logging.py +0 -0
  107. {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/observability/metrics.py +0 -0
  108. {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/observability/tracing.py +0 -0
  109. {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/presentation/__init__.py +0 -0
  110. {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/presentation/cli/__init__.py +0 -0
  111. {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/presentation/cli/commands/auth.py +0 -0
  112. {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/presentation/cli/commands/ide.py +0 -0
  113. {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/presentation/cli/commands/mcp.py +0 -0
  114. {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/presentation/cli/commands/sync.py +0 -0
  115. {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/presentation/cli/commands/update.py +0 -0
  116. {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/presentation/cli/main.py +0 -0
  117. {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/presentation/cli/utils/common.py +0 -0
  118. {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/presentation/cli/utils/config.py +0 -0
  119. {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/presentation/cli/utils/git.py +0 -0
  120. {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/presentation/cli/utils/version.py +0 -0
  121. {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/presentation/http/__init__.py +0 -0
  122. {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/presentation/http/admin/__init__.py +0 -0
  123. {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/presentation/http/admin/api.py +0 -0
  124. {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/presentation/http/admin/context.py +0 -0
  125. {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/presentation/http/admin/dashboard.py +0 -0
  126. {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/presentation/http/admin/jobs.py +0 -0
  127. {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/presentation/http/admin/prompts.py +0 -0
  128. {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/presentation/http/admin/runtime.py +0 -0
  129. {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/prompts/__init__.py +0 -0
  130. {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/prompts/formatter.py +0 -0
  131. {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/retrieval/__init__.py +0 -0
  132. {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/retrieval/hybrid.py +0 -0
  133. {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/retrieval/mmr.py +0 -0
  134. {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/retrieval/multi_hop.py +0 -0
  135. {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/runtime.py +0 -0
  136. {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/store/__init__.py +0 -0
  137. {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/store/document.py +0 -0
  138. {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/store/error.py +0 -0
  139. {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/store/feedback.py +0 -0
  140. {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/store/graph.py +0 -0
  141. {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/store/history.py +0 -0
  142. {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/store/milvus/__init__.py +0 -0
  143. {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/store/milvus/client.py +0 -0
  144. {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/store/milvus/collections.py +0 -0
  145. {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/store/milvus/vector_store.py +0 -0
  146. {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/store/mongodb/__init__.py +0 -0
  147. {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/store/mongodb/client.py +0 -0
  148. {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/store/mongodb/graph_store.py +0 -0
  149. {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/store/repo_state.py +0 -0
  150. {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/store/rule.py +0 -0
  151. {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/store/vector.py +0 -0
  152. {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/tools/auth.py +0 -0
  153. {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/tools/graph.py +0 -0
  154. {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/tools/ingest.py +0 -0
  155. {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/tools/query.py +0 -0
  156. {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/tools/repo_scanner.py +0 -0
  157. {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/tools/session.py +0 -0
  158. {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/tools/workflow.py +0 -0
  159. {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/transport/__init__.py +0 -0
  160. {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/transport/base.py +0 -0
  161. {minder_cli-0.5.0 → minder_cli-0.5.2}/src/minder/transport/sse.py +0 -0
  162. {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.0
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
- LiteRT-LM FastEmbed
69
+ llama.cpp llama.cpp
70
70
  (LLM gen) (embedding)
71
71
  ```
72
72
 
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
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. Download the LiteRT-LM model
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
- # 3. Run Minder Server
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
- 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.5.0"
7
+ version = "0.5.2"
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"
@@ -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
@@ -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(
@@ -27,7 +27,7 @@ class ErrorLearner:
27
27
  if not failures:
28
28
  return None
29
29
 
30
- existing = await self._store.list_skills()
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.list_skills():
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.list_skills():
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
+ )