shellbrain 0.1.13__tar.gz → 0.1.14__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.13 → shellbrain-0.1.14}/PKG-INFO +14 -1
- {shellbrain-0.1.13 → shellbrain-0.1.14}/README.md +13 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/app/core/policies/_shared/executor.py +2 -2
- {shellbrain-0.1.13 → shellbrain-0.1.14}/app/periphery/admin/analytics_diagnostics.py +1 -1
- {shellbrain-0.1.13 → shellbrain-0.1.14}/app/periphery/admin/instance_guard.py +20 -1
- {shellbrain-0.1.13 → shellbrain-0.1.14}/app/periphery/db/repos/relational/evidence_repo.py +10 -1
- {shellbrain-0.1.13 → shellbrain-0.1.14}/pyproject.toml +1 -1
- {shellbrain-0.1.13 → shellbrain-0.1.14}/shellbrain.egg-info/PKG-INFO +14 -1
- {shellbrain-0.1.13 → shellbrain-0.1.14}/app/__init__.py +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/app/__main__.py +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/app/boot/__init__.py +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/app/boot/admin_db.py +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/app/boot/config.py +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/app/boot/create_policy.py +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/app/boot/db.py +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/app/boot/embeddings.py +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/app/boot/home.py +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/app/boot/migrations.py +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/app/boot/read_policy.py +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/app/boot/repos.py +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/app/boot/retrieval.py +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/app/boot/thresholds.py +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/app/boot/update_policy.py +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/app/boot/use_cases.py +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/app/config/__init__.py +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/app/config/defaults/create_policy.yaml +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/app/config/defaults/read_policy.yaml +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/app/config/defaults/runtime.yaml +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/app/config/defaults/thresholds.yaml +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/app/config/defaults/update_policy.yaml +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/app/config/loader.py +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/app/core/__init__.py +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/app/core/contracts/__init__.py +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/app/core/contracts/errors.py +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/app/core/contracts/requests.py +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/app/core/contracts/responses.py +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/app/core/entities/__init__.py +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/app/core/entities/associations.py +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/app/core/entities/episodes.py +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/app/core/entities/evidence.py +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/app/core/entities/facts.py +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/app/core/entities/guidance.py +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/app/core/entities/identity.py +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/app/core/entities/memory.py +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/app/core/entities/runtime_context.py +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/app/core/entities/session_state.py +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/app/core/entities/telemetry.py +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/app/core/entities/utility.py +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/app/core/interfaces/__init__.py +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/app/core/interfaces/clock.py +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/app/core/interfaces/config.py +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/app/core/interfaces/embeddings.py +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/app/core/interfaces/idgen.py +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/app/core/interfaces/repos.py +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/app/core/interfaces/retrieval.py +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/app/core/interfaces/session_state_store.py +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/app/core/interfaces/unit_of_work.py +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/app/core/policies/__init__.py +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/app/core/policies/_shared/__init__.py +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/app/core/policies/_shared/side_effects.py +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/app/core/policies/create_policy/__init__.py +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/app/core/policies/create_policy/pipeline.py +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/app/core/policies/read_policy/__init__.py +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/app/core/policies/read_policy/bm25.py +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/app/core/policies/read_policy/context_pack_builder.py +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/app/core/policies/read_policy/expansion.py +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/app/core/policies/read_policy/fusion_rrf.py +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/app/core/policies/read_policy/lexical_query.py +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/app/core/policies/read_policy/pipeline.py +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/app/core/policies/read_policy/scenario_lift.py +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/app/core/policies/read_policy/scoring.py +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/app/core/policies/read_policy/seed_retrieval.py +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/app/core/policies/read_policy/utility_prior.py +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/app/core/policies/update_policy/__init__.py +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/app/core/policies/update_policy/pipeline.py +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/app/core/use_cases/__init__.py +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/app/core/use_cases/build_guidance.py +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/app/core/use_cases/create_memory.py +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/app/core/use_cases/manage_session_state.py +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/app/core/use_cases/read_memory.py +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/app/core/use_cases/record_episode_sync_telemetry.py +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/app/core/use_cases/record_operation_telemetry.py +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/app/core/use_cases/sync_episode.py +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/app/core/use_cases/update_memory.py +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/app/migrations/__init__.py +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/app/migrations/env.py +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/app/migrations/versions/20260226_0001_initial_schema.py +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/app/migrations/versions/20260312_0002_add_hard_invariants.py +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/app/migrations/versions/20260312_0003_drop_create_confidence.py +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/app/migrations/versions/20260313_0004_episode_sync_hardening.py +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/app/migrations/versions/20260313_0005_evidence_episode_event_refs.py +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/app/migrations/versions/20260318_0006_usage_telemetry_schema.py +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/app/migrations/versions/20260319_0007_identity_session_guidance.py +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/app/migrations/versions/20260320_0008_instance_metadata_and_backup_safety.py +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/app/migrations/versions/__init__.py +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/app/onboarding_assets/__init__.py +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/app/onboarding_assets/claude/skills/shellbrain-session-start/SKILL.md +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/app/onboarding_assets/claude/skills/shellbrain-usage-review/SKILL.md +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/app/onboarding_assets/codex/shellbrain-session-start/SKILL.md +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/app/onboarding_assets/codex/shellbrain-session-start/agents/openai.yaml +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/app/onboarding_assets/codex/shellbrain-session-start/assets/shellbrain-large.svg +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/app/onboarding_assets/codex/shellbrain-session-start/assets/shellbrain-small.svg +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/app/onboarding_assets/codex/shellbrain-session-start/references/request-shapes.md +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/app/onboarding_assets/codex/shellbrain-session-start/references/session-workflow.md +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/app/onboarding_assets/codex/shellbrain-usage-review/SKILL.md +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/app/onboarding_assets/codex/shellbrain-usage-review/agents/openai.yaml +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/app/onboarding_assets/cursor/skills/shellbrain-session-start/SKILL.md +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/app/onboarding_assets/cursor/skills/shellbrain-usage-review/SKILL.md +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/app/periphery/__init__.py +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/app/periphery/admin/__init__.py +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/app/periphery/admin/analytics.py +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/app/periphery/admin/analytics_queries.py +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/app/periphery/admin/backup.py +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/app/periphery/admin/destructive_guard.py +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/app/periphery/admin/doctor.py +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/app/periphery/admin/external_runtime.py +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/app/periphery/admin/init.py +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/app/periphery/admin/init_errors.py +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/app/periphery/admin/machine_state.py +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/app/periphery/admin/managed_runtime.py +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/app/periphery/admin/privileges.py +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/app/periphery/admin/repo_state.py +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/app/periphery/admin/restore.py +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/app/periphery/admin/storage_setup.py +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/app/periphery/admin/upgrade.py +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/app/periphery/cli/__init__.py +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/app/periphery/cli/handlers.py +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/app/periphery/cli/hydration.py +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/app/periphery/cli/main.py +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/app/periphery/cli/presenter_json.py +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/app/periphery/cli/schema_validation.py +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/app/periphery/db/__init__.py +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/app/periphery/db/engine.py +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/app/periphery/db/models/__init__.py +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/app/periphery/db/models/associations.py +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/app/periphery/db/models/episodes.py +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/app/periphery/db/models/evidence.py +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/app/periphery/db/models/experiences.py +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/app/periphery/db/models/instance_metadata.py +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/app/periphery/db/models/memories.py +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/app/periphery/db/models/metadata.py +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/app/periphery/db/models/registry.py +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/app/periphery/db/models/telemetry.py +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/app/periphery/db/models/utility.py +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/app/periphery/db/models/views.py +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/app/periphery/db/repos/__init__.py +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/app/periphery/db/repos/relational/__init__.py +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/app/periphery/db/repos/relational/associations_repo.py +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/app/periphery/db/repos/relational/episodes_repo.py +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/app/periphery/db/repos/relational/experiences_repo.py +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/app/periphery/db/repos/relational/memories_repo.py +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/app/periphery/db/repos/relational/read_policy_repo.py +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/app/periphery/db/repos/relational/telemetry_repo.py +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/app/periphery/db/repos/relational/utility_repo.py +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/app/periphery/db/repos/semantic/__init__.py +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/app/periphery/db/repos/semantic/keyword_retrieval_repo.py +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/app/periphery/db/repos/semantic/semantic_retrieval_repo.py +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/app/periphery/db/session.py +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/app/periphery/db/uow.py +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/app/periphery/embeddings/__init__.py +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/app/periphery/embeddings/local_provider.py +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/app/periphery/embeddings/query_vector_search.py +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/app/periphery/episodes/__init__.py +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/app/periphery/episodes/claude_code.py +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/app/periphery/episodes/codex.py +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/app/periphery/episodes/cursor.py +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/app/periphery/episodes/launcher.py +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/app/periphery/episodes/normalization.py +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/app/periphery/episodes/poller.py +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/app/periphery/episodes/poller_lock.py +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/app/periphery/episodes/source_discovery.py +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/app/periphery/episodes/tool_filter.py +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/app/periphery/identity/__init__.py +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/app/periphery/identity/claude_hook_install.py +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/app/periphery/identity/claude_runtime.py +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/app/periphery/identity/codex_runtime.py +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/app/periphery/identity/compatibility.py +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/app/periphery/identity/resolver.py +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/app/periphery/metrics/__init__.py +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/app/periphery/metrics/artifacts.py +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/app/periphery/metrics/browser.py +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/app/periphery/metrics/queries.py +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/app/periphery/metrics/render_html.py +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/app/periphery/metrics/service.py +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/app/periphery/onboarding/__init__.py +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/app/periphery/onboarding/host_assets.py +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/app/periphery/session_state/__init__.py +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/app/periphery/session_state/file_store.py +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/app/periphery/telemetry/__init__.py +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/app/periphery/telemetry/operation_summary.py +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/app/periphery/telemetry/session_selection.py +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/app/periphery/telemetry/sync_summary.py +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/app/periphery/validation/__init__.py +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/app/periphery/validation/integrity_validation.py +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/app/periphery/validation/semantic_validation.py +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/setup.cfg +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/shellbrain.egg-info/SOURCES.txt +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/shellbrain.egg-info/dependency_links.txt +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/shellbrain.egg-info/entry_points.txt +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/shellbrain.egg-info/requires.txt +0 -0
- {shellbrain-0.1.13 → shellbrain-0.1.14}/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.14
|
|
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
|
|
@@ -96,6 +96,19 @@ Fish PATH setup is written to `~/.config/fish/conf.d/shellbrain.fish`.
|
|
|
96
96
|
|
|
97
97
|
---
|
|
98
98
|
|
|
99
|
+
## DB-backed tests
|
|
100
|
+
|
|
101
|
+
**Live memories and DB-backed tests now use different Postgres hosts.**
|
|
102
|
+
|
|
103
|
+
- managed local Shellbrain keeps durable memories on the machine-owned managed instance
|
|
104
|
+
- DB-backed tests and scratch validation should use the dedicated repo-owned test host from `docker-compose.test.yml`
|
|
105
|
+
- `scripts/run_tests` provisions a disposable test database on that dedicated host by default
|
|
106
|
+
- `scripts/storage_status` shows the live managed target, the dedicated test host, and any legacy local test host that is still hanging around
|
|
107
|
+
|
|
108
|
+
If you are running managed local Shellbrain, do not leave a stale `SHELLBRAIN_DB_DSN` export in your shell profile that points at the old local compose database. The machine config wins anyway, and the stale env var just makes the storage layout harder to reason about.
|
|
109
|
+
|
|
110
|
+
---
|
|
111
|
+
|
|
99
112
|
## Docs
|
|
100
113
|
|
|
101
114
|
- [shellbrain.ai/humans](https://shellbrain.ai/humans/) — install, upgrade, getting started
|
|
@@ -82,6 +82,19 @@ Fish PATH setup is written to `~/.config/fish/conf.d/shellbrain.fish`.
|
|
|
82
82
|
|
|
83
83
|
---
|
|
84
84
|
|
|
85
|
+
## DB-backed tests
|
|
86
|
+
|
|
87
|
+
**Live memories and DB-backed tests now use different Postgres hosts.**
|
|
88
|
+
|
|
89
|
+
- managed local Shellbrain keeps durable memories on the machine-owned managed instance
|
|
90
|
+
- DB-backed tests and scratch validation should use the dedicated repo-owned test host from `docker-compose.test.yml`
|
|
91
|
+
- `scripts/run_tests` provisions a disposable test database on that dedicated host by default
|
|
92
|
+
- `scripts/storage_status` shows the live managed target, the dedicated test host, and any legacy local test host that is still hanging around
|
|
93
|
+
|
|
94
|
+
If you are running managed local Shellbrain, do not leave a stale `SHELLBRAIN_DB_DSN` export in your shell profile that points at the old local compose database. The machine config wins anyway, and the stale env var just makes the storage layout harder to reason about.
|
|
95
|
+
|
|
96
|
+
---
|
|
97
|
+
|
|
85
98
|
## Docs
|
|
86
99
|
|
|
87
100
|
- [shellbrain.ai/humans](https://shellbrain.ai/humans/) — install, upgrade, getting started
|
|
@@ -52,7 +52,7 @@ def apply_side_effects(
|
|
|
52
52
|
if effect_type == "memory_evidence.attach":
|
|
53
53
|
refs = params["refs"]
|
|
54
54
|
assert isinstance(refs, list)
|
|
55
|
-
for ref in refs:
|
|
55
|
+
for ref in sorted(str(ref) for ref in refs):
|
|
56
56
|
evidence = uow.evidence.upsert_ref(repo_id=str(params["repo_id"]), ref=str(ref))
|
|
57
57
|
uow.evidence.link_memory_evidence(memory_id=str(params["memory_id"]), evidence_id=evidence.id)
|
|
58
58
|
continue
|
|
@@ -124,7 +124,7 @@ def apply_side_effects(
|
|
|
124
124
|
)
|
|
125
125
|
evidence_refs = params.get("evidence_refs", [])
|
|
126
126
|
assert isinstance(evidence_refs, list)
|
|
127
|
-
for ref in evidence_refs:
|
|
127
|
+
for ref in sorted(str(ref) for ref in evidence_refs):
|
|
128
128
|
evidence = uow.evidence.upsert_ref(repo_id=str(params["repo_id"]), ref=str(ref))
|
|
129
129
|
uow.evidence.link_association_edge_evidence(edge_id=edge.id, evidence_id=evidence.id)
|
|
130
130
|
continue
|
|
@@ -13,7 +13,7 @@ def classify_operation_failure(
|
|
|
13
13
|
"""Return one stable diagnosis payload for an operation failure."""
|
|
14
14
|
|
|
15
15
|
message = (error_message or "").lower()
|
|
16
|
-
if "uq_evidence_repo_ref" in message:
|
|
16
|
+
if "uq_evidence_repo_ref" in message or "uq_evidence_repo_episode_event" in message:
|
|
17
17
|
return _diagnosis(
|
|
18
18
|
category="duplicate_evidence_ref",
|
|
19
19
|
summary="Evidence refs are being inserted twice for the same repo/event pair.",
|
|
@@ -45,17 +45,36 @@ def dsn_fingerprint(dsn: str) -> str:
|
|
|
45
45
|
return hashlib.sha256(normalize_dsn(dsn).encode("utf-8")).hexdigest()
|
|
46
46
|
|
|
47
47
|
|
|
48
|
+
def host_port_from_dsn(dsn: str) -> tuple[str, int]:
|
|
49
|
+
"""Extract the normalized host/port pair from one DSN."""
|
|
50
|
+
|
|
51
|
+
parsed = urlparse(dsn.replace("+psycopg", ""))
|
|
52
|
+
return ((parsed.hostname or "").lower(), parsed.port or 5432)
|
|
53
|
+
|
|
54
|
+
|
|
48
55
|
def database_name_from_dsn(dsn: str) -> str:
|
|
49
56
|
"""Extract the target database name from one DSN."""
|
|
50
57
|
|
|
51
58
|
return urlparse(dsn.replace("+psycopg", "")).path.lstrip("/")
|
|
52
59
|
|
|
53
60
|
|
|
54
|
-
def assert_disposable_test_dsn(
|
|
61
|
+
def assert_disposable_test_dsn(
|
|
62
|
+
*,
|
|
63
|
+
test_dsn: str,
|
|
64
|
+
protected_dsn: str | None = None,
|
|
65
|
+
protected_host_ports: set[tuple[str, int]] | None = None,
|
|
66
|
+
) -> None:
|
|
55
67
|
"""Refuse to treat a protected or production-shaped database as disposable."""
|
|
56
68
|
|
|
57
69
|
if protected_dsn and dsn_fingerprint(test_dsn) == dsn_fingerprint(protected_dsn):
|
|
58
70
|
raise RuntimeError("Refusing destructive test setup against the protected live database DSN.")
|
|
71
|
+
protected_pairs = set(protected_host_ports or set())
|
|
72
|
+
if protected_dsn:
|
|
73
|
+
protected_pairs.add(host_port_from_dsn(protected_dsn))
|
|
74
|
+
if host_port_from_dsn(test_dsn) in protected_pairs:
|
|
75
|
+
raise RuntimeError(
|
|
76
|
+
"Refusing destructive test setup against the protected live database host/port."
|
|
77
|
+
)
|
|
59
78
|
db_name = database_name_from_dsn(test_dsn).lower()
|
|
60
79
|
if db_name in PROTECTED_DB_NAMES:
|
|
61
80
|
raise RuntimeError(
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
from datetime import datetime, timezone
|
|
4
4
|
from uuid import uuid4
|
|
5
5
|
|
|
6
|
-
from sqlalchemy import select, update
|
|
6
|
+
from sqlalchemy import select, text, update
|
|
7
7
|
from sqlalchemy.dialects.postgresql import insert
|
|
8
8
|
|
|
9
9
|
from app.core.entities.evidence import EvidenceRef
|
|
@@ -24,6 +24,7 @@ class EvidenceRepo(IEvidenceRepo):
|
|
|
24
24
|
def upsert_ref(self, repo_id: str, ref: str) -> EvidenceRef:
|
|
25
25
|
"""This method inserts or returns a canonical evidence reference row."""
|
|
26
26
|
|
|
27
|
+
self._acquire_ref_guard(repo_id=repo_id, ref=ref)
|
|
27
28
|
existing = (
|
|
28
29
|
self._session.execute(
|
|
29
30
|
select(evidence_refs).where(
|
|
@@ -63,6 +64,14 @@ class EvidenceRepo(IEvidenceRepo):
|
|
|
63
64
|
)
|
|
64
65
|
return EvidenceRef(id=evidence_id, repo_id=repo_id, ref=ref, episode_event_id=ref)
|
|
65
66
|
|
|
67
|
+
def _acquire_ref_guard(self, *, repo_id: str, ref: str) -> None:
|
|
68
|
+
"""Serialize concurrent writes for one repo/ref pair within the active transaction."""
|
|
69
|
+
|
|
70
|
+
self._session.execute(
|
|
71
|
+
text("SELECT pg_advisory_xact_lock(hashtext(:repo_id), hashtext(:ref))"),
|
|
72
|
+
{"repo_id": repo_id, "ref": ref},
|
|
73
|
+
)
|
|
74
|
+
|
|
66
75
|
def link_memory_evidence(self, memory_id: str, evidence_id: str) -> None:
|
|
67
76
|
"""This method creates shellbrain-to-evidence link rows."""
|
|
68
77
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: shellbrain
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.14
|
|
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
|
|
@@ -96,6 +96,19 @@ Fish PATH setup is written to `~/.config/fish/conf.d/shellbrain.fish`.
|
|
|
96
96
|
|
|
97
97
|
---
|
|
98
98
|
|
|
99
|
+
## DB-backed tests
|
|
100
|
+
|
|
101
|
+
**Live memories and DB-backed tests now use different Postgres hosts.**
|
|
102
|
+
|
|
103
|
+
- managed local Shellbrain keeps durable memories on the machine-owned managed instance
|
|
104
|
+
- DB-backed tests and scratch validation should use the dedicated repo-owned test host from `docker-compose.test.yml`
|
|
105
|
+
- `scripts/run_tests` provisions a disposable test database on that dedicated host by default
|
|
106
|
+
- `scripts/storage_status` shows the live managed target, the dedicated test host, and any legacy local test host that is still hanging around
|
|
107
|
+
|
|
108
|
+
If you are running managed local Shellbrain, do not leave a stale `SHELLBRAIN_DB_DSN` export in your shell profile that points at the old local compose database. The machine config wins anyway, and the stale env var just makes the storage layout harder to reason about.
|
|
109
|
+
|
|
110
|
+
---
|
|
111
|
+
|
|
99
112
|
## Docs
|
|
100
113
|
|
|
101
114
|
- [shellbrain.ai/humans](https://shellbrain.ai/humans/) — install, upgrade, getting started
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{shellbrain-0.1.13 → shellbrain-0.1.14}/app/core/policies/read_policy/context_pack_builder.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{shellbrain-0.1.13 → shellbrain-0.1.14}/app/migrations/versions/20260226_0001_initial_schema.py
RENAMED
|
File without changes
|
{shellbrain-0.1.13 → shellbrain-0.1.14}/app/migrations/versions/20260312_0002_add_hard_invariants.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{shellbrain-0.1.13 → shellbrain-0.1.14}/app/onboarding_assets/codex/shellbrain-usage-review/SKILL.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{shellbrain-0.1.13 → shellbrain-0.1.14}/app/periphery/db/repos/relational/associations_repo.py
RENAMED
|
File without changes
|
|
File without changes
|
{shellbrain-0.1.13 → shellbrain-0.1.14}/app/periphery/db/repos/relational/experiences_repo.py
RENAMED
|
File without changes
|
|
File without changes
|
{shellbrain-0.1.13 → shellbrain-0.1.14}/app/periphery/db/repos/relational/read_policy_repo.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{shellbrain-0.1.13 → shellbrain-0.1.14}/app/periphery/db/repos/semantic/keyword_retrieval_repo.py
RENAMED
|
File without changes
|
{shellbrain-0.1.13 → shellbrain-0.1.14}/app/periphery/db/repos/semantic/semantic_retrieval_repo.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|