marvisx-cli 0.2.3__tar.gz → 0.3.6__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.3 → marvisx_cli-0.3.6}/MANIFEST.in +1 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/PKG-INFO +2 -2
- marvisx_cli-0.3.6/README.md +122 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/agents/session_manager.py +3 -1
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/config.py +46 -18
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/db.py +15 -7
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/main.py +13 -9
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/mcp/_adapter.py +70 -1
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/mcp/server.py +2 -2
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/mcp/tools/__init__.py +2 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/mcp/tools/brain.py +4 -4
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/mcp/tools/learnings.py +93 -2
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/mcp/tools/projects.py +1 -1
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/mcp/tools/pull_requests.py +3 -3
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/mcp/tools/safety.py +1 -1
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/mcp/tools/search.py +6 -6
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/mcp/tools/tasks.py +3 -3
- marvisx_cli-0.3.6/core/api/mcp/tools/workflow_playbooks/brainstorm.md +72 -0
- marvisx_cli-0.3.6/core/api/mcp/tools/workflow_playbooks/compound.md +71 -0
- marvisx_cli-0.3.6/core/api/mcp/tools/workflow_playbooks/plan.md +69 -0
- marvisx_cli-0.3.6/core/api/mcp/tools/workflows.py +415 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/models/monitoring.py +1 -1
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/models/search.py +15 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/models/tasks.py +1 -2
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/routers/brain.py +3 -3
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/routers/graph.py +1 -1
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/routers/kg.py +1 -1
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/routers/learnings.py +102 -2
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/routers/projects.py +60 -1
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/routers/search.py +1 -1
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/routers/sessions.py +1 -1
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/runtime_settings.py +69 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/security.py +3 -3
- marvisx_cli-0.3.6/core/api/services/_fts.py +32 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/brain/findings_reader.py +2 -2
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/brain/jobs.py +167 -8
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/brain/llm/direction_alignment.py +1 -1
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/brain/memory_ops.py +4 -4
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/brain/recap.py +1 -1
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/brain/sources/__init__.py +1 -1
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/brain/sources/pir_tasks.py +1 -1
- marvisx_cli-0.3.6/core/api/services/brain/warehouse_consolidate.py +227 -0
- marvisx_cli-0.3.6/core/api/services/embedding_backends/__init__.py +31 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/embedding_internal.py +162 -6
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/embedding_service.py +474 -62
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/git_ops.py +8 -8
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/graph_service.py +4 -4
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/inbox.py +77 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/inbox_tldr.py +2 -2
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/ingest/embedding_router.py +11 -11
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/ingest/insert_saga.py +14 -4
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/ingest/llm/classification_context.py +7 -3
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/ingest/llm/openai_nano.py +7 -3
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/ingest/watcher.py +1 -1
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/kg/hybrid_search.py +38 -8
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/kg/pr_impact.py +1 -1
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/metrics_collector.py +2 -2
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/model_router.py +1 -1
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/pr_impact_pipeline/dispatcher.py +1 -1
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/tmux.py +0 -1
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/webhook_service.py +3 -3
- marvisx_cli-0.3.6/core/api/tests/test_config_env_aliases.py +75 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/tests/test_git_ops_merge.py +25 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/use_cases/brain.py +1 -1
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/use_cases/graph.py +5 -5
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/use_cases/handoffs.py +2 -2
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/use_cases/learnings.py +77 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/use_cases/search.py +95 -9
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/use_cases/tasks.py +6 -6
- marvisx_cli-0.3.6/core/cli/_brain_opportunistic.py +136 -0
- marvisx_cli-0.3.6/core/cli/_brain_schedule.py +431 -0
- marvisx_cli-0.3.6/core/cli/_update_check.py +164 -0
- marvisx_cli-0.3.6/core/cli/marvis_brain.py +200 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/cli/marvis_doctor.py +222 -1
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/cli/marvis_feedback.py +4 -5
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/cli/marvis_governance.py +2 -2
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/cli/marvis_init.py +184 -10
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/cli/marvis_mcp.py +89 -47
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/cli/marvis_telemetry.py +3 -8
- marvisx_cli-0.3.6/core/platform/__init__.py +177 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/scripts/_drift_check.py +3 -3
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/scripts/install_hooks/safety_bridge.py +14 -14
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/scripts/populate_artifacts.py +1 -1
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/scripts/populate_cross_project.py +9 -6
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/scripts/safety_bridge.py +14 -14
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/telemetry/schema.py +1 -1
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/wizard/byok_vault.py +5 -8
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/wizard/defaults.py +7 -14
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/marvisx_cli.egg-info/PKG-INFO +2 -2
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/marvisx_cli.egg-info/SOURCES.txt +13 -1
- marvisx_cli-0.3.6/marvisx_cli.egg-info/entry_points.txt +3 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/marvisx_cli.egg-info/requires.txt +1 -1
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/078_kg_fts5.sql +1 -1
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/095_kg_intent_first.sql +1 -1
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/pyproject.toml +20 -5
- marvisx_cli-0.2.3/README.md +0 -95
- marvisx_cli-0.2.3/core/api/services/ingest/retry_voyage.py +0 -88
- marvisx_cli-0.2.3/marvisx_cli.egg-info/entry_points.txt +0 -3
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/LICENSE +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/__init__.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/agents/__init__.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/agents/session_health.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/bin/marvisx-state-hook.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/dependencies/__init__.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/dependencies/tenant.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/mcp/__init__.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/mcp/tools/graph.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/mcp/tools/handoffs.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/mcp/tools/ingest.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/middleware/__init__.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/middleware/tool_call_audit.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/models/__init__.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/models/auth.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/models/brain.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/models/common.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/models/costs.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/models/graph.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/models/graph_cosmo.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/models/graph_pr_impact.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/models/graph_ux.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/models/inbox.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/models/ingest_keys.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/models/kg.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/models/llm_config.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/models/projects.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/models/sessions.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/models/teams.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/models/users.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/observability/__init__.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/observability/tracing.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/paths.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/rate_limit.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/rbac.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/routers/__init__.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/routers/_adapter.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/routers/admin_pr_impact.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/routers/admin_settings.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/routers/agent.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/routers/agent_tokens.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/routers/app_settings.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/routers/audit.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/routers/auth.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/routers/bench.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/routers/brain_directions.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/routers/ci_checks.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/routers/comments.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/routers/costs.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/routers/docs_coverage.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/routers/docs_governance.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/routers/documents.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/routers/files.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/routers/finder.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/routers/handoffs.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/routers/inbox.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/routers/ingest_api_keys.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/routers/ingest_triage.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/routers/judge.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/routers/llm_config.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/routers/monitoring.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/routers/notifications.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/routers/pr_impact.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/routers/pull_requests.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/routers/push.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/routers/raci.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/routers/settings.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/routers/share_repo.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/routers/status_updates.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/routers/tags.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/routers/tasks.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/routers/teams.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/routers/terminal.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/routers/users.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/routers/webhooks.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/__init__.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/audit.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/auto_approval.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/brain/__init__.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/brain/baseline.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/brain/capabilities.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/brain/cascade_rollup.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/brain/compound_bridge.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/brain/cycle.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/brain/cycle_snapshot.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/brain/digest_collector.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/brain/direction.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/brain/drift.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/brain/drift_router.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/brain/edge_metrics.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/brain/events_reader.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/brain/findings.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/brain/journal.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/brain/knowledge_forms.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/brain/llm/__init__.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/brain/llm/_runner.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/brain/llm/base.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/brain/llm/cache.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/brain/llm/constants.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/brain/llm/factory.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/brain/llm/finding_reasoning.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/brain/llm/finding_summary.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/brain/llm/grounding.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/brain/llm/journal_polish.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/brain/llm/local_gateway.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/brain/llm/parsers.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/brain/llm/router_glue.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/brain/models.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/brain/owner_hint.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/brain/rules/__init__.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/brain/rules/_signals.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/brain/rules/dr1_activity_without_status.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/brain/rules/dr2_decision_without_adr.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/brain/rules/dr3_stale_open_loop.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/brain/rules/dr4_docs_governance_drift.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/brain/rules/dr5_playbook_changed.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/brain/rules/dr6_external_update_unpropagated.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/brain/rules/dr7_claimed_decision_gap.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/brain/rules/dr8_direction_misalignment.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/brain/runs_reader.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/brain/scope.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/brain/sources/base.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/brain/sources/git_kg.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/brain/sources/handoffs.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/brain/sources/ingestor.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/brain/sources/learnings.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/brain/watermarks.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/brain/ws_emitter.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/cc_tasks_reader.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/ci_service.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/claude_metrics.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/codex_metrics.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/conversation_reader.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/cost_service.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/crypto.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/docs_governance/__init__.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/docs_governance/confidence.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/docs_governance/config.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/docs_governance/enrichment.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/docs_governance/frontmatter_validator.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/docs_governance/hard_gates.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/docs_governance/triage_orchestrator.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/event_dispatcher.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/events.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/graph_cosmo_service.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/graph_ranker.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/inbox_digest.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/inbox_digest_deep_research.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/inbox_digest_jobs.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/inbox_gmail_sync.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/inbox_llm_classifier.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/inbox_source_identity.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/inbox_sources.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/inbox_taxonomy.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/inbox_triage.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/ingest/__init__.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/ingest/api_key_auth.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/ingest/auto_approve.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/ingest/classifier.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/ingest/confidence.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/ingest/dispatch.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/ingest/events.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/ingest/ignore_patterns.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/ingest/image_probe.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/ingest/ingress.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/ingest/llm/__init__.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/ingest/llm/anthropic_haiku.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/ingest/llm/base.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/ingest/llm/byok_provider.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/ingest/llm/config_store.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/ingest/llm/factory.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/ingest/llm/kg_enricher.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/ingest/llm/local_gateway.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/ingest/llm/local_vllm.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/ingest/lock_advisory.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/ingest/parser_router.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/ingest/parsers/__init__.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/ingest/parsers/docling_parser.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/ingest/parsers/docparse_gateway.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/ingest/parsers/docx_parser.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/ingest/parsers/folder_unpacker.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/ingest/parsers/gateway_aux.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/ingest/parsers/image_parser.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/ingest/parsers/internal_markdown.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/ingest/parsers/ocr_gateway.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/ingest/parsers/ocr_pdf_parser.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/ingest/parsers/pdf_types.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/ingest/parsers/transcript_parser.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/ingest/parsers/vision_gateway.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/ingest/parsers/xlsx_parser.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/ingest/parsers/zip_unpacker.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/ingest/preflight.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/ingest/routing_policy.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/ingest/serializers/__init__.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/ingest/serializers/xlsx_to_markdown.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/ingest/skip_log.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/kg/__init__.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/kg/audit.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/kg/lens.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/kg/queries.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/kg/ranking.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/kg/rrf.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/kg_watcher_control.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/local_llm/__init__.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/local_llm/async_client.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/local_llm/client.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/local_llm/url_validator.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/metrics_providers.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/model_registry.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/n8n_client.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/newsletter_llm_gateway.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/notification_service.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/openai_responses.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/opencode_metrics.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/opencode_sessions.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/pii_redactor.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/pr_impact_pipeline/__init__.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/pr_impact_pipeline/differ.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/pr_impact_pipeline/gc.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/pr_impact_pipeline/languages.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/pr_impact_pipeline/parser.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/pr_impact_pipeline/writer.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/pr_service.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/project_paths.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/project_status_updates.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/providers.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/push_service.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/reminder_service.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/runas.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/salience_service.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/security_collector.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/session_catalog.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/session_metrics_service.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/session_ops.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/session_state.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/share_links.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/task_transitions.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/terminal_metrics.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/terminal_metrics_dump.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/workspace_sync.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/templates/__init__.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/templates/markdown_share.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/terminal.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/tests/__init__.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/tests/test_agent_facing_auth_dependencies.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/tests/test_audit_permissions.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/tests/test_backfill_session_conversations.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/tests/test_backfill_working_seconds_msg.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/tests/test_claude_metrics.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/tests/test_codex_metrics.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/tests/test_finder_paths.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/tests/test_learnings_check_search.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/tests/test_metrics_providers.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/tests/test_migration_087.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/tests/test_migration_088.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/tests/test_migration_089.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/tests/test_openai_responses.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/tests/test_opencode_metrics.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/tests/test_opencode_sessions.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/tests/test_pr_workflow_e2e.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/tests/test_projects_handoffs.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/tests/test_providers.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/tests/test_require_scope_empty_deny.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/tests/test_safety_bridge.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/tests/test_session_catalog.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/tests/test_session_conversations.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/tests/test_session_metrics_service.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/tests/test_session_resume_paths.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/tests/test_session_theme_mode_migration.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/tests/test_sessions_rbac.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/tests/test_share_edit.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/tests/test_share_repo.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/tests/test_terminal_session_manager.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/tests/test_terminal_upload.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/tests/test_tmux.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/tests/test_workspace_sync.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/tests/test_ws_ticket_in_memory.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/use_cases/__init__.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/use_cases/_context.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/use_cases/_errors.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/use_cases/_roles.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/use_cases/audit.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/use_cases/costs.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/use_cases/ingest_triage.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/use_cases/projects.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/use_cases/pull_requests.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/visibility.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/cli/README.md +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/cli/__init__.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/cli/_index_source.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/cli/_runtime_ctx.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/cli/_transmute.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/cli/marvis_account.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/cli/marvis_hooks.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/cli/marvis_runtime.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/scripts/_frontmatter.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/scripts/_graph_writer.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/scripts/ast_parser.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/scripts/install_hooks/__init__.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/scripts/install_hooks/_config.sh +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/scripts/install_hooks/block-dangerous-bash.sh +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/scripts/install_hooks/block-db-direct-write.sh +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/scripts/install_hooks/block-push-no-task.sh +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/scripts/install_hooks/block-staging-to-prod.sh +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/scripts/install_hooks/block-subtree-push.sh +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/scripts/install_hooks/config.json +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/scripts/install_hooks/enforce-no-merge-main.sh +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/scripts/install_hooks/enforce-worktree.sh +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/scripts/install_hooks/quality-gate.sh +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/scripts/install_hooks/secret-scan.sh +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/scripts/migrate_spike_node_ids.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/scripts/populate_inbox_nodes.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/scripts/populate_pr_impact.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/scripts/populate_project_nodes.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/scripts/populate_touch_counter.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/scripts/reparse_failed.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/telemetry/__init__.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/telemetry/client.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/telemetry/entitlements.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/telemetry/rollup.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/telemetry/sender.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/wizard/__init__.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/wizard/state.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/wizard/steps.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/wizard/validation.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/marvisx_cli.egg-info/dependency_links.txt +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/marvisx_cli.egg-info/top_level.txt +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/001_initial.sql +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/002_tasks.sql +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/003_session_management.sql +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/004_projects_comments.sql +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/005_session_intelligence.sql +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/006_settings.sql +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/007_task_scoring.sql +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/008_cost_tracking.sql +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/009_session_card_metrics.sql +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/010_monitoring.sql +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/012_agent_api.sql +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/013_session_complete.sql +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/015_pull_requests.sql +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/015_pull_requests_down.sql +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/016_users_raci.sql +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/017_task_cost_entries.sql +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/018_agents.sql +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/018_agents_down.sql +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/019_review_feedback.sql +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/020_pr_commit_sha.sql +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/021_webhook_events.sql +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/022_devx_agent_managed.sql +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/022_devx_agent_managed_down.sql +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/023_devx_p1_gate.sql +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/023_devx_p1_gate_down.sql +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/024_chat_messages.sql +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/024_pr_conversation_id.sql +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/024_task_indexes.sql +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/024_task_indexes_down.sql +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/025_audit_log.sql +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/026_agent_tokens.sql +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/027_teams_auth_phase_b.sql +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/028_learnings.sql +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/029_team_roles.sql +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/030_finder_pins.sql +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/031_pr_deploy_status.sql +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/032_task_reminders.sql +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/033_events_retry_count.sql +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/033_session_owner.sql +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/034_notifications.sql +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/035_shared_links.sql +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/036_session_index_upgrade.sql +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/037_pr_approval.sql +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/038_pr_submitted_by.sql +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/039_push_subscriptions.sql +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/040_semantic_search.sql +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/041_workspaces.sql +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/042_oidc_providers.sql +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/043_ci_checks.sql +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/044_agent_metrics.sql +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/045_documents_doc_type.sql +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/046_salience.sql +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/047_seed_missing_agents.sql +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/048_fix_agent_paths_roles.sql +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/049_agent_role_and_learnings_schema.sql +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/050_session_provider.sql +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/051_session_launch_profile.sql +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/052_session_theme_mode.sql +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/052_task_kind.sql +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/053_inbox_items.sql +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/054_inbox_triage_contract.sql +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/055_inbox_topic_treatment.sql +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/056_inbox_treatment_read_save.sql +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/057_session_theme_mode_backfill.sql +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/058_inbox_item_status_lifecycle.sql +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/059_inbox_tldr_and_source_scores.sql +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/060_newsletter.sql +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/061_inbox_redesign.sql +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/062_fix_inbox_sources_backfill.sql +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/063_task_completion_mode.sql +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/064_judge_mode_setting.sql +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/065_knowledge_graph_spike.sql +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/066_digest_ranking_inputs.sql +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/066_kg_artifact_nodes.sql +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/067_inbox_digest_selections.sql +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/067_kg_temporal.sql +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/068_inbox_digest_app_settings.sql +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/068_kg_touch_counter.sql +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/069_kg_doc_types.sql +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/070_digest_ranking_inputs_recovery.sql +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/071_inbox_digest_selections_recovery.sql +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/072_inbox_digest_app_settings_recovery.sql +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/073_kg_cross_project.sql +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/073_kg_cross_project_down.sql +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/074_kg_infra_types.sql +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/074_kg_infra_types_down.sql +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/075_kg_file_state_recovery.sql +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/075_kg_file_state_recovery_down.sql +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/076_kg_watcher_state.sql +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/076_kg_watcher_state_down.sql +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/077_kg_doc_types_extend.sql +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/077_kg_doc_types_extend_down.sql +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/078_kg_fts5_down.sql +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/079_kg_missing_indexes.sql +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/079_kg_missing_indexes_down.sql +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/080_kg_fts5_extended.sql +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/080_kg_fts5_extended_down.sql +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/081_kg_lens_indexes.sql +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/081_kg_lens_indexes_down.sql +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/082_kg_pins.sql +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/082_kg_pins_down.sql +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/083_kg_graph_nodes_degree.sql +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/083_kg_graph_nodes_degree_down.sql +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/084_drop_legacy_scheduler_tables.sql +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/084_drop_legacy_scheduler_tables_down.sql +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/085_kg_edge_resolves_to.sql +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/085_kg_edge_resolves_to_down.sql +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/086_project_status_updates_feed.sql +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/086_project_status_updates_feed_down.sql +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/087_session_metrics_dual.sql +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/087_session_metrics_dual_down.sql +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/088_rename_context_pct_legacy.sql +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/088_rename_context_pct_legacy_down.sql +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/089_session_metrics_equivalent_cost.sql +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/089_session_metrics_equivalent_cost_down.sql +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/090_kg_inbox_node_type.sql +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/090_kg_inbox_node_type_down.sql +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/091_kg_inbox_node_type_check.sql +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/091_kg_inbox_node_type_check_down.sql +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/092_sessions_activity_state_ts.sql +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/092_sessions_activity_state_ts_down.sql +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/093_sessions_activity_state_column.sql +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/093_sessions_activity_state_column_down.sql +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/094_ingest_pending.sql +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/094_ingest_pending_down.sql +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/095_kg_intent_first_down.sql +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/096_kg_xlsx_artifact_prefix.sql +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/096_kg_xlsx_artifact_prefix_down.sql +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/097_ingest_change_history.sql +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/097_ingest_change_history_down.sql +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/098_kg_node_type_business.sql +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/098_kg_node_type_business_down.sql +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/099_kg_edges_restore_weight.sql +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/099_kg_edges_restore_weight_down.sql +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/100_kg_enriched_at.sql +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/100_kg_enriched_at_down.sql +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/101_local_llm_shadow_comparisons.sql +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/101_local_llm_shadow_comparisons_down.sql +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/102_promote_llm_costs.sql +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/102_promote_llm_costs_down.sql +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/103_ingest_skipped_log.sql +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/103_ingest_skipped_log_down.sql +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/120_docs_governance.sql +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/120_docs_governance_down.sql +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/121_notification_event_fk_cleanup.sql +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/121_notification_event_fk_cleanup_down.sql +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/122_docs_drift_history.sql +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/122_docs_drift_history_down.sql +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/123_ingest_parser_waiting_status.sql +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/123_ingest_parser_waiting_status_down.sql +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/124_heypocket_recordings.sql +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/124_heypocket_recordings_down.sql +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/125_kg_node_type_record.sql +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/125_kg_node_type_record_down.sql +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/126_ingest_terminal_upload_source_kind.sql +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/126_ingest_terminal_upload_source_kind_down.sql +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/127_brain_v1_substrate.sql +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/127_brain_v1_substrate_down.sql +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/128_brain_drift_signals.sql +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/128_brain_drift_signals_down.sql +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/129_brain_memory_operations.sql +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/129_brain_memory_operations_down.sql +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/130_brain_findings.sql +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/130_brain_findings_down.sql +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/132_kg_pr_modifies.sql +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/132_kg_pr_modifies_down.sql +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/133_brain_v1_2_direction_schema.sql +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/133_brain_v1_2_direction_schema_down.sql +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/134_brain_journal_narrative_polished.sql +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/134_brain_journal_narrative_polished_down.sql +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/135_kg_edges_provider.sql +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/136_documents_fts.sql +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/137_promote_llm_costs.sql +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/137_promote_llm_costs_down.sql +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/138_ingest_api_keys.sql +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/138_ingest_api_keys_down.sql +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/139_ingest_pending_ingress.sql +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/139_ingest_pending_ingress_down.sql +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/140_ingest_idempotency_quota.sql +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/140_ingest_idempotency_quota_down.sql +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/141_ingest_pending_metadata.sql +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/141_ingest_pending_metadata_down.sql +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/142_llm_function_config.sql +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/142_llm_function_config_down.sql +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/143_kg_code_embeddings.sql +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/143_kg_code_embeddings_down.sql +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/144_notifications_pending_sync_index.sql +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/145_audit_log_immutable.sql +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/145_audit_log_immutable_down.sql +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/__init__.py +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/projects/_template/project.yaml +0 -0
- {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/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.6
|
|
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
|
|
@@ -31,12 +31,12 @@ Requires-Dist: click>=8
|
|
|
31
31
|
Requires-Dist: pydantic>=2.5
|
|
32
32
|
Requires-Dist: pydantic-settings>=2.7.0
|
|
33
33
|
Requires-Dist: PyYAML>=6
|
|
34
|
+
Requires-Dist: platformdirs>=4.0
|
|
34
35
|
Requires-Dist: cryptography>=42
|
|
35
36
|
Requires-Dist: fastapi>=0.115.0
|
|
36
37
|
Requires-Dist: slowapi>=0.1.9
|
|
37
38
|
Requires-Dist: cachetools>=5.3.0
|
|
38
39
|
Requires-Dist: uvicorn[standard]>=0.34.0
|
|
39
|
-
Requires-Dist: uvloop>=0.21.0
|
|
40
40
|
Requires-Dist: aiosqlite>=0.20.0
|
|
41
41
|
Requires-Dist: PyJWT>=2.10.0
|
|
42
42
|
Requires-Dist: bcrypt>=4.2.0
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
# Marvis
|
|
2
|
+
|
|
3
|
+
**The Company Brain your agents install.** Use Claude Code, or whatever coding agent you run, to manage projects and coordinate your agents, not just write code. Marvis captures what your agents do as they work, structures it into a cross-project Knowledge Graph, and hands it back to them, so your work stays on track and the system learns from it. Self-hosted, EU-resident, governed by an immutable audit chain.
|
|
4
|
+
|
|
5
|
+
**Open-core and free to run.** Marvis is the free core: you self-host it, read the source, fork it, audit it, at no cost. MarvisX is the commercial tier on top of the same brain: multi-department teams, data sovereignty and managed hosting, and autonomous, hands-off-the-keyboard operation. Marvis is what you install today; MarvisX is what you reach for when a single self-hosted instance is no longer enough.
|
|
6
|
+
|
|
7
|
+
## Install
|
|
8
|
+
|
|
9
|
+
Marvis runs as a CLI your agent drives. Install it, then let the agent you already use take it from there:
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
uv tool install marvisx-cli
|
|
13
|
+
marvis init
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
`marvis init` scaffolds the project and installs the governance hooks, then exposes the MCP surface to your agent. Python 3.10–3.13; on 3.14, pin the interpreter: `uv tool install --python 3.13 marvisx-cli`. No `uv` yet? `curl -LsSf https://astral.sh/uv/install.sh | sh`.
|
|
17
|
+
|
|
18
|
+
To run the full Console + API stack yourself, see [Self-hosting the full stack](#self-hosting-the-full-stack).
|
|
19
|
+
|
|
20
|
+
## What it does, in plain terms
|
|
21
|
+
|
|
22
|
+
- **Your agents stop forgetting.** Decisions, specs, playbooks, learnings and mistakes are captured as a side effect of the work your agents already do, not retyped by hand.
|
|
23
|
+
- **Your work stays on track.** A reflective Brain layer compares what agents produce against your intent and surfaces drift early, before it compounds across sessions.
|
|
24
|
+
- **One brain, many projects and teams.** A cross-project Knowledge Graph links decisions, code and documents, so an agent working in one project can see what was decided in another.
|
|
25
|
+
- **Governed by default.** Constitution rules enforced at the hook level, plus a foreign-key-immutable audit log: every action traces back to the human who approved it.
|
|
26
|
+
- **It lives in your terminal, not a dashboard.** An agent-native MCP surface keeps your existing Claude Code / Codex / Cursor as the place you work.
|
|
27
|
+
|
|
28
|
+
## Under the hood
|
|
29
|
+
|
|
30
|
+
- **Cross-project Knowledge Graph** with 17 deterministic edge types covering code, work-chain artifacts, knowledge-chain documents, cross-project references, and bridge edges. Canonical IDs follow `{prefix}:{kind}:{slug}`.
|
|
31
|
+
- **Foreign-key-immutable audit log** with provenance pinned at the SQLite level. Designed to satisfy the logging surface required by EU Regulation 2024/1689 (AI Act) Article 12.
|
|
32
|
+
- **Brain reflection pipeline** in five layers — substrate, digest and journal, drift checker, memory operations, findings — closed by a Direction-Aware loop.
|
|
33
|
+
- **Constitution-enforced safety rules** enforced by deterministic hook gates and an MCP mirror for providers without native hooks.
|
|
34
|
+
- **Agent-native MCP surface** exposing 91 tools, callable identically from Claude Code, Codex, Gemini, OpenCode, and a web console.
|
|
35
|
+
|
|
36
|
+
## Search and embedding quality
|
|
37
|
+
|
|
38
|
+
Marvis defaults to **IBM Granite-Embedding-97m-Multilingual-R2** self-hosted via ONNX, blended with SQLite BM25 keyword search through Reciprocal Rank Fusion. Backend is selectable through `EMBEDDING_MODE`.
|
|
39
|
+
|
|
40
|
+
This is a deliberate tradeoff: EU compliance, self-hosting, and zero external embedding cost come at the cost of retrieval quality that is below commercial managed embedding providers. See [`docs/SEARCH-QUALITY.md`](docs/SEARCH-QUALITY.md) for the benchmark numbers, affected workflows, mitigations available today, and the Phase 2 fine-tune roadmap.
|
|
41
|
+
|
|
42
|
+
## License posture
|
|
43
|
+
|
|
44
|
+
- **Free to self-host.** Code is **source-available** under the **Business Source License 1.1**, with an automatic change date converting to **Apache License 2.0** four years after release.
|
|
45
|
+
- Documentation and architectural patterns: **CC-BY 4.0**.
|
|
46
|
+
|
|
47
|
+
This is open-core, not OSI open source: the core is free to run and read, and the BSL holds back only competing commercial-as-a-service use until the change date. The combination keeps the architecture freely citable while preserving the ability to ship a self-hosted reference deployment.
|
|
48
|
+
|
|
49
|
+
## Architecture map
|
|
50
|
+
|
|
51
|
+
The system groups capabilities into eight functional domains (`M1 Capture`, `M2 Index`, `M3 Retrieve`, `M4 Reflect`, `M5 Act`, `M6 Agent-native I/O`, `M7 Compliance`, `M8 Productization`). The Knowledge Graph stitches them together with canonical IDs and an audit chain.
|
|
52
|
+
|
|
53
|
+
The full architectural description is the MarvisX preprint on Zenodo: [`10.5281/zenodo.20341860`](https://doi.org/10.5281/zenodo.20341860).
|
|
54
|
+
|
|
55
|
+
## Repository layout
|
|
56
|
+
|
|
57
|
+
```
|
|
58
|
+
core/
|
|
59
|
+
├── api/ # FastAPI service: KG, ingest, brain, MCP transport
|
|
60
|
+
├── console/ # Next.js web console
|
|
61
|
+
├── kb/ # Project-local knowledge base templates
|
|
62
|
+
├── mcp-pir/ # MCP server (stdio) exposing the 91-tool surface
|
|
63
|
+
└── scripts/ # Deployment, migration, and operational scripts
|
|
64
|
+
|
|
65
|
+
deploy/
|
|
66
|
+
└── _template/ # Reference deployment template
|
|
67
|
+
# (Docker Compose + environment scaffolding)
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
## Self-hosting the full stack
|
|
71
|
+
|
|
72
|
+
The CLI above runs Marvis against a local SQLite database. To run the full Console + API stack yourself, use the reference Docker Compose deployment. Clone the repository, copy `deploy/_template/.env.example` to `.env`, populate the required secrets, and bring the stack up:
|
|
73
|
+
|
|
74
|
+
```bash
|
|
75
|
+
cp deploy/_template/.env.example deploy/_template/.env
|
|
76
|
+
cd deploy/_template/
|
|
77
|
+
docker compose up -d
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
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.
|
|
81
|
+
|
|
82
|
+
## MCP surface
|
|
83
|
+
|
|
84
|
+
Marvis ships an MCP server exposing 91 tools across 11 categories: project and session context, tasks, handoffs, semantic search, learnings, costs, pull requests, knowledge graph queries, ingest triage, brain reflection layer, and audit-and-monitoring controls.
|
|
85
|
+
|
|
86
|
+
The same surface is used by autonomous agents and by humans through the web console. The intent is parity: any action a user can take through the console, an agent can also take through MCP, and the reverse.
|
|
87
|
+
|
|
88
|
+
## Single-user local runtime (`MARVIS_OSS_LOCAL`)
|
|
89
|
+
|
|
90
|
+
The MCP server runs in-process: it calls the same use_cases the HTTP API calls, against the local SQLite database, with no uvicorn and no Node bridge. In this single-user mode there is no HTTP API in front of the database, so the HTTP audit chokepoint (which in the managed deployment forces every mutation through the API) does not exist.
|
|
91
|
+
|
|
92
|
+
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.
|
|
93
|
+
|
|
94
|
+
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.
|
|
95
|
+
|
|
96
|
+
**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.
|
|
97
|
+
|
|
98
|
+
## Telemetry
|
|
99
|
+
|
|
100
|
+
Marvis sends anonymous, opt-out usage telemetry to help improve it: coarse event counts plus version and OS buckets, tied to a random install id (a plain UUID, never derived from your machine, user, or email). It never sends file content, project data, or personal information.
|
|
101
|
+
|
|
102
|
+
Turn it off at any time:
|
|
103
|
+
|
|
104
|
+
```bash
|
|
105
|
+
marvis telemetry off
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
Or per environment: `MARVIS_TELEMETRY=0`, the universal `DO_NOT_TRACK=1`, or `telemetry: false` in `~/.marvis/settings.yaml`. With `MARVIS_TELEMETRY=log`, Marvis prints exactly what it would send to stderr and transmits nothing.
|
|
109
|
+
|
|
110
|
+
## Documentation
|
|
111
|
+
|
|
112
|
+
- [`docs/SEARCH-QUALITY.md`](docs/SEARCH-QUALITY.md) — search quality expectations, affected workflows, and mitigations
|
|
113
|
+
|
|
114
|
+
## Contributing
|
|
115
|
+
|
|
116
|
+
Issues and bug reports are welcome through the repository tracker.
|
|
117
|
+
|
|
118
|
+
## References
|
|
119
|
+
|
|
120
|
+
- Preprint (Zenodo): [`10.5281/zenodo.20341860`](https://doi.org/10.5281/zenodo.20341860)
|
|
121
|
+
- License (code): Business Source License 1.1, change date converts to Apache License 2.0 four years after release
|
|
122
|
+
- License (documentation): CC-BY 4.0
|
|
@@ -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",
|
|
@@ -8,6 +8,8 @@ from typing import Literal
|
|
|
8
8
|
from pydantic import AliasChoices, Field, SecretStr
|
|
9
9
|
from pydantic_settings import BaseSettings, SettingsConfigDict
|
|
10
10
|
|
|
11
|
+
from core.platform import current_user, db_default_path
|
|
12
|
+
|
|
11
13
|
# Prod (Hetzner/Docker) ships the vec0 loadable at this path; it stays the
|
|
12
14
|
# final fallback so prod keeps working unchanged.
|
|
13
15
|
_VEC0_PATH_PROD_DEFAULT = "/data/pir/lib/vec0"
|
|
@@ -40,22 +42,43 @@ class Settings(BaseSettings):
|
|
|
40
42
|
populate_by_name=True,
|
|
41
43
|
)
|
|
42
44
|
|
|
43
|
-
pir_env: str =
|
|
45
|
+
pir_env: str = Field(
|
|
46
|
+
default="development",
|
|
47
|
+
validation_alias=AliasChoices("MARVIS_ENV", "PIR_ENV"),
|
|
48
|
+
)
|
|
44
49
|
# Free-form tenant identifier. Default "core" (OSS). Deploy bundles set
|
|
45
50
|
# DEPLOY_MODE to their own tenant slug via .env; no tenant names are
|
|
46
51
|
# hard-coded in core.
|
|
47
52
|
deploy_mode: str = Field(default="core", alias="DEPLOY_MODE")
|
|
48
|
-
pir_instance: str = Field(
|
|
53
|
+
pir_instance: str = Field(
|
|
54
|
+
default="prod",
|
|
55
|
+
validation_alias=AliasChoices("MARVIS_INSTANCE", "PIR_INSTANCE"),
|
|
56
|
+
)
|
|
49
57
|
marvisx_phase: Literal["A", "B", "C", "D"] = Field(
|
|
50
58
|
default="A", alias="MARVISX_PHASE"
|
|
51
59
|
)
|
|
52
|
-
pir_canary_banner: bool = Field(
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
60
|
+
pir_canary_banner: bool = Field(
|
|
61
|
+
default=False,
|
|
62
|
+
validation_alias=AliasChoices("MARVIS_CANARY_BANNER", "PIR_CANARY_BANNER"),
|
|
63
|
+
)
|
|
64
|
+
pir_jwt_secret: str = Field(
|
|
65
|
+
default="dev-secret-change-in-production",
|
|
66
|
+
validation_alias=AliasChoices("MARVIS_JWT_SECRET", "PIR_JWT_SECRET"),
|
|
67
|
+
)
|
|
68
|
+
pir_admin_password_hash: str = Field(
|
|
69
|
+
default="",
|
|
70
|
+
validation_alias=AliasChoices(
|
|
71
|
+
"MARVIS_ADMIN_PASSWORD_HASH", "PIR_ADMIN_PASSWORD_HASH"
|
|
72
|
+
),
|
|
73
|
+
)
|
|
56
74
|
db_path: str = Field(
|
|
57
|
-
|
|
58
|
-
|
|
75
|
+
# Fallback when no MARVIS_DB_PATH/PIR_DB_PATH/DB_PATH env is set: the
|
|
76
|
+
# platformdirs data root (was a CWD-relative "console.db" that opened a
|
|
77
|
+
# different DB per launch directory — split-brain, and on Windows a
|
|
78
|
+
# nonsense root). The env aliases still win via pydantic; this factory
|
|
79
|
+
# runs ONLY when none are set.
|
|
80
|
+
default_factory=lambda: str(db_default_path()),
|
|
81
|
+
validation_alias=AliasChoices("MARVIS_DB_PATH", "PIR_DB_PATH", "DB_PATH"),
|
|
59
82
|
)
|
|
60
83
|
cookie_domain: str | None = Field(default=None, alias="COOKIE_DOMAIN")
|
|
61
84
|
cors_origins_prod: list[str] = Field(
|
|
@@ -83,6 +106,16 @@ class Settings(BaseSettings):
|
|
|
83
106
|
brain_run_off_peak_only: bool = Field(
|
|
84
107
|
default=False, alias="BRAIN_RUN_OFF_PEAK_ONLY"
|
|
85
108
|
)
|
|
109
|
+
# Warehouse consolidation pass (full-store learning dedup, ships DORMANT).
|
|
110
|
+
# Unlike memory_ops M2 (same-cycle only), this scans the WHOLE learnings
|
|
111
|
+
# warehouse and PROPOSES consolidation of cross-cycle duplicates. Default
|
|
112
|
+
# FALSE — a human enables it after reviewing. Daily cadence guard.
|
|
113
|
+
brain_warehouse_consolidation_enabled: bool = Field(
|
|
114
|
+
default=False, alias="BRAIN_WAREHOUSE_CONSOLIDATION_ENABLED"
|
|
115
|
+
)
|
|
116
|
+
brain_warehouse_consolidation_interval_seconds: int = Field(
|
|
117
|
+
default=86400, alias="BRAIN_WAREHOUSE_CONSOLIDATION_INTERVAL_SECONDS"
|
|
118
|
+
)
|
|
86
119
|
|
|
87
120
|
# GitHub Webhook
|
|
88
121
|
github_webhook_secret: str = ""
|
|
@@ -401,9 +434,6 @@ class Settings(BaseSettings):
|
|
|
401
434
|
# WIP limit: max tasks in_progress per project (doc/none tasks count as 0.5)
|
|
402
435
|
wip_max_in_progress: int = 3
|
|
403
436
|
|
|
404
|
-
# Voyage AI embeddings
|
|
405
|
-
voyage_api_key: str = ""
|
|
406
|
-
|
|
407
437
|
# sqlite-vec: env VEC0_PATH → sqlite_vec.loadable_path() → prod fallback.
|
|
408
438
|
vec0_path: str = Field(
|
|
409
439
|
default_factory=_default_vec0_path,
|
|
@@ -521,16 +551,14 @@ class Settings(BaseSettings):
|
|
|
521
551
|
|
|
522
552
|
Returns '' when GIT_RUNAS_USER is unset or already matches the current
|
|
523
553
|
OS user (no privilege hop needed)."""
|
|
524
|
-
import pwd
|
|
525
|
-
|
|
526
554
|
user = (self.git_runas_user or "").strip()
|
|
527
555
|
if not user:
|
|
528
556
|
return ""
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
557
|
+
# current_user() is pwd.getpwuid(os.getuid()).pw_name on POSIX (identical
|
|
558
|
+
# to the previous inline lookup) and getpass-based on Windows; the bare
|
|
559
|
+
# `import pwd` here crashed `marvis project list` on Windows.
|
|
560
|
+
if current_user() == user:
|
|
561
|
+
return ""
|
|
534
562
|
return user
|
|
535
563
|
|
|
536
564
|
|
|
@@ -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
|
|
|
@@ -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,73 @@ 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)
|
|
109
|
+
except ServiceError as e:
|
|
110
|
+
raise_mcp_error(e)
|
|
111
|
+
|
|
112
|
+
@mcp.tool()
|
|
113
|
+
async def update_learning(
|
|
114
|
+
learning_id: Annotated[str, Field(min_length=1)],
|
|
115
|
+
title: Annotated[str, Field(min_length=1, max_length=200)] | None = None,
|
|
116
|
+
category: LearningCategory | None = None,
|
|
117
|
+
description: Annotated[str, Field(min_length=1)] | None = None,
|
|
118
|
+
prevention: Annotated[str, Field(min_length=1)] | None = None,
|
|
119
|
+
severity: LearningSeverity | None = None,
|
|
120
|
+
module: str | None = None,
|
|
121
|
+
tags: list[str] | None = None,
|
|
122
|
+
project: str | None = None,
|
|
123
|
+
) -> dict[str, Any]:
|
|
124
|
+
"""Update an existing learning (operator+), then re-embed it so search/check_learnings see the new content immediately.
|
|
125
|
+
|
|
126
|
+
QUANDO USARLO: il contenuto di un learning e' obsoleto/incompleto (prevention piu' precisa, severity ricalibrata, nuovo modulo) ma vuoi PRESERVARE la history. BOUNDARY: update_learning aggiorna in-place + re-embed; delete_learning cancella permanente; create_learning scrive nuovo.
|
|
127
|
+
QUANDO NON USARLO: NOT per un learning nuovo -> usa create_learning. NOT per azzerare un campo a null: la superficie MCP NON puo' settare null (omettere un campo lo lascia invariato) -> usa l'HTTP PATCH se devi pulire un campo.
|
|
128
|
+
RESTITUISCE: il learning aggiornato {id, title, category, severity, prevention, tags, module, project, updated_at} — gia' ri-embeddato (retrievable by meaning, non solo keyword)."""
|
|
129
|
+
fields = {
|
|
130
|
+
k: v
|
|
131
|
+
for k, v in {
|
|
132
|
+
"title": title,
|
|
133
|
+
"category": category,
|
|
134
|
+
"description": description,
|
|
135
|
+
"prevention": prevention,
|
|
136
|
+
"severity": severity,
|
|
137
|
+
"module": module,
|
|
138
|
+
"tags": tags,
|
|
139
|
+
"project": project,
|
|
140
|
+
}.items()
|
|
141
|
+
if v is not None
|
|
142
|
+
}
|
|
143
|
+
try:
|
|
144
|
+
async with acquire_write_db(label="mcp.update_learning") as db:
|
|
145
|
+
result = await learnings_uc.update_learning(
|
|
146
|
+
LOCAL_CTX, db, learning_id=learning_id, fields=fields
|
|
147
|
+
)
|
|
148
|
+
# Writer lock released: re-embed-on-write (mirror create_learning) so the
|
|
149
|
+
# updated content is retrievable by meaning immediately, not stale until
|
|
150
|
+
# a manual reindex.
|
|
151
|
+
await mcp_embed_learning(
|
|
152
|
+
learning_id=result.id,
|
|
153
|
+
title=result.title,
|
|
154
|
+
description=result.description,
|
|
155
|
+
category=result.category,
|
|
156
|
+
severity=result.severity,
|
|
157
|
+
prevention=result.prevention,
|
|
158
|
+
project=result.project,
|
|
159
|
+
workspace_id=LOCAL_CTX.workspace_id,
|
|
160
|
+
)
|
|
161
|
+
return dump(result)
|
|
89
162
|
except ServiceError as e:
|
|
90
163
|
raise_mcp_error(e)
|
|
91
164
|
|
|
@@ -142,3 +215,21 @@ def register(mcp) -> None:
|
|
|
142
215
|
return dump(result)
|
|
143
216
|
except ServiceError as e:
|
|
144
217
|
raise_mcp_error(e)
|
|
218
|
+
|
|
219
|
+
@mcp.tool()
|
|
220
|
+
async def delete_learning(
|
|
221
|
+
learning_id: Annotated[str, Field(min_length=1)],
|
|
222
|
+
) -> dict[str, Any]:
|
|
223
|
+
"""Permanently remove a learning from the Marvis DB (non-recoverable) + prune the search index.
|
|
224
|
+
|
|
225
|
+
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.
|
|
226
|
+
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.
|
|
227
|
+
RESTITUISCE: {deleted: true} o 404 se non esiste."""
|
|
228
|
+
try:
|
|
229
|
+
async with acquire_write_db(label="mcp.delete_learning") as db:
|
|
230
|
+
await learnings_uc.delete_learning(
|
|
231
|
+
LOCAL_CTX, db, learning_id=learning_id
|
|
232
|
+
)
|
|
233
|
+
return {"deleted": True}
|
|
234
|
+
except ServiceError as e:
|
|
235
|
+
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.
|