marvisx-cli 0.2.2__tar.gz → 0.3.5__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/MANIFEST.in +1 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/PKG-INFO +1 -2
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/README.md +4 -4
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/agents/session_manager.py +3 -1
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/config.py +33 -10
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/db.py +15 -7
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/main.py +13 -9
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/mcp/_adapter.py +70 -1
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/mcp/server.py +27 -3
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/mcp/tools/__init__.py +2 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/mcp/tools/brain.py +4 -4
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/mcp/tools/learnings.py +40 -2
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/mcp/tools/projects.py +1 -1
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/mcp/tools/pull_requests.py +3 -3
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/mcp/tools/safety.py +1 -1
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/mcp/tools/search.py +6 -6
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/mcp/tools/tasks.py +3 -3
- marvisx_cli-0.3.5/core/api/mcp/tools/workflow_playbooks/brainstorm.md +72 -0
- marvisx_cli-0.3.5/core/api/mcp/tools/workflow_playbooks/compound.md +71 -0
- marvisx_cli-0.3.5/core/api/mcp/tools/workflow_playbooks/plan.md +69 -0
- marvisx_cli-0.3.5/core/api/mcp/tools/workflows.py +415 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/models/monitoring.py +1 -1
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/models/search.py +15 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/routers/brain.py +3 -3
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/routers/graph.py +1 -1
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/routers/kg.py +1 -1
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/routers/learnings.py +102 -2
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/routers/projects.py +60 -1
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/routers/search.py +1 -1
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/routers/sessions.py +1 -1
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/runtime_settings.py +69 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/security.py +3 -3
- marvisx_cli-0.3.5/core/api/services/_fts.py +32 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/brain/findings_reader.py +2 -2
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/brain/jobs.py +167 -8
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/brain/llm/direction_alignment.py +1 -1
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/brain/memory_ops.py +4 -4
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/brain/recap.py +1 -1
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/brain/sources/__init__.py +1 -1
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/brain/sources/pir_tasks.py +1 -1
- marvisx_cli-0.3.5/core/api/services/brain/warehouse_consolidate.py +227 -0
- marvisx_cli-0.3.5/core/api/services/embedding_backends/__init__.py +31 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/embedding_internal.py +162 -6
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/embedding_service.py +474 -62
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/git_ops.py +8 -8
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/graph_service.py +4 -4
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/inbox.py +77 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/inbox_tldr.py +2 -2
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/ingest/embedding_router.py +11 -11
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/ingest/insert_saga.py +14 -4
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/ingest/llm/classification_context.py +7 -3
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/ingest/llm/openai_nano.py +7 -3
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/ingest/watcher.py +1 -1
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/kg/hybrid_search.py +38 -8
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/kg/pr_impact.py +1 -1
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/metrics_collector.py +2 -2
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/model_router.py +1 -1
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/pr_impact_pipeline/dispatcher.py +1 -1
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/tmux.py +0 -1
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/webhook_service.py +3 -3
- marvisx_cli-0.3.5/core/api/tests/test_config_env_aliases.py +75 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/tests/test_git_ops_merge.py +25 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/use_cases/brain.py +1 -1
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/use_cases/graph.py +5 -5
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/use_cases/handoffs.py +2 -2
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/use_cases/learnings.py +77 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/use_cases/search.py +95 -9
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/use_cases/tasks.py +6 -6
- marvisx_cli-0.3.5/core/cli/_brain_opportunistic.py +138 -0
- marvisx_cli-0.3.5/core/cli/_brain_schedule.py +373 -0
- marvisx_cli-0.3.5/core/cli/marvis_brain.py +200 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/cli/marvis_doctor.py +149 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/cli/marvis_governance.py +2 -2
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/cli/marvis_init.py +156 -2
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/cli/marvis_mcp.py +89 -47
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/scripts/_drift_check.py +3 -3
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/scripts/install_hooks/safety_bridge.py +14 -14
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/scripts/populate_artifacts.py +1 -1
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/scripts/populate_cross_project.py +9 -6
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/scripts/safety_bridge.py +14 -14
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/telemetry/client.py +1 -1
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/telemetry/schema.py +1 -1
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/marvisx_cli.egg-info/PKG-INFO +1 -2
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/marvisx_cli.egg-info/SOURCES.txt +11 -1
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/marvisx_cli.egg-info/requires.txt +0 -1
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/078_kg_fts5.sql +1 -1
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/095_kg_intent_first.sql +1 -1
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/pyproject.toml +16 -3
- marvisx_cli-0.2.2/core/api/services/ingest/retry_voyage.py +0 -88
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/LICENSE +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/__init__.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/agents/__init__.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/agents/session_health.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/bin/marvisx-state-hook.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/dependencies/__init__.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/dependencies/tenant.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/mcp/__init__.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/mcp/tools/graph.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/mcp/tools/handoffs.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/mcp/tools/ingest.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/middleware/__init__.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/middleware/tool_call_audit.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/models/__init__.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/models/auth.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/models/brain.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/models/common.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/models/costs.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/models/graph.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/models/graph_cosmo.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/models/graph_pr_impact.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/models/graph_ux.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/models/inbox.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/models/ingest_keys.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/models/kg.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/models/llm_config.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/models/projects.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/models/sessions.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/models/tasks.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/models/teams.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/models/users.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/observability/__init__.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/observability/tracing.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/paths.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/rate_limit.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/rbac.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/routers/__init__.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/routers/_adapter.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/routers/admin_pr_impact.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/routers/admin_settings.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/routers/agent.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/routers/agent_tokens.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/routers/app_settings.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/routers/audit.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/routers/auth.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/routers/bench.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/routers/brain_directions.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/routers/ci_checks.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/routers/comments.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/routers/costs.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/routers/docs_coverage.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/routers/docs_governance.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/routers/documents.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/routers/files.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/routers/finder.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/routers/handoffs.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/routers/inbox.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/routers/ingest_api_keys.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/routers/ingest_triage.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/routers/judge.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/routers/llm_config.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/routers/monitoring.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/routers/notifications.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/routers/pr_impact.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/routers/pull_requests.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/routers/push.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/routers/raci.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/routers/settings.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/routers/share_repo.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/routers/status_updates.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/routers/tags.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/routers/tasks.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/routers/teams.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/routers/terminal.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/routers/users.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/routers/webhooks.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/__init__.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/audit.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/auto_approval.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/brain/__init__.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/brain/baseline.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/brain/capabilities.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/brain/cascade_rollup.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/brain/compound_bridge.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/brain/cycle.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/brain/cycle_snapshot.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/brain/digest_collector.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/brain/direction.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/brain/drift.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/brain/drift_router.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/brain/edge_metrics.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/brain/events_reader.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/brain/findings.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/brain/journal.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/brain/knowledge_forms.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/brain/llm/__init__.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/brain/llm/_runner.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/brain/llm/base.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/brain/llm/cache.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/brain/llm/constants.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/brain/llm/factory.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/brain/llm/finding_reasoning.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/brain/llm/finding_summary.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/brain/llm/grounding.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/brain/llm/journal_polish.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/brain/llm/local_gateway.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/brain/llm/parsers.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/brain/llm/router_glue.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/brain/models.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/brain/owner_hint.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/brain/rules/__init__.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/brain/rules/_signals.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/brain/rules/dr1_activity_without_status.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/brain/rules/dr2_decision_without_adr.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/brain/rules/dr3_stale_open_loop.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/brain/rules/dr4_docs_governance_drift.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/brain/rules/dr5_playbook_changed.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/brain/rules/dr6_external_update_unpropagated.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/brain/rules/dr7_claimed_decision_gap.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/brain/rules/dr8_direction_misalignment.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/brain/runs_reader.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/brain/scope.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/brain/sources/base.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/brain/sources/git_kg.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/brain/sources/handoffs.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/brain/sources/ingestor.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/brain/sources/learnings.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/brain/watermarks.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/brain/ws_emitter.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/cc_tasks_reader.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/ci_service.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/claude_metrics.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/codex_metrics.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/conversation_reader.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/cost_service.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/crypto.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/docs_governance/__init__.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/docs_governance/confidence.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/docs_governance/config.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/docs_governance/enrichment.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/docs_governance/frontmatter_validator.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/docs_governance/hard_gates.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/docs_governance/triage_orchestrator.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/event_dispatcher.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/events.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/graph_cosmo_service.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/graph_ranker.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/inbox_digest.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/inbox_digest_deep_research.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/inbox_digest_jobs.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/inbox_gmail_sync.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/inbox_llm_classifier.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/inbox_source_identity.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/inbox_sources.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/inbox_taxonomy.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/inbox_triage.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/ingest/__init__.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/ingest/api_key_auth.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/ingest/auto_approve.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/ingest/classifier.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/ingest/confidence.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/ingest/dispatch.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/ingest/events.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/ingest/ignore_patterns.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/ingest/image_probe.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/ingest/ingress.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/ingest/llm/__init__.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/ingest/llm/anthropic_haiku.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/ingest/llm/base.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/ingest/llm/byok_provider.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/ingest/llm/config_store.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/ingest/llm/factory.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/ingest/llm/kg_enricher.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/ingest/llm/local_gateway.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/ingest/llm/local_vllm.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/ingest/lock_advisory.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/ingest/parser_router.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/ingest/parsers/__init__.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/ingest/parsers/docling_parser.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/ingest/parsers/docparse_gateway.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/ingest/parsers/docx_parser.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/ingest/parsers/folder_unpacker.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/ingest/parsers/gateway_aux.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/ingest/parsers/image_parser.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/ingest/parsers/internal_markdown.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/ingest/parsers/ocr_gateway.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/ingest/parsers/ocr_pdf_parser.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/ingest/parsers/pdf_types.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/ingest/parsers/transcript_parser.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/ingest/parsers/vision_gateway.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/ingest/parsers/xlsx_parser.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/ingest/parsers/zip_unpacker.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/ingest/preflight.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/ingest/routing_policy.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/ingest/serializers/__init__.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/ingest/serializers/xlsx_to_markdown.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/ingest/skip_log.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/kg/__init__.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/kg/audit.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/kg/lens.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/kg/queries.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/kg/ranking.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/kg/rrf.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/kg_watcher_control.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/local_llm/__init__.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/local_llm/async_client.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/local_llm/client.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/local_llm/url_validator.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/metrics_providers.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/model_registry.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/n8n_client.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/newsletter_llm_gateway.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/notification_service.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/openai_responses.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/opencode_metrics.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/opencode_sessions.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/pii_redactor.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/pr_impact_pipeline/__init__.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/pr_impact_pipeline/differ.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/pr_impact_pipeline/gc.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/pr_impact_pipeline/languages.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/pr_impact_pipeline/parser.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/pr_impact_pipeline/writer.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/pr_service.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/project_paths.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/project_status_updates.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/providers.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/push_service.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/reminder_service.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/runas.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/salience_service.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/security_collector.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/session_catalog.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/session_metrics_service.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/session_ops.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/session_state.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/share_links.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/task_transitions.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/terminal_metrics.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/terminal_metrics_dump.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/workspace_sync.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/templates/__init__.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/templates/markdown_share.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/terminal.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/tests/__init__.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/tests/test_agent_facing_auth_dependencies.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/tests/test_audit_permissions.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/tests/test_backfill_session_conversations.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/tests/test_backfill_working_seconds_msg.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/tests/test_claude_metrics.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/tests/test_codex_metrics.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/tests/test_finder_paths.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/tests/test_learnings_check_search.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/tests/test_metrics_providers.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/tests/test_migration_087.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/tests/test_migration_088.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/tests/test_migration_089.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/tests/test_openai_responses.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/tests/test_opencode_metrics.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/tests/test_opencode_sessions.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/tests/test_pr_workflow_e2e.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/tests/test_projects_handoffs.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/tests/test_providers.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/tests/test_require_scope_empty_deny.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/tests/test_safety_bridge.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/tests/test_session_catalog.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/tests/test_session_conversations.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/tests/test_session_metrics_service.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/tests/test_session_resume_paths.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/tests/test_session_theme_mode_migration.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/tests/test_sessions_rbac.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/tests/test_share_edit.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/tests/test_share_repo.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/tests/test_terminal_session_manager.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/tests/test_terminal_upload.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/tests/test_tmux.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/tests/test_workspace_sync.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/tests/test_ws_ticket_in_memory.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/use_cases/__init__.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/use_cases/_context.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/use_cases/_errors.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/use_cases/_roles.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/use_cases/audit.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/use_cases/costs.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/use_cases/ingest_triage.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/use_cases/projects.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/use_cases/pull_requests.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/visibility.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/cli/README.md +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/cli/__init__.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/cli/_index_source.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/cli/_runtime_ctx.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/cli/_transmute.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/cli/marvis_account.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/cli/marvis_feedback.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/cli/marvis_hooks.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/cli/marvis_runtime.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/cli/marvis_telemetry.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/scripts/_frontmatter.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/scripts/_graph_writer.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/scripts/ast_parser.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/scripts/install_hooks/__init__.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/scripts/install_hooks/_config.sh +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/scripts/install_hooks/block-dangerous-bash.sh +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/scripts/install_hooks/block-db-direct-write.sh +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/scripts/install_hooks/block-push-no-task.sh +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/scripts/install_hooks/block-staging-to-prod.sh +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/scripts/install_hooks/block-subtree-push.sh +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/scripts/install_hooks/config.json +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/scripts/install_hooks/enforce-no-merge-main.sh +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/scripts/install_hooks/enforce-worktree.sh +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/scripts/install_hooks/quality-gate.sh +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/scripts/install_hooks/secret-scan.sh +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/scripts/migrate_spike_node_ids.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/scripts/populate_inbox_nodes.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/scripts/populate_pr_impact.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/scripts/populate_project_nodes.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/scripts/populate_touch_counter.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/scripts/reparse_failed.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/telemetry/__init__.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/telemetry/entitlements.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/telemetry/rollup.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/telemetry/sender.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/wizard/__init__.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/wizard/byok_vault.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/wizard/defaults.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/wizard/state.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/wizard/steps.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/wizard/validation.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/marvisx_cli.egg-info/dependency_links.txt +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/marvisx_cli.egg-info/entry_points.txt +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/marvisx_cli.egg-info/top_level.txt +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/001_initial.sql +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/002_tasks.sql +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/003_session_management.sql +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/004_projects_comments.sql +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/005_session_intelligence.sql +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/006_settings.sql +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/007_task_scoring.sql +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/008_cost_tracking.sql +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/009_session_card_metrics.sql +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/010_monitoring.sql +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/012_agent_api.sql +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/013_session_complete.sql +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/015_pull_requests.sql +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/015_pull_requests_down.sql +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/016_users_raci.sql +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/017_task_cost_entries.sql +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/018_agents.sql +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/018_agents_down.sql +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/019_review_feedback.sql +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/020_pr_commit_sha.sql +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/021_webhook_events.sql +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/022_devx_agent_managed.sql +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/022_devx_agent_managed_down.sql +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/023_devx_p1_gate.sql +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/023_devx_p1_gate_down.sql +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/024_chat_messages.sql +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/024_pr_conversation_id.sql +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/024_task_indexes.sql +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/024_task_indexes_down.sql +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/025_audit_log.sql +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/026_agent_tokens.sql +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/027_teams_auth_phase_b.sql +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/028_learnings.sql +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/029_team_roles.sql +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/030_finder_pins.sql +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/031_pr_deploy_status.sql +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/032_task_reminders.sql +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/033_events_retry_count.sql +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/033_session_owner.sql +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/034_notifications.sql +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/035_shared_links.sql +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/036_session_index_upgrade.sql +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/037_pr_approval.sql +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/038_pr_submitted_by.sql +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/039_push_subscriptions.sql +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/040_semantic_search.sql +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/041_workspaces.sql +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/042_oidc_providers.sql +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/043_ci_checks.sql +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/044_agent_metrics.sql +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/045_documents_doc_type.sql +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/046_salience.sql +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/047_seed_missing_agents.sql +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/048_fix_agent_paths_roles.sql +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/049_agent_role_and_learnings_schema.sql +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/050_session_provider.sql +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/051_session_launch_profile.sql +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/052_session_theme_mode.sql +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/052_task_kind.sql +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/053_inbox_items.sql +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/054_inbox_triage_contract.sql +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/055_inbox_topic_treatment.sql +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/056_inbox_treatment_read_save.sql +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/057_session_theme_mode_backfill.sql +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/058_inbox_item_status_lifecycle.sql +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/059_inbox_tldr_and_source_scores.sql +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/060_newsletter.sql +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/061_inbox_redesign.sql +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/062_fix_inbox_sources_backfill.sql +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/063_task_completion_mode.sql +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/064_judge_mode_setting.sql +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/065_knowledge_graph_spike.sql +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/066_digest_ranking_inputs.sql +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/066_kg_artifact_nodes.sql +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/067_inbox_digest_selections.sql +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/067_kg_temporal.sql +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/068_inbox_digest_app_settings.sql +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/068_kg_touch_counter.sql +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/069_kg_doc_types.sql +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/070_digest_ranking_inputs_recovery.sql +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/071_inbox_digest_selections_recovery.sql +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/072_inbox_digest_app_settings_recovery.sql +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/073_kg_cross_project.sql +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/073_kg_cross_project_down.sql +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/074_kg_infra_types.sql +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/074_kg_infra_types_down.sql +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/075_kg_file_state_recovery.sql +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/075_kg_file_state_recovery_down.sql +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/076_kg_watcher_state.sql +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/076_kg_watcher_state_down.sql +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/077_kg_doc_types_extend.sql +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/077_kg_doc_types_extend_down.sql +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/078_kg_fts5_down.sql +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/079_kg_missing_indexes.sql +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/079_kg_missing_indexes_down.sql +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/080_kg_fts5_extended.sql +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/080_kg_fts5_extended_down.sql +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/081_kg_lens_indexes.sql +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/081_kg_lens_indexes_down.sql +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/082_kg_pins.sql +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/082_kg_pins_down.sql +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/083_kg_graph_nodes_degree.sql +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/083_kg_graph_nodes_degree_down.sql +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/084_drop_legacy_scheduler_tables.sql +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/084_drop_legacy_scheduler_tables_down.sql +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/085_kg_edge_resolves_to.sql +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/085_kg_edge_resolves_to_down.sql +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/086_project_status_updates_feed.sql +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/086_project_status_updates_feed_down.sql +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/087_session_metrics_dual.sql +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/087_session_metrics_dual_down.sql +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/088_rename_context_pct_legacy.sql +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/088_rename_context_pct_legacy_down.sql +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/089_session_metrics_equivalent_cost.sql +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/089_session_metrics_equivalent_cost_down.sql +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/090_kg_inbox_node_type.sql +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/090_kg_inbox_node_type_down.sql +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/091_kg_inbox_node_type_check.sql +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/091_kg_inbox_node_type_check_down.sql +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/092_sessions_activity_state_ts.sql +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/092_sessions_activity_state_ts_down.sql +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/093_sessions_activity_state_column.sql +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/093_sessions_activity_state_column_down.sql +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/094_ingest_pending.sql +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/094_ingest_pending_down.sql +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/095_kg_intent_first_down.sql +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/096_kg_xlsx_artifact_prefix.sql +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/096_kg_xlsx_artifact_prefix_down.sql +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/097_ingest_change_history.sql +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/097_ingest_change_history_down.sql +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/098_kg_node_type_business.sql +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/098_kg_node_type_business_down.sql +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/099_kg_edges_restore_weight.sql +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/099_kg_edges_restore_weight_down.sql +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/100_kg_enriched_at.sql +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/100_kg_enriched_at_down.sql +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/101_local_llm_shadow_comparisons.sql +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/101_local_llm_shadow_comparisons_down.sql +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/102_promote_llm_costs.sql +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/102_promote_llm_costs_down.sql +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/103_ingest_skipped_log.sql +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/103_ingest_skipped_log_down.sql +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/120_docs_governance.sql +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/120_docs_governance_down.sql +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/121_notification_event_fk_cleanup.sql +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/121_notification_event_fk_cleanup_down.sql +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/122_docs_drift_history.sql +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/122_docs_drift_history_down.sql +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/123_ingest_parser_waiting_status.sql +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/123_ingest_parser_waiting_status_down.sql +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/124_heypocket_recordings.sql +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/124_heypocket_recordings_down.sql +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/125_kg_node_type_record.sql +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/125_kg_node_type_record_down.sql +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/126_ingest_terminal_upload_source_kind.sql +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/126_ingest_terminal_upload_source_kind_down.sql +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/127_brain_v1_substrate.sql +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/127_brain_v1_substrate_down.sql +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/128_brain_drift_signals.sql +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/128_brain_drift_signals_down.sql +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/129_brain_memory_operations.sql +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/129_brain_memory_operations_down.sql +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/130_brain_findings.sql +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/130_brain_findings_down.sql +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/132_kg_pr_modifies.sql +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/132_kg_pr_modifies_down.sql +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/133_brain_v1_2_direction_schema.sql +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/133_brain_v1_2_direction_schema_down.sql +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/134_brain_journal_narrative_polished.sql +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/134_brain_journal_narrative_polished_down.sql +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/135_kg_edges_provider.sql +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/136_documents_fts.sql +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/137_promote_llm_costs.sql +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/137_promote_llm_costs_down.sql +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/138_ingest_api_keys.sql +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/138_ingest_api_keys_down.sql +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/139_ingest_pending_ingress.sql +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/139_ingest_pending_ingress_down.sql +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/140_ingest_idempotency_quota.sql +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/140_ingest_idempotency_quota_down.sql +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/141_ingest_pending_metadata.sql +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/141_ingest_pending_metadata_down.sql +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/142_llm_function_config.sql +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/142_llm_function_config_down.sql +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/143_kg_code_embeddings.sql +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/143_kg_code_embeddings_down.sql +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/144_notifications_pending_sync_index.sql +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/145_audit_log_immutable.sql +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/145_audit_log_immutable_down.sql +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/__init__.py +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/projects/_template/project.yaml +0 -0
- {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/setup.cfg +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: marvisx-cli
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.3.5
|
|
4
4
|
Summary: MarvisX OSS — agent-native company-brain CLI runtime (init, status, brief, triage)
|
|
5
5
|
Author: MarvisX maintainers
|
|
6
6
|
License: BSL-1.1
|
|
@@ -36,7 +36,6 @@ Requires-Dist: fastapi>=0.115.0
|
|
|
36
36
|
Requires-Dist: slowapi>=0.1.9
|
|
37
37
|
Requires-Dist: cachetools>=5.3.0
|
|
38
38
|
Requires-Dist: uvicorn[standard]>=0.34.0
|
|
39
|
-
Requires-Dist: uvloop>=0.21.0
|
|
40
39
|
Requires-Dist: aiosqlite>=0.20.0
|
|
41
40
|
Requires-Dist: PyJWT>=2.10.0
|
|
42
41
|
Requires-Dist: bcrypt>=4.2.0
|
|
@@ -58,9 +58,9 @@ docker compose up -d
|
|
|
58
58
|
|
|
59
59
|
The Console becomes available on the configured `CONSOLE_PORT` and the API on the configured `API_PORT`. Detailed first-run instructions are inside the deployment template.
|
|
60
60
|
|
|
61
|
-
##
|
|
61
|
+
## Setting up local embeddings
|
|
62
62
|
|
|
63
|
-
|
|
63
|
+
[`docs/MIGRATION-TO-LOCAL-EMBEDDINGS.md`](docs/MIGRATION-TO-LOCAL-EMBEDDINGS.md) covers the step-by-step path to the self-hosted Granite backend, including first-boot setup, re-indexing an existing corpus, and KG threshold recalibration.
|
|
64
64
|
|
|
65
65
|
## MCP surface
|
|
66
66
|
|
|
@@ -74,14 +74,14 @@ The MCP server runs in-process: it calls the same use_cases the HTTP API calls,
|
|
|
74
74
|
|
|
75
75
|
Audit is still recorded: the extracted use_cases write the audit log themselves (`core/api/use_cases/{tasks,pull_requests,audit}.py`), so a mutation issued through MCP still produces an audit row at the use_case level. What is lost is only the additional HTTP-surface chokepoint.
|
|
76
76
|
|
|
77
|
-
Setting `MARVIS_OSS_LOCAL=1` (truthy: `1`/`true`/`yes`/`on`) makes the `block-db-direct-write` safety rule **advisory** — direct writes to a
|
|
77
|
+
Setting `MARVIS_OSS_LOCAL=1` (truthy: `1`/`true`/`yes`/`on`) makes the `block-db-direct-write` safety rule **advisory** — direct writes to a Marvis SQLite database are allowed with a warning instead of being blocked. When the variable is unset or falsey the rule is unchanged: direct DB writes are blocked fail-closed, exactly as in the managed deployment. This trade-off is intentional for single-user self-hosting and never weakens the default.
|
|
78
78
|
|
|
79
79
|
**No-fork guarantee.** The HTTP API and the MCP server are not two implementations: both are thin adapters over the same `core/api/use_cases`, differing only in how they fill the per-call `CallerContext`. The proof is the API test suite staying green after the extraction — the same behaviour, exercised through the HTTP surface, over the identical use_cases the MCP server calls.
|
|
80
80
|
|
|
81
81
|
## Documentation
|
|
82
82
|
|
|
83
83
|
- [`docs/SEARCH-QUALITY.md`](docs/SEARCH-QUALITY.md) — search quality expectations, affected workflows, and mitigations
|
|
84
|
-
- [`docs/MIGRATION-
|
|
84
|
+
- [`docs/MIGRATION-TO-LOCAL-EMBEDDINGS.md`](docs/MIGRATION-TO-LOCAL-EMBEDDINGS.md) — setting up the self-hosted Granite embedding backend
|
|
85
85
|
- [`docs/solutions/architecture-patterns/`](docs/solutions/architecture-patterns/) — architectural decision records
|
|
86
86
|
|
|
87
87
|
## Contributing
|
|
@@ -38,7 +38,9 @@ async def list_agent_managed_sessions() -> list[SessionInfo]:
|
|
|
38
38
|
import urllib.request
|
|
39
39
|
from core.api.config import settings as cfg
|
|
40
40
|
token = cfg.tasks_api_token if hasattr(cfg, "tasks_api_token") else os.environ.get("TASKS_API_TOKEN", "")
|
|
41
|
-
api_base = os.environ.get("
|
|
41
|
+
api_base = os.environ.get("MARVIS_INTERNAL_BASE") or os.environ.get(
|
|
42
|
+
"PIR_INTERNAL_BASE", "http://localhost:8100"
|
|
43
|
+
)
|
|
42
44
|
try:
|
|
43
45
|
req = urllib.request.Request(
|
|
44
46
|
f"{api_base}/api/v1/sessions?agent_managed=true",
|
|
@@ -40,22 +40,38 @@ class Settings(BaseSettings):
|
|
|
40
40
|
populate_by_name=True,
|
|
41
41
|
)
|
|
42
42
|
|
|
43
|
-
pir_env: str =
|
|
43
|
+
pir_env: str = Field(
|
|
44
|
+
default="development",
|
|
45
|
+
validation_alias=AliasChoices("MARVIS_ENV", "PIR_ENV"),
|
|
46
|
+
)
|
|
44
47
|
# Free-form tenant identifier. Default "core" (OSS). Deploy bundles set
|
|
45
48
|
# DEPLOY_MODE to their own tenant slug via .env; no tenant names are
|
|
46
49
|
# hard-coded in core.
|
|
47
50
|
deploy_mode: str = Field(default="core", alias="DEPLOY_MODE")
|
|
48
|
-
pir_instance: str = Field(
|
|
51
|
+
pir_instance: str = Field(
|
|
52
|
+
default="prod",
|
|
53
|
+
validation_alias=AliasChoices("MARVIS_INSTANCE", "PIR_INSTANCE"),
|
|
54
|
+
)
|
|
49
55
|
marvisx_phase: Literal["A", "B", "C", "D"] = Field(
|
|
50
56
|
default="A", alias="MARVISX_PHASE"
|
|
51
57
|
)
|
|
52
|
-
pir_canary_banner: bool = Field(
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
58
|
+
pir_canary_banner: bool = Field(
|
|
59
|
+
default=False,
|
|
60
|
+
validation_alias=AliasChoices("MARVIS_CANARY_BANNER", "PIR_CANARY_BANNER"),
|
|
61
|
+
)
|
|
62
|
+
pir_jwt_secret: str = Field(
|
|
63
|
+
default="dev-secret-change-in-production",
|
|
64
|
+
validation_alias=AliasChoices("MARVIS_JWT_SECRET", "PIR_JWT_SECRET"),
|
|
65
|
+
)
|
|
66
|
+
pir_admin_password_hash: str = Field(
|
|
67
|
+
default="",
|
|
68
|
+
validation_alias=AliasChoices(
|
|
69
|
+
"MARVIS_ADMIN_PASSWORD_HASH", "PIR_ADMIN_PASSWORD_HASH"
|
|
70
|
+
),
|
|
71
|
+
)
|
|
56
72
|
db_path: str = Field(
|
|
57
73
|
default="console.db",
|
|
58
|
-
validation_alias=AliasChoices("PIR_DB_PATH", "DB_PATH"),
|
|
74
|
+
validation_alias=AliasChoices("MARVIS_DB_PATH", "PIR_DB_PATH", "DB_PATH"),
|
|
59
75
|
)
|
|
60
76
|
cookie_domain: str | None = Field(default=None, alias="COOKIE_DOMAIN")
|
|
61
77
|
cors_origins_prod: list[str] = Field(
|
|
@@ -83,6 +99,16 @@ class Settings(BaseSettings):
|
|
|
83
99
|
brain_run_off_peak_only: bool = Field(
|
|
84
100
|
default=False, alias="BRAIN_RUN_OFF_PEAK_ONLY"
|
|
85
101
|
)
|
|
102
|
+
# Warehouse consolidation pass (full-store learning dedup, ships DORMANT).
|
|
103
|
+
# Unlike memory_ops M2 (same-cycle only), this scans the WHOLE learnings
|
|
104
|
+
# warehouse and PROPOSES consolidation of cross-cycle duplicates. Default
|
|
105
|
+
# FALSE — a human enables it after reviewing. Daily cadence guard.
|
|
106
|
+
brain_warehouse_consolidation_enabled: bool = Field(
|
|
107
|
+
default=False, alias="BRAIN_WAREHOUSE_CONSOLIDATION_ENABLED"
|
|
108
|
+
)
|
|
109
|
+
brain_warehouse_consolidation_interval_seconds: int = Field(
|
|
110
|
+
default=86400, alias="BRAIN_WAREHOUSE_CONSOLIDATION_INTERVAL_SECONDS"
|
|
111
|
+
)
|
|
86
112
|
|
|
87
113
|
# GitHub Webhook
|
|
88
114
|
github_webhook_secret: str = ""
|
|
@@ -401,9 +427,6 @@ class Settings(BaseSettings):
|
|
|
401
427
|
# WIP limit: max tasks in_progress per project (doc/none tasks count as 0.5)
|
|
402
428
|
wip_max_in_progress: int = 3
|
|
403
429
|
|
|
404
|
-
# Voyage AI embeddings
|
|
405
|
-
voyage_api_key: str = ""
|
|
406
|
-
|
|
407
430
|
# sqlite-vec: env VEC0_PATH → sqlite_vec.loadable_path() → prod fallback.
|
|
408
431
|
vec0_path: str = Field(
|
|
409
432
|
default_factory=_default_vec0_path,
|
|
@@ -740,18 +740,26 @@ def _seed_users_and_migrate_owner(conn: sqlite3.Connection) -> None:
|
|
|
740
740
|
install seeds no hardcoded name. On an existing deployment this seed is
|
|
741
741
|
skipped (users already exist), so the defaults never affect a running install.
|
|
742
742
|
"""
|
|
743
|
-
# Prefer pre-hashed password
|
|
744
|
-
|
|
743
|
+
# Prefer pre-hashed password. Canonical var is MARVIS_ADMIN_PASSWORD_HASH;
|
|
744
|
+
# PIR_ADMIN_PASSWORD_HASH stays accepted as a deprecated alias.
|
|
745
|
+
hashed = (
|
|
746
|
+
os.environ.get("MARVIS_ADMIN_PASSWORD_HASH")
|
|
747
|
+
or os.environ.get("PIR_ADMIN_PASSWORD_HASH", "")
|
|
748
|
+
).strip()
|
|
745
749
|
if not hashed:
|
|
746
750
|
import bcrypt
|
|
747
751
|
|
|
748
|
-
|
|
749
|
-
|
|
752
|
+
seed_password = (
|
|
753
|
+
os.environ.get("MARVIS_PASSWORD")
|
|
754
|
+
or os.environ.get("PIR_PASSWORD", "")
|
|
755
|
+
).strip()
|
|
756
|
+
if not seed_password:
|
|
750
757
|
raise RuntimeError(
|
|
751
|
-
"Migration 016 requires
|
|
752
|
-
"to seed the admin user.
|
|
758
|
+
"Migration 016 requires MARVIS_ADMIN_PASSWORD_HASH or MARVIS_PASSWORD "
|
|
759
|
+
"env var (PIR_* aliases still accepted) to seed the admin user. "
|
|
760
|
+
"Set at least one in .env."
|
|
753
761
|
)
|
|
754
|
-
hashed = bcrypt.hashpw(
|
|
762
|
+
hashed = bcrypt.hashpw(seed_password.encode("utf-8"), bcrypt.gensalt()).decode()
|
|
755
763
|
|
|
756
764
|
admin_id = os.environ.get("MARVIS_ADMIN_USER_ID", "").strip() or "usr_admin"
|
|
757
765
|
admin_slug = os.environ.get("MARVIS_ADMIN_SLUG", "").strip() or "admin"
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# v1.18.0 - 2026-05-22 - P1.5.E1: remove PaddleOCR local (broken warm-up since 30-apr); OCR live via Mac Gateway tier-ocr
|
|
2
2
|
# v1.17.0 - 2026-04-30 - P1.5.E0: add PaddleOCR async warm + /health/ocr backend status
|
|
3
3
|
# v1.16.0 - 2026-04-17 - P2: add slowapi rate limiting middleware for /graph endpoints
|
|
4
|
-
# v1.15.0 - 2026-03-15 - Add push delivery +
|
|
4
|
+
# v1.15.0 - 2026-03-15 - Add push delivery + embedding client init in lifespan + orphan proxy cleanup
|
|
5
5
|
from __future__ import annotations
|
|
6
6
|
|
|
7
7
|
import asyncio
|
|
@@ -986,7 +986,7 @@ async def lifespan(app: FastAPI):
|
|
|
986
986
|
_pr_impact_gc_task
|
|
987
987
|
|
|
988
988
|
# Startup
|
|
989
|
-
logger.info("Starting Console
|
|
989
|
+
logger.info("Starting Console Marvis API (env=%s)", settings.pir_env)
|
|
990
990
|
run_migrations()
|
|
991
991
|
|
|
992
992
|
# Phase 1.5 D14: Phoenix client-side OTel SDK (feature flag — default OFF).
|
|
@@ -1109,13 +1109,17 @@ async def lifespan(app: FastAPI):
|
|
|
1109
1109
|
_push_delivery_task = asyncio.create_task(_periodic_push_delivery())
|
|
1110
1110
|
logger.info("Push delivery started (interval=5s)")
|
|
1111
1111
|
|
|
1112
|
-
#
|
|
1113
|
-
|
|
1112
|
+
# Embedding backend client (remote backend when present + configured,
|
|
1113
|
+
# else the in-process local engine). The operator kill-switch lives inside
|
|
1114
|
+
# the optional remote backend module, so we ask it rather than config.
|
|
1115
|
+
from core.api.services.embedding_service import init_embedding_client
|
|
1116
|
+
from core.api.services.embedding_backends import load_remote_backend
|
|
1114
1117
|
|
|
1115
|
-
|
|
1116
|
-
|
|
1118
|
+
_remote = load_remote_backend()
|
|
1119
|
+
if _remote is not None and _remote.is_disabled():
|
|
1120
|
+
logger.info("[canary] skipping remote embedding client initialization")
|
|
1117
1121
|
else:
|
|
1118
|
-
|
|
1122
|
+
init_embedding_client()
|
|
1119
1123
|
|
|
1120
1124
|
# Monitoring collectors
|
|
1121
1125
|
await metrics_collector.start()
|
|
@@ -1266,7 +1270,7 @@ async def lifespan(app: FastAPI):
|
|
|
1266
1270
|
from core.api.rate_limit import limiter # noqa: E402
|
|
1267
1271
|
|
|
1268
1272
|
app = FastAPI(
|
|
1269
|
-
title="Console
|
|
1273
|
+
title="Console Marvis API",
|
|
1270
1274
|
version="1.0.0",
|
|
1271
1275
|
docs_url="/docs" if settings.expose_openapi else None,
|
|
1272
1276
|
redoc_url="/redoc" if settings.expose_openapi else None,
|
|
@@ -1477,7 +1481,7 @@ async def _resolve_ws_user(ws: WebSocket):
|
|
|
1477
1481
|
)
|
|
1478
1482
|
return None
|
|
1479
1483
|
|
|
1480
|
-
# 2. Cookie (Console
|
|
1484
|
+
# 2. Cookie (Console Marvis web)
|
|
1481
1485
|
cookie_token = ws.cookies.get("pir_session")
|
|
1482
1486
|
if not cookie_token:
|
|
1483
1487
|
return None
|
|
@@ -70,7 +70,7 @@ LOCAL_CTX: CallerContext = CallerContext.local_single_user()
|
|
|
70
70
|
# on the running tool loop — no Node, no HTTP, no fork. The
|
|
71
71
|
# use_case calls this sync seam un-awaited (side effect),
|
|
72
72
|
# so it schedules a background task and returns immediately;
|
|
73
|
-
# the embed (incl. the slow model/
|
|
73
|
+
# the embed (incl. the slow model/remote backend call) runs OUTSIDE
|
|
74
74
|
# any write lock, then writes via the single-writer pool.
|
|
75
75
|
# No-ops gracefully when the embedder is unavailable.
|
|
76
76
|
# * mcp_requires_pr_gate -> returns False locally. The completed-PR gate (code/
|
|
@@ -136,6 +136,75 @@ def mcp_schedule_embed(
|
|
|
136
136
|
t.add_done_callback(_bg_embed_tasks.discard)
|
|
137
137
|
|
|
138
138
|
|
|
139
|
+
# Background set for the remote-backend fire-and-forget learning embeds (the local
|
|
140
|
+
# backend awaits inline instead — see below). Same GC-prevention pattern as
|
|
141
|
+
# ``_bg_embed_tasks``.
|
|
142
|
+
_bg_embed_learnings: set[asyncio.Task] = set()
|
|
143
|
+
|
|
144
|
+
|
|
145
|
+
async def mcp_embed_learning(
|
|
146
|
+
*,
|
|
147
|
+
learning_id: str,
|
|
148
|
+
title: str,
|
|
149
|
+
description: str,
|
|
150
|
+
category: str,
|
|
151
|
+
severity: str,
|
|
152
|
+
prevention: str | None = None,
|
|
153
|
+
project: str | None = None,
|
|
154
|
+
workspace_id: str,
|
|
155
|
+
) -> None:
|
|
156
|
+
"""Backend-aware embed-on-write for learnings on the local MCP surface.
|
|
157
|
+
|
|
158
|
+
The learning analogue of ``mcp_schedule_embed``, but ASYNC + backend-aware: the
|
|
159
|
+
product decision is "embed synchronously on write", and a local Granite embed
|
|
160
|
+
(sub-second) can honor it — it is awaited inline so the just-created learning is
|
|
161
|
+
immediately retrievable by meaning, not just by keyword. A rate-limited remote
|
|
162
|
+
backend (remote, 3 RPM) must not block the create -> fire-and-forget instead.
|
|
163
|
+
Either way the SHARED fastapi-free body (``embedding_service.embed_learning_document``)
|
|
164
|
+
runs the embed OUTSIDE the write lock. The caller (the ``create_learning`` tool)
|
|
165
|
+
invokes this AFTER its ``acquire_write_db`` block has released the writer lock, so
|
|
166
|
+
the inline await cannot deadlock the non-reentrant single-writer lock (learning
|
|
167
|
+
f83f5209). No-ops when the embedder is unavailable.
|
|
168
|
+
"""
|
|
169
|
+
from core.api.services import embedding_service
|
|
170
|
+
|
|
171
|
+
if not embedding_service.is_available():
|
|
172
|
+
return
|
|
173
|
+
|
|
174
|
+
async def _embed() -> None:
|
|
175
|
+
try:
|
|
176
|
+
await embedding_service.embed_learning_document(
|
|
177
|
+
learning_id=learning_id,
|
|
178
|
+
title=title,
|
|
179
|
+
description=description,
|
|
180
|
+
category=category,
|
|
181
|
+
severity=severity,
|
|
182
|
+
prevention=prevention,
|
|
183
|
+
project=project,
|
|
184
|
+
workspace_id=workspace_id,
|
|
185
|
+
)
|
|
186
|
+
except Exception:
|
|
187
|
+
logger.debug(
|
|
188
|
+
"MCP auto-embed learning %s failed (non-critical)",
|
|
189
|
+
learning_id,
|
|
190
|
+
exc_info=True,
|
|
191
|
+
)
|
|
192
|
+
|
|
193
|
+
if embedding_service.embedding_is_synchronous():
|
|
194
|
+
# Local Granite: await inline -> synchronous, immediately retrievable.
|
|
195
|
+
await _embed()
|
|
196
|
+
return
|
|
197
|
+
|
|
198
|
+
# Remote / rate-limited backend: fire-and-forget so the create never blocks.
|
|
199
|
+
try:
|
|
200
|
+
t = asyncio.create_task(_embed())
|
|
201
|
+
except RuntimeError:
|
|
202
|
+
logger.debug("MCP auto-embed learning skipped: no running event loop")
|
|
203
|
+
return
|
|
204
|
+
_bg_embed_learnings.add(t)
|
|
205
|
+
t.add_done_callback(_bg_embed_learnings.discard)
|
|
206
|
+
|
|
207
|
+
|
|
139
208
|
def mcp_requires_pr_gate(_project: str | None) -> bool:
|
|
140
209
|
"""Local PR-gate seam: governance gate collapses in single-user OSS (S1 §AUTH)."""
|
|
141
210
|
return False
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# v1.0.0 - 2026-05-27 - S1 F3.0: Python MCP server skeleton (FastMCP, stdio, use_cases-direct)
|
|
2
2
|
"""Python MCP server — the payoff of the S1 "collapse runtime" refactor.
|
|
3
3
|
|
|
4
|
-
A single ``FastMCP("
|
|
4
|
+
A single ``FastMCP("marvis")`` instance exposes the Marvis tools, each calling the
|
|
5
5
|
``use_cases`` layer DIRECTLY (no Node, no HTTP, no uvicorn). Claude Code launches
|
|
6
6
|
this as a stdio subprocess exactly as it does the Node ``index.mjs`` today:
|
|
7
7
|
|
|
@@ -34,7 +34,7 @@ from core.api.mcp.tools import register_all
|
|
|
34
34
|
# `app.state` equivalent for a server with no FastAPI `app`). Tools register on
|
|
35
35
|
# this at import time so `from core.api.mcp.server import mcp` already carries the
|
|
36
36
|
# full tool set — the smoke test introspects it without launching stdio.
|
|
37
|
-
mcp = FastMCP("
|
|
37
|
+
mcp = FastMCP("marvis")
|
|
38
38
|
|
|
39
39
|
register_all(mcp)
|
|
40
40
|
|
|
@@ -47,11 +47,35 @@ def main() -> None:
|
|
|
47
47
|
``graph_*`` reach the SAME SQLite file the ``marvis`` CLI uses (instead of the
|
|
48
48
|
bare ``db_path='console.db'`` default). Best-effort: no settings file → the
|
|
49
49
|
API defaults / ``$PIR_DB_PATH`` env stand (parity with the CLI runtime).
|
|
50
|
+
|
|
51
|
+
Then open the DB the SAME way the FastAPI lifespan does — ``init_pool()``
|
|
52
|
+
creates the read-only pool AND the single dedicated writer. This is NOT
|
|
53
|
+
optional for write tools: ``acquire_db()`` has a no-pool fallback (so reads
|
|
54
|
+
answer even if the pool is absent), but ``acquire_write_db()`` raises
|
|
55
|
+
``"DB not initialized — call init_pool() first"`` when the writer is None.
|
|
56
|
+
Without this, every mutator (``create_task``, ``update_task``, ...) failed —
|
|
57
|
+
the agent could read the brain via MCP but never write it back.
|
|
58
|
+
|
|
59
|
+
init + serve + close run in ONE event loop: aiosqlite connections are bound
|
|
60
|
+
to the running loop, so opening the pool in a separate ``asyncio.run()`` pass
|
|
61
|
+
before ``mcp.run()`` would leave the writer attached to an already-closed loop.
|
|
50
62
|
"""
|
|
63
|
+
import asyncio
|
|
64
|
+
|
|
65
|
+
from core.api.config import settings
|
|
66
|
+
from core.api.db import close_pool, init_pool
|
|
51
67
|
from core.api.runtime_settings import apply_marvis_settings
|
|
52
68
|
|
|
53
69
|
apply_marvis_settings()
|
|
54
|
-
|
|
70
|
+
|
|
71
|
+
async def _serve() -> None:
|
|
72
|
+
await init_pool(size=settings.db_pool_size)
|
|
73
|
+
try:
|
|
74
|
+
await mcp.run_stdio_async()
|
|
75
|
+
finally:
|
|
76
|
+
await close_pool()
|
|
77
|
+
|
|
78
|
+
asyncio.run(_serve())
|
|
55
79
|
|
|
56
80
|
|
|
57
81
|
if __name__ == "__main__":
|
|
@@ -35,6 +35,7 @@ from . import (
|
|
|
35
35
|
safety,
|
|
36
36
|
search,
|
|
37
37
|
tasks,
|
|
38
|
+
workflows,
|
|
38
39
|
)
|
|
39
40
|
|
|
40
41
|
#: Ordered registration callables. ``server.py`` iterates this so adding a new
|
|
@@ -50,6 +51,7 @@ REGISTRARS = (
|
|
|
50
51
|
ingest.register,
|
|
51
52
|
pull_requests.register,
|
|
52
53
|
safety.register,
|
|
54
|
+
workflows.register,
|
|
53
55
|
)
|
|
54
56
|
|
|
55
57
|
|
|
@@ -391,7 +391,7 @@ def register(mcp) -> None:
|
|
|
391
391
|
) -> dict[str, Any]:
|
|
392
392
|
"""Get apply GUIDANCE for an approved memory operation (NO write — sub-03 §11.1).
|
|
393
393
|
|
|
394
|
-
QUANDO USARLO: dopo aver `approved` un'operazione (via brain_memory_operations_patch), per ottenere `next_action.tool` (es.
|
|
394
|
+
QUANDO USARLO: dopo aver `approved` un'operazione (via brain_memory_operations_patch), per ottenere `next_action.tool` (es. mcp__marvis__create_task) + args + `must_include_in_tags` (es. `brain_memory_op:abc123`). L'apply NON scrive l'artifact — ritorna istruzioni. L'agente esegue il `next_action.tool` con i tag richiesti per stabilire la chain di audit.
|
|
395
395
|
QUANDO NON USARLO: per scrivere direttamente l'artifact — questo endpoint ritorna SOLO guidance. Pattern: PATCH → apply (guidance) → call next_action.tool con must_include_in_tags. Non usarlo prima di approval_state='approved' (409 precondition).
|
|
396
396
|
RESTITUISCE: {operation_id, next_action:{tool, args, must_include_in_tags}, operation_summary}."""
|
|
397
397
|
# GUIDANCE-only: the use_case calls get_apply_guidance (READ-only precondition
|
|
@@ -535,8 +535,8 @@ def register(mcp) -> None:
|
|
|
535
535
|
) -> dict[str, Any]:
|
|
536
536
|
"""Get apply GUIDANCE for an approved finding (NO write — sub-04 F1).
|
|
537
537
|
|
|
538
|
-
QUANDO USARLO: dopo aver `approved` una finding, per ottenere `next_action.tool` (es.
|
|
539
|
-
QUANDO NON USARLO: per scrivere artifact direttamente — pattern e' GUIDANCE-only. Non usarlo prima di approval_state='approved' (409). Non chiamarlo in loop 'ricomputa finche' la finding X appare': se non emerge, e' un problema del producer rule — file un learning via
|
|
538
|
+
QUANDO USARLO: dopo aver `approved` una finding, per ottenere `next_action.tool` (es. mcp__marvis__create_task con title/description/tags pre-compilato) + `must_include_in_tags=brain_finding:{id}` per audit chain. L'apply NON scrive l'artifact — ritorna istruzioni. L'agente esegue il next_action.tool con i tag richiesti.
|
|
539
|
+
QUANDO NON USARLO: per scrivere artifact direttamente — pattern e' GUIDANCE-only. Non usarlo prima di approval_state='approved' (409). Non chiamarlo in loop 'ricomputa finche' la finding X appare': se non emerge, e' un problema del producer rule — file un learning via mcp__marvis__create_learning.
|
|
540
540
|
RESTITUISCE: {operation_id (=finding_id), next_action:{tool, args, must_include_in_tags}, operation_summary}."""
|
|
541
541
|
# GUIDANCE-only: the use_case calls get_apply_guidance (READ-only precondition
|
|
542
542
|
# + next-action envelope). No write transaction, no mutation — preserved.
|
|
@@ -588,7 +588,7 @@ def register(mcp) -> None:
|
|
|
588
588
|
async def brain_capabilities() -> dict[str, Any]:
|
|
589
589
|
"""Discover Brain schema metadata (enums + glyphs + node kinds) — sub-05 OD-11.
|
|
590
590
|
|
|
591
|
-
QUANDO USARLO: cold-start dell'agente — leggere i Literal enum esposti dal Brain (event_types, signal_types, knowledge_forms, operation_types, finding_types, severities, confidence_tiers, drift_axes, approval_states, signal_states, run_statuses, closure_condition_kinds, knowledge_glyphs). Pattern equivalente di
|
|
591
|
+
QUANDO USARLO: cold-start dell'agente — leggere i Literal enum esposti dal Brain (event_types, signal_types, knowledge_forms, operation_types, finding_types, severities, confidence_tiers, drift_axes, approval_states, signal_states, run_statuses, closure_condition_kinds, knowledge_glyphs). Pattern equivalente di mcp__marvis__graph_capabilities. Evita hardcoding constants. Schema_version aumenta quando i Literal cambiano.
|
|
592
592
|
QUANDO NON USARLO: per dati live del ciclo — usa brain_runs/brain_events/etc. Non e' un health check.
|
|
593
593
|
RESTITUISCE: {schema_version, event_types[], source_systems[], signal_types[], knowledge_forms[], operation_types[], finding_types[], severities[], confidence_tiers[], drift_axes[], approval_states[], finding_approval_states[], signal_states[], run_statuses[], run_triggers[], scope_types[], suggested_artifacts[], closure_condition_kinds[], knowledge_glyphs:{form: glyph}}."""
|
|
594
594
|
# Deterministic; no DB. The use_case takes only ctx.
|
|
@@ -22,7 +22,14 @@ from typing import Annotated, Any, Literal
|
|
|
22
22
|
|
|
23
23
|
from pydantic import Field
|
|
24
24
|
|
|
25
|
-
from core.api.mcp._adapter import
|
|
25
|
+
from core.api.mcp._adapter import (
|
|
26
|
+
LOCAL_CTX,
|
|
27
|
+
acquire_db,
|
|
28
|
+
acquire_write_db,
|
|
29
|
+
dump,
|
|
30
|
+
mcp_embed_learning,
|
|
31
|
+
raise_mcp_error,
|
|
32
|
+
)
|
|
26
33
|
from core.api.use_cases import learnings as learnings_uc
|
|
27
34
|
from core.api.use_cases._errors import ServiceError
|
|
28
35
|
|
|
@@ -85,7 +92,20 @@ def register(mcp) -> None:
|
|
|
85
92
|
tags=tags,
|
|
86
93
|
project=project,
|
|
87
94
|
)
|
|
88
|
-
|
|
95
|
+
# Writer lock released: embed-on-write. On a local Granite backend this
|
|
96
|
+
# awaits inline (synchronous) so the learning is immediately retrievable by
|
|
97
|
+
# meaning — not just by keyword until a manual reindex (the bug this fixes).
|
|
98
|
+
await mcp_embed_learning(
|
|
99
|
+
learning_id=result.id,
|
|
100
|
+
title=result.title,
|
|
101
|
+
description=result.description,
|
|
102
|
+
category=result.category,
|
|
103
|
+
severity=result.severity,
|
|
104
|
+
prevention=result.prevention,
|
|
105
|
+
project=result.project,
|
|
106
|
+
workspace_id=LOCAL_CTX.workspace_id,
|
|
107
|
+
)
|
|
108
|
+
return dump(result)
|
|
89
109
|
except ServiceError as e:
|
|
90
110
|
raise_mcp_error(e)
|
|
91
111
|
|
|
@@ -142,3 +162,21 @@ def register(mcp) -> None:
|
|
|
142
162
|
return dump(result)
|
|
143
163
|
except ServiceError as e:
|
|
144
164
|
raise_mcp_error(e)
|
|
165
|
+
|
|
166
|
+
@mcp.tool()
|
|
167
|
+
async def delete_learning(
|
|
168
|
+
learning_id: Annotated[str, Field(min_length=1)],
|
|
169
|
+
) -> dict[str, Any]:
|
|
170
|
+
"""Permanently remove a learning from the Marvis DB (non-recoverable) + prune the search index.
|
|
171
|
+
|
|
172
|
+
QUANDO USARLO: solo per learning duplicati, spam, o entry chiaramente invalide. Hard delete: rimuove anche il mirror nell'indice di ricerca (documents + vec_documents + FTS) cosi' il learning smette di comparire in search/check_learnings.
|
|
173
|
+
QUANDO NON USARLO: NOT per archiviare un learning ancora valido — la cancellazione e' permanente e perde la history. Aggiornalo con update_learning se il contenuto e' obsoleto.
|
|
174
|
+
RESTITUISCE: {deleted: true} o 404 se non esiste."""
|
|
175
|
+
try:
|
|
176
|
+
async with acquire_write_db(label="mcp.delete_learning") as db:
|
|
177
|
+
await learnings_uc.delete_learning(
|
|
178
|
+
LOCAL_CTX, db, learning_id=learning_id
|
|
179
|
+
)
|
|
180
|
+
return {"deleted": True}
|
|
181
|
+
except ServiceError as e:
|
|
182
|
+
raise_mcp_error(e)
|
|
@@ -39,7 +39,7 @@ def register(mcp) -> None:
|
|
|
39
39
|
|
|
40
40
|
@mcp.tool()
|
|
41
41
|
async def list_projects() -> list[dict[str, Any]]:
|
|
42
|
-
"""List all
|
|
42
|
+
"""List all Marvis-tracked projects grouped by program.
|
|
43
43
|
|
|
44
44
|
QUANDO USARLO: serve un inventario (quali progetti ci sono, dammi tutti gli slug) o non conosci lo slug target.
|
|
45
45
|
QUANDO NON USARLO: NOT quando hai gia' uno slug specifico e vuoi i dettagli -> usa get_project. NOT per cold-start di un progetto -> usa session_brief.
|
|
@@ -79,7 +79,7 @@ def register(mcp) -> None:
|
|
|
79
79
|
) -> dict[str, Any]:
|
|
80
80
|
"""Atomic create branch + worktree + draft PR (orchestrator-managed).
|
|
81
81
|
|
|
82
|
-
QUANDO USARLO: hai un task approved/in_progress e ti serve un worktree isolato per iniziare a lavorare. Un'unica call crea branch `feat/task-{uuid}`, worktree in `~/dev/task-{uuid}`, e draft PR row in
|
|
82
|
+
QUANDO USARLO: hai un task approved/in_progress e ti serve un worktree isolato per iniziare a lavorare. Un'unica call crea branch `feat/task-{uuid}`, worktree in `~/dev/task-{uuid}`, e draft PR row in Marvis. Preferisci su `git worktree add` manuale + register_branch (2-step flow).
|
|
83
83
|
QUANDO NON USARLO: NOT se il worktree esiste gia' (creato manualmente o fuori orchestrator) -> usa register_branch per attaccarlo al task. NOT se il task non e' ancora approved -> il backend risponde 400.
|
|
84
84
|
RESTITUISCE: {task_id, branch_name, worktree_path, status:'draft'} idempotent."""
|
|
85
85
|
try:
|
|
@@ -97,8 +97,8 @@ def register(mcp) -> None:
|
|
|
97
97
|
) -> dict[str, Any]:
|
|
98
98
|
"""Attach an existing git branch/worktree to a task as draft PR record (idempotent).
|
|
99
99
|
|
|
100
|
-
QUANDO USARLO: il worktree e' stato creato manualmente via `git worktree add` o fuori orchestrator, e serve la PR row
|
|
101
|
-
QUANDO NON USARLO: NOT quando vuoi che
|
|
100
|
+
QUANDO USARLO: il worktree e' stato creato manualmente via `git worktree add` o fuori orchestrator, e serve la PR row Marvis per poter chiamare submit_pr dopo. BOUNDARY: register_branch crea draft; submit_pr promuove draft -> open per review.
|
|
101
|
+
QUANDO NON USARLO: NOT quando vuoi che Marvis crei il worktree per te -> usa endpoint HTTP /api/v1/pull_requests/{task_id}/branch. NOT dopo submit -> il record e' gia' open.
|
|
102
102
|
RESTITUISCE: {task_id, branch_name, worktree_path, status:'draft'} idempotent."""
|
|
103
103
|
try:
|
|
104
104
|
async with acquire_write_db() as db:
|
|
@@ -5,7 +5,7 @@ The Node ``check_safety`` SHELLS ``python3 scripts/safety_bridge.py check
|
|
|
5
5
|
--action-type <t> [--file-path ...] [--command ...] [--cwd ...]`` and parses the
|
|
6
6
|
``{allowed, reason, rule}`` JSON it prints. ``core/scripts/safety_bridge.py`` is
|
|
7
7
|
pure stdlib (``argparse`` / ``json`` / ``re`` / ``shlex`` / ``subprocess`` for the
|
|
8
|
-
git/npm checks) — it has ZERO fastapi and ZERO
|
|
8
|
+
git/npm checks) — it has ZERO fastapi and ZERO Marvis-app dependency. So the in-process
|
|
9
9
|
port imports the bridge's ``evaluate_action`` (the exact function ``_run_check``
|
|
10
10
|
calls) DIRECTLY: no subprocess, no ``python3`` re-exec, no HTTP. The returned
|
|
11
11
|
``Decision`` is mapped to the SAME ``{allowed, reason, rule}`` dict shape the Node
|
|
@@ -22,7 +22,7 @@ Name mapping (Node tool name -> use_case function):
|
|
|
22
22
|
The embedding/hybrid services are pulled FUNCTION-LOCALLY by the use_case itself
|
|
23
23
|
(``hybrid_search`` / ``embedding_service``), so nothing fastapi-bound is imported
|
|
24
24
|
at module load. ``search`` raises ``ServiceUnavailableError`` (-> raise_mcp_error)
|
|
25
|
-
when
|
|
25
|
+
when the embedding backend is down — the 503 collapses to the MCP error result shape.
|
|
26
26
|
|
|
27
27
|
Return typing: ``search`` returns the ``SearchResponse`` DTO (``.model_dump()`` via
|
|
28
28
|
``dump()``); ``reindex`` returns a plain status dict.
|
|
@@ -49,11 +49,11 @@ def register(mcp) -> None:
|
|
|
49
49
|
async def search(
|
|
50
50
|
q: Annotated[str, Field(min_length=1, max_length=500)],
|
|
51
51
|
) -> dict[str, Any]:
|
|
52
|
-
"""Semantic
|
|
52
|
+
"""Semantic + hybrid search by MEANING across tasks, projects, files, handoffs, learnings, inbox, audits. Fuses the embedding retriever with the Knowledge Graph (RRF).
|
|
53
53
|
|
|
54
|
-
QUANDO USARLO:
|
|
55
|
-
QUANDO NON USARLO: NOT per
|
|
56
|
-
RESTITUISCE: {tasks[], projects[], files[], handoffs[], learnings[], total, query} ranked per (70%
|
|
54
|
+
QUANDO USARLO: PRIMA scelta per domande trasversali o concettuali ('dove abbiamo parlato di caching Redis?', 'decisioni sul rollback', 'cosa dipende da X'): trova per significato anche senza le keyword esatte. Alza il tetto: usala invece di fermarti al primo summary o a una lista filtrata. Score > 0.6 generalmente rilevante.
|
|
55
|
+
QUANDO NON USARLO: NOT per un artifact noto per ID -> usa get_task / get_handoff. NOT per un filtro esatto su un solo doc_type -> usa list_tasks / list_handoffs. NOT per keyword literal su un handoff -> usa search_handoffs.
|
|
56
|
+
RESTITUISCE: {tasks[], projects[], files[], handoffs[], learnings[], total, query} ranked per (70% similarita semantica + 30% salience) + semantic_available (bool|None) + semantic_reason (enum|None: model-not-loadable/vec0-not-loadable/runtime-gate). Se semantic_available=false la lane semantica e' giu' e i risultati sono solo keyword. 503 se il motore di embedding non e' disponibile."""
|
|
57
57
|
# The use_case takes only `ctx`: it opens its own connections from
|
|
58
58
|
# settings (db_path / vec0_path) and pulls hybrid_search / embedding_service
|
|
59
59
|
# function-locally — so the MCP path stays fastapi-free at import.
|
|
@@ -65,7 +65,7 @@ def register(mcp) -> None:
|
|
|
65
65
|
|
|
66
66
|
@mcp.tool()
|
|
67
67
|
async def reindex(type: ReindexType = "all") -> dict[str, Any]:
|
|
68
|
-
"""Rebuild
|
|
68
|
+
"""Rebuild the embeddings index for the semantic search backend.
|
|
69
69
|
|
|
70
70
|
QUANDO USARLO: solo dopo bulk ops che bypassano i normali hook (direct SQL insert, file-sync script, migration) se noti search stale. Operator+.
|
|
71
71
|
QUANDO NON USARLO: NOT routinely — l'index e' auto-sync su create/update normali. NOT su errori transient di search -> aspetta background reconcile.
|
|
@@ -137,7 +137,7 @@ def register(mcp) -> None:
|
|
|
137
137
|
delegation: TaskDelegation | None = None,
|
|
138
138
|
completion_mode: TaskCompletionMode = "pr",
|
|
139
139
|
) -> dict[str, Any]:
|
|
140
|
-
"""Persist a new cross-session task in
|
|
140
|
+
"""Persist a new cross-session task in Marvis DB (survives session end, visible in Console Triage).
|
|
141
141
|
|
|
142
142
|
QUANDO USARLO: PRIMA AZIONE per ogni lavoro implementativo (feat/fix/refactor/research) — richiesto da Constitution Rule 1 prima di qualunque Edit/Write. SEMPRE con ICE-D (impact/confidence/ease/delegation).
|
|
143
143
|
QUANDO NON USARLO: NOT per modificare un task esistente -> usa update_task. NOT per free chat/brainstorm (session-first).
|
|
@@ -189,7 +189,7 @@ def register(mcp) -> None:
|
|
|
189
189
|
delegation: TaskDelegation | None = None,
|
|
190
190
|
completion_mode: TaskCompletionMode | None = None,
|
|
191
191
|
) -> dict[str, Any]:
|
|
192
|
-
"""Mutate an existing
|
|
192
|
+
"""Mutate an existing Marvis task (status, priority, description, tags, ICE-D, completion_mode).
|
|
193
193
|
|
|
194
194
|
QUANDO USARLO: transizioni di stato lungo il lifecycle (pending -> approved -> in_progress -> review -> completed) o rifinitura scoring/description dopo creazione.
|
|
195
195
|
QUANDO NON USARLO: NOT per creare un nuovo task -> usa create_task. NOT per delete permanente -> usa delete_task. Status='approved' e' BLOCCATO per agent (403) — solo umani approvano via Console Triage.
|
|
@@ -231,7 +231,7 @@ def register(mcp) -> None:
|
|
|
231
231
|
async def delete_task(
|
|
232
232
|
task_id: Annotated[str, Field(min_length=1)],
|
|
233
233
|
) -> dict[str, Any]:
|
|
234
|
-
"""Permanently remove a task from the
|
|
234
|
+
"""Permanently remove a task from the Marvis DB (non-recoverable).
|
|
235
235
|
|
|
236
236
|
QUANDO USARLO: solo per spam/duplicate o entry chiaramente invalidi.
|
|
237
237
|
QUANDO NON USARLO: NOT per abbandonare un task valido -> usa update_task con status='rejected' o 'failed' (preserva audit trail). Deletion cancella la history.
|