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.
- {dhee-7.2.4/dhee.egg-info → dhee-7.2.5}/PKG-INFO +1 -1
- {dhee-7.2.4 → dhee-7.2.5}/dhee/__init__.py +1 -1
- {dhee-7.2.4 → dhee-7.2.5}/dhee/configs/base.py +9 -3
- {dhee-7.2.4 → dhee-7.2.5}/dhee/contract_runtime.py +3 -6
- {dhee-7.2.4 → dhee-7.2.5}/dhee/core/scene.py +81 -8
- {dhee-7.2.4 → dhee-7.2.5}/dhee/doctor.py +71 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/llms/nvidia.py +35 -1
- {dhee-7.2.4 → dhee-7.2.5}/dhee/memory/main.py +219 -1
- {dhee-7.2.4 → dhee-7.2.5}/dhee/provider_defaults.py +1 -1
- {dhee-7.2.4 → dhee-7.2.5}/dhee/router/handlers.py +27 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/simple.py +17 -3
- {dhee-7.2.4 → dhee-7.2.5}/dhee/verification_runner.py +20 -1
- {dhee-7.2.4 → dhee-7.2.5/dhee.egg-info}/PKG-INFO +1 -1
- {dhee-7.2.4 → dhee-7.2.5}/dhee.egg-info/SOURCES.txt +3 -0
- {dhee-7.2.4 → dhee-7.2.5}/pyproject.toml +1 -1
- dhee-7.2.5/tests/test_data_dir_paths.py +29 -0
- dhee-7.2.5/tests/test_nvidia_llm.py +59 -0
- {dhee-7.2.4 → dhee-7.2.5}/tests/test_packaging.py +1 -1
- dhee-7.2.5/tests/test_scene_maintenance.py +73 -0
- {dhee-7.2.4 → dhee-7.2.5}/LICENSE +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/MANIFEST.in +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/README.md +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/adapters/__init__.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/adapters/gstack.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/adapters/gstack_parser.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/agent_runtime/__init__.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/agent_runtime/auth.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/agent_runtime/client.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/agent_runtime/events.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/agent_runtime/models.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/agent_runtime/policy.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/agent_runtime/run.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/agent_runtime/server.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/agent_runtime/tools.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/benchmarks/__init__.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/benchmarks/arc_agi.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/benchmarks/decades.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/benchmarks/hippocamp.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/benchmarks/longmemeval.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/benchmarks/phase0_context_audit.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/benchmarks/portability.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/benchmarks/raw_extractors.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/benchmarks/replay_corpus.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/benchmarks/router_replay.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/checkpoint_runtime.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/cli.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/cli_config.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/cli_mcp.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/cli_onboard.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/cli_pretty.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/cli_setup.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/cli_update.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/configs/__init__.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/configs/active.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/configs/presets.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/context_ir.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/context_kernel.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/context_state.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/contract_supervisor.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/core/__init__.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/core/alaya.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/core/answer_orchestration.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/core/artifacts.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/core/belief.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/core/buddhi.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/core/category.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/core/codex_artifacts.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/core/codex_stream.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/core/cognition.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/core/cognition_kernel.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/core/conflict.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/core/context_bootstrap.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/core/contrastive.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/core/decay.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/core/distillation.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/core/echo.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/core/engram.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/core/engram_consolidator.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/core/engram_extractor.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/core/engram_tiering.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/core/engram_verification.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/core/enrichment.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/core/episode.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/core/episodic_index.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/core/evolution.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/core/file_baseline.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/core/file_read_tracker.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/core/forgetting.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/core/fusion.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/core/graph.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/core/handoff_snapshot.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/core/heuristic.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/core/intent.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/core/intention.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/core/kernel.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/core/learnings.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/core/live_context.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/core/log_parser.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/core/meta_buddhi.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/core/pattern_detector.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/core/policy.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/core/profile.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/core/provenance.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/core/resolvers.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/core/retrieval.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/core/samskara.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/core/session_tracker.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/core/shared_tasks.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/core/strategy.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/core/task_state.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/core/thread_state.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/core/traces.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/core/trigger.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/core/viveka.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/core/workspace_line.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/core/workspace_line_bus.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/db/__init__.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/db/sqlite.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/db/sqlite_analytics.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/db/sqlite_artifacts.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/db/sqlite_common.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/db/sqlite_domains.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/debugger_api.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/demo.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/embeddings/__init__.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/embeddings/base.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/embeddings/gemini.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/embeddings/nvidia.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/embeddings/ollama.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/embeddings/openai.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/embeddings/qwen.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/embeddings/simple.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/exceptions.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/fs/__init__.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/fs/mounts.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/fs/types.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/fs/uri.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/fs/workspace.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/graph_projection_hardening.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/graph_proof_bundle.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/harness/__init__.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/harness/base.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/harness/claude_code.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/harness/codex.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/harness/install.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/hooks/__init__.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/hooks/claude_code/__init__.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/hooks/claude_code/__main__.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/hooks/claude_code/assembler.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/hooks/claude_code/chunker.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/hooks/claude_code/ingest.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/hooks/claude_code/install.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/hooks/claude_code/migrate.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/hooks/claude_code/privacy.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/hooks/claude_code/renderer.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/hooks/claude_code/signal.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/hooks/scene_world.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/incremental_context.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/install_cleanup.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/integrations/__init__.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/integrations/context_sources.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/integrations/hermes.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/integrations/hermes_provider/__init__.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/integrations/hermes_provider/provider.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/llms/__init__.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/llms/anthropic.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/llms/base.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/llms/dhee.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/llms/gemini.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/llms/mock.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/llms/ollama.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/llms/openai.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/llms/teacher_logger.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/mcp_registry.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/mcp_server.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/mcp_slim.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/memory/__init__.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/memory/admission.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/memory/base.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/memory/core.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/memory/cost.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/memory/episodic.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/memory/narrative_scene.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/memory/orchestration.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/memory/parallel.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/memory/projects.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/memory/quality.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/memory/reranker.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/memory/retrieval_helpers.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/memory/scene_profile.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/memory/scoping.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/memory/search_pipeline.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/memory/smart.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/memory/tasks.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/memory/utils.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/memory/vectors.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/memory/write_pipeline.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/mini/__init__.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/mini/karma_evaluator.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/mini/progressive_trainer.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/mini/replay_gate.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/observability.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/patch_families.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/plugin.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/profiles/__init__.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/profiles/elevenlabs.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/profiles/gemini.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/profiles/openai.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/protocol/__init__.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/protocol/v1.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/providers/__init__.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/providers/base.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/providers/elevenlabs.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/providers/gemini.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/providers/openai.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/release_hygiene.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/replay_branching.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/repo_intelligence.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/repo_link.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/router/__init__.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/router/agent_digest.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/router/bash_digest.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/router/bootstrap.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/router/critical_surface.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/router/digest.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/router/edit_ledger.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/router/grep_digest.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/router/install.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/router/intent.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/router/policy.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/router/pre_tool_gate.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/router/ptr_store.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/router/quality_report.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/router/stats.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/router/tune.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/runtime.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/runtime_daemon.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/runtime_io.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/schemas/__init__.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/schemas/narrative.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/schemas/scene_card.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/secret_store.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/skills/__init__.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/skills/discovery.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/skills/executor.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/skills/hashing.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/skills/miner.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/skills/outcomes.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/skills/schema.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/skills/store.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/skills/structure.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/skills/trajectory.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/task_contracts.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/temporal_fact_integration.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/temporal_fact_ledger.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/temporal_scenes.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/training/__init__.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/training/data_formatter.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/training/karma.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/training/nididhyasana.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/training/smrti.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/training/train.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/__init__.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/cli.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/server.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/dist/assets/CanvasView-Cl1HxIK0.js +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/dist/assets/index-BboZhdsv.js +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/dist/assets/index-CIsLOp4u.css +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/dist/dhee-logo.png +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/dist/index.html +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/index.html +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/package-lock.json +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/package.json +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/public/dhee-logo.png +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/src/App.js +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/src/App.tsx +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/src/api.js +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/src/api.ts +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/src/components/AssetDrawer.js +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/src/components/AssetDrawer.tsx +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/src/components/ChatMessage.js +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/src/components/ChatMessage.tsx +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/src/components/FirstRunPanel.js +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/src/components/FirstRunPanel.tsx +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/src/components/LinePanel.js +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/src/components/LinePanel.tsx +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/src/components/NavRail.js +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/src/components/NavRail.tsx +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/src/components/OrgDrawer.js +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/src/components/OrgDrawer.tsx +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/src/components/TopBar.js +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/src/components/TopBar.tsx +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/src/components/TweaksPanel.js +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/src/components/TweaksPanel.tsx +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/src/components/WorkspaceManagerModal.js +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/src/components/WorkspaceManagerModal.tsx +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/src/components/canvas/CanvasControls.js +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/src/components/canvas/CanvasControls.tsx +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/src/components/canvas/CanvasSkeleton.js +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/src/components/canvas/CanvasSkeleton.tsx +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/src/components/canvas/DirectionHints.js +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/src/components/canvas/DirectionHints.tsx +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/src/components/canvas/Minimap.js +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/src/components/canvas/Minimap.tsx +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/src/components/canvas/NodeCard.js +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/src/components/canvas/NodeCard.tsx +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/src/components/canvas/forceLayout.js +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/src/components/canvas/forceLayout.ts +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/src/components/canvas/layout.js +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/src/components/canvas/layout.ts +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/src/components/canvas/treeLayout.js +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/src/components/canvas/treeLayout.ts +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/src/components/canvas/useInfiniteCanvas.js +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/src/components/canvas/useInfiniteCanvas.ts +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/src/components/cards/Cards.js +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/src/components/cards/Cards.tsx +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/src/components/graph/CanvasNodeCard.js +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/src/components/graph/CanvasNodeCard.tsx +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/src/components/ui/DecayBar.js +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/src/components/ui/DecayBar.tsx +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/src/components/ui/Markdown.js +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/src/components/ui/Markdown.tsx +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/src/components/ui/SectionHeader.js +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/src/components/ui/SectionHeader.tsx +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/src/components/ui/StatPill.js +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/src/components/ui/StatPill.tsx +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/src/components/ui/TierBadge.js +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/src/components/ui/TierBadge.tsx +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/src/main.js +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/src/main.tsx +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/src/styles.css +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/src/types.js +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/src/types.ts +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/src/views/CanvasView.js +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/src/views/CanvasView.tsx +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/src/views/ChannelView.js +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/src/views/ChannelView.tsx +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/src/views/ConflictView.js +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/src/views/ConflictView.tsx +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/src/views/ContextView.js +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/src/views/ContextView.tsx +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/src/views/EvolutionView.js +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/src/views/EvolutionView.tsx +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/src/views/LaunchView.js +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/src/views/LaunchView.tsx +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/src/views/MemoryView.js +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/src/views/MemoryView.tsx +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/src/views/NotepadView.js +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/src/views/NotepadView.tsx +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/src/views/OrgCanvas.js +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/src/views/OrgCanvas.tsx +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/src/views/ProductViews.js +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/src/views/ProductViews.tsx +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/src/views/RouterView.js +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/src/views/RouterView.tsx +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/src/views/TasksView.js +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/src/views/TasksView.tsx +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/src/views/WorkspaceView.js +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/src/views/WorkspaceView.tsx +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/tsconfig.json +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/ui/web/vite.config.ts +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/update_capsules.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/utils/__init__.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/utils/factory.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/utils/math.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/utils/prompts.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/utils/repo_identity.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/vector_stores/__init__.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/vector_stores/base.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/vector_stores/memory.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/vector_stores/sqlite_vec.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/vector_stores/zvec_store.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/verifier_engine.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/webhooks/__init__.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/webhooks/elevenlabs.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/world_memory/__init__.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/world_memory/capture_store.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/world_memory/causal_graph.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/world_memory/encoder.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/world_memory/gem_extractor.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/world_memory/predictor.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/world_memory/schema.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/world_memory/service.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/world_memory/session_graph.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee/world_memory/store.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee.egg-info/dependency_links.txt +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee.egg-info/entry_points.txt +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee.egg-info/requires.txt +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee.egg-info/top_level.txt +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee_shared/__init__.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/dhee_shared/model_paths.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/engram/__init__.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/engram-bus/engram_bus/__init__.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/engram-bus/engram_bus/bus.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/engram-bus/engram_bus/pubsub.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/engram-bus/engram_bus/server.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/engram-bus/engram_bus/store.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/engram-bus/engram_bus/workspace.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/setup.cfg +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/tests/test_accel.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/tests/test_accel_benchmark.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/tests/test_agent_digest.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/tests/test_agent_provider_examples.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/tests/test_agent_runtime_before.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/tests/test_agent_runtime_http_auth.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/tests/test_agent_runtime_lifecycle.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/tests/test_agent_runtime_tool.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/tests/test_agent_runtime_voice_policy.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/tests/test_artifacts.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/tests/test_auto_lifecycle.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/tests/test_backward_compat.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/tests/test_batch.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/tests/test_belief_debugger.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/tests/test_causal_scene_memory.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/tests/test_claude_code_hooks.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/tests/test_cli_config.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/tests/test_cli_harness_commands.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/tests/test_cli_onboard_update.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/tests/test_cli_pretty.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/tests/test_codex_stream.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/tests/test_cognition_evals.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/tests/test_cognition_kernel.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/tests/test_cognition_v3.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/tests/test_context_state.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/tests/test_contract_runtime_recovery.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/tests/test_core_memory.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/tests/test_cosine_similarity.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/tests/test_decades_eval.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/tests/test_dedup.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/tests/test_deferred_enrichment.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/tests/test_demo.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/tests/test_dhee_init.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/tests/test_dhee_model_paths.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/tests/test_dheefs.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/tests/test_distillation.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/tests/test_e2e_all_features.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/tests/test_elevenlabs_cli.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/tests/test_elevenlabs_correction_memory.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/tests/test_elevenlabs_no_secret_storage.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/tests/test_elevenlabs_profile.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/tests/test_elevenlabs_two_call_memory.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/tests/test_elevenlabs_webhook.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/tests/test_engram_tiering.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/tests/test_engram_tiering_promotion.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/tests/test_evolution_meta_loop.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/tests/test_evolution_session_gate.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/tests/test_forgetting.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/tests/test_gemini_provider.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/tests/test_graph_proof_bundle.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/tests/test_gstack_adapter.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/tests/test_handoff_snapshot.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/tests/test_harness_adapters.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/tests/test_harness_install.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/tests/test_hashing.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/tests/test_hermes_provider.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/tests/test_hippocamp_benchmark.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/tests/test_incremental_context.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/tests/test_install_cleanup.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/tests/test_intent.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/tests/test_karma_evaluator.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/tests/test_learnings.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/tests/test_locomo_plus_runner.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/tests/test_log_parser.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/tests/test_longmemeval_config.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/tests/test_mcp_artifact_tools.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/tests/test_mcp_tools_slim.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/tests/test_memory_admission.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/tests/test_memory_os_service.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/tests/test_memory_quality_contract.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/tests/test_memory_types.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/tests/test_meta_buddhi_group_relative.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/tests/test_migration.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/tests/test_miner.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/tests/test_narrative_scene_intelligence.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/tests/test_nvidia_embedder.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/tests/test_openai_provider.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/tests/test_openclaw.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/tests/test_orchestration_core.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/tests/test_oss_61_regressions.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/tests/test_parallel.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/tests/test_patch_families.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/tests/test_plugin_learnings.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/tests/test_portability_eval.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/tests/test_power_packages.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/tests/test_presets.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/tests/test_profile.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/tests/test_progressive_trainer.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/tests/test_projects.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/tests/test_protocol_v1.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/tests/test_provider_runtime_profiles.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/tests/test_query_cache.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/tests/test_release_hygiene.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/tests/test_replay_branching.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/tests/test_replay_corpus_export.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/tests/test_replay_gate.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/tests/test_repo_intelligence.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/tests/test_repo_link.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/tests/test_reranker_defaults.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/tests/test_router.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/tests/test_router_replay.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/tests/test_router_stats_agents.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/tests/test_runtime.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/tests/test_runtime_hardening.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/tests/test_scene.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/tests/test_scene_world_hook.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/tests/test_secret_store.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/tests/test_session_tracker.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/tests/test_shared_tasks.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/tests/test_simple_zero_config.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/tests/test_skills.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/tests/test_smart_memory.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/tests/test_sqlite_connection_pool.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/tests/test_sqlite_vec.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/tests/test_structural.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/tests/test_structured_resolution.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/tests/test_task_contracts.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/tests/test_tasks.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/tests/test_temporal_fact_integration.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/tests/test_temporal_fact_ledger.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/tests/test_temporal_scenes.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/tests/test_thread_state.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/tests/test_traces.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/tests/test_trajectory.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/tests/test_ui.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/tests/test_unified_enrichment.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/tests/test_update_capsules.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/tests/test_vector_store_factory.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/tests/test_verification_runner.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/tests/test_verifier_engine.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/tests/test_workspace_line_agent_emit.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/tests/test_workspace_line_bus.py +0 -0
- {dhee-7.2.4 → dhee-7.2.5}/tests/test_zvec_store.py +0 -0
|
@@ -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
|
|
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 =
|
|
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
|
|
749
|
-
tool_name
|
|
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 =
|
|
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
|
-
|
|
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
|
-
|
|
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.
|
|
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
|