marvisx-cli 0.3.8b3__tar.gz → 0.3.8b6__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.
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/PKG-INFO +1 -1
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/config.py +57 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/mcp/server.py +4 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/mcp/tools/graph.py +5 -4
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/models/graph_ux.py +62 -1
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/models/search.py +8 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/routers/graph.py +50 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/brain/jobs.py +72 -0
- marvisx_cli-0.3.8b6/core/api/services/brain/llm/claude_cli.py +201 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/brain/llm/factory.py +13 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/brain/memory_ops.py +15 -4
- marvisx_cli-0.3.8b6/core/api/services/brain/temporal_recency.py +195 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/embedding_service.py +392 -2
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/graph_service.py +123 -5
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/ingest/embedding_router.py +4 -0
- marvisx_cli-0.3.8b6/core/api/tests/test_graph_freshness_flag.py +136 -0
- marvisx_cli-0.3.8b6/core/api/tests/test_graph_neighbors_denoise.py +167 -0
- marvisx_cli-0.3.8b6/core/api/tests/test_graph_summary.py +32 -0
- marvisx_cli-0.3.8b6/core/api/tests/test_kg_claims_builder.py +171 -0
- marvisx_cli-0.3.8b6/core/api/tests/test_kg_claims_wire.py +128 -0
- marvisx_cli-0.3.8b6/core/api/tests/test_kg_trust_write_path.py +143 -0
- marvisx_cli-0.3.8b6/core/api/tests/test_migration_149.py +121 -0
- marvisx_cli-0.3.8b6/core/api/tests/test_populate_decay_flag.py +67 -0
- marvisx_cli-0.3.8b6/core/api/tests/test_session_brief_temporal.py +82 -0
- marvisx_cli-0.3.8b6/core/api/tests/test_temporal_recency.py +148 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/use_cases/graph.py +419 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/use_cases/projects.py +42 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/use_cases/search.py +89 -7
- marvisx_cli-0.3.8b6/core/cli/_onboarding.py +250 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/cli/guides/marvis-way.md +23 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/cli/marvis_doctor.py +53 -3
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/cli/marvis_init.py +6 -0
- marvisx_cli-0.3.8b6/core/cli/marvis_task.py +206 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/scripts/populate_project_nodes.py +115 -6
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/marvisx_cli.egg-info/PKG-INFO +1 -1
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/marvisx_cli.egg-info/SOURCES.txt +16 -0
- marvisx_cli-0.3.8b6/migrations/149_kg_trust_columns.sql +43 -0
- marvisx_cli-0.3.8b6/migrations/149_kg_trust_columns_down.sql +17 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/pyproject.toml +1 -1
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/LICENSE +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/MANIFEST.in +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/README.md +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/__init__.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/agents/__init__.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/agents/session_health.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/agents/session_manager.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/bin/marvisx-state-hook.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/db.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/dependencies/__init__.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/dependencies/tenant.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/main.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/mcp/__init__.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/mcp/_adapter.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/mcp/tools/__init__.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/mcp/tools/brain.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/mcp/tools/handoffs.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/mcp/tools/ingest.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/mcp/tools/learnings.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/mcp/tools/projects.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/mcp/tools/pull_requests.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/mcp/tools/safety.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/mcp/tools/search.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/mcp/tools/tasks.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/mcp/tools/workflow_playbooks/brainstorm.md +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/mcp/tools/workflow_playbooks/compound.md +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/mcp/tools/workflow_playbooks/plan.md +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/mcp/tools/workflows.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/middleware/__init__.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/middleware/tool_call_audit.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/models/__init__.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/models/auth.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/models/brain.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/models/common.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/models/costs.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/models/graph.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/models/graph_cosmo.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/models/graph_pr_impact.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/models/inbox.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/models/ingest_keys.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/models/kg.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/models/llm_config.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/models/monitoring.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/models/projects.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/models/sessions.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/models/tasks.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/models/teams.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/models/users.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/observability/__init__.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/observability/tracing.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/paths.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/rate_limit.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/rbac.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/routers/__init__.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/routers/_adapter.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/routers/admin_pr_impact.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/routers/admin_settings.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/routers/agent.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/routers/agent_tokens.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/routers/app_settings.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/routers/audit.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/routers/auth.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/routers/bench.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/routers/brain.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/routers/brain_directions.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/routers/ci_checks.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/routers/comments.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/routers/costs.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/routers/docs_coverage.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/routers/docs_governance.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/routers/documents.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/routers/files.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/routers/finder.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/routers/handoffs.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/routers/inbox.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/routers/ingest_api_keys.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/routers/ingest_triage.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/routers/judge.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/routers/kg.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/routers/learnings.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/routers/llm_config.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/routers/monitoring.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/routers/notifications.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/routers/pr_impact.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/routers/projects.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/routers/pull_requests.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/routers/push.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/routers/raci.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/routers/search.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/routers/sessions.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/routers/settings.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/routers/share_repo.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/routers/status_updates.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/routers/tags.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/routers/tasks.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/routers/teams.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/routers/terminal.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/routers/users.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/routers/webhooks.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/runtime_settings.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/security.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/__init__.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/_fts.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/audit.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/auto_approval.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/brain/__init__.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/brain/baseline.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/brain/capabilities.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/brain/cascade_rollup.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/brain/compound_bridge.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/brain/cycle.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/brain/cycle_snapshot.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/brain/digest_collector.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/brain/direction.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/brain/drift.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/brain/drift_router.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/brain/edge_metrics.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/brain/events_reader.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/brain/findings.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/brain/findings_reader.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/brain/journal.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/brain/knowledge_forms.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/brain/llm/__init__.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/brain/llm/_runner.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/brain/llm/base.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/brain/llm/cache.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/brain/llm/constants.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/brain/llm/direction_alignment.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/brain/llm/finding_reasoning.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/brain/llm/finding_summary.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/brain/llm/grounding.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/brain/llm/journal_polish.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/brain/llm/local_gateway.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/brain/llm/parsers.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/brain/llm/router_glue.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/brain/models.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/brain/owner_hint.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/brain/recap.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/brain/rules/__init__.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/brain/rules/_signals.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/brain/rules/dr1_activity_without_status.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/brain/rules/dr2_decision_without_adr.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/brain/rules/dr3_stale_open_loop.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/brain/rules/dr4_docs_governance_drift.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/brain/rules/dr5_playbook_changed.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/brain/rules/dr6_external_update_unpropagated.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/brain/rules/dr7_claimed_decision_gap.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/brain/rules/dr8_direction_misalignment.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/brain/runs_reader.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/brain/scope.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/brain/sources/__init__.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/brain/sources/base.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/brain/sources/git_kg.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/brain/sources/handoffs.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/brain/sources/ingestor.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/brain/sources/learnings.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/brain/sources/pir_tasks.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/brain/warehouse_consolidate.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/brain/watermarks.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/brain/ws_emitter.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/cc_tasks_reader.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/chunking.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/ci_service.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/claude_metrics.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/codex_metrics.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/conversation_reader.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/cost_service.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/crypto.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/docs_governance/__init__.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/docs_governance/confidence.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/docs_governance/config.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/docs_governance/enrichment.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/docs_governance/frontmatter_validator.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/docs_governance/hard_gates.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/docs_governance/triage_orchestrator.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/dream_cycle.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/embedding_backends/__init__.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/embedding_internal.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/event_dispatcher.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/events.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/git_ops.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/graph_cosmo_service.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/graph_ranker.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/grounding/__init__.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/grounding/citations.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/grounding/verifier.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/inbox.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/inbox_digest.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/inbox_digest_deep_research.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/inbox_digest_jobs.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/inbox_gmail_sync.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/inbox_llm_classifier.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/inbox_source_identity.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/inbox_sources.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/inbox_taxonomy.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/inbox_tldr.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/inbox_triage.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/ingest/__init__.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/ingest/api_key_auth.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/ingest/auto_approve.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/ingest/classifier.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/ingest/confidence.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/ingest/dispatch.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/ingest/events.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/ingest/ignore_patterns.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/ingest/image_probe.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/ingest/ingress.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/ingest/insert_saga.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/ingest/llm/__init__.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/ingest/llm/anthropic_haiku.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/ingest/llm/base.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/ingest/llm/byok_provider.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/ingest/llm/classification_context.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/ingest/llm/config_store.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/ingest/llm/factory.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/ingest/llm/kg_enricher.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/ingest/llm/local_gateway.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/ingest/llm/local_vllm.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/ingest/llm/openai_nano.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/ingest/lock_advisory.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/ingest/parser_router.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/ingest/parsers/__init__.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/ingest/parsers/docling_parser.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/ingest/parsers/docparse_gateway.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/ingest/parsers/docx_parser.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/ingest/parsers/folder_unpacker.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/ingest/parsers/gateway_aux.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/ingest/parsers/image_parser.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/ingest/parsers/internal_markdown.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/ingest/parsers/ocr_gateway.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/ingest/parsers/ocr_pdf_parser.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/ingest/parsers/pdf_types.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/ingest/parsers/transcript_parser.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/ingest/parsers/vision_gateway.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/ingest/parsers/xlsx_parser.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/ingest/parsers/zip_unpacker.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/ingest/preflight.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/ingest/routing_policy.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/ingest/serializers/__init__.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/ingest/serializers/xlsx_to_markdown.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/ingest/skip_log.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/ingest/watcher.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/kg/__init__.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/kg/audit.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/kg/communities.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/kg/community_summary.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/kg/graph_lane.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/kg/hybrid_search.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/kg/lens.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/kg/pr_impact.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/kg/queries.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/kg/ranking.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/kg/rrf.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/kg_watcher_control.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/local_llm/__init__.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/local_llm/async_client.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/local_llm/client.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/local_llm/url_validator.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/metrics_collector.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/metrics_providers.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/model_registry.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/model_router.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/n8n_client.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/newsletter_llm_gateway.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/notification_service.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/openai_responses.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/opencode_metrics.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/opencode_sessions.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/pii_redactor.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/pr_impact_pipeline/__init__.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/pr_impact_pipeline/differ.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/pr_impact_pipeline/dispatcher.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/pr_impact_pipeline/gc.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/pr_impact_pipeline/languages.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/pr_impact_pipeline/parser.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/pr_impact_pipeline/writer.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/pr_service.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/project_paths.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/project_status_updates.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/providers.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/push_service.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/reminder_service.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/runas.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/salience_service.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/security_collector.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/session_catalog.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/session_metrics_service.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/session_ops.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/session_state.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/share_links.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/task_transitions.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/temporal_tiebreak.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/temporal_write.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/terminal_metrics.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/terminal_metrics_dump.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/tmux.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/webhook_service.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/workspace_sync.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/templates/__init__.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/templates/markdown_share.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/terminal.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/tests/__init__.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/tests/test_agent_facing_auth_dependencies.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/tests/test_audit_permissions.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/tests/test_backfill_session_conversations.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/tests/test_backfill_working_seconds_msg.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/tests/test_claude_metrics.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/tests/test_codex_metrics.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/tests/test_config_env_aliases.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/tests/test_finder_paths.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/tests/test_git_ops_merge.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/tests/test_graph_freshness.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/tests/test_learnings_check_search.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/tests/test_learnings_create_pre148.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/tests/test_metrics_providers.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/tests/test_migration_087.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/tests/test_migration_088.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/tests/test_migration_089.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/tests/test_openai_responses.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/tests/test_opencode_metrics.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/tests/test_opencode_sessions.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/tests/test_pr_workflow_e2e.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/tests/test_projects_handoffs.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/tests/test_providers.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/tests/test_require_scope_empty_deny.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/tests/test_safety_bridge.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/tests/test_session_catalog.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/tests/test_session_conversations.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/tests/test_session_metrics_service.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/tests/test_session_resume_paths.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/tests/test_session_theme_mode_migration.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/tests/test_sessions_rbac.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/tests/test_share_edit.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/tests/test_share_repo.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/tests/test_terminal_session_manager.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/tests/test_terminal_upload.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/tests/test_tmux.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/tests/test_workspace_sync.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/tests/test_ws_ticket_in_memory.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/use_cases/__init__.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/use_cases/_context.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/use_cases/_errors.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/use_cases/_roles.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/use_cases/audit.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/use_cases/brain.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/use_cases/costs.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/use_cases/handoffs.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/use_cases/ingest_triage.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/use_cases/learnings.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/use_cases/pull_requests.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/use_cases/tasks.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/visibility.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/cli/README.md +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/cli/__init__.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/cli/_brain_opportunistic.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/cli/_brain_schedule.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/cli/_index_source.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/cli/_runtime_ctx.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/cli/_transmute.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/cli/_update_check.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/cli/guides/__init__.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/cli/marvis_account.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/cli/marvis_brain.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/cli/marvis_feedback.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/cli/marvis_governance.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/cli/marvis_guide.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/cli/marvis_hooks.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/cli/marvis_mcp.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/cli/marvis_runtime.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/cli/marvis_telemetry.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/platform/__init__.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/scripts/_drift_check.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/scripts/_frontmatter.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/scripts/_graph_writer.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/scripts/ast_parser.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/scripts/install_hooks/__init__.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/scripts/install_hooks/_config.sh +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/scripts/install_hooks/block-dangerous-bash.sh +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/scripts/install_hooks/block-db-direct-write.sh +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/scripts/install_hooks/block-push-no-task.sh +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/scripts/install_hooks/block-staging-to-prod.sh +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/scripts/install_hooks/block-subtree-push.sh +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/scripts/install_hooks/config.json +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/scripts/install_hooks/enforce-no-merge-main.sh +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/scripts/install_hooks/enforce-worktree.sh +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/scripts/install_hooks/quality-gate.sh +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/scripts/install_hooks/safety_bridge.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/scripts/install_hooks/secret-scan.sh +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/scripts/migrate_spike_node_ids.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/scripts/populate_artifacts.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/scripts/populate_cross_project.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/scripts/populate_inbox_nodes.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/scripts/populate_pr_impact.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/scripts/populate_touch_counter.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/scripts/reparse_failed.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/scripts/safety_bridge.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/telemetry/__init__.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/telemetry/client.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/telemetry/entitlements.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/telemetry/rollup.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/telemetry/schema.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/telemetry/sender.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/wizard/__init__.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/wizard/byok_vault.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/wizard/defaults.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/wizard/state.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/wizard/steps.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/wizard/validation.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/marvisx_cli.egg-info/dependency_links.txt +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/marvisx_cli.egg-info/entry_points.txt +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/marvisx_cli.egg-info/requires.txt +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/marvisx_cli.egg-info/top_level.txt +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/001_initial.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/002_tasks.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/003_session_management.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/004_projects_comments.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/005_session_intelligence.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/006_settings.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/007_task_scoring.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/008_cost_tracking.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/009_session_card_metrics.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/010_monitoring.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/012_agent_api.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/013_session_complete.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/015_pull_requests.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/015_pull_requests_down.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/016_users_raci.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/017_task_cost_entries.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/018_agents.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/018_agents_down.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/019_review_feedback.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/020_pr_commit_sha.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/021_webhook_events.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/022_devx_agent_managed.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/022_devx_agent_managed_down.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/023_devx_p1_gate.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/023_devx_p1_gate_down.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/024_chat_messages.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/024_pr_conversation_id.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/024_task_indexes.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/024_task_indexes_down.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/025_audit_log.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/026_agent_tokens.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/027_teams_auth_phase_b.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/028_learnings.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/029_team_roles.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/030_finder_pins.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/031_pr_deploy_status.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/032_task_reminders.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/033_events_retry_count.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/033_session_owner.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/034_notifications.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/035_shared_links.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/036_session_index_upgrade.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/037_pr_approval.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/038_pr_submitted_by.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/039_push_subscriptions.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/040_semantic_search.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/041_workspaces.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/042_oidc_providers.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/043_ci_checks.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/044_agent_metrics.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/045_documents_doc_type.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/046_salience.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/047_seed_missing_agents.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/048_fix_agent_paths_roles.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/049_agent_role_and_learnings_schema.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/050_session_provider.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/051_session_launch_profile.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/052_session_theme_mode.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/052_task_kind.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/053_inbox_items.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/054_inbox_triage_contract.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/055_inbox_topic_treatment.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/056_inbox_treatment_read_save.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/057_session_theme_mode_backfill.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/058_inbox_item_status_lifecycle.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/059_inbox_tldr_and_source_scores.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/060_newsletter.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/061_inbox_redesign.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/062_fix_inbox_sources_backfill.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/063_task_completion_mode.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/064_judge_mode_setting.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/065_knowledge_graph_spike.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/066_digest_ranking_inputs.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/066_kg_artifact_nodes.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/067_inbox_digest_selections.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/067_kg_temporal.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/068_inbox_digest_app_settings.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/068_kg_touch_counter.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/069_kg_doc_types.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/070_digest_ranking_inputs_recovery.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/071_inbox_digest_selections_recovery.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/072_inbox_digest_app_settings_recovery.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/073_kg_cross_project.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/073_kg_cross_project_down.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/074_kg_infra_types.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/074_kg_infra_types_down.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/075_kg_file_state_recovery.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/075_kg_file_state_recovery_down.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/076_kg_watcher_state.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/076_kg_watcher_state_down.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/077_kg_doc_types_extend.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/077_kg_doc_types_extend_down.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/078_kg_fts5.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/078_kg_fts5_down.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/079_kg_missing_indexes.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/079_kg_missing_indexes_down.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/080_kg_fts5_extended.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/080_kg_fts5_extended_down.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/081_kg_lens_indexes.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/081_kg_lens_indexes_down.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/082_kg_pins.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/082_kg_pins_down.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/083_kg_graph_nodes_degree.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/083_kg_graph_nodes_degree_down.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/084_drop_legacy_scheduler_tables.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/084_drop_legacy_scheduler_tables_down.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/085_kg_edge_resolves_to.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/085_kg_edge_resolves_to_down.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/086_project_status_updates_feed.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/086_project_status_updates_feed_down.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/087_session_metrics_dual.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/087_session_metrics_dual_down.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/088_rename_context_pct_legacy.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/088_rename_context_pct_legacy_down.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/089_session_metrics_equivalent_cost.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/089_session_metrics_equivalent_cost_down.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/090_kg_inbox_node_type.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/090_kg_inbox_node_type_down.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/091_kg_inbox_node_type_check.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/091_kg_inbox_node_type_check_down.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/092_sessions_activity_state_ts.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/092_sessions_activity_state_ts_down.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/093_sessions_activity_state_column.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/093_sessions_activity_state_column_down.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/094_ingest_pending.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/094_ingest_pending_down.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/095_kg_intent_first.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/095_kg_intent_first_down.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/096_kg_xlsx_artifact_prefix.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/096_kg_xlsx_artifact_prefix_down.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/097_ingest_change_history.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/097_ingest_change_history_down.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/098_kg_node_type_business.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/098_kg_node_type_business_down.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/099_kg_edges_restore_weight.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/099_kg_edges_restore_weight_down.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/100_kg_enriched_at.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/100_kg_enriched_at_down.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/101_local_llm_shadow_comparisons.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/101_local_llm_shadow_comparisons_down.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/102_promote_llm_costs.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/102_promote_llm_costs_down.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/103_ingest_skipped_log.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/103_ingest_skipped_log_down.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/120_docs_governance.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/120_docs_governance_down.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/121_notification_event_fk_cleanup.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/121_notification_event_fk_cleanup_down.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/122_docs_drift_history.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/122_docs_drift_history_down.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/123_ingest_parser_waiting_status.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/123_ingest_parser_waiting_status_down.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/124_heypocket_recordings.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/124_heypocket_recordings_down.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/125_kg_node_type_record.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/125_kg_node_type_record_down.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/126_ingest_terminal_upload_source_kind.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/126_ingest_terminal_upload_source_kind_down.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/127_brain_v1_substrate.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/127_brain_v1_substrate_down.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/128_brain_drift_signals.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/128_brain_drift_signals_down.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/129_brain_memory_operations.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/129_brain_memory_operations_down.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/130_brain_findings.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/130_brain_findings_down.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/132_kg_pr_modifies.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/132_kg_pr_modifies_down.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/133_brain_v1_2_direction_schema.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/133_brain_v1_2_direction_schema_down.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/134_brain_journal_narrative_polished.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/134_brain_journal_narrative_polished_down.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/135_kg_edges_provider.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/136_documents_fts.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/137_promote_llm_costs.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/137_promote_llm_costs_down.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/138_ingest_api_keys.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/138_ingest_api_keys_down.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/139_ingest_pending_ingress.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/139_ingest_pending_ingress_down.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/140_ingest_idempotency_quota.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/140_ingest_idempotency_quota_down.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/141_ingest_pending_metadata.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/141_ingest_pending_metadata_down.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/142_llm_function_config.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/142_llm_function_config_down.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/143_kg_code_embeddings.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/143_kg_code_embeddings_down.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/144_notifications_pending_sync_index.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/145_audit_log_immutable.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/145_audit_log_immutable_down.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/146_drop_kg_backup_tables.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/146_drop_kg_backup_tables_down.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/147_chunks.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/147_chunks_down.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/148_bitemporal_learnings.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/148_bitemporal_learnings_down.sql +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/__init__.py +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/projects/_template/context.md +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/projects/_template/docs/brainstorms/YYYY-MM-DD-example-brainstorm.md +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/projects/_template/docs/plans/YYYY-MM-DD-example-plan.md +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/projects/_template/docs/solutions/YYYY-MM-DD-example-solution.md +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/projects/_template/input/README.md +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/projects/_template/memory/handoff.md +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/projects/_template/output/README.md +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/projects/_template/project.yaml +0 -0
- {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/setup.cfg +0 -0
|
@@ -125,6 +125,13 @@ class Settings(BaseSettings):
|
|
|
125
125
|
default=86400, alias="BRAIN_WAREHOUSE_CONSOLIDATION_INTERVAL_SECONDS"
|
|
126
126
|
)
|
|
127
127
|
|
|
128
|
+
# KG temporal recency pass (Fase D producer): proposes re-verifying aging,
|
|
129
|
+
# never-verified live nodes. Gated by temporal_memory_enabled (no separate
|
|
130
|
+
# enable flag — the flag IS the gate). Daily cadence guard.
|
|
131
|
+
brain_temporal_recency_interval_seconds: int = Field(
|
|
132
|
+
default=86400, alias="BRAIN_TEMPORAL_RECENCY_INTERVAL_SECONDS"
|
|
133
|
+
)
|
|
134
|
+
|
|
128
135
|
# GitHub Webhook
|
|
129
136
|
github_webhook_secret: str = ""
|
|
130
137
|
|
|
@@ -475,6 +482,47 @@ class Settings(BaseSettings):
|
|
|
475
482
|
default=False, alias="MARVIS_TEMPORAL_MEMORY"
|
|
476
483
|
)
|
|
477
484
|
|
|
485
|
+
# answer-ready claims (DEFAULT OFF). When False every reasoning-tool read is
|
|
486
|
+
# byte-identical to today (no `claims` key). When True, project_impact/
|
|
487
|
+
# graph_impact append a `claims[]` block: server-computed, relation-typed
|
|
488
|
+
# counts with provenance — the agent reports the value instead of re-counting
|
|
489
|
+
# raw edges (faithfulness). Separate from temporal_memory so grounding can be
|
|
490
|
+
# enabled without the freshness surface. See plan 2026-06-08-feat-answer-ready-claims.
|
|
491
|
+
kg_claims_enabled: bool = Field(
|
|
492
|
+
default=False, alias="MARVIS_KG_CLAIMS"
|
|
493
|
+
)
|
|
494
|
+
|
|
495
|
+
# Memory-freshness v2a Phase 1 (B-fix, DEFAULT OFF). The documents_fts
|
|
496
|
+
# INSERT/UPDATE triggers (migration 136) write file_path into the content
|
|
497
|
+
# column, so every doc written AFTER the one-time migration backfill has NO
|
|
498
|
+
# body in the lexical lane (prod 2026-06-09: 100% of recent docs degraded
|
|
499
|
+
# → the BM25 lane sees OLD bodies but never NEW ones — a direct stale-
|
|
500
|
+
# retrieval mechanism). When True, every documents upsert path additionally
|
|
501
|
+
# overwrites the trigger-degraded FTS row with the real title+body
|
|
502
|
+
# (refresh_documents_fts_row). When False the refresh helper is a no-op and
|
|
503
|
+
# behavior is byte-identical to today. The one-shot backfill script
|
|
504
|
+
# (scripts/backfill_documents_fts.py) repairs historical rows; in prod the
|
|
505
|
+
# flag must flip ON at backfill time and stay on, otherwise the next doc
|
|
506
|
+
# update re-degrades its row. See plan
|
|
507
|
+
# 2026-06-09-feat-memory-freshness-v2a-retrieval.
|
|
508
|
+
fts_bodies_enabled: bool = Field(
|
|
509
|
+
default=False, alias="MARVIS_FTS_BODIES"
|
|
510
|
+
)
|
|
511
|
+
|
|
512
|
+
# Memory-freshness v2a Phase 2 (A-span, DEFAULT OFF). When False the search
|
|
513
|
+
# read path never touches the chunks/vec_chunks sidecars and the response is
|
|
514
|
+
# byte-identical to today (no span_* fields populated). When True (and
|
|
515
|
+
# MARVIS_CHUNKING populated the sidecars), the semantic lane max-pools
|
|
516
|
+
# chunk-KNN hits into the doc ranking and each file-backed hit carries the
|
|
517
|
+
# winning chunk's span expanded to line boundaries ±12 lines (span_text /
|
|
518
|
+
# span_path / span_line_start / span_line_end) so the agent can answer FROM
|
|
519
|
+
# the search result without a follow-up Read. Write-side chunking stays
|
|
520
|
+
# gated by MARVIS_CHUNKING (env, read per-call). See plan
|
|
521
|
+
# 2026-06-09-feat-memory-freshness-v2a-retrieval.
|
|
522
|
+
search_spans_enabled: bool = Field(
|
|
523
|
+
default=False, alias="MARVIS_SEARCH_SPANS"
|
|
524
|
+
)
|
|
525
|
+
|
|
478
526
|
# Track 2 #3c — community summaries in the brief (GraphRAG global-search,
|
|
479
527
|
# DEFAULT OFF). When False the brief is byte-identical to today: the
|
|
480
528
|
# communities/community_summary modules are a flag-gated library + seam,
|
|
@@ -517,6 +565,15 @@ class Settings(BaseSettings):
|
|
|
517
565
|
brain_llm_polish_enabled: bool = Field(
|
|
518
566
|
default=True, alias="BRAIN_LLM_POLISH_ENABLED"
|
|
519
567
|
)
|
|
568
|
+
# P1: pick the Brain LLM backend. "gateway" (default, unchanged) = the HTTP
|
|
569
|
+
# Mac-gateway client (requires BRAIN_LLM_GATEWAY_API_KEY). "claude_cli" = run
|
|
570
|
+
# `claude -p` headless on the user's Claude Code subscription (NO API key) —
|
|
571
|
+
# see core/api/services/brain/llm/claude_cli.py.
|
|
572
|
+
brain_llm_provider: Literal["gateway", "claude_cli"] = Field(
|
|
573
|
+
default="gateway", alias="BRAIN_LLM_PROVIDER"
|
|
574
|
+
)
|
|
575
|
+
# Path/name of the `claude` binary for the claude_cli provider.
|
|
576
|
+
marvis_claude_bin: str = Field(default="claude", alias="MARVIS_CLAUDE_BIN")
|
|
520
577
|
brain_llm_journal_polish_enabled: bool = Field(
|
|
521
578
|
default=True, alias="BRAIN_LLM_JOURNAL_POLISH_ENABLED"
|
|
522
579
|
)
|
|
@@ -46,6 +46,10 @@ _INSTRUCTIONS = (
|
|
|
46
46
|
"Before answering an orchestration or planning task, confirm you actually called the relevant "
|
|
47
47
|
"tool (session_brief / project_impact / graph_impact) AND that your answer addresses the task "
|
|
48
48
|
"as asked — do not reply from raw files or pivot to an unrelated skill.\n"
|
|
49
|
+
"When you state a number from the knowledge graph (a count, in-degree, how many dependents), "
|
|
50
|
+
"quote it from the tool result's `summary` block and cite it inline — e.g. \"148 edges from 11 "
|
|
51
|
+
"sources [graph_neighbors summary]\". Do NOT re-count a returned list by hand, and do NOT state a "
|
|
52
|
+
"count that no tool result supports.\n"
|
|
49
53
|
)
|
|
50
54
|
|
|
51
55
|
mcp = FastMCP("marvis", instructions=_INSTRUCTIONS)
|
|
@@ -124,9 +124,10 @@ def register(mcp) -> None:
|
|
|
124
124
|
as_of: Annotated[str, Field(pattern=_AS_OF_PATTERN, max_length=32)] | None = None,
|
|
125
125
|
) -> dict[str, Any]:
|
|
126
126
|
"""1-hop: chi tocca / dipende direttamente da un nodo. Funziona su codice ('py:function:...') E su progetti ('project:artifact:<slug>').
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
127
|
+
CHI DIPENDE DA X (in UNA call): graph_neighbors(node_id, direction='incoming', rank='degree') → i dipendenti diretti ordinati per grado + un blocco `summary` GIA' aggregato. E' il tool ovvio per 'chi cita / dipende da X' — NON fare N micro-query (project_impact e' il primo passo, non N).
|
|
128
|
+
ORCHESTRAZIONE: per i vicini diretti di un PROGETTO passa node_id='project:artifact:<slug>' con edge_types=['depends_on']. Codice: caller/callee 1-hop di una function.
|
|
129
|
+
QUANDO USARLO: vicinato diretto; caller inattesi; time-travel as_of; rank=suspect_write per bug write-through-read. Per il blast radius transitivo usa graph_impact / project_impact.
|
|
130
|
+
RESTITUISCE: {neighbors:[{node_id, relation, direction, rank_score?}], summary:{total, distinct_nodes, by_relation, by_direction} (CITA questi numeri, non ricontare la lista), freshness} cap 200."""
|
|
130
131
|
try:
|
|
131
132
|
async with acquire_db() as db:
|
|
132
133
|
# Node proxy hardcodes limit=200 (the surface exposes no limit param).
|
|
@@ -205,7 +206,7 @@ def register(mcp) -> None:
|
|
|
205
206
|
"""Portfolio blast radius: 'se pauso / chiudo / de-prioritizzo questo PROGETTO, quali altri progetti si bloccano?'. Il tool di prima classe per l'orchestrazione cross-progetto — distinto dal grafo-codice.
|
|
206
207
|
Risolve 'project:artifact:<slug>' e fa l'impact BFS sui soli edge progetto->progetto (depends_on / mentions / refers_to). La response porta il segnale freshness (indexed_sha vs HEAD) per non fidarsi di un indice stantio.
|
|
207
208
|
QUANDO USARLO: prima di pausare/chiudere/de-prioritizzare un progetto; sequenziare un portafoglio (cosa sblocca cosa); capire le dipendenze cross-progetto di una decisione.
|
|
208
|
-
RESTITUISCE: {direct_dependents[], transitive_list[], rank_score, freshness}."""
|
|
209
|
+
RESTITUISCE: {direct_dependents[], transitive_list[], rank_score, freshness}. Col flag MARVIS_KG_CLAIMS anche claims[]: quanti progetti dipendono DAVVERO da questo (kind=dependents_depends_on) vs quanti lo nominano soltanto (kind=mentioned_by), gia' contati server-side con provenienza e freschezza — riporta quei numeri, non ri-contare le liste."""
|
|
209
210
|
try:
|
|
210
211
|
async with acquire_db() as db:
|
|
211
212
|
result = await graph_uc.graph_impact(
|
|
@@ -13,7 +13,38 @@ from __future__ import annotations
|
|
|
13
13
|
from datetime import datetime
|
|
14
14
|
from typing import Literal
|
|
15
15
|
|
|
16
|
-
from pydantic import BaseModel, ConfigDict, Field
|
|
16
|
+
from pydantic import BaseModel, ConfigDict, Field, model_validator
|
|
17
|
+
|
|
18
|
+
# ---------------------------------------------------------------------------
|
|
19
|
+
# answer-ready claims (behind MARVIS_KG_CLAIMS) — server-computed, relation-typed
|
|
20
|
+
# ---------------------------------------------------------------------------
|
|
21
|
+
|
|
22
|
+
class KGClaim(BaseModel):
|
|
23
|
+
"""A server-computed claim about a KG node: the value is counted by the DB,
|
|
24
|
+
not by the agent. The agent reports it (and the relation) instead of
|
|
25
|
+
re-counting raw edges — this is the faithfulness fix.
|
|
26
|
+
|
|
27
|
+
`kind` names the relation explicitly (e.g. `dependents_depends_on` = real
|
|
28
|
+
dependency, `mentioned_by` = associative, NOT a dependency). `sources` is a
|
|
29
|
+
capped sample of the provenance; `sources_total` is the full count.
|
|
30
|
+
"""
|
|
31
|
+
model_config = ConfigDict(extra="forbid")
|
|
32
|
+
|
|
33
|
+
kind: str = Field(..., description="dependents_depends_on | dependents_imports | dependents_calls | mentioned_by")
|
|
34
|
+
subject: str = Field(..., description="node_id the claim is about")
|
|
35
|
+
value: int = Field(..., ge=0, description="server-computed count (the number to report)")
|
|
36
|
+
sources: list[str] = Field(default_factory=list, description="capped sample of source node ids (provenance)")
|
|
37
|
+
sources_total: int = Field(..., ge=0, description="full provenance count before capping")
|
|
38
|
+
as_of: str | None = Field(None, description="last observation (last_seen_at) of the subject")
|
|
39
|
+
verified: str | None = Field(None, description="last Brain re-confirmation (last_verified_at), or null")
|
|
40
|
+
needs_review: bool = Field(False, description="subject is stale per the read-time freshness budget")
|
|
41
|
+
|
|
42
|
+
@model_validator(mode="after")
|
|
43
|
+
def _sources_within_total(self) -> "KGClaim":
|
|
44
|
+
if self.sources_total < len(self.sources):
|
|
45
|
+
raise ValueError("sources_total must be >= len(sources)")
|
|
46
|
+
return self
|
|
47
|
+
|
|
17
48
|
|
|
18
49
|
# ---------------------------------------------------------------------------
|
|
19
50
|
# Shared type alias (validated at model-field level via annotation)
|
|
@@ -47,6 +78,36 @@ class PinOut(BaseModel):
|
|
|
47
78
|
is_stale: bool = False # True if node was soft-deleted after pinning (belt-and-braces)
|
|
48
79
|
|
|
49
80
|
|
|
81
|
+
# ---------------------------------------------------------------------------
|
|
82
|
+
# Fase D — KG trust write-path request bodies (behind MARVIS_TEMPORAL_MEMORY).
|
|
83
|
+
# The apply actions an agent performs after Triage approves a Brain proposal.
|
|
84
|
+
# ---------------------------------------------------------------------------
|
|
85
|
+
|
|
86
|
+
class VerifyNodeIn(BaseModel):
|
|
87
|
+
"""Request body for POST /graph/nodes/verify — stamp last_verified_at = now."""
|
|
88
|
+
node_id: str = Field(
|
|
89
|
+
...,
|
|
90
|
+
min_length=6,
|
|
91
|
+
max_length=256,
|
|
92
|
+
pattern=r"^[a-z]+:[a-z]+:.+$",
|
|
93
|
+
description="Node ID to mark re-verified (REINFORCE apply)",
|
|
94
|
+
)
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
class SupersedeEdgeIn(BaseModel):
|
|
98
|
+
"""Request body for POST /graph/edges/supersede — soft-invalidate an edge."""
|
|
99
|
+
source_id: str = Field(..., min_length=6, max_length=256, pattern=r"^[a-z]+:[a-z]+:.+$")
|
|
100
|
+
target_id: str = Field(..., min_length=6, max_length=256, pattern=r"^[a-z]+:[a-z]+:.+$")
|
|
101
|
+
relation: str = Field(
|
|
102
|
+
..., min_length=2, max_length=32,
|
|
103
|
+
description="Edge relation of the triple to supersede (e.g. depends_on)",
|
|
104
|
+
)
|
|
105
|
+
superseded_by: str | None = Field(
|
|
106
|
+
None, max_length=256,
|
|
107
|
+
description="Optional audit pointer to the replacing edge",
|
|
108
|
+
)
|
|
109
|
+
|
|
110
|
+
|
|
50
111
|
# ---------------------------------------------------------------------------
|
|
51
112
|
# Landing bundle
|
|
52
113
|
# ---------------------------------------------------------------------------
|
|
@@ -26,6 +26,14 @@ class SearchHit(BaseModel):
|
|
|
26
26
|
edge_path: list[str] | None = None
|
|
27
27
|
edge_path_summary: str | None = None
|
|
28
28
|
rrf_score: float | None = None
|
|
29
|
+
# Memory-freshness v2a Phase 2 (A-span, MARVIS_SEARCH_SPANS): the winning
|
|
30
|
+
# chunk's text expanded to line boundaries ±12 lines, so the agent answers
|
|
31
|
+
# FROM the result without a follow-up Read. None when the flag is off, the
|
|
32
|
+
# hit is row-backed (task/learning/inbox), or the source file is gone.
|
|
33
|
+
span_text: str | None = None
|
|
34
|
+
span_path: str | None = None
|
|
35
|
+
span_line_start: int | None = None
|
|
36
|
+
span_line_end: int | None = None
|
|
29
37
|
|
|
30
38
|
|
|
31
39
|
class SearchResponse(BaseModel):
|
|
@@ -79,6 +79,8 @@ from core.api.models.graph_ux import (
|
|
|
79
79
|
PinIn,
|
|
80
80
|
PinOut,
|
|
81
81
|
ResolveOut,
|
|
82
|
+
SupersedeEdgeIn,
|
|
83
|
+
VerifyNodeIn,
|
|
82
84
|
)
|
|
83
85
|
from core.api.models.graph_cosmo import GraphCosmoOut
|
|
84
86
|
from core.api.rate_limit import limiter
|
|
@@ -701,6 +703,54 @@ async def delete_graph_pin(
|
|
|
701
703
|
return result
|
|
702
704
|
|
|
703
705
|
|
|
706
|
+
# --- KG trust write-path (Fase D, behind MARVIS_TEMPORAL_MEMORY) ---
|
|
707
|
+
|
|
708
|
+
@router.post("/nodes/verify", response_model=dict, summary="Mark a KG node re-verified")
|
|
709
|
+
@limiter.limit("60/minute")
|
|
710
|
+
async def mark_node_verified(
|
|
711
|
+
body: VerifyNodeIn,
|
|
712
|
+
request: Request,
|
|
713
|
+
user: UserInfo = Depends(get_current_user_or_agent),
|
|
714
|
+
db: aiosqlite.Connection = Depends(get_write_db),
|
|
715
|
+
) -> dict:
|
|
716
|
+
"""Stamp graph_nodes.last_verified_at = now (REINFORCE apply).
|
|
717
|
+
|
|
718
|
+
The action an agent performs after Triage approves a Brain recency proposal.
|
|
719
|
+
Inert (422) when MARVIS_TEMPORAL_MEMORY is off. 404 if the node is missing.
|
|
720
|
+
"""
|
|
721
|
+
ctx = CallerContext.from_user_info(user, is_human_session=False)
|
|
722
|
+
try:
|
|
723
|
+
return await uc.mark_node_verified(ctx, db, node_id=body.node_id)
|
|
724
|
+
except ServiceError as e:
|
|
725
|
+
raise to_http_legacy(e)
|
|
726
|
+
|
|
727
|
+
|
|
728
|
+
@router.post("/edges/supersede", response_model=dict, summary="Soft-invalidate a KG edge")
|
|
729
|
+
@limiter.limit("60/minute")
|
|
730
|
+
async def mark_edge_superseded(
|
|
731
|
+
body: SupersedeEdgeIn,
|
|
732
|
+
request: Request,
|
|
733
|
+
user: UserInfo = Depends(get_current_user_or_agent),
|
|
734
|
+
db: aiosqlite.Connection = Depends(get_write_db),
|
|
735
|
+
) -> dict:
|
|
736
|
+
"""Set graph_edges.valid_until = now (+ optional superseded_by) on a triple.
|
|
737
|
+
|
|
738
|
+
SUPERSEDE / CONTRADICTION apply. Soft, never deletes. Inert (422) when the
|
|
739
|
+
flag is off. 404 if the triple is absent.
|
|
740
|
+
"""
|
|
741
|
+
ctx = CallerContext.from_user_info(user, is_human_session=False)
|
|
742
|
+
try:
|
|
743
|
+
return await uc.mark_edge_superseded(
|
|
744
|
+
ctx, db,
|
|
745
|
+
source_id=body.source_id,
|
|
746
|
+
target_id=body.target_id,
|
|
747
|
+
relation=body.relation,
|
|
748
|
+
superseded_by=body.superseded_by,
|
|
749
|
+
)
|
|
750
|
+
except ServiceError as e:
|
|
751
|
+
raise to_http_legacy(e)
|
|
752
|
+
|
|
753
|
+
|
|
704
754
|
# --- Resolve file path → node_id ---
|
|
705
755
|
|
|
706
756
|
@router.get("/resolve", response_model=ResolveOut, summary="Resolve file path to KG node")
|
|
@@ -237,6 +237,40 @@ async def _warehouse_consolidation_due(
|
|
|
237
237
|
return elapsed >= interval_seconds
|
|
238
238
|
|
|
239
239
|
|
|
240
|
+
async def _temporal_recency_due(
|
|
241
|
+
*, workspace_id: str, now: datetime, interval_seconds: int
|
|
242
|
+
) -> bool:
|
|
243
|
+
"""Daily cadence guard for the KG temporal recency pass (Fase D).
|
|
244
|
+
|
|
245
|
+
Derives "last run" from the newest persisted recency proposal — these are
|
|
246
|
+
`operation_type='reinforce'` ops whose proposed_write target_type is 'none'
|
|
247
|
+
(M1 reinforce uses 'kg_edge_metric', so this filter isolates the recency
|
|
248
|
+
pass). Idempotent regardless (operation_id collision dedups within a cycle),
|
|
249
|
+
so a missing/unparseable timestamp falls back to "due".
|
|
250
|
+
"""
|
|
251
|
+
if interval_seconds <= 0:
|
|
252
|
+
return True
|
|
253
|
+
async with acquire_db() as db:
|
|
254
|
+
row = await (
|
|
255
|
+
await db.execute(
|
|
256
|
+
"SELECT MAX(detected_at) FROM brain_memory_operations"
|
|
257
|
+
" WHERE operation_type = 'reinforce'"
|
|
258
|
+
" AND proposed_write_target_type = 'none'",
|
|
259
|
+
)
|
|
260
|
+
).fetchone()
|
|
261
|
+
last_raw = row[0] if row else None
|
|
262
|
+
if not last_raw:
|
|
263
|
+
return True
|
|
264
|
+
try:
|
|
265
|
+
last_dt = datetime.fromisoformat(str(last_raw).replace("Z", "+00:00"))
|
|
266
|
+
except ValueError:
|
|
267
|
+
return True
|
|
268
|
+
if last_dt.tzinfo is None:
|
|
269
|
+
last_dt = last_dt.replace(tzinfo=timezone.utc)
|
|
270
|
+
elapsed = (now.astimezone(timezone.utc) - last_dt.astimezone(timezone.utc)).total_seconds()
|
|
271
|
+
return elapsed >= interval_seconds
|
|
272
|
+
|
|
273
|
+
|
|
240
274
|
def _cycle_window_from_key(
|
|
241
275
|
cycle_key: str, *, cutoff_hour_utc: int
|
|
242
276
|
) -> tuple[datetime, datetime]:
|
|
@@ -563,6 +597,44 @@ async def _execute_cycle(
|
|
|
563
597
|
SourceFailure(source_system="warehouse_consolidation", error=str(exc))
|
|
564
598
|
)
|
|
565
599
|
|
|
600
|
+
# Phase 4c — KG temporal recency (Fase D producer). Ships DORMANT: gated
|
|
601
|
+
# on temporal_memory_enabled (the MARVIS_TEMPORAL_MEMORY flag IS the gate;
|
|
602
|
+
# default off → skipped). When on, a daily cadence guard bounds re-emission.
|
|
603
|
+
# PROPOSALS only — never auto-applied. Isolated try/except so it can NEVER
|
|
604
|
+
# crash the cycle.
|
|
605
|
+
if app_settings.temporal_memory_enabled:
|
|
606
|
+
try:
|
|
607
|
+
from core.api.services.brain.temporal_recency import (
|
|
608
|
+
run_temporal_recency,
|
|
609
|
+
)
|
|
610
|
+
|
|
611
|
+
if await _temporal_recency_due(
|
|
612
|
+
workspace_id=workspace_id,
|
|
613
|
+
now=now,
|
|
614
|
+
interval_seconds=app_settings.brain_temporal_recency_interval_seconds,
|
|
615
|
+
):
|
|
616
|
+
tr_summary = await run_temporal_recency(
|
|
617
|
+
run_id=run_id,
|
|
618
|
+
cycle_key=cycle_key,
|
|
619
|
+
workspace_id=workspace_id,
|
|
620
|
+
now=now,
|
|
621
|
+
)
|
|
622
|
+
logger.info(
|
|
623
|
+
"brain.jobs: temporal recency run_id=%s summary=%s",
|
|
624
|
+
run_id,
|
|
625
|
+
tr_summary,
|
|
626
|
+
)
|
|
627
|
+
else:
|
|
628
|
+
logger.info(
|
|
629
|
+
"brain.jobs: temporal recency skipped (cadence guard) run_id=%s",
|
|
630
|
+
run_id,
|
|
631
|
+
)
|
|
632
|
+
except Exception as exc: # noqa: BLE001 — phase-level isolation
|
|
633
|
+
logger.exception("brain.jobs: temporal recency failed")
|
|
634
|
+
failures.append(
|
|
635
|
+
SourceFailure(source_system="temporal_recency", error=str(exc))
|
|
636
|
+
)
|
|
637
|
+
|
|
566
638
|
# Phase 5 — Learn Findings (sub-04). Final L5 phase of the cycle.
|
|
567
639
|
# Consumes digest events + journal entries + drift signals + memory
|
|
568
640
|
# operations of the current run_id (NEVER re-reads substrate).
|
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
# v1.0.0 - 2026-06-09 - P1: claude -p (Claude Code headless) provider for the Brain.
|
|
2
|
+
"""Brain LLM backend that runs `claude -p` (Claude Code headless) as a subprocess.
|
|
3
|
+
|
|
4
|
+
The brain runs on the user's Claude Code **subscription** — zero API key. Selected
|
|
5
|
+
with `BRAIN_LLM_PROVIDER=claude_cli`; the default `gateway` path is unchanged.
|
|
6
|
+
|
|
7
|
+
Same `BrainLLMService` contract as `LocalGatewayBrainService` (call_polish / call_json
|
|
8
|
+
/ aclose + model / grounding_strict). Only the transport differs: instead of an HTTP
|
|
9
|
+
chat.completion, we exec `claude -p --output-format json`, write the user prompt to
|
|
10
|
+
**stdin**, and read the single-result envelope. Verified flags/schema against the
|
|
11
|
+
installed binary (2026-06-09): envelope `{result: str, is_error: bool, …}`.
|
|
12
|
+
|
|
13
|
+
CRITICAL: `claude -p` is an AGENT by default (loads the Claude Code system prompt,
|
|
14
|
+
may use tools). For pure generation we pass `--allowedTools ""` (no tools),
|
|
15
|
+
`--system-prompt <brain>` (replace, not append) + `--exclude-dynamic-system-prompt-sections`
|
|
16
|
+
(strip the agentic preamble). Everything fails SOFT: any error/timeout/non-zero
|
|
17
|
+
exit/malformed JSON → PolishResult.failed (or None for call_json) → the brain
|
|
18
|
+
degrades to its deterministic baseline, never a crash.
|
|
19
|
+
"""
|
|
20
|
+
from __future__ import annotations
|
|
21
|
+
|
|
22
|
+
import asyncio
|
|
23
|
+
import json
|
|
24
|
+
import logging
|
|
25
|
+
import os
|
|
26
|
+
import shutil
|
|
27
|
+
from contextlib import suppress
|
|
28
|
+
from typing import Any
|
|
29
|
+
|
|
30
|
+
from core.api.services.brain.llm.base import PolishPurpose, PolishResult
|
|
31
|
+
from core.api.services.brain.llm.direction_alignment import (
|
|
32
|
+
classify_direction_alignment_impl,
|
|
33
|
+
)
|
|
34
|
+
from core.api.services.brain.llm.local_gateway import _project_polished_fields
|
|
35
|
+
from core.api.services.brain.llm.parsers import ParseError, parse_json_or_raise
|
|
36
|
+
|
|
37
|
+
logger = logging.getLogger(__name__)
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
class ClaudeCliBrainService:
|
|
41
|
+
"""Brain polish via `claude -p` headless on the local Claude Code subscription."""
|
|
42
|
+
|
|
43
|
+
def __init__(
|
|
44
|
+
self,
|
|
45
|
+
*,
|
|
46
|
+
model: str,
|
|
47
|
+
binary: str = "claude",
|
|
48
|
+
timeout_seconds: int = 60,
|
|
49
|
+
semaphore_size: int = 1,
|
|
50
|
+
grounding_strict: bool = False,
|
|
51
|
+
) -> None:
|
|
52
|
+
self._model = model or ""
|
|
53
|
+
self._binary = binary or "claude"
|
|
54
|
+
self._timeout_seconds = max(5, int(timeout_seconds))
|
|
55
|
+
# Subprocess is heavy (CLI boot per call); keep concurrency low.
|
|
56
|
+
self._semaphore = asyncio.Semaphore(max(1, int(semaphore_size)))
|
|
57
|
+
self._grounding_strict = grounding_strict
|
|
58
|
+
|
|
59
|
+
@property
|
|
60
|
+
def model(self) -> str:
|
|
61
|
+
return self._model
|
|
62
|
+
|
|
63
|
+
@property
|
|
64
|
+
def grounding_strict(self) -> bool:
|
|
65
|
+
return self._grounding_strict
|
|
66
|
+
|
|
67
|
+
async def aclose(self) -> None:
|
|
68
|
+
# No persistent client/process to release.
|
|
69
|
+
return None
|
|
70
|
+
|
|
71
|
+
# ----------------------------------------------------------------- #
|
|
72
|
+
# subprocess transport #
|
|
73
|
+
# ----------------------------------------------------------------- #
|
|
74
|
+
|
|
75
|
+
async def _run(self, *, system_prompt: str, user_prompt: str) -> tuple[str | None, str]:
|
|
76
|
+
"""Run `claude -p` once. Returns (content, "") on success, (None, reason) on
|
|
77
|
+
any failure. `content` is the assistant text (the envelope's `result`)."""
|
|
78
|
+
if not os.path.isabs(self._binary) and shutil.which(self._binary) is None:
|
|
79
|
+
return (None, "claude_not_on_path")
|
|
80
|
+
|
|
81
|
+
argv = [
|
|
82
|
+
self._binary,
|
|
83
|
+
"-p",
|
|
84
|
+
"--output-format", "json",
|
|
85
|
+
"--allowedTools", "", # no tools → pure generation, no agent loop
|
|
86
|
+
"--exclude-dynamic-system-prompt-sections", # drop the Claude Code agentic preamble
|
|
87
|
+
"--system-prompt", system_prompt,
|
|
88
|
+
]
|
|
89
|
+
if self._model:
|
|
90
|
+
argv += ["--model", self._model]
|
|
91
|
+
|
|
92
|
+
async with self._semaphore:
|
|
93
|
+
try:
|
|
94
|
+
proc = await asyncio.create_subprocess_exec(
|
|
95
|
+
*argv,
|
|
96
|
+
stdin=asyncio.subprocess.PIPE,
|
|
97
|
+
stdout=asyncio.subprocess.PIPE,
|
|
98
|
+
stderr=asyncio.subprocess.PIPE,
|
|
99
|
+
)
|
|
100
|
+
except Exception as exc: # binary missing / exec error
|
|
101
|
+
return (None, f"spawn_failed:{exc}")
|
|
102
|
+
try:
|
|
103
|
+
out, err = await asyncio.wait_for(
|
|
104
|
+
proc.communicate(user_prompt.encode("utf-8")),
|
|
105
|
+
timeout=self._timeout_seconds,
|
|
106
|
+
)
|
|
107
|
+
except asyncio.TimeoutError:
|
|
108
|
+
proc.kill()
|
|
109
|
+
with suppress(Exception):
|
|
110
|
+
await proc.wait()
|
|
111
|
+
return (None, "timeout")
|
|
112
|
+
except Exception as exc:
|
|
113
|
+
return (None, f"communicate_failed:{exc}")
|
|
114
|
+
|
|
115
|
+
if proc.returncode != 0:
|
|
116
|
+
tail = err.decode("utf-8", "replace")[:200] if err else ""
|
|
117
|
+
return (None, f"exit_{proc.returncode}:{tail}")
|
|
118
|
+
|
|
119
|
+
try:
|
|
120
|
+
env = json.loads(out.decode("utf-8"))
|
|
121
|
+
except Exception:
|
|
122
|
+
return (None, "envelope_not_json")
|
|
123
|
+
if not isinstance(env, dict):
|
|
124
|
+
return (None, "envelope_not_object")
|
|
125
|
+
if env.get("is_error"):
|
|
126
|
+
return (None, f"claude_error:{str(env.get('result'))[:200]}")
|
|
127
|
+
|
|
128
|
+
content = env.get("result")
|
|
129
|
+
if not isinstance(content, str) or not content.strip():
|
|
130
|
+
# Tolerant of schema drift: fall back to the first non-empty string field.
|
|
131
|
+
content = next(
|
|
132
|
+
(v for v in env.values() if isinstance(v, str) and v.strip()), ""
|
|
133
|
+
)
|
|
134
|
+
if not content:
|
|
135
|
+
return (None, "empty_result")
|
|
136
|
+
return (content, "")
|
|
137
|
+
|
|
138
|
+
# ----------------------------------------------------------------- #
|
|
139
|
+
# BrainLLMService contract #
|
|
140
|
+
# ----------------------------------------------------------------- #
|
|
141
|
+
|
|
142
|
+
async def call_polish(
|
|
143
|
+
self,
|
|
144
|
+
*,
|
|
145
|
+
purpose: PolishPurpose,
|
|
146
|
+
system_prompt: str,
|
|
147
|
+
user_prompt: str,
|
|
148
|
+
max_tokens: int,
|
|
149
|
+
idempotency_key: str | None = None,
|
|
150
|
+
) -> PolishResult:
|
|
151
|
+
"""Issue the polish call. Never raises — returns PolishResult.failed on errors.
|
|
152
|
+
Shares the content→PolishResult projection with the gateway provider."""
|
|
153
|
+
content, reason = await self._run(system_prompt=system_prompt, user_prompt=user_prompt)
|
|
154
|
+
if content is None:
|
|
155
|
+
logger.warning("brain_claude_cli_polish_failed purpose=%s reason=%s", purpose, reason)
|
|
156
|
+
return PolishResult.failed(purpose=purpose, reason=reason, model=self._model)
|
|
157
|
+
try:
|
|
158
|
+
parsed = parse_json_or_raise(content)
|
|
159
|
+
except ParseError as exc:
|
|
160
|
+
return PolishResult.failed(
|
|
161
|
+
purpose=purpose, reason=f"json_parse_failed:{exc}", model=self._model
|
|
162
|
+
)
|
|
163
|
+
polished, cited = _project_polished_fields(purpose=purpose, parsed=parsed)
|
|
164
|
+
if not polished:
|
|
165
|
+
return PolishResult.failed(
|
|
166
|
+
purpose=purpose, reason="polished_fields_missing", model=self._model
|
|
167
|
+
)
|
|
168
|
+
return PolishResult(
|
|
169
|
+
success=True,
|
|
170
|
+
purpose=purpose,
|
|
171
|
+
polished=polished,
|
|
172
|
+
cited_evidence_refs=cited,
|
|
173
|
+
model=self._model,
|
|
174
|
+
)
|
|
175
|
+
|
|
176
|
+
async def call_json(
|
|
177
|
+
self,
|
|
178
|
+
*,
|
|
179
|
+
model: str,
|
|
180
|
+
system_prompt: str,
|
|
181
|
+
user_prompt: str,
|
|
182
|
+
max_tokens: int,
|
|
183
|
+
temperature: float,
|
|
184
|
+
idempotency_key: str | None = None,
|
|
185
|
+
) -> dict[str, Any] | None:
|
|
186
|
+
"""Generic JSON-object call (DR8 classifier). The per-call `model` is a
|
|
187
|
+
gateway model id with no Claude equivalent, so the configured Claude model
|
|
188
|
+
(`self._model`) is used. None on any failure — caller falls back."""
|
|
189
|
+
content, reason = await self._run(system_prompt=system_prompt, user_prompt=user_prompt)
|
|
190
|
+
if content is None:
|
|
191
|
+
logger.warning("brain_claude_cli_json_failed reason=%s", reason)
|
|
192
|
+
return None
|
|
193
|
+
try:
|
|
194
|
+
return parse_json_or_raise(content)
|
|
195
|
+
except ParseError as exc:
|
|
196
|
+
logger.warning("brain_claude_cli_json_parse_failed reason=%s", str(exc))
|
|
197
|
+
return None
|
|
198
|
+
|
|
199
|
+
async def classify_direction_alignment(self, payload: dict[str, Any]) -> dict[str, Any] | None:
|
|
200
|
+
"""DR8 classifier surface — same impl the gateway provider uses."""
|
|
201
|
+
return await classify_direction_alignment_impl(llm_surface=self, payload=payload)
|
|
@@ -93,6 +93,19 @@ def get_brain_llm_service() -> BrainLLMService:
|
|
|
93
93
|
_brain_llm_service = _NoOpBrainLLMService()
|
|
94
94
|
return _brain_llm_service
|
|
95
95
|
|
|
96
|
+
# P1: claude -p provider runs on the Claude Code subscription — NO api key.
|
|
97
|
+
if getattr(settings, "brain_llm_provider", "gateway") == "claude_cli":
|
|
98
|
+
from core.api.services.brain.llm.claude_cli import ClaudeCliBrainService
|
|
99
|
+
|
|
100
|
+
_brain_llm_service = ClaudeCliBrainService(
|
|
101
|
+
binary=getattr(settings, "marvis_claude_bin", "claude") or "claude",
|
|
102
|
+
model=settings.brain_llm_model,
|
|
103
|
+
timeout_seconds=settings.brain_llm_polish_timeout_seconds,
|
|
104
|
+
semaphore_size=settings.brain_llm_semaphore_size,
|
|
105
|
+
grounding_strict=settings.brain_llm_grounding_strict,
|
|
106
|
+
)
|
|
107
|
+
return _brain_llm_service
|
|
108
|
+
|
|
96
109
|
brain_key = _secret_text(settings.brain_llm_gateway_api_key)
|
|
97
110
|
global_key = _secret_text(settings.llm_gateway_api_key)
|
|
98
111
|
|
|
@@ -1519,10 +1519,21 @@ def _next_action_for(op: MemoryOperation) -> ApplyNextAction:
|
|
|
1519
1519
|
target_type = pw.target_type # type: ignore[union-attr]
|
|
1520
1520
|
|
|
1521
1521
|
if op.operation_type == "reinforce":
|
|
1522
|
-
|
|
1523
|
-
|
|
1524
|
-
|
|
1525
|
-
|
|
1522
|
+
if target_type == "none":
|
|
1523
|
+
# Fase D temporal recency: bump the node's last_verified_at via the
|
|
1524
|
+
# write-path tool (proposed_write is `none`; the node id rides in
|
|
1525
|
+
# source_ref). Guidance-only: the operator/agent runs the tool.
|
|
1526
|
+
tool = "mcp__marvis__mark_kg_verified"
|
|
1527
|
+
args = {"node_id": op.source_ref}
|
|
1528
|
+
rationale = (
|
|
1529
|
+
"Temporal recency: this live node is aging and never verified. "
|
|
1530
|
+
"Approve → mark_kg_verified stamps last_verified_at so it reads fresh."
|
|
1531
|
+
)
|
|
1532
|
+
else:
|
|
1533
|
+
tool = None
|
|
1534
|
+
rationale = "reinforce produces edge metric evidence only; v2 may write to graph_edge_metrics."
|
|
1535
|
+
if hasattr(pw, "edge_id"):
|
|
1536
|
+
args = {"edge_id": pw.edge_id, "metric_kind": pw.metric_kind, "delta": pw.delta}
|
|
1526
1537
|
elif op.operation_type == "cascade_rollup":
|
|
1527
1538
|
tool = None
|
|
1528
1539
|
rationale = "Cascade rollup is apply-guidance-only. Operator appends body to parent context.md."
|