dhee 7.2.0__tar.gz → 7.2.3__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.0/dhee.egg-info → dhee-7.2.3}/PKG-INFO +169 -2
- {dhee-7.2.0 → dhee-7.2.3}/README.md +165 -1
- {dhee-7.2.0 → dhee-7.2.3}/dhee/__init__.py +20 -1
- dhee-7.2.3/dhee/agent_runtime/__init__.py +9 -0
- dhee-7.2.3/dhee/agent_runtime/auth.py +22 -0
- dhee-7.2.3/dhee/agent_runtime/client.py +51 -0
- dhee-7.2.3/dhee/agent_runtime/events.py +10 -0
- dhee-7.2.3/dhee/agent_runtime/models.py +26 -0
- dhee-7.2.3/dhee/agent_runtime/policy.py +89 -0
- dhee-7.2.3/dhee/agent_runtime/run.py +323 -0
- dhee-7.2.3/dhee/agent_runtime/server.py +336 -0
- dhee-7.2.3/dhee/agent_runtime/tools.py +11 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/cli.py +162 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/configs/base.py +1 -1
- {dhee-7.2.0 → dhee-7.2.3}/dhee/context_state.py +23 -8
- {dhee-7.2.0 → dhee-7.2.3}/dhee/contract_runtime.py +85 -2
- {dhee-7.2.0 → dhee-7.2.3}/dhee/core/belief.py +117 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/core/buddhi.py +39 -2
- {dhee-7.2.0 → dhee-7.2.3}/dhee/embeddings/gemini.py +1 -1
- {dhee-7.2.0 → dhee-7.2.3}/dhee/embeddings/ollama.py +1 -1
- {dhee-7.2.0 → dhee-7.2.3}/dhee/embeddings/openai.py +16 -4
- dhee-7.2.3/dhee/llms/anthropic.py +73 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/llms/gemini.py +1 -1
- {dhee-7.2.0 → dhee-7.2.3}/dhee/llms/ollama.py +1 -1
- {dhee-7.2.0 → dhee-7.2.3}/dhee/llms/openai.py +7 -2
- {dhee-7.2.0 → dhee-7.2.3}/dhee/plugin.py +2 -1
- dhee-7.2.3/dhee/profiles/__init__.py +9 -0
- dhee-7.2.3/dhee/profiles/elevenlabs.py +82 -0
- dhee-7.2.3/dhee/profiles/gemini.py +36 -0
- dhee-7.2.3/dhee/profiles/openai.py +63 -0
- dhee-7.2.3/dhee/provider_defaults.py +374 -0
- dhee-7.2.3/dhee/providers/__init__.py +16 -0
- dhee-7.2.3/dhee/providers/base.py +96 -0
- dhee-7.2.3/dhee/providers/elevenlabs.py +329 -0
- dhee-7.2.3/dhee/providers/gemini.py +275 -0
- dhee-7.2.3/dhee/providers/openai.py +262 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/router/pre_tool_gate.py +20 -7
- {dhee-7.2.0 → dhee-7.2.3}/dhee/simple.py +10 -13
- {dhee-7.2.0 → dhee-7.2.3}/dhee/utils/factory.py +4 -0
- dhee-7.2.3/dhee/webhooks/__init__.py +3 -0
- dhee-7.2.3/dhee/webhooks/elevenlabs.py +63 -0
- {dhee-7.2.0 → dhee-7.2.3/dhee.egg-info}/PKG-INFO +169 -2
- {dhee-7.2.0 → dhee-7.2.3}/dhee.egg-info/SOURCES.txt +37 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee.egg-info/requires.txt +4 -0
- {dhee-7.2.0 → dhee-7.2.3}/pyproject.toml +3 -1
- dhee-7.2.3/tests/test_agent_provider_examples.py +200 -0
- dhee-7.2.3/tests/test_agent_runtime_before.py +23 -0
- dhee-7.2.3/tests/test_agent_runtime_http_auth.py +24 -0
- dhee-7.2.3/tests/test_agent_runtime_lifecycle.py +96 -0
- dhee-7.2.3/tests/test_agent_runtime_tool.py +56 -0
- dhee-7.2.3/tests/test_agent_runtime_voice_policy.py +27 -0
- {dhee-7.2.0 → dhee-7.2.3}/tests/test_cognition_kernel.py +157 -0
- dhee-7.2.3/tests/test_contract_runtime_recovery.py +94 -0
- dhee-7.2.3/tests/test_elevenlabs_cli.py +52 -0
- dhee-7.2.3/tests/test_elevenlabs_correction_memory.py +39 -0
- dhee-7.2.3/tests/test_elevenlabs_no_secret_storage.py +39 -0
- dhee-7.2.3/tests/test_elevenlabs_profile.py +29 -0
- dhee-7.2.3/tests/test_elevenlabs_two_call_memory.py +22 -0
- dhee-7.2.3/tests/test_elevenlabs_webhook.py +92 -0
- dhee-7.2.3/tests/test_gemini_provider.py +162 -0
- dhee-7.2.3/tests/test_openai_provider.py +147 -0
- {dhee-7.2.0 → dhee-7.2.3}/tests/test_packaging.py +1 -1
- dhee-7.2.3/tests/test_provider_runtime_profiles.py +114 -0
- dhee-7.2.0/dhee/provider_defaults.py +0 -98
- {dhee-7.2.0 → dhee-7.2.3}/LICENSE +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/MANIFEST.in +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/adapters/__init__.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/adapters/gstack.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/adapters/gstack_parser.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/benchmarks/__init__.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/benchmarks/arc_agi.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/benchmarks/decades.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/benchmarks/hippocamp.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/benchmarks/longmemeval.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/benchmarks/phase0_context_audit.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/benchmarks/portability.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/benchmarks/raw_extractors.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/benchmarks/replay_corpus.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/benchmarks/router_replay.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/checkpoint_runtime.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/cli_config.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/cli_mcp.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/cli_onboard.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/cli_pretty.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/cli_setup.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/cli_update.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/configs/__init__.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/configs/active.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/configs/presets.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/context_ir.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/context_kernel.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/contract_supervisor.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/core/__init__.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/core/alaya.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/core/answer_orchestration.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/core/artifacts.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/core/category.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/core/codex_artifacts.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/core/codex_stream.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/core/cognition.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/core/cognition_kernel.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/core/conflict.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/core/context_bootstrap.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/core/contrastive.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/core/decay.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/core/distillation.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/core/echo.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/core/engram.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/core/engram_consolidator.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/core/engram_extractor.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/core/engram_tiering.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/core/engram_verification.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/core/enrichment.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/core/episode.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/core/episodic_index.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/core/evolution.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/core/file_baseline.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/core/file_read_tracker.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/core/forgetting.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/core/fusion.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/core/graph.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/core/handoff_snapshot.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/core/heuristic.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/core/intent.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/core/intention.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/core/kernel.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/core/learnings.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/core/live_context.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/core/log_parser.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/core/meta_buddhi.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/core/pattern_detector.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/core/policy.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/core/profile.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/core/provenance.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/core/resolvers.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/core/retrieval.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/core/samskara.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/core/scene.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/core/session_tracker.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/core/shared_tasks.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/core/strategy.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/core/task_state.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/core/thread_state.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/core/traces.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/core/trigger.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/core/viveka.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/core/workspace_line.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/core/workspace_line_bus.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/db/__init__.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/db/sqlite.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/db/sqlite_analytics.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/db/sqlite_artifacts.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/db/sqlite_common.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/db/sqlite_domains.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/debugger_api.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/demo.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/doctor.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/embeddings/__init__.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/embeddings/base.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/embeddings/nvidia.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/embeddings/qwen.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/embeddings/simple.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/exceptions.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/fs/__init__.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/fs/mounts.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/fs/types.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/fs/uri.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/fs/workspace.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/graph_projection_hardening.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/graph_proof_bundle.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/harness/__init__.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/harness/base.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/harness/claude_code.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/harness/codex.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/harness/install.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/hooks/__init__.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/hooks/claude_code/__init__.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/hooks/claude_code/__main__.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/hooks/claude_code/assembler.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/hooks/claude_code/chunker.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/hooks/claude_code/ingest.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/hooks/claude_code/install.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/hooks/claude_code/migrate.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/hooks/claude_code/privacy.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/hooks/claude_code/renderer.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/hooks/claude_code/signal.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/hooks/scene_world.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/incremental_context.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/install_cleanup.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/integrations/__init__.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/integrations/context_sources.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/integrations/hermes.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/integrations/hermes_provider/__init__.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/integrations/hermes_provider/provider.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/llms/__init__.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/llms/base.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/llms/dhee.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/llms/mock.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/llms/nvidia.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/llms/teacher_logger.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/mcp_registry.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/mcp_server.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/mcp_slim.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/memory/__init__.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/memory/admission.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/memory/base.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/memory/core.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/memory/cost.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/memory/episodic.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/memory/main.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/memory/narrative_scene.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/memory/orchestration.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/memory/parallel.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/memory/projects.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/memory/quality.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/memory/reranker.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/memory/retrieval_helpers.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/memory/scene_profile.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/memory/scoping.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/memory/search_pipeline.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/memory/smart.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/memory/tasks.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/memory/utils.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/memory/vectors.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/memory/write_pipeline.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/mini/__init__.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/mini/karma_evaluator.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/mini/progressive_trainer.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/mini/replay_gate.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/observability.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/patch_families.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/protocol/__init__.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/protocol/v1.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/release_hygiene.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/replay_branching.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/repo_intelligence.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/repo_link.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/router/__init__.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/router/agent_digest.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/router/bash_digest.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/router/bootstrap.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/router/critical_surface.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/router/digest.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/router/edit_ledger.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/router/grep_digest.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/router/handlers.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/router/install.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/router/intent.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/router/policy.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/router/ptr_store.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/router/quality_report.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/router/stats.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/router/tune.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/runtime.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/runtime_daemon.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/runtime_io.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/schemas/__init__.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/schemas/narrative.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/schemas/scene_card.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/secret_store.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/skills/__init__.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/skills/discovery.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/skills/executor.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/skills/hashing.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/skills/miner.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/skills/outcomes.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/skills/schema.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/skills/store.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/skills/structure.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/skills/trajectory.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/task_contracts.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/temporal_fact_integration.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/temporal_fact_ledger.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/temporal_scenes.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/training/__init__.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/training/data_formatter.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/training/karma.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/training/nididhyasana.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/training/smrti.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/training/train.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/ui/__init__.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/ui/cli.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/ui/server.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/ui/web/dist/assets/CanvasView-Cl1HxIK0.js +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/ui/web/dist/assets/index-BboZhdsv.js +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/ui/web/dist/assets/index-CIsLOp4u.css +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/ui/web/dist/dhee-logo.png +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/ui/web/dist/index.html +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/ui/web/index.html +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/ui/web/package-lock.json +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/ui/web/package.json +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/ui/web/public/dhee-logo.png +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/ui/web/src/App.js +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/ui/web/src/App.tsx +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/ui/web/src/api.js +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/ui/web/src/api.ts +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/ui/web/src/components/AssetDrawer.js +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/ui/web/src/components/AssetDrawer.tsx +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/ui/web/src/components/ChatMessage.js +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/ui/web/src/components/ChatMessage.tsx +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/ui/web/src/components/FirstRunPanel.js +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/ui/web/src/components/FirstRunPanel.tsx +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/ui/web/src/components/LinePanel.js +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/ui/web/src/components/LinePanel.tsx +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/ui/web/src/components/NavRail.js +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/ui/web/src/components/NavRail.tsx +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/ui/web/src/components/OrgDrawer.js +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/ui/web/src/components/OrgDrawer.tsx +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/ui/web/src/components/TopBar.js +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/ui/web/src/components/TopBar.tsx +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/ui/web/src/components/TweaksPanel.js +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/ui/web/src/components/TweaksPanel.tsx +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/ui/web/src/components/WorkspaceManagerModal.js +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/ui/web/src/components/WorkspaceManagerModal.tsx +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/ui/web/src/components/canvas/CanvasControls.js +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/ui/web/src/components/canvas/CanvasControls.tsx +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/ui/web/src/components/canvas/CanvasSkeleton.js +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/ui/web/src/components/canvas/CanvasSkeleton.tsx +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/ui/web/src/components/canvas/DirectionHints.js +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/ui/web/src/components/canvas/DirectionHints.tsx +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/ui/web/src/components/canvas/Minimap.js +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/ui/web/src/components/canvas/Minimap.tsx +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/ui/web/src/components/canvas/NodeCard.js +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/ui/web/src/components/canvas/NodeCard.tsx +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/ui/web/src/components/canvas/forceLayout.js +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/ui/web/src/components/canvas/forceLayout.ts +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/ui/web/src/components/canvas/layout.js +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/ui/web/src/components/canvas/layout.ts +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/ui/web/src/components/canvas/treeLayout.js +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/ui/web/src/components/canvas/treeLayout.ts +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/ui/web/src/components/canvas/useInfiniteCanvas.js +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/ui/web/src/components/canvas/useInfiniteCanvas.ts +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/ui/web/src/components/cards/Cards.js +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/ui/web/src/components/cards/Cards.tsx +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/ui/web/src/components/graph/CanvasNodeCard.js +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/ui/web/src/components/graph/CanvasNodeCard.tsx +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/ui/web/src/components/ui/DecayBar.js +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/ui/web/src/components/ui/DecayBar.tsx +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/ui/web/src/components/ui/Markdown.js +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/ui/web/src/components/ui/Markdown.tsx +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/ui/web/src/components/ui/SectionHeader.js +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/ui/web/src/components/ui/SectionHeader.tsx +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/ui/web/src/components/ui/StatPill.js +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/ui/web/src/components/ui/StatPill.tsx +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/ui/web/src/components/ui/TierBadge.js +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/ui/web/src/components/ui/TierBadge.tsx +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/ui/web/src/main.js +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/ui/web/src/main.tsx +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/ui/web/src/styles.css +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/ui/web/src/types.js +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/ui/web/src/types.ts +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/ui/web/src/views/CanvasView.js +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/ui/web/src/views/CanvasView.tsx +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/ui/web/src/views/ChannelView.js +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/ui/web/src/views/ChannelView.tsx +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/ui/web/src/views/ConflictView.js +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/ui/web/src/views/ConflictView.tsx +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/ui/web/src/views/ContextView.js +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/ui/web/src/views/ContextView.tsx +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/ui/web/src/views/EvolutionView.js +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/ui/web/src/views/EvolutionView.tsx +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/ui/web/src/views/LaunchView.js +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/ui/web/src/views/LaunchView.tsx +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/ui/web/src/views/MemoryView.js +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/ui/web/src/views/MemoryView.tsx +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/ui/web/src/views/NotepadView.js +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/ui/web/src/views/NotepadView.tsx +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/ui/web/src/views/OrgCanvas.js +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/ui/web/src/views/OrgCanvas.tsx +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/ui/web/src/views/ProductViews.js +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/ui/web/src/views/ProductViews.tsx +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/ui/web/src/views/RouterView.js +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/ui/web/src/views/RouterView.tsx +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/ui/web/src/views/TasksView.js +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/ui/web/src/views/TasksView.tsx +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/ui/web/src/views/WorkspaceView.js +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/ui/web/src/views/WorkspaceView.tsx +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/ui/web/tsconfig.json +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/ui/web/vite.config.ts +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/update_capsules.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/utils/__init__.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/utils/math.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/utils/prompts.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/utils/repo_identity.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/vector_stores/__init__.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/vector_stores/base.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/vector_stores/memory.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/vector_stores/sqlite_vec.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/vector_stores/zvec_store.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/verification_runner.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/verifier_engine.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/world_memory/__init__.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/world_memory/capture_store.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/world_memory/causal_graph.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/world_memory/encoder.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/world_memory/gem_extractor.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/world_memory/predictor.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/world_memory/schema.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/world_memory/service.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/world_memory/session_graph.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee/world_memory/store.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee.egg-info/dependency_links.txt +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee.egg-info/entry_points.txt +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee.egg-info/top_level.txt +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee_shared/__init__.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/dhee_shared/model_paths.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/engram/__init__.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/engram-bus/engram_bus/__init__.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/engram-bus/engram_bus/bus.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/engram-bus/engram_bus/pubsub.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/engram-bus/engram_bus/server.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/engram-bus/engram_bus/store.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/engram-bus/engram_bus/workspace.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/setup.cfg +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/tests/test_accel.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/tests/test_accel_benchmark.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/tests/test_agent_digest.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/tests/test_artifacts.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/tests/test_auto_lifecycle.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/tests/test_backward_compat.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/tests/test_batch.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/tests/test_belief_debugger.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/tests/test_causal_scene_memory.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/tests/test_claude_code_hooks.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/tests/test_cli_config.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/tests/test_cli_harness_commands.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/tests/test_cli_onboard_update.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/tests/test_cli_pretty.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/tests/test_codex_stream.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/tests/test_cognition_evals.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/tests/test_cognition_v3.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/tests/test_context_state.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/tests/test_core_memory.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/tests/test_cosine_similarity.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/tests/test_decades_eval.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/tests/test_dedup.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/tests/test_deferred_enrichment.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/tests/test_demo.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/tests/test_dhee_init.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/tests/test_dhee_model_paths.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/tests/test_dheefs.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/tests/test_distillation.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/tests/test_e2e_all_features.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/tests/test_engram_tiering.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/tests/test_engram_tiering_promotion.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/tests/test_evolution_meta_loop.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/tests/test_evolution_session_gate.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/tests/test_forgetting.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/tests/test_graph_proof_bundle.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/tests/test_gstack_adapter.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/tests/test_handoff_snapshot.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/tests/test_harness_adapters.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/tests/test_harness_install.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/tests/test_hashing.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/tests/test_hermes_provider.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/tests/test_hippocamp_benchmark.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/tests/test_incremental_context.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/tests/test_install_cleanup.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/tests/test_intent.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/tests/test_karma_evaluator.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/tests/test_learnings.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/tests/test_locomo_plus_runner.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/tests/test_log_parser.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/tests/test_longmemeval_config.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/tests/test_mcp_artifact_tools.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/tests/test_mcp_tools_slim.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/tests/test_memory_admission.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/tests/test_memory_os_service.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/tests/test_memory_quality_contract.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/tests/test_memory_types.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/tests/test_meta_buddhi_group_relative.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/tests/test_migration.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/tests/test_miner.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/tests/test_narrative_scene_intelligence.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/tests/test_nvidia_embedder.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/tests/test_openclaw.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/tests/test_orchestration_core.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/tests/test_oss_61_regressions.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/tests/test_parallel.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/tests/test_patch_families.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/tests/test_plugin_learnings.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/tests/test_portability_eval.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/tests/test_power_packages.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/tests/test_presets.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/tests/test_profile.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/tests/test_progressive_trainer.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/tests/test_projects.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/tests/test_protocol_v1.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/tests/test_query_cache.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/tests/test_release_hygiene.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/tests/test_replay_branching.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/tests/test_replay_corpus_export.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/tests/test_replay_gate.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/tests/test_repo_intelligence.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/tests/test_repo_link.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/tests/test_reranker_defaults.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/tests/test_router.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/tests/test_router_replay.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/tests/test_router_stats_agents.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/tests/test_runtime.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/tests/test_runtime_hardening.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/tests/test_scene.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/tests/test_scene_world_hook.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/tests/test_secret_store.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/tests/test_session_tracker.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/tests/test_shared_tasks.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/tests/test_simple_zero_config.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/tests/test_skills.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/tests/test_smart_memory.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/tests/test_sqlite_connection_pool.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/tests/test_sqlite_vec.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/tests/test_structural.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/tests/test_structured_resolution.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/tests/test_task_contracts.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/tests/test_tasks.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/tests/test_temporal_fact_integration.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/tests/test_temporal_fact_ledger.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/tests/test_temporal_scenes.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/tests/test_thread_state.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/tests/test_traces.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/tests/test_trajectory.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/tests/test_ui.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/tests/test_unified_enrichment.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/tests/test_update_capsules.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/tests/test_vector_store_factory.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/tests/test_verification_runner.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/tests/test_verifier_engine.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/tests/test_workspace_line_agent_emit.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/tests/test_workspace_line_bus.py +0 -0
- {dhee-7.2.0 → dhee-7.2.3}/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.
|
|
3
|
+
Version: 7.2.3
|
|
4
4
|
Summary: Dhee - world memory layer and context compiler for AI agents
|
|
5
5
|
Author: Sankhya AI Labs
|
|
6
6
|
License-Expression: MIT
|
|
@@ -38,6 +38,8 @@ Provides-Extra: gemini
|
|
|
38
38
|
Requires-Dist: google-genai>=1.0.0; extra == "gemini"
|
|
39
39
|
Provides-Extra: openai
|
|
40
40
|
Requires-Dist: openai>=1.0.0; extra == "openai"
|
|
41
|
+
Provides-Extra: elevenlabs
|
|
42
|
+
Requires-Dist: elevenlabs>=2.49.0; extra == "elevenlabs"
|
|
41
43
|
Provides-Extra: ollama
|
|
42
44
|
Requires-Dist: ollama>=0.4.0; extra == "ollama"
|
|
43
45
|
Provides-Extra: nvidia
|
|
@@ -81,6 +83,7 @@ Requires-Dist: ollama>=0.4.0; extra == "app"
|
|
|
81
83
|
Provides-Extra: all
|
|
82
84
|
Requires-Dist: google-genai>=1.0.0; extra == "all"
|
|
83
85
|
Requires-Dist: openai>=1.0.0; extra == "all"
|
|
86
|
+
Requires-Dist: elevenlabs>=2.49.0; extra == "all"
|
|
84
87
|
Requires-Dist: ollama>=0.4.0; extra == "all"
|
|
85
88
|
Requires-Dist: zvec>=0.4.0; python_version >= "3.11" and extra == "all"
|
|
86
89
|
Requires-Dist: mcp>=1.0.0; python_version >= "3.10" and extra == "all"
|
|
@@ -108,7 +111,7 @@ Dynamic: license-file
|
|
|
108
111
|
|
|
109
112
|
<p align="center">
|
|
110
113
|
<b>World memory for AI agents.</b><br>
|
|
111
|
-
A context compiler
|
|
114
|
+
A arc based context compiler for ai agents
|
|
112
115
|
</p>
|
|
113
116
|
|
|
114
117
|
<p align="center">
|
|
@@ -274,6 +277,170 @@ A good agent loop is simple:
|
|
|
274
277
|
bootstrap -> start scene -> gather evidence -> retrieve context -> act -> verify -> end scene -> save digest
|
|
275
278
|
```
|
|
276
279
|
|
|
280
|
+
## Agent Runtime
|
|
281
|
+
|
|
282
|
+
Dhee now plugs into existing agents with a few lines of code.
|
|
283
|
+
|
|
284
|
+
If you already have an agent, you keep your provider SDK, model, tools, audio interface, callbacks, and deployment. Dhee adds the missing memory loop:
|
|
285
|
+
|
|
286
|
+
```text
|
|
287
|
+
before run -> inject compact Dhee context
|
|
288
|
+
during run -> expose a dhee_memory tool
|
|
289
|
+
after run -> checkpoint what should matter next time
|
|
290
|
+
```
|
|
291
|
+
|
|
292
|
+
Current native integrations:
|
|
293
|
+
|
|
294
|
+
| Provider | Import | Minimal change |
|
|
295
|
+
| --- | --- | --- |
|
|
296
|
+
| ElevenLabs voice agents | `from dhee import ElevenLabsAgent` | Add Dhee dynamic variables, client tool, callback wrappers, and post-call checkpointing. |
|
|
297
|
+
| Gemini API agents | `from dhee import GeminiAgent` | Pass `config=memory.generate_content_config()` into `client.models.generate_content(...)`. |
|
|
298
|
+
| OpenAI Responses API agents | `from dhee import OpenAIAgent` | Spread `**memory.response_create_kwargs(...)` into `client.responses.create(...)`. |
|
|
299
|
+
|
|
300
|
+
Dhee can also run as a small HTTP sidecar for agents that cannot use local Python or stdio MCP.
|
|
301
|
+
|
|
302
|
+
```bash
|
|
303
|
+
export DHEE_HTTP_TOKEN="dev-token"
|
|
304
|
+
export ELEVENLABS_WEBHOOK_SECRET="..."
|
|
305
|
+
dhee serve --host 0.0.0.0 --port 8765 --profile elevenlabs
|
|
306
|
+
```
|
|
307
|
+
|
|
308
|
+
Unsigned ElevenLabs post-call webhooks are rejected by default; use `--allow-unsigned-webhooks` only for local development.
|
|
309
|
+
|
|
310
|
+
The universal runtime surface is intentionally provider-neutral:
|
|
311
|
+
|
|
312
|
+
```python
|
|
313
|
+
import dhee
|
|
314
|
+
|
|
315
|
+
memory = dhee.Client(user_id="user_123", app_id="elevenlabs:support-agent")
|
|
316
|
+
run = memory.run(task="voice support call")
|
|
317
|
+
patch = run.before(channel="voice")
|
|
318
|
+
run.tool("remember", content="User prefers WhatsApp follow-up.")
|
|
319
|
+
run.finish(summary="User asked about refund status.")
|
|
320
|
+
```
|
|
321
|
+
|
|
322
|
+
For an existing ElevenLabs voice agent, the minimal native path is:
|
|
323
|
+
|
|
324
|
+
```python
|
|
325
|
+
from dhee import ElevenLabsAgent
|
|
326
|
+
|
|
327
|
+
agent = ElevenLabsAgent(
|
|
328
|
+
public_base_url="https://memory.example.com",
|
|
329
|
+
user_id="user_123",
|
|
330
|
+
agent_id="support-agent",
|
|
331
|
+
)
|
|
332
|
+
|
|
333
|
+
conversation = agent.create_conversation(api_key="...")
|
|
334
|
+
conversation.start_session()
|
|
335
|
+
```
|
|
336
|
+
|
|
337
|
+
That keeps your ElevenLabs agent, audio interface, and callbacks intact while Dhee adds:
|
|
338
|
+
|
|
339
|
+
- `ConversationInitiationData(dynamic_variables={...})` with `dhee_context`
|
|
340
|
+
- a native `dhee_memory` client tool
|
|
341
|
+
- transcript event capture through wrapped callbacks
|
|
342
|
+
- post-call checkpoint helpers
|
|
343
|
+
|
|
344
|
+
If you already construct `Conversation(...)` yourself, make the smaller patch:
|
|
345
|
+
|
|
346
|
+
```python
|
|
347
|
+
memory = ElevenLabsAgent(
|
|
348
|
+
public_base_url="https://memory.example.com",
|
|
349
|
+
user_id="user_123",
|
|
350
|
+
agent_id=agent_id,
|
|
351
|
+
)
|
|
352
|
+
|
|
353
|
+
conversation = Conversation(
|
|
354
|
+
client=elevenlabs,
|
|
355
|
+
agent_id=agent_id,
|
|
356
|
+
config=memory.conversation_initiation_data(),
|
|
357
|
+
client_tools=memory.client_tools(existing_client_tools),
|
|
358
|
+
callback_user_transcript=memory.wrap_user_transcript(on_user_transcript),
|
|
359
|
+
callback_agent_response=memory.wrap_agent_response(on_agent_response),
|
|
360
|
+
audio_interface=audio_interface,
|
|
361
|
+
)
|
|
362
|
+
```
|
|
363
|
+
|
|
364
|
+
Install the optional SDK bridge with:
|
|
365
|
+
|
|
366
|
+
```bash
|
|
367
|
+
pip install "dhee[elevenlabs]"
|
|
368
|
+
```
|
|
369
|
+
|
|
370
|
+
For hosted/server-tool deployment, use the profile helper:
|
|
371
|
+
|
|
372
|
+
```bash
|
|
373
|
+
dhee elevenlabs init --public-url https://memory.example.com
|
|
374
|
+
```
|
|
375
|
+
|
|
376
|
+
That prints the dynamic variables, `dhee_memory` server tool, and post-call webhook URL. The flow is:
|
|
377
|
+
|
|
378
|
+
```text
|
|
379
|
+
call start -> {{dhee_context}}
|
|
380
|
+
during call -> dhee_memory server tool
|
|
381
|
+
call end -> post-call webhook checkpoint
|
|
382
|
+
next call -> better injected context
|
|
383
|
+
```
|
|
384
|
+
|
|
385
|
+
The native provider lives at [`dhee.providers.elevenlabs`](dhee/providers/elevenlabs.py) and is exported as `dhee.ElevenLabsAgent` and `dhee.ElevenAgent`.
|
|
386
|
+
|
|
387
|
+
For an existing Gemini API agent, add Dhee to the existing `generate_content` call:
|
|
388
|
+
|
|
389
|
+
```python
|
|
390
|
+
from google import genai
|
|
391
|
+
from dhee import GeminiAgent
|
|
392
|
+
|
|
393
|
+
client = genai.Client(api_key="...")
|
|
394
|
+
memory = GeminiAgent(user_id="user_123", model="gemini-2.5-flash")
|
|
395
|
+
|
|
396
|
+
response = client.models.generate_content(
|
|
397
|
+
model=memory.model,
|
|
398
|
+
contents="What did I ask you to remember?",
|
|
399
|
+
config=memory.generate_content_config(),
|
|
400
|
+
)
|
|
401
|
+
```
|
|
402
|
+
|
|
403
|
+
The config injects Dhee context as a system instruction and adds `memory.dhee_memory` as a Gemini Python function tool. You can also call through Dhee:
|
|
404
|
+
|
|
405
|
+
```python
|
|
406
|
+
response = memory.generate_content(
|
|
407
|
+
"Please remember I prefer concise summaries.",
|
|
408
|
+
client=client,
|
|
409
|
+
)
|
|
410
|
+
```
|
|
411
|
+
|
|
412
|
+
The native Gemini provider lives at [`dhee.providers.gemini`](dhee/providers/gemini.py) and is exported as `dhee.GeminiAgent` and `dhee.GeminiAPIAgent`.
|
|
413
|
+
|
|
414
|
+
For an existing OpenAI Responses API agent, add Dhee to the existing request:
|
|
415
|
+
|
|
416
|
+
```python
|
|
417
|
+
from openai import OpenAI
|
|
418
|
+
from dhee import OpenAIAgent
|
|
419
|
+
|
|
420
|
+
client = OpenAI(api_key="...")
|
|
421
|
+
memory = OpenAIAgent(user_id="user_123", model="gpt-4.1")
|
|
422
|
+
|
|
423
|
+
response = client.responses.create(
|
|
424
|
+
**memory.response_create_kwargs(
|
|
425
|
+
input="What should you remember about me?",
|
|
426
|
+
)
|
|
427
|
+
)
|
|
428
|
+
```
|
|
429
|
+
|
|
430
|
+
When the model returns `function_call` items, Dhee can execute them and format Responses API tool outputs:
|
|
431
|
+
|
|
432
|
+
```python
|
|
433
|
+
tool_outputs = memory.function_call_outputs(response)
|
|
434
|
+
followup = client.responses.create(
|
|
435
|
+
model=memory.model,
|
|
436
|
+
input=tool_outputs,
|
|
437
|
+
previous_response_id=response.id,
|
|
438
|
+
tools=memory.tools(),
|
|
439
|
+
)
|
|
440
|
+
```
|
|
441
|
+
|
|
442
|
+
The native OpenAI provider lives at [`dhee.providers.openai`](dhee/providers/openai.py) and is exported as `dhee.OpenAIAgent` and `dhee.OpenAIResponsesAgent`.
|
|
443
|
+
|
|
277
444
|
## Repo Brain
|
|
278
445
|
|
|
279
446
|
Ask: "If I touch this file, what breaks?"
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
|
|
7
7
|
<p align="center">
|
|
8
8
|
<b>World memory for AI agents.</b><br>
|
|
9
|
-
A context compiler
|
|
9
|
+
A arc based context compiler for ai agents
|
|
10
10
|
</p>
|
|
11
11
|
|
|
12
12
|
<p align="center">
|
|
@@ -172,6 +172,170 @@ A good agent loop is simple:
|
|
|
172
172
|
bootstrap -> start scene -> gather evidence -> retrieve context -> act -> verify -> end scene -> save digest
|
|
173
173
|
```
|
|
174
174
|
|
|
175
|
+
## Agent Runtime
|
|
176
|
+
|
|
177
|
+
Dhee now plugs into existing agents with a few lines of code.
|
|
178
|
+
|
|
179
|
+
If you already have an agent, you keep your provider SDK, model, tools, audio interface, callbacks, and deployment. Dhee adds the missing memory loop:
|
|
180
|
+
|
|
181
|
+
```text
|
|
182
|
+
before run -> inject compact Dhee context
|
|
183
|
+
during run -> expose a dhee_memory tool
|
|
184
|
+
after run -> checkpoint what should matter next time
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
Current native integrations:
|
|
188
|
+
|
|
189
|
+
| Provider | Import | Minimal change |
|
|
190
|
+
| --- | --- | --- |
|
|
191
|
+
| ElevenLabs voice agents | `from dhee import ElevenLabsAgent` | Add Dhee dynamic variables, client tool, callback wrappers, and post-call checkpointing. |
|
|
192
|
+
| Gemini API agents | `from dhee import GeminiAgent` | Pass `config=memory.generate_content_config()` into `client.models.generate_content(...)`. |
|
|
193
|
+
| OpenAI Responses API agents | `from dhee import OpenAIAgent` | Spread `**memory.response_create_kwargs(...)` into `client.responses.create(...)`. |
|
|
194
|
+
|
|
195
|
+
Dhee can also run as a small HTTP sidecar for agents that cannot use local Python or stdio MCP.
|
|
196
|
+
|
|
197
|
+
```bash
|
|
198
|
+
export DHEE_HTTP_TOKEN="dev-token"
|
|
199
|
+
export ELEVENLABS_WEBHOOK_SECRET="..."
|
|
200
|
+
dhee serve --host 0.0.0.0 --port 8765 --profile elevenlabs
|
|
201
|
+
```
|
|
202
|
+
|
|
203
|
+
Unsigned ElevenLabs post-call webhooks are rejected by default; use `--allow-unsigned-webhooks` only for local development.
|
|
204
|
+
|
|
205
|
+
The universal runtime surface is intentionally provider-neutral:
|
|
206
|
+
|
|
207
|
+
```python
|
|
208
|
+
import dhee
|
|
209
|
+
|
|
210
|
+
memory = dhee.Client(user_id="user_123", app_id="elevenlabs:support-agent")
|
|
211
|
+
run = memory.run(task="voice support call")
|
|
212
|
+
patch = run.before(channel="voice")
|
|
213
|
+
run.tool("remember", content="User prefers WhatsApp follow-up.")
|
|
214
|
+
run.finish(summary="User asked about refund status.")
|
|
215
|
+
```
|
|
216
|
+
|
|
217
|
+
For an existing ElevenLabs voice agent, the minimal native path is:
|
|
218
|
+
|
|
219
|
+
```python
|
|
220
|
+
from dhee import ElevenLabsAgent
|
|
221
|
+
|
|
222
|
+
agent = ElevenLabsAgent(
|
|
223
|
+
public_base_url="https://memory.example.com",
|
|
224
|
+
user_id="user_123",
|
|
225
|
+
agent_id="support-agent",
|
|
226
|
+
)
|
|
227
|
+
|
|
228
|
+
conversation = agent.create_conversation(api_key="...")
|
|
229
|
+
conversation.start_session()
|
|
230
|
+
```
|
|
231
|
+
|
|
232
|
+
That keeps your ElevenLabs agent, audio interface, and callbacks intact while Dhee adds:
|
|
233
|
+
|
|
234
|
+
- `ConversationInitiationData(dynamic_variables={...})` with `dhee_context`
|
|
235
|
+
- a native `dhee_memory` client tool
|
|
236
|
+
- transcript event capture through wrapped callbacks
|
|
237
|
+
- post-call checkpoint helpers
|
|
238
|
+
|
|
239
|
+
If you already construct `Conversation(...)` yourself, make the smaller patch:
|
|
240
|
+
|
|
241
|
+
```python
|
|
242
|
+
memory = ElevenLabsAgent(
|
|
243
|
+
public_base_url="https://memory.example.com",
|
|
244
|
+
user_id="user_123",
|
|
245
|
+
agent_id=agent_id,
|
|
246
|
+
)
|
|
247
|
+
|
|
248
|
+
conversation = Conversation(
|
|
249
|
+
client=elevenlabs,
|
|
250
|
+
agent_id=agent_id,
|
|
251
|
+
config=memory.conversation_initiation_data(),
|
|
252
|
+
client_tools=memory.client_tools(existing_client_tools),
|
|
253
|
+
callback_user_transcript=memory.wrap_user_transcript(on_user_transcript),
|
|
254
|
+
callback_agent_response=memory.wrap_agent_response(on_agent_response),
|
|
255
|
+
audio_interface=audio_interface,
|
|
256
|
+
)
|
|
257
|
+
```
|
|
258
|
+
|
|
259
|
+
Install the optional SDK bridge with:
|
|
260
|
+
|
|
261
|
+
```bash
|
|
262
|
+
pip install "dhee[elevenlabs]"
|
|
263
|
+
```
|
|
264
|
+
|
|
265
|
+
For hosted/server-tool deployment, use the profile helper:
|
|
266
|
+
|
|
267
|
+
```bash
|
|
268
|
+
dhee elevenlabs init --public-url https://memory.example.com
|
|
269
|
+
```
|
|
270
|
+
|
|
271
|
+
That prints the dynamic variables, `dhee_memory` server tool, and post-call webhook URL. The flow is:
|
|
272
|
+
|
|
273
|
+
```text
|
|
274
|
+
call start -> {{dhee_context}}
|
|
275
|
+
during call -> dhee_memory server tool
|
|
276
|
+
call end -> post-call webhook checkpoint
|
|
277
|
+
next call -> better injected context
|
|
278
|
+
```
|
|
279
|
+
|
|
280
|
+
The native provider lives at [`dhee.providers.elevenlabs`](dhee/providers/elevenlabs.py) and is exported as `dhee.ElevenLabsAgent` and `dhee.ElevenAgent`.
|
|
281
|
+
|
|
282
|
+
For an existing Gemini API agent, add Dhee to the existing `generate_content` call:
|
|
283
|
+
|
|
284
|
+
```python
|
|
285
|
+
from google import genai
|
|
286
|
+
from dhee import GeminiAgent
|
|
287
|
+
|
|
288
|
+
client = genai.Client(api_key="...")
|
|
289
|
+
memory = GeminiAgent(user_id="user_123", model="gemini-2.5-flash")
|
|
290
|
+
|
|
291
|
+
response = client.models.generate_content(
|
|
292
|
+
model=memory.model,
|
|
293
|
+
contents="What did I ask you to remember?",
|
|
294
|
+
config=memory.generate_content_config(),
|
|
295
|
+
)
|
|
296
|
+
```
|
|
297
|
+
|
|
298
|
+
The config injects Dhee context as a system instruction and adds `memory.dhee_memory` as a Gemini Python function tool. You can also call through Dhee:
|
|
299
|
+
|
|
300
|
+
```python
|
|
301
|
+
response = memory.generate_content(
|
|
302
|
+
"Please remember I prefer concise summaries.",
|
|
303
|
+
client=client,
|
|
304
|
+
)
|
|
305
|
+
```
|
|
306
|
+
|
|
307
|
+
The native Gemini provider lives at [`dhee.providers.gemini`](dhee/providers/gemini.py) and is exported as `dhee.GeminiAgent` and `dhee.GeminiAPIAgent`.
|
|
308
|
+
|
|
309
|
+
For an existing OpenAI Responses API agent, add Dhee to the existing request:
|
|
310
|
+
|
|
311
|
+
```python
|
|
312
|
+
from openai import OpenAI
|
|
313
|
+
from dhee import OpenAIAgent
|
|
314
|
+
|
|
315
|
+
client = OpenAI(api_key="...")
|
|
316
|
+
memory = OpenAIAgent(user_id="user_123", model="gpt-4.1")
|
|
317
|
+
|
|
318
|
+
response = client.responses.create(
|
|
319
|
+
**memory.response_create_kwargs(
|
|
320
|
+
input="What should you remember about me?",
|
|
321
|
+
)
|
|
322
|
+
)
|
|
323
|
+
```
|
|
324
|
+
|
|
325
|
+
When the model returns `function_call` items, Dhee can execute them and format Responses API tool outputs:
|
|
326
|
+
|
|
327
|
+
```python
|
|
328
|
+
tool_outputs = memory.function_call_outputs(response)
|
|
329
|
+
followup = client.responses.create(
|
|
330
|
+
model=memory.model,
|
|
331
|
+
input=tool_outputs,
|
|
332
|
+
previous_response_id=response.id,
|
|
333
|
+
tools=memory.tools(),
|
|
334
|
+
)
|
|
335
|
+
```
|
|
336
|
+
|
|
337
|
+
The native OpenAI provider lives at [`dhee.providers.openai`](dhee/providers/openai.py) and is exported as `dhee.OpenAIAgent` and `dhee.OpenAIResponsesAgent`.
|
|
338
|
+
|
|
175
339
|
## Repo Brain
|
|
176
340
|
|
|
177
341
|
Ask: "If I touch this file, what breaks?"
|
|
@@ -26,6 +26,15 @@ from dhee.memory.smart import SmartMemory
|
|
|
26
26
|
from dhee.memory.main import FullMemory
|
|
27
27
|
from dhee.simple import Dhee, Engram
|
|
28
28
|
from dhee.plugin import DheePlugin
|
|
29
|
+
from dhee.agent_runtime import Client, Run, Patch
|
|
30
|
+
from dhee.providers import (
|
|
31
|
+
ElevenAgent,
|
|
32
|
+
ElevenLabsAgent,
|
|
33
|
+
GeminiAgent,
|
|
34
|
+
GeminiAPIAgent,
|
|
35
|
+
OpenAIAgent,
|
|
36
|
+
OpenAIResponsesAgent,
|
|
37
|
+
)
|
|
29
38
|
from dhee.fs import ContextWorkspace
|
|
30
39
|
from dhee.context_kernel import DheeContextKernel, KernelScope
|
|
31
40
|
from dhee.core.category import CategoryProcessor, Category, CategoryType, CategoryMatch
|
|
@@ -41,7 +50,7 @@ from dhee.memory.admission import (
|
|
|
41
50
|
# Default import remains model-free for backwards compatibility.
|
|
42
51
|
Memory = CoreMemory
|
|
43
52
|
|
|
44
|
-
__version__ = "7.2.
|
|
53
|
+
__version__ = "7.2.3"
|
|
45
54
|
__all__ = [
|
|
46
55
|
# Memory classes
|
|
47
56
|
"Engram",
|
|
@@ -53,6 +62,16 @@ __all__ = [
|
|
|
53
62
|
"Dhee",
|
|
54
63
|
# Universal plugin
|
|
55
64
|
"DheePlugin",
|
|
65
|
+
# Universal agent runtime
|
|
66
|
+
"Client",
|
|
67
|
+
"Run",
|
|
68
|
+
"Patch",
|
|
69
|
+
"ElevenAgent",
|
|
70
|
+
"ElevenLabsAgent",
|
|
71
|
+
"GeminiAgent",
|
|
72
|
+
"GeminiAPIAgent",
|
|
73
|
+
"OpenAIAgent",
|
|
74
|
+
"OpenAIResponsesAgent",
|
|
56
75
|
# DheeFS
|
|
57
76
|
"ContextWorkspace",
|
|
58
77
|
"DheeContextKernel",
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
"""Universal agent runtime for Dhee."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from dhee.agent_runtime.client import Client
|
|
6
|
+
from dhee.agent_runtime.models import Patch, ToolResult
|
|
7
|
+
from dhee.agent_runtime.run import Run
|
|
8
|
+
|
|
9
|
+
__all__ = ["Client", "Run", "Patch", "ToolResult"]
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"""HTTP auth helpers for the Dhee agent runtime sidecar."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import os
|
|
6
|
+
from typing import Optional
|
|
7
|
+
|
|
8
|
+
from fastapi import HTTPException
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
def require_bearer_token(authorization: Optional[str], token: Optional[str] = None) -> None:
|
|
12
|
+
"""Validate bearer auth when a sidecar token is configured."""
|
|
13
|
+
|
|
14
|
+
expected = token if token is not None else os.getenv("DHEE_HTTP_TOKEN")
|
|
15
|
+
if not expected:
|
|
16
|
+
return
|
|
17
|
+
prefix = "Bearer "
|
|
18
|
+
if not authorization or not authorization.startswith(prefix):
|
|
19
|
+
raise HTTPException(status_code=401, detail="Missing bearer token")
|
|
20
|
+
supplied = authorization[len(prefix) :].strip()
|
|
21
|
+
if supplied != expected:
|
|
22
|
+
raise HTTPException(status_code=401, detail="Invalid bearer token")
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
"""Python SDK entry point for Dhee's universal agent runtime."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from pathlib import Path
|
|
6
|
+
from typing import Any, Optional, Union
|
|
7
|
+
|
|
8
|
+
from dhee.agent_runtime.run import Run
|
|
9
|
+
from dhee.plugin import DheePlugin
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class Client:
|
|
13
|
+
"""Small framework-neutral runtime client.
|
|
14
|
+
|
|
15
|
+
This is intentionally not an ElevenLabs, Gemini, or OpenAI client. It only
|
|
16
|
+
translates agent lifecycle events into Dhee's existing cognition plugin.
|
|
17
|
+
"""
|
|
18
|
+
|
|
19
|
+
def __init__(
|
|
20
|
+
self,
|
|
21
|
+
user_id: str = "default",
|
|
22
|
+
app_id: str = "default-agent",
|
|
23
|
+
data_dir: Optional[Union[str, Path]] = None,
|
|
24
|
+
provider: Optional[str] = None,
|
|
25
|
+
in_memory: bool = False,
|
|
26
|
+
offline: bool = False,
|
|
27
|
+
):
|
|
28
|
+
self.user_id = user_id
|
|
29
|
+
self.app_id = app_id
|
|
30
|
+
self.plugin = DheePlugin(
|
|
31
|
+
user_id=user_id,
|
|
32
|
+
data_dir=data_dir,
|
|
33
|
+
provider=provider,
|
|
34
|
+
in_memory=in_memory,
|
|
35
|
+
offline=offline,
|
|
36
|
+
)
|
|
37
|
+
|
|
38
|
+
def run(
|
|
39
|
+
self,
|
|
40
|
+
task: Optional[str] = None,
|
|
41
|
+
run_id: Optional[str] = None,
|
|
42
|
+
metadata: Optional[dict[str, Any]] = None,
|
|
43
|
+
) -> Run:
|
|
44
|
+
return Run(
|
|
45
|
+
plugin=self.plugin,
|
|
46
|
+
user_id=self.user_id,
|
|
47
|
+
app_id=self.app_id,
|
|
48
|
+
task=task,
|
|
49
|
+
run_id=run_id,
|
|
50
|
+
metadata=metadata or {},
|
|
51
|
+
)
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
"""Event names used by the universal agent runtime."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
VOICE_USER_TRANSCRIPT = "voice.user_transcript"
|
|
7
|
+
VOICE_AGENT_RESPONSE = "voice.agent_response"
|
|
8
|
+
VOICE_CALL_SUMMARY = "voice.call_summary"
|
|
9
|
+
VOICE_FOLLOWUP = "voice.followup"
|
|
10
|
+
VOICE_CORRECTION = "voice.correction"
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
"""Pydantic models for Dhee's universal agent runtime."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from typing import Any, Optional
|
|
6
|
+
|
|
7
|
+
from pydantic import BaseModel, Field
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class Patch(BaseModel):
|
|
11
|
+
"""Context patch returned before an agent run starts."""
|
|
12
|
+
|
|
13
|
+
run_id: str
|
|
14
|
+
user_id: str
|
|
15
|
+
app_id: str
|
|
16
|
+
context: str
|
|
17
|
+
dynamic_variables: dict[str, Any] = Field(default_factory=dict)
|
|
18
|
+
metadata: dict[str, Any] = Field(default_factory=dict)
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
class ToolResult(BaseModel):
|
|
22
|
+
"""Voice- and agent-friendly result from the memory tool surface."""
|
|
23
|
+
|
|
24
|
+
ok: bool = True
|
|
25
|
+
speakable_summary: Optional[str] = None
|
|
26
|
+
result: dict[str, Any] = Field(default_factory=dict)
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
"""Admission and redaction policy for voice-agent memory events."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import re
|
|
6
|
+
from dataclasses import dataclass, field
|
|
7
|
+
from typing import Any
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
SECRET_PATTERNS = [
|
|
11
|
+
re.compile(r"\b\d{6}\b"),
|
|
12
|
+
re.compile(r"(?i)\b(password|passcode|api key|secret|token)\b[:\s]+[^\s,.;]+"),
|
|
13
|
+
re.compile(r"\b(?:\d[ -]*?){13,19}\b"),
|
|
14
|
+
]
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
@dataclass
|
|
18
|
+
class Admission:
|
|
19
|
+
should_store: bool
|
|
20
|
+
content: str = ""
|
|
21
|
+
metadata: dict[str, Any] = field(default_factory=dict)
|
|
22
|
+
reason: str = ""
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
def contains_voice_secret(content: str) -> bool:
|
|
26
|
+
"""Return True when text contains data Dhee should not retain."""
|
|
27
|
+
|
|
28
|
+
text = content or ""
|
|
29
|
+
return any(pattern.search(text) for pattern in SECRET_PATTERNS)
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
def redact_voice_content(content: str) -> str:
|
|
33
|
+
"""Redact high-risk voice content before it can enter memory."""
|
|
34
|
+
|
|
35
|
+
text = content or ""
|
|
36
|
+
for pattern in SECRET_PATTERNS:
|
|
37
|
+
text = pattern.sub("[REDACTED]", text)
|
|
38
|
+
return text
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
def admit_voice_event(event: dict[str, Any]) -> Admission:
|
|
42
|
+
"""Decide whether a noisy voice event is worth storing."""
|
|
43
|
+
|
|
44
|
+
event_type = str(event.get("type") or "")
|
|
45
|
+
content = str(event.get("content") or "").strip()
|
|
46
|
+
lowered = content.lower()
|
|
47
|
+
|
|
48
|
+
if not content:
|
|
49
|
+
return Admission(False, reason="empty")
|
|
50
|
+
|
|
51
|
+
if contains_voice_secret(content):
|
|
52
|
+
return Admission(False, reason="sensitive_content")
|
|
53
|
+
|
|
54
|
+
durable_markers = [
|
|
55
|
+
"remember",
|
|
56
|
+
"i prefer",
|
|
57
|
+
"my preference",
|
|
58
|
+
"next time",
|
|
59
|
+
"follow up",
|
|
60
|
+
"call me",
|
|
61
|
+
"message me",
|
|
62
|
+
"whatsapp",
|
|
63
|
+
"email me",
|
|
64
|
+
"i decided",
|
|
65
|
+
"we decided",
|
|
66
|
+
"correct that",
|
|
67
|
+
"actually",
|
|
68
|
+
"my name is",
|
|
69
|
+
"don't ask me",
|
|
70
|
+
"do not ask me",
|
|
71
|
+
]
|
|
72
|
+
|
|
73
|
+
if any(marker in lowered for marker in durable_markers):
|
|
74
|
+
return Admission(
|
|
75
|
+
True,
|
|
76
|
+
content=redact_voice_content(content),
|
|
77
|
+
metadata={"retention_policy": "durable", "channel": "voice"},
|
|
78
|
+
reason="durable_voice_marker",
|
|
79
|
+
)
|
|
80
|
+
|
|
81
|
+
if event_type in {"voice.call_summary", "voice.followup", "voice.correction"}:
|
|
82
|
+
return Admission(
|
|
83
|
+
True,
|
|
84
|
+
content=redact_voice_content(content),
|
|
85
|
+
metadata={"retention_policy": "durable", "channel": "voice"},
|
|
86
|
+
reason=event_type,
|
|
87
|
+
)
|
|
88
|
+
|
|
89
|
+
return Admission(False, reason="voice_noise")
|