shellbrain 0.1.35__tar.gz → 0.1.36__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.
- {shellbrain-0.1.35 → shellbrain-0.1.36}/PKG-INFO +31 -30
- {shellbrain-0.1.35 → shellbrain-0.1.36}/README.md +30 -29
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/core/entities/associations.py +0 -1
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/core/entities/concepts.py +31 -5
- shellbrain-0.1.36/app/core/entities/evidence.py +222 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/core/entities/memories.py +80 -4
- shellbrain-0.1.36/app/core/entities/structural_memory_relations.py +153 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/core/policies/memories/add_plan.py +22 -7
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/core/policies/memories/link_rules.py +9 -32
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/core/policies/memories/update_plan.py +46 -9
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/core/policies/retrieval/context_pack.py +4 -5
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/core/policies/retrieval/expansion.py +13 -34
- shellbrain-0.1.36/app/core/policies/retrieval/ontology_semantics.py +226 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/core/ports/db/concept_repositories.py +24 -4
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/core/ports/db/memory_repositories.py +35 -31
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/core/ports/db/retrieval_repositories.py +3 -13
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/core/use_cases/concepts/show/execute.py +3 -1
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/core/use_cases/concepts/show/request.py +6 -1
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/core/use_cases/concepts/update/__init__.py +2 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/core/use_cases/concepts/update/execute.py +195 -27
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/core/use_cases/concepts/update/request.py +40 -7
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/core/use_cases/concepts/views.py +63 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/core/use_cases/memories/add/execute.py +10 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/core/use_cases/memories/add/result.py +1 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/core/use_cases/memories/effect_plan.py +38 -15
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/core/use_cases/memories/reference_checks.py +93 -17
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/core/use_cases/memories/update/execute.py +23 -3
- shellbrain-0.1.36/app/core/use_cases/memories/update/request.py +256 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/core/use_cases/memories/update/result.py +2 -1
- shellbrain-0.1.36/app/core/use_cases/plan_execution.py +370 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/core/use_cases/retrieval/context_pack_pipeline.py +17 -3
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/core/use_cases/retrieval/deterministic_graph_recall.py +158 -167
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/core/use_cases/retrieval/expansion.py +26 -23
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/core/use_cases/retrieval/read_concepts.py +56 -44
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/core/use_cases/retrieval/seed_retrieval.py +22 -19
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/entrypoints/cli/handlers/internal_agent/concepts/update.py +1 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/entrypoints/cli/handlers/internal_agent/memories/update.py +1 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/entrypoints/cli/parser/builder.py +17 -16
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/infrastructure/db/runtime/models/associations.py +0 -17
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/infrastructure/db/runtime/models/concepts.py +56 -21
- shellbrain-0.1.36/app/infrastructure/db/runtime/models/evidence.py +114 -0
- shellbrain-0.1.36/app/infrastructure/db/runtime/models/experiences.py +130 -0
- shellbrain-0.1.36/app/infrastructure/db/runtime/models/memories.py +110 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/infrastructure/db/runtime/models/utility.py +0 -17
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/infrastructure/db/runtime/models/views.py +21 -27
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/infrastructure/db/runtime/repos/relational/concepts_repo.py +234 -41
- shellbrain-0.1.36/app/infrastructure/db/runtime/repos/relational/evidence_repo.py +353 -0
- shellbrain-0.1.36/app/infrastructure/db/runtime/repos/relational/experiences_repo.py +159 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/infrastructure/db/runtime/repos/relational/memories_repo.py +56 -7
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/infrastructure/db/runtime/repos/relational/read_policy_repo.py +24 -59
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/infrastructure/db/runtime/repos/semantic/keyword_retrieval_repo.py +10 -3
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/infrastructure/db/runtime/repos/semantic/semantic_retrieval_repo.py +28 -6
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/infrastructure/host_apps/inner_agents/prompt.py +72 -70
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/infrastructure/telemetry/write_records.py +45 -17
- shellbrain-0.1.36/migrations/_legacy_usage_views.py +91 -0
- shellbrain-0.1.36/migrations/_usage_view_sql.py +1114 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/migrations/versions/20260312_0003_drop_create_confidence.py +11 -2
- {shellbrain-0.1.35 → shellbrain-0.1.36}/migrations/versions/20260318_0006_usage_telemetry_schema.py +1 -1
- {shellbrain-0.1.35 → shellbrain-0.1.36}/migrations/versions/20260414_0010_model_usage_telemetry.py +5 -3
- {shellbrain-0.1.35 → shellbrain-0.1.36}/migrations/versions/20260414_0011_usage_problem_tokens_multi_solution_metrics.py +4 -2
- {shellbrain-0.1.35 → shellbrain-0.1.36}/migrations/versions/20260415_0012_read_pack_cost_and_read_roi.py +1 -1
- {shellbrain-0.1.35 → shellbrain-0.1.36}/migrations/versions/20260422_0015_problem_runs.py +7 -5
- {shellbrain-0.1.35 → shellbrain-0.1.36}/migrations/versions/20260516_0020_knowledge_build_observability.py +1 -1
- shellbrain-0.1.36/migrations/versions/20260522_0029_remove_frontier_and_memory_anchors.py +490 -0
- shellbrain-0.1.36/migrations/versions/20260522_0030_concept_lifecycle_events.py +116 -0
- shellbrain-0.1.36/migrations/versions/20260522_0031_unified_evidence_storage.py +469 -0
- shellbrain-0.1.36/migrations/versions/20260522_0032_memory_lifecycle_events.py +171 -0
- shellbrain-0.1.36/migrations/versions/20260522_0033_concept_memory_role_cleanup.py +205 -0
- shellbrain-0.1.36/migrations/versions/20260522_0034_structural_memory_relations.py +387 -0
- shellbrain-0.1.36/migrations/versions/20260522_0035_retire_legacy_compatibility_tables.py +346 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/pyproject.toml +1 -1
- {shellbrain-0.1.35 → shellbrain-0.1.36}/shellbrain.egg-info/PKG-INFO +31 -30
- {shellbrain-0.1.35 → shellbrain-0.1.36}/shellbrain.egg-info/SOURCES.txt +11 -1
- shellbrain-0.1.35/app/core/entities/evidence.py +0 -37
- shellbrain-0.1.35/app/core/entities/facts.py +0 -30
- shellbrain-0.1.35/app/core/use_cases/memories/update/request.py +0 -135
- shellbrain-0.1.35/app/core/use_cases/plan_execution.py +0 -167
- shellbrain-0.1.35/app/infrastructure/db/runtime/models/evidence.py +0 -21
- shellbrain-0.1.35/app/infrastructure/db/runtime/models/experiences.py +0 -88
- shellbrain-0.1.35/app/infrastructure/db/runtime/models/memories.py +0 -80
- shellbrain-0.1.35/app/infrastructure/db/runtime/repos/relational/evidence_repo.py +0 -116
- shellbrain-0.1.35/app/infrastructure/db/runtime/repos/relational/experiences_repo.py +0 -41
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/__init__.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/__main__.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/core/__init__.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/core/entities/__init__.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/core/entities/admin_errors.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/core/entities/backups.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/core/entities/episodes.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/core/entities/guidance.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/core/entities/identity.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/core/entities/ids.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/core/entities/inner_agents.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/core/entities/knowledge_builder.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/core/entities/machine_config.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/core/entities/runtime_context.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/core/entities/scenarios.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/core/entities/session_state.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/core/entities/settings.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/core/entities/utility.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/core/errors.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/core/policies/__init__.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/core/policies/concepts/__init__.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/core/policies/concepts/relation_rules.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/core/policies/concepts/search_text.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/core/policies/episodes/__init__.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/core/policies/episodes/event_content.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/core/policies/episodes/knowledge_building.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/core/policies/memories/__init__.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/core/policies/retrieval/__init__.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/core/policies/retrieval/bm25.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/core/policies/retrieval/fusion_rrf.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/core/policies/retrieval/lexical_query.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/core/policies/retrieval/scoring.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/core/ports/__init__.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/core/ports/db/__init__.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/core/ports/db/episode_repositories.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/core/ports/db/guidance.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/core/ports/db/knowledge_builder.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/core/ports/db/problem_runs.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/core/ports/db/unit_of_work.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/core/ports/embeddings/__init__.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/core/ports/embeddings/provider.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/core/ports/embeddings/retrieval.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/core/ports/host_apps/__init__.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/core/ports/host_apps/inner_agents.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/core/ports/local_state/__init__.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/core/ports/local_state/session_state_store.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/core/ports/reporting/__init__.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/core/ports/reporting/metrics.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/core/ports/system/__init__.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/core/ports/system/clock.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/core/ports/system/idgen.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/core/use_cases/__init__.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/core/use_cases/admin/__init__.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/core/use_cases/admin/analytics_diagnostics.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/core/use_cases/admin/backfill_model_usage/__init__.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/core/use_cases/admin/backfill_model_usage/backfill_model_usage.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/core/use_cases/admin/backfill_model_usage/request.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/core/use_cases/admin/backfill_model_usage/result.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/core/use_cases/admin/create_backup.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/core/use_cases/admin/diagnose_runtime.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/core/use_cases/admin/generate_analytics_report.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/core/use_cases/admin/initialize_runtime.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/core/use_cases/admin/restore_backup.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/core/use_cases/admin/verify_backup.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/core/use_cases/build_guidance.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/core/use_cases/concepts/__init__.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/core/use_cases/concepts/add/__init__.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/core/use_cases/concepts/add/execute.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/core/use_cases/concepts/add/request.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/core/use_cases/concepts/add/result.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/core/use_cases/concepts/containment_checks.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/core/use_cases/concepts/embeddings.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/core/use_cases/concepts/reference_checks.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/core/use_cases/concepts/show/__init__.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/core/use_cases/concepts/show/result.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/core/use_cases/concepts/update/result.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/core/use_cases/episodes/__init__.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/core/use_cases/episodes/events/__init__.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/core/use_cases/episodes/events/request.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/core/use_cases/episodes/sync_discovered_host_session.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/core/use_cases/episodes/sync_episode/__init__.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/core/use_cases/episodes/sync_episode/request.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/core/use_cases/episodes/sync_episode/result.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/core/use_cases/episodes/sync_episode/sync_episode.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/core/use_cases/knowledge_builder/__init__.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/core/use_cases/knowledge_builder/build_knowledge/__init__.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/core/use_cases/knowledge_builder/build_knowledge/execute.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/core/use_cases/knowledge_builder/build_knowledge/request.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/core/use_cases/knowledge_builder/build_knowledge/result.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/core/use_cases/knowledge_builder/teach_knowledge/__init__.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/core/use_cases/knowledge_builder/teach_knowledge/execute.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/core/use_cases/knowledge_builder/teach_knowledge/request.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/core/use_cases/knowledge_builder/teach_knowledge/result.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/core/use_cases/memories/__init__.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/core/use_cases/memories/add/__init__.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/core/use_cases/memories/add/request.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/core/use_cases/memories/update/__init__.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/core/use_cases/metrics/__init__.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/core/use_cases/metrics/analyze_agent_behavior.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/core/use_cases/metrics/build_snapshot.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/core/use_cases/metrics/generate_dashboard.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/core/use_cases/retrieval/__init__.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/core/use_cases/retrieval/build_context/__init__.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/core/use_cases/retrieval/build_context/execute.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/core/use_cases/retrieval/concept_seed_retrieval.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/core/use_cases/retrieval/read/__init__.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/core/use_cases/retrieval/read/execute.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/core/use_cases/retrieval/read/request.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/core/use_cases/retrieval/read/result.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/core/use_cases/retrieval/recall/__init__.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/core/use_cases/retrieval/recall/execute.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/core/use_cases/retrieval/recall/request.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/core/use_cases/retrieval/recall/result.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/core/use_cases/scenarios/__init__.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/core/use_cases/scenarios/record/__init__.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/core/use_cases/scenarios/record/execute.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/core/use_cases/scenarios/record/request.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/core/use_cases/scenarios/record/result.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/entrypoints/__init__.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/entrypoints/cli/__init__.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/entrypoints/cli/error_responses.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/entrypoints/cli/handlers/__init__.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/entrypoints/cli/handlers/cli_operation.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/entrypoints/cli/handlers/dependencies.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/entrypoints/cli/handlers/human/__init__.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/entrypoints/cli/handlers/human/admin.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/entrypoints/cli/handlers/human/admin_dependencies.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/entrypoints/cli/handlers/human/init.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/entrypoints/cli/handlers/human/metrics.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/entrypoints/cli/handlers/human/upgrade.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/entrypoints/cli/handlers/internal_agent/__init__.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/entrypoints/cli/handlers/internal_agent/concepts/__init__.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/entrypoints/cli/handlers/internal_agent/concepts/add.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/entrypoints/cli/handlers/internal_agent/concepts/show.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/entrypoints/cli/handlers/internal_agent/episodes/__init__.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/entrypoints/cli/handlers/internal_agent/episodes/events.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/entrypoints/cli/handlers/internal_agent/episodes/selection.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/entrypoints/cli/handlers/internal_agent/episodes/serialization.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/entrypoints/cli/handlers/internal_agent/memories/__init__.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/entrypoints/cli/handlers/internal_agent/memories/add.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/entrypoints/cli/handlers/internal_agent/memories/utility_vote_evidence.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/entrypoints/cli/handlers/internal_agent/retrieval/__init__.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/entrypoints/cli/handlers/internal_agent/retrieval/execution.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/entrypoints/cli/handlers/internal_agent/retrieval/read.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/entrypoints/cli/handlers/internal_agent/scenarios/__init__.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/entrypoints/cli/handlers/internal_agent/scenarios/record.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/entrypoints/cli/handlers/result_envelopes.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/entrypoints/cli/handlers/session_state.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/entrypoints/cli/handlers/working_agent/__init__.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/entrypoints/cli/handlers/working_agent/recall.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/entrypoints/cli/handlers/working_agent/teach.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/entrypoints/cli/main.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/entrypoints/cli/operation_command.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/entrypoints/cli/parser/__init__.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/entrypoints/cli/presenters/__init__.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/entrypoints/cli/presenters/init.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/entrypoints/cli/presenters/json.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/entrypoints/cli/presenters/metrics.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/entrypoints/cli/request_parsing/__init__.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/entrypoints/cli/request_parsing/concepts.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/entrypoints/cli/request_parsing/episodes.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/entrypoints/cli/request_parsing/hydration.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/entrypoints/cli/request_parsing/memories.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/entrypoints/cli/request_parsing/payload_validation.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/entrypoints/cli/request_parsing/prepared.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/entrypoints/cli/request_parsing/retrieval.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/entrypoints/cli/request_parsing/scenarios.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/entrypoints/cli/request_parsing/teach.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/entrypoints/cli/runner.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/entrypoints/cli/runtime.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/entrypoints/host_hooks/__init__.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/entrypoints/host_hooks/claude_session_start.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/entrypoints/host_hooks/cursor_statusline.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/entrypoints/jobs/__init__.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/entrypoints/jobs/episode_sync.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/infrastructure/__init__.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/infrastructure/db/__init__.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/infrastructure/db/admin/__init__.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/infrastructure/db/admin/app_role_safety.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/infrastructure/db/admin/backups/__init__.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/infrastructure/db/admin/backups/destructive_guard.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/infrastructure/db/admin/backups/logical_backup.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/infrastructure/db/admin/backups/manifest_store.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/infrastructure/db/admin/backups/restore.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/infrastructure/db/admin/connection.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/infrastructure/db/admin/instance_guard.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/infrastructure/db/admin/migrations.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/infrastructure/db/admin/privileges.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/infrastructure/db/admin/provisioning/__init__.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/infrastructure/db/admin/provisioning/docker_prerequisites.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/infrastructure/db/admin/provisioning/external_postgres.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/infrastructure/db/admin/provisioning/init_effects.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/infrastructure/db/admin/provisioning/managed_local.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/infrastructure/db/admin/storage_setup.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/infrastructure/db/runtime/__init__.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/infrastructure/db/runtime/engine.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/infrastructure/db/runtime/models/__init__.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/infrastructure/db/runtime/models/episodes.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/infrastructure/db/runtime/models/instance_metadata.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/infrastructure/db/runtime/models/knowledge_builder.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/infrastructure/db/runtime/models/metadata.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/infrastructure/db/runtime/models/problem_runs.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/infrastructure/db/runtime/models/registry.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/infrastructure/db/runtime/models/telemetry.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/infrastructure/db/runtime/queries/__init__.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/infrastructure/db/runtime/queries/agent_behavior.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/infrastructure/db/runtime/queries/analytics.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/infrastructure/db/runtime/queries/metrics.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/infrastructure/db/runtime/queries/metrics_adapter.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/infrastructure/db/runtime/queries/model_usage_backfill.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/infrastructure/db/runtime/repos/__init__.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/infrastructure/db/runtime/repos/relational/__init__.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/infrastructure/db/runtime/repos/relational/associations_repo.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/infrastructure/db/runtime/repos/relational/episodes_repo.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/infrastructure/db/runtime/repos/relational/knowledge_builder_repo.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/infrastructure/db/runtime/repos/relational/problem_runs_repo.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/infrastructure/db/runtime/repos/relational/telemetry_repo.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/infrastructure/db/runtime/repos/relational/utility_repo.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/infrastructure/db/runtime/repos/semantic/__init__.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/infrastructure/db/runtime/repos/semantic/concept_retrieval_repo.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/infrastructure/db/runtime/session.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/infrastructure/db/runtime/uow.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/infrastructure/embeddings/__init__.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/infrastructure/embeddings/local_provider.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/infrastructure/embeddings/prewarm.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/infrastructure/embeddings/query_vector_search.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/infrastructure/host_apps/__init__.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/infrastructure/host_apps/assets/__init__.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/infrastructure/host_apps/assets/claude.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/infrastructure/host_apps/assets/codex.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/infrastructure/host_apps/assets/cursor.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/infrastructure/host_apps/assets/cursor_statusline_config.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/infrastructure/host_apps/assets/inspection.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/infrastructure/host_apps/assets/managed_markdown.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/infrastructure/host_apps/assets/managed_tree.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/infrastructure/host_apps/assets/packaged_assets.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/infrastructure/host_apps/assets/paths.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/infrastructure/host_apps/assets/service.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/infrastructure/host_apps/assets/types.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/infrastructure/host_apps/identity/__init__.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/infrastructure/host_apps/identity/claude_hook_install.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/infrastructure/host_apps/identity/claude_runtime.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/infrastructure/host_apps/identity/codex_runtime.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/infrastructure/host_apps/identity/compatibility.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/infrastructure/host_apps/identity/cursor_statusline.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/infrastructure/host_apps/identity/resolver.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/infrastructure/host_apps/inner_agents/__init__.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/infrastructure/host_apps/inner_agents/codex_cli.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/infrastructure/host_apps/inner_agents/output_parser.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/infrastructure/host_apps/transcripts/__init__.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/infrastructure/host_apps/transcripts/claude_code.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/infrastructure/host_apps/transcripts/codex.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/infrastructure/host_apps/transcripts/cursor.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/infrastructure/host_apps/transcripts/model_usage.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/infrastructure/host_apps/transcripts/normalization.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/infrastructure/host_apps/transcripts/session_selection.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/infrastructure/host_apps/transcripts/source_discovery.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/infrastructure/host_apps/transcripts/tool_filter.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/infrastructure/local_state/__init__.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/infrastructure/local_state/init_lock.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/infrastructure/local_state/machine_config_store.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/infrastructure/local_state/operation_registration.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/infrastructure/local_state/paths.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/infrastructure/local_state/repo_registration_store.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/infrastructure/local_state/session_state_file_store.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/infrastructure/process/__init__.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/infrastructure/process/episode_sync/__init__.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/infrastructure/process/episode_sync/autostart.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/infrastructure/process/episode_sync/launcher.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/infrastructure/process/episode_sync/lock_file.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/infrastructure/process/episode_sync/poller.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/infrastructure/process/episode_sync/status_store.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/infrastructure/reporting/__init__.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/infrastructure/reporting/metrics/__init__.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/infrastructure/reporting/metrics/artifacts.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/infrastructure/reporting/metrics/browser.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/infrastructure/reporting/metrics/pager.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/infrastructure/reporting/metrics/render_html.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/infrastructure/system/__init__.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/infrastructure/system/clock.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/infrastructure/system/id_generator.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/infrastructure/system/package_upgrade.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/infrastructure/telemetry/__init__.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/infrastructure/telemetry/inner_agent_records.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/infrastructure/telemetry/operation_invocations.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/infrastructure/telemetry/operation_polling.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/infrastructure/telemetry/read_records.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/infrastructure/telemetry/recall_records.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/infrastructure/telemetry/recorder.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/infrastructure/telemetry/records.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/infrastructure/telemetry/sink.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/infrastructure/telemetry/storage_protocols.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/infrastructure/telemetry/sync_records.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/settings/__init__.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/settings/defaults/create_policy.yaml +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/settings/defaults/read_policy.yaml +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/settings/defaults/runtime.yaml +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/settings/defaults/thresholds.yaml +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/settings/defaults/update_policy.yaml +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/settings/internal-agents/defaults.yaml +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/startup/__init__.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/startup/admin.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/startup/admin_db.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/startup/admin_dependencies.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/startup/admin_diagnose.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/startup/analytics.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/startup/backup.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/startup/cli.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/startup/cli_runtime.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/startup/config.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/startup/create_policy.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/startup/db.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/startup/dsn_resolution.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/startup/embeddings.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/startup/episode_poller.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/startup/episode_sync_launcher.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/startup/host_hooks.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/startup/internal_agent_config.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/startup/internal_agents.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/startup/knowledge_builder.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/startup/metrics.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/startup/migrations.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/startup/model_usage_backfill.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/startup/operation_dependencies.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/startup/read_policy.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/startup/repo_context.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/startup/repos.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/startup/retrieval.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/startup/runtime_admin.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/startup/runtime_context.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/startup/settings.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/startup/thresholds.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/startup/update_policy.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/app/startup/use_cases.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/migrations/__init__.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/migrations/env.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/migrations/versions/20260226_0001_initial_schema.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/migrations/versions/20260312_0002_add_hard_invariants.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/migrations/versions/20260313_0004_episode_sync_hardening.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/migrations/versions/20260313_0005_evidence_episode_event_refs.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/migrations/versions/20260319_0007_identity_session_guidance.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/migrations/versions/20260320_0008_instance_metadata_and_backup_safety.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/migrations/versions/20260410_0009_frontier_memory_family.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/migrations/versions/20260421_0013_concept_context_graph.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/migrations/versions/20260422_0014_concept_read_telemetry.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/migrations/versions/20260508_0016_recall_telemetry.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/migrations/versions/20260511_0017_inner_agent_invocations.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/migrations/versions/20260513_0018_knowledge_build_runs.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/migrations/versions/20260515_0019_scenario_records.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/migrations/versions/20260519_0021_knowledge_build_watermark_stable.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/migrations/versions/20260519_0022_update_evidence_links.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/migrations/versions/20260519_0023_explicit_teach_trigger.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/migrations/versions/20260519_0024_read_retrieval_latency_indexes.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/migrations/versions/20260519_0025_repair_recall_source_input_section_constraint.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/migrations/versions/20260519_0026_repair_knowledge_build_trigger_constraint.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/migrations/versions/20260519_0027_concept_embeddings.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/migrations/versions/20260520_0028_knowledge_build_lifecycle.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/migrations/versions/__init__.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/onboarding_assets/__init__.py +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/onboarding_assets/claude/CLAUDE.md +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/onboarding_assets/claude/skills/shellbrain/SKILL.md +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/onboarding_assets/claude/skills/shellbrain-usage-review/SKILL.md +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/onboarding_assets/codex/AGENTS.md +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/onboarding_assets/codex/clean-architecture/SKILL.md +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/onboarding_assets/codex/clean-code/SKILL.md +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/onboarding_assets/codex/shellbrain/SKILL.md +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/onboarding_assets/codex/shellbrain/agents/openai.yaml +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/onboarding_assets/codex/shellbrain/assets/shellbrain-large.svg +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/onboarding_assets/codex/shellbrain/assets/shellbrain-small.svg +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/onboarding_assets/codex/shellbrain/assets/shellbrain_logo.png +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/onboarding_assets/codex/shellbrain/references/request-shapes.md +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/onboarding_assets/codex/shellbrain/references/session-workflow.md +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/onboarding_assets/codex/shellbrain-usage-review/SKILL.md +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/onboarding_assets/codex/shellbrain-usage-review/agents/openai.yaml +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/onboarding_assets/codex/shellbrain-usage-review/assets/shellbrain-small.svg +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/onboarding_assets/codex/shellbrain-usage-review/assets/shellbrain_logo.png +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/onboarding_assets/cursor/skills/shellbrain/SKILL.md +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/onboarding_assets/cursor/skills/shellbrain-usage-review/SKILL.md +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/setup.cfg +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/shellbrain.egg-info/dependency_links.txt +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/shellbrain.egg-info/entry_points.txt +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/shellbrain.egg-info/requires.txt +0 -0
- {shellbrain-0.1.35 → shellbrain-0.1.36}/shellbrain.egg-info/top_level.txt +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: shellbrain
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.36
|
|
4
4
|
Summary: Repo-scoped Shellbrain CLI with explicit evidence-backed writes.
|
|
5
5
|
Requires-Python: >=3.11
|
|
6
6
|
Description-Content-Type: text/markdown
|
|
@@ -22,7 +22,28 @@ Requires-Dist: sentence-transformers<4.0,>=3.0
|
|
|
22
22
|
|
|
23
23
|
Agents forget across sessions. They rediscover the same problems, repeat the same mistakes, and relearn what you already taught them. **ShellBrain makes their work compound.**
|
|
24
24
|
|
|
25
|
-
|
|
25
|
+
## Install
|
|
26
|
+
|
|
27
|
+
```bash
|
|
28
|
+
curl -L shellbrain.ai/install | bash
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
**Works for Codex, Claude Code, and Cursor.** The installer runs `shellbrain init` for you. Repos register themselves on first use.
|
|
32
|
+
|
|
33
|
+
Requirements.
|
|
34
|
+
- macOS or Linux, Python 3.11+, Docker for the managed local Postgres+pgvector runtime.
|
|
35
|
+
|
|
36
|
+
### Upgrade for latest capabilities
|
|
37
|
+
|
|
38
|
+
```bash
|
|
39
|
+
shellbrain upgrade
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
The install script also works as an upgrade path: `curl -L shellbrain.ai/upgrade | bash`. Manual alternative: `pipx upgrade shellbrain && shellbrain init`.
|
|
43
|
+
|
|
44
|
+
---
|
|
45
|
+
|
|
46
|
+
## Recall in one command.
|
|
26
47
|
Episodic, empirical, conceptual. Three categories, one retrieval surface.
|
|
27
48
|
|
|
28
49
|
---
|
|
@@ -44,20 +65,21 @@ The episodic layer is truth. Empirical memory extracts. Concept memory abstracts
|
|
|
44
65
|
|
|
45
66
|
---
|
|
46
67
|
|
|
47
|
-
## How
|
|
68
|
+
## How Agents Use ShellBrain
|
|
48
69
|
|
|
49
|
-
|
|
70
|
+
### Recall
|
|
71
|
+
|
|
72
|
+
**Working agents call `shellbrain recall`.** That is the normal interface they have to think about. One command, **one _carefully curated_ compact brief**, with sources cited.
|
|
50
73
|
|
|
51
74
|
```bash
|
|
52
75
|
shellbrain recall --json '{"query":"what context matters for this migration lock timeout?","current_problem":{"goal":"fix the migration hang","surface":"db admin","obstacle":"lock timeout","hypothesis":"none yet"}}'
|
|
53
76
|
```
|
|
54
77
|
|
|
55
|
-
|
|
56
|
-
- `read`, `events`, `concept show`, `memory add`, `memory update`, `concept add`, `concept update`
|
|
78
|
+
**Working agents focus on only their work.**
|
|
57
79
|
|
|
58
|
-
|
|
80
|
+
### Teach
|
|
59
81
|
|
|
60
|
-
**Working agents
|
|
82
|
+
**Working agents call `shellbrain teach` for explicit teaching.** You can tell an agent to remember important ideas.
|
|
61
83
|
|
|
62
84
|
---
|
|
63
85
|
|
|
@@ -69,27 +91,6 @@ Memory that is grounded in evidence, small in scope, and asked for rather than p
|
|
|
69
91
|
|
|
70
92
|
---
|
|
71
93
|
|
|
72
|
-
## Install
|
|
73
|
-
|
|
74
|
-
```bash
|
|
75
|
-
curl -L shellbrain.ai/install | bash
|
|
76
|
-
```
|
|
77
|
-
|
|
78
|
-
**Works for Codex, Claude Code, and Cursor.** The installer runs `shellbrain init` for you. Repos register themselves on first use.
|
|
79
|
-
|
|
80
|
-
Requirements.
|
|
81
|
-
- macOS or Linux, Python 3.11+, Docker for the managed local Postgres+pgvector runtime.
|
|
82
|
-
|
|
83
|
-
### Upgrade for latest capabilities
|
|
84
|
-
|
|
85
|
-
```bash
|
|
86
|
-
shellbrain upgrade
|
|
87
|
-
```
|
|
88
|
-
|
|
89
|
-
The install script also works as an upgrade path: `curl -L shellbrain.ai/upgrade | bash`. Manual alternative: `pipx upgrade shellbrain && shellbrain init`.
|
|
90
|
-
|
|
91
|
-
---
|
|
92
|
-
|
|
93
94
|
## How to Use ShellBrain
|
|
94
95
|
|
|
95
96
|
Use Shellbrain in your agent of choice. Then, just work normally.
|
|
@@ -104,7 +105,7 @@ Use Shellbrain in your agent of choice. Then, just work normally.
|
|
|
104
105
|
|
|
105
106
|
## Repair
|
|
106
107
|
|
|
107
|
-
`shellbrain admin doctor` to inspect. `shellbrain init` to repair if doctor flags it. Do not rerun init every session
|
|
108
|
+
`shellbrain admin doctor` to inspect. `shellbrain init` to repair if doctor flags it. Do not rerun init every session.
|
|
108
109
|
|
|
109
110
|
---
|
|
110
111
|
|
|
@@ -8,7 +8,28 @@
|
|
|
8
8
|
|
|
9
9
|
Agents forget across sessions. They rediscover the same problems, repeat the same mistakes, and relearn what you already taught them. **ShellBrain makes their work compound.**
|
|
10
10
|
|
|
11
|
-
|
|
11
|
+
## Install
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
curl -L shellbrain.ai/install | bash
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
**Works for Codex, Claude Code, and Cursor.** The installer runs `shellbrain init` for you. Repos register themselves on first use.
|
|
18
|
+
|
|
19
|
+
Requirements.
|
|
20
|
+
- macOS or Linux, Python 3.11+, Docker for the managed local Postgres+pgvector runtime.
|
|
21
|
+
|
|
22
|
+
### Upgrade for latest capabilities
|
|
23
|
+
|
|
24
|
+
```bash
|
|
25
|
+
shellbrain upgrade
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
The install script also works as an upgrade path: `curl -L shellbrain.ai/upgrade | bash`. Manual alternative: `pipx upgrade shellbrain && shellbrain init`.
|
|
29
|
+
|
|
30
|
+
---
|
|
31
|
+
|
|
32
|
+
## Recall in one command.
|
|
12
33
|
Episodic, empirical, conceptual. Three categories, one retrieval surface.
|
|
13
34
|
|
|
14
35
|
---
|
|
@@ -30,20 +51,21 @@ The episodic layer is truth. Empirical memory extracts. Concept memory abstracts
|
|
|
30
51
|
|
|
31
52
|
---
|
|
32
53
|
|
|
33
|
-
## How
|
|
54
|
+
## How Agents Use ShellBrain
|
|
34
55
|
|
|
35
|
-
|
|
56
|
+
### Recall
|
|
57
|
+
|
|
58
|
+
**Working agents call `shellbrain recall`.** That is the normal interface they have to think about. One command, **one _carefully curated_ compact brief**, with sources cited.
|
|
36
59
|
|
|
37
60
|
```bash
|
|
38
61
|
shellbrain recall --json '{"query":"what context matters for this migration lock timeout?","current_problem":{"goal":"fix the migration hang","surface":"db admin","obstacle":"lock timeout","hypothesis":"none yet"}}'
|
|
39
62
|
```
|
|
40
63
|
|
|
41
|
-
|
|
42
|
-
- `read`, `events`, `concept show`, `memory add`, `memory update`, `concept add`, `concept update`
|
|
64
|
+
**Working agents focus on only their work.**
|
|
43
65
|
|
|
44
|
-
|
|
66
|
+
### Teach
|
|
45
67
|
|
|
46
|
-
**Working agents
|
|
68
|
+
**Working agents call `shellbrain teach` for explicit teaching.** You can tell an agent to remember important ideas.
|
|
47
69
|
|
|
48
70
|
---
|
|
49
71
|
|
|
@@ -55,27 +77,6 @@ Memory that is grounded in evidence, small in scope, and asked for rather than p
|
|
|
55
77
|
|
|
56
78
|
---
|
|
57
79
|
|
|
58
|
-
## Install
|
|
59
|
-
|
|
60
|
-
```bash
|
|
61
|
-
curl -L shellbrain.ai/install | bash
|
|
62
|
-
```
|
|
63
|
-
|
|
64
|
-
**Works for Codex, Claude Code, and Cursor.** The installer runs `shellbrain init` for you. Repos register themselves on first use.
|
|
65
|
-
|
|
66
|
-
Requirements.
|
|
67
|
-
- macOS or Linux, Python 3.11+, Docker for the managed local Postgres+pgvector runtime.
|
|
68
|
-
|
|
69
|
-
### Upgrade for latest capabilities
|
|
70
|
-
|
|
71
|
-
```bash
|
|
72
|
-
shellbrain upgrade
|
|
73
|
-
```
|
|
74
|
-
|
|
75
|
-
The install script also works as an upgrade path: `curl -L shellbrain.ai/upgrade | bash`. Manual alternative: `pipx upgrade shellbrain && shellbrain init`.
|
|
76
|
-
|
|
77
|
-
---
|
|
78
|
-
|
|
79
80
|
## How to Use ShellBrain
|
|
80
81
|
|
|
81
82
|
Use Shellbrain in your agent of choice. Then, just work normally.
|
|
@@ -90,7 +91,7 @@ Use Shellbrain in your agent of choice. Then, just work normally.
|
|
|
90
91
|
|
|
91
92
|
## Repair
|
|
92
93
|
|
|
93
|
-
`shellbrain admin doctor` to inspect. `shellbrain init` to repair if doctor flags it. Do not rerun init every session
|
|
94
|
+
`shellbrain admin doctor` to inspect. `shellbrain init` to repair if doctor flags it. Do not rerun init every session.
|
|
94
95
|
|
|
95
96
|
---
|
|
96
97
|
|
|
@@ -35,6 +35,16 @@ class ConceptLifecycleStatus(str, Enum):
|
|
|
35
35
|
STALE = "stale"
|
|
36
36
|
SUPERSEDED = "superseded"
|
|
37
37
|
WRONG = "wrong"
|
|
38
|
+
ARCHIVED = "archived"
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
class ConceptLifecycleTargetType(str, Enum):
|
|
42
|
+
"""Truth-bearing concept record types with mutable lifecycle state."""
|
|
43
|
+
|
|
44
|
+
RELATION = "relation"
|
|
45
|
+
CLAIM = "claim"
|
|
46
|
+
GROUNDING = "grounding"
|
|
47
|
+
MEMORY_LINK = "memory_link"
|
|
38
48
|
|
|
39
49
|
|
|
40
50
|
class ConceptRelationPredicate(str, Enum):
|
|
@@ -73,7 +83,6 @@ class AnchorKind(str, Enum):
|
|
|
73
83
|
LOG = "log"
|
|
74
84
|
DOC = "doc"
|
|
75
85
|
COMMIT = "commit"
|
|
76
|
-
MEMORY = "memory"
|
|
77
86
|
|
|
78
87
|
|
|
79
88
|
class AnchorStatus(str, Enum):
|
|
@@ -103,10 +112,8 @@ class ConceptMemoryLinkRole(str, Enum):
|
|
|
103
112
|
EXAMPLE_OF = "example_of"
|
|
104
113
|
SOLUTION_FOR = "solution_for"
|
|
105
114
|
FAILED_TACTIC_FOR = "failed_tactic_for"
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
CONTRADICTED = "contradicted"
|
|
109
|
-
WARNED_ABOUT = "warned_about"
|
|
115
|
+
WARNS_ABOUT = "warns_about"
|
|
116
|
+
CHANGE_RELEVANT_TO = "change_relevant_to"
|
|
110
117
|
|
|
111
118
|
|
|
112
119
|
class ConceptEvidenceTargetType(str, Enum):
|
|
@@ -116,6 +123,7 @@ class ConceptEvidenceTargetType(str, Enum):
|
|
|
116
123
|
CLAIM = "claim"
|
|
117
124
|
GROUNDING = "grounding"
|
|
118
125
|
MEMORY_LINK = "memory_link"
|
|
126
|
+
LIFECYCLE_EVENT = "lifecycle_event"
|
|
119
127
|
|
|
120
128
|
|
|
121
129
|
class ConceptEvidenceKind(str, Enum):
|
|
@@ -193,10 +201,28 @@ class ConceptLifecycle:
|
|
|
193
201
|
confidence: float = 0.5
|
|
194
202
|
observed_at: datetime | None = None
|
|
195
203
|
validated_at: datetime | None = None
|
|
204
|
+
invalidated_at: datetime | None = None
|
|
196
205
|
source_kind: ConceptSourceKind | None = None
|
|
197
206
|
source_ref: str | None = None
|
|
198
207
|
superseded_by_id: str | None = None
|
|
199
208
|
created_by: ConceptCreatedBy = ConceptCreatedBy.MANUAL
|
|
209
|
+
updated_by: ConceptCreatedBy | None = None
|
|
210
|
+
|
|
211
|
+
|
|
212
|
+
@dataclass(frozen=True, kw_only=True)
|
|
213
|
+
class ConceptLifecycleEvent:
|
|
214
|
+
"""One auditable lifecycle transition for a truth-bearing concept record."""
|
|
215
|
+
|
|
216
|
+
id: str
|
|
217
|
+
repo_id: str
|
|
218
|
+
target_type: ConceptLifecycleTargetType
|
|
219
|
+
target_id: str
|
|
220
|
+
from_status: ConceptLifecycleStatus
|
|
221
|
+
to_status: ConceptLifecycleStatus
|
|
222
|
+
rationale: str
|
|
223
|
+
actor: ConceptCreatedBy
|
|
224
|
+
superseded_by_id: str | None = None
|
|
225
|
+
created_at: datetime | None = None
|
|
200
226
|
|
|
201
227
|
|
|
202
228
|
@dataclass(frozen=True, kw_only=True)
|
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
"""This module defines evidence references and unified evidence-link entities."""
|
|
2
|
+
|
|
3
|
+
import hashlib
|
|
4
|
+
import json
|
|
5
|
+
from dataclasses import dataclass
|
|
6
|
+
from datetime import datetime
|
|
7
|
+
from enum import Enum
|
|
8
|
+
|
|
9
|
+
from app.core.entities.ids import (
|
|
10
|
+
AssociationEdgeId,
|
|
11
|
+
EvidenceId,
|
|
12
|
+
EvidenceRefText,
|
|
13
|
+
MemoryId,
|
|
14
|
+
RepoId,
|
|
15
|
+
)
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
class EvidenceTargetType(str, Enum):
|
|
19
|
+
"""Storage-neutral targets that may carry evidence."""
|
|
20
|
+
|
|
21
|
+
MEMORY = "memory"
|
|
22
|
+
ASSOCIATION_EDGE = "association_edge"
|
|
23
|
+
UTILITY_OBSERVATION = "utility_observation"
|
|
24
|
+
CONCEPT_CLAIM = "concept_claim"
|
|
25
|
+
CONCEPT_RELATION = "concept_relation"
|
|
26
|
+
CONCEPT_GROUNDING = "concept_grounding"
|
|
27
|
+
CONCEPT_MEMORY_LINK = "concept_memory_link"
|
|
28
|
+
CONCEPT_LIFECYCLE_EVENT = "concept_lifecycle_event"
|
|
29
|
+
MEMORY_LIFECYCLE_EVENT = "memory_lifecycle_event"
|
|
30
|
+
STRUCTURAL_MEMORY_RELATION = "structural_memory_relation"
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
class EvidenceSourceKind(str, Enum):
|
|
34
|
+
"""Storage-neutral kinds of evidence sources."""
|
|
35
|
+
|
|
36
|
+
EPISODE_EVENT = "episode_event"
|
|
37
|
+
ANCHOR = "anchor"
|
|
38
|
+
MEMORY = "memory"
|
|
39
|
+
COMMIT = "commit"
|
|
40
|
+
TRANSCRIPT = "transcript"
|
|
41
|
+
TEST = "test"
|
|
42
|
+
MANUAL = "manual"
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
class EvidenceRole(str, Enum):
|
|
46
|
+
"""Semantic role an evidence source plays for a target."""
|
|
47
|
+
|
|
48
|
+
SUPPORTS = "supports"
|
|
49
|
+
CONTRADICTS = "contradicts"
|
|
50
|
+
OBSERVED_IN = "observed_in"
|
|
51
|
+
CREATED_FROM = "created_from"
|
|
52
|
+
VALIDATED_BY = "validated_by"
|
|
53
|
+
INVALIDATED_BY = "invalidated_by"
|
|
54
|
+
EXPLAINS = "explains"
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
@dataclass(kw_only=True)
|
|
58
|
+
class EvidenceRef:
|
|
59
|
+
"""This dataclass models a canonical evidence reference entry."""
|
|
60
|
+
|
|
61
|
+
id: EvidenceId
|
|
62
|
+
repo_id: RepoId
|
|
63
|
+
ref: EvidenceRefText
|
|
64
|
+
kind: EvidenceSourceKind = EvidenceSourceKind.EPISODE_EVENT
|
|
65
|
+
canonical_hash: str | None = None
|
|
66
|
+
episode_event_id: str | None = None
|
|
67
|
+
anchor_id: str | None = None
|
|
68
|
+
memory_id: str | None = None
|
|
69
|
+
commit_ref: str | None = None
|
|
70
|
+
transcript_ref: str | None = None
|
|
71
|
+
note: str | None = None
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
@dataclass(frozen=True, kw_only=True)
|
|
75
|
+
class EvidenceTarget:
|
|
76
|
+
"""One evidence-backed target in the unified evidence API."""
|
|
77
|
+
|
|
78
|
+
target_type: EvidenceTargetType
|
|
79
|
+
target_id: str
|
|
80
|
+
|
|
81
|
+
def __post_init__(self) -> None:
|
|
82
|
+
object.__setattr__(
|
|
83
|
+
self, "target_type", EvidenceTargetType(self.target_type)
|
|
84
|
+
)
|
|
85
|
+
if not self.target_id.strip():
|
|
86
|
+
raise ValueError("evidence target_id must be non-empty")
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
@dataclass(frozen=True, kw_only=True)
|
|
90
|
+
class EvidenceSource:
|
|
91
|
+
"""One normalized source that can support an evidence-backed target."""
|
|
92
|
+
|
|
93
|
+
source_kind: EvidenceSourceKind
|
|
94
|
+
ref: str | None = None
|
|
95
|
+
episode_event_id: str | None = None
|
|
96
|
+
anchor_id: str | None = None
|
|
97
|
+
memory_id: str | None = None
|
|
98
|
+
commit_ref: str | None = None
|
|
99
|
+
transcript_ref: str | None = None
|
|
100
|
+
note: str | None = None
|
|
101
|
+
|
|
102
|
+
def __post_init__(self) -> None:
|
|
103
|
+
object.__setattr__(
|
|
104
|
+
self, "source_kind", EvidenceSourceKind(self.source_kind)
|
|
105
|
+
)
|
|
106
|
+
if self.source_kind is EvidenceSourceKind.EPISODE_EVENT:
|
|
107
|
+
event_ref = self.ref or self.episode_event_id
|
|
108
|
+
if event_ref is None or not event_ref.strip():
|
|
109
|
+
raise ValueError("episode_event evidence requires ref")
|
|
110
|
+
if self.ref is not None and self.episode_event_id is not None:
|
|
111
|
+
if self.ref != self.episode_event_id:
|
|
112
|
+
raise ValueError("episode_event ref and episode_event_id differ")
|
|
113
|
+
object.__setattr__(self, "ref", event_ref)
|
|
114
|
+
object.__setattr__(self, "episode_event_id", event_ref)
|
|
115
|
+
_require_no_fields(
|
|
116
|
+
self,
|
|
117
|
+
"anchor_id",
|
|
118
|
+
"memory_id",
|
|
119
|
+
"commit_ref",
|
|
120
|
+
"transcript_ref",
|
|
121
|
+
"note",
|
|
122
|
+
)
|
|
123
|
+
return
|
|
124
|
+
|
|
125
|
+
required_field = _SOURCE_REQUIRED_FIELD[self.source_kind]
|
|
126
|
+
_require_one_field(self, required_field)
|
|
127
|
+
_require_no_fields(
|
|
128
|
+
self,
|
|
129
|
+
*(
|
|
130
|
+
field
|
|
131
|
+
for field in _SOURCE_REFERENCE_FIELDS
|
|
132
|
+
if field != required_field
|
|
133
|
+
),
|
|
134
|
+
"ref",
|
|
135
|
+
"episode_event_id",
|
|
136
|
+
)
|
|
137
|
+
|
|
138
|
+
|
|
139
|
+
@dataclass(frozen=True, kw_only=True)
|
|
140
|
+
class EvidenceLinkView:
|
|
141
|
+
"""One resolved evidence link with a storage-neutral target and source."""
|
|
142
|
+
|
|
143
|
+
target: EvidenceTarget
|
|
144
|
+
source: EvidenceSource
|
|
145
|
+
role: EvidenceRole
|
|
146
|
+
evidence_id: EvidenceId | None = None
|
|
147
|
+
created_at: datetime | None = None
|
|
148
|
+
|
|
149
|
+
|
|
150
|
+
@dataclass(kw_only=True)
|
|
151
|
+
class MemoryEvidenceLink:
|
|
152
|
+
"""This dataclass models a many-to-many link between shellbrain and evidence."""
|
|
153
|
+
|
|
154
|
+
memory_id: MemoryId
|
|
155
|
+
evidence_id: EvidenceId
|
|
156
|
+
|
|
157
|
+
|
|
158
|
+
@dataclass(kw_only=True)
|
|
159
|
+
class AssociationEdgeEvidenceLink:
|
|
160
|
+
"""This dataclass models a many-to-many link between association edges and evidence."""
|
|
161
|
+
|
|
162
|
+
edge_id: AssociationEdgeId
|
|
163
|
+
evidence_id: EvidenceId
|
|
164
|
+
|
|
165
|
+
|
|
166
|
+
_SOURCE_REQUIRED_FIELD: dict[EvidenceSourceKind, str] = {
|
|
167
|
+
EvidenceSourceKind.ANCHOR: "anchor_id",
|
|
168
|
+
EvidenceSourceKind.MEMORY: "memory_id",
|
|
169
|
+
EvidenceSourceKind.COMMIT: "commit_ref",
|
|
170
|
+
EvidenceSourceKind.TRANSCRIPT: "transcript_ref",
|
|
171
|
+
EvidenceSourceKind.TEST: "note",
|
|
172
|
+
EvidenceSourceKind.MANUAL: "note",
|
|
173
|
+
}
|
|
174
|
+
_SOURCE_REFERENCE_FIELDS = frozenset(_SOURCE_REQUIRED_FIELD.values())
|
|
175
|
+
|
|
176
|
+
|
|
177
|
+
def _require_one_field(source: EvidenceSource, field: str) -> None:
|
|
178
|
+
value = getattr(source, field)
|
|
179
|
+
if value is None or not str(value).strip():
|
|
180
|
+
raise ValueError(f"{source.source_kind.value} evidence requires {field}")
|
|
181
|
+
|
|
182
|
+
|
|
183
|
+
def _require_no_fields(source: EvidenceSource, *fields: str) -> None:
|
|
184
|
+
extra_fields = [
|
|
185
|
+
field
|
|
186
|
+
for field in fields
|
|
187
|
+
if getattr(source, field) is not None
|
|
188
|
+
]
|
|
189
|
+
if extra_fields:
|
|
190
|
+
raise ValueError(
|
|
191
|
+
f"{source.source_kind.value} evidence does not accept: "
|
|
192
|
+
+ ", ".join(sorted(extra_fields))
|
|
193
|
+
)
|
|
194
|
+
|
|
195
|
+
|
|
196
|
+
def canonical_evidence_hash(source: EvidenceSource) -> str:
|
|
197
|
+
"""Return the source-only canonical hash used to dedupe evidence refs."""
|
|
198
|
+
|
|
199
|
+
payload = {
|
|
200
|
+
"kind": source.source_kind.value,
|
|
201
|
+
"identity": _source_identity(source),
|
|
202
|
+
}
|
|
203
|
+
serialized = json.dumps(
|
|
204
|
+
payload, sort_keys=True, separators=(",", ":"), ensure_ascii=False
|
|
205
|
+
)
|
|
206
|
+
return "sha256:" + hashlib.sha256(serialized.encode("utf-8")).hexdigest()
|
|
207
|
+
|
|
208
|
+
|
|
209
|
+
def evidence_source_ref(source: EvidenceSource) -> str:
|
|
210
|
+
"""Return the required display/source reference string for one evidence source."""
|
|
211
|
+
|
|
212
|
+
return _source_identity(source)
|
|
213
|
+
|
|
214
|
+
|
|
215
|
+
def _source_identity(source: EvidenceSource) -> str:
|
|
216
|
+
if source.source_kind is EvidenceSourceKind.EPISODE_EVENT:
|
|
217
|
+
assert source.episode_event_id is not None
|
|
218
|
+
return source.episode_event_id
|
|
219
|
+
required_field = _SOURCE_REQUIRED_FIELD[source.source_kind]
|
|
220
|
+
value = getattr(source, required_field)
|
|
221
|
+
assert value is not None
|
|
222
|
+
return str(value)
|
|
@@ -9,9 +9,13 @@ from app.core.entities.ids import MemoryId, RepoId
|
|
|
9
9
|
|
|
10
10
|
|
|
11
11
|
MemoryKindValue = Literal[
|
|
12
|
-
"problem", "solution", "failed_tactic", "fact", "preference", "change"
|
|
12
|
+
"problem", "solution", "failed_tactic", "fact", "preference", "change"
|
|
13
13
|
]
|
|
14
|
-
AssociationRelationValue = Literal["depends_on", "associated_with"
|
|
14
|
+
AssociationRelationValue = Literal["depends_on", "associated_with"]
|
|
15
|
+
MemoryLifecycleStatusValue = Literal[
|
|
16
|
+
"active", "maybe_stale", "stale", "superseded", "wrong", "archived"
|
|
17
|
+
]
|
|
18
|
+
MemoryLifecycleActorValue = Literal["worker", "librarian", "manual", "import"]
|
|
15
19
|
|
|
16
20
|
|
|
17
21
|
class MemoryKind(str, Enum):
|
|
@@ -23,7 +27,6 @@ class MemoryKind(str, Enum):
|
|
|
23
27
|
FACT = "fact"
|
|
24
28
|
PREFERENCE = "preference"
|
|
25
29
|
CHANGE = "change"
|
|
26
|
-
FRONTIER = "frontier"
|
|
27
30
|
|
|
28
31
|
@property
|
|
29
32
|
def requires_problem_link(self) -> bool:
|
|
@@ -65,6 +68,55 @@ class MemoryScope(str, Enum):
|
|
|
65
68
|
GLOBAL = "global"
|
|
66
69
|
|
|
67
70
|
|
|
71
|
+
class MemoryLifecycleStatus(str, Enum):
|
|
72
|
+
"""Lifecycle state for concrete durable memories."""
|
|
73
|
+
|
|
74
|
+
ACTIVE = "active"
|
|
75
|
+
MAYBE_STALE = "maybe_stale"
|
|
76
|
+
STALE = "stale"
|
|
77
|
+
SUPERSEDED = "superseded"
|
|
78
|
+
WRONG = "wrong"
|
|
79
|
+
ARCHIVED = "archived"
|
|
80
|
+
|
|
81
|
+
@property
|
|
82
|
+
def has_positive_retrieval_signal(self) -> bool:
|
|
83
|
+
"""Return whether normal read/recall may retrieve this memory."""
|
|
84
|
+
|
|
85
|
+
return self in DEFAULT_RETRIEVABLE_MEMORY_STATUSES
|
|
86
|
+
|
|
87
|
+
@property
|
|
88
|
+
def retrieval_multiplier(self) -> float:
|
|
89
|
+
"""Return the default retrieval strength multiplier for this lifecycle state."""
|
|
90
|
+
|
|
91
|
+
return {
|
|
92
|
+
MemoryLifecycleStatus.ACTIVE: 1.0,
|
|
93
|
+
MemoryLifecycleStatus.MAYBE_STALE: 0.65,
|
|
94
|
+
MemoryLifecycleStatus.STALE: 0.25,
|
|
95
|
+
MemoryLifecycleStatus.SUPERSEDED: 0.0,
|
|
96
|
+
MemoryLifecycleStatus.WRONG: 0.0,
|
|
97
|
+
MemoryLifecycleStatus.ARCHIVED: 0.0,
|
|
98
|
+
}[self]
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
class MemoryLifecycleActor(str, Enum):
|
|
102
|
+
"""Actor classes allowed to mutate concrete memory lifecycle state."""
|
|
103
|
+
|
|
104
|
+
WORKER = "worker"
|
|
105
|
+
LIBRARIAN = "librarian"
|
|
106
|
+
MANUAL = "manual"
|
|
107
|
+
IMPORT = "import"
|
|
108
|
+
|
|
109
|
+
|
|
110
|
+
DEFAULT_RETRIEVABLE_MEMORY_STATUSES: Final[tuple[MemoryLifecycleStatus, ...]] = (
|
|
111
|
+
MemoryLifecycleStatus.ACTIVE,
|
|
112
|
+
MemoryLifecycleStatus.MAYBE_STALE,
|
|
113
|
+
MemoryLifecycleStatus.STALE,
|
|
114
|
+
)
|
|
115
|
+
DEFAULT_RETRIEVABLE_MEMORY_STATUS_VALUES: Final[tuple[str, ...]] = tuple(
|
|
116
|
+
status.value for status in DEFAULT_RETRIEVABLE_MEMORY_STATUSES
|
|
117
|
+
)
|
|
118
|
+
|
|
119
|
+
|
|
68
120
|
@dataclass(frozen=True)
|
|
69
121
|
class EvidenceRefs:
|
|
70
122
|
"""Validated immutable episode-event evidence references."""
|
|
@@ -138,9 +190,33 @@ class Memory:
|
|
|
138
190
|
kind: MemoryKind
|
|
139
191
|
text: str
|
|
140
192
|
created_at: datetime | None = None
|
|
141
|
-
|
|
193
|
+
status: MemoryLifecycleStatus = MemoryLifecycleStatus.ACTIVE
|
|
194
|
+
validated_at: datetime | None = None
|
|
195
|
+
invalidated_at: datetime | None = None
|
|
196
|
+
superseded_by_id: MemoryId | None = None
|
|
197
|
+
updated_by: MemoryLifecycleActor | None = None
|
|
142
198
|
|
|
143
199
|
def is_visible_in(self, repo_id: RepoId | str) -> bool:
|
|
144
200
|
"""Return whether this memory is visible inside a repo operation context."""
|
|
145
201
|
|
|
146
202
|
return self.repo_id == repo_id or self.scope == MemoryScope.GLOBAL
|
|
203
|
+
|
|
204
|
+
def has_positive_retrieval_signal(self) -> bool:
|
|
205
|
+
"""Return whether normal read/recall should retrieve this memory."""
|
|
206
|
+
|
|
207
|
+
return self.status.has_positive_retrieval_signal
|
|
208
|
+
|
|
209
|
+
|
|
210
|
+
@dataclass(kw_only=True)
|
|
211
|
+
class MemoryLifecycleEvent:
|
|
212
|
+
"""Append-only audit event for concrete memory lifecycle transitions."""
|
|
213
|
+
|
|
214
|
+
id: str
|
|
215
|
+
repo_id: RepoId
|
|
216
|
+
memory_id: MemoryId
|
|
217
|
+
from_status: MemoryLifecycleStatus
|
|
218
|
+
to_status: MemoryLifecycleStatus
|
|
219
|
+
rationale: str
|
|
220
|
+
actor: MemoryLifecycleActor
|
|
221
|
+
superseded_by_id: MemoryId | None = None
|
|
222
|
+
created_at: datetime | None = None
|