mirror of
https://github.com/NousResearch/hermes-agent.git
synced 2026-05-05 02:07:34 +08:00
Compare commits
1 Commits
fix/plugin
...
hermes/her
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
45e1a5037f |
@@ -224,7 +224,7 @@ class EmailAdapter(BasePlatformAdapter):
|
|||||||
"""Connect to the IMAP server and start polling for new messages."""
|
"""Connect to the IMAP server and start polling for new messages."""
|
||||||
try:
|
try:
|
||||||
# Test IMAP connection
|
# Test IMAP connection
|
||||||
imap = imaplib.IMAP4_SSL(self._imap_host, self._imap_port)
|
imap = imaplib.IMAP4_SSL(self._imap_host, self._imap_port, timeout=30)
|
||||||
imap.login(self._address, self._password)
|
imap.login(self._address, self._password)
|
||||||
# Mark all existing messages as seen so we only process new ones
|
# Mark all existing messages as seen so we only process new ones
|
||||||
imap.select("INBOX")
|
imap.select("INBOX")
|
||||||
@@ -240,7 +240,7 @@ class EmailAdapter(BasePlatformAdapter):
|
|||||||
|
|
||||||
try:
|
try:
|
||||||
# Test SMTP connection
|
# Test SMTP connection
|
||||||
smtp = smtplib.SMTP(self._smtp_host, self._smtp_port)
|
smtp = smtplib.SMTP(self._smtp_host, self._smtp_port, timeout=30)
|
||||||
smtp.starttls(context=ssl.create_default_context())
|
smtp.starttls(context=ssl.create_default_context())
|
||||||
smtp.login(self._address, self._password)
|
smtp.login(self._address, self._password)
|
||||||
smtp.quit()
|
smtp.quit()
|
||||||
@@ -289,7 +289,7 @@ class EmailAdapter(BasePlatformAdapter):
|
|||||||
"""Fetch new (unseen) messages from IMAP. Runs in executor thread."""
|
"""Fetch new (unseen) messages from IMAP. Runs in executor thread."""
|
||||||
results = []
|
results = []
|
||||||
try:
|
try:
|
||||||
imap = imaplib.IMAP4_SSL(self._imap_host, self._imap_port)
|
imap = imaplib.IMAP4_SSL(self._imap_host, self._imap_port, timeout=30)
|
||||||
imap.login(self._address, self._password)
|
imap.login(self._address, self._password)
|
||||||
imap.select("INBOX")
|
imap.select("INBOX")
|
||||||
|
|
||||||
@@ -442,7 +442,7 @@ class EmailAdapter(BasePlatformAdapter):
|
|||||||
|
|
||||||
msg.attach(MIMEText(body, "plain", "utf-8"))
|
msg.attach(MIMEText(body, "plain", "utf-8"))
|
||||||
|
|
||||||
smtp = smtplib.SMTP(self._smtp_host, self._smtp_port)
|
smtp = smtplib.SMTP(self._smtp_host, self._smtp_port, timeout=30)
|
||||||
smtp.starttls(context=ssl.create_default_context())
|
smtp.starttls(context=ssl.create_default_context())
|
||||||
smtp.login(self._address, self._password)
|
smtp.login(self._address, self._password)
|
||||||
smtp.send_message(msg)
|
smtp.send_message(msg)
|
||||||
@@ -529,7 +529,7 @@ class EmailAdapter(BasePlatformAdapter):
|
|||||||
part.add_header("Content-Disposition", f"attachment; filename={fname}")
|
part.add_header("Content-Disposition", f"attachment; filename={fname}")
|
||||||
msg.attach(part)
|
msg.attach(part)
|
||||||
|
|
||||||
smtp = smtplib.SMTP(self._smtp_host, self._smtp_port)
|
smtp = smtplib.SMTP(self._smtp_host, self._smtp_port, timeout=30)
|
||||||
smtp.starttls(context=ssl.create_default_context())
|
smtp.starttls(context=ssl.create_default_context())
|
||||||
smtp.login(self._address, self._password)
|
smtp.login(self._address, self._password)
|
||||||
smtp.send_message(msg)
|
smtp.send_message(msg)
|
||||||
|
|||||||
@@ -114,7 +114,9 @@ class HomeAssistantAdapter(BasePlatformAdapter):
|
|||||||
return False
|
return False
|
||||||
|
|
||||||
# Dedicated REST session for send() calls
|
# Dedicated REST session for send() calls
|
||||||
self._rest_session = aiohttp.ClientSession()
|
self._rest_session = aiohttp.ClientSession(
|
||||||
|
timeout=aiohttp.ClientTimeout(total=30)
|
||||||
|
)
|
||||||
|
|
||||||
# Warn if no event filters are configured
|
# Warn if no event filters are configured
|
||||||
if not self._watch_domains and not self._watch_entities and not self._watch_all:
|
if not self._watch_domains and not self._watch_entities and not self._watch_all:
|
||||||
@@ -140,8 +142,10 @@ class HomeAssistantAdapter(BasePlatformAdapter):
|
|||||||
ws_url = self._hass_url.replace("http://", "ws://").replace("https://", "wss://")
|
ws_url = self._hass_url.replace("http://", "ws://").replace("https://", "wss://")
|
||||||
ws_url = f"{ws_url}/api/websocket"
|
ws_url = f"{ws_url}/api/websocket"
|
||||||
|
|
||||||
self._session = aiohttp.ClientSession()
|
self._session = aiohttp.ClientSession(
|
||||||
self._ws = await self._session.ws_connect(ws_url, heartbeat=30)
|
timeout=aiohttp.ClientTimeout(total=30)
|
||||||
|
)
|
||||||
|
self._ws = await self._session.ws_connect(ws_url, heartbeat=30, timeout=30)
|
||||||
|
|
||||||
# Step 1: Receive auth_required
|
# Step 1: Receive auth_required
|
||||||
msg = await self._ws.receive_json()
|
msg = await self._ws.receive_json()
|
||||||
|
|||||||
@@ -116,7 +116,7 @@ class MattermostAdapter(BasePlatformAdapter):
|
|||||||
import aiohttp
|
import aiohttp
|
||||||
url = f"{self._base_url}/api/v4/{path.lstrip('/')}"
|
url = f"{self._base_url}/api/v4/{path.lstrip('/')}"
|
||||||
try:
|
try:
|
||||||
async with self._session.get(url, headers=self._headers()) as resp:
|
async with self._session.get(url, headers=self._headers(), timeout=aiohttp.ClientTimeout(total=30)) as resp:
|
||||||
if resp.status >= 400:
|
if resp.status >= 400:
|
||||||
body = await resp.text()
|
body = await resp.text()
|
||||||
logger.error("MM API GET %s → %s: %s", path, resp.status, body[:200])
|
logger.error("MM API GET %s → %s: %s", path, resp.status, body[:200])
|
||||||
@@ -134,7 +134,8 @@ class MattermostAdapter(BasePlatformAdapter):
|
|||||||
url = f"{self._base_url}/api/v4/{path.lstrip('/')}"
|
url = f"{self._base_url}/api/v4/{path.lstrip('/')}"
|
||||||
try:
|
try:
|
||||||
async with self._session.post(
|
async with self._session.post(
|
||||||
url, headers=self._headers(), json=payload
|
url, headers=self._headers(), json=payload,
|
||||||
|
timeout=aiohttp.ClientTimeout(total=30)
|
||||||
) as resp:
|
) as resp:
|
||||||
if resp.status >= 400:
|
if resp.status >= 400:
|
||||||
body = await resp.text()
|
body = await resp.text()
|
||||||
@@ -180,7 +181,7 @@ class MattermostAdapter(BasePlatformAdapter):
|
|||||||
content_type=content_type,
|
content_type=content_type,
|
||||||
)
|
)
|
||||||
headers = {"Authorization": f"Bearer {self._token}"}
|
headers = {"Authorization": f"Bearer {self._token}"}
|
||||||
async with self._session.post(url, headers=headers, data=form) as resp:
|
async with self._session.post(url, headers=headers, data=form, timeout=aiohttp.ClientTimeout(total=60)) as resp:
|
||||||
if resp.status >= 400:
|
if resp.status >= 400:
|
||||||
body = await resp.text()
|
body = await resp.text()
|
||||||
logger.error("MM file upload → %s: %s", resp.status, body[:200])
|
logger.error("MM file upload → %s: %s", resp.status, body[:200])
|
||||||
@@ -201,7 +202,9 @@ class MattermostAdapter(BasePlatformAdapter):
|
|||||||
logger.error("Mattermost: URL or token not configured")
|
logger.error("Mattermost: URL or token not configured")
|
||||||
return False
|
return False
|
||||||
|
|
||||||
self._session = aiohttp.ClientSession()
|
self._session = aiohttp.ClientSession(
|
||||||
|
timeout=aiohttp.ClientTimeout(total=30)
|
||||||
|
)
|
||||||
self._closing = False
|
self._closing = False
|
||||||
|
|
||||||
# Verify credentials and fetch bot identity.
|
# Verify credentials and fetch bot identity.
|
||||||
|
|||||||
@@ -106,7 +106,9 @@ class SmsAdapter(BasePlatformAdapter):
|
|||||||
await self._runner.setup()
|
await self._runner.setup()
|
||||||
site = web.TCPSite(self._runner, "0.0.0.0", self._webhook_port)
|
site = web.TCPSite(self._runner, "0.0.0.0", self._webhook_port)
|
||||||
await site.start()
|
await site.start()
|
||||||
self._http_session = aiohttp.ClientSession()
|
self._http_session = aiohttp.ClientSession(
|
||||||
|
timeout=aiohttp.ClientTimeout(total=30),
|
||||||
|
)
|
||||||
self._running = True
|
self._running = True
|
||||||
|
|
||||||
logger.info(
|
logger.info(
|
||||||
@@ -144,7 +146,9 @@ class SmsAdapter(BasePlatformAdapter):
|
|||||||
"Authorization": self._basic_auth_header(),
|
"Authorization": self._basic_auth_header(),
|
||||||
}
|
}
|
||||||
|
|
||||||
session = self._http_session or aiohttp.ClientSession()
|
session = self._http_session or aiohttp.ClientSession(
|
||||||
|
timeout=aiohttp.ClientTimeout(total=30),
|
||||||
|
)
|
||||||
try:
|
try:
|
||||||
for chunk in chunks:
|
for chunk in chunks:
|
||||||
form_data = aiohttp.FormData()
|
form_data = aiohttp.FormData()
|
||||||
|
|||||||
Reference in New Issue
Block a user