dhisana 0.0.1.dev211__tar.gz → 0.0.1.dev213__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.
- {dhisana-0.0.1.dev211 → dhisana-0.0.1.dev213}/PKG-INFO +1 -1
- {dhisana-0.0.1.dev211 → dhisana-0.0.1.dev213}/setup.py +1 -1
- {dhisana-0.0.1.dev211 → dhisana-0.0.1.dev213}/src/dhisana/utils/email_provider.py +5 -1
- {dhisana-0.0.1.dev211 → dhisana-0.0.1.dev213}/src/dhisana/utils/smtp_email_tools.py +36 -4
- {dhisana-0.0.1.dev211 → dhisana-0.0.1.dev213}/src/dhisana.egg-info/PKG-INFO +1 -1
- {dhisana-0.0.1.dev211 → dhisana-0.0.1.dev213}/README.md +0 -0
- {dhisana-0.0.1.dev211 → dhisana-0.0.1.dev213}/pyproject.toml +0 -0
- {dhisana-0.0.1.dev211 → dhisana-0.0.1.dev213}/setup.cfg +0 -0
- {dhisana-0.0.1.dev211 → dhisana-0.0.1.dev213}/src/dhisana/__init__.py +0 -0
- {dhisana-0.0.1.dev211 → dhisana-0.0.1.dev213}/src/dhisana/cli/__init__.py +0 -0
- {dhisana-0.0.1.dev211 → dhisana-0.0.1.dev213}/src/dhisana/cli/cli.py +0 -0
- {dhisana-0.0.1.dev211 → dhisana-0.0.1.dev213}/src/dhisana/cli/datasets.py +0 -0
- {dhisana-0.0.1.dev211 → dhisana-0.0.1.dev213}/src/dhisana/cli/models.py +0 -0
- {dhisana-0.0.1.dev211 → dhisana-0.0.1.dev213}/src/dhisana/cli/predictions.py +0 -0
- {dhisana-0.0.1.dev211 → dhisana-0.0.1.dev213}/src/dhisana/schemas/__init__.py +0 -0
- {dhisana-0.0.1.dev211 → dhisana-0.0.1.dev213}/src/dhisana/schemas/common.py +0 -0
- {dhisana-0.0.1.dev211 → dhisana-0.0.1.dev213}/src/dhisana/schemas/sales.py +0 -0
- {dhisana-0.0.1.dev211 → dhisana-0.0.1.dev213}/src/dhisana/ui/__init__.py +0 -0
- {dhisana-0.0.1.dev211 → dhisana-0.0.1.dev213}/src/dhisana/ui/components.py +0 -0
- {dhisana-0.0.1.dev211 → dhisana-0.0.1.dev213}/src/dhisana/utils/__init__.py +0 -0
- {dhisana-0.0.1.dev211 → dhisana-0.0.1.dev213}/src/dhisana/utils/add_mapping.py +0 -0
- {dhisana-0.0.1.dev211 → dhisana-0.0.1.dev213}/src/dhisana/utils/agent_tools.py +0 -0
- {dhisana-0.0.1.dev211 → dhisana-0.0.1.dev213}/src/dhisana/utils/apollo_tools.py +0 -0
- {dhisana-0.0.1.dev211 → dhisana-0.0.1.dev213}/src/dhisana/utils/assistant_tool_tag.py +0 -0
- {dhisana-0.0.1.dev211 → dhisana-0.0.1.dev213}/src/dhisana/utils/built_with_api_tools.py +0 -0
- {dhisana-0.0.1.dev211 → dhisana-0.0.1.dev213}/src/dhisana/utils/cache_output_tools.py +0 -0
- {dhisana-0.0.1.dev211 → dhisana-0.0.1.dev213}/src/dhisana/utils/cache_output_tools_local.py +0 -0
- {dhisana-0.0.1.dev211 → dhisana-0.0.1.dev213}/src/dhisana/utils/check_email_validity_tools.py +0 -0
- {dhisana-0.0.1.dev211 → dhisana-0.0.1.dev213}/src/dhisana/utils/check_for_intent_signal.py +0 -0
- {dhisana-0.0.1.dev211 → dhisana-0.0.1.dev213}/src/dhisana/utils/check_linkedin_url_validity.py +0 -0
- {dhisana-0.0.1.dev211 → dhisana-0.0.1.dev213}/src/dhisana/utils/clay_tools.py +0 -0
- {dhisana-0.0.1.dev211 → dhisana-0.0.1.dev213}/src/dhisana/utils/clean_properties.py +0 -0
- {dhisana-0.0.1.dev211 → dhisana-0.0.1.dev213}/src/dhisana/utils/company_utils.py +0 -0
- {dhisana-0.0.1.dev211 → dhisana-0.0.1.dev213}/src/dhisana/utils/compose_salesnav_query.py +0 -0
- {dhisana-0.0.1.dev211 → dhisana-0.0.1.dev213}/src/dhisana/utils/compose_search_query.py +0 -0
- {dhisana-0.0.1.dev211 → dhisana-0.0.1.dev213}/src/dhisana/utils/compose_three_step_workflow.py +0 -0
- {dhisana-0.0.1.dev211 → dhisana-0.0.1.dev213}/src/dhisana/utils/composite_tools.py +0 -0
- {dhisana-0.0.1.dev211 → dhisana-0.0.1.dev213}/src/dhisana/utils/dataframe_tools.py +0 -0
- {dhisana-0.0.1.dev211 → dhisana-0.0.1.dev213}/src/dhisana/utils/domain_parser.py +0 -0
- {dhisana-0.0.1.dev211 → dhisana-0.0.1.dev213}/src/dhisana/utils/email_parse_helpers.py +0 -0
- {dhisana-0.0.1.dev211 → dhisana-0.0.1.dev213}/src/dhisana/utils/enrich_lead_information.py +0 -0
- {dhisana-0.0.1.dev211 → dhisana-0.0.1.dev213}/src/dhisana/utils/extract_email_content_for_llm.py +0 -0
- {dhisana-0.0.1.dev211 → dhisana-0.0.1.dev213}/src/dhisana/utils/fetch_openai_config.py +0 -0
- {dhisana-0.0.1.dev211 → dhisana-0.0.1.dev213}/src/dhisana/utils/field_validators.py +0 -0
- {dhisana-0.0.1.dev211 → dhisana-0.0.1.dev213}/src/dhisana/utils/g2_tools.py +0 -0
- {dhisana-0.0.1.dev211 → dhisana-0.0.1.dev213}/src/dhisana/utils/generate_content.py +0 -0
- {dhisana-0.0.1.dev211 → dhisana-0.0.1.dev213}/src/dhisana/utils/generate_email.py +0 -0
- {dhisana-0.0.1.dev211 → dhisana-0.0.1.dev213}/src/dhisana/utils/generate_email_response.py +0 -0
- {dhisana-0.0.1.dev211 → dhisana-0.0.1.dev213}/src/dhisana/utils/generate_flow.py +0 -0
- {dhisana-0.0.1.dev211 → dhisana-0.0.1.dev213}/src/dhisana/utils/generate_leads_salesnav.py +0 -0
- {dhisana-0.0.1.dev211 → dhisana-0.0.1.dev213}/src/dhisana/utils/generate_linkedin_connect_message.py +0 -0
- {dhisana-0.0.1.dev211 → dhisana-0.0.1.dev213}/src/dhisana/utils/generate_linkedin_response_message.py +0 -0
- {dhisana-0.0.1.dev211 → dhisana-0.0.1.dev213}/src/dhisana/utils/generate_structured_output_internal.py +0 -0
- {dhisana-0.0.1.dev211 → dhisana-0.0.1.dev213}/src/dhisana/utils/google_custom_search.py +0 -0
- {dhisana-0.0.1.dev211 → dhisana-0.0.1.dev213}/src/dhisana/utils/google_oauth_tools.py +0 -0
- {dhisana-0.0.1.dev211 → dhisana-0.0.1.dev213}/src/dhisana/utils/google_workspace_tools.py +0 -0
- {dhisana-0.0.1.dev211 → dhisana-0.0.1.dev213}/src/dhisana/utils/hubspot_clearbit.py +0 -0
- {dhisana-0.0.1.dev211 → dhisana-0.0.1.dev213}/src/dhisana/utils/hubspot_crm_tools.py +0 -0
- {dhisana-0.0.1.dev211 → dhisana-0.0.1.dev213}/src/dhisana/utils/instantly_tools.py +0 -0
- {dhisana-0.0.1.dev211 → dhisana-0.0.1.dev213}/src/dhisana/utils/linkedin_crawler.py +0 -0
- {dhisana-0.0.1.dev211 → dhisana-0.0.1.dev213}/src/dhisana/utils/lusha_tools.py +0 -0
- {dhisana-0.0.1.dev211 → dhisana-0.0.1.dev213}/src/dhisana/utils/mailgun_tools.py +0 -0
- {dhisana-0.0.1.dev211 → dhisana-0.0.1.dev213}/src/dhisana/utils/microsoft365_tools.py +0 -0
- {dhisana-0.0.1.dev211 → dhisana-0.0.1.dev213}/src/dhisana/utils/openai_assistant_and_file_utils.py +0 -0
- {dhisana-0.0.1.dev211 → dhisana-0.0.1.dev213}/src/dhisana/utils/openai_helpers.py +0 -0
- {dhisana-0.0.1.dev211 → dhisana-0.0.1.dev213}/src/dhisana/utils/openapi_spec_to_tools.py +0 -0
- {dhisana-0.0.1.dev211 → dhisana-0.0.1.dev213}/src/dhisana/utils/openapi_tool/__init__.py +0 -0
- {dhisana-0.0.1.dev211 → dhisana-0.0.1.dev213}/src/dhisana/utils/openapi_tool/api_models.py +0 -0
- {dhisana-0.0.1.dev211 → dhisana-0.0.1.dev213}/src/dhisana/utils/openapi_tool/convert_openai_spec_to_tool.py +0 -0
- {dhisana-0.0.1.dev211 → dhisana-0.0.1.dev213}/src/dhisana/utils/openapi_tool/openapi_tool.py +0 -0
- {dhisana-0.0.1.dev211 → dhisana-0.0.1.dev213}/src/dhisana/utils/parse_linkedin_messages_txt.py +0 -0
- {dhisana-0.0.1.dev211 → dhisana-0.0.1.dev213}/src/dhisana/utils/profile.py +0 -0
- {dhisana-0.0.1.dev211 → dhisana-0.0.1.dev213}/src/dhisana/utils/proxy_curl_tools.py +0 -0
- {dhisana-0.0.1.dev211 → dhisana-0.0.1.dev213}/src/dhisana/utils/proxycurl_search_leads.py +0 -0
- {dhisana-0.0.1.dev211 → dhisana-0.0.1.dev213}/src/dhisana/utils/python_function_to_tools.py +0 -0
- {dhisana-0.0.1.dev211 → dhisana-0.0.1.dev213}/src/dhisana/utils/research_lead.py +0 -0
- {dhisana-0.0.1.dev211 → dhisana-0.0.1.dev213}/src/dhisana/utils/sales_navigator_crawler.py +0 -0
- {dhisana-0.0.1.dev211 → dhisana-0.0.1.dev213}/src/dhisana/utils/salesforce_crm_tools.py +0 -0
- {dhisana-0.0.1.dev211 → dhisana-0.0.1.dev213}/src/dhisana/utils/search_router.py +0 -0
- {dhisana-0.0.1.dev211 → dhisana-0.0.1.dev213}/src/dhisana/utils/search_router_jobs.py +0 -0
- {dhisana-0.0.1.dev211 → dhisana-0.0.1.dev213}/src/dhisana/utils/sendgrid_tools.py +0 -0
- {dhisana-0.0.1.dev211 → dhisana-0.0.1.dev213}/src/dhisana/utils/serarch_router_local_business.py +0 -0
- {dhisana-0.0.1.dev211 → dhisana-0.0.1.dev213}/src/dhisana/utils/serpapi_additional_tools.py +0 -0
- {dhisana-0.0.1.dev211 → dhisana-0.0.1.dev213}/src/dhisana/utils/serpapi_google_jobs.py +0 -0
- {dhisana-0.0.1.dev211 → dhisana-0.0.1.dev213}/src/dhisana/utils/serpapi_google_search.py +0 -0
- {dhisana-0.0.1.dev211 → dhisana-0.0.1.dev213}/src/dhisana/utils/serpapi_local_business_search.py +0 -0
- {dhisana-0.0.1.dev211 → dhisana-0.0.1.dev213}/src/dhisana/utils/serpapi_search_tools.py +0 -0
- {dhisana-0.0.1.dev211 → dhisana-0.0.1.dev213}/src/dhisana/utils/serperdev_google_jobs.py +0 -0
- {dhisana-0.0.1.dev211 → dhisana-0.0.1.dev213}/src/dhisana/utils/serperdev_local_business.py +0 -0
- {dhisana-0.0.1.dev211 → dhisana-0.0.1.dev213}/src/dhisana/utils/serperdev_search.py +0 -0
- {dhisana-0.0.1.dev211 → dhisana-0.0.1.dev213}/src/dhisana/utils/test_connect.py +0 -0
- {dhisana-0.0.1.dev211 → dhisana-0.0.1.dev213}/src/dhisana/utils/trasform_json.py +0 -0
- {dhisana-0.0.1.dev211 → dhisana-0.0.1.dev213}/src/dhisana/utils/web_download_parse_tools.py +0 -0
- {dhisana-0.0.1.dev211 → dhisana-0.0.1.dev213}/src/dhisana/utils/workflow_code_model.py +0 -0
- {dhisana-0.0.1.dev211 → dhisana-0.0.1.dev213}/src/dhisana/utils/zoominfo_tools.py +0 -0
- {dhisana-0.0.1.dev211 → dhisana-0.0.1.dev213}/src/dhisana/workflow/__init__.py +0 -0
- {dhisana-0.0.1.dev211 → dhisana-0.0.1.dev213}/src/dhisana/workflow/agent.py +0 -0
- {dhisana-0.0.1.dev211 → dhisana-0.0.1.dev213}/src/dhisana/workflow/flow.py +0 -0
- {dhisana-0.0.1.dev211 → dhisana-0.0.1.dev213}/src/dhisana/workflow/task.py +0 -0
- {dhisana-0.0.1.dev211 → dhisana-0.0.1.dev213}/src/dhisana/workflow/test.py +0 -0
- {dhisana-0.0.1.dev211 → dhisana-0.0.1.dev213}/src/dhisana.egg-info/SOURCES.txt +0 -0
- {dhisana-0.0.1.dev211 → dhisana-0.0.1.dev213}/src/dhisana.egg-info/dependency_links.txt +0 -0
- {dhisana-0.0.1.dev211 → dhisana-0.0.1.dev213}/src/dhisana.egg-info/entry_points.txt +0 -0
- {dhisana-0.0.1.dev211 → dhisana-0.0.1.dev213}/src/dhisana.egg-info/requires.txt +0 -0
- {dhisana-0.0.1.dev211 → dhisana-0.0.1.dev213}/src/dhisana.egg-info/top_level.txt +0 -0
- {dhisana-0.0.1.dev211 → dhisana-0.0.1.dev213}/tests/test_agent_tools.py +0 -0
- {dhisana-0.0.1.dev211 → dhisana-0.0.1.dev213}/tests/test_apollo_company_search.py +0 -0
- {dhisana-0.0.1.dev211 → dhisana-0.0.1.dev213}/tests/test_connectivity.py +0 -0
- {dhisana-0.0.1.dev211 → dhisana-0.0.1.dev213}/tests/test_google_document.py +0 -0
- {dhisana-0.0.1.dev211 → dhisana-0.0.1.dev213}/tests/test_hubspot_call_logs.py +0 -0
- {dhisana-0.0.1.dev211 → dhisana-0.0.1.dev213}/tests/test_linkedin_serper.py +0 -0
- {dhisana-0.0.1.dev211 → dhisana-0.0.1.dev213}/tests/test_mcp_connectivity.py +0 -0
- {dhisana-0.0.1.dev211 → dhisana-0.0.1.dev213}/tests/test_proxycurl_get_company_search_id.py +0 -0
- {dhisana-0.0.1.dev211 → dhisana-0.0.1.dev213}/tests/test_proxycurl_job_count.py +0 -0
- {dhisana-0.0.1.dev211 → dhisana-0.0.1.dev213}/tests/test_structured_output_with_mcp.py +0 -0
|
@@ -294,7 +294,11 @@ async def list_emails_async(
|
|
|
294
294
|
|
|
295
295
|
# --- future providers go here ---
|
|
296
296
|
|
|
297
|
-
|
|
297
|
+
logging.warning(
|
|
298
|
+
"No suitable inbox provider configured for sender %s; returning empty list.",
|
|
299
|
+
query_email_context.sender_email,
|
|
300
|
+
)
|
|
301
|
+
return []
|
|
298
302
|
|
|
299
303
|
|
|
300
304
|
# ─────────────────────────────────────────────────────────────────────────────
|
|
@@ -11,6 +11,8 @@ import imaplib
|
|
|
11
11
|
import logging
|
|
12
12
|
import re
|
|
13
13
|
import uuid
|
|
14
|
+
from email.errors import HeaderParseError
|
|
15
|
+
from email.header import Header, decode_header, make_header
|
|
14
16
|
from email.mime.text import MIMEText
|
|
15
17
|
from datetime import datetime, timedelta, timezone
|
|
16
18
|
from typing import Any, Dict, List, Optional, Union
|
|
@@ -35,6 +37,32 @@ from dhisana.utils.google_workspace_tools import (
|
|
|
35
37
|
# Helper / Utility
|
|
36
38
|
# --------------------------------------------------------------------------- #
|
|
37
39
|
|
|
40
|
+
|
|
41
|
+
def _decode_header_value(value: Any) -> str:
|
|
42
|
+
"""Return a unicode string for an e-mail header field."""
|
|
43
|
+
|
|
44
|
+
if value is None:
|
|
45
|
+
return ""
|
|
46
|
+
|
|
47
|
+
if isinstance(value, Header):
|
|
48
|
+
value = str(value)
|
|
49
|
+
|
|
50
|
+
if isinstance(value, bytes):
|
|
51
|
+
try:
|
|
52
|
+
return value.decode("utf-8")
|
|
53
|
+
except UnicodeDecodeError:
|
|
54
|
+
return value.decode("latin-1", errors="replace")
|
|
55
|
+
|
|
56
|
+
if isinstance(value, str):
|
|
57
|
+
try:
|
|
58
|
+
decoded = make_header(decode_header(value))
|
|
59
|
+
return str(decoded)
|
|
60
|
+
except (HeaderParseError, UnicodeDecodeError, LookupError):
|
|
61
|
+
return value
|
|
62
|
+
|
|
63
|
+
return str(value)
|
|
64
|
+
|
|
65
|
+
|
|
38
66
|
def _imap_date(iso_dt: Union[str, datetime]) -> str:
|
|
39
67
|
"""
|
|
40
68
|
Convert an ISO 8601 datetime or datetime object into IMAP date format: DD-Mmm-YYYY.
|
|
@@ -150,7 +178,7 @@ def _parse_email_msg(raw_bytes: bytes) -> MessageItem:
|
|
|
150
178
|
msg = email.message_from_bytes(raw_bytes)
|
|
151
179
|
|
|
152
180
|
# Helper for reading headers
|
|
153
|
-
hdr = lambda h: msg.get(h
|
|
181
|
+
hdr = lambda h: _decode_header_value(msg.get(h))
|
|
154
182
|
|
|
155
183
|
sender_name, sender_email = email.utils.parseaddr(hdr("From"))
|
|
156
184
|
receiver_name, receiver_email = email.utils.parseaddr(hdr("To"))
|
|
@@ -163,10 +191,14 @@ def _parse_email_msg(raw_bytes: bytes) -> MessageItem:
|
|
|
163
191
|
part.get_content_type() == "text/plain"
|
|
164
192
|
and "attachment" not in str(part.get("Content-Disposition", ""))
|
|
165
193
|
):
|
|
166
|
-
|
|
167
|
-
|
|
194
|
+
payload = part.get_payload(decode=True)
|
|
195
|
+
if payload is not None:
|
|
196
|
+
body = payload.decode(errors="ignore")
|
|
197
|
+
break
|
|
168
198
|
else:
|
|
169
|
-
|
|
199
|
+
payload = msg.get_payload(decode=True)
|
|
200
|
+
if payload is not None:
|
|
201
|
+
body = payload.decode(errors="ignore")
|
|
170
202
|
|
|
171
203
|
# Parse the Date header to get a timezone-aware datetime
|
|
172
204
|
try:
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{dhisana-0.0.1.dev211 → dhisana-0.0.1.dev213}/src/dhisana/utils/check_email_validity_tools.py
RENAMED
|
File without changes
|
|
File without changes
|
{dhisana-0.0.1.dev211 → dhisana-0.0.1.dev213}/src/dhisana/utils/check_linkedin_url_validity.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{dhisana-0.0.1.dev211 → dhisana-0.0.1.dev213}/src/dhisana/utils/compose_three_step_workflow.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{dhisana-0.0.1.dev211 → dhisana-0.0.1.dev213}/src/dhisana/utils/extract_email_content_for_llm.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{dhisana-0.0.1.dev211 → dhisana-0.0.1.dev213}/src/dhisana/utils/generate_linkedin_connect_message.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{dhisana-0.0.1.dev211 → dhisana-0.0.1.dev213}/src/dhisana/utils/openai_assistant_and_file_utils.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{dhisana-0.0.1.dev211 → dhisana-0.0.1.dev213}/src/dhisana/utils/openapi_tool/openapi_tool.py
RENAMED
|
File without changes
|
{dhisana-0.0.1.dev211 → dhisana-0.0.1.dev213}/src/dhisana/utils/parse_linkedin_messages_txt.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{dhisana-0.0.1.dev211 → dhisana-0.0.1.dev213}/src/dhisana/utils/serarch_router_local_business.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{dhisana-0.0.1.dev211 → dhisana-0.0.1.dev213}/src/dhisana/utils/serpapi_local_business_search.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|