minder-cli 0.5.6__tar.gz → 0.5.7__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 (170) hide show
  1. {minder_cli-0.5.6 → minder_cli-0.5.7}/PKG-INFO +1 -1
  2. {minder_cli-0.5.6 → minder_cli-0.5.7}/pyproject.toml +1 -1
  3. {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/application/admin/use_cases.py +3 -0
  4. {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/bootstrap/transport.py +18 -3
  5. {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/config.py +21 -0
  6. {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/embedding/local.py +6 -1
  7. {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/graph/__init__.py +2 -2
  8. minder_cli-0.5.7/src/minder/graph/checkpoint.py +162 -0
  9. minder_cli-0.5.7/src/minder/graph/executor.py +463 -0
  10. {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/graph/graph.py +31 -4
  11. minder_cli-0.5.7/src/minder/graph/memory_graph.py +276 -0
  12. {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/graph/nodes/__init__.py +2 -0
  13. minder_cli-0.5.7/src/minder/graph/nodes/guard.py +127 -0
  14. minder_cli-0.5.7/src/minder/graph/nodes/parallel_retriever.py +245 -0
  15. {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/graph/nodes/planning.py +7 -0
  16. {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/graph/nodes/reasoning.py +3 -0
  17. minder_cli-0.5.7/src/minder/graph/session_graph.py +352 -0
  18. minder_cli-0.5.7/src/minder/graph/state.py +91 -0
  19. minder_cli-0.5.7/src/minder/graph/supervisor.py +251 -0
  20. {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/llm/llama_cpp_llm.py +6 -1
  21. minder_cli-0.5.7/src/minder/model_bootstrap.py +205 -0
  22. {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/models/__init__.py +3 -0
  23. minder_cli-0.5.7/src/minder/models/checkpoint.py +25 -0
  24. {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/presentation/cli/commands/agent.py +3 -3
  25. {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/presentation/cli/commands/ide.py +4 -4
  26. {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/presentation/cli/commands/mcp.py +16 -6
  27. {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/runtime.py +64 -0
  28. {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/server.py +5 -0
  29. {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/store/interfaces.py +21 -0
  30. {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/store/mongodb/operational_store.py +49 -0
  31. {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/store/relational.py +63 -0
  32. {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/tools/memory.py +131 -30
  33. {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/tools/query.py +83 -40
  34. {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/tools/registry.py +1 -1
  35. {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/tools/session.py +63 -1
  36. {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/tools/workflow.py +49 -2
  37. minder_cli-0.5.6/src/minder/graph/executor.py +0 -247
  38. minder_cli-0.5.6/src/minder/graph/nodes/guard.py +0 -64
  39. minder_cli-0.5.6/src/minder/graph/state.py +0 -27
  40. {minder_cli-0.5.6 → minder_cli-0.5.7}/.gitignore +0 -0
  41. {minder_cli-0.5.6 → minder_cli-0.5.7}/LICENSE +0 -0
  42. {minder_cli-0.5.6 → minder_cli-0.5.7}/README-pypi.md +0 -0
  43. {minder_cli-0.5.6 → minder_cli-0.5.7}/README.md +0 -0
  44. {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/__init__.py +0 -0
  45. {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/api/routers/prompts.py +0 -0
  46. {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/application/__init__.py +0 -0
  47. {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/application/admin/__init__.py +0 -0
  48. {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/application/admin/dto.py +0 -0
  49. {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/application/admin/jobs.py +0 -0
  50. {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/auth/__init__.py +0 -0
  51. {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/auth/context.py +0 -0
  52. {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/auth/middleware.py +0 -0
  53. {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/auth/principal.py +0 -0
  54. {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/auth/rate_limiter.py +0 -0
  55. {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/auth/rbac.py +0 -0
  56. {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/auth/service.py +0 -0
  57. {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/bootstrap/__init__.py +0 -0
  58. {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/bootstrap/agent_seeder.py +0 -0
  59. {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/bootstrap/providers.py +0 -0
  60. {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/cache/__init__.py +0 -0
  61. {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/cache/providers.py +0 -0
  62. {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/chunking/__init__.py +0 -0
  63. {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/chunking/code_splitter.py +0 -0
  64. {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/chunking/splitter.py +0 -0
  65. {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/cli.py +0 -0
  66. {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/context_compactor.py +0 -0
  67. {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/continuity.py +0 -0
  68. {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/dev.py +0 -0
  69. {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/embedding/__init__.py +0 -0
  70. {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/embedding/base.py +0 -0
  71. {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/embedding/openai.py +0 -0
  72. {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/graph/edges.py +0 -0
  73. {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/graph/nodes/clarification.py +0 -0
  74. {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/graph/nodes/evaluator.py +0 -0
  75. {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/graph/nodes/llm.py +0 -0
  76. {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/graph/nodes/reflection.py +0 -0
  77. {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/graph/nodes/reranker.py +0 -0
  78. {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/graph/nodes/retriever.py +0 -0
  79. {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/graph/nodes/verification.py +0 -0
  80. {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/graph/nodes/workflow_planner.py +0 -0
  81. {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/graph/runtime.py +0 -0
  82. {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/learning/__init__.py +0 -0
  83. {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/learning/error_learner.py +0 -0
  84. {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/learning/pattern_extractor.py +0 -0
  85. {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/learning/quality_optimizer.py +0 -0
  86. {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/learning/skill_synthesizer.py +0 -0
  87. {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/llm/__init__.py +0 -0
  88. {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/llm/base.py +0 -0
  89. {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/llm/factory.py +0 -0
  90. {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/llm/openai.py +0 -0
  91. {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/models/agent.py +0 -0
  92. {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/models/base.py +0 -0
  93. {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/models/client.py +0 -0
  94. {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/models/document.py +0 -0
  95. {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/models/error.py +0 -0
  96. {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/models/graph.py +0 -0
  97. {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/models/history.py +0 -0
  98. {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/models/job.py +0 -0
  99. {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/models/prompt.py +0 -0
  100. {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/models/repository.py +0 -0
  101. {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/models/rule.py +0 -0
  102. {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/models/session.py +0 -0
  103. {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/models/skill.py +0 -0
  104. {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/models/user.py +0 -0
  105. {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/models/workflow.py +0 -0
  106. {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/observability/__init__.py +0 -0
  107. {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/observability/audit.py +0 -0
  108. {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/observability/logging.py +0 -0
  109. {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/observability/metrics.py +0 -0
  110. {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/observability/tracing.py +0 -0
  111. {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/presentation/__init__.py +0 -0
  112. {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/presentation/cli/__init__.py +0 -0
  113. {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/presentation/cli/commands/auth.py +0 -0
  114. {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/presentation/cli/commands/sync.py +0 -0
  115. {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/presentation/cli/commands/update.py +0 -0
  116. {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/presentation/cli/main.py +0 -0
  117. {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/presentation/cli/utils/common.py +0 -0
  118. {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/presentation/cli/utils/config.py +0 -0
  119. {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/presentation/cli/utils/git.py +0 -0
  120. {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/presentation/cli/utils/version.py +0 -0
  121. {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/presentation/http/__init__.py +0 -0
  122. {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/presentation/http/admin/__init__.py +0 -0
  123. {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/presentation/http/admin/agents.py +0 -0
  124. {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/presentation/http/admin/api.py +0 -0
  125. {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/presentation/http/admin/context.py +0 -0
  126. {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/presentation/http/admin/dashboard.py +0 -0
  127. {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/presentation/http/admin/jobs.py +0 -0
  128. {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/presentation/http/admin/memories.py +0 -0
  129. {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/presentation/http/admin/prompts.py +0 -0
  130. {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/presentation/http/admin/routes.py +0 -0
  131. {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/presentation/http/admin/runtime.py +0 -0
  132. {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/presentation/http/admin/search.py +0 -0
  133. {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/presentation/http/admin/skills.py +0 -0
  134. {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/prompts/__init__.py +0 -0
  135. {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/prompts/formatter.py +0 -0
  136. {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/resources/__init__.py +0 -0
  137. {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/retrieval/__init__.py +0 -0
  138. {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/retrieval/hybrid.py +0 -0
  139. {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/retrieval/mmr.py +0 -0
  140. {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/retrieval/multi_hop.py +0 -0
  141. {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/store/__init__.py +0 -0
  142. {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/store/document.py +0 -0
  143. {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/store/error.py +0 -0
  144. {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/store/feedback.py +0 -0
  145. {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/store/graph.py +0 -0
  146. {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/store/history.py +0 -0
  147. {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/store/milvus/__init__.py +0 -0
  148. {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/store/milvus/client.py +0 -0
  149. {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/store/milvus/collections.py +0 -0
  150. {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/store/milvus/vector_store.py +0 -0
  151. {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/store/mongodb/__init__.py +0 -0
  152. {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/store/mongodb/client.py +0 -0
  153. {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/store/mongodb/graph_store.py +0 -0
  154. {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/store/mongodb/indexes.py +0 -0
  155. {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/store/repo_state.py +0 -0
  156. {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/store/rule.py +0 -0
  157. {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/store/vector.py +0 -0
  158. {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/tools/__init__.py +0 -0
  159. {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/tools/agents.py +0 -0
  160. {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/tools/auth.py +0 -0
  161. {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/tools/graph.py +0 -0
  162. {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/tools/ingest.py +0 -0
  163. {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/tools/repo_scanner.py +0 -0
  164. {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/tools/seeds/__init__.py +0 -0
  165. {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/tools/seeds/default_agents.py +0 -0
  166. {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/tools/skills.py +0 -0
  167. {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/transport/__init__.py +0 -0
  168. {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/transport/base.py +0 -0
  169. {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/transport/sse.py +0 -0
  170. {minder_cli-0.5.6 → minder_cli-0.5.7}/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.6
3
+ Version: 0.5.7
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
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "minder-cli"
7
- version = "0.5.6"
7
+ version = "0.5.7"
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"
@@ -373,6 +373,9 @@ class AdminConsoleUseCases:
373
373
  "antigravity": (
374
374
  f'{{"mcpServers":{{"minder":{{"serverUrl":"{base_url}/mcp","headers":{{"X-Minder-Client-Key":"<mkc_...>"}}}}}}}}'
375
375
  ),
376
+ "gemini": (
377
+ f'{{"mcpServers":{{"minder":{{"serverUrl":"{base_url}/mcp","headers":{{"X-Minder-Client-Key":"<mkc_...>"}}}}}}}}'
378
+ ),
376
379
  "cursor": (
377
380
  f'{{"mcpServers":{{"minder":{{"url":"{base_url}/mcp","headers":{{"X-Minder-Client-Key":"<mkc_...>"}}}}}}}}'
378
381
  ),
@@ -9,6 +9,7 @@ from minder.auth.service import AuthError
9
9
  from minder.auth.service import AuthService
10
10
  from minder.cache.providers import LRUCacheProvider
11
11
  from minder.config import MinderConfig
12
+ from minder.graph import MinderGraph
12
13
  from minder.presentation.http.admin.routes import build_http_routes
13
14
  from minder.prompts import PromptRegistry
14
15
  from minder.resources import ResourceRegistry
@@ -45,13 +46,20 @@ def build_transport(
45
46
  agent_tools = AgentTools(store)
46
47
  auth_tools = AuthTools(store, auth_service)
47
48
  session_tools = SessionTools(store)
48
- workflow_tools = WorkflowTools(store, repo_state_store)
49
49
  memory_tools = MemoryTools(store, config)
50
50
  skill_tools = SkillTools(store, config)
51
51
  graph_tools = GraphTools(graph_store, store)
52
+ shared_graph = MinderGraph(store, config, graph_tools=graph_tools)
53
+ workflow_tools = WorkflowTools(
54
+ store,
55
+ repo_state_store,
56
+ graph=shared_graph,
57
+ config=config,
58
+ )
52
59
  query_tools = QueryTools(
53
60
  store,
54
61
  config,
62
+ graph=shared_graph,
55
63
  vector_store=vector_store,
56
64
  graph_tools=graph_tools,
57
65
  )
@@ -302,12 +310,19 @@ def build_transport(
302
310
  )
303
311
 
304
312
  async def minder_workflow_step(
305
- *, user=None, repo_id: str, repo_path: str
313
+ *,
314
+ user=None,
315
+ repo_id: str | None = None,
316
+ repo_path: str | None = None,
317
+ session_id: str | None = None,
318
+ decision: dict[str, Any] | None = None,
306
319
  ) -> dict[str, Any]: # noqa: ANN001
307
320
  del user
308
321
  return await workflow_tools.minder_workflow_step(
309
- repo_id=uuid.UUID(repo_id),
322
+ repo_id=uuid.UUID(repo_id) if repo_id else None,
310
323
  repo_path=repo_path,
324
+ session_id=uuid.UUID(session_id) if session_id else None,
325
+ decision=decision,
311
326
  )
312
327
 
313
328
  async def minder_workflow_update(
@@ -92,6 +92,24 @@ class RetrievalConfig(BaseModel):
92
92
  hybrid_alpha: float = 0.7
93
93
 
94
94
 
95
+ class MemoryConfig(BaseModel):
96
+ agentic_recall: bool = False
97
+ recall_min_score: float = 0.4
98
+ recall_max_iterations: int = 3
99
+
100
+
101
+ class SessionConfig(BaseModel):
102
+ agentic_restore: bool = False
103
+ restore_recall_count: int = 8
104
+
105
+
106
+ class GraphConfig(BaseModel):
107
+ runtime: str = "langgraph"
108
+ enable_parallel_retrieval: bool = False
109
+ enable_checkpointing: bool = True
110
+ checkpoint_ttl_days: int = 7
111
+
112
+
95
113
  class CacheConfig(BaseModel):
96
114
  enabled: bool = True
97
115
  provider: str = "redis" # "redis" is the only supported runtime backend
@@ -145,6 +163,9 @@ class Settings(BaseSettings):
145
163
  mongodb: MongoDBConfig = Field(default_factory=MongoDBConfig)
146
164
  redis: RedisConfig = Field(default_factory=RedisConfig)
147
165
  retrieval: RetrievalConfig = Field(default_factory=RetrievalConfig)
166
+ memory: MemoryConfig = Field(default_factory=MemoryConfig)
167
+ session: SessionConfig = Field(default_factory=SessionConfig)
168
+ graph: GraphConfig = Field(default_factory=GraphConfig)
148
169
  cache: CacheConfig = Field(default_factory=CacheConfig)
149
170
  rate_limit: RateLimitConfig = Field(default_factory=RateLimitConfig)
150
171
  verification: VerificationConfig = Field(default_factory=VerificationConfig)
@@ -13,7 +13,7 @@ import math
13
13
  from collections import OrderedDict
14
14
  from typing import Any
15
15
 
16
- from minder.runtime import llama_cpp_usable
16
+ from minder.runtime import get_writable_hf_cache_dir, llama_cpp_usable
17
17
 
18
18
  logger = logging.getLogger(__name__)
19
19
 
@@ -61,11 +61,16 @@ class LocalEmbeddingProvider:
61
61
  from llama_cpp import Llama
62
62
 
63
63
  logger.info("Initializing Llama.cpp embedding engine for %s", self._model_repo)
64
+ cache_dir = get_writable_hf_cache_dir()
65
+ cache_kwargs: dict[str, Any] = (
66
+ {} if cache_dir is None else {"cache_dir": cache_dir}
67
+ )
64
68
  self._model = Llama.from_pretrained(
65
69
  repo_id=self._model_repo,
66
70
  filename=self._model_file,
67
71
  embedding=True,
68
72
  verbose=False,
73
+ **cache_kwargs,
69
74
  )
70
75
  _MODEL_CACHE[cache_key] = self._model
71
76
  except Exception as e:
@@ -1,6 +1,6 @@
1
- from .state import GraphState
1
+ from .state import GraphState, GraphStateSchema
2
2
 
3
- __all__ = ["GraphState", "MinderGraph"]
3
+ __all__ = ["GraphState", "GraphStateSchema", "MinderGraph"]
4
4
 
5
5
 
6
6
  def __getattr__(name: str):
@@ -0,0 +1,162 @@
1
+ from __future__ import annotations
2
+
3
+ from collections.abc import AsyncGenerator, Sequence
4
+ import zlib
5
+ from typing import Any
6
+
7
+ from langgraph.checkpoint.base import (
8
+ BaseCheckpointSaver,
9
+ Checkpoint,
10
+ CheckpointMetadata,
11
+ CheckpointTuple,
12
+ )
13
+ from langchain_core.runnables import RunnableConfig
14
+
15
+ from minder.store.interfaces import IOperationalStore
16
+
17
+
18
+ class MinderCheckpointSaver(BaseCheckpointSaver):
19
+ def __init__(self, store: IOperationalStore) -> None:
20
+ super().__init__()
21
+ self._store = store
22
+
23
+ async def aget_tuple(self, config: RunnableConfig) -> CheckpointTuple | None:
24
+ configurable = config.get("configurable", {})
25
+ thread_id = configurable.get("thread_id")
26
+ if not thread_id:
27
+ return None
28
+
29
+ # Check if the store implements ICheckpointRepository
30
+ if not hasattr(self._store, "get_checkpoint"):
31
+ return None
32
+
33
+ data = await self._store.get_checkpoint(thread_id)
34
+ if data is None:
35
+ return None
36
+
37
+ metadata = data.get("metadata", {})
38
+ type_name = metadata.pop("_checkpoint_type", "msgpack")
39
+ payload = bytes(data["checkpoint"])
40
+ if metadata.pop("_checkpoint_compression", None) == "zlib":
41
+ payload = zlib.decompress(payload)
42
+ checkpoint = self.serde.loads_typed((type_name, payload))
43
+
44
+ return CheckpointTuple(
45
+ config=config,
46
+ checkpoint=checkpoint,
47
+ metadata=metadata,
48
+ parent_config=None, # We don't track full history trees in simple setup
49
+ )
50
+
51
+ async def aput(
52
+ self,
53
+ config: RunnableConfig,
54
+ checkpoint: Checkpoint,
55
+ metadata: CheckpointMetadata,
56
+ new_versions: dict[str, str | float | int],
57
+ ) -> RunnableConfig:
58
+ configurable = config.get("configurable", {})
59
+ thread_id = configurable.get("thread_id")
60
+ if not thread_id:
61
+ return config
62
+
63
+ if not hasattr(self._store, "save_checkpoint"):
64
+ return config
65
+
66
+ type_name, payload = self.serde.dumps_typed(checkpoint)
67
+ payload = zlib.compress(payload)
68
+ db_metadata = dict(metadata or {})
69
+ db_metadata["_checkpoint_type"] = type_name
70
+ db_metadata["_checkpoint_compression"] = "zlib"
71
+
72
+ await self._store.save_checkpoint(
73
+ thread_id=thread_id,
74
+ checkpoint_id=checkpoint["id"],
75
+ checkpoint=payload,
76
+ metadata=db_metadata,
77
+ )
78
+
79
+ return {
80
+ "configurable": {
81
+ "thread_id": thread_id,
82
+ "checkpoint_ns": configurable.get("checkpoint_ns", ""),
83
+ "checkpoint_id": checkpoint["id"],
84
+ }
85
+ }
86
+
87
+ async def alist(
88
+ self,
89
+ config: RunnableConfig | None,
90
+ *,
91
+ filter: dict[str, Any] | None = None,
92
+ before: RunnableConfig | None = None,
93
+ limit: int | None = None,
94
+ ) -> AsyncGenerator[CheckpointTuple, None]:
95
+ if config is None:
96
+ return
97
+
98
+ configurable = config.get("configurable", {})
99
+ thread_id = configurable.get("thread_id")
100
+ if not thread_id:
101
+ return
102
+
103
+ if not hasattr(self._store, "list_checkpoints"):
104
+ return
105
+
106
+ records = await self._store.list_checkpoints(thread_id, limit=limit or 10)
107
+ for record in records:
108
+ metadata = record.get("metadata", {})
109
+ type_name = metadata.pop("_checkpoint_type", "msgpack")
110
+ payload = bytes(record["checkpoint"])
111
+ if metadata.pop("_checkpoint_compression", None) == "zlib":
112
+ payload = zlib.decompress(payload)
113
+ checkpoint = self.serde.loads_typed((type_name, payload))
114
+ yield CheckpointTuple(
115
+ config={
116
+ "configurable": {
117
+ "thread_id": thread_id,
118
+ "checkpoint_ns": configurable.get("checkpoint_ns", ""),
119
+ "checkpoint_id": record["checkpoint_id"],
120
+ }
121
+ },
122
+ checkpoint=checkpoint,
123
+ metadata=metadata,
124
+ parent_config=None,
125
+ )
126
+
127
+ async def aput_writes(
128
+ self,
129
+ config: RunnableConfig,
130
+ writes: Sequence[tuple[str, Any]],
131
+ task_id: str,
132
+ task_path: str = "",
133
+ ) -> None:
134
+ # We only persist full checkpoints for Minder's workflow right now.
135
+ # LangGraph requires this method, but for simple state sync it can be a no-op
136
+ # unless fine-grained node-level recovery is needed.
137
+ pass
138
+
139
+ # Note: Sync versions of these methods must be implemented but can just raise NotImplementedError
140
+ # since we only use async langgraph execution (`ainvoke`).
141
+
142
+ def get_tuple(self, config: RunnableConfig) -> CheckpointTuple | None:
143
+ raise NotImplementedError("MinderCheckpointSaver only supports async.")
144
+
145
+ def put(
146
+ self,
147
+ config: RunnableConfig,
148
+ checkpoint: Checkpoint,
149
+ metadata: CheckpointMetadata,
150
+ new_versions: dict[str, str | float | int],
151
+ ) -> RunnableConfig:
152
+ raise NotImplementedError("MinderCheckpointSaver only supports async.")
153
+
154
+ def list(
155
+ self,
156
+ config: RunnableConfig | None,
157
+ *,
158
+ filter: dict[str, Any] | None = None,
159
+ before: RunnableConfig | None = None,
160
+ limit: int | None = None,
161
+ ):
162
+ raise NotImplementedError("MinderCheckpointSaver only supports async.")