diff --git a/solstone/apps/import/routes.py b/solstone/apps/import/routes.py index 482cb4707..fc053a3dd 100644 --- a/solstone/apps/import/routes.py +++ b/solstone/apps/import/routes.py @@ -15,6 +15,7 @@ from werkzeug.utils import secure_filename from solstone.apps.utils import log_app_action from solstone.convey import emit, state +from solstone.convey.icons import lucide_svg from solstone.convey.reasons import ( FILE_NOT_FOUND, IMPORT_CLIENT_ID_CONFLICT, @@ -89,7 +90,6 @@ SOURCE_METADATA = [ { "name": "ics", "display_name": "Calendar", - "emoji": "πŸ“…", "icon": "calendar", "description": "Import events from Google Calendar, Apple Calendar, or Outlook", "input_type": "file", @@ -100,7 +100,6 @@ SOURCE_METADATA = [ { "name": "chatgpt", "display_name": "ChatGPT", - "emoji": "πŸ’¬", "icon": "message-square", "description": "Import your conversation history from ChatGPT", "input_type": "file", @@ -111,7 +110,6 @@ SOURCE_METADATA = [ { "name": "claude", "display_name": "Claude", - "emoji": "πŸ€–", "icon": "message-circle", "description": "Import your conversation history from Claude", "input_type": "file", @@ -122,7 +120,6 @@ SOURCE_METADATA = [ { "name": "gemini", "display_name": "Gemini", - "emoji": "✨", "icon": "sparkles", "description": "Import your activity history from Google Gemini", "input_type": "file", @@ -133,7 +130,6 @@ SOURCE_METADATA = [ { "name": "obsidian", "display_name": "Notes", - "emoji": "πŸ“", "icon": "file-text", "description": "Import notes from Obsidian, Logseq, or any markdown vault", "input_type": "path_input", @@ -144,7 +140,6 @@ SOURCE_METADATA = [ { "name": "kindle", "display_name": "Kindle", - "emoji": "πŸ“š", "icon": "book-open", "description": "Import highlights and clippings from your Kindle", "input_type": "file", @@ -155,7 +150,6 @@ SOURCE_METADATA = [ { "name": "journal_archive", "display_name": "Journal", - "emoji": "πŸ““", "icon": "book", "description": "import a full journal export from another journal", "input_type": "file", @@ -166,7 +160,6 @@ SOURCE_METADATA = [ { "name": "granola", "display_name": "Granola", - "emoji": "🌾", "icon": "mic", "description": "Import meeting transcripts from Granola via muesli", "input_type": "path_input", @@ -177,7 +170,6 @@ SOURCE_METADATA = [ { "name": "recording", "display_name": "meeting audio", - "emoji": "πŸŽ™οΈ", "icon": "mic", "description": "import audio from meetings or conversations", "input_type": "file", @@ -188,7 +180,6 @@ SOURCE_METADATA = [ { "name": "document", "display_name": "Document", - "emoji": "πŸ“„", "icon": "file", "description": "Import a PDF document", "input_type": "file", @@ -199,7 +190,6 @@ SOURCE_METADATA = [ { "name": "image", "display_name": "Image", - "emoji": "πŸ–ΌοΈ", "icon": "image", "description": "Add a photo or screenshot and let sol describe what's in it", "input_type": "file", @@ -210,7 +200,6 @@ SOURCE_METADATA = [ { "name": "quick", "display_name": "Quick Import", - "emoji": "⚑", "icon": "zap", "description": "Paste text or drop any file for quick import", "input_type": "text", @@ -221,6 +210,12 @@ SOURCE_METADATA = [ ] +def _source_metadata_payload(source: dict[str, Any]) -> dict[str, Any]: + payload = dict(source) + payload["icon_svg"] = lucide_svg(source["icon"]) + return payload + + def _link_id_from_identity() -> str | None: return ( g.identity.fingerprint @@ -879,7 +874,9 @@ def import_list() -> Any: @import_bp.route("/api/sources") def import_sources() -> Any: """Return available import source metadata.""" - return jsonify(SOURCE_METADATA) + return respond_collection( + [_source_metadata_payload(source) for source in SOURCE_METADATA] + ) @import_bp.route("/api/check-path/") @@ -1039,7 +1036,7 @@ def import_content_list(timestamp: str) -> Any: "source_display": source_meta["display_name"] if source_meta else source_type, - "source_emoji": source_meta["emoji"] if source_meta else "", + "source_icon_svg": lucide_svg(source_meta["icon"]) if source_meta else None, } ) diff --git a/solstone/apps/import/tests/test_routes.py b/solstone/apps/import/tests/test_routes.py index 20f88376e..1ae1d8b72 100644 --- a/solstone/apps/import/tests/test_routes.py +++ b/solstone/apps/import/tests/test_routes.py @@ -126,6 +126,20 @@ def test_import_detail_static_module_serves(client): assert b"renderDetail" in response.data +def test_import_sources_emit_icon_svg_not_emoji(client): + response = client.get("/app/import/api/sources") + + assert response.status_code == 200 + payload = response.get_json() + sources = payload["items"] + assert payload["total"] == len(sources) + assert sources + by_name = {source["name"]: source for source in sources} + assert "emoji" not in by_name["quick"] + assert by_name["quick"]["icon"] == "zap" + assert " [source.name, source])); - sourceEmojiByName = Object.fromEntries(cachedSources.map(source => [source.name, source.emoji || ''])); + sourceIconSvgByName = Object.fromEntries(cachedSources.map(source => [source.name, source.icon_svg || ''])); } const grid = document.getElementById('importGrid'); @@ -820,7 +837,7 @@ async function loadSourceGrid() { : `navigateTo("guide/${source.name}")`; return ` @@ -1042,9 +1059,9 @@ function renderProgressStats(eventData) { } function renderSourceDisplay(sourceType, sourceDisplay, fallbackText = '-') { - const emoji = sourceEmojiByName[sourceType] || ''; + const iconSvg = sourceIconSvgByName[sourceType] || ''; const displayText = sourceDisplay || fallbackText || '-'; - return `
${emoji ? `${emoji}` : ''}${escapeHtml(displayText)}
`; + return `
${iconSvg ? `` : ''}${escapeHtml(displayText)}
`; } function getImportById(importId) { @@ -1463,7 +1480,7 @@ async function loadGuidedFlow(sourceName) { guideSteps.innerHTML = `
-

${source.emoji || ''} ${escapeHtml(source.display_name)}

+

${escapeHtml(source.display_name)}

${escapeHtml(source.description || '')}

    @@ -1561,7 +1578,7 @@ function renderQuickImportFlow() { guideSteps.innerHTML = `
    -

    ⚑ quick import

    +

    quick import

    Paste text or drop a file, then confirm the detected timestamp in the modal.

    @@ -2169,6 +2186,19 @@ if (document.readyState === 'loading') { /* Content tab */ .import-content-summary { margin-bottom: 1em; padding: 0.75em 1em; background: #f0f7ff; border-radius: 4px; font-size: 0.95em; } +.import-content-summary-icon { + display: inline-flex; + align-items: center; + margin-right: 0.35em; + vertical-align: -0.15em; +} +.import-content-summary-icon svg { + width: 1em; + height: 1em; + stroke-width: 1.5; + stroke: currentColor; + fill: none; +} .import-content-controls { display: flex; gap: 0.75em; margin-bottom: 1em; } .import-content-search { flex: 1; padding: 8px 12px; border: 1px solid #ddd; border-radius: 4px; font-size: 0.9em; } .import-content-search:hover:not(:focus) { border-color: #a0aec0; } @@ -2322,9 +2352,10 @@ function loadContent(page = 1) { function renderContentSummary(data) { const el = document.getElementById('contentSummary'); - const emoji = data.source_emoji || ''; + const iconSvg = data.source_icon_svg || ''; const display = data.source_display || ''; - el.innerHTML = `${emoji} ${display} β€” ${data.total} items`; + const iconHtml = iconSvg ? `` : ''; + el.innerHTML = `${iconHtml}${escapeHtml(display)} β€” ${data.total} items`; } function renderContentMonths(months) { diff --git a/solstone/apps/search/routes.py b/solstone/apps/search/routes.py index e493b4066..e6942f76d 100644 --- a/solstone/apps/search/routes.py +++ b/solstone/apps/search/routes.py @@ -12,6 +12,7 @@ from typing import Any from flask import Blueprint, jsonify, request from solstone.convey.day_grid import build_day_grid_payload +from solstone.convey.icons import lucide_svg from solstone.convey.reasons import INVALID_DAY, SEARCH_FAILED from solstone.convey.utils import error_response, format_date, parse_pagination_params from solstone.think.facets import get_facets @@ -29,19 +30,20 @@ search_bp = Blueprint( # Agent icons for display AGENT_ICONS = { - "flow": "πŸ“", - "knowledge_graph": "πŸ—ΊοΈ", - "meetings": "πŸ“…", - "event": "πŸ“…", - "span": "🧡", - "audio": "🎀", - "screen": "πŸ–₯️", - "entity": "πŸ‘€", - "entity:attached": "πŸ‘€", - "entity:detected": "πŸ‘€", - "news": "πŸ“°", - "import": "πŸ“₯", + "flow": "activity", + "knowledge_graph": "chart-network", + "meetings": "users", + "event": "calendar-days", + "span": "timeline", + "audio": "mic-vocal", + "screen": "monitor", + "entity": "user", + "entity:attached": "user-check", + "entity:detected": "user-search", + "news": "newspaper", + "import": "import", } +AGENT_ICON_FALLBACK = "file-text" # Agent display names AGENT_LABELS = { @@ -69,6 +71,14 @@ def _agent_label(agent: str | None) -> str: return " ".join(agent.replace("_", " ").split()).title() +def _agent_icon(agent: str | None) -> str: + return AGENT_ICONS.get(agent or "", AGENT_ICON_FALLBACK) + + +def _agent_icon_svg(agent: str | None) -> str | None: + return lucide_svg(_agent_icon(agent)) + + DAY_RE = re.compile(r"^\d{8}$") DAY_BOUND_SENTINELS = {"00000000", "99999999"} @@ -169,7 +179,8 @@ def _format_result(result: dict, query: str, facets_map: dict) -> dict: "id": result.get("id", ""), "day": meta.get("day", ""), "agent": agent, - "agent_icon": AGENT_ICONS.get(agent, "πŸ“„"), + "agent_icon": _agent_icon(agent), + "agent_icon_svg": _agent_icon_svg(agent), "agent_label": _agent_label(agent), "facet": facet_name, "facet_title": facet_info.get("title", facet_name), @@ -318,7 +329,8 @@ def search_journal_api() -> Any: { "name": agent, "label": _agent_label(agent), - "icon": AGENT_ICONS.get(agent, "πŸ“„"), + "icon": _agent_icon(agent), + "icon_svg": _agent_icon_svg(agent), "count": count, } ) diff --git a/solstone/apps/search/tests/test_agent_labels.py b/solstone/apps/search/tests/test_agent_labels.py index 4af479e67..e27c05240 100644 --- a/solstone/apps/search/tests/test_agent_labels.py +++ b/solstone/apps/search/tests/test_agent_labels.py @@ -11,6 +11,7 @@ import pytest from solstone.apps.search import routes from solstone.convey import create_app +from solstone.convey.icons import lucide_svg def _counts_payload(counts: dict[str, Any]) -> dict[str, Any]: @@ -50,6 +51,7 @@ def _stub_search( counts: dict[str, Any] | list[dict[str, Any]], *, coverage: dict[str, str] | None = None, + results: list[dict[str, Any]] | None = None, ) -> dict[str, Any]: recorded: dict[str, Any] = {"search_counts": [], "search_journal": []} count_payloads = counts if isinstance(counts, list) else [counts] @@ -58,7 +60,7 @@ def _stub_search( recorded["limit"] = kwargs.get("limit") recorded["offset"] = kwargs.get("offset") recorded["search_journal"].append(kwargs) - return 0, [] + return 0, results or [] def fake_counts(*_args, **kwargs): recorded["search_counts"].append(kwargs) @@ -102,6 +104,49 @@ def test_unmapped_talent_payload_keeps_raw_name_and_humanises_label( assert response.status_code == 200 payload = response.get_json() assert [ - {key: talent[key] for key in ("name", "label", "count")} + {key: talent[key] for key in ("name", "label", "icon", "icon_svg", "count")} for talent in payload["talents"] - ] == [{"name": "_todos_todo", "label": "Todos Todo", "count": 4}] + ] == [ + { + "name": "_todos_todo", + "label": "Todos Todo", + "icon": "file-text", + "icon_svg": lucide_svg("file-text"), + "count": 4, + } + ] + + +def test_search_payload_resolves_agent_icon_svg(search_client, monkeypatch): + _stub_search( + monkeypatch, + { + "agents": {"flow": 4}, + "days": {"20260304": 1}, + "total": 1, + }, + results=[ + { + "id": "result-1", + "text": "flow result", + "metadata": { + "day": "20260304", + "agent": "flow", + "facet": "", + "path": "20260304/talents/flow.md", + "idx": 0, + }, + "score": 1.0, + } + ], + ) + + response = search_client.get("/app/search/api/search?q=test") + + assert response.status_code == 200 + payload = response.get_json() + assert payload["talents"][0]["icon"] == "activity" + assert payload["talents"][0]["icon_svg"] == lucide_svg("activity") + result = payload["days"][0]["results"][0] + assert result["agent_icon"] == "activity" + assert result["agent_icon_svg"] == lucide_svg("activity") diff --git a/solstone/apps/search/workspace.html b/solstone/apps/search/workspace.html index f7dfdb0b4..bd403d56d 100644 --- a/solstone/apps/search/workspace.html +++ b/solstone/apps/search/workspace.html @@ -93,6 +93,14 @@ font-size: 0.85rem; } +.filter-icon svg { + width: 1em; + height: 1em; + stroke-width: 1.5; + stroke: currentColor; + fill: none; +} + /* Main content area */ .search-main { flex: 1; @@ -284,6 +292,14 @@ button.day-header { font-size: 0.9rem; } +.result-agent-icon svg { + width: 1em; + height: 1em; + stroke-width: 1.5; + stroke: currentColor; + fill: none; +} + .result-facet { font-size: 0.7rem; padding: 0.15rem 0.4rem; @@ -914,7 +930,7 @@ button.day-header { agentHtml += ` @@ -1039,7 +1055,7 @@ button.day-header { item.innerHTML = `
    - ${result.agent_icon} + ${escapeHtml(result.agent_label)} ${facetBadge} diff --git a/solstone/apps/support/workspace.html b/solstone/apps/support/workspace.html index d8d3f82a0..a0bbea2de 100644 --- a/solstone/apps/support/workspace.html +++ b/solstone/apps/support/workspace.html @@ -508,7 +508,7 @@
    -

    πŸ’¬ Share your impressions, ideas, or anything on your mind. Your feedback shapes the product.

    +

    Share your impressions, ideas, or anything on your mind. Your feedback shapes the product.

    @@ -536,15 +536,15 @@
    -

    πŸ›Ÿ getting help

    +

    getting help

    Just say "I need help" or "something's not working" in the chat bar. Your sol will handle everything β€” searching for answers, running diagnostics, and filing a ticket if needed.

    -

    πŸ” search the knowledge base

    +

    search the knowledge base

    ask your question in the chat bar. your sol will search the knowledge base and bring back the most relevant help.

    -

    🩺 run diagnostics

    +

    run diagnostics

    Check your system health locally β€” no data is sent anywhere.

    running diagnostics…
    @@ -552,11 +552,11 @@
    -

    πŸ“’ announcements

    +

    announcements

    product updates and known issues appear in the announcements area at the top of this panel when there's something new.

    -

    πŸ”’ privacy

    +

    privacy

    Nothing leaves your device without your explicit approval. You review every ticket before it's sent and can edit or redact anything. Journal content is never included unless you attach it yourself.

    @@ -982,9 +982,8 @@ return; } banner.style.display = ''; - const icons = {'known-issue': '⚠️', 'maintenance': 'πŸ”§', 'info': 'πŸ“’'}; banner.innerHTML = items.map(a => - `

    ${icons[a.type] || 'πŸ“’'} ${esc(a.title || '')}

    ${esc((a.content || '').slice(0, 200))}

    ` + `

    ${esc(a.title || '')}

    ${esc((a.content || '').slice(0, 200))}

    ` ).join(''); } catch (err) { if (!announcementsFirstPaintDone) { diff --git a/tests/baselines/api/search/day-results.json b/tests/baselines/api/search/day-results.json index f58d71d6f..e61839c77 100644 --- a/tests/baselines/api/search/day-results.json +++ b/tests/baselines/api/search/day-results.json @@ -4,7 +4,8 @@ "results": [ { "agent": "knowledge_graph", - "agent_icon": "πŸ—ΊοΈ", + "agent_icon": "chart-network", + "agent_icon_svg": " ", "agent_label": "Knowledge Graph", "day": "20260304", "facet": "", diff --git a/tests/baselines/api/search/search.json b/tests/baselines/api/search/search.json index 3118aac96..9f99b663c 100644 --- a/tests/baselines/api/search/search.json +++ b/tests/baselines/api/search/search.json @@ -7,7 +7,8 @@ "results": [ { "agent": "entity:detected", - "agent_icon": "πŸ‘€", + "agent_icon": "user-search", + "agent_icon_svg": " ", "agent_label": "Entity", "day": "20260306", "facet": "montague", @@ -23,7 +24,8 @@ }, { "agent": "entity:detected", - "agent_icon": "πŸ‘€", + "agent_icon": "user-search", + "agent_icon_svg": " ", "agent_label": "Entity", "day": "20260306", "facet": "montague", @@ -39,7 +41,8 @@ }, { "agent": "entity:detected", - "agent_icon": "πŸ‘€", + "agent_icon": "user-search", + "agent_icon_svg": " ", "agent_label": "Entity", "day": "20260306", "facet": "montague", @@ -55,7 +58,8 @@ }, { "agent": "screen", - "agent_icon": "πŸ–₯️", + "agent_icon": "monitor", + "agent_icon_svg": " ", "agent_label": "Screen", "day": "20260306", "facet": "", @@ -71,7 +75,8 @@ }, { "agent": "segment", - "agent_icon": "πŸ“„", + "agent_icon": "file-text", + "agent_icon_svg": " ", "agent_label": "Segment", "day": "20260306", "facet": "", @@ -96,7 +101,8 @@ "results": [ { "agent": "action", - "agent_icon": "πŸ“„", + "agent_icon": "file-text", + "agent_icon_svg": " ", "agent_label": "Action", "day": "20260309", "facet": "verona", @@ -112,7 +118,8 @@ }, { "agent": "audio", - "agent_icon": "🎀", + "agent_icon": "mic-vocal", + "agent_icon_svg": " ", "agent_label": "Transcript", "day": "20260309", "facet": "", @@ -128,7 +135,8 @@ }, { "agent": "audio", - "agent_icon": "🎀", + "agent_icon": "mic-vocal", + "agent_icon_svg": " ", "agent_label": "Transcript", "day": "20260309", "facet": "", @@ -144,7 +152,8 @@ }, { "agent": "entity:detected", - "agent_icon": "πŸ‘€", + "agent_icon": "user-search", + "agent_icon_svg": " ", "agent_label": "Entity", "day": "20260309", "facet": "montague", @@ -160,7 +169,8 @@ }, { "agent": "segment", - "agent_icon": "πŸ“„", + "agent_icon": "file-text", + "agent_icon_svg": " ", "agent_label": "Segment", "day": "20260309", "facet": "", @@ -185,7 +195,8 @@ "results": [ { "agent": "audio", - "agent_icon": "🎀", + "agent_icon": "mic-vocal", + "agent_icon_svg": " ", "agent_label": "Transcript", "day": "20260307", "facet": "", @@ -201,7 +212,8 @@ }, { "agent": "audio", - "agent_icon": "🎀", + "agent_icon": "mic-vocal", + "agent_icon_svg": " ", "agent_label": "Transcript", "day": "20260307", "facet": "", @@ -217,7 +229,8 @@ }, { "agent": "entity:detected", - "agent_icon": "πŸ‘€", + "agent_icon": "user-search", + "agent_icon_svg": " ", "agent_label": "Entity", "day": "20260307", "facet": "montague", @@ -233,7 +246,8 @@ }, { "agent": "segment", - "agent_icon": "πŸ“„", + "agent_icon": "file-text", + "agent_icon_svg": " ", "agent_label": "Segment", "day": "20260307", "facet": "", @@ -249,7 +263,8 @@ }, { "agent": "segment", - "agent_icon": "πŸ“„", + "agent_icon": "file-text", + "agent_icon_svg": " ", "agent_label": "Segment", "day": "20260307", "facet": "", @@ -274,7 +289,8 @@ "results": [ { "agent": "entity:detected", - "agent_icon": "πŸ‘€", + "agent_icon": "user-search", + "agent_icon_svg": " ", "agent_label": "Entity", "day": "20260308", "facet": "montague", @@ -290,7 +306,8 @@ }, { "agent": "event", - "agent_icon": "πŸ“…", + "agent_icon": "calendar-days", + "agent_icon_svg": " ", "agent_label": "Event", "day": "20260308", "facet": "verona", @@ -306,7 +323,8 @@ }, { "agent": "knowledge_graph", - "agent_icon": "πŸ—ΊοΈ", + "agent_icon": "chart-network", + "agent_icon_svg": " ", "agent_label": "Knowledge Graph", "day": "20260308", "facet": "", @@ -322,7 +340,8 @@ }, { "agent": "meetings", - "agent_icon": "πŸ“…", + "agent_icon": "users", + "agent_icon_svg": " ", "agent_label": "Meetings", "day": "20260308", "facet": "", @@ -347,7 +366,8 @@ "results": [ { "agent": "audio", - "agent_icon": "🎀", + "agent_icon": "mic-vocal", + "agent_icon_svg": " ", "agent_label": "Transcript", "day": "20260305", "facet": "", @@ -363,7 +383,8 @@ }, { "agent": "entity:detected", - "agent_icon": "πŸ‘€", + "agent_icon": "user-search", + "agent_icon_svg": " ", "agent_label": "Entity", "day": "20260305", "facet": "montague", @@ -379,7 +400,8 @@ }, { "agent": "entity:detected", - "agent_icon": "πŸ‘€", + "agent_icon": "user-search", + "agent_icon_svg": " ", "agent_label": "Entity", "day": "20260305", "facet": "verona", @@ -395,7 +417,8 @@ }, { "agent": "event", - "agent_icon": "πŸ“…", + "agent_icon": "calendar-days", + "agent_icon_svg": " ", "agent_label": "Event", "day": "20260305", "facet": "montague", @@ -411,7 +434,8 @@ }, { "agent": "segment", - "agent_icon": "πŸ“„", + "agent_icon": "file-text", + "agent_icon_svg": " ", "agent_label": "Segment", "day": "20260305", "facet": "", @@ -436,7 +460,8 @@ "results": [ { "agent": "audio", - "agent_icon": "🎀", + "agent_icon": "mic-vocal", + "agent_icon_svg": " ", "agent_label": "Transcript", "day": "20260310", "facet": "", @@ -452,7 +477,8 @@ }, { "agent": "entity:detected", - "agent_icon": "πŸ‘€", + "agent_icon": "user-search", + "agent_icon_svg": " ", "agent_label": "Entity", "day": "20260310", "facet": "montague", @@ -468,7 +494,8 @@ }, { "agent": "entity:detected", - "agent_icon": "πŸ‘€", + "agent_icon": "user-search", + "agent_icon_svg": " ", "agent_label": "Entity", "day": "20260310", "facet": "verona", @@ -484,7 +511,8 @@ }, { "agent": "meetings", - "agent_icon": "πŸ“…", + "agent_icon": "users", + "agent_icon_svg": " ", "agent_label": "Meetings", "day": "20260310", "facet": "", @@ -500,7 +528,8 @@ }, { "agent": "segment", - "agent_icon": "πŸ“„", + "agent_icon": "file-text", + "agent_icon_svg": " ", "agent_label": "Segment", "day": "20260310", "facet": "", @@ -525,7 +554,8 @@ "results": [ { "agent": "audio", - "agent_icon": "🎀", + "agent_icon": "mic-vocal", + "agent_icon_svg": " ", "agent_label": "Transcript", "day": "20260304", "facet": "", @@ -541,7 +571,8 @@ }, { "agent": "entity:detected", - "agent_icon": "πŸ‘€", + "agent_icon": "user-search", + "agent_icon_svg": " ", "agent_label": "Entity", "day": "20260304", "facet": "capulet", @@ -557,7 +588,8 @@ }, { "agent": "entity:detected", - "agent_icon": "πŸ‘€", + "agent_icon": "user-search", + "agent_icon_svg": " ", "agent_label": "Entity", "day": "20260304", "facet": "montague", @@ -573,7 +605,8 @@ }, { "agent": "event", - "agent_icon": "πŸ“…", + "agent_icon": "calendar-days", + "agent_icon_svg": " ", "agent_label": "Event", "day": "20260304", "facet": "capulet", @@ -589,7 +622,8 @@ }, { "agent": "event", - "agent_icon": "πŸ“…", + "agent_icon": "calendar-days", + "agent_icon_svg": " ", "agent_label": "Event", "day": "20260304", "facet": "montague", @@ -670,73 +704,85 @@ "talents": [ { "count": 1, - "icon": "πŸ“°", + "icon": "newspaper", + "icon_svg": " ", "label": "News", "name": "news" }, { "count": 1, - "icon": "πŸ–₯️", + "icon": "monitor", + "icon_svg": " ", "label": "Screen", "name": "screen" }, { "count": 12, - "icon": "πŸ‘€", + "icon": "user-search", + "icon_svg": " ", "label": "Entity", "name": "entity:detected" }, { "count": 15, - "icon": "πŸ“…", + "icon": "calendar-days", + "icon_svg": " ", "label": "Event", "name": "event" }, { "count": 16, - "icon": "🎀", + "icon": "mic-vocal", + "icon_svg": " ", "label": "Transcript", "name": "audio" }, { "count": 16, - "icon": "πŸ—ΊοΈ", + "icon": "chart-network", + "icon_svg": " ", "label": "Knowledge Graph", "name": "knowledge_graph" }, { "count": 17, - "icon": "πŸ“„", + "icon": "file-text", + "icon_svg": " ", "label": "Segment", "name": "segment" }, { "count": 2, - "icon": "πŸ“„", + "icon": "file-text", + "icon_svg": " ", "label": "Session_Review", "name": "session_review" }, { "count": 2, - "icon": "πŸ“…", + "icon": "users", + "icon_svg": " ", "label": "Meetings", "name": "meetings" }, { "count": 4, - "icon": "πŸ“„", + "icon": "file-text", + "icon_svg": " ", "label": "Action", "name": "action" }, { "count": 8, - "icon": "πŸ‘€", + "icon": "user", + "icon_svg": " ", "label": "Entity", "name": "entity" }, { "count": 9, - "icon": "πŸ“„", + "icon": "file-text", + "icon_svg": " ", "label": "Observation", "name": "observation" } diff --git a/tests/test_app_import_journal.py b/tests/test_app_import_journal.py index 76bd39b8a..7e857ec6d 100644 --- a/tests/test_app_import_journal.py +++ b/tests/test_app_import_journal.py @@ -60,9 +60,14 @@ def test_import_sources_include_journal_archive(client): assert response.status_code == 200 data = response.get_json() - journal_source = next(item for item in data if item["name"] == "journal_archive") + assert data["total"] == len(data["items"]) + journal_source = next( + item for item in data["items"] if item["name"] == "journal_archive" + ) assert journal_source["display_name"] == "Journal" - assert journal_source["emoji"] == "πŸ““" + assert "emoji" not in journal_source + assert journal_source["icon"] == "book" + assert "