mindroom 0.0.0__py3-none-any.whl → 0.1.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (155) hide show
  1. mindroom/__init__.py +3 -0
  2. mindroom/agent_prompts.py +963 -0
  3. mindroom/agents.py +248 -0
  4. mindroom/ai.py +421 -0
  5. mindroom/api/__init__.py +1 -0
  6. mindroom/api/credentials.py +137 -0
  7. mindroom/api/google_integration.py +355 -0
  8. mindroom/api/google_tools_helper.py +40 -0
  9. mindroom/api/homeassistant_integration.py +421 -0
  10. mindroom/api/integrations.py +189 -0
  11. mindroom/api/main.py +506 -0
  12. mindroom/api/matrix_operations.py +219 -0
  13. mindroom/api/tools.py +94 -0
  14. mindroom/background_tasks.py +87 -0
  15. mindroom/bot.py +2470 -0
  16. mindroom/cli.py +86 -0
  17. mindroom/commands.py +377 -0
  18. mindroom/config.py +343 -0
  19. mindroom/config_commands.py +324 -0
  20. mindroom/config_confirmation.py +411 -0
  21. mindroom/constants.py +52 -0
  22. mindroom/credentials.py +146 -0
  23. mindroom/credentials_sync.py +134 -0
  24. mindroom/custom_tools/__init__.py +8 -0
  25. mindroom/custom_tools/config_manager.py +765 -0
  26. mindroom/custom_tools/gmail.py +92 -0
  27. mindroom/custom_tools/google_calendar.py +92 -0
  28. mindroom/custom_tools/google_sheets.py +92 -0
  29. mindroom/custom_tools/homeassistant.py +341 -0
  30. mindroom/error_handling.py +35 -0
  31. mindroom/file_watcher.py +49 -0
  32. mindroom/interactive.py +313 -0
  33. mindroom/logging_config.py +207 -0
  34. mindroom/matrix/__init__.py +1 -0
  35. mindroom/matrix/client.py +782 -0
  36. mindroom/matrix/event_info.py +173 -0
  37. mindroom/matrix/identity.py +149 -0
  38. mindroom/matrix/large_messages.py +267 -0
  39. mindroom/matrix/mentions.py +141 -0
  40. mindroom/matrix/message_builder.py +94 -0
  41. mindroom/matrix/message_content.py +209 -0
  42. mindroom/matrix/presence.py +178 -0
  43. mindroom/matrix/rooms.py +311 -0
  44. mindroom/matrix/state.py +77 -0
  45. mindroom/matrix/typing.py +91 -0
  46. mindroom/matrix/users.py +217 -0
  47. mindroom/memory/__init__.py +21 -0
  48. mindroom/memory/config.py +137 -0
  49. mindroom/memory/functions.py +396 -0
  50. mindroom/py.typed +0 -0
  51. mindroom/response_tracker.py +128 -0
  52. mindroom/room_cleanup.py +139 -0
  53. mindroom/routing.py +107 -0
  54. mindroom/scheduling.py +758 -0
  55. mindroom/stop.py +207 -0
  56. mindroom/streaming.py +203 -0
  57. mindroom/teams.py +749 -0
  58. mindroom/thread_utils.py +318 -0
  59. mindroom/tools/__init__.py +520 -0
  60. mindroom/tools/agentql.py +64 -0
  61. mindroom/tools/airflow.py +57 -0
  62. mindroom/tools/apify.py +49 -0
  63. mindroom/tools/arxiv.py +64 -0
  64. mindroom/tools/aws_lambda.py +41 -0
  65. mindroom/tools/aws_ses.py +57 -0
  66. mindroom/tools/baidusearch.py +87 -0
  67. mindroom/tools/brightdata.py +116 -0
  68. mindroom/tools/browserbase.py +62 -0
  69. mindroom/tools/cal_com.py +98 -0
  70. mindroom/tools/calculator.py +112 -0
  71. mindroom/tools/cartesia.py +84 -0
  72. mindroom/tools/composio.py +166 -0
  73. mindroom/tools/config_manager.py +44 -0
  74. mindroom/tools/confluence.py +73 -0
  75. mindroom/tools/crawl4ai.py +101 -0
  76. mindroom/tools/csv.py +104 -0
  77. mindroom/tools/custom_api.py +106 -0
  78. mindroom/tools/dalle.py +85 -0
  79. mindroom/tools/daytona.py +180 -0
  80. mindroom/tools/discord.py +81 -0
  81. mindroom/tools/docker.py +73 -0
  82. mindroom/tools/duckdb.py +124 -0
  83. mindroom/tools/duckduckgo.py +99 -0
  84. mindroom/tools/e2b.py +121 -0
  85. mindroom/tools/eleven_labs.py +77 -0
  86. mindroom/tools/email.py +74 -0
  87. mindroom/tools/exa.py +246 -0
  88. mindroom/tools/fal.py +50 -0
  89. mindroom/tools/file.py +80 -0
  90. mindroom/tools/financial_datasets_api.py +112 -0
  91. mindroom/tools/firecrawl.py +124 -0
  92. mindroom/tools/gemini.py +85 -0
  93. mindroom/tools/giphy.py +49 -0
  94. mindroom/tools/github.py +376 -0
  95. mindroom/tools/gmail.py +102 -0
  96. mindroom/tools/google_calendar.py +55 -0
  97. mindroom/tools/google_maps.py +112 -0
  98. mindroom/tools/google_sheets.py +86 -0
  99. mindroom/tools/googlesearch.py +83 -0
  100. mindroom/tools/groq.py +77 -0
  101. mindroom/tools/hackernews.py +54 -0
  102. mindroom/tools/jina.py +108 -0
  103. mindroom/tools/jira.py +70 -0
  104. mindroom/tools/linear.py +103 -0
  105. mindroom/tools/linkup.py +65 -0
  106. mindroom/tools/lumalabs.py +71 -0
  107. mindroom/tools/mem0.py +82 -0
  108. mindroom/tools/modelslabs.py +85 -0
  109. mindroom/tools/moviepy_video_tools.py +62 -0
  110. mindroom/tools/newspaper4k.py +63 -0
  111. mindroom/tools/openai.py +143 -0
  112. mindroom/tools/openweather.py +89 -0
  113. mindroom/tools/oxylabs.py +54 -0
  114. mindroom/tools/pandas.py +35 -0
  115. mindroom/tools/pubmed.py +64 -0
  116. mindroom/tools/python.py +120 -0
  117. mindroom/tools/reddit.py +155 -0
  118. mindroom/tools/replicate.py +56 -0
  119. mindroom/tools/resend.py +55 -0
  120. mindroom/tools/scrapegraph.py +87 -0
  121. mindroom/tools/searxng.py +120 -0
  122. mindroom/tools/serpapi.py +55 -0
  123. mindroom/tools/serper.py +81 -0
  124. mindroom/tools/shell.py +46 -0
  125. mindroom/tools/slack.py +80 -0
  126. mindroom/tools/sleep.py +38 -0
  127. mindroom/tools/spider.py +62 -0
  128. mindroom/tools/sql.py +138 -0
  129. mindroom/tools/tavily.py +104 -0
  130. mindroom/tools/telegram.py +54 -0
  131. mindroom/tools/todoist.py +103 -0
  132. mindroom/tools/trello.py +121 -0
  133. mindroom/tools/twilio.py +97 -0
  134. mindroom/tools/web_browser_tools.py +37 -0
  135. mindroom/tools/webex.py +63 -0
  136. mindroom/tools/website.py +45 -0
  137. mindroom/tools/whatsapp.py +81 -0
  138. mindroom/tools/wikipedia.py +45 -0
  139. mindroom/tools/x.py +97 -0
  140. mindroom/tools/yfinance.py +121 -0
  141. mindroom/tools/youtube.py +81 -0
  142. mindroom/tools/zendesk.py +62 -0
  143. mindroom/tools/zep.py +107 -0
  144. mindroom/tools/zoom.py +62 -0
  145. mindroom/tools_metadata.json +7643 -0
  146. mindroom/tools_metadata.py +220 -0
  147. mindroom/topic_generator.py +153 -0
  148. mindroom/voice_handler.py +266 -0
  149. mindroom-0.1.0.dist-info/METADATA +425 -0
  150. mindroom-0.1.0.dist-info/RECORD +152 -0
  151. {mindroom-0.0.0.dist-info → mindroom-0.1.0.dist-info}/WHEEL +1 -2
  152. mindroom-0.1.0.dist-info/entry_points.txt +2 -0
  153. mindroom-0.0.0.dist-info/METADATA +0 -24
  154. mindroom-0.0.0.dist-info/RECORD +0 -4
  155. mindroom-0.0.0.dist-info/top_level.txt +0 -1
@@ -0,0 +1,134 @@
1
+ """Sync API keys from environment variables to CredentialsManager.
2
+
3
+ This module ensures that API keys defined in .env are automatically
4
+ synchronized to the CredentialsManager, making .env the source of truth
5
+ while allowing the frontend to read the current state.
6
+ """
7
+
8
+ import os
9
+ from pathlib import Path
10
+
11
+ from .credentials import get_credentials_manager
12
+ from .logging_config import get_logger
13
+
14
+ logger = get_logger(__name__)
15
+
16
+ # Mapping of environment variables to service names
17
+ ENV_TO_SERVICE_MAP = {
18
+ "OPENAI_API_KEY": "openai",
19
+ "ANTHROPIC_API_KEY": "anthropic",
20
+ "GOOGLE_API_KEY": "google", # Also used for Gemini
21
+ "OPENROUTER_API_KEY": "openrouter",
22
+ "DEEPSEEK_API_KEY": "deepseek",
23
+ "CEREBRAS_API_KEY": "cerebras",
24
+ "GROQ_API_KEY": "groq",
25
+ "OLLAMA_HOST": "ollama", # Special case: host instead of API key
26
+ }
27
+
28
+
29
+ def _get_secret(name: str) -> str | None:
30
+ """Read a secret from NAME or NAME_FILE.
31
+
32
+ If env var `NAME` is set, return it. Otherwise, if `NAME_FILE` points to
33
+ a readable file, return its stripped contents. Else return None.
34
+ """
35
+ val = os.getenv(name)
36
+ if val:
37
+ return val
38
+ file_var = f"{name}_FILE"
39
+ file_path = os.getenv(file_var)
40
+ if file_path and Path(file_path).exists():
41
+ try:
42
+ return Path(file_path).read_text(encoding="utf-8").strip()
43
+ except Exception:
44
+ # Avoid noisy logs here; callers can handle None gracefully
45
+ return None
46
+ return None
47
+
48
+
49
+ def sync_env_to_credentials() -> None:
50
+ """Sync API keys from environment variables to CredentialsManager.
51
+
52
+ This function reads API keys from environment variables and updates
53
+ the CredentialsManager with any new or changed values. This ensures
54
+ that .env remains the source of truth while making keys available
55
+ to the frontend.
56
+ """
57
+ creds_manager = get_credentials_manager()
58
+ updated_count = 0
59
+
60
+ for env_var, service in ENV_TO_SERVICE_MAP.items():
61
+ # Prefer file-based secrets if provided (NAME_FILE), fallback to NAME
62
+ env_value = _get_secret(env_var)
63
+
64
+ if not env_value:
65
+ logger.debug(f"No value found for {env_var} or {env_var}_FILE")
66
+ continue
67
+
68
+ logger.debug(f"Found value for {env_var}: length={len(env_value)}")
69
+
70
+ # Special handling for Ollama (it's a host, not an API key)
71
+ if service == "ollama":
72
+ current_creds = creds_manager.load_credentials(service) or {}
73
+ if current_creds.get("host") != env_value:
74
+ current_creds["host"] = env_value
75
+ creds_manager.save_credentials(service, current_creds)
76
+ logger.info(f"Updated {service} host from environment")
77
+ updated_count += 1
78
+ else:
79
+ # Regular API key handling
80
+ current_key = creds_manager.get_api_key(service)
81
+ if env_value and current_key != env_value:
82
+ creds_manager.set_api_key(service, env_value)
83
+ logger.info(f"Updated {service} API key from environment")
84
+ updated_count += 1
85
+
86
+ # Also set the environment variable directly for libraries that need it
87
+ # This ensures mem0 and other libraries can access the keys
88
+ if env_value:
89
+ os.environ[env_var] = env_value
90
+
91
+ if updated_count > 0:
92
+ logger.info(f"Synchronized {updated_count} credentials from environment")
93
+ else:
94
+ logger.debug("All credentials already in sync with environment")
95
+
96
+
97
+ def get_api_key_for_provider(provider: str) -> str | None:
98
+ """Get API key for a provider, checking CredentialsManager first.
99
+
100
+ Since we sync from .env to CredentialsManager on startup,
101
+ CredentialsManager will always have the latest keys from .env.
102
+
103
+ Args:
104
+ provider: The provider name (e.g., 'openai', 'anthropic')
105
+
106
+ Returns:
107
+ The API key if found, None otherwise
108
+
109
+ """
110
+ creds_manager = get_credentials_manager()
111
+
112
+ # Special case for Ollama - return None as it doesn't use API keys
113
+ if provider == "ollama":
114
+ return None
115
+
116
+ # For Google/Gemini, both use the same key
117
+ if provider == "gemini":
118
+ provider = "google"
119
+
120
+ return creds_manager.get_api_key(provider)
121
+
122
+
123
+ def get_ollama_host() -> str | None:
124
+ """Get Ollama host configuration.
125
+
126
+ Returns:
127
+ The Ollama host URL if configured, None otherwise
128
+
129
+ """
130
+ creds_manager = get_credentials_manager()
131
+ ollama_creds = creds_manager.load_credentials("ollama")
132
+ if ollama_creds:
133
+ return ollama_creds.get("host")
134
+ return None
@@ -0,0 +1,8 @@
1
+ """MindRoom custom tools package."""
2
+
3
+ from .gmail import GmailTools
4
+ from .google_calendar import GoogleCalendarTools
5
+ from .google_sheets import GoogleSheetsTools
6
+ from .homeassistant import HomeAssistantTools
7
+
8
+ __all__ = ["GmailTools", "GoogleCalendarTools", "GoogleSheetsTools", "HomeAssistantTools"]