dhee 7.2.4__tar.gz → 7.2.5__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 (532) hide show
  1. {dhee-7.2.4/dhee.egg-info → dhee-7.2.5}/PKG-INFO +1 -1
  2. {dhee-7.2.4 → dhee-7.2.5}/dhee/__init__.py +1 -1
  3. {dhee-7.2.4 → dhee-7.2.5}/dhee/configs/base.py +9 -3
  4. {dhee-7.2.4 → dhee-7.2.5}/dhee/contract_runtime.py +3 -6
  5. {dhee-7.2.4 → dhee-7.2.5}/dhee/core/scene.py +81 -8
  6. {dhee-7.2.4 → dhee-7.2.5}/dhee/doctor.py +71 -0
  7. {dhee-7.2.4 → dhee-7.2.5}/dhee/llms/nvidia.py +35 -1
  8. {dhee-7.2.4 → dhee-7.2.5}/dhee/memory/main.py +219 -1
  9. {dhee-7.2.4 → dhee-7.2.5}/dhee/provider_defaults.py +1 -1
  10. {dhee-7.2.4 → dhee-7.2.5}/dhee/router/handlers.py +27 -0
  11. {dhee-7.2.4 → dhee-7.2.5}/dhee/simple.py +17 -3
  12. {dhee-7.2.4 → dhee-7.2.5}/dhee/verification_runner.py +20 -1
  13. {dhee-7.2.4 → dhee-7.2.5/dhee.egg-info}/PKG-INFO +1 -1
  14. {dhee-7.2.4 → dhee-7.2.5}/dhee.egg-info/SOURCES.txt +3 -0
  15. {dhee-7.2.4 → dhee-7.2.5}/pyproject.toml +1 -1
  16. dhee-7.2.5/tests/test_data_dir_paths.py +29 -0
  17. dhee-7.2.5/tests/test_nvidia_llm.py +59 -0
  18. {dhee-7.2.4 → dhee-7.2.5}/tests/test_packaging.py +1 -1
  19. dhee-7.2.5/tests/test_scene_maintenance.py +73 -0
  20. {dhee-7.2.4 → dhee-7.2.5}/LICENSE +0 -0
  21. {dhee-7.2.4 → dhee-7.2.5}/MANIFEST.in +0 -0
  22. {dhee-7.2.4 → dhee-7.2.5}/README.md +0 -0
  23. {dhee-7.2.4 → dhee-7.2.5}/dhee/adapters/__init__.py +0 -0
  24. {dhee-7.2.4 → dhee-7.2.5}/dhee/adapters/gstack.py +0 -0
  25. {dhee-7.2.4 → dhee-7.2.5}/dhee/adapters/gstack_parser.py +0 -0
  26. {dhee-7.2.4 → dhee-7.2.5}/dhee/agent_runtime/__init__.py +0 -0
  27. {dhee-7.2.4 → dhee-7.2.5}/dhee/agent_runtime/auth.py +0 -0
  28. {dhee-7.2.4 → dhee-7.2.5}/dhee/agent_runtime/client.py +0 -0
  29. {dhee-7.2.4 → dhee-7.2.5}/dhee/agent_runtime/events.py +0 -0
  30. {dhee-7.2.4 → dhee-7.2.5}/dhee/agent_runtime/models.py +0 -0
  31. {dhee-7.2.4 → dhee-7.2.5}/dhee/agent_runtime/policy.py +0 -0
  32. {dhee-7.2.4 → dhee-7.2.5}/dhee/agent_runtime/run.py +0 -0
  33. {dhee-7.2.4 → dhee-7.2.5}/dhee/agent_runtime/server.py +0 -0
  34. {dhee-7.2.4 → dhee-7.2.5}/dhee/agent_runtime/tools.py +0 -0
  35. {dhee-7.2.4 → dhee-7.2.5}/dhee/benchmarks/__init__.py +0 -0
  36. {dhee-7.2.4 → dhee-7.2.5}/dhee/benchmarks/arc_agi.py +0 -0
  37. {dhee-7.2.4 → dhee-7.2.5}/dhee/benchmarks/decades.py +0 -0
  38. {dhee-7.2.4 → dhee-7.2.5}/dhee/benchmarks/hippocamp.py +0 -0
  39. {dhee-7.2.4 → dhee-7.2.5}/dhee/benchmarks/longmemeval.py +0 -0
  40. {dhee-7.2.4 → dhee-7.2.5}/dhee/benchmarks/phase0_context_audit.py +0 -0
  41. {dhee-7.2.4 → dhee-7.2.5}/dhee/benchmarks/portability.py +0 -0
  42. {dhee-7.2.4 → dhee-7.2.5}/dhee/benchmarks/raw_extractors.py +0 -0
  43. {dhee-7.2.4 → dhee-7.2.5}/dhee/benchmarks/replay_corpus.py +0 -0
  44. {dhee-7.2.4 → dhee-7.2.5}/dhee/benchmarks/router_replay.py +0 -0
  45. {dhee-7.2.4 → dhee-7.2.5}/dhee/checkpoint_runtime.py +0 -0
  46. {dhee-7.2.4 → dhee-7.2.5}/dhee/cli.py +0 -0
  47. {dhee-7.2.4 → dhee-7.2.5}/dhee/cli_config.py +0 -0
  48. {dhee-7.2.4 → dhee-7.2.5}/dhee/cli_mcp.py +0 -0
  49. {dhee-7.2.4 → dhee-7.2.5}/dhee/cli_onboard.py +0 -0
  50. {dhee-7.2.4 → dhee-7.2.5}/dhee/cli_pretty.py +0 -0
  51. {dhee-7.2.4 → dhee-7.2.5}/dhee/cli_setup.py +0 -0
  52. {dhee-7.2.4 → dhee-7.2.5}/dhee/cli_update.py +0 -0
  53. {dhee-7.2.4 → dhee-7.2.5}/dhee/configs/__init__.py +0 -0
  54. {dhee-7.2.4 → dhee-7.2.5}/dhee/configs/active.py +0 -0
  55. {dhee-7.2.4 → dhee-7.2.5}/dhee/configs/presets.py +0 -0
  56. {dhee-7.2.4 → dhee-7.2.5}/dhee/context_ir.py +0 -0
  57. {dhee-7.2.4 → dhee-7.2.5}/dhee/context_kernel.py +0 -0
  58. {dhee-7.2.4 → dhee-7.2.5}/dhee/context_state.py +0 -0
  59. {dhee-7.2.4 → dhee-7.2.5}/dhee/contract_supervisor.py +0 -0
  60. {dhee-7.2.4 → dhee-7.2.5}/dhee/core/__init__.py +0 -0
  61. {dhee-7.2.4 → dhee-7.2.5}/dhee/core/alaya.py +0 -0
  62. {dhee-7.2.4 → dhee-7.2.5}/dhee/core/answer_orchestration.py +0 -0
  63. {dhee-7.2.4 → dhee-7.2.5}/dhee/core/artifacts.py +0 -0
  64. {dhee-7.2.4 → dhee-7.2.5}/dhee/core/belief.py +0 -0
  65. {dhee-7.2.4 → dhee-7.2.5}/dhee/core/buddhi.py +0 -0
  66. {dhee-7.2.4 → dhee-7.2.5}/dhee/core/category.py +0 -0
  67. {dhee-7.2.4 → dhee-7.2.5}/dhee/core/codex_artifacts.py +0 -0
  68. {dhee-7.2.4 → dhee-7.2.5}/dhee/core/codex_stream.py +0 -0
  69. {dhee-7.2.4 → dhee-7.2.5}/dhee/core/cognition.py +0 -0
  70. {dhee-7.2.4 → dhee-7.2.5}/dhee/core/cognition_kernel.py +0 -0
  71. {dhee-7.2.4 → dhee-7.2.5}/dhee/core/conflict.py +0 -0
  72. {dhee-7.2.4 → dhee-7.2.5}/dhee/core/context_bootstrap.py +0 -0
  73. {dhee-7.2.4 → dhee-7.2.5}/dhee/core/contrastive.py +0 -0
  74. {dhee-7.2.4 → dhee-7.2.5}/dhee/core/decay.py +0 -0
  75. {dhee-7.2.4 → dhee-7.2.5}/dhee/core/distillation.py +0 -0
  76. {dhee-7.2.4 → dhee-7.2.5}/dhee/core/echo.py +0 -0
  77. {dhee-7.2.4 → dhee-7.2.5}/dhee/core/engram.py +0 -0
  78. {dhee-7.2.4 → dhee-7.2.5}/dhee/core/engram_consolidator.py +0 -0
  79. {dhee-7.2.4 → dhee-7.2.5}/dhee/core/engram_extractor.py +0 -0
  80. {dhee-7.2.4 → dhee-7.2.5}/dhee/core/engram_tiering.py +0 -0
  81. {dhee-7.2.4 → dhee-7.2.5}/dhee/core/engram_verification.py +0 -0
  82. {dhee-7.2.4 → dhee-7.2.5}/dhee/core/enrichment.py +0 -0
  83. {dhee-7.2.4 → dhee-7.2.5}/dhee/core/episode.py +0 -0
  84. {dhee-7.2.4 → dhee-7.2.5}/dhee/core/episodic_index.py +0 -0
  85. {dhee-7.2.4 → dhee-7.2.5}/dhee/core/evolution.py +0 -0
  86. {dhee-7.2.4 → dhee-7.2.5}/dhee/core/file_baseline.py +0 -0
  87. {dhee-7.2.4 → dhee-7.2.5}/dhee/core/file_read_tracker.py +0 -0
  88. {dhee-7.2.4 → dhee-7.2.5}/dhee/core/forgetting.py +0 -0
  89. {dhee-7.2.4 → dhee-7.2.5}/dhee/core/fusion.py +0 -0
  90. {dhee-7.2.4 → dhee-7.2.5}/dhee/core/graph.py +0 -0
  91. {dhee-7.2.4 → dhee-7.2.5}/dhee/core/handoff_snapshot.py +0 -0
  92. {dhee-7.2.4 → dhee-7.2.5}/dhee/core/heuristic.py +0 -0
  93. {dhee-7.2.4 → dhee-7.2.5}/dhee/core/intent.py +0 -0
  94. {dhee-7.2.4 → dhee-7.2.5}/dhee/core/intention.py +0 -0
  95. {dhee-7.2.4 → dhee-7.2.5}/dhee/core/kernel.py +0 -0
  96. {dhee-7.2.4 → dhee-7.2.5}/dhee/core/learnings.py +0 -0
  97. {dhee-7.2.4 → dhee-7.2.5}/dhee/core/live_context.py +0 -0
  98. {dhee-7.2.4 → dhee-7.2.5}/dhee/core/log_parser.py +0 -0
  99. {dhee-7.2.4 → dhee-7.2.5}/dhee/core/meta_buddhi.py +0 -0
  100. {dhee-7.2.4 → dhee-7.2.5}/dhee/core/pattern_detector.py +0 -0
  101. {dhee-7.2.4 → dhee-7.2.5}/dhee/core/policy.py +0 -0
  102. {dhee-7.2.4 → dhee-7.2.5}/dhee/core/profile.py +0 -0
  103. {dhee-7.2.4 → dhee-7.2.5}/dhee/core/provenance.py +0 -0
  104. {dhee-7.2.4 → dhee-7.2.5}/dhee/core/resolvers.py +0 -0
  105. {dhee-7.2.4 → dhee-7.2.5}/dhee/core/retrieval.py +0 -0
  106. {dhee-7.2.4 → dhee-7.2.5}/dhee/core/samskara.py +0 -0
  107. {dhee-7.2.4 → dhee-7.2.5}/dhee/core/session_tracker.py +0 -0
  108. {dhee-7.2.4 → dhee-7.2.5}/dhee/core/shared_tasks.py +0 -0
  109. {dhee-7.2.4 → dhee-7.2.5}/dhee/core/strategy.py +0 -0
  110. {dhee-7.2.4 → dhee-7.2.5}/dhee/core/task_state.py +0 -0
  111. {dhee-7.2.4 → dhee-7.2.5}/dhee/core/thread_state.py +0 -0
  112. {dhee-7.2.4 → dhee-7.2.5}/dhee/core/traces.py +0 -0
  113. {dhee-7.2.4 → dhee-7.2.5}/dhee/core/trigger.py +0 -0
  114. {dhee-7.2.4 → dhee-7.2.5}/dhee/core/viveka.py +0 -0
  115. {dhee-7.2.4 → dhee-7.2.5}/dhee/core/workspace_line.py +0 -0
  116. {dhee-7.2.4 → dhee-7.2.5}/dhee/core/workspace_line_bus.py +0 -0
  117. {dhee-7.2.4 → dhee-7.2.5}/dhee/db/__init__.py +0 -0
  118. {dhee-7.2.4 → dhee-7.2.5}/dhee/db/sqlite.py +0 -0
  119. {dhee-7.2.4 → dhee-7.2.5}/dhee/db/sqlite_analytics.py +0 -0
  120. {dhee-7.2.4 → dhee-7.2.5}/dhee/db/sqlite_artifacts.py +0 -0
  121. {dhee-7.2.4 → dhee-7.2.5}/dhee/db/sqlite_common.py +0 -0
  122. {dhee-7.2.4 → dhee-7.2.5}/dhee/db/sqlite_domains.py +0 -0
  123. {dhee-7.2.4 → dhee-7.2.5}/dhee/debugger_api.py +0 -0
  124. {dhee-7.2.4 → dhee-7.2.5}/dhee/demo.py +0 -0
  125. {dhee-7.2.4 → dhee-7.2.5}/dhee/embeddings/__init__.py +0 -0
  126. {dhee-7.2.4 → dhee-7.2.5}/dhee/embeddings/base.py +0 -0
  127. {dhee-7.2.4 → dhee-7.2.5}/dhee/embeddings/gemini.py +0 -0
  128. {dhee-7.2.4 → dhee-7.2.5}/dhee/embeddings/nvidia.py +0 -0
  129. {dhee-7.2.4 → dhee-7.2.5}/dhee/embeddings/ollama.py +0 -0
  130. {dhee-7.2.4 → dhee-7.2.5}/dhee/embeddings/openai.py +0 -0
  131. {dhee-7.2.4 → dhee-7.2.5}/dhee/embeddings/qwen.py +0 -0
  132. {dhee-7.2.4 → dhee-7.2.5}/dhee/embeddings/simple.py +0 -0
  133. {dhee-7.2.4 → dhee-7.2.5}/dhee/exceptions.py +0 -0
  134. {dhee-7.2.4 → dhee-7.2.5}/dhee/fs/__init__.py +0 -0
  135. {dhee-7.2.4 → dhee-7.2.5}/dhee/fs/mounts.py +0 -0
  136. {dhee-7.2.4 → dhee-7.2.5}/dhee/fs/types.py +0 -0
  137. {dhee-7.2.4 → dhee-7.2.5}/dhee/fs/uri.py +0 -0
  138. {dhee-7.2.4 → dhee-7.2.5}/dhee/fs/workspace.py +0 -0
  139. {dhee-7.2.4 → dhee-7.2.5}/dhee/graph_projection_hardening.py +0 -0
  140. {dhee-7.2.4 → dhee-7.2.5}/dhee/graph_proof_bundle.py +0 -0
  141. {dhee-7.2.4 → dhee-7.2.5}/dhee/harness/__init__.py +0 -0
  142. {dhee-7.2.4 → dhee-7.2.5}/dhee/harness/base.py +0 -0
  143. {dhee-7.2.4 → dhee-7.2.5}/dhee/harness/claude_code.py +0 -0
  144. {dhee-7.2.4 → dhee-7.2.5}/dhee/harness/codex.py +0 -0
  145. {dhee-7.2.4 → dhee-7.2.5}/dhee/harness/install.py +0 -0
  146. {dhee-7.2.4 → dhee-7.2.5}/dhee/hooks/__init__.py +0 -0
  147. {dhee-7.2.4 → dhee-7.2.5}/dhee/hooks/claude_code/__init__.py +0 -0
  148. {dhee-7.2.4 → dhee-7.2.5}/dhee/hooks/claude_code/__main__.py +0 -0
  149. {dhee-7.2.4 → dhee-7.2.5}/dhee/hooks/claude_code/assembler.py +0 -0
  150. {dhee-7.2.4 → dhee-7.2.5}/dhee/hooks/claude_code/chunker.py +0 -0
  151. {dhee-7.2.4 → dhee-7.2.5}/dhee/hooks/claude_code/ingest.py +0 -0
  152. {dhee-7.2.4 → dhee-7.2.5}/dhee/hooks/claude_code/install.py +0 -0
  153. {dhee-7.2.4 → dhee-7.2.5}/dhee/hooks/claude_code/migrate.py +0 -0
  154. {dhee-7.2.4 → dhee-7.2.5}/dhee/hooks/claude_code/privacy.py +0 -0
  155. {dhee-7.2.4 → dhee-7.2.5}/dhee/hooks/claude_code/renderer.py +0 -0
  156. {dhee-7.2.4 → dhee-7.2.5}/dhee/hooks/claude_code/signal.py +0 -0
  157. {dhee-7.2.4 → dhee-7.2.5}/dhee/hooks/scene_world.py +0 -0
  158. {dhee-7.2.4 → dhee-7.2.5}/dhee/incremental_context.py +0 -0
  159. {dhee-7.2.4 → dhee-7.2.5}/dhee/install_cleanup.py +0 -0
  160. {dhee-7.2.4 → dhee-7.2.5}/dhee/integrations/__init__.py +0 -0
  161. {dhee-7.2.4 → dhee-7.2.5}/dhee/integrations/context_sources.py +0 -0
  162. {dhee-7.2.4 → dhee-7.2.5}/dhee/integrations/hermes.py +0 -0
  163. {dhee-7.2.4 → dhee-7.2.5}/dhee/integrations/hermes_provider/__init__.py +0 -0
  164. {dhee-7.2.4 → dhee-7.2.5}/dhee/integrations/hermes_provider/provider.py +0 -0
  165. {dhee-7.2.4 → dhee-7.2.5}/dhee/llms/__init__.py +0 -0
  166. {dhee-7.2.4 → dhee-7.2.5}/dhee/llms/anthropic.py +0 -0
  167. {dhee-7.2.4 → dhee-7.2.5}/dhee/llms/base.py +0 -0
  168. {dhee-7.2.4 → dhee-7.2.5}/dhee/llms/dhee.py +0 -0
  169. {dhee-7.2.4 → dhee-7.2.5}/dhee/llms/gemini.py +0 -0
  170. {dhee-7.2.4 → dhee-7.2.5}/dhee/llms/mock.py +0 -0
  171. {dhee-7.2.4 → dhee-7.2.5}/dhee/llms/ollama.py +0 -0
  172. {dhee-7.2.4 → dhee-7.2.5}/dhee/llms/openai.py +0 -0
  173. {dhee-7.2.4 → dhee-7.2.5}/dhee/llms/teacher_logger.py +0 -0
  174. {dhee-7.2.4 → dhee-7.2.5}/dhee/mcp_registry.py +0 -0
  175. {dhee-7.2.4 → dhee-7.2.5}/dhee/mcp_server.py +0 -0
  176. {dhee-7.2.4 → dhee-7.2.5}/dhee/mcp_slim.py +0 -0
  177. {dhee-7.2.4 → dhee-7.2.5}/dhee/memory/__init__.py +0 -0
  178. {dhee-7.2.4 → dhee-7.2.5}/dhee/memory/admission.py +0 -0
  179. {dhee-7.2.4 → dhee-7.2.5}/dhee/memory/base.py +0 -0
  180. {dhee-7.2.4 → dhee-7.2.5}/dhee/memory/core.py +0 -0
  181. {dhee-7.2.4 → dhee-7.2.5}/dhee/memory/cost.py +0 -0
  182. {dhee-7.2.4 → dhee-7.2.5}/dhee/memory/episodic.py +0 -0
  183. {dhee-7.2.4 → dhee-7.2.5}/dhee/memory/narrative_scene.py +0 -0
  184. {dhee-7.2.4 → dhee-7.2.5}/dhee/memory/orchestration.py +0 -0
  185. {dhee-7.2.4 → dhee-7.2.5}/dhee/memory/parallel.py +0 -0
  186. {dhee-7.2.4 → dhee-7.2.5}/dhee/memory/projects.py +0 -0
  187. {dhee-7.2.4 → dhee-7.2.5}/dhee/memory/quality.py +0 -0
  188. {dhee-7.2.4 → dhee-7.2.5}/dhee/memory/reranker.py +0 -0
  189. {dhee-7.2.4 → dhee-7.2.5}/dhee/memory/retrieval_helpers.py +0 -0
  190. {dhee-7.2.4 → dhee-7.2.5}/dhee/memory/scene_profile.py +0 -0
  191. {dhee-7.2.4 → dhee-7.2.5}/dhee/memory/scoping.py +0 -0
  192. {dhee-7.2.4 → dhee-7.2.5}/dhee/memory/search_pipeline.py +0 -0
  193. {dhee-7.2.4 → dhee-7.2.5}/dhee/memory/smart.py +0 -0
  194. {dhee-7.2.4 → dhee-7.2.5}/dhee/memory/tasks.py +0 -0
  195. {dhee-7.2.4 → dhee-7.2.5}/dhee/memory/utils.py +0 -0
  196. {dhee-7.2.4 → dhee-7.2.5}/dhee/memory/vectors.py +0 -0
  197. {dhee-7.2.4 → dhee-7.2.5}/dhee/memory/write_pipeline.py +0 -0
  198. {dhee-7.2.4 → dhee-7.2.5}/dhee/mini/__init__.py +0 -0
  199. {dhee-7.2.4 → dhee-7.2.5}/dhee/mini/karma_evaluator.py +0 -0
  200. {dhee-7.2.4 → dhee-7.2.5}/dhee/mini/progressive_trainer.py +0 -0
  201. {dhee-7.2.4 → dhee-7.2.5}/dhee/mini/replay_gate.py +0 -0
  202. {dhee-7.2.4 → dhee-7.2.5}/dhee/observability.py +0 -0
  203. {dhee-7.2.4 → dhee-7.2.5}/dhee/patch_families.py +0 -0
  204. {dhee-7.2.4 → dhee-7.2.5}/dhee/plugin.py +0 -0
  205. {dhee-7.2.4 → dhee-7.2.5}/dhee/profiles/__init__.py +0 -0
  206. {dhee-7.2.4 → dhee-7.2.5}/dhee/profiles/elevenlabs.py +0 -0
  207. {dhee-7.2.4 → dhee-7.2.5}/dhee/profiles/gemini.py +0 -0
  208. {dhee-7.2.4 → dhee-7.2.5}/dhee/profiles/openai.py +0 -0
  209. {dhee-7.2.4 → dhee-7.2.5}/dhee/protocol/__init__.py +0 -0
  210. {dhee-7.2.4 → dhee-7.2.5}/dhee/protocol/v1.py +0 -0
  211. {dhee-7.2.4 → dhee-7.2.5}/dhee/providers/__init__.py +0 -0
  212. {dhee-7.2.4 → dhee-7.2.5}/dhee/providers/base.py +0 -0
  213. {dhee-7.2.4 → dhee-7.2.5}/dhee/providers/elevenlabs.py +0 -0
  214. {dhee-7.2.4 → dhee-7.2.5}/dhee/providers/gemini.py +0 -0
  215. {dhee-7.2.4 → dhee-7.2.5}/dhee/providers/openai.py +0 -0
  216. {dhee-7.2.4 → dhee-7.2.5}/dhee/release_hygiene.py +0 -0
  217. {dhee-7.2.4 → dhee-7.2.5}/dhee/replay_branching.py +0 -0
  218. {dhee-7.2.4 → dhee-7.2.5}/dhee/repo_intelligence.py +0 -0
  219. {dhee-7.2.4 → dhee-7.2.5}/dhee/repo_link.py +0 -0
  220. {dhee-7.2.4 → dhee-7.2.5}/dhee/router/__init__.py +0 -0
  221. {dhee-7.2.4 → dhee-7.2.5}/dhee/router/agent_digest.py +0 -0
  222. {dhee-7.2.4 → dhee-7.2.5}/dhee/router/bash_digest.py +0 -0
  223. {dhee-7.2.4 → dhee-7.2.5}/dhee/router/bootstrap.py +0 -0
  224. {dhee-7.2.4 → dhee-7.2.5}/dhee/router/critical_surface.py +0 -0
  225. {dhee-7.2.4 → dhee-7.2.5}/dhee/router/digest.py +0 -0
  226. {dhee-7.2.4 → dhee-7.2.5}/dhee/router/edit_ledger.py +0 -0
  227. {dhee-7.2.4 → dhee-7.2.5}/dhee/router/grep_digest.py +0 -0
  228. {dhee-7.2.4 → dhee-7.2.5}/dhee/router/install.py +0 -0
  229. {dhee-7.2.4 → dhee-7.2.5}/dhee/router/intent.py +0 -0
  230. {dhee-7.2.4 → dhee-7.2.5}/dhee/router/policy.py +0 -0
  231. {dhee-7.2.4 → dhee-7.2.5}/dhee/router/pre_tool_gate.py +0 -0
  232. {dhee-7.2.4 → dhee-7.2.5}/dhee/router/ptr_store.py +0 -0
  233. {dhee-7.2.4 → dhee-7.2.5}/dhee/router/quality_report.py +0 -0
  234. {dhee-7.2.4 → dhee-7.2.5}/dhee/router/stats.py +0 -0
  235. {dhee-7.2.4 → dhee-7.2.5}/dhee/router/tune.py +0 -0
  236. {dhee-7.2.4 → dhee-7.2.5}/dhee/runtime.py +0 -0
  237. {dhee-7.2.4 → dhee-7.2.5}/dhee/runtime_daemon.py +0 -0
  238. {dhee-7.2.4 → dhee-7.2.5}/dhee/runtime_io.py +0 -0
  239. {dhee-7.2.4 → dhee-7.2.5}/dhee/schemas/__init__.py +0 -0
  240. {dhee-7.2.4 → dhee-7.2.5}/dhee/schemas/narrative.py +0 -0
  241. {dhee-7.2.4 → dhee-7.2.5}/dhee/schemas/scene_card.py +0 -0
  242. {dhee-7.2.4 → dhee-7.2.5}/dhee/secret_store.py +0 -0
  243. {dhee-7.2.4 → dhee-7.2.5}/dhee/skills/__init__.py +0 -0
  244. {dhee-7.2.4 → dhee-7.2.5}/dhee/skills/discovery.py +0 -0
  245. {dhee-7.2.4 → dhee-7.2.5}/dhee/skills/executor.py +0 -0
  246. {dhee-7.2.4 → dhee-7.2.5}/dhee/skills/hashing.py +0 -0
  247. {dhee-7.2.4 → dhee-7.2.5}/dhee/skills/miner.py +0 -0
  248. {dhee-7.2.4 → dhee-7.2.5}/dhee/skills/outcomes.py +0 -0
  249. {dhee-7.2.4 → dhee-7.2.5}/dhee/skills/schema.py +0 -0
  250. {dhee-7.2.4 → dhee-7.2.5}/dhee/skills/store.py +0 -0
  251. {dhee-7.2.4 → dhee-7.2.5}/dhee/skills/structure.py +0 -0
  252. {dhee-7.2.4 → dhee-7.2.5}/dhee/skills/trajectory.py +0 -0
  253. {dhee-7.2.4 → dhee-7.2.5}/dhee/task_contracts.py +0 -0
  254. {dhee-7.2.4 → dhee-7.2.5}/dhee/temporal_fact_integration.py +0 -0
  255. {dhee-7.2.4 → dhee-7.2.5}/dhee/temporal_fact_ledger.py +0 -0
  256. {dhee-7.2.4 → dhee-7.2.5}/dhee/temporal_scenes.py +0 -0
  257. {dhee-7.2.4 → dhee-7.2.5}/dhee/training/__init__.py +0 -0
  258. {dhee-7.2.4 → dhee-7.2.5}/dhee/training/data_formatter.py +0 -0
  259. {dhee-7.2.4 → dhee-7.2.5}/dhee/training/karma.py +0 -0
  260. {dhee-7.2.4 → dhee-7.2.5}/dhee/training/nididhyasana.py +0 -0
  261. {dhee-7.2.4 → dhee-7.2.5}/dhee/training/smrti.py +0 -0
  262. {dhee-7.2.4 → dhee-7.2.5}/dhee/training/train.py +0 -0
  263. {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/__init__.py +0 -0
  264. {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/cli.py +0 -0
  265. {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/server.py +0 -0
  266. {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/dist/assets/CanvasView-Cl1HxIK0.js +0 -0
  267. {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/dist/assets/index-BboZhdsv.js +0 -0
  268. {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/dist/assets/index-CIsLOp4u.css +0 -0
  269. {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/dist/dhee-logo.png +0 -0
  270. {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/dist/index.html +0 -0
  271. {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/index.html +0 -0
  272. {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/package-lock.json +0 -0
  273. {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/package.json +0 -0
  274. {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/public/dhee-logo.png +0 -0
  275. {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/src/App.js +0 -0
  276. {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/src/App.tsx +0 -0
  277. {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/src/api.js +0 -0
  278. {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/src/api.ts +0 -0
  279. {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/src/components/AssetDrawer.js +0 -0
  280. {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/src/components/AssetDrawer.tsx +0 -0
  281. {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/src/components/ChatMessage.js +0 -0
  282. {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/src/components/ChatMessage.tsx +0 -0
  283. {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/src/components/FirstRunPanel.js +0 -0
  284. {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/src/components/FirstRunPanel.tsx +0 -0
  285. {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/src/components/LinePanel.js +0 -0
  286. {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/src/components/LinePanel.tsx +0 -0
  287. {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/src/components/NavRail.js +0 -0
  288. {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/src/components/NavRail.tsx +0 -0
  289. {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/src/components/OrgDrawer.js +0 -0
  290. {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/src/components/OrgDrawer.tsx +0 -0
  291. {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/src/components/TopBar.js +0 -0
  292. {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/src/components/TopBar.tsx +0 -0
  293. {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/src/components/TweaksPanel.js +0 -0
  294. {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/src/components/TweaksPanel.tsx +0 -0
  295. {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/src/components/WorkspaceManagerModal.js +0 -0
  296. {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/src/components/WorkspaceManagerModal.tsx +0 -0
  297. {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/src/components/canvas/CanvasControls.js +0 -0
  298. {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/src/components/canvas/CanvasControls.tsx +0 -0
  299. {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/src/components/canvas/CanvasSkeleton.js +0 -0
  300. {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/src/components/canvas/CanvasSkeleton.tsx +0 -0
  301. {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/src/components/canvas/DirectionHints.js +0 -0
  302. {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/src/components/canvas/DirectionHints.tsx +0 -0
  303. {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/src/components/canvas/Minimap.js +0 -0
  304. {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/src/components/canvas/Minimap.tsx +0 -0
  305. {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/src/components/canvas/NodeCard.js +0 -0
  306. {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/src/components/canvas/NodeCard.tsx +0 -0
  307. {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/src/components/canvas/forceLayout.js +0 -0
  308. {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/src/components/canvas/forceLayout.ts +0 -0
  309. {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/src/components/canvas/layout.js +0 -0
  310. {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/src/components/canvas/layout.ts +0 -0
  311. {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/src/components/canvas/treeLayout.js +0 -0
  312. {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/src/components/canvas/treeLayout.ts +0 -0
  313. {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/src/components/canvas/useInfiniteCanvas.js +0 -0
  314. {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/src/components/canvas/useInfiniteCanvas.ts +0 -0
  315. {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/src/components/cards/Cards.js +0 -0
  316. {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/src/components/cards/Cards.tsx +0 -0
  317. {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/src/components/graph/CanvasNodeCard.js +0 -0
  318. {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/src/components/graph/CanvasNodeCard.tsx +0 -0
  319. {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/src/components/ui/DecayBar.js +0 -0
  320. {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/src/components/ui/DecayBar.tsx +0 -0
  321. {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/src/components/ui/Markdown.js +0 -0
  322. {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/src/components/ui/Markdown.tsx +0 -0
  323. {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/src/components/ui/SectionHeader.js +0 -0
  324. {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/src/components/ui/SectionHeader.tsx +0 -0
  325. {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/src/components/ui/StatPill.js +0 -0
  326. {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/src/components/ui/StatPill.tsx +0 -0
  327. {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/src/components/ui/TierBadge.js +0 -0
  328. {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/src/components/ui/TierBadge.tsx +0 -0
  329. {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/src/main.js +0 -0
  330. {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/src/main.tsx +0 -0
  331. {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/src/styles.css +0 -0
  332. {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/src/types.js +0 -0
  333. {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/src/types.ts +0 -0
  334. {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/src/views/CanvasView.js +0 -0
  335. {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/src/views/CanvasView.tsx +0 -0
  336. {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/src/views/ChannelView.js +0 -0
  337. {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/src/views/ChannelView.tsx +0 -0
  338. {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/src/views/ConflictView.js +0 -0
  339. {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/src/views/ConflictView.tsx +0 -0
  340. {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/src/views/ContextView.js +0 -0
  341. {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/src/views/ContextView.tsx +0 -0
  342. {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/src/views/EvolutionView.js +0 -0
  343. {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/src/views/EvolutionView.tsx +0 -0
  344. {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/src/views/LaunchView.js +0 -0
  345. {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/src/views/LaunchView.tsx +0 -0
  346. {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/src/views/MemoryView.js +0 -0
  347. {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/src/views/MemoryView.tsx +0 -0
  348. {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/src/views/NotepadView.js +0 -0
  349. {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/src/views/NotepadView.tsx +0 -0
  350. {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/src/views/OrgCanvas.js +0 -0
  351. {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/src/views/OrgCanvas.tsx +0 -0
  352. {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/src/views/ProductViews.js +0 -0
  353. {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/src/views/ProductViews.tsx +0 -0
  354. {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/src/views/RouterView.js +0 -0
  355. {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/src/views/RouterView.tsx +0 -0
  356. {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/src/views/TasksView.js +0 -0
  357. {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/src/views/TasksView.tsx +0 -0
  358. {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/src/views/WorkspaceView.js +0 -0
  359. {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/src/views/WorkspaceView.tsx +0 -0
  360. {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/tsconfig.json +0 -0
  361. {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/vite.config.ts +0 -0
  362. {dhee-7.2.4 → dhee-7.2.5}/dhee/update_capsules.py +0 -0
  363. {dhee-7.2.4 → dhee-7.2.5}/dhee/utils/__init__.py +0 -0
  364. {dhee-7.2.4 → dhee-7.2.5}/dhee/utils/factory.py +0 -0
  365. {dhee-7.2.4 → dhee-7.2.5}/dhee/utils/math.py +0 -0
  366. {dhee-7.2.4 → dhee-7.2.5}/dhee/utils/prompts.py +0 -0
  367. {dhee-7.2.4 → dhee-7.2.5}/dhee/utils/repo_identity.py +0 -0
  368. {dhee-7.2.4 → dhee-7.2.5}/dhee/vector_stores/__init__.py +0 -0
  369. {dhee-7.2.4 → dhee-7.2.5}/dhee/vector_stores/base.py +0 -0
  370. {dhee-7.2.4 → dhee-7.2.5}/dhee/vector_stores/memory.py +0 -0
  371. {dhee-7.2.4 → dhee-7.2.5}/dhee/vector_stores/sqlite_vec.py +0 -0
  372. {dhee-7.2.4 → dhee-7.2.5}/dhee/vector_stores/zvec_store.py +0 -0
  373. {dhee-7.2.4 → dhee-7.2.5}/dhee/verifier_engine.py +0 -0
  374. {dhee-7.2.4 → dhee-7.2.5}/dhee/webhooks/__init__.py +0 -0
  375. {dhee-7.2.4 → dhee-7.2.5}/dhee/webhooks/elevenlabs.py +0 -0
  376. {dhee-7.2.4 → dhee-7.2.5}/dhee/world_memory/__init__.py +0 -0
  377. {dhee-7.2.4 → dhee-7.2.5}/dhee/world_memory/capture_store.py +0 -0
  378. {dhee-7.2.4 → dhee-7.2.5}/dhee/world_memory/causal_graph.py +0 -0
  379. {dhee-7.2.4 → dhee-7.2.5}/dhee/world_memory/encoder.py +0 -0
  380. {dhee-7.2.4 → dhee-7.2.5}/dhee/world_memory/gem_extractor.py +0 -0
  381. {dhee-7.2.4 → dhee-7.2.5}/dhee/world_memory/predictor.py +0 -0
  382. {dhee-7.2.4 → dhee-7.2.5}/dhee/world_memory/schema.py +0 -0
  383. {dhee-7.2.4 → dhee-7.2.5}/dhee/world_memory/service.py +0 -0
  384. {dhee-7.2.4 → dhee-7.2.5}/dhee/world_memory/session_graph.py +0 -0
  385. {dhee-7.2.4 → dhee-7.2.5}/dhee/world_memory/store.py +0 -0
  386. {dhee-7.2.4 → dhee-7.2.5}/dhee.egg-info/dependency_links.txt +0 -0
  387. {dhee-7.2.4 → dhee-7.2.5}/dhee.egg-info/entry_points.txt +0 -0
  388. {dhee-7.2.4 → dhee-7.2.5}/dhee.egg-info/requires.txt +0 -0
  389. {dhee-7.2.4 → dhee-7.2.5}/dhee.egg-info/top_level.txt +0 -0
  390. {dhee-7.2.4 → dhee-7.2.5}/dhee_shared/__init__.py +0 -0
  391. {dhee-7.2.4 → dhee-7.2.5}/dhee_shared/model_paths.py +0 -0
  392. {dhee-7.2.4 → dhee-7.2.5}/engram/__init__.py +0 -0
  393. {dhee-7.2.4 → dhee-7.2.5}/engram-bus/engram_bus/__init__.py +0 -0
  394. {dhee-7.2.4 → dhee-7.2.5}/engram-bus/engram_bus/bus.py +0 -0
  395. {dhee-7.2.4 → dhee-7.2.5}/engram-bus/engram_bus/pubsub.py +0 -0
  396. {dhee-7.2.4 → dhee-7.2.5}/engram-bus/engram_bus/server.py +0 -0
  397. {dhee-7.2.4 → dhee-7.2.5}/engram-bus/engram_bus/store.py +0 -0
  398. {dhee-7.2.4 → dhee-7.2.5}/engram-bus/engram_bus/workspace.py +0 -0
  399. {dhee-7.2.4 → dhee-7.2.5}/setup.cfg +0 -0
  400. {dhee-7.2.4 → dhee-7.2.5}/tests/test_accel.py +0 -0
  401. {dhee-7.2.4 → dhee-7.2.5}/tests/test_accel_benchmark.py +0 -0
  402. {dhee-7.2.4 → dhee-7.2.5}/tests/test_agent_digest.py +0 -0
  403. {dhee-7.2.4 → dhee-7.2.5}/tests/test_agent_provider_examples.py +0 -0
  404. {dhee-7.2.4 → dhee-7.2.5}/tests/test_agent_runtime_before.py +0 -0
  405. {dhee-7.2.4 → dhee-7.2.5}/tests/test_agent_runtime_http_auth.py +0 -0
  406. {dhee-7.2.4 → dhee-7.2.5}/tests/test_agent_runtime_lifecycle.py +0 -0
  407. {dhee-7.2.4 → dhee-7.2.5}/tests/test_agent_runtime_tool.py +0 -0
  408. {dhee-7.2.4 → dhee-7.2.5}/tests/test_agent_runtime_voice_policy.py +0 -0
  409. {dhee-7.2.4 → dhee-7.2.5}/tests/test_artifacts.py +0 -0
  410. {dhee-7.2.4 → dhee-7.2.5}/tests/test_auto_lifecycle.py +0 -0
  411. {dhee-7.2.4 → dhee-7.2.5}/tests/test_backward_compat.py +0 -0
  412. {dhee-7.2.4 → dhee-7.2.5}/tests/test_batch.py +0 -0
  413. {dhee-7.2.4 → dhee-7.2.5}/tests/test_belief_debugger.py +0 -0
  414. {dhee-7.2.4 → dhee-7.2.5}/tests/test_causal_scene_memory.py +0 -0
  415. {dhee-7.2.4 → dhee-7.2.5}/tests/test_claude_code_hooks.py +0 -0
  416. {dhee-7.2.4 → dhee-7.2.5}/tests/test_cli_config.py +0 -0
  417. {dhee-7.2.4 → dhee-7.2.5}/tests/test_cli_harness_commands.py +0 -0
  418. {dhee-7.2.4 → dhee-7.2.5}/tests/test_cli_onboard_update.py +0 -0
  419. {dhee-7.2.4 → dhee-7.2.5}/tests/test_cli_pretty.py +0 -0
  420. {dhee-7.2.4 → dhee-7.2.5}/tests/test_codex_stream.py +0 -0
  421. {dhee-7.2.4 → dhee-7.2.5}/tests/test_cognition_evals.py +0 -0
  422. {dhee-7.2.4 → dhee-7.2.5}/tests/test_cognition_kernel.py +0 -0
  423. {dhee-7.2.4 → dhee-7.2.5}/tests/test_cognition_v3.py +0 -0
  424. {dhee-7.2.4 → dhee-7.2.5}/tests/test_context_state.py +0 -0
  425. {dhee-7.2.4 → dhee-7.2.5}/tests/test_contract_runtime_recovery.py +0 -0
  426. {dhee-7.2.4 → dhee-7.2.5}/tests/test_core_memory.py +0 -0
  427. {dhee-7.2.4 → dhee-7.2.5}/tests/test_cosine_similarity.py +0 -0
  428. {dhee-7.2.4 → dhee-7.2.5}/tests/test_decades_eval.py +0 -0
  429. {dhee-7.2.4 → dhee-7.2.5}/tests/test_dedup.py +0 -0
  430. {dhee-7.2.4 → dhee-7.2.5}/tests/test_deferred_enrichment.py +0 -0
  431. {dhee-7.2.4 → dhee-7.2.5}/tests/test_demo.py +0 -0
  432. {dhee-7.2.4 → dhee-7.2.5}/tests/test_dhee_init.py +0 -0
  433. {dhee-7.2.4 → dhee-7.2.5}/tests/test_dhee_model_paths.py +0 -0
  434. {dhee-7.2.4 → dhee-7.2.5}/tests/test_dheefs.py +0 -0
  435. {dhee-7.2.4 → dhee-7.2.5}/tests/test_distillation.py +0 -0
  436. {dhee-7.2.4 → dhee-7.2.5}/tests/test_e2e_all_features.py +0 -0
  437. {dhee-7.2.4 → dhee-7.2.5}/tests/test_elevenlabs_cli.py +0 -0
  438. {dhee-7.2.4 → dhee-7.2.5}/tests/test_elevenlabs_correction_memory.py +0 -0
  439. {dhee-7.2.4 → dhee-7.2.5}/tests/test_elevenlabs_no_secret_storage.py +0 -0
  440. {dhee-7.2.4 → dhee-7.2.5}/tests/test_elevenlabs_profile.py +0 -0
  441. {dhee-7.2.4 → dhee-7.2.5}/tests/test_elevenlabs_two_call_memory.py +0 -0
  442. {dhee-7.2.4 → dhee-7.2.5}/tests/test_elevenlabs_webhook.py +0 -0
  443. {dhee-7.2.4 → dhee-7.2.5}/tests/test_engram_tiering.py +0 -0
  444. {dhee-7.2.4 → dhee-7.2.5}/tests/test_engram_tiering_promotion.py +0 -0
  445. {dhee-7.2.4 → dhee-7.2.5}/tests/test_evolution_meta_loop.py +0 -0
  446. {dhee-7.2.4 → dhee-7.2.5}/tests/test_evolution_session_gate.py +0 -0
  447. {dhee-7.2.4 → dhee-7.2.5}/tests/test_forgetting.py +0 -0
  448. {dhee-7.2.4 → dhee-7.2.5}/tests/test_gemini_provider.py +0 -0
  449. {dhee-7.2.4 → dhee-7.2.5}/tests/test_graph_proof_bundle.py +0 -0
  450. {dhee-7.2.4 → dhee-7.2.5}/tests/test_gstack_adapter.py +0 -0
  451. {dhee-7.2.4 → dhee-7.2.5}/tests/test_handoff_snapshot.py +0 -0
  452. {dhee-7.2.4 → dhee-7.2.5}/tests/test_harness_adapters.py +0 -0
  453. {dhee-7.2.4 → dhee-7.2.5}/tests/test_harness_install.py +0 -0
  454. {dhee-7.2.4 → dhee-7.2.5}/tests/test_hashing.py +0 -0
  455. {dhee-7.2.4 → dhee-7.2.5}/tests/test_hermes_provider.py +0 -0
  456. {dhee-7.2.4 → dhee-7.2.5}/tests/test_hippocamp_benchmark.py +0 -0
  457. {dhee-7.2.4 → dhee-7.2.5}/tests/test_incremental_context.py +0 -0
  458. {dhee-7.2.4 → dhee-7.2.5}/tests/test_install_cleanup.py +0 -0
  459. {dhee-7.2.4 → dhee-7.2.5}/tests/test_intent.py +0 -0
  460. {dhee-7.2.4 → dhee-7.2.5}/tests/test_karma_evaluator.py +0 -0
  461. {dhee-7.2.4 → dhee-7.2.5}/tests/test_learnings.py +0 -0
  462. {dhee-7.2.4 → dhee-7.2.5}/tests/test_locomo_plus_runner.py +0 -0
  463. {dhee-7.2.4 → dhee-7.2.5}/tests/test_log_parser.py +0 -0
  464. {dhee-7.2.4 → dhee-7.2.5}/tests/test_longmemeval_config.py +0 -0
  465. {dhee-7.2.4 → dhee-7.2.5}/tests/test_mcp_artifact_tools.py +0 -0
  466. {dhee-7.2.4 → dhee-7.2.5}/tests/test_mcp_tools_slim.py +0 -0
  467. {dhee-7.2.4 → dhee-7.2.5}/tests/test_memory_admission.py +0 -0
  468. {dhee-7.2.4 → dhee-7.2.5}/tests/test_memory_os_service.py +0 -0
  469. {dhee-7.2.4 → dhee-7.2.5}/tests/test_memory_quality_contract.py +0 -0
  470. {dhee-7.2.4 → dhee-7.2.5}/tests/test_memory_types.py +0 -0
  471. {dhee-7.2.4 → dhee-7.2.5}/tests/test_meta_buddhi_group_relative.py +0 -0
  472. {dhee-7.2.4 → dhee-7.2.5}/tests/test_migration.py +0 -0
  473. {dhee-7.2.4 → dhee-7.2.5}/tests/test_miner.py +0 -0
  474. {dhee-7.2.4 → dhee-7.2.5}/tests/test_narrative_scene_intelligence.py +0 -0
  475. {dhee-7.2.4 → dhee-7.2.5}/tests/test_nvidia_embedder.py +0 -0
  476. {dhee-7.2.4 → dhee-7.2.5}/tests/test_openai_provider.py +0 -0
  477. {dhee-7.2.4 → dhee-7.2.5}/tests/test_openclaw.py +0 -0
  478. {dhee-7.2.4 → dhee-7.2.5}/tests/test_orchestration_core.py +0 -0
  479. {dhee-7.2.4 → dhee-7.2.5}/tests/test_oss_61_regressions.py +0 -0
  480. {dhee-7.2.4 → dhee-7.2.5}/tests/test_parallel.py +0 -0
  481. {dhee-7.2.4 → dhee-7.2.5}/tests/test_patch_families.py +0 -0
  482. {dhee-7.2.4 → dhee-7.2.5}/tests/test_plugin_learnings.py +0 -0
  483. {dhee-7.2.4 → dhee-7.2.5}/tests/test_portability_eval.py +0 -0
  484. {dhee-7.2.4 → dhee-7.2.5}/tests/test_power_packages.py +0 -0
  485. {dhee-7.2.4 → dhee-7.2.5}/tests/test_presets.py +0 -0
  486. {dhee-7.2.4 → dhee-7.2.5}/tests/test_profile.py +0 -0
  487. {dhee-7.2.4 → dhee-7.2.5}/tests/test_progressive_trainer.py +0 -0
  488. {dhee-7.2.4 → dhee-7.2.5}/tests/test_projects.py +0 -0
  489. {dhee-7.2.4 → dhee-7.2.5}/tests/test_protocol_v1.py +0 -0
  490. {dhee-7.2.4 → dhee-7.2.5}/tests/test_provider_runtime_profiles.py +0 -0
  491. {dhee-7.2.4 → dhee-7.2.5}/tests/test_query_cache.py +0 -0
  492. {dhee-7.2.4 → dhee-7.2.5}/tests/test_release_hygiene.py +0 -0
  493. {dhee-7.2.4 → dhee-7.2.5}/tests/test_replay_branching.py +0 -0
  494. {dhee-7.2.4 → dhee-7.2.5}/tests/test_replay_corpus_export.py +0 -0
  495. {dhee-7.2.4 → dhee-7.2.5}/tests/test_replay_gate.py +0 -0
  496. {dhee-7.2.4 → dhee-7.2.5}/tests/test_repo_intelligence.py +0 -0
  497. {dhee-7.2.4 → dhee-7.2.5}/tests/test_repo_link.py +0 -0
  498. {dhee-7.2.4 → dhee-7.2.5}/tests/test_reranker_defaults.py +0 -0
  499. {dhee-7.2.4 → dhee-7.2.5}/tests/test_router.py +0 -0
  500. {dhee-7.2.4 → dhee-7.2.5}/tests/test_router_replay.py +0 -0
  501. {dhee-7.2.4 → dhee-7.2.5}/tests/test_router_stats_agents.py +0 -0
  502. {dhee-7.2.4 → dhee-7.2.5}/tests/test_runtime.py +0 -0
  503. {dhee-7.2.4 → dhee-7.2.5}/tests/test_runtime_hardening.py +0 -0
  504. {dhee-7.2.4 → dhee-7.2.5}/tests/test_scene.py +0 -0
  505. {dhee-7.2.4 → dhee-7.2.5}/tests/test_scene_world_hook.py +0 -0
  506. {dhee-7.2.4 → dhee-7.2.5}/tests/test_secret_store.py +0 -0
  507. {dhee-7.2.4 → dhee-7.2.5}/tests/test_session_tracker.py +0 -0
  508. {dhee-7.2.4 → dhee-7.2.5}/tests/test_shared_tasks.py +0 -0
  509. {dhee-7.2.4 → dhee-7.2.5}/tests/test_simple_zero_config.py +0 -0
  510. {dhee-7.2.4 → dhee-7.2.5}/tests/test_skills.py +0 -0
  511. {dhee-7.2.4 → dhee-7.2.5}/tests/test_smart_memory.py +0 -0
  512. {dhee-7.2.4 → dhee-7.2.5}/tests/test_sqlite_connection_pool.py +0 -0
  513. {dhee-7.2.4 → dhee-7.2.5}/tests/test_sqlite_vec.py +0 -0
  514. {dhee-7.2.4 → dhee-7.2.5}/tests/test_structural.py +0 -0
  515. {dhee-7.2.4 → dhee-7.2.5}/tests/test_structured_resolution.py +0 -0
  516. {dhee-7.2.4 → dhee-7.2.5}/tests/test_task_contracts.py +0 -0
  517. {dhee-7.2.4 → dhee-7.2.5}/tests/test_tasks.py +0 -0
  518. {dhee-7.2.4 → dhee-7.2.5}/tests/test_temporal_fact_integration.py +0 -0
  519. {dhee-7.2.4 → dhee-7.2.5}/tests/test_temporal_fact_ledger.py +0 -0
  520. {dhee-7.2.4 → dhee-7.2.5}/tests/test_temporal_scenes.py +0 -0
  521. {dhee-7.2.4 → dhee-7.2.5}/tests/test_thread_state.py +0 -0
  522. {dhee-7.2.4 → dhee-7.2.5}/tests/test_traces.py +0 -0
  523. {dhee-7.2.4 → dhee-7.2.5}/tests/test_trajectory.py +0 -0
  524. {dhee-7.2.4 → dhee-7.2.5}/tests/test_ui.py +0 -0
  525. {dhee-7.2.4 → dhee-7.2.5}/tests/test_unified_enrichment.py +0 -0
  526. {dhee-7.2.4 → dhee-7.2.5}/tests/test_update_capsules.py +0 -0
  527. {dhee-7.2.4 → dhee-7.2.5}/tests/test_vector_store_factory.py +0 -0
  528. {dhee-7.2.4 → dhee-7.2.5}/tests/test_verification_runner.py +0 -0
  529. {dhee-7.2.4 → dhee-7.2.5}/tests/test_verifier_engine.py +0 -0
  530. {dhee-7.2.4 → dhee-7.2.5}/tests/test_workspace_line_agent_emit.py +0 -0
  531. {dhee-7.2.4 → dhee-7.2.5}/tests/test_workspace_line_bus.py +0 -0
  532. {dhee-7.2.4 → dhee-7.2.5}/tests/test_zvec_store.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dhee
3
- Version: 7.2.4
3
+ Version: 7.2.5
4
4
  Summary: Dhee - world memory layer and context compiler for AI agents
5
5
  Author: Sankhya AI Labs
6
6
  License-Expression: MIT
@@ -50,7 +50,7 @@ from dhee.memory.admission import (
50
50
  # Default import remains model-free for backwards compatibility.
51
51
  Memory = CoreMemory
52
52
 
53
- __version__ = "7.2.4"
53
+ __version__ = "7.2.5"
54
54
  __all__ = [
55
55
  # Memory classes
56
56
  "Engram",
@@ -1,4 +1,5 @@
1
1
  import os
2
+ from pathlib import Path
2
3
  from typing import Any, Dict, List, Optional
3
4
 
4
5
  from pydantic import BaseModel, Field, field_validator
@@ -12,12 +13,17 @@ from dhee.provider_defaults import (
12
13
  )
13
14
 
14
15
 
16
+ def resolve_dhee_data_dir(path: str | os.PathLike[str]) -> str:
17
+ """Return an absolute Dhee data directory with user markers expanded."""
18
+ return os.path.abspath(os.path.expanduser(os.fspath(path)))
19
+
20
+
15
21
  def _dhee_data_dir() -> str:
16
22
  """Resolve data directory: DHEE_DATA_DIR > ~/.dhee."""
17
23
  env = os.environ.get("DHEE_DATA_DIR")
18
24
  if env:
19
- return env
20
- return os.path.join(os.path.expanduser("~"), ".dhee")
25
+ return resolve_dhee_data_dir(env)
26
+ return resolve_dhee_data_dir(Path.home() / ".dhee")
21
27
 
22
28
 
23
29
  _VALID_VECTOR_PROVIDERS = {"memory", "sqlite_vec", "zvec"}
@@ -180,7 +186,7 @@ class SceneConfig(BaseModel):
180
186
  scene_topic_threshold: float = 0.55 # cosine sim below this = topic shift
181
187
  auto_close_inactive_minutes: int = 120
182
188
  max_scene_memories: int = 50
183
- use_llm_summarization: bool = False
189
+ use_llm_summarization: bool = True
184
190
  summary_regenerate_threshold: int = 5
185
191
 
186
192
 
@@ -741,17 +741,14 @@ def guard_router_call(tool_name: str, arguments: Dict[str, Any]) -> Dict[str, An
741
741
  "repo": str(repo_root),
742
742
  })
743
743
  if mode == "deny":
744
- # Even in deny mode a supervisor outage must leave a recovery
745
- # path open: read-only tools cannot violate a contract, and the
746
- # dhee CLI is how the agent repairs the runtime state.
747
744
  command = str(arguments.get("command") or "").strip()
748
- recoverable = tool_name in _READ_TOOL_NAMES or tool_name in _GREP_TOOL_NAMES or (
749
- tool_name in _BASH_TOOL_NAMES and command.startswith("dhee ")
745
+ recoverable = tool_name in {"Read", "Grep"} or (
746
+ tool_name == "Bash" and command.startswith("dhee ")
750
747
  )
751
748
  if recoverable:
752
749
  warning = (
753
750
  "Contract supervisor unavailable; deny mode allowed this "
754
- "read-only/remediation call."
751
+ "native read-only/remediation call."
755
752
  )
756
753
  _record_enforcement_warning(
757
754
  repo_root,
@@ -229,16 +229,10 @@ class SceneProcessor:
229
229
 
230
230
  # Generate summary (LLM when enabled, otherwise deterministic extractive fallback).
231
231
  memories = self.db.get_scene_memories(scene_id)
232
- summary = None
233
- if self.use_llm_summarization and self.llm:
234
- summary = self._summarize_scene(scene, memories)
235
- if not summary:
236
- summary = self._extractive_scene_summary(memories)
232
+ summary = self._generate_scene_summary(scene, memories)
237
233
  if summary:
238
234
  updates["summary"] = summary
239
- # Derive title from summary
240
- title = summary.split(".")[0][:120]
241
- updates["title"] = title
235
+ updates["title"] = self._title_from_summary(summary)
242
236
 
243
237
  if updates:
244
238
  self.db.update_scene(scene_id, updates)
@@ -270,6 +264,77 @@ class SceneProcessor:
270
264
  # Summarization
271
265
  # ------------------------------------------------------------------
272
266
 
267
+ def summarize_scene(self, scene_id: str, *, force: bool = False) -> Optional[str]:
268
+ """Generate and persist a summary for an existing scene."""
269
+ scene = self.db.get_scene(scene_id)
270
+ if not scene:
271
+ return None
272
+ existing = str(scene.get("summary") or "").strip()
273
+ if existing and not force:
274
+ return existing
275
+
276
+ memories = self.db.get_scene_memories(scene_id)
277
+ summary = self._generate_scene_summary(scene, memories)
278
+ if not summary:
279
+ return None
280
+ self.db.update_scene(
281
+ scene_id,
282
+ {
283
+ "summary": summary,
284
+ "title": self._title_from_summary(summary),
285
+ },
286
+ )
287
+ return summary
288
+
289
+ def summarize_unsummarized(
290
+ self,
291
+ *,
292
+ user_id: Optional[str] = None,
293
+ limit: int = 100,
294
+ ) -> Dict[str, Any]:
295
+ """Fill missing scene summaries for a bounded maintenance slice."""
296
+ bounded_limit = max(1, min(int(limit), 2_000))
297
+ scenes = self.db.get_scenes(user_id=user_id, limit=bounded_limit)
298
+ summarized: List[Dict[str, Any]] = []
299
+ skipped_existing = 0
300
+ skipped_empty = 0
301
+
302
+ for scene in scenes:
303
+ if str(scene.get("summary") or "").strip():
304
+ skipped_existing += 1
305
+ continue
306
+ summary = self.summarize_scene(str(scene["id"]), force=True)
307
+ if not summary:
308
+ skipped_empty += 1
309
+ continue
310
+ summarized.append(
311
+ {
312
+ "id": scene.get("id"),
313
+ "title": self._title_from_summary(summary),
314
+ }
315
+ )
316
+
317
+ return {
318
+ "scanned_count": len(scenes),
319
+ "summarized_count": len(summarized),
320
+ "skipped_existing": skipped_existing,
321
+ "skipped_empty": skipped_empty,
322
+ "summaries": summarized[:50],
323
+ "truncated_summaries": max(0, len(summarized) - 50),
324
+ }
325
+
326
+ def _generate_scene_summary(
327
+ self,
328
+ scene: Dict[str, Any],
329
+ memories: List[Dict[str, Any]],
330
+ ) -> Optional[str]:
331
+ summary = None
332
+ if self.use_llm_summarization and self.llm:
333
+ summary = self._summarize_scene(scene, memories)
334
+ if not summary:
335
+ summary = self._extractive_scene_summary(memories)
336
+ return summary
337
+
273
338
  def _summarize_scene(
274
339
  self, scene: Dict[str, Any], memories: List[Dict[str, Any]]
275
340
  ) -> Optional[str]:
@@ -319,6 +384,14 @@ class SceneProcessor:
319
384
  return None
320
385
  return " | ".join(snippets)
321
386
 
387
+ @staticmethod
388
+ def _title_from_summary(summary: str) -> str:
389
+ cleaned = " ".join(str(summary or "").split())
390
+ if not cleaned:
391
+ return "Untitled scene"
392
+ first_sentence = cleaned.split(".")[0].strip()
393
+ return (first_sentence or cleaned)[:120]
394
+
322
395
  # ------------------------------------------------------------------
323
396
  # Search
324
397
  # ------------------------------------------------------------------
@@ -49,6 +49,7 @@ class DoctorReport:
49
49
  generated_at: float = 0.0
50
50
  core: dict[str, Any] = field(default_factory=dict)
51
51
  runtime: dict[str, Any] = field(default_factory=dict)
52
+ provider_health: dict[str, Any] = field(default_factory=dict)
52
53
  router: dict[str, Any] = field(default_factory=dict)
53
54
  context: dict[str, Any] = field(default_factory=dict)
54
55
  cognition: dict[str, Any] = field(default_factory=dict)
@@ -62,6 +63,7 @@ class DoctorReport:
62
63
  "generated_at": self.generated_at,
63
64
  "core": self.core,
64
65
  "runtime": self.runtime,
66
+ "provider_health": self.provider_health,
65
67
  "router": self.router,
66
68
  "context": self.context,
67
69
  "cognition": self.cognition,
@@ -123,6 +125,61 @@ def _runtime_section() -> dict[str, Any]:
123
125
  return {"error": f"{type(exc).__name__}: {exc}"}
124
126
 
125
127
 
128
+ def _provider_health_section() -> dict[str, Any]:
129
+ try:
130
+ from dhee.cli_config import get_api_key, load_config
131
+ from dhee.provider_defaults import provider_defaults
132
+ except Exception as exc:
133
+ return {"ok": False, "status": "config_error", "error": f"{type(exc).__name__}: {exc}"}
134
+
135
+ config = load_config()
136
+ provider = str(config.get("provider") or "nvidia").strip().lower()
137
+ defaults = provider_defaults(provider)
138
+ model = str(config.get("llm_model") or defaults.get("llm_model") or "").strip()
139
+ if provider != "nvidia":
140
+ return {
141
+ "ok": None,
142
+ "status": "not_implemented",
143
+ "provider": provider,
144
+ "model": model,
145
+ }
146
+
147
+ api_key = get_api_key(provider)
148
+ if not api_key:
149
+ return {
150
+ "ok": False,
151
+ "status": "missing_api_key",
152
+ "provider": provider,
153
+ "model": model,
154
+ "required_env": defaults.get("env_var"),
155
+ }
156
+
157
+ try:
158
+ from dhee.llms.nvidia import NvidiaLLM
159
+
160
+ llm = NvidiaLLM(
161
+ {
162
+ "api_key": api_key,
163
+ "model": model,
164
+ "temperature": 0,
165
+ "max_tokens": 2,
166
+ "timeout": 8,
167
+ "max_retries": 0,
168
+ "app_retries": 1,
169
+ }
170
+ )
171
+ return llm.ping()
172
+ except Exception as exc:
173
+ return {
174
+ "ok": False,
175
+ "status": "unavailable",
176
+ "provider": provider,
177
+ "model": model,
178
+ "error_type": type(exc).__name__,
179
+ "error": str(exc),
180
+ }
181
+
182
+
126
183
  def _context_section() -> dict[str, Any]:
127
184
  out: dict[str, Any] = {}
128
185
  try:
@@ -597,6 +654,7 @@ def build_report() -> DoctorReport:
597
654
 
598
655
  core = _core_section()
599
656
  runtime = _runtime_section()
657
+ provider_health = _provider_health_section()
600
658
  router = _router_section()
601
659
  context = _context_section()
602
660
  cognition = _cognition_section()
@@ -609,6 +667,7 @@ def build_report() -> DoctorReport:
609
667
  generated_at=time.time(),
610
668
  core=core,
611
669
  runtime=runtime,
670
+ provider_health=provider_health,
612
671
  router=router,
613
672
  context=context,
614
673
  cognition=cognition,
@@ -627,6 +686,7 @@ def format_human(report: DoctorReport) -> str:
627
686
  lines: list[str] = []
628
687
  core = report.core
629
688
  runtime = report.runtime
689
+ provider_health = report.provider_health
630
690
  router = report.router
631
691
  context = report.context
632
692
  cog = report.cognition
@@ -674,6 +734,17 @@ def format_human(report: DoctorReport) -> str:
674
734
  lines.append(f" runtime dir: {paths.get('runtime_dir')}")
675
735
  lines.append("")
676
736
 
737
+ # Provider health
738
+ lines.append("[ provider health ]")
739
+ lines.append(f" provider: {provider_health.get('provider', '?')}")
740
+ lines.append(f" model: {provider_health.get('model', '?')}")
741
+ lines.append(f" status: {provider_health.get('status', '?')}")
742
+ if provider_health.get("latency_ms") is not None:
743
+ lines.append(f" latency: {provider_health.get('latency_ms')} ms")
744
+ if provider_health.get("error_type"):
745
+ lines.append(f" error: {provider_health.get('error_type')}: {provider_health.get('error')}")
746
+ lines.append("")
747
+
677
748
  # Router
678
749
  lines.append("[ router ]")
679
750
  if "error" in router:
@@ -1,7 +1,7 @@
1
1
  import logging
2
2
  import os
3
3
  import time
4
- from typing import Optional
4
+ from typing import Any, Dict, Optional
5
5
 
6
6
  from dhee.llms.base import BaseLLM
7
7
  from dhee.provider_defaults import DEFAULT_NVIDIA_LLM_MODEL
@@ -59,6 +59,40 @@ class NvidiaLLM(BaseLLM):
59
59
  self.top_p = self.config.get("top_p", 0.7)
60
60
  self.enable_thinking = self.config.get("enable_thinking", False)
61
61
 
62
+ def ping(self) -> Dict[str, Any]:
63
+ """Check that the configured NVIDIA model accepts a minimal chat call."""
64
+ started = time.perf_counter()
65
+ try:
66
+ response = self.client.chat.completions.create(
67
+ model=self.model,
68
+ messages=[{"role": "user", "content": "Reply with OK."}],
69
+ temperature=0,
70
+ top_p=1,
71
+ max_tokens=2,
72
+ stream=False,
73
+ )
74
+ content = ""
75
+ if getattr(response, "choices", None):
76
+ content = str(response.choices[0].message.content or "").strip()
77
+ return {
78
+ "ok": True,
79
+ "status": "ready",
80
+ "provider": "nvidia",
81
+ "model": self.model,
82
+ "latency_ms": round((time.perf_counter() - started) * 1000, 2),
83
+ "response_preview": content[:20],
84
+ }
85
+ except Exception as exc:
86
+ return {
87
+ "ok": False,
88
+ "status": "unavailable",
89
+ "provider": "nvidia",
90
+ "model": self.model,
91
+ "latency_ms": round((time.perf_counter() - started) * 1000, 2),
92
+ "error_type": type(exc).__name__,
93
+ "error": str(exc),
94
+ }
95
+
62
96
  def generate(self, prompt: str) -> str:
63
97
  from openai import APITimeoutError, APIConnectionError
64
98
 
@@ -6,11 +6,14 @@ import logging
6
6
  import math
7
7
  import os
8
8
  import re
9
+ import shutil
10
+ import sqlite3
9
11
  import time
10
12
  import uuid
11
13
  from dataclasses import dataclass
12
14
  from datetime import datetime, date, timezone
13
15
  from enum import Enum
16
+ from pathlib import Path
14
17
  from typing import Any, Dict, List, Optional, Tuple, Union
15
18
 
16
19
  from dhee.configs.base import MemoryConfig
@@ -77,6 +80,19 @@ from dhee.utils.prompts import AGENT_MEMORY_EXTRACTION_PROMPT, MEMORY_EXTRACTION
77
80
 
78
81
  logger = logging.getLogger(__name__)
79
82
 
83
+ _SCENE_BENCHMARK_NOISE_RE = re.compile(
84
+ r"\b(?:you are fixing a real bug|benchmark prompt|swe-bench|fail[- ]to[- ]pass)\b",
85
+ re.IGNORECASE,
86
+ )
87
+ _SCENE_OPERATIONAL_VERB_RE = re.compile(
88
+ r"^\s*(?:edited|wrote|created|updated|modified|touched)\s+(.{1,240})\s*$",
89
+ re.IGNORECASE,
90
+ )
91
+ _SCENE_PATH_HINT_RE = re.compile(
92
+ r"(?:^|\s)(?:/|~/|\./|[\w.-]+\.(?:py|js|ts|tsx|jsx|go|rs|java|rb|php|sh|sql|toml|yaml|yml|json|md)\b)",
93
+ re.IGNORECASE,
94
+ )
95
+
80
96
  # ---------------------------------------------------------------------------
81
97
  # Inline helpers (formerly in deleted core/acceptance and core/policy modules)
82
98
  # ---------------------------------------------------------------------------
@@ -1159,11 +1175,17 @@ class FullMemory(SmartMemory, SceneProfileMixin):
1159
1175
  max_batches: int = 5,
1160
1176
  ) -> Dict[str, Any]:
1161
1177
  """Batch-enrich memories that were stored with deferred enrichment."""
1162
- return self._write_pipeline.enrich_pending(
1178
+ result = self._write_pipeline.enrich_pending(
1163
1179
  user_id=user_id,
1164
1180
  batch_size=batch_size,
1165
1181
  max_batches=max_batches,
1166
1182
  )
1183
+ if self.scene_processor:
1184
+ result["scene_summaries"] = self.scene_processor.summarize_unsummarized(
1185
+ user_id=user_id,
1186
+ limit=max(1, min(int(batch_size) * int(max_batches), 500)),
1187
+ )
1188
+ return result
1167
1189
 
1168
1190
  def reextract(
1169
1191
  self,
@@ -1953,6 +1975,146 @@ class FullMemory(SmartMemory, SceneProfileMixin):
1953
1975
  break
1954
1976
  return memories
1955
1977
 
1978
+ @staticmethod
1979
+ def _scene_noise_kind(scene: Dict[str, Any]) -> Optional[str]:
1980
+ title = str(scene.get("title") or "").strip()
1981
+ summary = str(scene.get("summary") or "").strip()
1982
+ topic = str(scene.get("topic") or "").strip()
1983
+ text = "\n".join(part for part in (title, summary, topic) if part)
1984
+ if not text:
1985
+ return None
1986
+ if _SCENE_BENCHMARK_NOISE_RE.search(text):
1987
+ return "benchmark_prompt_scene"
1988
+ operational = _SCENE_OPERATIONAL_VERB_RE.match(title)
1989
+ if operational and _SCENE_PATH_HINT_RE.search(operational.group(1)):
1990
+ return "operational_scene"
1991
+ return None
1992
+
1993
+ def _scene_noise_candidates(
1994
+ self,
1995
+ *,
1996
+ user_id: Optional[str],
1997
+ limit: int,
1998
+ ) -> List[Dict[str, Any]]:
1999
+ bounded_limit = max(1, min(int(limit), 50_000))
2000
+ query = """
2001
+ SELECT id, user_id, title, summary, topic, start_time, end_time
2002
+ FROM scenes
2003
+ WHERE tombstone = 0
2004
+ """
2005
+ params: List[Any] = []
2006
+ if user_id:
2007
+ query += " AND user_id = ?"
2008
+ params.append(user_id)
2009
+ query += " ORDER BY start_time DESC LIMIT ?"
2010
+ params.append(bounded_limit)
2011
+ with self.db._get_connection() as conn:
2012
+ rows = [dict(row) for row in conn.execute(query, params).fetchall()]
2013
+
2014
+ candidates: List[Dict[str, Any]] = []
2015
+ for row in rows:
2016
+ kind = self._scene_noise_kind(row)
2017
+ if not kind:
2018
+ continue
2019
+ row["noise_kind"] = kind
2020
+ candidates.append(row)
2021
+ return candidates
2022
+
2023
+ def _backup_history_db(self, reason: str) -> Optional[str]:
2024
+ raw_path = getattr(self.config, "history_db_path", None)
2025
+ if not raw_path:
2026
+ return None
2027
+ db_path = Path(str(raw_path)).expanduser().resolve()
2028
+ if not db_path.exists():
2029
+ return None
2030
+ timestamp = datetime.now(timezone.utc).strftime("%Y%m%dT%H%M%SZ")
2031
+ backup_dir = db_path.parent / "backups"
2032
+ backup_dir.mkdir(parents=True, exist_ok=True)
2033
+ backup_path = backup_dir / f"{db_path.stem}-{reason}-{timestamp}{db_path.suffix}"
2034
+ shutil.copy2(db_path, backup_path)
2035
+ return str(backup_path)
2036
+
2037
+ def _tombstone_scene_noise(
2038
+ self,
2039
+ candidates: List[Dict[str, Any]],
2040
+ *,
2041
+ dry_run: bool,
2042
+ ) -> Dict[str, Any]:
2043
+ counts = {
2044
+ "scene_noise_tombstoned": 0,
2045
+ "operational_scenes_tombstoned": 0,
2046
+ "benchmark_scenes_tombstoned": 0,
2047
+ "scene_noise_events_written": 0,
2048
+ }
2049
+ if not candidates:
2050
+ return {**counts, "scene_noise_backup": None}
2051
+
2052
+ for scene in candidates:
2053
+ if scene["noise_kind"] == "operational_scene":
2054
+ counts["operational_scenes_tombstoned"] += 1
2055
+ elif scene["noise_kind"] == "benchmark_prompt_scene":
2056
+ counts["benchmark_scenes_tombstoned"] += 1
2057
+ counts["scene_noise_tombstoned"] = len(candidates)
2058
+ if dry_run:
2059
+ return {**counts, "scene_noise_backup": None}
2060
+
2061
+ backup_path = self._backup_history_db("scene-noise")
2062
+ now = datetime.now(timezone.utc).isoformat()
2063
+ events: List[Dict[str, Any]] = []
2064
+ for scene in candidates:
2065
+ scene_id = str(scene["id"])
2066
+ event_time = str(scene.get("start_time") or scene.get("end_time") or now)
2067
+ event_type = (
2068
+ "operational_event"
2069
+ if scene["noise_kind"] == "operational_scene"
2070
+ else "test_fixture"
2071
+ )
2072
+ value_text = str(scene.get("title") or scene.get("summary") or scene_id)
2073
+ events.append(
2074
+ {
2075
+ "id": f"scene-noise:{scene_id}",
2076
+ "memory_id": f"scene:{scene_id}",
2077
+ "user_id": scene.get("user_id") or "default",
2078
+ "conversation_id": None,
2079
+ "session_id": None,
2080
+ "turn_id": 0,
2081
+ "actor_id": "dhee_scene_repair",
2082
+ "actor_role": "maintenance",
2083
+ "event_time": event_time,
2084
+ "event_type": event_type,
2085
+ "canonical_key": f"scene_noise:{scene['noise_kind']}:{scene_id}",
2086
+ "value_text": value_text,
2087
+ "value_num": None,
2088
+ "value_unit": None,
2089
+ "currency": None,
2090
+ "normalized_time_start": event_time,
2091
+ "normalized_time_end": event_time,
2092
+ "time_granularity": "instant",
2093
+ "entity_key": str(scene.get("topic") or scene.get("title") or scene_id)[:240],
2094
+ "value_norm": " ".join(value_text.lower().split())[:500],
2095
+ "confidence": 1.0,
2096
+ "superseded_by": None,
2097
+ }
2098
+ )
2099
+ counts["scene_noise_events_written"] = self.db.add_episodic_events(events)
2100
+ scene_ids = [(str(scene["id"]),) for scene in candidates]
2101
+ with self.db._get_connection() as conn:
2102
+ conn.executemany(
2103
+ "UPDATE scenes SET tombstone = 1, strength = 0.0 WHERE id = ?",
2104
+ scene_ids,
2105
+ )
2106
+ try:
2107
+ conn.executemany(
2108
+ "UPDATE memories SET scene_id = NULL WHERE scene_id = ?",
2109
+ scene_ids,
2110
+ )
2111
+ except sqlite3.OperationalError as exc:
2112
+ if "no such column" not in str(exc).lower():
2113
+ raise
2114
+ with self.db._get_connection() as conn:
2115
+ conn.execute("VACUUM")
2116
+ return {**counts, "scene_noise_backup": backup_path}
2117
+
1956
2118
  def get_stats(self, user_id: Optional[str] = None, agent_id: Optional[str] = None) -> Dict[str, Any]:
1957
2119
  memories = self._get_quality_health_memories(user_id=user_id, agent_id=agent_id)
1958
2120
  sml_count = sum(1 for m in memories if m.get("layer") == "sml")
@@ -2094,6 +2256,9 @@ class FullMemory(SmartMemory, SceneProfileMixin):
2094
2256
  "evidence_without_distillation": 0,
2095
2257
  "contract_repairs_available": 0,
2096
2258
  "profile_contamination": 0,
2259
+ "scene_noise": 0,
2260
+ "operational_scene_noise": 0,
2261
+ "benchmark_scene_noise": 0,
2097
2262
  }
2098
2263
  samples: Dict[str, List[Dict[str, Any]]] = {
2099
2264
  "unresolved_test_noise": [],
@@ -2104,6 +2269,7 @@ class FullMemory(SmartMemory, SceneProfileMixin):
2104
2269
  "damaged_canonical": [],
2105
2270
  "evidence_without_distillation": [],
2106
2271
  "profile_contamination": [],
2272
+ "scene_noise": [],
2107
2273
  }
2108
2274
 
2109
2275
  def _sample(memory: Dict[str, Any], issue: str, updates: List[str]) -> None:
@@ -2242,6 +2408,26 @@ class FullMemory(SmartMemory, SceneProfileMixin):
2242
2408
  }
2243
2409
  )
2244
2410
 
2411
+ scene_noise = self._scene_noise_candidates(user_id=user_id, limit=limit)
2412
+ counts["scene_noise"] = len(scene_noise)
2413
+ for scene in scene_noise:
2414
+ if scene["noise_kind"] == "operational_scene":
2415
+ counts["operational_scene_noise"] += 1
2416
+ elif scene["noise_kind"] == "benchmark_prompt_scene":
2417
+ counts["benchmark_scene_noise"] += 1
2418
+ bucket = samples.setdefault("scene_noise", [])
2419
+ if len(bucket) < 8:
2420
+ bucket.append(
2421
+ {
2422
+ "id": scene.get("id"),
2423
+ "user_id": scene.get("user_id"),
2424
+ "noise_kind": scene.get("noise_kind"),
2425
+ "title": scene.get("title"),
2426
+ }
2427
+ )
2428
+ if scene_noise:
2429
+ counts["contract_repairs_available"] += len(scene_noise)
2430
+
2245
2431
  checks: List[Dict[str, Any]] = []
2246
2432
 
2247
2433
  def _check(name: str, passed: bool, severity: str, detail: str) -> None:
@@ -2323,6 +2509,12 @@ class FullMemory(SmartMemory, SceneProfileMixin):
2323
2509
  "critical",
2324
2510
  f"{counts['profile_contamination']} derived profile anchors contain tool/test/doc noise.",
2325
2511
  )
2512
+ _check(
2513
+ "no_scene_noise",
2514
+ counts["scene_noise"] == 0,
2515
+ "critical",
2516
+ f"{counts['scene_noise']} operational/test prompt scenes remain active.",
2517
+ )
2326
2518
 
2327
2519
  failed_critical = [check for check in checks if check["severity"] == "critical" and not check["passed"]]
2328
2520
  failed_warnings = [check for check in checks if check["severity"] == "warning" and not check["passed"]]
@@ -2335,6 +2527,8 @@ class FullMemory(SmartMemory, SceneProfileMixin):
2335
2527
  recommended_actions.append("Run repair_memory_quality with dry_run=false, then rerun this audit.")
2336
2528
  if counts["degraded_or_queued"]:
2337
2529
  recommended_actions.append("Run enrich_pending after repair to reconcile queued/degraded rows.")
2530
+ if counts["scene_noise"]:
2531
+ recommended_actions.append("Run repair_memory_quality with dry_run=false to tombstone operational/test prompt scenes.")
2338
2532
  if require_personal_model and counts["canonical_personal"] == 0:
2339
2533
  recommended_actions.append("Ingest explicit goals, preferences, decisions, style, and product philosophy as canonical personal memories.")
2340
2534
  if profile_l and counts["canonical_profile_matches"] == 0:
@@ -2404,6 +2598,10 @@ class FullMemory(SmartMemory, SceneProfileMixin):
2404
2598
  "queued_reopened": 0,
2405
2599
  "malformed_metadata_normalized": 0,
2406
2600
  "profiles_cleaned": 0,
2601
+ "scene_noise_tombstoned": 0,
2602
+ "operational_scenes_tombstoned": 0,
2603
+ "benchmark_scenes_tombstoned": 0,
2604
+ "scene_noise_events_written": 0,
2407
2605
  }
2408
2606
  for memory in memories:
2409
2607
  raw_metadata = memory.get("metadata")
@@ -2520,11 +2718,31 @@ class FullMemory(SmartMemory, SceneProfileMixin):
2520
2718
  if not dry_run:
2521
2719
  self.db.update_profile(str(profile["id"]), updates)
2522
2720
 
2721
+ scene_noise = self._scene_noise_candidates(user_id=user_id, limit=limit)
2722
+ for scene in scene_noise:
2723
+ repaired.append(
2724
+ {
2725
+ "id": scene.get("id"),
2726
+ "memory_class": scene.get("noise_kind"),
2727
+ "updates": ["tombstone", "episodic_event"],
2728
+ "title": scene.get("title"),
2729
+ }
2730
+ )
2731
+ scene_repair = self._tombstone_scene_noise(scene_noise, dry_run=dry_run)
2732
+ for key in (
2733
+ "scene_noise_tombstoned",
2734
+ "operational_scenes_tombstoned",
2735
+ "benchmark_scenes_tombstoned",
2736
+ "scene_noise_events_written",
2737
+ ):
2738
+ counts[key] = int(scene_repair.get(key, 0) or 0)
2739
+
2523
2740
  result = {
2524
2741
  "dry_run": dry_run,
2525
2742
  "scanned_count": len(memories),
2526
2743
  "repair_count": len(repaired),
2527
2744
  **counts,
2745
+ "scene_noise_backup": scene_repair.get("scene_noise_backup"),
2528
2746
  "repairs": repaired[:200],
2529
2747
  "truncated_repairs": max(0, len(repaired) - 200),
2530
2748
  }
@@ -8,7 +8,7 @@ from typing import Any, Dict, Optional
8
8
  DEFAULT_PROVIDER = "nvidia"
9
9
  DEFAULT_COLLECTION = "dhee"
10
10
 
11
- DEFAULT_NVIDIA_LLM_MODEL = "moonshotai/kimi-k2.5"
11
+ DEFAULT_NVIDIA_LLM_MODEL = "moonshotai/kimi-k2.6"
12
12
  DEFAULT_NVIDIA_EMBEDDER_MODEL = "nvidia/llama-nemotron-embed-vl-1b-v2"
13
13
  DEFAULT_NVIDIA_RERANK_MODEL = "nvidia/llama-nemotron-rerank-vl-1b-v2"
14
14
  DEFAULT_NVIDIA_EMBEDDING_DIMS = 2048