marvisx-cli 0.3.5__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 (615) hide show
  1. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/PKG-INFO +2 -1
  2. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/README.md +45 -18
  3. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/config.py +13 -8
  4. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/mcp/tools/learnings.py +53 -0
  5. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/models/tasks.py +1 -2
  6. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/cli/_brain_opportunistic.py +2 -4
  7. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/cli/_brain_schedule.py +67 -9
  8. marvisx_cli-0.3.6/core/cli/_update_check.py +164 -0
  9. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/cli/marvis_doctor.py +73 -1
  10. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/cli/marvis_feedback.py +4 -5
  11. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/cli/marvis_init.py +29 -9
  12. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/cli/marvis_telemetry.py +3 -8
  13. marvisx_cli-0.3.6/core/platform/__init__.py +177 -0
  14. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/wizard/byok_vault.py +5 -8
  15. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/wizard/defaults.py +7 -14
  16. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/marvisx_cli.egg-info/PKG-INFO +2 -1
  17. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/marvisx_cli.egg-info/SOURCES.txt +2 -0
  18. marvisx_cli-0.3.6/marvisx_cli.egg-info/entry_points.txt +3 -0
  19. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/marvisx_cli.egg-info/requires.txt +1 -0
  20. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/pyproject.toml +5 -3
  21. marvisx_cli-0.3.5/marvisx_cli.egg-info/entry_points.txt +0 -3
  22. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/LICENSE +0 -0
  23. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/MANIFEST.in +0 -0
  24. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/__init__.py +0 -0
  25. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/agents/__init__.py +0 -0
  26. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/agents/session_health.py +0 -0
  27. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/agents/session_manager.py +0 -0
  28. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/bin/marvisx-state-hook.py +0 -0
  29. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/db.py +0 -0
  30. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/dependencies/__init__.py +0 -0
  31. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/dependencies/tenant.py +0 -0
  32. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/main.py +0 -0
  33. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/mcp/__init__.py +0 -0
  34. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/mcp/_adapter.py +0 -0
  35. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/mcp/server.py +0 -0
  36. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/mcp/tools/__init__.py +0 -0
  37. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/mcp/tools/brain.py +0 -0
  38. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/mcp/tools/graph.py +0 -0
  39. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/mcp/tools/handoffs.py +0 -0
  40. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/mcp/tools/ingest.py +0 -0
  41. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/mcp/tools/projects.py +0 -0
  42. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/mcp/tools/pull_requests.py +0 -0
  43. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/mcp/tools/safety.py +0 -0
  44. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/mcp/tools/search.py +0 -0
  45. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/mcp/tools/tasks.py +0 -0
  46. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/mcp/tools/workflow_playbooks/brainstorm.md +0 -0
  47. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/mcp/tools/workflow_playbooks/compound.md +0 -0
  48. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/mcp/tools/workflow_playbooks/plan.md +0 -0
  49. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/mcp/tools/workflows.py +0 -0
  50. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/middleware/__init__.py +0 -0
  51. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/middleware/tool_call_audit.py +0 -0
  52. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/models/__init__.py +0 -0
  53. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/models/auth.py +0 -0
  54. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/models/brain.py +0 -0
  55. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/models/common.py +0 -0
  56. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/models/costs.py +0 -0
  57. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/models/graph.py +0 -0
  58. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/models/graph_cosmo.py +0 -0
  59. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/models/graph_pr_impact.py +0 -0
  60. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/models/graph_ux.py +0 -0
  61. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/models/inbox.py +0 -0
  62. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/models/ingest_keys.py +0 -0
  63. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/models/kg.py +0 -0
  64. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/models/llm_config.py +0 -0
  65. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/models/monitoring.py +0 -0
  66. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/models/projects.py +0 -0
  67. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/models/search.py +0 -0
  68. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/models/sessions.py +0 -0
  69. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/models/teams.py +0 -0
  70. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/models/users.py +0 -0
  71. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/observability/__init__.py +0 -0
  72. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/observability/tracing.py +0 -0
  73. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/paths.py +0 -0
  74. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/rate_limit.py +0 -0
  75. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/rbac.py +0 -0
  76. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/routers/__init__.py +0 -0
  77. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/routers/_adapter.py +0 -0
  78. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/routers/admin_pr_impact.py +0 -0
  79. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/routers/admin_settings.py +0 -0
  80. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/routers/agent.py +0 -0
  81. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/routers/agent_tokens.py +0 -0
  82. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/routers/app_settings.py +0 -0
  83. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/routers/audit.py +0 -0
  84. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/routers/auth.py +0 -0
  85. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/routers/bench.py +0 -0
  86. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/routers/brain.py +0 -0
  87. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/routers/brain_directions.py +0 -0
  88. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/routers/ci_checks.py +0 -0
  89. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/routers/comments.py +0 -0
  90. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/routers/costs.py +0 -0
  91. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/routers/docs_coverage.py +0 -0
  92. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/routers/docs_governance.py +0 -0
  93. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/routers/documents.py +0 -0
  94. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/routers/files.py +0 -0
  95. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/routers/finder.py +0 -0
  96. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/routers/graph.py +0 -0
  97. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/routers/handoffs.py +0 -0
  98. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/routers/inbox.py +0 -0
  99. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/routers/ingest_api_keys.py +0 -0
  100. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/routers/ingest_triage.py +0 -0
  101. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/routers/judge.py +0 -0
  102. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/routers/kg.py +0 -0
  103. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/routers/learnings.py +0 -0
  104. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/routers/llm_config.py +0 -0
  105. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/routers/monitoring.py +0 -0
  106. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/routers/notifications.py +0 -0
  107. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/routers/pr_impact.py +0 -0
  108. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/routers/projects.py +0 -0
  109. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/routers/pull_requests.py +0 -0
  110. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/routers/push.py +0 -0
  111. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/routers/raci.py +0 -0
  112. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/routers/search.py +0 -0
  113. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/routers/sessions.py +0 -0
  114. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/routers/settings.py +0 -0
  115. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/routers/share_repo.py +0 -0
  116. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/routers/status_updates.py +0 -0
  117. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/routers/tags.py +0 -0
  118. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/routers/tasks.py +0 -0
  119. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/routers/teams.py +0 -0
  120. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/routers/terminal.py +0 -0
  121. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/routers/users.py +0 -0
  122. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/routers/webhooks.py +0 -0
  123. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/runtime_settings.py +0 -0
  124. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/security.py +0 -0
  125. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/__init__.py +0 -0
  126. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/_fts.py +0 -0
  127. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/audit.py +0 -0
  128. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/auto_approval.py +0 -0
  129. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/brain/__init__.py +0 -0
  130. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/brain/baseline.py +0 -0
  131. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/brain/capabilities.py +0 -0
  132. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/brain/cascade_rollup.py +0 -0
  133. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/brain/compound_bridge.py +0 -0
  134. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/brain/cycle.py +0 -0
  135. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/brain/cycle_snapshot.py +0 -0
  136. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/brain/digest_collector.py +0 -0
  137. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/brain/direction.py +0 -0
  138. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/brain/drift.py +0 -0
  139. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/brain/drift_router.py +0 -0
  140. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/brain/edge_metrics.py +0 -0
  141. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/brain/events_reader.py +0 -0
  142. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/brain/findings.py +0 -0
  143. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/brain/findings_reader.py +0 -0
  144. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/brain/jobs.py +0 -0
  145. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/brain/journal.py +0 -0
  146. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/brain/knowledge_forms.py +0 -0
  147. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/brain/llm/__init__.py +0 -0
  148. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/brain/llm/_runner.py +0 -0
  149. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/brain/llm/base.py +0 -0
  150. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/brain/llm/cache.py +0 -0
  151. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/brain/llm/constants.py +0 -0
  152. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/brain/llm/direction_alignment.py +0 -0
  153. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/brain/llm/factory.py +0 -0
  154. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/brain/llm/finding_reasoning.py +0 -0
  155. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/brain/llm/finding_summary.py +0 -0
  156. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/brain/llm/grounding.py +0 -0
  157. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/brain/llm/journal_polish.py +0 -0
  158. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/brain/llm/local_gateway.py +0 -0
  159. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/brain/llm/parsers.py +0 -0
  160. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/brain/llm/router_glue.py +0 -0
  161. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/brain/memory_ops.py +0 -0
  162. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/brain/models.py +0 -0
  163. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/brain/owner_hint.py +0 -0
  164. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/brain/recap.py +0 -0
  165. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/brain/rules/__init__.py +0 -0
  166. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/brain/rules/_signals.py +0 -0
  167. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/brain/rules/dr1_activity_without_status.py +0 -0
  168. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/brain/rules/dr2_decision_without_adr.py +0 -0
  169. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/brain/rules/dr3_stale_open_loop.py +0 -0
  170. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/brain/rules/dr4_docs_governance_drift.py +0 -0
  171. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/brain/rules/dr5_playbook_changed.py +0 -0
  172. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/brain/rules/dr6_external_update_unpropagated.py +0 -0
  173. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/brain/rules/dr7_claimed_decision_gap.py +0 -0
  174. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/brain/rules/dr8_direction_misalignment.py +0 -0
  175. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/brain/runs_reader.py +0 -0
  176. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/brain/scope.py +0 -0
  177. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/brain/sources/__init__.py +0 -0
  178. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/brain/sources/base.py +0 -0
  179. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/brain/sources/git_kg.py +0 -0
  180. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/brain/sources/handoffs.py +0 -0
  181. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/brain/sources/ingestor.py +0 -0
  182. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/brain/sources/learnings.py +0 -0
  183. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/brain/sources/pir_tasks.py +0 -0
  184. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/brain/warehouse_consolidate.py +0 -0
  185. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/brain/watermarks.py +0 -0
  186. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/brain/ws_emitter.py +0 -0
  187. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/cc_tasks_reader.py +0 -0
  188. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/ci_service.py +0 -0
  189. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/claude_metrics.py +0 -0
  190. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/codex_metrics.py +0 -0
  191. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/conversation_reader.py +0 -0
  192. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/cost_service.py +0 -0
  193. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/crypto.py +0 -0
  194. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/docs_governance/__init__.py +0 -0
  195. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/docs_governance/confidence.py +0 -0
  196. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/docs_governance/config.py +0 -0
  197. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/docs_governance/enrichment.py +0 -0
  198. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/docs_governance/frontmatter_validator.py +0 -0
  199. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/docs_governance/hard_gates.py +0 -0
  200. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/docs_governance/triage_orchestrator.py +0 -0
  201. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/embedding_backends/__init__.py +0 -0
  202. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/embedding_internal.py +0 -0
  203. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/embedding_service.py +0 -0
  204. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/event_dispatcher.py +0 -0
  205. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/events.py +0 -0
  206. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/git_ops.py +0 -0
  207. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/graph_cosmo_service.py +0 -0
  208. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/graph_ranker.py +0 -0
  209. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/graph_service.py +0 -0
  210. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/inbox.py +0 -0
  211. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/inbox_digest.py +0 -0
  212. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/inbox_digest_deep_research.py +0 -0
  213. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/inbox_digest_jobs.py +0 -0
  214. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/inbox_gmail_sync.py +0 -0
  215. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/inbox_llm_classifier.py +0 -0
  216. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/inbox_source_identity.py +0 -0
  217. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/inbox_sources.py +0 -0
  218. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/inbox_taxonomy.py +0 -0
  219. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/inbox_tldr.py +0 -0
  220. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/inbox_triage.py +0 -0
  221. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/ingest/__init__.py +0 -0
  222. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/ingest/api_key_auth.py +0 -0
  223. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/ingest/auto_approve.py +0 -0
  224. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/ingest/classifier.py +0 -0
  225. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/ingest/confidence.py +0 -0
  226. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/ingest/dispatch.py +0 -0
  227. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/ingest/embedding_router.py +0 -0
  228. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/ingest/events.py +0 -0
  229. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/ingest/ignore_patterns.py +0 -0
  230. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/ingest/image_probe.py +0 -0
  231. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/ingest/ingress.py +0 -0
  232. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/ingest/insert_saga.py +0 -0
  233. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/ingest/llm/__init__.py +0 -0
  234. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/ingest/llm/anthropic_haiku.py +0 -0
  235. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/ingest/llm/base.py +0 -0
  236. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/ingest/llm/byok_provider.py +0 -0
  237. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/ingest/llm/classification_context.py +0 -0
  238. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/ingest/llm/config_store.py +0 -0
  239. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/ingest/llm/factory.py +0 -0
  240. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/ingest/llm/kg_enricher.py +0 -0
  241. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/ingest/llm/local_gateway.py +0 -0
  242. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/ingest/llm/local_vllm.py +0 -0
  243. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/ingest/llm/openai_nano.py +0 -0
  244. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/ingest/lock_advisory.py +0 -0
  245. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/ingest/parser_router.py +0 -0
  246. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/ingest/parsers/__init__.py +0 -0
  247. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/ingest/parsers/docling_parser.py +0 -0
  248. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/ingest/parsers/docparse_gateway.py +0 -0
  249. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/ingest/parsers/docx_parser.py +0 -0
  250. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/ingest/parsers/folder_unpacker.py +0 -0
  251. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/ingest/parsers/gateway_aux.py +0 -0
  252. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/ingest/parsers/image_parser.py +0 -0
  253. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/ingest/parsers/internal_markdown.py +0 -0
  254. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/ingest/parsers/ocr_gateway.py +0 -0
  255. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/ingest/parsers/ocr_pdf_parser.py +0 -0
  256. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/ingest/parsers/pdf_types.py +0 -0
  257. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/ingest/parsers/transcript_parser.py +0 -0
  258. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/ingest/parsers/vision_gateway.py +0 -0
  259. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/ingest/parsers/xlsx_parser.py +0 -0
  260. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/ingest/parsers/zip_unpacker.py +0 -0
  261. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/ingest/preflight.py +0 -0
  262. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/ingest/routing_policy.py +0 -0
  263. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/ingest/serializers/__init__.py +0 -0
  264. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/ingest/serializers/xlsx_to_markdown.py +0 -0
  265. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/ingest/skip_log.py +0 -0
  266. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/ingest/watcher.py +0 -0
  267. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/kg/__init__.py +0 -0
  268. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/kg/audit.py +0 -0
  269. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/kg/hybrid_search.py +0 -0
  270. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/kg/lens.py +0 -0
  271. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/kg/pr_impact.py +0 -0
  272. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/kg/queries.py +0 -0
  273. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/kg/ranking.py +0 -0
  274. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/kg/rrf.py +0 -0
  275. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/kg_watcher_control.py +0 -0
  276. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/local_llm/__init__.py +0 -0
  277. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/local_llm/async_client.py +0 -0
  278. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/local_llm/client.py +0 -0
  279. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/local_llm/url_validator.py +0 -0
  280. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/metrics_collector.py +0 -0
  281. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/metrics_providers.py +0 -0
  282. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/model_registry.py +0 -0
  283. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/model_router.py +0 -0
  284. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/n8n_client.py +0 -0
  285. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/newsletter_llm_gateway.py +0 -0
  286. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/notification_service.py +0 -0
  287. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/openai_responses.py +0 -0
  288. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/opencode_metrics.py +0 -0
  289. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/opencode_sessions.py +0 -0
  290. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/pii_redactor.py +0 -0
  291. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/pr_impact_pipeline/__init__.py +0 -0
  292. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/pr_impact_pipeline/differ.py +0 -0
  293. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/pr_impact_pipeline/dispatcher.py +0 -0
  294. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/pr_impact_pipeline/gc.py +0 -0
  295. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/pr_impact_pipeline/languages.py +0 -0
  296. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/pr_impact_pipeline/parser.py +0 -0
  297. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/pr_impact_pipeline/writer.py +0 -0
  298. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/pr_service.py +0 -0
  299. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/project_paths.py +0 -0
  300. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/project_status_updates.py +0 -0
  301. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/providers.py +0 -0
  302. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/push_service.py +0 -0
  303. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/reminder_service.py +0 -0
  304. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/runas.py +0 -0
  305. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/salience_service.py +0 -0
  306. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/security_collector.py +0 -0
  307. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/session_catalog.py +0 -0
  308. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/session_metrics_service.py +0 -0
  309. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/session_ops.py +0 -0
  310. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/session_state.py +0 -0
  311. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/share_links.py +0 -0
  312. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/task_transitions.py +0 -0
  313. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/terminal_metrics.py +0 -0
  314. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/terminal_metrics_dump.py +0 -0
  315. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/tmux.py +0 -0
  316. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/webhook_service.py +0 -0
  317. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/workspace_sync.py +0 -0
  318. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/templates/__init__.py +0 -0
  319. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/templates/markdown_share.py +0 -0
  320. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/terminal.py +0 -0
  321. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/tests/__init__.py +0 -0
  322. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/tests/test_agent_facing_auth_dependencies.py +0 -0
  323. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/tests/test_audit_permissions.py +0 -0
  324. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/tests/test_backfill_session_conversations.py +0 -0
  325. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/tests/test_backfill_working_seconds_msg.py +0 -0
  326. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/tests/test_claude_metrics.py +0 -0
  327. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/tests/test_codex_metrics.py +0 -0
  328. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/tests/test_config_env_aliases.py +0 -0
  329. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/tests/test_finder_paths.py +0 -0
  330. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/tests/test_git_ops_merge.py +0 -0
  331. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/tests/test_learnings_check_search.py +0 -0
  332. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/tests/test_metrics_providers.py +0 -0
  333. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/tests/test_migration_087.py +0 -0
  334. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/tests/test_migration_088.py +0 -0
  335. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/tests/test_migration_089.py +0 -0
  336. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/tests/test_openai_responses.py +0 -0
  337. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/tests/test_opencode_metrics.py +0 -0
  338. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/tests/test_opencode_sessions.py +0 -0
  339. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/tests/test_pr_workflow_e2e.py +0 -0
  340. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/tests/test_projects_handoffs.py +0 -0
  341. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/tests/test_providers.py +0 -0
  342. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/tests/test_require_scope_empty_deny.py +0 -0
  343. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/tests/test_safety_bridge.py +0 -0
  344. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/tests/test_session_catalog.py +0 -0
  345. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/tests/test_session_conversations.py +0 -0
  346. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/tests/test_session_metrics_service.py +0 -0
  347. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/tests/test_session_resume_paths.py +0 -0
  348. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/tests/test_session_theme_mode_migration.py +0 -0
  349. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/tests/test_sessions_rbac.py +0 -0
  350. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/tests/test_share_edit.py +0 -0
  351. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/tests/test_share_repo.py +0 -0
  352. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/tests/test_terminal_session_manager.py +0 -0
  353. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/tests/test_terminal_upload.py +0 -0
  354. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/tests/test_tmux.py +0 -0
  355. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/tests/test_workspace_sync.py +0 -0
  356. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/tests/test_ws_ticket_in_memory.py +0 -0
  357. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/use_cases/__init__.py +0 -0
  358. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/use_cases/_context.py +0 -0
  359. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/use_cases/_errors.py +0 -0
  360. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/use_cases/_roles.py +0 -0
  361. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/use_cases/audit.py +0 -0
  362. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/use_cases/brain.py +0 -0
  363. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/use_cases/costs.py +0 -0
  364. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/use_cases/graph.py +0 -0
  365. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/use_cases/handoffs.py +0 -0
  366. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/use_cases/ingest_triage.py +0 -0
  367. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/use_cases/learnings.py +0 -0
  368. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/use_cases/projects.py +0 -0
  369. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/use_cases/pull_requests.py +0 -0
  370. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/use_cases/search.py +0 -0
  371. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/use_cases/tasks.py +0 -0
  372. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/visibility.py +0 -0
  373. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/cli/README.md +0 -0
  374. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/cli/__init__.py +0 -0
  375. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/cli/_index_source.py +0 -0
  376. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/cli/_runtime_ctx.py +0 -0
  377. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/cli/_transmute.py +0 -0
  378. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/cli/marvis_account.py +0 -0
  379. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/cli/marvis_brain.py +0 -0
  380. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/cli/marvis_governance.py +0 -0
  381. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/cli/marvis_hooks.py +0 -0
  382. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/cli/marvis_mcp.py +0 -0
  383. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/cli/marvis_runtime.py +0 -0
  384. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/scripts/_drift_check.py +0 -0
  385. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/scripts/_frontmatter.py +0 -0
  386. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/scripts/_graph_writer.py +0 -0
  387. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/scripts/ast_parser.py +0 -0
  388. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/scripts/install_hooks/__init__.py +0 -0
  389. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/scripts/install_hooks/_config.sh +0 -0
  390. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/scripts/install_hooks/block-dangerous-bash.sh +0 -0
  391. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/scripts/install_hooks/block-db-direct-write.sh +0 -0
  392. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/scripts/install_hooks/block-push-no-task.sh +0 -0
  393. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/scripts/install_hooks/block-staging-to-prod.sh +0 -0
  394. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/scripts/install_hooks/block-subtree-push.sh +0 -0
  395. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/scripts/install_hooks/config.json +0 -0
  396. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/scripts/install_hooks/enforce-no-merge-main.sh +0 -0
  397. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/scripts/install_hooks/enforce-worktree.sh +0 -0
  398. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/scripts/install_hooks/quality-gate.sh +0 -0
  399. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/scripts/install_hooks/safety_bridge.py +0 -0
  400. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/scripts/install_hooks/secret-scan.sh +0 -0
  401. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/scripts/migrate_spike_node_ids.py +0 -0
  402. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/scripts/populate_artifacts.py +0 -0
  403. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/scripts/populate_cross_project.py +0 -0
  404. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/scripts/populate_inbox_nodes.py +0 -0
  405. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/scripts/populate_pr_impact.py +0 -0
  406. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/scripts/populate_project_nodes.py +0 -0
  407. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/scripts/populate_touch_counter.py +0 -0
  408. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/scripts/reparse_failed.py +0 -0
  409. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/scripts/safety_bridge.py +0 -0
  410. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/telemetry/__init__.py +0 -0
  411. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/telemetry/client.py +0 -0
  412. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/telemetry/entitlements.py +0 -0
  413. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/telemetry/rollup.py +0 -0
  414. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/telemetry/schema.py +0 -0
  415. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/telemetry/sender.py +0 -0
  416. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/wizard/__init__.py +0 -0
  417. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/wizard/state.py +0 -0
  418. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/wizard/steps.py +0 -0
  419. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/wizard/validation.py +0 -0
  420. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/marvisx_cli.egg-info/dependency_links.txt +0 -0
  421. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/marvisx_cli.egg-info/top_level.txt +0 -0
  422. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/001_initial.sql +0 -0
  423. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/002_tasks.sql +0 -0
  424. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/003_session_management.sql +0 -0
  425. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/004_projects_comments.sql +0 -0
  426. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/005_session_intelligence.sql +0 -0
  427. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/006_settings.sql +0 -0
  428. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/007_task_scoring.sql +0 -0
  429. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/008_cost_tracking.sql +0 -0
  430. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/009_session_card_metrics.sql +0 -0
  431. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/010_monitoring.sql +0 -0
  432. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/012_agent_api.sql +0 -0
  433. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/013_session_complete.sql +0 -0
  434. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/015_pull_requests.sql +0 -0
  435. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/015_pull_requests_down.sql +0 -0
  436. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/016_users_raci.sql +0 -0
  437. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/017_task_cost_entries.sql +0 -0
  438. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/018_agents.sql +0 -0
  439. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/018_agents_down.sql +0 -0
  440. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/019_review_feedback.sql +0 -0
  441. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/020_pr_commit_sha.sql +0 -0
  442. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/021_webhook_events.sql +0 -0
  443. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/022_devx_agent_managed.sql +0 -0
  444. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/022_devx_agent_managed_down.sql +0 -0
  445. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/023_devx_p1_gate.sql +0 -0
  446. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/023_devx_p1_gate_down.sql +0 -0
  447. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/024_chat_messages.sql +0 -0
  448. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/024_pr_conversation_id.sql +0 -0
  449. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/024_task_indexes.sql +0 -0
  450. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/024_task_indexes_down.sql +0 -0
  451. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/025_audit_log.sql +0 -0
  452. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/026_agent_tokens.sql +0 -0
  453. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/027_teams_auth_phase_b.sql +0 -0
  454. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/028_learnings.sql +0 -0
  455. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/029_team_roles.sql +0 -0
  456. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/030_finder_pins.sql +0 -0
  457. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/031_pr_deploy_status.sql +0 -0
  458. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/032_task_reminders.sql +0 -0
  459. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/033_events_retry_count.sql +0 -0
  460. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/033_session_owner.sql +0 -0
  461. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/034_notifications.sql +0 -0
  462. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/035_shared_links.sql +0 -0
  463. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/036_session_index_upgrade.sql +0 -0
  464. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/037_pr_approval.sql +0 -0
  465. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/038_pr_submitted_by.sql +0 -0
  466. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/039_push_subscriptions.sql +0 -0
  467. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/040_semantic_search.sql +0 -0
  468. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/041_workspaces.sql +0 -0
  469. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/042_oidc_providers.sql +0 -0
  470. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/043_ci_checks.sql +0 -0
  471. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/044_agent_metrics.sql +0 -0
  472. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/045_documents_doc_type.sql +0 -0
  473. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/046_salience.sql +0 -0
  474. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/047_seed_missing_agents.sql +0 -0
  475. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/048_fix_agent_paths_roles.sql +0 -0
  476. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/049_agent_role_and_learnings_schema.sql +0 -0
  477. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/050_session_provider.sql +0 -0
  478. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/051_session_launch_profile.sql +0 -0
  479. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/052_session_theme_mode.sql +0 -0
  480. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/052_task_kind.sql +0 -0
  481. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/053_inbox_items.sql +0 -0
  482. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/054_inbox_triage_contract.sql +0 -0
  483. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/055_inbox_topic_treatment.sql +0 -0
  484. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/056_inbox_treatment_read_save.sql +0 -0
  485. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/057_session_theme_mode_backfill.sql +0 -0
  486. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/058_inbox_item_status_lifecycle.sql +0 -0
  487. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/059_inbox_tldr_and_source_scores.sql +0 -0
  488. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/060_newsletter.sql +0 -0
  489. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/061_inbox_redesign.sql +0 -0
  490. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/062_fix_inbox_sources_backfill.sql +0 -0
  491. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/063_task_completion_mode.sql +0 -0
  492. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/064_judge_mode_setting.sql +0 -0
  493. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/065_knowledge_graph_spike.sql +0 -0
  494. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/066_digest_ranking_inputs.sql +0 -0
  495. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/066_kg_artifact_nodes.sql +0 -0
  496. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/067_inbox_digest_selections.sql +0 -0
  497. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/067_kg_temporal.sql +0 -0
  498. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/068_inbox_digest_app_settings.sql +0 -0
  499. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/068_kg_touch_counter.sql +0 -0
  500. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/069_kg_doc_types.sql +0 -0
  501. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/070_digest_ranking_inputs_recovery.sql +0 -0
  502. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/071_inbox_digest_selections_recovery.sql +0 -0
  503. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/072_inbox_digest_app_settings_recovery.sql +0 -0
  504. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/073_kg_cross_project.sql +0 -0
  505. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/073_kg_cross_project_down.sql +0 -0
  506. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/074_kg_infra_types.sql +0 -0
  507. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/074_kg_infra_types_down.sql +0 -0
  508. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/075_kg_file_state_recovery.sql +0 -0
  509. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/075_kg_file_state_recovery_down.sql +0 -0
  510. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/076_kg_watcher_state.sql +0 -0
  511. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/076_kg_watcher_state_down.sql +0 -0
  512. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/077_kg_doc_types_extend.sql +0 -0
  513. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/077_kg_doc_types_extend_down.sql +0 -0
  514. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/078_kg_fts5.sql +0 -0
  515. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/078_kg_fts5_down.sql +0 -0
  516. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/079_kg_missing_indexes.sql +0 -0
  517. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/079_kg_missing_indexes_down.sql +0 -0
  518. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/080_kg_fts5_extended.sql +0 -0
  519. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/080_kg_fts5_extended_down.sql +0 -0
  520. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/081_kg_lens_indexes.sql +0 -0
  521. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/081_kg_lens_indexes_down.sql +0 -0
  522. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/082_kg_pins.sql +0 -0
  523. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/082_kg_pins_down.sql +0 -0
  524. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/083_kg_graph_nodes_degree.sql +0 -0
  525. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/083_kg_graph_nodes_degree_down.sql +0 -0
  526. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/084_drop_legacy_scheduler_tables.sql +0 -0
  527. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/084_drop_legacy_scheduler_tables_down.sql +0 -0
  528. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/085_kg_edge_resolves_to.sql +0 -0
  529. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/085_kg_edge_resolves_to_down.sql +0 -0
  530. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/086_project_status_updates_feed.sql +0 -0
  531. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/086_project_status_updates_feed_down.sql +0 -0
  532. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/087_session_metrics_dual.sql +0 -0
  533. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/087_session_metrics_dual_down.sql +0 -0
  534. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/088_rename_context_pct_legacy.sql +0 -0
  535. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/088_rename_context_pct_legacy_down.sql +0 -0
  536. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/089_session_metrics_equivalent_cost.sql +0 -0
  537. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/089_session_metrics_equivalent_cost_down.sql +0 -0
  538. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/090_kg_inbox_node_type.sql +0 -0
  539. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/090_kg_inbox_node_type_down.sql +0 -0
  540. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/091_kg_inbox_node_type_check.sql +0 -0
  541. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/091_kg_inbox_node_type_check_down.sql +0 -0
  542. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/092_sessions_activity_state_ts.sql +0 -0
  543. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/092_sessions_activity_state_ts_down.sql +0 -0
  544. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/093_sessions_activity_state_column.sql +0 -0
  545. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/093_sessions_activity_state_column_down.sql +0 -0
  546. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/094_ingest_pending.sql +0 -0
  547. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/094_ingest_pending_down.sql +0 -0
  548. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/095_kg_intent_first.sql +0 -0
  549. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/095_kg_intent_first_down.sql +0 -0
  550. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/096_kg_xlsx_artifact_prefix.sql +0 -0
  551. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/096_kg_xlsx_artifact_prefix_down.sql +0 -0
  552. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/097_ingest_change_history.sql +0 -0
  553. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/097_ingest_change_history_down.sql +0 -0
  554. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/098_kg_node_type_business.sql +0 -0
  555. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/098_kg_node_type_business_down.sql +0 -0
  556. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/099_kg_edges_restore_weight.sql +0 -0
  557. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/099_kg_edges_restore_weight_down.sql +0 -0
  558. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/100_kg_enriched_at.sql +0 -0
  559. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/100_kg_enriched_at_down.sql +0 -0
  560. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/101_local_llm_shadow_comparisons.sql +0 -0
  561. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/101_local_llm_shadow_comparisons_down.sql +0 -0
  562. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/102_promote_llm_costs.sql +0 -0
  563. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/102_promote_llm_costs_down.sql +0 -0
  564. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/103_ingest_skipped_log.sql +0 -0
  565. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/103_ingest_skipped_log_down.sql +0 -0
  566. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/120_docs_governance.sql +0 -0
  567. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/120_docs_governance_down.sql +0 -0
  568. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/121_notification_event_fk_cleanup.sql +0 -0
  569. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/121_notification_event_fk_cleanup_down.sql +0 -0
  570. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/122_docs_drift_history.sql +0 -0
  571. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/122_docs_drift_history_down.sql +0 -0
  572. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/123_ingest_parser_waiting_status.sql +0 -0
  573. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/123_ingest_parser_waiting_status_down.sql +0 -0
  574. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/124_heypocket_recordings.sql +0 -0
  575. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/124_heypocket_recordings_down.sql +0 -0
  576. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/125_kg_node_type_record.sql +0 -0
  577. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/125_kg_node_type_record_down.sql +0 -0
  578. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/126_ingest_terminal_upload_source_kind.sql +0 -0
  579. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/126_ingest_terminal_upload_source_kind_down.sql +0 -0
  580. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/127_brain_v1_substrate.sql +0 -0
  581. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/127_brain_v1_substrate_down.sql +0 -0
  582. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/128_brain_drift_signals.sql +0 -0
  583. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/128_brain_drift_signals_down.sql +0 -0
  584. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/129_brain_memory_operations.sql +0 -0
  585. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/129_brain_memory_operations_down.sql +0 -0
  586. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/130_brain_findings.sql +0 -0
  587. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/130_brain_findings_down.sql +0 -0
  588. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/132_kg_pr_modifies.sql +0 -0
  589. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/132_kg_pr_modifies_down.sql +0 -0
  590. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/133_brain_v1_2_direction_schema.sql +0 -0
  591. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/133_brain_v1_2_direction_schema_down.sql +0 -0
  592. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/134_brain_journal_narrative_polished.sql +0 -0
  593. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/134_brain_journal_narrative_polished_down.sql +0 -0
  594. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/135_kg_edges_provider.sql +0 -0
  595. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/136_documents_fts.sql +0 -0
  596. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/137_promote_llm_costs.sql +0 -0
  597. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/137_promote_llm_costs_down.sql +0 -0
  598. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/138_ingest_api_keys.sql +0 -0
  599. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/138_ingest_api_keys_down.sql +0 -0
  600. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/139_ingest_pending_ingress.sql +0 -0
  601. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/139_ingest_pending_ingress_down.sql +0 -0
  602. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/140_ingest_idempotency_quota.sql +0 -0
  603. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/140_ingest_idempotency_quota_down.sql +0 -0
  604. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/141_ingest_pending_metadata.sql +0 -0
  605. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/141_ingest_pending_metadata_down.sql +0 -0
  606. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/142_llm_function_config.sql +0 -0
  607. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/142_llm_function_config_down.sql +0 -0
  608. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/143_kg_code_embeddings.sql +0 -0
  609. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/143_kg_code_embeddings_down.sql +0 -0
  610. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/144_notifications_pending_sync_index.sql +0 -0
  611. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/145_audit_log_immutable.sql +0 -0
  612. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/145_audit_log_immutable_down.sql +0 -0
  613. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/__init__.py +0 -0
  614. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/projects/_template/project.yaml +0 -0
  615. {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: marvisx-cli
3
- Version: 0.3.5
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,6 +31,7 @@ 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
@@ -1,10 +1,31 @@
1
- # MarvisX
1
+ # Marvis
2
2
 
3
- Self-hosted, EU-resident **company brain** for agent-native operations: a cross-project Knowledge Graph, audit-immutable provenance, reflective Brain pipeline, and an agent-native Model Context Protocol surface.
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
4
 
5
- Released as a defensive-publication architectural pattern. See the Zenodo preprint: [`10.5281/zenodo.20341860`](https://doi.org/10.5281/zenodo.20341860).
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
6
 
7
- ## What MarvisX gives you
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
8
29
 
9
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}`.
10
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.
@@ -14,22 +35,22 @@ Released as a defensive-publication architectural pattern. See the Zenodo prepri
14
35
 
15
36
  ## Search and embedding quality
16
37
 
17
- MarvisX-OSS Phase 1 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`.
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`.
18
39
 
19
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.
20
41
 
21
42
  ## License posture
22
43
 
23
- - Code: **Business Source License 1.1**, with an automatic change date converting to **Apache License 2.0** four years after release.
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.
24
45
  - Documentation and architectural patterns: **CC-BY 4.0**.
25
46
 
26
- The combination is intended to make the architecture freely citable while preserving the ability to ship a self-hosted reference deployment.
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.
27
48
 
28
49
  ## Architecture map
29
50
 
30
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.
31
52
 
32
- For the full architectural description, see the Zenodo preprint linked above.
53
+ The full architectural description is the MarvisX preprint on Zenodo: [`10.5281/zenodo.20341860`](https://doi.org/10.5281/zenodo.20341860).
33
54
 
34
55
  ## Repository layout
35
56
 
@@ -46,9 +67,9 @@ deploy/
46
67
  # (Docker Compose + environment scaffolding)
47
68
  ```
48
69
 
49
- ## Quick start
70
+ ## Self-hosting the full stack
50
71
 
51
- The reference deployment uses Docker Compose. Clone the repository, copy `deploy/_template/.env.example` to `.env`, populate the required secrets, and bring the stack up:
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:
52
73
 
53
74
  ```bash
54
75
  cp deploy/_template/.env.example deploy/_template/.env
@@ -58,13 +79,9 @@ docker compose up -d
58
79
 
59
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.
60
81
 
61
- ## Setting up local embeddings
62
-
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
-
65
82
  ## MCP surface
66
83
 
67
- MarvisX 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.
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.
68
85
 
69
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.
70
87
 
@@ -78,15 +95,25 @@ Setting `MARVIS_OSS_LOCAL=1` (truthy: `1`/`true`/`yes`/`on`) makes the `block-db
78
95
 
79
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.
80
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
+
81
110
  ## Documentation
82
111
 
83
112
  - [`docs/SEARCH-QUALITY.md`](docs/SEARCH-QUALITY.md) — search quality expectations, affected workflows, and mitigations
84
- - [`docs/MIGRATION-TO-LOCAL-EMBEDDINGS.md`](docs/MIGRATION-TO-LOCAL-EMBEDDINGS.md) — setting up the self-hosted Granite embedding backend
85
- - [`docs/solutions/architecture-patterns/`](docs/solutions/architecture-patterns/) — architectural decision records
86
113
 
87
114
  ## Contributing
88
115
 
89
- This is a defensive-publication release. The repository accepts issues for bug reports and clarifications. The architecture itself is documented in the Zenodo preprint; the codebase is intended as the reference implementation of that architecture.
116
+ Issues and bug reports are welcome through the repository tracker.
90
117
 
91
118
  ## References
92
119
 
@@ -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"
@@ -70,7 +72,12 @@ class Settings(BaseSettings):
70
72
  ),
71
73
  )
72
74
  db_path: str = Field(
73
- default="console.db",
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()),
74
81
  validation_alias=AliasChoices("MARVIS_DB_PATH", "PIR_DB_PATH", "DB_PATH"),
75
82
  )
76
83
  cookie_domain: str | None = Field(default=None, alias="COOKIE_DOMAIN")
@@ -544,16 +551,14 @@ class Settings(BaseSettings):
544
551
 
545
552
  Returns '' when GIT_RUNAS_USER is unset or already matches the current
546
553
  OS user (no privilege hop needed)."""
547
- import pwd
548
-
549
554
  user = (self.git_runas_user or "").strip()
550
555
  if not user:
551
556
  return ""
552
- try:
553
- if pwd.getpwuid(os.getuid()).pw_name == user:
554
- return ""
555
- except (KeyError, OSError):
556
- 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 ""
557
562
  return user
558
563
 
559
564
 
@@ -109,6 +109,59 @@ def register(mcp) -> None:
109
109
  except ServiceError as e:
110
110
  raise_mcp_error(e)
111
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)
162
+ except ServiceError as e:
163
+ raise_mcp_error(e)
164
+
112
165
  @mcp.tool()
113
166
  async def list_learnings(
114
167
  project: str | None = None,
@@ -18,7 +18,6 @@ VALID_STATUSES = {
18
18
  VALID_PRIORITIES = {"high", "medium", "low"}
19
19
  VALID_KINDS = {"normal", "idea"}
20
20
  VALID_SOURCES = {
21
- "reflectx_proposal",
22
21
  "telegram",
23
22
  "manual",
24
23
  "session",
@@ -51,7 +50,7 @@ class TaskCreateRequest(BaseModel):
51
50
  priority: str = Field("medium", pattern=r"^(high|medium|low)$")
52
51
  source: str = Field(
53
52
  ...,
54
- pattern=r"^(reflectx_proposal|telegram|manual|session|console|rem_proposal)$",
53
+ pattern=r"^(telegram|manual|session|console|rem_proposal)$",
55
54
  )
56
55
  source_ref: str | None = Field(None, max_length=500)
57
56
  owner_id: str | None = Field(
@@ -29,6 +29,7 @@ import shutil
29
29
  import sys
30
30
  from typing import Any
31
31
 
32
+ from core.platform import secure_path
32
33
  from core.telemetry import client as _tc # canonical ~/.marvis + settings.yaml reader
33
34
 
34
35
  _RUN_INTERVAL_S = 24 * 3600
@@ -71,10 +72,7 @@ def _mark_ran(now: float) -> None:
71
72
  path = _last_run_path()
72
73
  path.parent.mkdir(parents=True, exist_ok=True)
73
74
  path.write_text(f"{now:.0f}\n", encoding="utf-8")
74
- try:
75
- os.chmod(path, 0o600)
76
- except OSError:
77
- pass
75
+ secure_path(path, mode=0o600)
78
76
  except Exception: # noqa: BLE001
79
77
  pass
80
78
 
@@ -35,10 +35,13 @@ import sys
35
35
  from pathlib import Path
36
36
  from typing import Any
37
37
 
38
+ from core.platform import current_uid
39
+
38
40
  # launchd Label / systemd unit base / cron marker — one identity across backends.
39
41
  _LABEL = "com.marvisx.brain"
40
42
  _UNIT = "marvis-brain"
41
43
  _CRON_MARKER = "# marvis-brain"
44
+ _SCHTASKS_TN = "MarvisX Brain" # Windows Task Scheduler task name
42
45
 
43
46
  # Default daily fire time (local), off-peak.
44
47
  _HOUR = 3
@@ -75,11 +78,11 @@ def _run(cmd: list[str], *, input_text: str | None = None) -> tuple[int, str, st
75
78
 
76
79
 
77
80
  def detect_backend() -> str:
78
- """Return ``launchd`` | ``systemd`` | ``cron`` | ``unsupported``."""
81
+ """Return ``launchd`` | ``systemd`` | ``cron`` | ``schtasks`` | ``unsupported``."""
79
82
  if sys.platform == "darwin":
80
83
  return "launchd"
81
84
  if sys.platform.startswith("win"):
82
- return "unsupported"
85
+ return "schtasks"
83
86
  if shutil.which("systemctl"):
84
87
  return "systemd"
85
88
  if shutil.which("crontab"):
@@ -93,7 +96,7 @@ def _marvis_path() -> str | None:
93
96
  if exe:
94
97
  return exe
95
98
  argv0 = sys.argv[0] if sys.argv else ""
96
- if argv0.endswith(("marvis", "marvis-init")) and os.path.isfile(argv0):
99
+ if argv0.endswith(("marvis", "marvis.exe", "marvis-init", "marvis-init.exe")) and os.path.isfile(argv0):
97
100
  return os.path.abspath(argv0)
98
101
  return None
99
102
 
@@ -189,7 +192,7 @@ def _launchd_enable() -> dict[str, Any]:
189
192
  plist = _launchd_plist_path()
190
193
  plist.parent.mkdir(parents=True, exist_ok=True)
191
194
  plist.write_text(plist_text(marvis), encoding="utf-8")
192
- domain = f"gui/{os.getuid()}"
195
+ domain = f"gui/{current_uid()}"
193
196
  # Idempotent: bootout an existing instance first (ignore failure), then bootstrap.
194
197
  _run(["launchctl", "bootout", f"{domain}/{_LABEL}"])
195
198
  rc, _out, err = _run(["launchctl", "bootstrap", domain, str(plist)])
@@ -203,7 +206,7 @@ def _launchd_enable() -> dict[str, Any]:
203
206
 
204
207
  def _launchd_disable() -> dict[str, Any]:
205
208
  plist = _launchd_plist_path()
206
- rc, _out, err = _run(["launchctl", "bootout", f"gui/{os.getuid()}/{_LABEL}"])
209
+ rc, _out, err = _run(["launchctl", "bootout", f"gui/{current_uid()}/{_LABEL}"])
207
210
  removed = False
208
211
  if plist.is_file():
209
212
  plist.unlink()
@@ -214,7 +217,7 @@ def _launchd_disable() -> dict[str, Any]:
214
217
 
215
218
  def _launchd_status() -> dict[str, Any]:
216
219
  plist = _launchd_plist_path()
217
- rc, _out, _err = _run(["launchctl", "print", f"gui/{os.getuid()}/{_LABEL}"])
220
+ rc, _out, _err = _run(["launchctl", "print", f"gui/{current_uid()}/{_LABEL}"])
218
221
  return {
219
222
  "backend": "launchd",
220
223
  "enabled": rc == 0,
@@ -335,13 +338,68 @@ def _cron_status() -> dict[str, Any]:
335
338
  return {"backend": "cron", "enabled": present}
336
339
 
337
340
 
341
+ # ---------------------------------------------------------------------------
342
+ # schtasks backend (Windows Task Scheduler)
343
+ # ---------------------------------------------------------------------------
344
+
345
+
346
+ def schtasks_argv_create(
347
+ marvis_path: str, *, hour: int = _HOUR, minute: int = _MINUTE, tn: str = _SCHTASKS_TN
348
+ ) -> list[str]:
349
+ """Build the ``schtasks /create`` argv (PURE — unit-tested).
350
+
351
+ ``/tr`` is ONE argv element; the program path keeps its OWN inner quotes so a
352
+ space in ``%USERPROFILE%`` (e.g. ``C:\\Users\\Marsida Curaj\\...``) survives Task
353
+ Scheduler parsing. ``_run`` passes a list (no shell), so subprocess does the
354
+ OUTER quoting via ``list2cmdline``; this builder owns only the inner ``/tr``.
355
+ ``/f`` force-overwrites = idempotent; no ``/ru`` = current user, no admin.
356
+ """
357
+ tr = f'"{marvis_path}" brain run --mode full'
358
+ return [
359
+ "schtasks", "/create", "/tn", tn, "/tr", tr,
360
+ "/sc", "DAILY", "/st", f"{hour:02d}:{minute:02d}", "/f",
361
+ ]
362
+
363
+
364
+ def _schtasks_enable() -> dict[str, Any]:
365
+ marvis = _marvis_path()
366
+ if not marvis:
367
+ return {"backend": "schtasks", "ok": False, "error": "marvis not found on PATH"}
368
+ rc, _out, err = _run(schtasks_argv_create(marvis))
369
+ # schtasks can refuse on a password-protected / Microsoft-account user without
370
+ # stored creds; never crash — the opportunistic on-invocation upkeep is the net.
371
+ return {
372
+ "backend": "schtasks",
373
+ "ok": rc == 0,
374
+ "task_name": _SCHTASKS_TN,
375
+ "error": err.strip() if rc != 0 else None,
376
+ "warning": (
377
+ None
378
+ if rc == 0
379
+ else "could not register the Windows scheduled task; the opportunistic "
380
+ "on-invocation upkeep still runs whenever you use marvis"
381
+ ),
382
+ }
383
+
384
+
385
+ def _schtasks_disable() -> dict[str, Any]:
386
+ # rc!=0 when the task does not exist — still a successful disable.
387
+ rc, _out, _err = _run(["schtasks", "/delete", "/tn", _SCHTASKS_TN, "/f"])
388
+ return {"backend": "schtasks", "ok": True, "deleted_rc": rc}
389
+
390
+
391
+ def _schtasks_status() -> dict[str, Any]:
392
+ rc, _out, _err = _run(["schtasks", "/query", "/tn", _SCHTASKS_TN])
393
+ return {"backend": "schtasks", "enabled": rc == 0}
394
+
395
+
338
396
  # ---------------------------------------------------------------------------
339
397
  # Public dispatch
340
398
  # ---------------------------------------------------------------------------
341
399
 
342
- _ENABLE = {"launchd": _launchd_enable, "systemd": _systemd_enable, "cron": _cron_enable}
343
- _DISABLE = {"launchd": _launchd_disable, "systemd": _systemd_disable, "cron": _cron_disable}
344
- _STATUS = {"launchd": _launchd_status, "systemd": _systemd_status, "cron": _cron_status}
400
+ _ENABLE = {"launchd": _launchd_enable, "systemd": _systemd_enable, "cron": _cron_enable, "schtasks": _schtasks_enable}
401
+ _DISABLE = {"launchd": _launchd_disable, "systemd": _systemd_disable, "cron": _cron_disable, "schtasks": _schtasks_disable}
402
+ _STATUS = {"launchd": _launchd_status, "systemd": _systemd_status, "cron": _cron_status, "schtasks": _schtasks_status}
345
403
 
346
404
 
347
405
  def enable(cadence: str = "daily") -> dict[str, Any]:
@@ -0,0 +1,164 @@
1
+ # v1.0.0 - 2026-06-03 - 0.3.6: opt-out CLI "update available" notice (notify-only)
2
+ """Throttled, fail-silent "a new version is available" notice (NOTIFY ONLY).
3
+
4
+ NEVER self-updates — no ``pip``/``uv`` side effect. It prints one line to stderr
5
+ telling the user how to upgrade. npm-style decoupling so the notice is reliable:
6
+
7
+ - print INSTANTLY from a cached latest-version file (so it actually shows, even
8
+ on a fast command that would outrun a background network call), then
9
+ - refresh that cache in a detached daemon thread at most once per 24h.
10
+
11
+ First run has no cache → no notice, but kicks the refresh → the next run shows it.
12
+
13
+ Opt out via ``MARVIS_NO_UPDATE_CHECK=1`` or ``settings.yaml`` ``update_check: false``.
14
+ """
15
+ from __future__ import annotations
16
+
17
+ import os
18
+ import sys
19
+
20
+ from core.telemetry import client as _tc # canonical ~/.marvis + settings reader
21
+
22
+ _PACKAGE = "marvisx-cli"
23
+ _PYPI_JSON = "https://pypi.org/pypi/marvisx-cli/json"
24
+ _CHECK_INTERVAL_S = 24 * 3600
25
+ _TIMEOUT = 2.5
26
+
27
+
28
+ def _last_check_path():
29
+ return _tc._marvis_dir() / "update_last_check"
30
+
31
+
32
+ def _cached_latest_path():
33
+ return _tc._marvis_dir() / "update_latest"
34
+
35
+
36
+ def _opted_out() -> bool:
37
+ if os.environ.get("MARVIS_NO_UPDATE_CHECK"):
38
+ return True
39
+ try:
40
+ return _tc._read_settings().get("update_check") is False
41
+ except Exception: # noqa: BLE001
42
+ return False
43
+
44
+
45
+ def _installed_version() -> str | None:
46
+ try:
47
+ from importlib.metadata import version
48
+
49
+ return version(_PACKAGE)
50
+ except Exception: # noqa: BLE001
51
+ return None
52
+
53
+
54
+ def _read_cached_latest() -> str | None:
55
+ try:
56
+ path = _cached_latest_path()
57
+ if path.is_file():
58
+ return path.read_text(encoding="utf-8").strip() or None
59
+ except Exception: # noqa: BLE001
60
+ return None
61
+ return None
62
+
63
+
64
+ def _write_cached_latest(version: str) -> None:
65
+ try:
66
+ path = _cached_latest_path()
67
+ path.parent.mkdir(parents=True, exist_ok=True)
68
+ path.write_text(version.strip() + "\n", encoding="utf-8")
69
+ except Exception: # noqa: BLE001
70
+ pass
71
+
72
+
73
+ def _should_check(now: float) -> bool:
74
+ try:
75
+ path = _last_check_path()
76
+ if not path.is_file():
77
+ return True
78
+ last = float(path.read_text(encoding="utf-8").strip() or 0)
79
+ return (now - last) >= _CHECK_INTERVAL_S
80
+ except Exception: # noqa: BLE001
81
+ return False
82
+
83
+
84
+ def _mark_checked(now: float) -> None:
85
+ try:
86
+ path = _last_check_path()
87
+ path.parent.mkdir(parents=True, exist_ok=True)
88
+ path.write_text(f"{now:.0f}\n", encoding="utf-8")
89
+ except Exception: # noqa: BLE001
90
+ pass
91
+
92
+
93
+ def _parse(v: str) -> tuple[int, ...]:
94
+ """Numeric release tuple; a pre-release/garbage chunk truncates to its int
95
+ prefix (0 if none) — conservative, never crashes."""
96
+ out: list[int] = []
97
+ for chunk in v.split("."):
98
+ digits = ""
99
+ for ch in chunk:
100
+ if ch.isdigit():
101
+ digits += ch
102
+ else:
103
+ break
104
+ out.append(int(digits) if digits else 0)
105
+ return tuple(out)
106
+
107
+
108
+ def _is_newer(latest: str, installed: str) -> bool:
109
+ try:
110
+ return _parse(latest) > _parse(installed)
111
+ except Exception: # noqa: BLE001
112
+ return False
113
+
114
+
115
+ def _fetch_latest() -> str | None:
116
+ import json
117
+ import urllib.request
118
+
119
+ try:
120
+ req = urllib.request.Request(
121
+ _PYPI_JSON, headers={"User-Agent": "marvis-update-check/1"}
122
+ )
123
+ with urllib.request.urlopen(req, timeout=_TIMEOUT) as resp: # noqa: S310 — https pinned
124
+ data = json.loads(resp.read().decode("utf-8", "replace"))
125
+ v = (data.get("info") or {}).get("version")
126
+ return v if isinstance(v, str) and v else None
127
+ except Exception: # noqa: BLE001 — down/slow PyPI → silent
128
+ return None
129
+
130
+
131
+ def _refresh_cache() -> None:
132
+ latest = _fetch_latest()
133
+ if latest:
134
+ _write_cached_latest(latest)
135
+
136
+
137
+ def maybe_notify_update() -> None:
138
+ """Print a cached "update available" notice (instant), then refresh the cache
139
+ in the background ≤1×/day. Notify-only, fail-silent, never blocks."""
140
+ try:
141
+ if _opted_out():
142
+ return
143
+
144
+ installed = _installed_version()
145
+ if installed:
146
+ cached = _read_cached_latest()
147
+ if cached and _is_newer(cached, installed):
148
+ sys.stderr.write(
149
+ f"\n[marvis] update available: {installed} → {cached}. "
150
+ f"Upgrade with: uv tool upgrade {_PACKAGE}\n"
151
+ )
152
+
153
+ from time import time
154
+
155
+ now = time()
156
+ if _should_check(now):
157
+ _mark_checked(now) # claim the 24h window before the network call
158
+ import threading
159
+
160
+ threading.Thread(
161
+ target=_refresh_cache, name="marvis-update-check", daemon=True
162
+ ).start()
163
+ except Exception: # noqa: BLE001 — must never affect the command
164
+ return