marvisx-cli 0.1.0__py3-none-any.whl
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.
- core/api/__init__.py +0 -0
- core/api/agents/__init__.py +0 -0
- core/api/agents/session_health.py +59 -0
- core/api/agents/session_manager.py +206 -0
- core/api/bin/marvisx-state-hook.py +182 -0
- core/api/config.py +533 -0
- core/api/db.py +1516 -0
- core/api/dependencies/__init__.py +0 -0
- core/api/dependencies/tenant.py +34 -0
- core/api/main.py +1641 -0
- core/api/mcp/__init__.py +8 -0
- core/api/mcp/_adapter.py +184 -0
- core/api/mcp/server.py +58 -0
- core/api/mcp/tools/__init__.py +59 -0
- core/api/mcp/tools/brain.py +599 -0
- core/api/mcp/tools/graph.py +380 -0
- core/api/mcp/tools/handoffs.py +112 -0
- core/api/mcp/tools/ingest.py +326 -0
- core/api/mcp/tools/learnings.py +144 -0
- core/api/mcp/tools/projects.py +99 -0
- core/api/mcp/tools/pull_requests.py +173 -0
- core/api/mcp/tools/safety.py +111 -0
- core/api/mcp/tools/search.py +79 -0
- core/api/mcp/tools/tasks.py +258 -0
- core/api/middleware/__init__.py +0 -0
- core/api/middleware/tool_call_audit.py +111 -0
- core/api/models/__init__.py +346 -0
- core/api/models/auth.py +48 -0
- core/api/models/brain.py +1006 -0
- core/api/models/common.py +76 -0
- core/api/models/costs.py +91 -0
- core/api/models/graph.py +66 -0
- core/api/models/graph_cosmo.py +125 -0
- core/api/models/graph_pr_impact.py +257 -0
- core/api/models/graph_ux.py +141 -0
- core/api/models/inbox.py +230 -0
- core/api/models/ingest_keys.py +108 -0
- core/api/models/kg.py +41 -0
- core/api/models/llm_config.py +56 -0
- core/api/models/monitoring.py +234 -0
- core/api/models/projects.py +161 -0
- core/api/models/search.py +42 -0
- core/api/models/sessions.py +322 -0
- core/api/models/tasks.py +184 -0
- core/api/models/teams.py +63 -0
- core/api/models/users.py +184 -0
- core/api/observability/__init__.py +0 -0
- core/api/observability/tracing.py +92 -0
- core/api/paths.py +26 -0
- core/api/rate_limit.py +24 -0
- core/api/rbac.py +112 -0
- core/api/routers/__init__.py +0 -0
- core/api/routers/_adapter.py +24 -0
- core/api/routers/admin_pr_impact.py +230 -0
- core/api/routers/admin_settings.py +147 -0
- core/api/routers/agent.py +1079 -0
- core/api/routers/agent_tokens.py +276 -0
- core/api/routers/app_settings.py +112 -0
- core/api/routers/audit.py +89 -0
- core/api/routers/auth.py +586 -0
- core/api/routers/bench.py +161 -0
- core/api/routers/brain.py +881 -0
- core/api/routers/brain_directions.py +527 -0
- core/api/routers/ci_checks.py +140 -0
- core/api/routers/comments.py +273 -0
- core/api/routers/costs.py +148 -0
- core/api/routers/docs_coverage.py +217 -0
- core/api/routers/docs_governance.py +63 -0
- core/api/routers/documents.py +318 -0
- core/api/routers/files.py +163 -0
- core/api/routers/finder.py +987 -0
- core/api/routers/graph.py +836 -0
- core/api/routers/handoffs.py +156 -0
- core/api/routers/inbox.py +496 -0
- core/api/routers/ingest_api_keys.py +205 -0
- core/api/routers/ingest_triage.py +1227 -0
- core/api/routers/judge.py +306 -0
- core/api/routers/kg.py +336 -0
- core/api/routers/learnings.py +253 -0
- core/api/routers/llm_config.py +130 -0
- core/api/routers/monitoring.py +347 -0
- core/api/routers/notifications.py +125 -0
- core/api/routers/pr_impact.py +315 -0
- core/api/routers/projects.py +1061 -0
- core/api/routers/pull_requests.py +312 -0
- core/api/routers/push.py +67 -0
- core/api/routers/raci.py +228 -0
- core/api/routers/search.py +125 -0
- core/api/routers/sessions.py +3100 -0
- core/api/routers/settings.py +90 -0
- core/api/routers/share_repo.py +68 -0
- core/api/routers/status_updates.py +96 -0
- core/api/routers/tags.py +45 -0
- core/api/routers/tasks.py +526 -0
- core/api/routers/teams.py +425 -0
- core/api/routers/terminal.py +105 -0
- core/api/routers/users.py +331 -0
- core/api/routers/webhooks.py +330 -0
- core/api/runtime_settings.py +84 -0
- core/api/security.py +652 -0
- core/api/services/__init__.py +0 -0
- core/api/services/audit.py +58 -0
- core/api/services/auto_approval.py +82 -0
- core/api/services/brain/__init__.py +52 -0
- core/api/services/brain/baseline.py +230 -0
- core/api/services/brain/capabilities.py +75 -0
- core/api/services/brain/cascade_rollup.py +388 -0
- core/api/services/brain/compound_bridge.py +215 -0
- core/api/services/brain/cycle.py +1242 -0
- core/api/services/brain/cycle_snapshot.py +371 -0
- core/api/services/brain/digest_collector.py +147 -0
- core/api/services/brain/direction.py +421 -0
- core/api/services/brain/drift.py +356 -0
- core/api/services/brain/drift_router.py +409 -0
- core/api/services/brain/edge_metrics.py +79 -0
- core/api/services/brain/events_reader.py +222 -0
- core/api/services/brain/findings.py +1379 -0
- core/api/services/brain/findings_reader.py +1006 -0
- core/api/services/brain/jobs.py +733 -0
- core/api/services/brain/journal.py +206 -0
- core/api/services/brain/knowledge_forms.py +92 -0
- core/api/services/brain/llm/__init__.py +37 -0
- core/api/services/brain/llm/_runner.py +62 -0
- core/api/services/brain/llm/base.py +70 -0
- core/api/services/brain/llm/cache.py +99 -0
- core/api/services/brain/llm/constants.py +46 -0
- core/api/services/brain/llm/direction_alignment.py +289 -0
- core/api/services/brain/llm/factory.py +132 -0
- core/api/services/brain/llm/finding_reasoning.py +98 -0
- core/api/services/brain/llm/finding_summary.py +92 -0
- core/api/services/brain/llm/grounding.py +46 -0
- core/api/services/brain/llm/journal_polish.py +96 -0
- core/api/services/brain/llm/local_gateway.py +426 -0
- core/api/services/brain/llm/parsers.py +71 -0
- core/api/services/brain/llm/router_glue.py +422 -0
- core/api/services/brain/memory_ops.py +1677 -0
- core/api/services/brain/models.py +140 -0
- core/api/services/brain/owner_hint.py +211 -0
- core/api/services/brain/recap.py +307 -0
- core/api/services/brain/rules/__init__.py +65 -0
- core/api/services/brain/rules/_signals.py +205 -0
- core/api/services/brain/rules/dr1_activity_without_status.py +108 -0
- core/api/services/brain/rules/dr2_decision_without_adr.py +110 -0
- core/api/services/brain/rules/dr3_stale_open_loop.py +127 -0
- core/api/services/brain/rules/dr4_docs_governance_drift.py +79 -0
- core/api/services/brain/rules/dr5_playbook_changed.py +99 -0
- core/api/services/brain/rules/dr6_external_update_unpropagated.py +100 -0
- core/api/services/brain/rules/dr7_claimed_decision_gap.py +123 -0
- core/api/services/brain/rules/dr8_direction_misalignment.py +230 -0
- core/api/services/brain/runs_reader.py +485 -0
- core/api/services/brain/scope.py +79 -0
- core/api/services/brain/sources/__init__.py +46 -0
- core/api/services/brain/sources/base.py +86 -0
- core/api/services/brain/sources/git_kg.py +393 -0
- core/api/services/brain/sources/handoffs.py +157 -0
- core/api/services/brain/sources/ingestor.py +130 -0
- core/api/services/brain/sources/learnings.py +121 -0
- core/api/services/brain/sources/pir_tasks.py +245 -0
- core/api/services/brain/watermarks.py +147 -0
- core/api/services/brain/ws_emitter.py +170 -0
- core/api/services/cc_tasks_reader.py +76 -0
- core/api/services/ci_service.py +263 -0
- core/api/services/claude_metrics.py +796 -0
- core/api/services/codex_metrics.py +364 -0
- core/api/services/conversation_reader.py +102 -0
- core/api/services/cost_service.py +243 -0
- core/api/services/crypto.py +147 -0
- core/api/services/docs_governance/__init__.py +1 -0
- core/api/services/docs_governance/confidence.py +230 -0
- core/api/services/docs_governance/config.py +87 -0
- core/api/services/docs_governance/enrichment.py +65 -0
- core/api/services/docs_governance/frontmatter_validator.py +83 -0
- core/api/services/docs_governance/hard_gates.py +221 -0
- core/api/services/docs_governance/triage_orchestrator.py +98 -0
- core/api/services/embedding_internal.py +395 -0
- core/api/services/embedding_service.py +832 -0
- core/api/services/event_dispatcher.py +167 -0
- core/api/services/events.py +70 -0
- core/api/services/git_ops.py +621 -0
- core/api/services/graph_cosmo_service.py +440 -0
- core/api/services/graph_ranker.py +306 -0
- core/api/services/graph_service.py +1589 -0
- core/api/services/inbox.py +800 -0
- core/api/services/inbox_digest.py +221 -0
- core/api/services/inbox_digest_deep_research.py +80 -0
- core/api/services/inbox_digest_jobs.py +595 -0
- core/api/services/inbox_gmail_sync.py +167 -0
- core/api/services/inbox_llm_classifier.py +906 -0
- core/api/services/inbox_source_identity.py +116 -0
- core/api/services/inbox_sources.py +456 -0
- core/api/services/inbox_taxonomy.py +195 -0
- core/api/services/inbox_tldr.py +1079 -0
- core/api/services/inbox_triage.py +899 -0
- core/api/services/ingest/__init__.py +13 -0
- core/api/services/ingest/api_key_auth.py +136 -0
- core/api/services/ingest/auto_approve.py +120 -0
- core/api/services/ingest/classifier.py +138 -0
- core/api/services/ingest/confidence.py +173 -0
- core/api/services/ingest/dispatch.py +88 -0
- core/api/services/ingest/embedding_router.py +272 -0
- core/api/services/ingest/events.py +33 -0
- core/api/services/ingest/ignore_patterns.py +79 -0
- core/api/services/ingest/image_probe.py +218 -0
- core/api/services/ingest/ingress.py +263 -0
- core/api/services/ingest/insert_saga.py +793 -0
- core/api/services/ingest/llm/__init__.py +13 -0
- core/api/services/ingest/llm/anthropic_haiku.py +23 -0
- core/api/services/ingest/llm/base.py +59 -0
- core/api/services/ingest/llm/byok_provider.py +130 -0
- core/api/services/ingest/llm/classification_context.py +301 -0
- core/api/services/ingest/llm/config_store.py +246 -0
- core/api/services/ingest/llm/factory.py +24 -0
- core/api/services/ingest/llm/kg_enricher.py +306 -0
- core/api/services/ingest/llm/local_gateway.py +821 -0
- core/api/services/ingest/llm/local_vllm.py +23 -0
- core/api/services/ingest/llm/openai_nano.py +349 -0
- core/api/services/ingest/lock_advisory.py +57 -0
- core/api/services/ingest/parser_router.py +1756 -0
- core/api/services/ingest/parsers/__init__.py +1 -0
- core/api/services/ingest/parsers/docling_parser.py +142 -0
- core/api/services/ingest/parsers/docparse_gateway.py +178 -0
- core/api/services/ingest/parsers/docx_parser.py +127 -0
- core/api/services/ingest/parsers/folder_unpacker.py +85 -0
- core/api/services/ingest/parsers/gateway_aux.py +147 -0
- core/api/services/ingest/parsers/image_parser.py +251 -0
- core/api/services/ingest/parsers/internal_markdown.py +89 -0
- core/api/services/ingest/parsers/ocr_gateway.py +117 -0
- core/api/services/ingest/parsers/ocr_pdf_parser.py +112 -0
- core/api/services/ingest/parsers/pdf_types.py +13 -0
- core/api/services/ingest/parsers/transcript_parser.py +445 -0
- core/api/services/ingest/parsers/vision_gateway.py +186 -0
- core/api/services/ingest/parsers/xlsx_parser.py +91 -0
- core/api/services/ingest/parsers/zip_unpacker.py +126 -0
- core/api/services/ingest/preflight.py +393 -0
- core/api/services/ingest/retry_voyage.py +88 -0
- core/api/services/ingest/routing_policy.py +307 -0
- core/api/services/ingest/serializers/__init__.py +1 -0
- core/api/services/ingest/serializers/xlsx_to_markdown.py +80 -0
- core/api/services/ingest/skip_log.py +74 -0
- core/api/services/ingest/watcher.py +637 -0
- core/api/services/kg/__init__.py +0 -0
- core/api/services/kg/audit.py +49 -0
- core/api/services/kg/hybrid_search.py +691 -0
- core/api/services/kg/lens.py +339 -0
- core/api/services/kg/pr_impact.py +770 -0
- core/api/services/kg/queries.py +152 -0
- core/api/services/kg/ranking.py +89 -0
- core/api/services/kg/rrf.py +143 -0
- core/api/services/kg_watcher_control.py +161 -0
- core/api/services/local_llm/__init__.py +19 -0
- core/api/services/local_llm/async_client.py +385 -0
- core/api/services/local_llm/client.py +173 -0
- core/api/services/local_llm/url_validator.py +44 -0
- core/api/services/metrics_collector.py +646 -0
- core/api/services/metrics_providers.py +65 -0
- core/api/services/model_registry.py +266 -0
- core/api/services/model_router.py +137 -0
- core/api/services/n8n_client.py +77 -0
- core/api/services/newsletter_llm_gateway.py +66 -0
- core/api/services/notification_service.py +134 -0
- core/api/services/openai_responses.py +55 -0
- core/api/services/opencode_metrics.py +375 -0
- core/api/services/opencode_sessions.py +173 -0
- core/api/services/pii_redactor.py +138 -0
- core/api/services/pr_impact_pipeline/__init__.py +21 -0
- core/api/services/pr_impact_pipeline/differ.py +421 -0
- core/api/services/pr_impact_pipeline/dispatcher.py +415 -0
- core/api/services/pr_impact_pipeline/gc.py +93 -0
- core/api/services/pr_impact_pipeline/languages.py +192 -0
- core/api/services/pr_impact_pipeline/parser.py +178 -0
- core/api/services/pr_impact_pipeline/writer.py +394 -0
- core/api/services/pr_service.py +1393 -0
- core/api/services/project_paths.py +70 -0
- core/api/services/project_status_updates.py +265 -0
- core/api/services/providers.py +276 -0
- core/api/services/push_service.py +170 -0
- core/api/services/reminder_service.py +89 -0
- core/api/services/runas.py +41 -0
- core/api/services/salience_service.py +69 -0
- core/api/services/security_collector.py +281 -0
- core/api/services/session_catalog.py +385 -0
- core/api/services/session_metrics_service.py +301 -0
- core/api/services/session_ops.py +272 -0
- core/api/services/session_state.py +173 -0
- core/api/services/share_links.py +222 -0
- core/api/services/task_transitions.py +146 -0
- core/api/services/terminal_metrics.py +462 -0
- core/api/services/terminal_metrics_dump.py +203 -0
- core/api/services/tmux.py +1205 -0
- core/api/services/webhook_service.py +422 -0
- core/api/services/workspace_sync.py +164 -0
- core/api/templates/__init__.py +1 -0
- core/api/templates/markdown_share.py +164 -0
- core/api/terminal.py +1031 -0
- core/api/tests/__init__.py +0 -0
- core/api/tests/test_agent_facing_auth_dependencies.py +132 -0
- core/api/tests/test_audit_permissions.py +133 -0
- core/api/tests/test_backfill_session_conversations.py +90 -0
- core/api/tests/test_backfill_working_seconds_msg.py +129 -0
- core/api/tests/test_claude_metrics.py +326 -0
- core/api/tests/test_codex_metrics.py +189 -0
- core/api/tests/test_finder_paths.py +74 -0
- core/api/tests/test_git_ops_merge.py +155 -0
- core/api/tests/test_learnings_check_search.py +81 -0
- core/api/tests/test_metrics_providers.py +133 -0
- core/api/tests/test_migration_087.py +164 -0
- core/api/tests/test_migration_088.py +94 -0
- core/api/tests/test_migration_089.py +116 -0
- core/api/tests/test_openai_responses.py +24 -0
- core/api/tests/test_opencode_metrics.py +740 -0
- core/api/tests/test_opencode_sessions.py +321 -0
- core/api/tests/test_pr_workflow_e2e.py +457 -0
- core/api/tests/test_projects_handoffs.py +31 -0
- core/api/tests/test_providers.py +138 -0
- core/api/tests/test_safety_bridge.py +347 -0
- core/api/tests/test_session_catalog.py +142 -0
- core/api/tests/test_session_conversations.py +512 -0
- core/api/tests/test_session_metrics_service.py +270 -0
- core/api/tests/test_session_resume_paths.py +548 -0
- core/api/tests/test_session_theme_mode_migration.py +56 -0
- core/api/tests/test_sessions_rbac.py +131 -0
- core/api/tests/test_share_edit.py +398 -0
- core/api/tests/test_share_repo.py +200 -0
- core/api/tests/test_terminal_session_manager.py +98 -0
- core/api/tests/test_terminal_upload.py +34 -0
- core/api/tests/test_tmux.py +272 -0
- core/api/tests/test_workspace_sync.py +186 -0
- core/api/tests/test_ws_ticket_in_memory.py +73 -0
- core/api/use_cases/__init__.py +11 -0
- core/api/use_cases/_context.py +89 -0
- core/api/use_cases/_errors.py +62 -0
- core/api/use_cases/_roles.py +16 -0
- core/api/use_cases/audit.py +171 -0
- core/api/use_cases/brain.py +1232 -0
- core/api/use_cases/costs.py +249 -0
- core/api/use_cases/graph.py +1153 -0
- core/api/use_cases/handoffs.py +506 -0
- core/api/use_cases/ingest_triage.py +1229 -0
- core/api/use_cases/learnings.py +538 -0
- core/api/use_cases/projects.py +705 -0
- core/api/use_cases/pull_requests.py +415 -0
- core/api/use_cases/search.py +926 -0
- core/api/use_cases/tasks.py +1495 -0
- core/api/visibility.py +141 -0
- core/cli/__init__.py +5 -0
- core/cli/_index_source.py +632 -0
- core/cli/_runtime_ctx.py +160 -0
- core/cli/_transmute.py +241 -0
- core/cli/marvis_doctor.py +704 -0
- core/cli/marvis_feedback.py +396 -0
- core/cli/marvis_governance.py +315 -0
- core/cli/marvis_hooks.py +515 -0
- core/cli/marvis_init.py +757 -0
- core/cli/marvis_mcp.py +401 -0
- core/cli/marvis_runtime.py +855 -0
- core/cli/marvis_telemetry.py +228 -0
- core/scripts/_drift_check.py +716 -0
- core/scripts/_frontmatter.py +66 -0
- core/scripts/_graph_writer.py +189 -0
- core/scripts/ast_parser.py +1553 -0
- core/scripts/install_hooks/__init__.py +1 -0
- core/scripts/install_hooks/_config.sh +109 -0
- core/scripts/install_hooks/block-dangerous-bash.sh +23 -0
- core/scripts/install_hooks/block-db-direct-write.sh +23 -0
- core/scripts/install_hooks/block-push-no-task.sh +23 -0
- core/scripts/install_hooks/block-staging-to-prod.sh +23 -0
- core/scripts/install_hooks/block-subtree-push.sh +23 -0
- core/scripts/install_hooks/config.json +53 -0
- core/scripts/install_hooks/enforce-no-merge-main.sh +23 -0
- core/scripts/install_hooks/enforce-worktree.sh +23 -0
- core/scripts/install_hooks/quality-gate.sh +170 -0
- core/scripts/install_hooks/safety_bridge.py +968 -0
- core/scripts/install_hooks/secret-scan.sh +23 -0
- core/scripts/migrate_spike_node_ids.py +122 -0
- core/scripts/populate_artifacts.py +2198 -0
- core/scripts/populate_cross_project.py +2457 -0
- core/scripts/populate_inbox_nodes.py +357 -0
- core/scripts/populate_pr_impact.py +267 -0
- core/scripts/populate_project_nodes.py +603 -0
- core/scripts/populate_touch_counter.py +337 -0
- core/scripts/reparse_failed.py +57 -0
- core/scripts/safety_bridge.py +968 -0
- core/telemetry/__init__.py +9 -0
- core/telemetry/client.py +405 -0
- core/telemetry/schema.py +122 -0
- core/wizard/__init__.py +65 -0
- core/wizard/byok_vault.py +147 -0
- core/wizard/defaults.py +58 -0
- core/wizard/state.py +117 -0
- core/wizard/steps.py +70 -0
- core/wizard/validation.py +136 -0
- marvisx_cli-0.1.0.dist-info/METADATA +201 -0
- marvisx_cli-0.1.0.dist-info/RECORD +587 -0
- marvisx_cli-0.1.0.dist-info/WHEEL +5 -0
- marvisx_cli-0.1.0.dist-info/entry_points.txt +3 -0
- marvisx_cli-0.1.0.dist-info/licenses/LICENSE +98 -0
- marvisx_cli-0.1.0.dist-info/top_level.txt +3 -0
- migrations/001_initial.sql +33 -0
- migrations/002_tasks.sql +30 -0
- migrations/003_session_management.sql +7 -0
- migrations/004_projects_comments.sql +65 -0
- migrations/005_session_intelligence.sql +15 -0
- migrations/006_settings.sql +12 -0
- migrations/007_task_scoring.sql +12 -0
- migrations/008_cost_tracking.sql +31 -0
- migrations/009_session_card_metrics.sql +3 -0
- migrations/010_monitoring.sql +55 -0
- migrations/012_agent_api.sql +21 -0
- migrations/013_session_complete.sql +8 -0
- migrations/015_pull_requests.sql +43 -0
- migrations/015_pull_requests_down.sql +5 -0
- migrations/016_users_raci.sql +116 -0
- migrations/017_task_cost_entries.sql +87 -0
- migrations/018_agents.sql +73 -0
- migrations/018_agents_down.sql +13 -0
- migrations/019_review_feedback.sql +18 -0
- migrations/020_pr_commit_sha.sql +4 -0
- migrations/021_webhook_events.sql +18 -0
- migrations/022_devx_agent_managed.sql +11 -0
- migrations/022_devx_agent_managed_down.sql +6 -0
- migrations/023_devx_p1_gate.sql +7 -0
- migrations/023_devx_p1_gate_down.sql +3 -0
- migrations/024_chat_messages.sql +16 -0
- migrations/024_pr_conversation_id.sql +8 -0
- migrations/024_task_indexes.sql +21 -0
- migrations/024_task_indexes_down.sql +7 -0
- migrations/025_audit_log.sql +17 -0
- migrations/026_agent_tokens.sql +20 -0
- migrations/027_teams_auth_phase_b.sql +35 -0
- migrations/028_learnings.sql +23 -0
- migrations/029_team_roles.sql +14 -0
- migrations/030_finder_pins.sql +10 -0
- migrations/031_pr_deploy_status.sql +9 -0
- migrations/032_task_reminders.sql +7 -0
- migrations/033_events_retry_count.sql +6 -0
- migrations/033_session_owner.sql +9 -0
- migrations/034_notifications.sql +38 -0
- migrations/035_shared_links.sql +15 -0
- migrations/036_session_index_upgrade.sql +29 -0
- migrations/037_pr_approval.sql +15 -0
- migrations/038_pr_submitted_by.sql +6 -0
- migrations/039_push_subscriptions.sql +17 -0
- migrations/040_semantic_search.sql +16 -0
- migrations/041_workspaces.sql +63 -0
- migrations/042_oidc_providers.sql +24 -0
- migrations/043_ci_checks.sql +31 -0
- migrations/044_agent_metrics.sql +30 -0
- migrations/045_documents_doc_type.sql +5 -0
- migrations/046_salience.sql +13 -0
- migrations/047_seed_missing_agents.sql +6 -0
- migrations/048_fix_agent_paths_roles.sql +5 -0
- migrations/049_agent_role_and_learnings_schema.sql +3 -0
- migrations/050_session_provider.sql +2 -0
- migrations/051_session_launch_profile.sql +4 -0
- migrations/052_session_theme_mode.sql +2 -0
- migrations/052_task_kind.sql +4 -0
- migrations/053_inbox_items.sql +31 -0
- migrations/054_inbox_triage_contract.sql +30 -0
- migrations/055_inbox_topic_treatment.sql +12 -0
- migrations/056_inbox_treatment_read_save.sql +57 -0
- migrations/057_session_theme_mode_backfill.sql +4 -0
- migrations/058_inbox_item_status_lifecycle.sql +13 -0
- migrations/059_inbox_tldr_and_source_scores.sql +18 -0
- migrations/060_newsletter.sql +16 -0
- migrations/061_inbox_redesign.sql +69 -0
- migrations/062_fix_inbox_sources_backfill.sql +37 -0
- migrations/063_task_completion_mode.sql +23 -0
- migrations/064_judge_mode_setting.sql +4 -0
- migrations/065_knowledge_graph_spike.sql +40 -0
- migrations/066_digest_ranking_inputs.sql +10 -0
- migrations/066_kg_artifact_nodes.sql +129 -0
- migrations/067_inbox_digest_selections.sql +28 -0
- migrations/067_kg_temporal.sql +53 -0
- migrations/068_inbox_digest_app_settings.sql +9 -0
- migrations/068_kg_touch_counter.sql +52 -0
- migrations/069_kg_doc_types.sql +117 -0
- migrations/070_digest_ranking_inputs_recovery.sql +3 -0
- migrations/071_inbox_digest_selections_recovery.sql +3 -0
- migrations/072_inbox_digest_app_settings_recovery.sql +3 -0
- migrations/073_kg_cross_project.sql +216 -0
- migrations/073_kg_cross_project_down.sql +77 -0
- migrations/074_kg_infra_types.sql +208 -0
- migrations/074_kg_infra_types_down.sql +80 -0
- migrations/075_kg_file_state_recovery.sql +35 -0
- migrations/075_kg_file_state_recovery_down.sql +5 -0
- migrations/076_kg_watcher_state.sql +33 -0
- migrations/076_kg_watcher_state_down.sql +3 -0
- migrations/077_kg_doc_types_extend.sql +226 -0
- migrations/077_kg_doc_types_extend_down.sql +80 -0
- migrations/078_kg_fts5.sql +102 -0
- migrations/078_kg_fts5_down.sql +14 -0
- migrations/079_kg_missing_indexes.sql +31 -0
- migrations/079_kg_missing_indexes_down.sql +10 -0
- migrations/080_kg_fts5_extended.sql +232 -0
- migrations/080_kg_fts5_extended_down.sql +25 -0
- migrations/081_kg_lens_indexes.sql +9 -0
- migrations/081_kg_lens_indexes_down.sql +3 -0
- migrations/082_kg_pins.sql +26 -0
- migrations/082_kg_pins_down.sql +14 -0
- migrations/083_kg_graph_nodes_degree.sql +20 -0
- migrations/083_kg_graph_nodes_degree_down.sql +15 -0
- migrations/084_drop_legacy_scheduler_tables.sql +58 -0
- migrations/084_drop_legacy_scheduler_tables_down.sql +112 -0
- migrations/085_kg_edge_resolves_to.sql +142 -0
- migrations/085_kg_edge_resolves_to_down.sql +66 -0
- migrations/086_project_status_updates_feed.sql +20 -0
- migrations/086_project_status_updates_feed_down.sql +36 -0
- migrations/087_session_metrics_dual.sql +50 -0
- migrations/087_session_metrics_dual_down.sql +21 -0
- migrations/088_rename_context_pct_legacy.sql +23 -0
- migrations/088_rename_context_pct_legacy_down.sql +8 -0
- migrations/089_session_metrics_equivalent_cost.sql +26 -0
- migrations/089_session_metrics_equivalent_cost_down.sql +11 -0
- migrations/090_kg_inbox_node_type.sql +26 -0
- migrations/090_kg_inbox_node_type_down.sql +20 -0
- migrations/091_kg_inbox_node_type_check.sql +265 -0
- migrations/091_kg_inbox_node_type_check_down.sql +129 -0
- migrations/092_sessions_activity_state_ts.sql +29 -0
- migrations/092_sessions_activity_state_ts_down.sql +14 -0
- migrations/093_sessions_activity_state_column.sql +29 -0
- migrations/093_sessions_activity_state_column_down.sql +10 -0
- migrations/094_ingest_pending.sql +55 -0
- migrations/094_ingest_pending_down.sql +15 -0
- migrations/095_kg_intent_first.sql +77 -0
- migrations/095_kg_intent_first_down.sql +25 -0
- migrations/096_kg_xlsx_artifact_prefix.sql +17 -0
- migrations/096_kg_xlsx_artifact_prefix_down.sql +11 -0
- migrations/097_ingest_change_history.sql +37 -0
- migrations/097_ingest_change_history_down.sql +13 -0
- migrations/098_kg_node_type_business.sql +254 -0
- migrations/098_kg_node_type_business_down.sql +195 -0
- migrations/099_kg_edges_restore_weight.sql +58 -0
- migrations/099_kg_edges_restore_weight_down.sql +12 -0
- migrations/100_kg_enriched_at.sql +25 -0
- migrations/100_kg_enriched_at_down.sql +12 -0
- migrations/101_local_llm_shadow_comparisons.sql +66 -0
- migrations/101_local_llm_shadow_comparisons_down.sql +15 -0
- migrations/102_promote_llm_costs.sql +69 -0
- migrations/102_promote_llm_costs_down.sql +19 -0
- migrations/103_ingest_skipped_log.sql +46 -0
- migrations/103_ingest_skipped_log_down.sql +15 -0
- migrations/120_docs_governance.sql +50 -0
- migrations/120_docs_governance_down.sql +11 -0
- migrations/121_notification_event_fk_cleanup.sql +21 -0
- migrations/121_notification_event_fk_cleanup_down.sql +10 -0
- migrations/122_docs_drift_history.sql +34 -0
- migrations/122_docs_drift_history_down.sql +15 -0
- migrations/123_ingest_parser_waiting_status.sql +69 -0
- migrations/123_ingest_parser_waiting_status_down.sql +69 -0
- migrations/124_heypocket_recordings.sql +63 -0
- migrations/124_heypocket_recordings_down.sql +13 -0
- migrations/125_kg_node_type_record.sql +219 -0
- migrations/125_kg_node_type_record_down.sql +205 -0
- migrations/126_ingest_terminal_upload_source_kind.sql +69 -0
- migrations/126_ingest_terminal_upload_source_kind_down.sql +69 -0
- migrations/127_brain_v1_substrate.sql +200 -0
- migrations/127_brain_v1_substrate_down.sql +32 -0
- migrations/128_brain_drift_signals.sql +157 -0
- migrations/128_brain_drift_signals_down.sql +23 -0
- migrations/129_brain_memory_operations.sql +232 -0
- migrations/129_brain_memory_operations_down.sql +27 -0
- migrations/130_brain_findings.sql +258 -0
- migrations/130_brain_findings_down.sql +29 -0
- migrations/132_kg_pr_modifies.sql +242 -0
- migrations/132_kg_pr_modifies_down.sql +99 -0
- migrations/133_brain_v1_2_direction_schema.sql +476 -0
- migrations/133_brain_v1_2_direction_schema_down.sql +273 -0
- migrations/134_brain_journal_narrative_polished.sql +8 -0
- migrations/134_brain_journal_narrative_polished_down.sql +6 -0
- migrations/135_kg_edges_provider.sql +21 -0
- migrations/136_documents_fts.sql +56 -0
- migrations/137_promote_llm_costs.sql +59 -0
- migrations/137_promote_llm_costs_down.sql +19 -0
- migrations/138_ingest_api_keys.sql +39 -0
- migrations/138_ingest_api_keys_down.sql +8 -0
- migrations/139_ingest_pending_ingress.sql +91 -0
- migrations/139_ingest_pending_ingress_down.sql +73 -0
- migrations/140_ingest_idempotency_quota.sql +45 -0
- migrations/140_ingest_idempotency_quota_down.sql +9 -0
- migrations/141_ingest_pending_metadata.sql +16 -0
- migrations/141_ingest_pending_metadata_down.sql +7 -0
- migrations/142_llm_function_config.sql +36 -0
- migrations/142_llm_function_config_down.sql +8 -0
- migrations/143_kg_code_embeddings.sql +25 -0
- migrations/143_kg_code_embeddings_down.sql +5 -0
- migrations/__init__.py +4 -0
- projects/_template/project.yaml +46 -0
core/api/mcp/__init__.py
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
# v1.0.0 - 2026-05-27 - S1 F0: MCP package stub (Python MCP server lands in S1 F3)
|
|
2
|
+
"""Python MCP surface for the collapsed single-process runtime.
|
|
3
|
+
|
|
4
|
+
F0 ships only the error adapter (``_adapter.raise_mcp_error``). The full FastMCP
|
|
5
|
+
server that exposes the 91 tools (``server.py`` + ``tools/``) lands in S1 F3.
|
|
6
|
+
This package does NOT import ``fastapi``; the ``mcp`` SDK is needed only at tool
|
|
7
|
+
call time (``raise_mcp_error`` imports ``ToolError`` function-locally).
|
|
8
|
+
"""
|
core/api/mcp/_adapter.py
ADDED
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
# v1.1.0 - 2026-05-27 - S1 F3.0: add LOCAL_CTX singleton + db/result wiring helpers (MCP server skeleton)
|
|
2
|
+
"""MCP adapter: domain<->MCP wiring for the Python MCP server.
|
|
3
|
+
|
|
4
|
+
Two responsibilities, both transport-thin:
|
|
5
|
+
|
|
6
|
+
1. ``raise_mcp_error(ServiceError)`` — maps a domain :class:`ServiceError` to the
|
|
7
|
+
SDK-native tool-error channel by RAISING ``ToolError(f"{code}: {message}")``.
|
|
8
|
+
FastMCP catches the raised ``ToolError`` and emits a real
|
|
9
|
+
``CallToolResult(isError=True, content=[text=...])`` — the only mechanism a
|
|
10
|
+
client (Claude Code) recognises as a tool error. The MCP surface ignores
|
|
11
|
+
``err.http_status`` (HTTP is not its transport) and maps ``code`` + ``message``
|
|
12
|
+
to the error text. This is uniform across EVERY tool regardless of return type:
|
|
13
|
+
raising bypasses FastMCP's structured-output validation, so it also works for
|
|
14
|
+
the ``-> list`` tools (which could not return the old error dict — it failed the
|
|
15
|
+
``list`` output schema). See ``to_mcp_error`` below for why the returned-dict
|
|
16
|
+
shape was abandoned (verified empirically: a returned dict is success DATA, not
|
|
17
|
+
a protocol ``isError``).
|
|
18
|
+
2. The single-user wiring the tools share: :data:`LOCAL_CTX` (the local operator
|
|
19
|
+
identity), :func:`dump` (DTO/dict normaliser), and the db acquire helpers
|
|
20
|
+
re-exported so ``tools/*.py`` import db access from one place.
|
|
21
|
+
|
|
22
|
+
The ``ToolError`` import is local to :func:`raise_mcp_error` so the rest of the
|
|
23
|
+
module (``LOCAL_CTX`` + the seam callables) stays testable without the ``mcp`` SDK
|
|
24
|
+
installed (parity with ``server.py``'s function-local SDK import).
|
|
25
|
+
"""
|
|
26
|
+
from __future__ import annotations
|
|
27
|
+
|
|
28
|
+
import asyncio
|
|
29
|
+
import logging
|
|
30
|
+
from typing import Any, NoReturn
|
|
31
|
+
|
|
32
|
+
from core.api.use_cases._context import CallerContext
|
|
33
|
+
from core.api.use_cases._errors import ServiceError
|
|
34
|
+
|
|
35
|
+
logger = logging.getLogger(__name__)
|
|
36
|
+
|
|
37
|
+
# Re-export the db context managers so tools import db access from the adapter,
|
|
38
|
+
# not from deep in the api package. ``acquire_db`` = read pool; ``acquire_write_db``
|
|
39
|
+
# = writer + lock (mutators). Both are @asynccontextmanager importable directly.
|
|
40
|
+
from core.api.db import acquire_db, acquire_write_db # noqa: F401 (re-export)
|
|
41
|
+
|
|
42
|
+
# ---------------------------------------------------------------------------
|
|
43
|
+
# Single-user local identity (OSS: no JWT, no auth).
|
|
44
|
+
# ---------------------------------------------------------------------------
|
|
45
|
+
# The MCP process IS the lifetime container, so this is a module singleton (the
|
|
46
|
+
# `app.state` equivalent for a process with no FastAPI `app`). Every tool calls
|
|
47
|
+
# the SAME use_cases the HTTP adapter calls, only the CallerContext fill differs:
|
|
48
|
+
# HTTP fills from UserInfo; MCP fills with this local operator. One implementation,
|
|
49
|
+
# no fork. `is_human_session=True` -> the four-eyes approval gate is a local no-op
|
|
50
|
+
# by design (documented S1 §AUTH: single-user collapses four-eyes).
|
|
51
|
+
LOCAL_CTX: CallerContext = CallerContext.local_single_user()
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
# ---------------------------------------------------------------------------
|
|
55
|
+
# MCP-local seam callables (the fastapi-free counterparts of the router seams).
|
|
56
|
+
# ---------------------------------------------------------------------------
|
|
57
|
+
# create_task / update_task use_cases take the side-effect hooks
|
|
58
|
+
# (sync_graph / schedule_embed / requires_pr_gate) as injected callables — the
|
|
59
|
+
# "costs programs_loader" seam — so the domain stays fastapi-free. The HTTP
|
|
60
|
+
# router injects ITS versions (which live in routers/tasks.py and pull fastapi
|
|
61
|
+
# for the test-seam machinery). The MCP surface MUST NOT import the router (that
|
|
62
|
+
# would drag fastapi into the collapsed single-process runtime), so it injects
|
|
63
|
+
# these MCP-local seams instead:
|
|
64
|
+
#
|
|
65
|
+
# * mcp_sync_graph -> graph_service.sync_task_to_graph (already fastapi-free,
|
|
66
|
+
# same KG node emit the HTTP surface does — no divergence).
|
|
67
|
+
# * mcp_schedule_embed -> in-process auto-embed (S1 F4). Fires the SAME
|
|
68
|
+
# fastapi-free embed body the HTTP surface uses
|
|
69
|
+
# (embedding_service.embed_task_document) fire-and-forget
|
|
70
|
+
# on the running tool loop — no Node, no HTTP, no fork. The
|
|
71
|
+
# use_case calls this sync seam un-awaited (side effect),
|
|
72
|
+
# so it schedules a background task and returns immediately;
|
|
73
|
+
# the embed (incl. the slow model/Voyage call) runs OUTSIDE
|
|
74
|
+
# any write lock, then writes via the single-writer pool.
|
|
75
|
+
# No-ops gracefully when the embedder is unavailable.
|
|
76
|
+
# * mcp_requires_pr_gate -> returns False locally. The completed-PR gate (code/
|
|
77
|
+
# system tasks must complete via a merged PR) is a
|
|
78
|
+
# governance chokepoint meaningful only with Console/Triage;
|
|
79
|
+
# in single-user OSS it collapses to a no-op, the SAME
|
|
80
|
+
# per-surface trade-off documented for the four-eyes
|
|
81
|
+
# approval gate (S1 §AUTH). The gate stays enforced on the
|
|
82
|
+
# HTTP surface for the paid tiers.
|
|
83
|
+
# Background task set (prevents GC of fire-and-forget embed coroutines) — the MCP
|
|
84
|
+
# process is the lifetime container, so this is a module-level set, the same pattern
|
|
85
|
+
# the HTTP router uses (routers.tasks._bg_embed_tasks). asyncio holds only a weak
|
|
86
|
+
# reference to a bare create_task() result, so an un-held task can be collected
|
|
87
|
+
# mid-flight; keeping it here until done prevents that.
|
|
88
|
+
_bg_embed_tasks: set[asyncio.Task] = set()
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
def mcp_schedule_embed(
|
|
92
|
+
*,
|
|
93
|
+
task_id: str,
|
|
94
|
+
title: str,
|
|
95
|
+
project: str,
|
|
96
|
+
status: str,
|
|
97
|
+
workspace_id: str,
|
|
98
|
+
**_ignored: Any,
|
|
99
|
+
) -> None:
|
|
100
|
+
"""In-process auto-embed seam for the local MCP surface (S1 F4).
|
|
101
|
+
|
|
102
|
+
Sync callable: the create/update task use_case invokes it un-awaited for its
|
|
103
|
+
side effect. There is a running event loop when a tool calls it (tools are
|
|
104
|
+
async), so we schedule the SHARED fastapi-free embed body
|
|
105
|
+
(``embedding_service.embed_task_document``) fire-and-forget — the exact helper
|
|
106
|
+
the HTTP router runs, just without FastAPI in the path. No-ops gracefully when
|
|
107
|
+
the embedder is unavailable (mirrors the router's ``is_available()`` guard).
|
|
108
|
+
"""
|
|
109
|
+
from core.api.services import embedding_service
|
|
110
|
+
|
|
111
|
+
if not embedding_service.is_available():
|
|
112
|
+
return
|
|
113
|
+
|
|
114
|
+
async def _embed() -> None:
|
|
115
|
+
try:
|
|
116
|
+
await embedding_service.embed_task_document(
|
|
117
|
+
task_id=task_id,
|
|
118
|
+
title=title,
|
|
119
|
+
project=project,
|
|
120
|
+
status=status,
|
|
121
|
+
workspace_id=workspace_id,
|
|
122
|
+
)
|
|
123
|
+
except Exception:
|
|
124
|
+
logger.debug(
|
|
125
|
+
"MCP auto-embed task %s failed (non-critical)", task_id, exc_info=True
|
|
126
|
+
)
|
|
127
|
+
|
|
128
|
+
try:
|
|
129
|
+
t = asyncio.create_task(_embed())
|
|
130
|
+
except RuntimeError:
|
|
131
|
+
# No running loop (e.g. a sync caller outside an async context). Auto-embed
|
|
132
|
+
# is a non-critical side effect; skip rather than crash the mutation.
|
|
133
|
+
logger.debug("MCP auto-embed skipped: no running event loop")
|
|
134
|
+
return
|
|
135
|
+
_bg_embed_tasks.add(t)
|
|
136
|
+
t.add_done_callback(_bg_embed_tasks.discard)
|
|
137
|
+
|
|
138
|
+
|
|
139
|
+
def mcp_requires_pr_gate(_project: str | None) -> bool:
|
|
140
|
+
"""Local PR-gate seam: governance gate collapses in single-user OSS (S1 §AUTH)."""
|
|
141
|
+
return False
|
|
142
|
+
|
|
143
|
+
|
|
144
|
+
def raise_mcp_error(err: ServiceError) -> NoReturn:
|
|
145
|
+
"""Surface a domain ``ServiceError`` as a real MCP tool error by RAISING.
|
|
146
|
+
|
|
147
|
+
Raises ``mcp.server.fastmcp.exceptions.ToolError(f"{err.code}: {err.message}")``.
|
|
148
|
+
FastMCP catches this in its ``call_tool`` path and returns a native
|
|
149
|
+
``CallToolResult(isError=True, content=[TextContent(text="<code>: <message>")])``
|
|
150
|
+
— the SDK-native error channel a client (Claude Code) recognises as a tool
|
|
151
|
+
error.
|
|
152
|
+
|
|
153
|
+
Why RAISE and not return a dict (verified empirically, S1 F3.2): a *returned*
|
|
154
|
+
value is success DATA — FastMCP places it in ``structuredContent`` with
|
|
155
|
+
``isError=False``, so a returned ``{"isError": True, ...}`` dict is silently a
|
|
156
|
+
SUCCESS the client must manually inspect (it never trips the protocol flag).
|
|
157
|
+
Worse, on the seven ``-> list[dict]`` tools that returned dict fails FastMCP's
|
|
158
|
+
structured-output validation against the ``list`` type and the client gets a
|
|
159
|
+
Pydantic validation error instead of the domain message. Raising fixes both:
|
|
160
|
+
it emits a real ``isError`` for every tool AND bypasses output validation, so
|
|
161
|
+
``-> dict`` and ``-> list`` tools surface errors identically.
|
|
162
|
+
|
|
163
|
+
The ``ToolError`` import is function-local so importing this module needs no
|
|
164
|
+
``mcp`` SDK (parity with ``server.py``).
|
|
165
|
+
"""
|
|
166
|
+
from mcp.server.fastmcp.exceptions import ToolError
|
|
167
|
+
|
|
168
|
+
raise ToolError(f"{err.code}: {err.message}")
|
|
169
|
+
|
|
170
|
+
|
|
171
|
+
def dump(result: Any) -> Any:
|
|
172
|
+
"""Normalise a use_case return into an MCP-serialisable structure.
|
|
173
|
+
|
|
174
|
+
Mutators return Pydantic DTOs (``.model_dump()``); read tools may already
|
|
175
|
+
return plain dict/list. Lists of DTOs are mapped element-wise. This keeps the
|
|
176
|
+
per-tool body a one-liner and centralises the DTO->dict decision (S1 F3
|
|
177
|
+
return-typing rule: ``dict[str, Any]`` for heterogeneous reads, DTO dumps for
|
|
178
|
+
mutators).
|
|
179
|
+
"""
|
|
180
|
+
if hasattr(result, "model_dump"):
|
|
181
|
+
return result.model_dump()
|
|
182
|
+
if isinstance(result, list):
|
|
183
|
+
return [r.model_dump() if hasattr(r, "model_dump") else r for r in result]
|
|
184
|
+
return result
|
core/api/mcp/server.py
ADDED
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
# v1.0.0 - 2026-05-27 - S1 F3.0: Python MCP server skeleton (FastMCP, stdio, use_cases-direct)
|
|
2
|
+
"""Python MCP server — the payoff of the S1 "collapse runtime" refactor.
|
|
3
|
+
|
|
4
|
+
A single ``FastMCP("pir")`` instance exposes the PiR tools, each calling the
|
|
5
|
+
``use_cases`` layer DIRECTLY (no Node, no HTTP, no uvicorn). Claude Code launches
|
|
6
|
+
this as a stdio subprocess exactly as it does the Node ``index.mjs`` today:
|
|
7
|
+
|
|
8
|
+
python -m core.api.mcp.server
|
|
9
|
+
|
|
10
|
+
F3.0 ships the SKELETON + the per-tool TEMPLATE on two domains (tasks +
|
|
11
|
+
learnings). The remaining 79 Node tools land in later F3 batches that copy the
|
|
12
|
+
template in ``tools/tasks.py`` / ``tools/learnings.py``.
|
|
13
|
+
|
|
14
|
+
SDK contract used (``mcp`` >= 1.12):
|
|
15
|
+
* ``FastMCP(name)`` + ``@mcp.tool()`` decorator. The function docstring becomes
|
|
16
|
+
the tool ``description``; the type hints become the input JSON schema.
|
|
17
|
+
* ``mcp.run()`` defaults to the stdio transport — parity 1:1 with the Node
|
|
18
|
+
server. No HTTP.
|
|
19
|
+
* ``await mcp.list_tools()`` introspects the registered tools (used by the smoke
|
|
20
|
+
test for ``tools/list`` parity against the Node baseline).
|
|
21
|
+
|
|
22
|
+
The ``mcp`` SDK import is local to this module (and ``main``); the rest of the MCP
|
|
23
|
+
package (``_adapter`` / ``tools`` registration logic) does not need the SDK at
|
|
24
|
+
import time beyond the decorator binding, so an environment without ``mcp`` can
|
|
25
|
+
still import the use_cases and adapter (the smoke test guards on importability).
|
|
26
|
+
"""
|
|
27
|
+
from __future__ import annotations
|
|
28
|
+
|
|
29
|
+
from mcp.server.fastmcp import FastMCP
|
|
30
|
+
|
|
31
|
+
from core.api.mcp.tools import register_all
|
|
32
|
+
|
|
33
|
+
# Module-level singleton: the MCP process is the lifetime container (the
|
|
34
|
+
# `app.state` equivalent for a server with no FastAPI `app`). Tools register on
|
|
35
|
+
# this at import time so `from core.api.mcp.server import mcp` already carries the
|
|
36
|
+
# full tool set — the smoke test introspects it without launching stdio.
|
|
37
|
+
mcp = FastMCP("pir")
|
|
38
|
+
|
|
39
|
+
register_all(mcp)
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
def main() -> None:
|
|
43
|
+
"""Run the MCP server over stdio (the OSS runtime entrypoint).
|
|
44
|
+
|
|
45
|
+
Mirror the user's ``~/.marvis/settings.yaml`` onto the API ``settings``
|
|
46
|
+
singleton + project-index roots BEFORE serving any tool, so ``search`` /
|
|
47
|
+
``graph_*`` reach the SAME SQLite file the ``marvis`` CLI uses (instead of the
|
|
48
|
+
bare ``db_path='console.db'`` default). Best-effort: no settings file → the
|
|
49
|
+
API defaults / ``$PIR_DB_PATH`` env stand (parity with the CLI runtime).
|
|
50
|
+
"""
|
|
51
|
+
from core.api.runtime_settings import apply_marvis_settings
|
|
52
|
+
|
|
53
|
+
apply_marvis_settings()
|
|
54
|
+
mcp.run()
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
if __name__ == "__main__":
|
|
58
|
+
main()
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
# v1.0.0 - 2026-05-27 - S1 F3.0: MCP tool groups package (tasks + learnings template batch)
|
|
2
|
+
"""MCP tool groups, one module per domain (mirror of the use_cases domains).
|
|
3
|
+
|
|
4
|
+
Each module exposes a ``register(mcp)`` function that decorates and registers its
|
|
5
|
+
tools on the shared ``FastMCP`` instance. ``server.py`` calls every group's
|
|
6
|
+
``register`` in turn. The per-tool pattern is the TEMPLATE the later batches copy
|
|
7
|
+
(see ``tasks.py`` / ``learnings.py``):
|
|
8
|
+
|
|
9
|
+
@mcp.tool()
|
|
10
|
+
async def <name>(<typed params>) -> dict:
|
|
11
|
+
\"\"\"<Node description verbatim — incl. QUANDO USARLO/NON USARLO>\"\"\"
|
|
12
|
+
try:
|
|
13
|
+
async with acquire_db() as db: # or acquire_write_db() for mutators
|
|
14
|
+
result = await use_cases.<domain>.<action>(LOCAL_CTX, db, ...)
|
|
15
|
+
return dump(result)
|
|
16
|
+
except ServiceError as e:
|
|
17
|
+
raise_mcp_error(e) # raises ToolError -> real CallToolResult(isError=True)
|
|
18
|
+
|
|
19
|
+
F3.0 shipped the ``tasks`` + ``learnings`` groups; F3.1a adds ``projects`` +
|
|
20
|
+
``search`` + ``handoffs``; F3.1b adds ``graph`` (the Knowledge-Graph family); F3.1c
|
|
21
|
+
adds ``brain`` (the reflection family); F3.1d (the final batch) adds ``ingest`` +
|
|
22
|
+
``pull_requests`` + ``safety``. The remaining domains land in later F3 batches that
|
|
23
|
+
copy this template.
|
|
24
|
+
"""
|
|
25
|
+
from __future__ import annotations
|
|
26
|
+
|
|
27
|
+
from . import (
|
|
28
|
+
brain,
|
|
29
|
+
graph,
|
|
30
|
+
handoffs,
|
|
31
|
+
ingest,
|
|
32
|
+
learnings,
|
|
33
|
+
projects,
|
|
34
|
+
pull_requests,
|
|
35
|
+
safety,
|
|
36
|
+
search,
|
|
37
|
+
tasks,
|
|
38
|
+
)
|
|
39
|
+
|
|
40
|
+
#: Ordered registration callables. ``server.py`` iterates this so adding a new
|
|
41
|
+
#: group is one import + one entry, never an edit to the server wiring.
|
|
42
|
+
REGISTRARS = (
|
|
43
|
+
tasks.register,
|
|
44
|
+
learnings.register,
|
|
45
|
+
projects.register,
|
|
46
|
+
search.register,
|
|
47
|
+
handoffs.register,
|
|
48
|
+
graph.register,
|
|
49
|
+
brain.register,
|
|
50
|
+
ingest.register,
|
|
51
|
+
pull_requests.register,
|
|
52
|
+
safety.register,
|
|
53
|
+
)
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
def register_all(mcp) -> None:
|
|
57
|
+
"""Register every tool group on the shared FastMCP instance."""
|
|
58
|
+
for registrar in REGISTRARS:
|
|
59
|
+
registrar(mcp)
|