marvisx-cli 0.2.2__tar.gz → 0.3.5__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (613) hide show
  1. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/MANIFEST.in +1 -0
  2. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/PKG-INFO +1 -2
  3. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/README.md +4 -4
  4. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/agents/session_manager.py +3 -1
  5. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/config.py +33 -10
  6. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/db.py +15 -7
  7. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/main.py +13 -9
  8. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/mcp/_adapter.py +70 -1
  9. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/mcp/server.py +27 -3
  10. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/mcp/tools/__init__.py +2 -0
  11. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/mcp/tools/brain.py +4 -4
  12. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/mcp/tools/learnings.py +40 -2
  13. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/mcp/tools/projects.py +1 -1
  14. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/mcp/tools/pull_requests.py +3 -3
  15. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/mcp/tools/safety.py +1 -1
  16. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/mcp/tools/search.py +6 -6
  17. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/mcp/tools/tasks.py +3 -3
  18. marvisx_cli-0.3.5/core/api/mcp/tools/workflow_playbooks/brainstorm.md +72 -0
  19. marvisx_cli-0.3.5/core/api/mcp/tools/workflow_playbooks/compound.md +71 -0
  20. marvisx_cli-0.3.5/core/api/mcp/tools/workflow_playbooks/plan.md +69 -0
  21. marvisx_cli-0.3.5/core/api/mcp/tools/workflows.py +415 -0
  22. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/models/monitoring.py +1 -1
  23. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/models/search.py +15 -0
  24. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/routers/brain.py +3 -3
  25. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/routers/graph.py +1 -1
  26. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/routers/kg.py +1 -1
  27. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/routers/learnings.py +102 -2
  28. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/routers/projects.py +60 -1
  29. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/routers/search.py +1 -1
  30. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/routers/sessions.py +1 -1
  31. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/runtime_settings.py +69 -0
  32. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/security.py +3 -3
  33. marvisx_cli-0.3.5/core/api/services/_fts.py +32 -0
  34. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/brain/findings_reader.py +2 -2
  35. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/brain/jobs.py +167 -8
  36. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/brain/llm/direction_alignment.py +1 -1
  37. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/brain/memory_ops.py +4 -4
  38. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/brain/recap.py +1 -1
  39. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/brain/sources/__init__.py +1 -1
  40. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/brain/sources/pir_tasks.py +1 -1
  41. marvisx_cli-0.3.5/core/api/services/brain/warehouse_consolidate.py +227 -0
  42. marvisx_cli-0.3.5/core/api/services/embedding_backends/__init__.py +31 -0
  43. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/embedding_internal.py +162 -6
  44. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/embedding_service.py +474 -62
  45. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/git_ops.py +8 -8
  46. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/graph_service.py +4 -4
  47. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/inbox.py +77 -0
  48. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/inbox_tldr.py +2 -2
  49. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/ingest/embedding_router.py +11 -11
  50. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/ingest/insert_saga.py +14 -4
  51. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/ingest/llm/classification_context.py +7 -3
  52. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/ingest/llm/openai_nano.py +7 -3
  53. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/ingest/watcher.py +1 -1
  54. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/kg/hybrid_search.py +38 -8
  55. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/kg/pr_impact.py +1 -1
  56. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/metrics_collector.py +2 -2
  57. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/model_router.py +1 -1
  58. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/pr_impact_pipeline/dispatcher.py +1 -1
  59. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/tmux.py +0 -1
  60. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/webhook_service.py +3 -3
  61. marvisx_cli-0.3.5/core/api/tests/test_config_env_aliases.py +75 -0
  62. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/tests/test_git_ops_merge.py +25 -0
  63. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/use_cases/brain.py +1 -1
  64. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/use_cases/graph.py +5 -5
  65. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/use_cases/handoffs.py +2 -2
  66. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/use_cases/learnings.py +77 -0
  67. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/use_cases/search.py +95 -9
  68. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/use_cases/tasks.py +6 -6
  69. marvisx_cli-0.3.5/core/cli/_brain_opportunistic.py +138 -0
  70. marvisx_cli-0.3.5/core/cli/_brain_schedule.py +373 -0
  71. marvisx_cli-0.3.5/core/cli/marvis_brain.py +200 -0
  72. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/cli/marvis_doctor.py +149 -0
  73. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/cli/marvis_governance.py +2 -2
  74. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/cli/marvis_init.py +156 -2
  75. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/cli/marvis_mcp.py +89 -47
  76. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/scripts/_drift_check.py +3 -3
  77. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/scripts/install_hooks/safety_bridge.py +14 -14
  78. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/scripts/populate_artifacts.py +1 -1
  79. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/scripts/populate_cross_project.py +9 -6
  80. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/scripts/safety_bridge.py +14 -14
  81. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/telemetry/client.py +1 -1
  82. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/telemetry/schema.py +1 -1
  83. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/marvisx_cli.egg-info/PKG-INFO +1 -2
  84. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/marvisx_cli.egg-info/SOURCES.txt +11 -1
  85. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/marvisx_cli.egg-info/requires.txt +0 -1
  86. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/078_kg_fts5.sql +1 -1
  87. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/095_kg_intent_first.sql +1 -1
  88. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/pyproject.toml +16 -3
  89. marvisx_cli-0.2.2/core/api/services/ingest/retry_voyage.py +0 -88
  90. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/LICENSE +0 -0
  91. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/__init__.py +0 -0
  92. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/agents/__init__.py +0 -0
  93. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/agents/session_health.py +0 -0
  94. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/bin/marvisx-state-hook.py +0 -0
  95. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/dependencies/__init__.py +0 -0
  96. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/dependencies/tenant.py +0 -0
  97. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/mcp/__init__.py +0 -0
  98. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/mcp/tools/graph.py +0 -0
  99. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/mcp/tools/handoffs.py +0 -0
  100. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/mcp/tools/ingest.py +0 -0
  101. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/middleware/__init__.py +0 -0
  102. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/middleware/tool_call_audit.py +0 -0
  103. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/models/__init__.py +0 -0
  104. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/models/auth.py +0 -0
  105. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/models/brain.py +0 -0
  106. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/models/common.py +0 -0
  107. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/models/costs.py +0 -0
  108. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/models/graph.py +0 -0
  109. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/models/graph_cosmo.py +0 -0
  110. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/models/graph_pr_impact.py +0 -0
  111. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/models/graph_ux.py +0 -0
  112. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/models/inbox.py +0 -0
  113. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/models/ingest_keys.py +0 -0
  114. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/models/kg.py +0 -0
  115. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/models/llm_config.py +0 -0
  116. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/models/projects.py +0 -0
  117. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/models/sessions.py +0 -0
  118. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/models/tasks.py +0 -0
  119. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/models/teams.py +0 -0
  120. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/models/users.py +0 -0
  121. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/observability/__init__.py +0 -0
  122. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/observability/tracing.py +0 -0
  123. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/paths.py +0 -0
  124. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/rate_limit.py +0 -0
  125. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/rbac.py +0 -0
  126. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/routers/__init__.py +0 -0
  127. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/routers/_adapter.py +0 -0
  128. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/routers/admin_pr_impact.py +0 -0
  129. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/routers/admin_settings.py +0 -0
  130. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/routers/agent.py +0 -0
  131. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/routers/agent_tokens.py +0 -0
  132. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/routers/app_settings.py +0 -0
  133. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/routers/audit.py +0 -0
  134. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/routers/auth.py +0 -0
  135. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/routers/bench.py +0 -0
  136. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/routers/brain_directions.py +0 -0
  137. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/routers/ci_checks.py +0 -0
  138. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/routers/comments.py +0 -0
  139. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/routers/costs.py +0 -0
  140. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/routers/docs_coverage.py +0 -0
  141. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/routers/docs_governance.py +0 -0
  142. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/routers/documents.py +0 -0
  143. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/routers/files.py +0 -0
  144. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/routers/finder.py +0 -0
  145. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/routers/handoffs.py +0 -0
  146. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/routers/inbox.py +0 -0
  147. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/routers/ingest_api_keys.py +0 -0
  148. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/routers/ingest_triage.py +0 -0
  149. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/routers/judge.py +0 -0
  150. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/routers/llm_config.py +0 -0
  151. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/routers/monitoring.py +0 -0
  152. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/routers/notifications.py +0 -0
  153. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/routers/pr_impact.py +0 -0
  154. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/routers/pull_requests.py +0 -0
  155. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/routers/push.py +0 -0
  156. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/routers/raci.py +0 -0
  157. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/routers/settings.py +0 -0
  158. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/routers/share_repo.py +0 -0
  159. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/routers/status_updates.py +0 -0
  160. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/routers/tags.py +0 -0
  161. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/routers/tasks.py +0 -0
  162. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/routers/teams.py +0 -0
  163. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/routers/terminal.py +0 -0
  164. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/routers/users.py +0 -0
  165. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/routers/webhooks.py +0 -0
  166. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/__init__.py +0 -0
  167. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/audit.py +0 -0
  168. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/auto_approval.py +0 -0
  169. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/brain/__init__.py +0 -0
  170. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/brain/baseline.py +0 -0
  171. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/brain/capabilities.py +0 -0
  172. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/brain/cascade_rollup.py +0 -0
  173. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/brain/compound_bridge.py +0 -0
  174. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/brain/cycle.py +0 -0
  175. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/brain/cycle_snapshot.py +0 -0
  176. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/brain/digest_collector.py +0 -0
  177. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/brain/direction.py +0 -0
  178. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/brain/drift.py +0 -0
  179. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/brain/drift_router.py +0 -0
  180. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/brain/edge_metrics.py +0 -0
  181. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/brain/events_reader.py +0 -0
  182. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/brain/findings.py +0 -0
  183. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/brain/journal.py +0 -0
  184. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/brain/knowledge_forms.py +0 -0
  185. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/brain/llm/__init__.py +0 -0
  186. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/brain/llm/_runner.py +0 -0
  187. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/brain/llm/base.py +0 -0
  188. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/brain/llm/cache.py +0 -0
  189. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/brain/llm/constants.py +0 -0
  190. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/brain/llm/factory.py +0 -0
  191. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/brain/llm/finding_reasoning.py +0 -0
  192. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/brain/llm/finding_summary.py +0 -0
  193. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/brain/llm/grounding.py +0 -0
  194. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/brain/llm/journal_polish.py +0 -0
  195. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/brain/llm/local_gateway.py +0 -0
  196. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/brain/llm/parsers.py +0 -0
  197. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/brain/llm/router_glue.py +0 -0
  198. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/brain/models.py +0 -0
  199. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/brain/owner_hint.py +0 -0
  200. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/brain/rules/__init__.py +0 -0
  201. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/brain/rules/_signals.py +0 -0
  202. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/brain/rules/dr1_activity_without_status.py +0 -0
  203. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/brain/rules/dr2_decision_without_adr.py +0 -0
  204. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/brain/rules/dr3_stale_open_loop.py +0 -0
  205. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/brain/rules/dr4_docs_governance_drift.py +0 -0
  206. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/brain/rules/dr5_playbook_changed.py +0 -0
  207. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/brain/rules/dr6_external_update_unpropagated.py +0 -0
  208. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/brain/rules/dr7_claimed_decision_gap.py +0 -0
  209. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/brain/rules/dr8_direction_misalignment.py +0 -0
  210. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/brain/runs_reader.py +0 -0
  211. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/brain/scope.py +0 -0
  212. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/brain/sources/base.py +0 -0
  213. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/brain/sources/git_kg.py +0 -0
  214. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/brain/sources/handoffs.py +0 -0
  215. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/brain/sources/ingestor.py +0 -0
  216. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/brain/sources/learnings.py +0 -0
  217. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/brain/watermarks.py +0 -0
  218. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/brain/ws_emitter.py +0 -0
  219. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/cc_tasks_reader.py +0 -0
  220. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/ci_service.py +0 -0
  221. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/claude_metrics.py +0 -0
  222. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/codex_metrics.py +0 -0
  223. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/conversation_reader.py +0 -0
  224. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/cost_service.py +0 -0
  225. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/crypto.py +0 -0
  226. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/docs_governance/__init__.py +0 -0
  227. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/docs_governance/confidence.py +0 -0
  228. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/docs_governance/config.py +0 -0
  229. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/docs_governance/enrichment.py +0 -0
  230. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/docs_governance/frontmatter_validator.py +0 -0
  231. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/docs_governance/hard_gates.py +0 -0
  232. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/docs_governance/triage_orchestrator.py +0 -0
  233. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/event_dispatcher.py +0 -0
  234. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/events.py +0 -0
  235. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/graph_cosmo_service.py +0 -0
  236. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/graph_ranker.py +0 -0
  237. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/inbox_digest.py +0 -0
  238. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/inbox_digest_deep_research.py +0 -0
  239. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/inbox_digest_jobs.py +0 -0
  240. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/inbox_gmail_sync.py +0 -0
  241. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/inbox_llm_classifier.py +0 -0
  242. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/inbox_source_identity.py +0 -0
  243. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/inbox_sources.py +0 -0
  244. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/inbox_taxonomy.py +0 -0
  245. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/inbox_triage.py +0 -0
  246. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/ingest/__init__.py +0 -0
  247. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/ingest/api_key_auth.py +0 -0
  248. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/ingest/auto_approve.py +0 -0
  249. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/ingest/classifier.py +0 -0
  250. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/ingest/confidence.py +0 -0
  251. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/ingest/dispatch.py +0 -0
  252. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/ingest/events.py +0 -0
  253. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/ingest/ignore_patterns.py +0 -0
  254. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/ingest/image_probe.py +0 -0
  255. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/ingest/ingress.py +0 -0
  256. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/ingest/llm/__init__.py +0 -0
  257. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/ingest/llm/anthropic_haiku.py +0 -0
  258. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/ingest/llm/base.py +0 -0
  259. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/ingest/llm/byok_provider.py +0 -0
  260. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/ingest/llm/config_store.py +0 -0
  261. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/ingest/llm/factory.py +0 -0
  262. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/ingest/llm/kg_enricher.py +0 -0
  263. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/ingest/llm/local_gateway.py +0 -0
  264. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/ingest/llm/local_vllm.py +0 -0
  265. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/ingest/lock_advisory.py +0 -0
  266. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/ingest/parser_router.py +0 -0
  267. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/ingest/parsers/__init__.py +0 -0
  268. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/ingest/parsers/docling_parser.py +0 -0
  269. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/ingest/parsers/docparse_gateway.py +0 -0
  270. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/ingest/parsers/docx_parser.py +0 -0
  271. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/ingest/parsers/folder_unpacker.py +0 -0
  272. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/ingest/parsers/gateway_aux.py +0 -0
  273. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/ingest/parsers/image_parser.py +0 -0
  274. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/ingest/parsers/internal_markdown.py +0 -0
  275. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/ingest/parsers/ocr_gateway.py +0 -0
  276. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/ingest/parsers/ocr_pdf_parser.py +0 -0
  277. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/ingest/parsers/pdf_types.py +0 -0
  278. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/ingest/parsers/transcript_parser.py +0 -0
  279. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/ingest/parsers/vision_gateway.py +0 -0
  280. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/ingest/parsers/xlsx_parser.py +0 -0
  281. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/ingest/parsers/zip_unpacker.py +0 -0
  282. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/ingest/preflight.py +0 -0
  283. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/ingest/routing_policy.py +0 -0
  284. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/ingest/serializers/__init__.py +0 -0
  285. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/ingest/serializers/xlsx_to_markdown.py +0 -0
  286. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/ingest/skip_log.py +0 -0
  287. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/kg/__init__.py +0 -0
  288. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/kg/audit.py +0 -0
  289. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/kg/lens.py +0 -0
  290. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/kg/queries.py +0 -0
  291. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/kg/ranking.py +0 -0
  292. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/kg/rrf.py +0 -0
  293. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/kg_watcher_control.py +0 -0
  294. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/local_llm/__init__.py +0 -0
  295. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/local_llm/async_client.py +0 -0
  296. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/local_llm/client.py +0 -0
  297. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/local_llm/url_validator.py +0 -0
  298. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/metrics_providers.py +0 -0
  299. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/model_registry.py +0 -0
  300. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/n8n_client.py +0 -0
  301. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/newsletter_llm_gateway.py +0 -0
  302. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/notification_service.py +0 -0
  303. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/openai_responses.py +0 -0
  304. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/opencode_metrics.py +0 -0
  305. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/opencode_sessions.py +0 -0
  306. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/pii_redactor.py +0 -0
  307. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/pr_impact_pipeline/__init__.py +0 -0
  308. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/pr_impact_pipeline/differ.py +0 -0
  309. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/pr_impact_pipeline/gc.py +0 -0
  310. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/pr_impact_pipeline/languages.py +0 -0
  311. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/pr_impact_pipeline/parser.py +0 -0
  312. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/pr_impact_pipeline/writer.py +0 -0
  313. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/pr_service.py +0 -0
  314. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/project_paths.py +0 -0
  315. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/project_status_updates.py +0 -0
  316. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/providers.py +0 -0
  317. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/push_service.py +0 -0
  318. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/reminder_service.py +0 -0
  319. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/runas.py +0 -0
  320. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/salience_service.py +0 -0
  321. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/security_collector.py +0 -0
  322. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/session_catalog.py +0 -0
  323. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/session_metrics_service.py +0 -0
  324. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/session_ops.py +0 -0
  325. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/session_state.py +0 -0
  326. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/share_links.py +0 -0
  327. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/task_transitions.py +0 -0
  328. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/terminal_metrics.py +0 -0
  329. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/terminal_metrics_dump.py +0 -0
  330. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/services/workspace_sync.py +0 -0
  331. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/templates/__init__.py +0 -0
  332. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/templates/markdown_share.py +0 -0
  333. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/terminal.py +0 -0
  334. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/tests/__init__.py +0 -0
  335. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/tests/test_agent_facing_auth_dependencies.py +0 -0
  336. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/tests/test_audit_permissions.py +0 -0
  337. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/tests/test_backfill_session_conversations.py +0 -0
  338. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/tests/test_backfill_working_seconds_msg.py +0 -0
  339. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/tests/test_claude_metrics.py +0 -0
  340. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/tests/test_codex_metrics.py +0 -0
  341. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/tests/test_finder_paths.py +0 -0
  342. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/tests/test_learnings_check_search.py +0 -0
  343. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/tests/test_metrics_providers.py +0 -0
  344. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/tests/test_migration_087.py +0 -0
  345. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/tests/test_migration_088.py +0 -0
  346. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/tests/test_migration_089.py +0 -0
  347. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/tests/test_openai_responses.py +0 -0
  348. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/tests/test_opencode_metrics.py +0 -0
  349. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/tests/test_opencode_sessions.py +0 -0
  350. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/tests/test_pr_workflow_e2e.py +0 -0
  351. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/tests/test_projects_handoffs.py +0 -0
  352. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/tests/test_providers.py +0 -0
  353. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/tests/test_require_scope_empty_deny.py +0 -0
  354. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/tests/test_safety_bridge.py +0 -0
  355. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/tests/test_session_catalog.py +0 -0
  356. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/tests/test_session_conversations.py +0 -0
  357. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/tests/test_session_metrics_service.py +0 -0
  358. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/tests/test_session_resume_paths.py +0 -0
  359. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/tests/test_session_theme_mode_migration.py +0 -0
  360. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/tests/test_sessions_rbac.py +0 -0
  361. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/tests/test_share_edit.py +0 -0
  362. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/tests/test_share_repo.py +0 -0
  363. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/tests/test_terminal_session_manager.py +0 -0
  364. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/tests/test_terminal_upload.py +0 -0
  365. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/tests/test_tmux.py +0 -0
  366. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/tests/test_workspace_sync.py +0 -0
  367. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/tests/test_ws_ticket_in_memory.py +0 -0
  368. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/use_cases/__init__.py +0 -0
  369. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/use_cases/_context.py +0 -0
  370. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/use_cases/_errors.py +0 -0
  371. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/use_cases/_roles.py +0 -0
  372. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/use_cases/audit.py +0 -0
  373. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/use_cases/costs.py +0 -0
  374. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/use_cases/ingest_triage.py +0 -0
  375. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/use_cases/projects.py +0 -0
  376. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/use_cases/pull_requests.py +0 -0
  377. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/api/visibility.py +0 -0
  378. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/cli/README.md +0 -0
  379. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/cli/__init__.py +0 -0
  380. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/cli/_index_source.py +0 -0
  381. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/cli/_runtime_ctx.py +0 -0
  382. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/cli/_transmute.py +0 -0
  383. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/cli/marvis_account.py +0 -0
  384. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/cli/marvis_feedback.py +0 -0
  385. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/cli/marvis_hooks.py +0 -0
  386. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/cli/marvis_runtime.py +0 -0
  387. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/cli/marvis_telemetry.py +0 -0
  388. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/scripts/_frontmatter.py +0 -0
  389. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/scripts/_graph_writer.py +0 -0
  390. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/scripts/ast_parser.py +0 -0
  391. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/scripts/install_hooks/__init__.py +0 -0
  392. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/scripts/install_hooks/_config.sh +0 -0
  393. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/scripts/install_hooks/block-dangerous-bash.sh +0 -0
  394. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/scripts/install_hooks/block-db-direct-write.sh +0 -0
  395. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/scripts/install_hooks/block-push-no-task.sh +0 -0
  396. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/scripts/install_hooks/block-staging-to-prod.sh +0 -0
  397. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/scripts/install_hooks/block-subtree-push.sh +0 -0
  398. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/scripts/install_hooks/config.json +0 -0
  399. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/scripts/install_hooks/enforce-no-merge-main.sh +0 -0
  400. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/scripts/install_hooks/enforce-worktree.sh +0 -0
  401. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/scripts/install_hooks/quality-gate.sh +0 -0
  402. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/scripts/install_hooks/secret-scan.sh +0 -0
  403. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/scripts/migrate_spike_node_ids.py +0 -0
  404. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/scripts/populate_inbox_nodes.py +0 -0
  405. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/scripts/populate_pr_impact.py +0 -0
  406. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/scripts/populate_project_nodes.py +0 -0
  407. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/scripts/populate_touch_counter.py +0 -0
  408. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/scripts/reparse_failed.py +0 -0
  409. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/telemetry/__init__.py +0 -0
  410. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/telemetry/entitlements.py +0 -0
  411. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/telemetry/rollup.py +0 -0
  412. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/telemetry/sender.py +0 -0
  413. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/wizard/__init__.py +0 -0
  414. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/wizard/byok_vault.py +0 -0
  415. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/wizard/defaults.py +0 -0
  416. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/wizard/state.py +0 -0
  417. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/wizard/steps.py +0 -0
  418. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/core/wizard/validation.py +0 -0
  419. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/marvisx_cli.egg-info/dependency_links.txt +0 -0
  420. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/marvisx_cli.egg-info/entry_points.txt +0 -0
  421. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/marvisx_cli.egg-info/top_level.txt +0 -0
  422. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/001_initial.sql +0 -0
  423. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/002_tasks.sql +0 -0
  424. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/003_session_management.sql +0 -0
  425. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/004_projects_comments.sql +0 -0
  426. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/005_session_intelligence.sql +0 -0
  427. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/006_settings.sql +0 -0
  428. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/007_task_scoring.sql +0 -0
  429. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/008_cost_tracking.sql +0 -0
  430. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/009_session_card_metrics.sql +0 -0
  431. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/010_monitoring.sql +0 -0
  432. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/012_agent_api.sql +0 -0
  433. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/013_session_complete.sql +0 -0
  434. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/015_pull_requests.sql +0 -0
  435. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/015_pull_requests_down.sql +0 -0
  436. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/016_users_raci.sql +0 -0
  437. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/017_task_cost_entries.sql +0 -0
  438. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/018_agents.sql +0 -0
  439. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/018_agents_down.sql +0 -0
  440. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/019_review_feedback.sql +0 -0
  441. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/020_pr_commit_sha.sql +0 -0
  442. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/021_webhook_events.sql +0 -0
  443. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/022_devx_agent_managed.sql +0 -0
  444. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/022_devx_agent_managed_down.sql +0 -0
  445. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/023_devx_p1_gate.sql +0 -0
  446. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/023_devx_p1_gate_down.sql +0 -0
  447. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/024_chat_messages.sql +0 -0
  448. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/024_pr_conversation_id.sql +0 -0
  449. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/024_task_indexes.sql +0 -0
  450. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/024_task_indexes_down.sql +0 -0
  451. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/025_audit_log.sql +0 -0
  452. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/026_agent_tokens.sql +0 -0
  453. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/027_teams_auth_phase_b.sql +0 -0
  454. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/028_learnings.sql +0 -0
  455. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/029_team_roles.sql +0 -0
  456. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/030_finder_pins.sql +0 -0
  457. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/031_pr_deploy_status.sql +0 -0
  458. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/032_task_reminders.sql +0 -0
  459. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/033_events_retry_count.sql +0 -0
  460. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/033_session_owner.sql +0 -0
  461. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/034_notifications.sql +0 -0
  462. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/035_shared_links.sql +0 -0
  463. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/036_session_index_upgrade.sql +0 -0
  464. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/037_pr_approval.sql +0 -0
  465. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/038_pr_submitted_by.sql +0 -0
  466. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/039_push_subscriptions.sql +0 -0
  467. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/040_semantic_search.sql +0 -0
  468. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/041_workspaces.sql +0 -0
  469. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/042_oidc_providers.sql +0 -0
  470. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/043_ci_checks.sql +0 -0
  471. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/044_agent_metrics.sql +0 -0
  472. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/045_documents_doc_type.sql +0 -0
  473. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/046_salience.sql +0 -0
  474. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/047_seed_missing_agents.sql +0 -0
  475. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/048_fix_agent_paths_roles.sql +0 -0
  476. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/049_agent_role_and_learnings_schema.sql +0 -0
  477. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/050_session_provider.sql +0 -0
  478. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/051_session_launch_profile.sql +0 -0
  479. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/052_session_theme_mode.sql +0 -0
  480. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/052_task_kind.sql +0 -0
  481. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/053_inbox_items.sql +0 -0
  482. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/054_inbox_triage_contract.sql +0 -0
  483. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/055_inbox_topic_treatment.sql +0 -0
  484. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/056_inbox_treatment_read_save.sql +0 -0
  485. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/057_session_theme_mode_backfill.sql +0 -0
  486. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/058_inbox_item_status_lifecycle.sql +0 -0
  487. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/059_inbox_tldr_and_source_scores.sql +0 -0
  488. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/060_newsletter.sql +0 -0
  489. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/061_inbox_redesign.sql +0 -0
  490. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/062_fix_inbox_sources_backfill.sql +0 -0
  491. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/063_task_completion_mode.sql +0 -0
  492. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/064_judge_mode_setting.sql +0 -0
  493. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/065_knowledge_graph_spike.sql +0 -0
  494. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/066_digest_ranking_inputs.sql +0 -0
  495. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/066_kg_artifact_nodes.sql +0 -0
  496. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/067_inbox_digest_selections.sql +0 -0
  497. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/067_kg_temporal.sql +0 -0
  498. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/068_inbox_digest_app_settings.sql +0 -0
  499. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/068_kg_touch_counter.sql +0 -0
  500. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/069_kg_doc_types.sql +0 -0
  501. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/070_digest_ranking_inputs_recovery.sql +0 -0
  502. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/071_inbox_digest_selections_recovery.sql +0 -0
  503. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/072_inbox_digest_app_settings_recovery.sql +0 -0
  504. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/073_kg_cross_project.sql +0 -0
  505. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/073_kg_cross_project_down.sql +0 -0
  506. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/074_kg_infra_types.sql +0 -0
  507. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/074_kg_infra_types_down.sql +0 -0
  508. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/075_kg_file_state_recovery.sql +0 -0
  509. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/075_kg_file_state_recovery_down.sql +0 -0
  510. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/076_kg_watcher_state.sql +0 -0
  511. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/076_kg_watcher_state_down.sql +0 -0
  512. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/077_kg_doc_types_extend.sql +0 -0
  513. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/077_kg_doc_types_extend_down.sql +0 -0
  514. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/078_kg_fts5_down.sql +0 -0
  515. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/079_kg_missing_indexes.sql +0 -0
  516. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/079_kg_missing_indexes_down.sql +0 -0
  517. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/080_kg_fts5_extended.sql +0 -0
  518. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/080_kg_fts5_extended_down.sql +0 -0
  519. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/081_kg_lens_indexes.sql +0 -0
  520. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/081_kg_lens_indexes_down.sql +0 -0
  521. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/082_kg_pins.sql +0 -0
  522. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/082_kg_pins_down.sql +0 -0
  523. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/083_kg_graph_nodes_degree.sql +0 -0
  524. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/083_kg_graph_nodes_degree_down.sql +0 -0
  525. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/084_drop_legacy_scheduler_tables.sql +0 -0
  526. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/084_drop_legacy_scheduler_tables_down.sql +0 -0
  527. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/085_kg_edge_resolves_to.sql +0 -0
  528. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/085_kg_edge_resolves_to_down.sql +0 -0
  529. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/086_project_status_updates_feed.sql +0 -0
  530. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/086_project_status_updates_feed_down.sql +0 -0
  531. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/087_session_metrics_dual.sql +0 -0
  532. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/087_session_metrics_dual_down.sql +0 -0
  533. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/088_rename_context_pct_legacy.sql +0 -0
  534. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/088_rename_context_pct_legacy_down.sql +0 -0
  535. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/089_session_metrics_equivalent_cost.sql +0 -0
  536. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/089_session_metrics_equivalent_cost_down.sql +0 -0
  537. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/090_kg_inbox_node_type.sql +0 -0
  538. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/090_kg_inbox_node_type_down.sql +0 -0
  539. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/091_kg_inbox_node_type_check.sql +0 -0
  540. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/091_kg_inbox_node_type_check_down.sql +0 -0
  541. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/092_sessions_activity_state_ts.sql +0 -0
  542. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/092_sessions_activity_state_ts_down.sql +0 -0
  543. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/093_sessions_activity_state_column.sql +0 -0
  544. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/093_sessions_activity_state_column_down.sql +0 -0
  545. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/094_ingest_pending.sql +0 -0
  546. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/094_ingest_pending_down.sql +0 -0
  547. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/095_kg_intent_first_down.sql +0 -0
  548. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/096_kg_xlsx_artifact_prefix.sql +0 -0
  549. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/096_kg_xlsx_artifact_prefix_down.sql +0 -0
  550. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/097_ingest_change_history.sql +0 -0
  551. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/097_ingest_change_history_down.sql +0 -0
  552. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/098_kg_node_type_business.sql +0 -0
  553. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/098_kg_node_type_business_down.sql +0 -0
  554. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/099_kg_edges_restore_weight.sql +0 -0
  555. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/099_kg_edges_restore_weight_down.sql +0 -0
  556. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/100_kg_enriched_at.sql +0 -0
  557. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/100_kg_enriched_at_down.sql +0 -0
  558. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/101_local_llm_shadow_comparisons.sql +0 -0
  559. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/101_local_llm_shadow_comparisons_down.sql +0 -0
  560. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/102_promote_llm_costs.sql +0 -0
  561. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/102_promote_llm_costs_down.sql +0 -0
  562. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/103_ingest_skipped_log.sql +0 -0
  563. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/103_ingest_skipped_log_down.sql +0 -0
  564. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/120_docs_governance.sql +0 -0
  565. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/120_docs_governance_down.sql +0 -0
  566. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/121_notification_event_fk_cleanup.sql +0 -0
  567. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/121_notification_event_fk_cleanup_down.sql +0 -0
  568. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/122_docs_drift_history.sql +0 -0
  569. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/122_docs_drift_history_down.sql +0 -0
  570. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/123_ingest_parser_waiting_status.sql +0 -0
  571. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/123_ingest_parser_waiting_status_down.sql +0 -0
  572. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/124_heypocket_recordings.sql +0 -0
  573. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/124_heypocket_recordings_down.sql +0 -0
  574. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/125_kg_node_type_record.sql +0 -0
  575. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/125_kg_node_type_record_down.sql +0 -0
  576. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/126_ingest_terminal_upload_source_kind.sql +0 -0
  577. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/126_ingest_terminal_upload_source_kind_down.sql +0 -0
  578. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/127_brain_v1_substrate.sql +0 -0
  579. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/127_brain_v1_substrate_down.sql +0 -0
  580. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/128_brain_drift_signals.sql +0 -0
  581. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/128_brain_drift_signals_down.sql +0 -0
  582. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/129_brain_memory_operations.sql +0 -0
  583. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/129_brain_memory_operations_down.sql +0 -0
  584. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/130_brain_findings.sql +0 -0
  585. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/130_brain_findings_down.sql +0 -0
  586. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/132_kg_pr_modifies.sql +0 -0
  587. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/132_kg_pr_modifies_down.sql +0 -0
  588. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/133_brain_v1_2_direction_schema.sql +0 -0
  589. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/133_brain_v1_2_direction_schema_down.sql +0 -0
  590. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/134_brain_journal_narrative_polished.sql +0 -0
  591. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/134_brain_journal_narrative_polished_down.sql +0 -0
  592. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/135_kg_edges_provider.sql +0 -0
  593. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/136_documents_fts.sql +0 -0
  594. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/137_promote_llm_costs.sql +0 -0
  595. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/137_promote_llm_costs_down.sql +0 -0
  596. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/138_ingest_api_keys.sql +0 -0
  597. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/138_ingest_api_keys_down.sql +0 -0
  598. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/139_ingest_pending_ingress.sql +0 -0
  599. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/139_ingest_pending_ingress_down.sql +0 -0
  600. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/140_ingest_idempotency_quota.sql +0 -0
  601. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/140_ingest_idempotency_quota_down.sql +0 -0
  602. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/141_ingest_pending_metadata.sql +0 -0
  603. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/141_ingest_pending_metadata_down.sql +0 -0
  604. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/142_llm_function_config.sql +0 -0
  605. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/142_llm_function_config_down.sql +0 -0
  606. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/143_kg_code_embeddings.sql +0 -0
  607. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/143_kg_code_embeddings_down.sql +0 -0
  608. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/144_notifications_pending_sync_index.sql +0 -0
  609. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/145_audit_log_immutable.sql +0 -0
  610. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/145_audit_log_immutable_down.sql +0 -0
  611. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/migrations/__init__.py +0 -0
  612. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/projects/_template/project.yaml +0 -0
  613. {marvisx_cli-0.2.2 → marvisx_cli-0.3.5}/setup.cfg +0 -0
@@ -9,4 +9,5 @@
9
9
  recursive-include migrations *.sql
10
10
  recursive-include core/scripts/install_hooks *.sh *.json *.py
11
11
  recursive-include core/api/templates *.md *.j2
12
+ recursive-include core/api/mcp/tools/workflow_playbooks *.md
12
13
  recursive-include projects/_template *
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: marvisx-cli
3
- Version: 0.2.2
3
+ Version: 0.3.5
4
4
  Summary: MarvisX OSS — agent-native company-brain CLI runtime (init, status, brief, triage)
5
5
  Author: MarvisX maintainers
6
6
  License: BSL-1.1
@@ -36,7 +36,6 @@ Requires-Dist: fastapi>=0.115.0
36
36
  Requires-Dist: slowapi>=0.1.9
37
37
  Requires-Dist: cachetools>=5.3.0
38
38
  Requires-Dist: uvicorn[standard]>=0.34.0
39
- Requires-Dist: uvloop>=0.21.0
40
39
  Requires-Dist: aiosqlite>=0.20.0
41
40
  Requires-Dist: PyJWT>=2.10.0
42
41
  Requires-Dist: bcrypt>=4.2.0
@@ -58,9 +58,9 @@ docker compose up -d
58
58
 
59
59
  The Console becomes available on the configured `CONSOLE_PORT` and the API on the configured `API_PORT`. Detailed first-run instructions are inside the deployment template.
60
60
 
61
- ## Embedding migration from a managed provider
61
+ ## Setting up local embeddings
62
62
 
63
- If you currently run MarvisX with a managed embedding provider such as Voyage AI, [`docs/MIGRATION-FROM-VOYAGE.md`](docs/MIGRATION-FROM-VOYAGE.md) covers the step-by-step path to the self-hosted Granite backend, including the re-index, KG threshold recalibration, and rollback procedure.
63
+ [`docs/MIGRATION-TO-LOCAL-EMBEDDINGS.md`](docs/MIGRATION-TO-LOCAL-EMBEDDINGS.md) covers the step-by-step path to the self-hosted Granite backend, including first-boot setup, re-indexing an existing corpus, and KG threshold recalibration.
64
64
 
65
65
  ## MCP surface
66
66
 
@@ -74,14 +74,14 @@ The MCP server runs in-process: it calls the same use_cases the HTTP API calls,
74
74
 
75
75
  Audit is still recorded: the extracted use_cases write the audit log themselves (`core/api/use_cases/{tasks,pull_requests,audit}.py`), so a mutation issued through MCP still produces an audit row at the use_case level. What is lost is only the additional HTTP-surface chokepoint.
76
76
 
77
- Setting `MARVIS_OSS_LOCAL=1` (truthy: `1`/`true`/`yes`/`on`) makes the `block-db-direct-write` safety rule **advisory** — direct writes to a PiR 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.
77
+ Setting `MARVIS_OSS_LOCAL=1` (truthy: `1`/`true`/`yes`/`on`) makes the `block-db-direct-write` safety rule **advisory** — direct writes to a Marvis SQLite database are allowed with a warning instead of being blocked. When the variable is unset or falsey the rule is unchanged: direct DB writes are blocked fail-closed, exactly as in the managed deployment. This trade-off is intentional for single-user self-hosting and never weakens the default.
78
78
 
79
79
  **No-fork guarantee.** The HTTP API and the MCP server are not two implementations: both are thin adapters over the same `core/api/use_cases`, differing only in how they fill the per-call `CallerContext`. The proof is the API test suite staying green after the extraction — the same behaviour, exercised through the HTTP surface, over the identical use_cases the MCP server calls.
80
80
 
81
81
  ## Documentation
82
82
 
83
83
  - [`docs/SEARCH-QUALITY.md`](docs/SEARCH-QUALITY.md) — search quality expectations, affected workflows, and mitigations
84
- - [`docs/MIGRATION-FROM-VOYAGE.md`](docs/MIGRATION-FROM-VOYAGE.md) — migration from managed embeddings to Granite
84
+ - [`docs/MIGRATION-TO-LOCAL-EMBEDDINGS.md`](docs/MIGRATION-TO-LOCAL-EMBEDDINGS.md) — setting up the self-hosted Granite embedding backend
85
85
  - [`docs/solutions/architecture-patterns/`](docs/solutions/architecture-patterns/) — architectural decision records
86
86
 
87
87
  ## Contributing
@@ -38,7 +38,9 @@ async def list_agent_managed_sessions() -> list[SessionInfo]:
38
38
  import urllib.request
39
39
  from core.api.config import settings as cfg
40
40
  token = cfg.tasks_api_token if hasattr(cfg, "tasks_api_token") else os.environ.get("TASKS_API_TOKEN", "")
41
- api_base = os.environ.get("PIR_INTERNAL_BASE", "http://localhost:8100")
41
+ api_base = os.environ.get("MARVIS_INTERNAL_BASE") or os.environ.get(
42
+ "PIR_INTERNAL_BASE", "http://localhost:8100"
43
+ )
42
44
  try:
43
45
  req = urllib.request.Request(
44
46
  f"{api_base}/api/v1/sessions?agent_managed=true",
@@ -40,22 +40,38 @@ class Settings(BaseSettings):
40
40
  populate_by_name=True,
41
41
  )
42
42
 
43
- pir_env: str = "development"
43
+ pir_env: str = Field(
44
+ default="development",
45
+ validation_alias=AliasChoices("MARVIS_ENV", "PIR_ENV"),
46
+ )
44
47
  # Free-form tenant identifier. Default "core" (OSS). Deploy bundles set
45
48
  # DEPLOY_MODE to their own tenant slug via .env; no tenant names are
46
49
  # hard-coded in core.
47
50
  deploy_mode: str = Field(default="core", alias="DEPLOY_MODE")
48
- pir_instance: str = Field(default="prod", alias="PIR_INSTANCE")
51
+ pir_instance: str = Field(
52
+ default="prod",
53
+ validation_alias=AliasChoices("MARVIS_INSTANCE", "PIR_INSTANCE"),
54
+ )
49
55
  marvisx_phase: Literal["A", "B", "C", "D"] = Field(
50
56
  default="A", alias="MARVISX_PHASE"
51
57
  )
52
- pir_canary_banner: bool = Field(default=False, alias="PIR_CANARY_BANNER")
53
- pir_voyage_disabled: bool = Field(default=False, alias="PIR_VOYAGE_DISABLED")
54
- pir_jwt_secret: str = "dev-secret-change-in-production"
55
- pir_admin_password_hash: str = ""
58
+ pir_canary_banner: bool = Field(
59
+ default=False,
60
+ validation_alias=AliasChoices("MARVIS_CANARY_BANNER", "PIR_CANARY_BANNER"),
61
+ )
62
+ pir_jwt_secret: str = Field(
63
+ default="dev-secret-change-in-production",
64
+ validation_alias=AliasChoices("MARVIS_JWT_SECRET", "PIR_JWT_SECRET"),
65
+ )
66
+ pir_admin_password_hash: str = Field(
67
+ default="",
68
+ validation_alias=AliasChoices(
69
+ "MARVIS_ADMIN_PASSWORD_HASH", "PIR_ADMIN_PASSWORD_HASH"
70
+ ),
71
+ )
56
72
  db_path: str = Field(
57
73
  default="console.db",
58
- validation_alias=AliasChoices("PIR_DB_PATH", "DB_PATH"),
74
+ validation_alias=AliasChoices("MARVIS_DB_PATH", "PIR_DB_PATH", "DB_PATH"),
59
75
  )
60
76
  cookie_domain: str | None = Field(default=None, alias="COOKIE_DOMAIN")
61
77
  cors_origins_prod: list[str] = Field(
@@ -83,6 +99,16 @@ class Settings(BaseSettings):
83
99
  brain_run_off_peak_only: bool = Field(
84
100
  default=False, alias="BRAIN_RUN_OFF_PEAK_ONLY"
85
101
  )
102
+ # Warehouse consolidation pass (full-store learning dedup, ships DORMANT).
103
+ # Unlike memory_ops M2 (same-cycle only), this scans the WHOLE learnings
104
+ # warehouse and PROPOSES consolidation of cross-cycle duplicates. Default
105
+ # FALSE — a human enables it after reviewing. Daily cadence guard.
106
+ brain_warehouse_consolidation_enabled: bool = Field(
107
+ default=False, alias="BRAIN_WAREHOUSE_CONSOLIDATION_ENABLED"
108
+ )
109
+ brain_warehouse_consolidation_interval_seconds: int = Field(
110
+ default=86400, alias="BRAIN_WAREHOUSE_CONSOLIDATION_INTERVAL_SECONDS"
111
+ )
86
112
 
87
113
  # GitHub Webhook
88
114
  github_webhook_secret: str = ""
@@ -401,9 +427,6 @@ class Settings(BaseSettings):
401
427
  # WIP limit: max tasks in_progress per project (doc/none tasks count as 0.5)
402
428
  wip_max_in_progress: int = 3
403
429
 
404
- # Voyage AI embeddings
405
- voyage_api_key: str = ""
406
-
407
430
  # sqlite-vec: env VEC0_PATH → sqlite_vec.loadable_path() → prod fallback.
408
431
  vec0_path: str = Field(
409
432
  default_factory=_default_vec0_path,
@@ -740,18 +740,26 @@ def _seed_users_and_migrate_owner(conn: sqlite3.Connection) -> None:
740
740
  install seeds no hardcoded name. On an existing deployment this seed is
741
741
  skipped (users already exist), so the defaults never affect a running install.
742
742
  """
743
- # Prefer pre-hashed password (production .env has PIR_ADMIN_PASSWORD_HASH)
744
- hashed = os.environ.get("PIR_ADMIN_PASSWORD_HASH", "").strip()
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
- pir_password = os.environ.get("PIR_PASSWORD", "").strip()
749
- if not pir_password:
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 PIR_ADMIN_PASSWORD_HASH or PIR_PASSWORD env var "
752
- "to seed the admin user. Set at least one in .env."
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(pir_password.encode("utf-8"), bcrypt.gensalt()).decode()
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 + Voyage init in lifespan + orphan proxy cleanup
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 PiR API (env=%s)", settings.pir_env)
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
- # Voyage AI client for embeddings
1113
- from core.api.services.embedding_service import init_voyage_client
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
- if settings.pir_voyage_disabled:
1116
- logger.info("[canary] skipping Voyage client initialization")
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
- init_voyage_client()
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 PiR API",
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 PiR web)
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/Voyage call) runs OUTSIDE
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("pir")`` instance exposes the PiR tools, each calling the
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("pir")
37
+ mcp = FastMCP("marvis")
38
38
 
39
39
  register_all(mcp)
40
40
 
@@ -47,11 +47,35 @@ def main() -> None:
47
47
  ``graph_*`` reach the SAME SQLite file the ``marvis`` CLI uses (instead of the
48
48
  bare ``db_path='console.db'`` default). Best-effort: no settings file → the
49
49
  API defaults / ``$PIR_DB_PATH`` env stand (parity with the CLI runtime).
50
+
51
+ Then open the DB the SAME way the FastAPI lifespan does — ``init_pool()``
52
+ creates the read-only pool AND the single dedicated writer. This is NOT
53
+ optional for write tools: ``acquire_db()`` has a no-pool fallback (so reads
54
+ answer even if the pool is absent), but ``acquire_write_db()`` raises
55
+ ``"DB not initialized — call init_pool() first"`` when the writer is None.
56
+ Without this, every mutator (``create_task``, ``update_task``, ...) failed —
57
+ the agent could read the brain via MCP but never write it back.
58
+
59
+ init + serve + close run in ONE event loop: aiosqlite connections are bound
60
+ to the running loop, so opening the pool in a separate ``asyncio.run()`` pass
61
+ before ``mcp.run()`` would leave the writer attached to an already-closed loop.
50
62
  """
63
+ import asyncio
64
+
65
+ from core.api.config import settings
66
+ from core.api.db import close_pool, init_pool
51
67
  from core.api.runtime_settings import apply_marvis_settings
52
68
 
53
69
  apply_marvis_settings()
54
- mcp.run()
70
+
71
+ async def _serve() -> None:
72
+ await init_pool(size=settings.db_pool_size)
73
+ try:
74
+ await mcp.run_stdio_async()
75
+ finally:
76
+ await close_pool()
77
+
78
+ asyncio.run(_serve())
55
79
 
56
80
 
57
81
  if __name__ == "__main__":
@@ -35,6 +35,7 @@ from . import (
35
35
  safety,
36
36
  search,
37
37
  tasks,
38
+ workflows,
38
39
  )
39
40
 
40
41
  #: Ordered registration callables. ``server.py`` iterates this so adding a new
@@ -50,6 +51,7 @@ REGISTRARS = (
50
51
  ingest.register,
51
52
  pull_requests.register,
52
53
  safety.register,
54
+ workflows.register,
53
55
  )
54
56
 
55
57
 
@@ -391,7 +391,7 @@ def register(mcp) -> None:
391
391
  ) -> dict[str, Any]:
392
392
  """Get apply GUIDANCE for an approved memory operation (NO write — sub-03 §11.1).
393
393
 
394
- QUANDO USARLO: dopo aver `approved` un'operazione (via brain_memory_operations_patch), per ottenere `next_action.tool` (es. mcp__pir__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.
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. mcp__pir__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__pir__create_learning.
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 mcp__pir__graph_capabilities. Evita hardcoding constants. Schema_version aumenta quando i Literal cambiano.
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 LOCAL_CTX, acquire_db, acquire_write_db, dump, raise_mcp_error
25
+ from core.api.mcp._adapter import (
26
+ LOCAL_CTX,
27
+ acquire_db,
28
+ acquire_write_db,
29
+ dump,
30
+ mcp_embed_learning,
31
+ raise_mcp_error,
32
+ )
26
33
  from core.api.use_cases import learnings as learnings_uc
27
34
  from core.api.use_cases._errors import ServiceError
28
35
 
@@ -85,7 +92,20 @@ def register(mcp) -> None:
85
92
  tags=tags,
86
93
  project=project,
87
94
  )
88
- return dump(result)
95
+ # Writer lock released: embed-on-write. On a local Granite backend this
96
+ # awaits inline (synchronous) so the learning is immediately retrievable by
97
+ # meaning — not just by keyword until a manual reindex (the bug this fixes).
98
+ await mcp_embed_learning(
99
+ learning_id=result.id,
100
+ title=result.title,
101
+ description=result.description,
102
+ category=result.category,
103
+ severity=result.severity,
104
+ prevention=result.prevention,
105
+ project=result.project,
106
+ workspace_id=LOCAL_CTX.workspace_id,
107
+ )
108
+ return dump(result)
89
109
  except ServiceError as e:
90
110
  raise_mcp_error(e)
91
111
 
@@ -142,3 +162,21 @@ def register(mcp) -> None:
142
162
  return dump(result)
143
163
  except ServiceError as e:
144
164
  raise_mcp_error(e)
165
+
166
+ @mcp.tool()
167
+ async def delete_learning(
168
+ learning_id: Annotated[str, Field(min_length=1)],
169
+ ) -> dict[str, Any]:
170
+ """Permanently remove a learning from the Marvis DB (non-recoverable) + prune the search index.
171
+
172
+ QUANDO USARLO: solo per learning duplicati, spam, o entry chiaramente invalide. Hard delete: rimuove anche il mirror nell'indice di ricerca (documents + vec_documents + FTS) cosi' il learning smette di comparire in search/check_learnings.
173
+ QUANDO NON USARLO: NOT per archiviare un learning ancora valido — la cancellazione e' permanente e perde la history. Aggiornalo con update_learning se il contenuto e' obsoleto.
174
+ RESTITUISCE: {deleted: true} o 404 se non esiste."""
175
+ try:
176
+ async with acquire_write_db(label="mcp.delete_learning") as db:
177
+ await learnings_uc.delete_learning(
178
+ LOCAL_CTX, db, learning_id=learning_id
179
+ )
180
+ return {"deleted": True}
181
+ except ServiceError as e:
182
+ raise_mcp_error(e)
@@ -39,7 +39,7 @@ def register(mcp) -> None:
39
39
 
40
40
  @mcp.tool()
41
41
  async def list_projects() -> list[dict[str, Any]]:
42
- """List all PiR-tracked projects grouped by program.
42
+ """List all Marvis-tracked projects grouped by program.
43
43
 
44
44
  QUANDO USARLO: serve un inventario (quali progetti ci sono, dammi tutti gli slug) o non conosci lo slug target.
45
45
  QUANDO NON USARLO: NOT quando hai gia' uno slug specifico e vuoi i dettagli -> usa get_project. NOT per cold-start di un progetto -> usa session_brief.
@@ -79,7 +79,7 @@ def register(mcp) -> None:
79
79
  ) -> dict[str, Any]:
80
80
  """Atomic create branch + worktree + draft PR (orchestrator-managed).
81
81
 
82
- QUANDO USARLO: hai un task approved/in_progress e ti serve un worktree isolato per iniziare a lavorare. Un'unica call crea branch `feat/task-{uuid}`, worktree in `~/dev/task-{uuid}`, e draft PR row in PiR. Preferisci su `git worktree add` manuale + register_branch (2-step flow).
82
+ QUANDO USARLO: hai un task approved/in_progress e ti serve un worktree isolato per iniziare a lavorare. Un'unica call crea branch `feat/task-{uuid}`, worktree in `~/dev/task-{uuid}`, e draft PR row in Marvis. Preferisci su `git worktree add` manuale + register_branch (2-step flow).
83
83
  QUANDO NON USARLO: NOT se il worktree esiste gia' (creato manualmente o fuori orchestrator) -> usa register_branch per attaccarlo al task. NOT se il task non e' ancora approved -> il backend risponde 400.
84
84
  RESTITUISCE: {task_id, branch_name, worktree_path, status:'draft'} idempotent."""
85
85
  try:
@@ -97,8 +97,8 @@ def register(mcp) -> None:
97
97
  ) -> dict[str, Any]:
98
98
  """Attach an existing git branch/worktree to a task as draft PR record (idempotent).
99
99
 
100
- QUANDO USARLO: il worktree e' stato creato manualmente via `git worktree add` o fuori orchestrator, e serve la PR row PiR per poter chiamare submit_pr dopo. BOUNDARY: register_branch crea draft; submit_pr promuove draft -> open per review.
101
- QUANDO NON USARLO: NOT quando vuoi che PiR crei il worktree per te -> usa endpoint HTTP /api/v1/pull_requests/{task_id}/branch. NOT dopo submit -> il record e' gia' open.
100
+ QUANDO USARLO: il worktree e' stato creato manualmente via `git worktree add` o fuori orchestrator, e serve la PR row Marvis per poter chiamare submit_pr dopo. BOUNDARY: register_branch crea draft; submit_pr promuove draft -> open per review.
101
+ QUANDO NON USARLO: NOT quando vuoi che Marvis crei il worktree per te -> usa endpoint HTTP /api/v1/pull_requests/{task_id}/branch. NOT dopo submit -> il record e' gia' open.
102
102
  RESTITUISCE: {task_id, branch_name, worktree_path, status:'draft'} idempotent."""
103
103
  try:
104
104
  async with acquire_write_db() as db:
@@ -5,7 +5,7 @@ The Node ``check_safety`` SHELLS ``python3 scripts/safety_bridge.py check
5
5
  --action-type <t> [--file-path ...] [--command ...] [--cwd ...]`` and parses the
6
6
  ``{allowed, reason, rule}`` JSON it prints. ``core/scripts/safety_bridge.py`` is
7
7
  pure stdlib (``argparse`` / ``json`` / ``re`` / ``shlex`` / ``subprocess`` for the
8
- git/npm checks) — it has ZERO fastapi and ZERO PiR-app dependency. So the in-process
8
+ git/npm checks) — it has ZERO fastapi and ZERO Marvis-app dependency. So the in-process
9
9
  port imports the bridge's ``evaluate_action`` (the exact function ``_run_check``
10
10
  calls) DIRECTLY: no subprocess, no ``python3`` re-exec, no HTTP. The returned
11
11
  ``Decision`` is mapped to the SAME ``{allowed, reason, rule}`` dict shape the Node
@@ -22,7 +22,7 @@ Name mapping (Node tool name -> use_case function):
22
22
  The embedding/hybrid services are pulled FUNCTION-LOCALLY by the use_case itself
23
23
  (``hybrid_search`` / ``embedding_service``), so nothing fastapi-bound is imported
24
24
  at module load. ``search`` raises ``ServiceUnavailableError`` (-> raise_mcp_error)
25
- when Voyage is down — the 503 collapses to the MCP error result shape.
25
+ when the embedding backend is down — the 503 collapses to the MCP error result shape.
26
26
 
27
27
  Return typing: ``search`` returns the ``SearchResponse`` DTO (``.model_dump()`` via
28
28
  ``dump()``); ``reindex`` returns a plain status dict.
@@ -49,11 +49,11 @@ def register(mcp) -> None:
49
49
  async def search(
50
50
  q: Annotated[str, Field(min_length=1, max_length=500)],
51
51
  ) -> dict[str, Any]:
52
- """Semantic embedding-based search across tasks + projects + files + handoffs + learnings.
52
+ """Semantic + hybrid search by MEANING across tasks, projects, files, handoffs, learnings, inbox, audits. Fuses the embedding retriever with the Knowledge Graph (RRF).
53
53
 
54
- QUANDO USARLO: natural-language discovery cross-type quando non conosci keyword esatte o doc_type (es. 'dove abbiamo parlato di caching Redis?'). Score > 0.6 generalmente rilevante.
55
- QUANDO NON USARLO: NOT per singolo artifact noto per ID -> usa get_task / list_handoffs con filtri. NOT per keyword exact-match -> usa search_handoffs. NOT per doc_type specifico con filtri -> usa list_tasks.
56
- RESTITUISCE: {tasks[], projects[], files[], handoffs[], learnings[], total, query} ranked per (70% Voyage similarity + 30% salience). 503 se Voyage non disponibile."""
54
+ QUANDO USARLO: PRIMA scelta per domande trasversali o concettuali ('dove abbiamo parlato di caching Redis?', 'decisioni sul rollback', 'cosa dipende da X'): trova per significato anche senza le keyword esatte. Alza il tetto: usala invece di fermarti al primo summary o a una lista filtrata. Score > 0.6 generalmente rilevante.
55
+ QUANDO NON USARLO: NOT per un artifact noto per ID -> usa get_task / get_handoff. NOT per un filtro esatto su un solo doc_type -> usa list_tasks / list_handoffs. NOT per keyword literal su un handoff -> usa search_handoffs.
56
+ RESTITUISCE: {tasks[], projects[], files[], handoffs[], learnings[], total, query} ranked per (70% similarita semantica + 30% salience) + semantic_available (bool|None) + semantic_reason (enum|None: model-not-loadable/vec0-not-loadable/runtime-gate). Se semantic_available=false la lane semantica e' giu' e i risultati sono solo keyword. 503 se il motore di embedding non e' disponibile."""
57
57
  # The use_case takes only `ctx`: it opens its own connections from
58
58
  # settings (db_path / vec0_path) and pulls hybrid_search / embedding_service
59
59
  # function-locally — so the MCP path stays fastapi-free at import.
@@ -65,7 +65,7 @@ def register(mcp) -> None:
65
65
 
66
66
  @mcp.tool()
67
67
  async def reindex(type: ReindexType = "all") -> dict[str, Any]:
68
- """Rebuild Voyage embeddings index for semantic search backend.
68
+ """Rebuild the embeddings index for the semantic search backend.
69
69
 
70
70
  QUANDO USARLO: solo dopo bulk ops che bypassano i normali hook (direct SQL insert, file-sync script, migration) se noti search stale. Operator+.
71
71
  QUANDO NON USARLO: NOT routinely — l'index e' auto-sync su create/update normali. NOT su errori transient di search -> aspetta background reconcile.
@@ -137,7 +137,7 @@ def register(mcp) -> None:
137
137
  delegation: TaskDelegation | None = None,
138
138
  completion_mode: TaskCompletionMode = "pr",
139
139
  ) -> dict[str, Any]:
140
- """Persist a new cross-session task in PiR DB (survives session end, visible in Console Triage).
140
+ """Persist a new cross-session task in Marvis DB (survives session end, visible in Console Triage).
141
141
 
142
142
  QUANDO USARLO: PRIMA AZIONE per ogni lavoro implementativo (feat/fix/refactor/research) — richiesto da Constitution Rule 1 prima di qualunque Edit/Write. SEMPRE con ICE-D (impact/confidence/ease/delegation).
143
143
  QUANDO NON USARLO: NOT per modificare un task esistente -> usa update_task. NOT per free chat/brainstorm (session-first).
@@ -189,7 +189,7 @@ def register(mcp) -> None:
189
189
  delegation: TaskDelegation | None = None,
190
190
  completion_mode: TaskCompletionMode | None = None,
191
191
  ) -> dict[str, Any]:
192
- """Mutate an existing PiR task (status, priority, description, tags, ICE-D, completion_mode).
192
+ """Mutate an existing Marvis task (status, priority, description, tags, ICE-D, completion_mode).
193
193
 
194
194
  QUANDO USARLO: transizioni di stato lungo il lifecycle (pending -> approved -> in_progress -> review -> completed) o rifinitura scoring/description dopo creazione.
195
195
  QUANDO NON USARLO: NOT per creare un nuovo task -> usa create_task. NOT per delete permanente -> usa delete_task. Status='approved' e' BLOCCATO per agent (403) — solo umani approvano via Console Triage.
@@ -231,7 +231,7 @@ def register(mcp) -> None:
231
231
  async def delete_task(
232
232
  task_id: Annotated[str, Field(min_length=1)],
233
233
  ) -> dict[str, Any]:
234
- """Permanently remove a task from the PiR DB (non-recoverable).
234
+ """Permanently remove a task from the Marvis DB (non-recoverable).
235
235
 
236
236
  QUANDO USARLO: solo per spam/duplicate o entry chiaramente invalidi.
237
237
  QUANDO NON USARLO: NOT per abbandonare un task valido -> usa update_task con status='rejected' o 'failed' (preserva audit trail). Deletion cancella la history.