marvisx-cli 0.2.3__tar.gz → 0.3.6__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (617) hide show
  1. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/MANIFEST.in +1 -0
  2. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/PKG-INFO +2 -2
  3. marvisx_cli-0.3.6/README.md +122 -0
  4. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/agents/session_manager.py +3 -1
  5. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/config.py +46 -18
  6. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/db.py +15 -7
  7. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/main.py +13 -9
  8. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/mcp/_adapter.py +70 -1
  9. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/mcp/server.py +2 -2
  10. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/mcp/tools/__init__.py +2 -0
  11. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/mcp/tools/brain.py +4 -4
  12. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/mcp/tools/learnings.py +93 -2
  13. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/mcp/tools/projects.py +1 -1
  14. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/mcp/tools/pull_requests.py +3 -3
  15. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/mcp/tools/safety.py +1 -1
  16. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/mcp/tools/search.py +6 -6
  17. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/mcp/tools/tasks.py +3 -3
  18. marvisx_cli-0.3.6/core/api/mcp/tools/workflow_playbooks/brainstorm.md +72 -0
  19. marvisx_cli-0.3.6/core/api/mcp/tools/workflow_playbooks/compound.md +71 -0
  20. marvisx_cli-0.3.6/core/api/mcp/tools/workflow_playbooks/plan.md +69 -0
  21. marvisx_cli-0.3.6/core/api/mcp/tools/workflows.py +415 -0
  22. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/models/monitoring.py +1 -1
  23. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/models/search.py +15 -0
  24. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/models/tasks.py +1 -2
  25. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/routers/brain.py +3 -3
  26. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/routers/graph.py +1 -1
  27. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/routers/kg.py +1 -1
  28. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/routers/learnings.py +102 -2
  29. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/routers/projects.py +60 -1
  30. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/routers/search.py +1 -1
  31. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/routers/sessions.py +1 -1
  32. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/runtime_settings.py +69 -0
  33. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/security.py +3 -3
  34. marvisx_cli-0.3.6/core/api/services/_fts.py +32 -0
  35. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/brain/findings_reader.py +2 -2
  36. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/brain/jobs.py +167 -8
  37. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/brain/llm/direction_alignment.py +1 -1
  38. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/brain/memory_ops.py +4 -4
  39. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/brain/recap.py +1 -1
  40. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/brain/sources/__init__.py +1 -1
  41. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/brain/sources/pir_tasks.py +1 -1
  42. marvisx_cli-0.3.6/core/api/services/brain/warehouse_consolidate.py +227 -0
  43. marvisx_cli-0.3.6/core/api/services/embedding_backends/__init__.py +31 -0
  44. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/embedding_internal.py +162 -6
  45. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/embedding_service.py +474 -62
  46. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/git_ops.py +8 -8
  47. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/graph_service.py +4 -4
  48. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/inbox.py +77 -0
  49. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/inbox_tldr.py +2 -2
  50. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/ingest/embedding_router.py +11 -11
  51. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/ingest/insert_saga.py +14 -4
  52. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/ingest/llm/classification_context.py +7 -3
  53. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/ingest/llm/openai_nano.py +7 -3
  54. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/ingest/watcher.py +1 -1
  55. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/kg/hybrid_search.py +38 -8
  56. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/kg/pr_impact.py +1 -1
  57. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/metrics_collector.py +2 -2
  58. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/model_router.py +1 -1
  59. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/pr_impact_pipeline/dispatcher.py +1 -1
  60. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/tmux.py +0 -1
  61. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/webhook_service.py +3 -3
  62. marvisx_cli-0.3.6/core/api/tests/test_config_env_aliases.py +75 -0
  63. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/tests/test_git_ops_merge.py +25 -0
  64. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/use_cases/brain.py +1 -1
  65. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/use_cases/graph.py +5 -5
  66. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/use_cases/handoffs.py +2 -2
  67. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/use_cases/learnings.py +77 -0
  68. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/use_cases/search.py +95 -9
  69. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/use_cases/tasks.py +6 -6
  70. marvisx_cli-0.3.6/core/cli/_brain_opportunistic.py +136 -0
  71. marvisx_cli-0.3.6/core/cli/_brain_schedule.py +431 -0
  72. marvisx_cli-0.3.6/core/cli/_update_check.py +164 -0
  73. marvisx_cli-0.3.6/core/cli/marvis_brain.py +200 -0
  74. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/cli/marvis_doctor.py +222 -1
  75. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/cli/marvis_feedback.py +4 -5
  76. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/cli/marvis_governance.py +2 -2
  77. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/cli/marvis_init.py +184 -10
  78. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/cli/marvis_mcp.py +89 -47
  79. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/cli/marvis_telemetry.py +3 -8
  80. marvisx_cli-0.3.6/core/platform/__init__.py +177 -0
  81. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/scripts/_drift_check.py +3 -3
  82. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/scripts/install_hooks/safety_bridge.py +14 -14
  83. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/scripts/populate_artifacts.py +1 -1
  84. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/scripts/populate_cross_project.py +9 -6
  85. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/scripts/safety_bridge.py +14 -14
  86. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/telemetry/schema.py +1 -1
  87. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/wizard/byok_vault.py +5 -8
  88. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/wizard/defaults.py +7 -14
  89. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/marvisx_cli.egg-info/PKG-INFO +2 -2
  90. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/marvisx_cli.egg-info/SOURCES.txt +13 -1
  91. marvisx_cli-0.3.6/marvisx_cli.egg-info/entry_points.txt +3 -0
  92. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/marvisx_cli.egg-info/requires.txt +1 -1
  93. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/078_kg_fts5.sql +1 -1
  94. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/095_kg_intent_first.sql +1 -1
  95. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/pyproject.toml +20 -5
  96. marvisx_cli-0.2.3/README.md +0 -95
  97. marvisx_cli-0.2.3/core/api/services/ingest/retry_voyage.py +0 -88
  98. marvisx_cli-0.2.3/marvisx_cli.egg-info/entry_points.txt +0 -3
  99. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/LICENSE +0 -0
  100. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/__init__.py +0 -0
  101. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/agents/__init__.py +0 -0
  102. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/agents/session_health.py +0 -0
  103. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/bin/marvisx-state-hook.py +0 -0
  104. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/dependencies/__init__.py +0 -0
  105. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/dependencies/tenant.py +0 -0
  106. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/mcp/__init__.py +0 -0
  107. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/mcp/tools/graph.py +0 -0
  108. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/mcp/tools/handoffs.py +0 -0
  109. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/mcp/tools/ingest.py +0 -0
  110. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/middleware/__init__.py +0 -0
  111. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/middleware/tool_call_audit.py +0 -0
  112. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/models/__init__.py +0 -0
  113. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/models/auth.py +0 -0
  114. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/models/brain.py +0 -0
  115. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/models/common.py +0 -0
  116. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/models/costs.py +0 -0
  117. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/models/graph.py +0 -0
  118. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/models/graph_cosmo.py +0 -0
  119. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/models/graph_pr_impact.py +0 -0
  120. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/models/graph_ux.py +0 -0
  121. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/models/inbox.py +0 -0
  122. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/models/ingest_keys.py +0 -0
  123. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/models/kg.py +0 -0
  124. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/models/llm_config.py +0 -0
  125. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/models/projects.py +0 -0
  126. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/models/sessions.py +0 -0
  127. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/models/teams.py +0 -0
  128. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/models/users.py +0 -0
  129. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/observability/__init__.py +0 -0
  130. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/observability/tracing.py +0 -0
  131. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/paths.py +0 -0
  132. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/rate_limit.py +0 -0
  133. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/rbac.py +0 -0
  134. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/routers/__init__.py +0 -0
  135. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/routers/_adapter.py +0 -0
  136. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/routers/admin_pr_impact.py +0 -0
  137. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/routers/admin_settings.py +0 -0
  138. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/routers/agent.py +0 -0
  139. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/routers/agent_tokens.py +0 -0
  140. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/routers/app_settings.py +0 -0
  141. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/routers/audit.py +0 -0
  142. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/routers/auth.py +0 -0
  143. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/routers/bench.py +0 -0
  144. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/routers/brain_directions.py +0 -0
  145. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/routers/ci_checks.py +0 -0
  146. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/routers/comments.py +0 -0
  147. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/routers/costs.py +0 -0
  148. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/routers/docs_coverage.py +0 -0
  149. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/routers/docs_governance.py +0 -0
  150. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/routers/documents.py +0 -0
  151. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/routers/files.py +0 -0
  152. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/routers/finder.py +0 -0
  153. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/routers/handoffs.py +0 -0
  154. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/routers/inbox.py +0 -0
  155. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/routers/ingest_api_keys.py +0 -0
  156. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/routers/ingest_triage.py +0 -0
  157. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/routers/judge.py +0 -0
  158. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/routers/llm_config.py +0 -0
  159. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/routers/monitoring.py +0 -0
  160. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/routers/notifications.py +0 -0
  161. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/routers/pr_impact.py +0 -0
  162. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/routers/pull_requests.py +0 -0
  163. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/routers/push.py +0 -0
  164. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/routers/raci.py +0 -0
  165. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/routers/settings.py +0 -0
  166. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/routers/share_repo.py +0 -0
  167. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/routers/status_updates.py +0 -0
  168. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/routers/tags.py +0 -0
  169. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/routers/tasks.py +0 -0
  170. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/routers/teams.py +0 -0
  171. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/routers/terminal.py +0 -0
  172. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/routers/users.py +0 -0
  173. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/routers/webhooks.py +0 -0
  174. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/__init__.py +0 -0
  175. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/audit.py +0 -0
  176. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/auto_approval.py +0 -0
  177. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/brain/__init__.py +0 -0
  178. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/brain/baseline.py +0 -0
  179. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/brain/capabilities.py +0 -0
  180. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/brain/cascade_rollup.py +0 -0
  181. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/brain/compound_bridge.py +0 -0
  182. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/brain/cycle.py +0 -0
  183. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/brain/cycle_snapshot.py +0 -0
  184. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/brain/digest_collector.py +0 -0
  185. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/brain/direction.py +0 -0
  186. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/brain/drift.py +0 -0
  187. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/brain/drift_router.py +0 -0
  188. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/brain/edge_metrics.py +0 -0
  189. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/brain/events_reader.py +0 -0
  190. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/brain/findings.py +0 -0
  191. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/brain/journal.py +0 -0
  192. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/brain/knowledge_forms.py +0 -0
  193. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/brain/llm/__init__.py +0 -0
  194. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/brain/llm/_runner.py +0 -0
  195. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/brain/llm/base.py +0 -0
  196. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/brain/llm/cache.py +0 -0
  197. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/brain/llm/constants.py +0 -0
  198. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/brain/llm/factory.py +0 -0
  199. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/brain/llm/finding_reasoning.py +0 -0
  200. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/brain/llm/finding_summary.py +0 -0
  201. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/brain/llm/grounding.py +0 -0
  202. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/brain/llm/journal_polish.py +0 -0
  203. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/brain/llm/local_gateway.py +0 -0
  204. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/brain/llm/parsers.py +0 -0
  205. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/brain/llm/router_glue.py +0 -0
  206. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/brain/models.py +0 -0
  207. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/brain/owner_hint.py +0 -0
  208. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/brain/rules/__init__.py +0 -0
  209. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/brain/rules/_signals.py +0 -0
  210. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/brain/rules/dr1_activity_without_status.py +0 -0
  211. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/brain/rules/dr2_decision_without_adr.py +0 -0
  212. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/brain/rules/dr3_stale_open_loop.py +0 -0
  213. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/brain/rules/dr4_docs_governance_drift.py +0 -0
  214. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/brain/rules/dr5_playbook_changed.py +0 -0
  215. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/brain/rules/dr6_external_update_unpropagated.py +0 -0
  216. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/brain/rules/dr7_claimed_decision_gap.py +0 -0
  217. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/brain/rules/dr8_direction_misalignment.py +0 -0
  218. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/brain/runs_reader.py +0 -0
  219. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/brain/scope.py +0 -0
  220. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/brain/sources/base.py +0 -0
  221. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/brain/sources/git_kg.py +0 -0
  222. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/brain/sources/handoffs.py +0 -0
  223. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/brain/sources/ingestor.py +0 -0
  224. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/brain/sources/learnings.py +0 -0
  225. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/brain/watermarks.py +0 -0
  226. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/brain/ws_emitter.py +0 -0
  227. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/cc_tasks_reader.py +0 -0
  228. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/ci_service.py +0 -0
  229. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/claude_metrics.py +0 -0
  230. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/codex_metrics.py +0 -0
  231. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/conversation_reader.py +0 -0
  232. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/cost_service.py +0 -0
  233. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/crypto.py +0 -0
  234. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/docs_governance/__init__.py +0 -0
  235. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/docs_governance/confidence.py +0 -0
  236. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/docs_governance/config.py +0 -0
  237. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/docs_governance/enrichment.py +0 -0
  238. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/docs_governance/frontmatter_validator.py +0 -0
  239. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/docs_governance/hard_gates.py +0 -0
  240. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/docs_governance/triage_orchestrator.py +0 -0
  241. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/event_dispatcher.py +0 -0
  242. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/events.py +0 -0
  243. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/graph_cosmo_service.py +0 -0
  244. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/graph_ranker.py +0 -0
  245. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/inbox_digest.py +0 -0
  246. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/inbox_digest_deep_research.py +0 -0
  247. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/inbox_digest_jobs.py +0 -0
  248. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/inbox_gmail_sync.py +0 -0
  249. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/inbox_llm_classifier.py +0 -0
  250. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/inbox_source_identity.py +0 -0
  251. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/inbox_sources.py +0 -0
  252. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/inbox_taxonomy.py +0 -0
  253. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/inbox_triage.py +0 -0
  254. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/ingest/__init__.py +0 -0
  255. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/ingest/api_key_auth.py +0 -0
  256. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/ingest/auto_approve.py +0 -0
  257. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/ingest/classifier.py +0 -0
  258. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/ingest/confidence.py +0 -0
  259. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/ingest/dispatch.py +0 -0
  260. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/ingest/events.py +0 -0
  261. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/ingest/ignore_patterns.py +0 -0
  262. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/ingest/image_probe.py +0 -0
  263. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/ingest/ingress.py +0 -0
  264. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/ingest/llm/__init__.py +0 -0
  265. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/ingest/llm/anthropic_haiku.py +0 -0
  266. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/ingest/llm/base.py +0 -0
  267. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/ingest/llm/byok_provider.py +0 -0
  268. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/ingest/llm/config_store.py +0 -0
  269. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/ingest/llm/factory.py +0 -0
  270. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/ingest/llm/kg_enricher.py +0 -0
  271. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/ingest/llm/local_gateway.py +0 -0
  272. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/ingest/llm/local_vllm.py +0 -0
  273. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/ingest/lock_advisory.py +0 -0
  274. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/ingest/parser_router.py +0 -0
  275. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/ingest/parsers/__init__.py +0 -0
  276. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/ingest/parsers/docling_parser.py +0 -0
  277. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/ingest/parsers/docparse_gateway.py +0 -0
  278. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/ingest/parsers/docx_parser.py +0 -0
  279. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/ingest/parsers/folder_unpacker.py +0 -0
  280. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/ingest/parsers/gateway_aux.py +0 -0
  281. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/ingest/parsers/image_parser.py +0 -0
  282. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/ingest/parsers/internal_markdown.py +0 -0
  283. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/ingest/parsers/ocr_gateway.py +0 -0
  284. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/ingest/parsers/ocr_pdf_parser.py +0 -0
  285. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/ingest/parsers/pdf_types.py +0 -0
  286. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/ingest/parsers/transcript_parser.py +0 -0
  287. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/ingest/parsers/vision_gateway.py +0 -0
  288. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/ingest/parsers/xlsx_parser.py +0 -0
  289. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/ingest/parsers/zip_unpacker.py +0 -0
  290. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/ingest/preflight.py +0 -0
  291. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/ingest/routing_policy.py +0 -0
  292. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/ingest/serializers/__init__.py +0 -0
  293. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/ingest/serializers/xlsx_to_markdown.py +0 -0
  294. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/ingest/skip_log.py +0 -0
  295. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/kg/__init__.py +0 -0
  296. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/kg/audit.py +0 -0
  297. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/kg/lens.py +0 -0
  298. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/kg/queries.py +0 -0
  299. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/kg/ranking.py +0 -0
  300. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/kg/rrf.py +0 -0
  301. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/kg_watcher_control.py +0 -0
  302. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/local_llm/__init__.py +0 -0
  303. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/local_llm/async_client.py +0 -0
  304. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/local_llm/client.py +0 -0
  305. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/local_llm/url_validator.py +0 -0
  306. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/metrics_providers.py +0 -0
  307. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/model_registry.py +0 -0
  308. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/n8n_client.py +0 -0
  309. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/newsletter_llm_gateway.py +0 -0
  310. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/notification_service.py +0 -0
  311. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/openai_responses.py +0 -0
  312. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/opencode_metrics.py +0 -0
  313. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/opencode_sessions.py +0 -0
  314. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/pii_redactor.py +0 -0
  315. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/pr_impact_pipeline/__init__.py +0 -0
  316. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/pr_impact_pipeline/differ.py +0 -0
  317. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/pr_impact_pipeline/gc.py +0 -0
  318. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/pr_impact_pipeline/languages.py +0 -0
  319. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/pr_impact_pipeline/parser.py +0 -0
  320. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/pr_impact_pipeline/writer.py +0 -0
  321. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/pr_service.py +0 -0
  322. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/project_paths.py +0 -0
  323. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/project_status_updates.py +0 -0
  324. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/providers.py +0 -0
  325. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/push_service.py +0 -0
  326. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/reminder_service.py +0 -0
  327. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/runas.py +0 -0
  328. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/salience_service.py +0 -0
  329. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/security_collector.py +0 -0
  330. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/session_catalog.py +0 -0
  331. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/session_metrics_service.py +0 -0
  332. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/session_ops.py +0 -0
  333. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/session_state.py +0 -0
  334. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/share_links.py +0 -0
  335. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/task_transitions.py +0 -0
  336. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/terminal_metrics.py +0 -0
  337. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/terminal_metrics_dump.py +0 -0
  338. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/services/workspace_sync.py +0 -0
  339. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/templates/__init__.py +0 -0
  340. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/templates/markdown_share.py +0 -0
  341. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/terminal.py +0 -0
  342. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/tests/__init__.py +0 -0
  343. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/tests/test_agent_facing_auth_dependencies.py +0 -0
  344. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/tests/test_audit_permissions.py +0 -0
  345. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/tests/test_backfill_session_conversations.py +0 -0
  346. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/tests/test_backfill_working_seconds_msg.py +0 -0
  347. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/tests/test_claude_metrics.py +0 -0
  348. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/tests/test_codex_metrics.py +0 -0
  349. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/tests/test_finder_paths.py +0 -0
  350. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/tests/test_learnings_check_search.py +0 -0
  351. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/tests/test_metrics_providers.py +0 -0
  352. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/tests/test_migration_087.py +0 -0
  353. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/tests/test_migration_088.py +0 -0
  354. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/tests/test_migration_089.py +0 -0
  355. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/tests/test_openai_responses.py +0 -0
  356. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/tests/test_opencode_metrics.py +0 -0
  357. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/tests/test_opencode_sessions.py +0 -0
  358. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/tests/test_pr_workflow_e2e.py +0 -0
  359. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/tests/test_projects_handoffs.py +0 -0
  360. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/tests/test_providers.py +0 -0
  361. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/tests/test_require_scope_empty_deny.py +0 -0
  362. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/tests/test_safety_bridge.py +0 -0
  363. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/tests/test_session_catalog.py +0 -0
  364. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/tests/test_session_conversations.py +0 -0
  365. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/tests/test_session_metrics_service.py +0 -0
  366. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/tests/test_session_resume_paths.py +0 -0
  367. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/tests/test_session_theme_mode_migration.py +0 -0
  368. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/tests/test_sessions_rbac.py +0 -0
  369. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/tests/test_share_edit.py +0 -0
  370. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/tests/test_share_repo.py +0 -0
  371. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/tests/test_terminal_session_manager.py +0 -0
  372. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/tests/test_terminal_upload.py +0 -0
  373. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/tests/test_tmux.py +0 -0
  374. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/tests/test_workspace_sync.py +0 -0
  375. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/tests/test_ws_ticket_in_memory.py +0 -0
  376. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/use_cases/__init__.py +0 -0
  377. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/use_cases/_context.py +0 -0
  378. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/use_cases/_errors.py +0 -0
  379. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/use_cases/_roles.py +0 -0
  380. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/use_cases/audit.py +0 -0
  381. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/use_cases/costs.py +0 -0
  382. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/use_cases/ingest_triage.py +0 -0
  383. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/use_cases/projects.py +0 -0
  384. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/use_cases/pull_requests.py +0 -0
  385. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/api/visibility.py +0 -0
  386. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/cli/README.md +0 -0
  387. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/cli/__init__.py +0 -0
  388. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/cli/_index_source.py +0 -0
  389. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/cli/_runtime_ctx.py +0 -0
  390. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/cli/_transmute.py +0 -0
  391. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/cli/marvis_account.py +0 -0
  392. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/cli/marvis_hooks.py +0 -0
  393. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/cli/marvis_runtime.py +0 -0
  394. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/scripts/_frontmatter.py +0 -0
  395. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/scripts/_graph_writer.py +0 -0
  396. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/scripts/ast_parser.py +0 -0
  397. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/scripts/install_hooks/__init__.py +0 -0
  398. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/scripts/install_hooks/_config.sh +0 -0
  399. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/scripts/install_hooks/block-dangerous-bash.sh +0 -0
  400. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/scripts/install_hooks/block-db-direct-write.sh +0 -0
  401. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/scripts/install_hooks/block-push-no-task.sh +0 -0
  402. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/scripts/install_hooks/block-staging-to-prod.sh +0 -0
  403. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/scripts/install_hooks/block-subtree-push.sh +0 -0
  404. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/scripts/install_hooks/config.json +0 -0
  405. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/scripts/install_hooks/enforce-no-merge-main.sh +0 -0
  406. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/scripts/install_hooks/enforce-worktree.sh +0 -0
  407. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/scripts/install_hooks/quality-gate.sh +0 -0
  408. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/scripts/install_hooks/secret-scan.sh +0 -0
  409. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/scripts/migrate_spike_node_ids.py +0 -0
  410. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/scripts/populate_inbox_nodes.py +0 -0
  411. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/scripts/populate_pr_impact.py +0 -0
  412. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/scripts/populate_project_nodes.py +0 -0
  413. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/scripts/populate_touch_counter.py +0 -0
  414. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/scripts/reparse_failed.py +0 -0
  415. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/telemetry/__init__.py +0 -0
  416. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/telemetry/client.py +0 -0
  417. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/telemetry/entitlements.py +0 -0
  418. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/telemetry/rollup.py +0 -0
  419. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/telemetry/sender.py +0 -0
  420. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/wizard/__init__.py +0 -0
  421. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/wizard/state.py +0 -0
  422. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/wizard/steps.py +0 -0
  423. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/core/wizard/validation.py +0 -0
  424. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/marvisx_cli.egg-info/dependency_links.txt +0 -0
  425. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/marvisx_cli.egg-info/top_level.txt +0 -0
  426. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/001_initial.sql +0 -0
  427. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/002_tasks.sql +0 -0
  428. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/003_session_management.sql +0 -0
  429. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/004_projects_comments.sql +0 -0
  430. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/005_session_intelligence.sql +0 -0
  431. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/006_settings.sql +0 -0
  432. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/007_task_scoring.sql +0 -0
  433. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/008_cost_tracking.sql +0 -0
  434. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/009_session_card_metrics.sql +0 -0
  435. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/010_monitoring.sql +0 -0
  436. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/012_agent_api.sql +0 -0
  437. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/013_session_complete.sql +0 -0
  438. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/015_pull_requests.sql +0 -0
  439. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/015_pull_requests_down.sql +0 -0
  440. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/016_users_raci.sql +0 -0
  441. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/017_task_cost_entries.sql +0 -0
  442. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/018_agents.sql +0 -0
  443. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/018_agents_down.sql +0 -0
  444. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/019_review_feedback.sql +0 -0
  445. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/020_pr_commit_sha.sql +0 -0
  446. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/021_webhook_events.sql +0 -0
  447. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/022_devx_agent_managed.sql +0 -0
  448. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/022_devx_agent_managed_down.sql +0 -0
  449. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/023_devx_p1_gate.sql +0 -0
  450. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/023_devx_p1_gate_down.sql +0 -0
  451. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/024_chat_messages.sql +0 -0
  452. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/024_pr_conversation_id.sql +0 -0
  453. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/024_task_indexes.sql +0 -0
  454. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/024_task_indexes_down.sql +0 -0
  455. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/025_audit_log.sql +0 -0
  456. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/026_agent_tokens.sql +0 -0
  457. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/027_teams_auth_phase_b.sql +0 -0
  458. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/028_learnings.sql +0 -0
  459. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/029_team_roles.sql +0 -0
  460. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/030_finder_pins.sql +0 -0
  461. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/031_pr_deploy_status.sql +0 -0
  462. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/032_task_reminders.sql +0 -0
  463. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/033_events_retry_count.sql +0 -0
  464. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/033_session_owner.sql +0 -0
  465. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/034_notifications.sql +0 -0
  466. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/035_shared_links.sql +0 -0
  467. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/036_session_index_upgrade.sql +0 -0
  468. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/037_pr_approval.sql +0 -0
  469. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/038_pr_submitted_by.sql +0 -0
  470. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/039_push_subscriptions.sql +0 -0
  471. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/040_semantic_search.sql +0 -0
  472. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/041_workspaces.sql +0 -0
  473. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/042_oidc_providers.sql +0 -0
  474. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/043_ci_checks.sql +0 -0
  475. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/044_agent_metrics.sql +0 -0
  476. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/045_documents_doc_type.sql +0 -0
  477. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/046_salience.sql +0 -0
  478. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/047_seed_missing_agents.sql +0 -0
  479. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/048_fix_agent_paths_roles.sql +0 -0
  480. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/049_agent_role_and_learnings_schema.sql +0 -0
  481. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/050_session_provider.sql +0 -0
  482. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/051_session_launch_profile.sql +0 -0
  483. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/052_session_theme_mode.sql +0 -0
  484. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/052_task_kind.sql +0 -0
  485. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/053_inbox_items.sql +0 -0
  486. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/054_inbox_triage_contract.sql +0 -0
  487. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/055_inbox_topic_treatment.sql +0 -0
  488. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/056_inbox_treatment_read_save.sql +0 -0
  489. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/057_session_theme_mode_backfill.sql +0 -0
  490. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/058_inbox_item_status_lifecycle.sql +0 -0
  491. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/059_inbox_tldr_and_source_scores.sql +0 -0
  492. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/060_newsletter.sql +0 -0
  493. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/061_inbox_redesign.sql +0 -0
  494. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/062_fix_inbox_sources_backfill.sql +0 -0
  495. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/063_task_completion_mode.sql +0 -0
  496. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/064_judge_mode_setting.sql +0 -0
  497. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/065_knowledge_graph_spike.sql +0 -0
  498. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/066_digest_ranking_inputs.sql +0 -0
  499. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/066_kg_artifact_nodes.sql +0 -0
  500. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/067_inbox_digest_selections.sql +0 -0
  501. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/067_kg_temporal.sql +0 -0
  502. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/068_inbox_digest_app_settings.sql +0 -0
  503. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/068_kg_touch_counter.sql +0 -0
  504. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/069_kg_doc_types.sql +0 -0
  505. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/070_digest_ranking_inputs_recovery.sql +0 -0
  506. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/071_inbox_digest_selections_recovery.sql +0 -0
  507. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/072_inbox_digest_app_settings_recovery.sql +0 -0
  508. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/073_kg_cross_project.sql +0 -0
  509. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/073_kg_cross_project_down.sql +0 -0
  510. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/074_kg_infra_types.sql +0 -0
  511. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/074_kg_infra_types_down.sql +0 -0
  512. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/075_kg_file_state_recovery.sql +0 -0
  513. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/075_kg_file_state_recovery_down.sql +0 -0
  514. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/076_kg_watcher_state.sql +0 -0
  515. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/076_kg_watcher_state_down.sql +0 -0
  516. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/077_kg_doc_types_extend.sql +0 -0
  517. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/077_kg_doc_types_extend_down.sql +0 -0
  518. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/078_kg_fts5_down.sql +0 -0
  519. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/079_kg_missing_indexes.sql +0 -0
  520. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/079_kg_missing_indexes_down.sql +0 -0
  521. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/080_kg_fts5_extended.sql +0 -0
  522. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/080_kg_fts5_extended_down.sql +0 -0
  523. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/081_kg_lens_indexes.sql +0 -0
  524. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/081_kg_lens_indexes_down.sql +0 -0
  525. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/082_kg_pins.sql +0 -0
  526. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/082_kg_pins_down.sql +0 -0
  527. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/083_kg_graph_nodes_degree.sql +0 -0
  528. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/083_kg_graph_nodes_degree_down.sql +0 -0
  529. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/084_drop_legacy_scheduler_tables.sql +0 -0
  530. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/084_drop_legacy_scheduler_tables_down.sql +0 -0
  531. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/085_kg_edge_resolves_to.sql +0 -0
  532. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/085_kg_edge_resolves_to_down.sql +0 -0
  533. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/086_project_status_updates_feed.sql +0 -0
  534. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/086_project_status_updates_feed_down.sql +0 -0
  535. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/087_session_metrics_dual.sql +0 -0
  536. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/087_session_metrics_dual_down.sql +0 -0
  537. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/088_rename_context_pct_legacy.sql +0 -0
  538. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/088_rename_context_pct_legacy_down.sql +0 -0
  539. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/089_session_metrics_equivalent_cost.sql +0 -0
  540. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/089_session_metrics_equivalent_cost_down.sql +0 -0
  541. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/090_kg_inbox_node_type.sql +0 -0
  542. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/090_kg_inbox_node_type_down.sql +0 -0
  543. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/091_kg_inbox_node_type_check.sql +0 -0
  544. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/091_kg_inbox_node_type_check_down.sql +0 -0
  545. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/092_sessions_activity_state_ts.sql +0 -0
  546. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/092_sessions_activity_state_ts_down.sql +0 -0
  547. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/093_sessions_activity_state_column.sql +0 -0
  548. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/093_sessions_activity_state_column_down.sql +0 -0
  549. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/094_ingest_pending.sql +0 -0
  550. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/094_ingest_pending_down.sql +0 -0
  551. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/095_kg_intent_first_down.sql +0 -0
  552. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/096_kg_xlsx_artifact_prefix.sql +0 -0
  553. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/096_kg_xlsx_artifact_prefix_down.sql +0 -0
  554. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/097_ingest_change_history.sql +0 -0
  555. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/097_ingest_change_history_down.sql +0 -0
  556. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/098_kg_node_type_business.sql +0 -0
  557. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/098_kg_node_type_business_down.sql +0 -0
  558. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/099_kg_edges_restore_weight.sql +0 -0
  559. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/099_kg_edges_restore_weight_down.sql +0 -0
  560. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/100_kg_enriched_at.sql +0 -0
  561. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/100_kg_enriched_at_down.sql +0 -0
  562. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/101_local_llm_shadow_comparisons.sql +0 -0
  563. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/101_local_llm_shadow_comparisons_down.sql +0 -0
  564. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/102_promote_llm_costs.sql +0 -0
  565. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/102_promote_llm_costs_down.sql +0 -0
  566. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/103_ingest_skipped_log.sql +0 -0
  567. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/103_ingest_skipped_log_down.sql +0 -0
  568. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/120_docs_governance.sql +0 -0
  569. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/120_docs_governance_down.sql +0 -0
  570. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/121_notification_event_fk_cleanup.sql +0 -0
  571. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/121_notification_event_fk_cleanup_down.sql +0 -0
  572. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/122_docs_drift_history.sql +0 -0
  573. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/122_docs_drift_history_down.sql +0 -0
  574. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/123_ingest_parser_waiting_status.sql +0 -0
  575. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/123_ingest_parser_waiting_status_down.sql +0 -0
  576. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/124_heypocket_recordings.sql +0 -0
  577. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/124_heypocket_recordings_down.sql +0 -0
  578. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/125_kg_node_type_record.sql +0 -0
  579. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/125_kg_node_type_record_down.sql +0 -0
  580. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/126_ingest_terminal_upload_source_kind.sql +0 -0
  581. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/126_ingest_terminal_upload_source_kind_down.sql +0 -0
  582. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/127_brain_v1_substrate.sql +0 -0
  583. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/127_brain_v1_substrate_down.sql +0 -0
  584. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/128_brain_drift_signals.sql +0 -0
  585. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/128_brain_drift_signals_down.sql +0 -0
  586. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/129_brain_memory_operations.sql +0 -0
  587. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/129_brain_memory_operations_down.sql +0 -0
  588. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/130_brain_findings.sql +0 -0
  589. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/130_brain_findings_down.sql +0 -0
  590. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/132_kg_pr_modifies.sql +0 -0
  591. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/132_kg_pr_modifies_down.sql +0 -0
  592. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/133_brain_v1_2_direction_schema.sql +0 -0
  593. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/133_brain_v1_2_direction_schema_down.sql +0 -0
  594. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/134_brain_journal_narrative_polished.sql +0 -0
  595. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/134_brain_journal_narrative_polished_down.sql +0 -0
  596. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/135_kg_edges_provider.sql +0 -0
  597. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/136_documents_fts.sql +0 -0
  598. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/137_promote_llm_costs.sql +0 -0
  599. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/137_promote_llm_costs_down.sql +0 -0
  600. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/138_ingest_api_keys.sql +0 -0
  601. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/138_ingest_api_keys_down.sql +0 -0
  602. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/139_ingest_pending_ingress.sql +0 -0
  603. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/139_ingest_pending_ingress_down.sql +0 -0
  604. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/140_ingest_idempotency_quota.sql +0 -0
  605. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/140_ingest_idempotency_quota_down.sql +0 -0
  606. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/141_ingest_pending_metadata.sql +0 -0
  607. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/141_ingest_pending_metadata_down.sql +0 -0
  608. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/142_llm_function_config.sql +0 -0
  609. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/142_llm_function_config_down.sql +0 -0
  610. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/143_kg_code_embeddings.sql +0 -0
  611. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/143_kg_code_embeddings_down.sql +0 -0
  612. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/144_notifications_pending_sync_index.sql +0 -0
  613. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/145_audit_log_immutable.sql +0 -0
  614. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/145_audit_log_immutable_down.sql +0 -0
  615. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/migrations/__init__.py +0 -0
  616. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/projects/_template/project.yaml +0 -0
  617. {marvisx_cli-0.2.3 → marvisx_cli-0.3.6}/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.3
3
+ Version: 0.3.6
4
4
  Summary: MarvisX OSS — agent-native company-brain CLI runtime (init, status, brief, triage)
5
5
  Author: MarvisX maintainers
6
6
  License: BSL-1.1
@@ -31,12 +31,12 @@ Requires-Dist: click>=8
31
31
  Requires-Dist: pydantic>=2.5
32
32
  Requires-Dist: pydantic-settings>=2.7.0
33
33
  Requires-Dist: PyYAML>=6
34
+ Requires-Dist: platformdirs>=4.0
34
35
  Requires-Dist: cryptography>=42
35
36
  Requires-Dist: fastapi>=0.115.0
36
37
  Requires-Dist: slowapi>=0.1.9
37
38
  Requires-Dist: cachetools>=5.3.0
38
39
  Requires-Dist: uvicorn[standard]>=0.34.0
39
- Requires-Dist: uvloop>=0.21.0
40
40
  Requires-Dist: aiosqlite>=0.20.0
41
41
  Requires-Dist: PyJWT>=2.10.0
42
42
  Requires-Dist: bcrypt>=4.2.0
@@ -0,0 +1,122 @@
1
+ # Marvis
2
+
3
+ **The Company Brain your agents install.** Use Claude Code, or whatever coding agent you run, to manage projects and coordinate your agents, not just write code. Marvis captures what your agents do as they work, structures it into a cross-project Knowledge Graph, and hands it back to them, so your work stays on track and the system learns from it. Self-hosted, EU-resident, governed by an immutable audit chain.
4
+
5
+ **Open-core and free to run.** Marvis is the free core: you self-host it, read the source, fork it, audit it, at no cost. MarvisX is the commercial tier on top of the same brain: multi-department teams, data sovereignty and managed hosting, and autonomous, hands-off-the-keyboard operation. Marvis is what you install today; MarvisX is what you reach for when a single self-hosted instance is no longer enough.
6
+
7
+ ## Install
8
+
9
+ Marvis runs as a CLI your agent drives. Install it, then let the agent you already use take it from there:
10
+
11
+ ```bash
12
+ uv tool install marvisx-cli
13
+ marvis init
14
+ ```
15
+
16
+ `marvis init` scaffolds the project and installs the governance hooks, then exposes the MCP surface to your agent. Python 3.10–3.13; on 3.14, pin the interpreter: `uv tool install --python 3.13 marvisx-cli`. No `uv` yet? `curl -LsSf https://astral.sh/uv/install.sh | sh`.
17
+
18
+ To run the full Console + API stack yourself, see [Self-hosting the full stack](#self-hosting-the-full-stack).
19
+
20
+ ## What it does, in plain terms
21
+
22
+ - **Your agents stop forgetting.** Decisions, specs, playbooks, learnings and mistakes are captured as a side effect of the work your agents already do, not retyped by hand.
23
+ - **Your work stays on track.** A reflective Brain layer compares what agents produce against your intent and surfaces drift early, before it compounds across sessions.
24
+ - **One brain, many projects and teams.** A cross-project Knowledge Graph links decisions, code and documents, so an agent working in one project can see what was decided in another.
25
+ - **Governed by default.** Constitution rules enforced at the hook level, plus a foreign-key-immutable audit log: every action traces back to the human who approved it.
26
+ - **It lives in your terminal, not a dashboard.** An agent-native MCP surface keeps your existing Claude Code / Codex / Cursor as the place you work.
27
+
28
+ ## Under the hood
29
+
30
+ - **Cross-project Knowledge Graph** with 17 deterministic edge types covering code, work-chain artifacts, knowledge-chain documents, cross-project references, and bridge edges. Canonical IDs follow `{prefix}:{kind}:{slug}`.
31
+ - **Foreign-key-immutable audit log** with provenance pinned at the SQLite level. Designed to satisfy the logging surface required by EU Regulation 2024/1689 (AI Act) Article 12.
32
+ - **Brain reflection pipeline** in five layers — substrate, digest and journal, drift checker, memory operations, findings — closed by a Direction-Aware loop.
33
+ - **Constitution-enforced safety rules** enforced by deterministic hook gates and an MCP mirror for providers without native hooks.
34
+ - **Agent-native MCP surface** exposing 91 tools, callable identically from Claude Code, Codex, Gemini, OpenCode, and a web console.
35
+
36
+ ## Search and embedding quality
37
+
38
+ Marvis defaults to **IBM Granite-Embedding-97m-Multilingual-R2** self-hosted via ONNX, blended with SQLite BM25 keyword search through Reciprocal Rank Fusion. Backend is selectable through `EMBEDDING_MODE`.
39
+
40
+ This is a deliberate tradeoff: EU compliance, self-hosting, and zero external embedding cost come at the cost of retrieval quality that is below commercial managed embedding providers. See [`docs/SEARCH-QUALITY.md`](docs/SEARCH-QUALITY.md) for the benchmark numbers, affected workflows, mitigations available today, and the Phase 2 fine-tune roadmap.
41
+
42
+ ## License posture
43
+
44
+ - **Free to self-host.** Code is **source-available** under the **Business Source License 1.1**, with an automatic change date converting to **Apache License 2.0** four years after release.
45
+ - Documentation and architectural patterns: **CC-BY 4.0**.
46
+
47
+ This is open-core, not OSI open source: the core is free to run and read, and the BSL holds back only competing commercial-as-a-service use until the change date. The combination keeps the architecture freely citable while preserving the ability to ship a self-hosted reference deployment.
48
+
49
+ ## Architecture map
50
+
51
+ The system groups capabilities into eight functional domains (`M1 Capture`, `M2 Index`, `M3 Retrieve`, `M4 Reflect`, `M5 Act`, `M6 Agent-native I/O`, `M7 Compliance`, `M8 Productization`). The Knowledge Graph stitches them together with canonical IDs and an audit chain.
52
+
53
+ The full architectural description is the MarvisX preprint on Zenodo: [`10.5281/zenodo.20341860`](https://doi.org/10.5281/zenodo.20341860).
54
+
55
+ ## Repository layout
56
+
57
+ ```
58
+ core/
59
+ ├── api/ # FastAPI service: KG, ingest, brain, MCP transport
60
+ ├── console/ # Next.js web console
61
+ ├── kb/ # Project-local knowledge base templates
62
+ ├── mcp-pir/ # MCP server (stdio) exposing the 91-tool surface
63
+ └── scripts/ # Deployment, migration, and operational scripts
64
+
65
+ deploy/
66
+ └── _template/ # Reference deployment template
67
+ # (Docker Compose + environment scaffolding)
68
+ ```
69
+
70
+ ## Self-hosting the full stack
71
+
72
+ The CLI above runs Marvis against a local SQLite database. To run the full Console + API stack yourself, use the reference Docker Compose deployment. Clone the repository, copy `deploy/_template/.env.example` to `.env`, populate the required secrets, and bring the stack up:
73
+
74
+ ```bash
75
+ cp deploy/_template/.env.example deploy/_template/.env
76
+ cd deploy/_template/
77
+ docker compose up -d
78
+ ```
79
+
80
+ The Console becomes available on the configured `CONSOLE_PORT` and the API on the configured `API_PORT`. Detailed first-run instructions are inside the deployment template.
81
+
82
+ ## MCP surface
83
+
84
+ Marvis ships an MCP server exposing 91 tools across 11 categories: project and session context, tasks, handoffs, semantic search, learnings, costs, pull requests, knowledge graph queries, ingest triage, brain reflection layer, and audit-and-monitoring controls.
85
+
86
+ The same surface is used by autonomous agents and by humans through the web console. The intent is parity: any action a user can take through the console, an agent can also take through MCP, and the reverse.
87
+
88
+ ## Single-user local runtime (`MARVIS_OSS_LOCAL`)
89
+
90
+ The MCP server runs in-process: it calls the same use_cases the HTTP API calls, against the local SQLite database, with no uvicorn and no Node bridge. In this single-user mode there is no HTTP API in front of the database, so the HTTP audit chokepoint (which in the managed deployment forces every mutation through the API) does not exist.
91
+
92
+ Audit is still recorded: the extracted use_cases write the audit log themselves (`core/api/use_cases/{tasks,pull_requests,audit}.py`), so a mutation issued through MCP still produces an audit row at the use_case level. What is lost is only the additional HTTP-surface chokepoint.
93
+
94
+ Setting `MARVIS_OSS_LOCAL=1` (truthy: `1`/`true`/`yes`/`on`) makes the `block-db-direct-write` safety rule **advisory** — direct writes to a Marvis SQLite database are allowed with a warning instead of being blocked. When the variable is unset or falsey the rule is unchanged: direct DB writes are blocked fail-closed, exactly as in the managed deployment. This trade-off is intentional for single-user self-hosting and never weakens the default.
95
+
96
+ **No-fork guarantee.** The HTTP API and the MCP server are not two implementations: both are thin adapters over the same `core/api/use_cases`, differing only in how they fill the per-call `CallerContext`. The proof is the API test suite staying green after the extraction — the same behaviour, exercised through the HTTP surface, over the identical use_cases the MCP server calls.
97
+
98
+ ## Telemetry
99
+
100
+ Marvis sends anonymous, opt-out usage telemetry to help improve it: coarse event counts plus version and OS buckets, tied to a random install id (a plain UUID, never derived from your machine, user, or email). It never sends file content, project data, or personal information.
101
+
102
+ Turn it off at any time:
103
+
104
+ ```bash
105
+ marvis telemetry off
106
+ ```
107
+
108
+ Or per environment: `MARVIS_TELEMETRY=0`, the universal `DO_NOT_TRACK=1`, or `telemetry: false` in `~/.marvis/settings.yaml`. With `MARVIS_TELEMETRY=log`, Marvis prints exactly what it would send to stderr and transmits nothing.
109
+
110
+ ## Documentation
111
+
112
+ - [`docs/SEARCH-QUALITY.md`](docs/SEARCH-QUALITY.md) — search quality expectations, affected workflows, and mitigations
113
+
114
+ ## Contributing
115
+
116
+ Issues and bug reports are welcome through the repository tracker.
117
+
118
+ ## References
119
+
120
+ - Preprint (Zenodo): [`10.5281/zenodo.20341860`](https://doi.org/10.5281/zenodo.20341860)
121
+ - License (code): Business Source License 1.1, change date converts to Apache License 2.0 four years after release
122
+ - License (documentation): CC-BY 4.0
@@ -38,7 +38,9 @@ async def list_agent_managed_sessions() -> list[SessionInfo]:
38
38
  import urllib.request
39
39
  from core.api.config import settings as cfg
40
40
  token = cfg.tasks_api_token if hasattr(cfg, "tasks_api_token") else os.environ.get("TASKS_API_TOKEN", "")
41
- api_base = os.environ.get("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",
@@ -8,6 +8,8 @@ from typing import Literal
8
8
  from pydantic import AliasChoices, Field, SecretStr
9
9
  from pydantic_settings import BaseSettings, SettingsConfigDict
10
10
 
11
+ from core.platform import current_user, db_default_path
12
+
11
13
  # Prod (Hetzner/Docker) ships the vec0 loadable at this path; it stays the
12
14
  # final fallback so prod keeps working unchanged.
13
15
  _VEC0_PATH_PROD_DEFAULT = "/data/pir/lib/vec0"
@@ -40,22 +42,43 @@ class Settings(BaseSettings):
40
42
  populate_by_name=True,
41
43
  )
42
44
 
43
- pir_env: str = "development"
45
+ pir_env: str = Field(
46
+ default="development",
47
+ validation_alias=AliasChoices("MARVIS_ENV", "PIR_ENV"),
48
+ )
44
49
  # Free-form tenant identifier. Default "core" (OSS). Deploy bundles set
45
50
  # DEPLOY_MODE to their own tenant slug via .env; no tenant names are
46
51
  # hard-coded in core.
47
52
  deploy_mode: str = Field(default="core", alias="DEPLOY_MODE")
48
- pir_instance: str = Field(default="prod", alias="PIR_INSTANCE")
53
+ pir_instance: str = Field(
54
+ default="prod",
55
+ validation_alias=AliasChoices("MARVIS_INSTANCE", "PIR_INSTANCE"),
56
+ )
49
57
  marvisx_phase: Literal["A", "B", "C", "D"] = Field(
50
58
  default="A", alias="MARVISX_PHASE"
51
59
  )
52
- pir_canary_banner: bool = Field(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 = ""
60
+ pir_canary_banner: bool = Field(
61
+ default=False,
62
+ validation_alias=AliasChoices("MARVIS_CANARY_BANNER", "PIR_CANARY_BANNER"),
63
+ )
64
+ pir_jwt_secret: str = Field(
65
+ default="dev-secret-change-in-production",
66
+ validation_alias=AliasChoices("MARVIS_JWT_SECRET", "PIR_JWT_SECRET"),
67
+ )
68
+ pir_admin_password_hash: str = Field(
69
+ default="",
70
+ validation_alias=AliasChoices(
71
+ "MARVIS_ADMIN_PASSWORD_HASH", "PIR_ADMIN_PASSWORD_HASH"
72
+ ),
73
+ )
56
74
  db_path: str = Field(
57
- default="console.db",
58
- validation_alias=AliasChoices("PIR_DB_PATH", "DB_PATH"),
75
+ # Fallback when no MARVIS_DB_PATH/PIR_DB_PATH/DB_PATH env is set: the
76
+ # platformdirs data root (was a CWD-relative "console.db" that opened a
77
+ # different DB per launch directory — split-brain, and on Windows a
78
+ # nonsense root). The env aliases still win via pydantic; this factory
79
+ # runs ONLY when none are set.
80
+ default_factory=lambda: str(db_default_path()),
81
+ validation_alias=AliasChoices("MARVIS_DB_PATH", "PIR_DB_PATH", "DB_PATH"),
59
82
  )
60
83
  cookie_domain: str | None = Field(default=None, alias="COOKIE_DOMAIN")
61
84
  cors_origins_prod: list[str] = Field(
@@ -83,6 +106,16 @@ class Settings(BaseSettings):
83
106
  brain_run_off_peak_only: bool = Field(
84
107
  default=False, alias="BRAIN_RUN_OFF_PEAK_ONLY"
85
108
  )
109
+ # Warehouse consolidation pass (full-store learning dedup, ships DORMANT).
110
+ # Unlike memory_ops M2 (same-cycle only), this scans the WHOLE learnings
111
+ # warehouse and PROPOSES consolidation of cross-cycle duplicates. Default
112
+ # FALSE — a human enables it after reviewing. Daily cadence guard.
113
+ brain_warehouse_consolidation_enabled: bool = Field(
114
+ default=False, alias="BRAIN_WAREHOUSE_CONSOLIDATION_ENABLED"
115
+ )
116
+ brain_warehouse_consolidation_interval_seconds: int = Field(
117
+ default=86400, alias="BRAIN_WAREHOUSE_CONSOLIDATION_INTERVAL_SECONDS"
118
+ )
86
119
 
87
120
  # GitHub Webhook
88
121
  github_webhook_secret: str = ""
@@ -401,9 +434,6 @@ class Settings(BaseSettings):
401
434
  # WIP limit: max tasks in_progress per project (doc/none tasks count as 0.5)
402
435
  wip_max_in_progress: int = 3
403
436
 
404
- # Voyage AI embeddings
405
- voyage_api_key: str = ""
406
-
407
437
  # sqlite-vec: env VEC0_PATH → sqlite_vec.loadable_path() → prod fallback.
408
438
  vec0_path: str = Field(
409
439
  default_factory=_default_vec0_path,
@@ -521,16 +551,14 @@ class Settings(BaseSettings):
521
551
 
522
552
  Returns '' when GIT_RUNAS_USER is unset or already matches the current
523
553
  OS user (no privilege hop needed)."""
524
- import pwd
525
-
526
554
  user = (self.git_runas_user or "").strip()
527
555
  if not user:
528
556
  return ""
529
- try:
530
- if pwd.getpwuid(os.getuid()).pw_name == user:
531
- return ""
532
- except (KeyError, OSError):
533
- pass
557
+ # current_user() is pwd.getpwuid(os.getuid()).pw_name on POSIX (identical
558
+ # to the previous inline lookup) and getpass-based on Windows; the bare
559
+ # `import pwd` here crashed `marvis project list` on Windows.
560
+ if current_user() == user:
561
+ return ""
534
562
  return user
535
563
 
536
564
 
@@ -740,18 +740,26 @@ def _seed_users_and_migrate_owner(conn: sqlite3.Connection) -> None:
740
740
  install seeds no hardcoded name. On an existing deployment this seed is
741
741
  skipped (users already exist), so the defaults never affect a running install.
742
742
  """
743
- # Prefer pre-hashed password (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
 
@@ -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,73 @@ 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)
109
+ except ServiceError as e:
110
+ raise_mcp_error(e)
111
+
112
+ @mcp.tool()
113
+ async def update_learning(
114
+ learning_id: Annotated[str, Field(min_length=1)],
115
+ title: Annotated[str, Field(min_length=1, max_length=200)] | None = None,
116
+ category: LearningCategory | None = None,
117
+ description: Annotated[str, Field(min_length=1)] | None = None,
118
+ prevention: Annotated[str, Field(min_length=1)] | None = None,
119
+ severity: LearningSeverity | None = None,
120
+ module: str | None = None,
121
+ tags: list[str] | None = None,
122
+ project: str | None = None,
123
+ ) -> dict[str, Any]:
124
+ """Update an existing learning (operator+), then re-embed it so search/check_learnings see the new content immediately.
125
+
126
+ QUANDO USARLO: il contenuto di un learning e' obsoleto/incompleto (prevention piu' precisa, severity ricalibrata, nuovo modulo) ma vuoi PRESERVARE la history. BOUNDARY: update_learning aggiorna in-place + re-embed; delete_learning cancella permanente; create_learning scrive nuovo.
127
+ QUANDO NON USARLO: NOT per un learning nuovo -> usa create_learning. NOT per azzerare un campo a null: la superficie MCP NON puo' settare null (omettere un campo lo lascia invariato) -> usa l'HTTP PATCH se devi pulire un campo.
128
+ RESTITUISCE: il learning aggiornato {id, title, category, severity, prevention, tags, module, project, updated_at} — gia' ri-embeddato (retrievable by meaning, non solo keyword)."""
129
+ fields = {
130
+ k: v
131
+ for k, v in {
132
+ "title": title,
133
+ "category": category,
134
+ "description": description,
135
+ "prevention": prevention,
136
+ "severity": severity,
137
+ "module": module,
138
+ "tags": tags,
139
+ "project": project,
140
+ }.items()
141
+ if v is not None
142
+ }
143
+ try:
144
+ async with acquire_write_db(label="mcp.update_learning") as db:
145
+ result = await learnings_uc.update_learning(
146
+ LOCAL_CTX, db, learning_id=learning_id, fields=fields
147
+ )
148
+ # Writer lock released: re-embed-on-write (mirror create_learning) so the
149
+ # updated content is retrievable by meaning immediately, not stale until
150
+ # a manual reindex.
151
+ await mcp_embed_learning(
152
+ learning_id=result.id,
153
+ title=result.title,
154
+ description=result.description,
155
+ category=result.category,
156
+ severity=result.severity,
157
+ prevention=result.prevention,
158
+ project=result.project,
159
+ workspace_id=LOCAL_CTX.workspace_id,
160
+ )
161
+ return dump(result)
89
162
  except ServiceError as e:
90
163
  raise_mcp_error(e)
91
164
 
@@ -142,3 +215,21 @@ def register(mcp) -> None:
142
215
  return dump(result)
143
216
  except ServiceError as e:
144
217
  raise_mcp_error(e)
218
+
219
+ @mcp.tool()
220
+ async def delete_learning(
221
+ learning_id: Annotated[str, Field(min_length=1)],
222
+ ) -> dict[str, Any]:
223
+ """Permanently remove a learning from the Marvis DB (non-recoverable) + prune the search index.
224
+
225
+ QUANDO USARLO: solo per learning duplicati, spam, o entry chiaramente invalide. Hard delete: rimuove anche il mirror nell'indice di ricerca (documents + vec_documents + FTS) cosi' il learning smette di comparire in search/check_learnings.
226
+ QUANDO NON USARLO: NOT per archiviare un learning ancora valido — la cancellazione e' permanente e perde la history. Aggiornalo con update_learning se il contenuto e' obsoleto.
227
+ RESTITUISCE: {deleted: true} o 404 se non esiste."""
228
+ try:
229
+ async with acquire_write_db(label="mcp.delete_learning") as db:
230
+ await learnings_uc.delete_learning(
231
+ LOCAL_CTX, db, learning_id=learning_id
232
+ )
233
+ return {"deleted": True}
234
+ except ServiceError as e:
235
+ raise_mcp_error(e)
@@ -39,7 +39,7 @@ def register(mcp) -> None:
39
39
 
40
40
  @mcp.tool()
41
41
  async def list_projects() -> list[dict[str, Any]]:
42
- """List all 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.