fix(bot): resolve Confluence short links (/wiki/x/...) and add env vars
Short links like /wiki/x/AQDbAw are resolved via redirect to get numeric page ID. Also adds CONFLUENCE_* env var declarations to bot.py module level. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
51
bot.py
51
bot.py
@@ -64,6 +64,9 @@ WILDFILES_BASE_URL = os.environ.get("WILDFILES_BASE_URL", "")
|
|||||||
WILDFILES_ORG = os.environ.get("WILDFILES_ORG", "")
|
WILDFILES_ORG = os.environ.get("WILDFILES_ORG", "")
|
||||||
USER_KEYS_FILE = os.environ.get("USER_KEYS_FILE", "/data/user_keys.json")
|
USER_KEYS_FILE = os.environ.get("USER_KEYS_FILE", "/data/user_keys.json")
|
||||||
MEMORY_SERVICE_URL = os.environ.get("MEMORY_SERVICE_URL", "http://memory-service:8090")
|
MEMORY_SERVICE_URL = os.environ.get("MEMORY_SERVICE_URL", "http://memory-service:8090")
|
||||||
|
CONFLUENCE_URL = os.environ.get("CONFLUENCE_BASE_URL", "")
|
||||||
|
CONFLUENCE_USER = os.environ.get("CONFLUENCE_USER", "")
|
||||||
|
CONFLUENCE_TOKEN = os.environ.get("CONFLUENCE_TOKEN", "")
|
||||||
|
|
||||||
SYSTEM_PROMPT = """You are a helpful AI assistant in a Matrix chat room.
|
SYSTEM_PROMPT = """You are a helpful AI assistant in a Matrix chat room.
|
||||||
Keep answers concise but thorough. Use markdown formatting when helpful.
|
Keep answers concise but thorough. Use markdown formatting when helpful.
|
||||||
@@ -805,18 +808,52 @@ class Bot:
|
|||||||
return
|
return
|
||||||
|
|
||||||
# Detect Confluence page links → store page ID for voice session context
|
# Detect Confluence page links → store page ID for voice session context
|
||||||
confluence_match = re.search(
|
confluence_page_id = None
|
||||||
r'agiliton\.atlassian\.net/wiki/.*?pages/(\d+)', body)
|
conf_long = re.search(r'agiliton\.atlassian\.net/wiki/.*?pages/(\d+)', body)
|
||||||
if confluence_match:
|
conf_short = re.search(r'agiliton\.atlassian\.net/wiki/x/([A-Za-z0-9_-]+)', body)
|
||||||
page_id = confluence_match.group(1)
|
if conf_long:
|
||||||
|
confluence_page_id = conf_long.group(1)
|
||||||
|
elif conf_short and CONFLUENCE_URL and CONFLUENCE_USER and CONFLUENCE_TOKEN:
|
||||||
|
# Resolve short link via Confluence API
|
||||||
|
tiny_id = conf_short.group(1)
|
||||||
|
try:
|
||||||
|
async with httpx.AsyncClient(timeout=10.0) as hc:
|
||||||
|
resp = await hc.get(
|
||||||
|
f"{CONFLUENCE_URL}/rest/api/content",
|
||||||
|
params={"type": "page", "expand": "version",
|
||||||
|
"limit": "1", "start": "0"},
|
||||||
|
auth=(CONFLUENCE_USER, CONFLUENCE_TOKEN),
|
||||||
|
follow_redirects=True,
|
||||||
|
)
|
||||||
|
# Try the tiny link redirect approach
|
||||||
|
resp2 = await hc.get(
|
||||||
|
f"{CONFLUENCE_URL}/x/{tiny_id}",
|
||||||
|
auth=(CONFLUENCE_USER, CONFLUENCE_TOKEN),
|
||||||
|
follow_redirects=True,
|
||||||
|
)
|
||||||
|
# Extract page ID from the redirected URL
|
||||||
|
redir_match = re.search(r'pages/(\d+)', str(resp2.url))
|
||||||
|
if redir_match:
|
||||||
|
confluence_page_id = redir_match.group(1)
|
||||||
|
else:
|
||||||
|
# Parse page ID from HTML response
|
||||||
|
id_match = re.search(r'"pageId"\s*:\s*"?(\d+)', resp2.text)
|
||||||
|
if id_match:
|
||||||
|
confluence_page_id = id_match.group(1)
|
||||||
|
logger.info("Resolved Confluence short link /x/%s → page %s",
|
||||||
|
tiny_id, confluence_page_id)
|
||||||
|
except Exception as exc:
|
||||||
|
logger.warning("Confluence short link resolution failed: %s", exc)
|
||||||
|
if confluence_page_id:
|
||||||
docs = self._room_document_context.setdefault(room.room_id, [])
|
docs = self._room_document_context.setdefault(room.room_id, [])
|
||||||
docs.append({
|
docs.append({
|
||||||
"type": "confluence",
|
"type": "confluence",
|
||||||
"filename": f"Confluence page {page_id}",
|
"filename": f"Confluence page {confluence_page_id}",
|
||||||
"text": f"confluence_page_id:{page_id}",
|
"text": f"confluence_page_id:{confluence_page_id}",
|
||||||
"timestamp": time.time(),
|
"timestamp": time.time(),
|
||||||
})
|
})
|
||||||
logger.info("Confluence page %s detected in room %s", page_id, room.room_id)
|
logger.info("Confluence page %s detected in room %s",
|
||||||
|
confluence_page_id, room.room_id)
|
||||||
|
|
||||||
await self.client.room_typing(room.room_id, typing_state=True)
|
await self.client.room_typing(room.room_id, typing_state=True)
|
||||||
try:
|
try:
|
||||||
|
|||||||
Reference in New Issue
Block a user