Skip to content

Commit 62b007c

Browse files
committed
fix: review comments
1 parent bc79ce6 commit 62b007c

6 files changed

Lines changed: 48 additions & 6 deletions

File tree

api/search.py

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -172,7 +172,12 @@ def search():
172172
type(e).__name__,
173173
)
174174
parse_warnings.record_bubble_skipped()
175-
except (json.JSONDecodeError, ValueError):
175+
except (json.JSONDecodeError, TypeError, ValueError) as e:
176+
_logger.warning(
177+
"Failed to decode Bubble from bubbleId:%s: %s",
178+
bid,
179+
e,
180+
)
176181
parse_warnings.record_bubble_skipped()
177182

178183
# Search through composerData
@@ -193,7 +198,12 @@ def search():
193198
)
194199
parse_warnings.record_composer_skipped()
195200
continue
196-
except (json.JSONDecodeError, TypeError, ValueError):
201+
except (json.JSONDecodeError, TypeError, ValueError) as e:
202+
_logger.warning(
203+
"Failed to decode Composer from composerData:%s: %s",
204+
composer_id,
205+
e,
206+
)
197207
parse_warnings.record_composer_skipped()
198208
continue
199209
try:
@@ -289,7 +299,7 @@ def search():
289299
composer_id,
290300
e,
291301
)
292-
parse_warnings.record_composer_skipped()
302+
parse_warnings.record_composer_processing_failure()
293303

294304
except Exception:
295305
_logger.exception("Error searching global storage")

models/parse_warnings.py

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ class ParseWarningCollector:
99

1010
composers_skipped: int = 0
1111
bubbles_skipped: int = 0
12+
composers_processing_failed: int = 0
1213

1314
def record_composer_skipped(self, count: int = 1) -> None:
1415
if count > 0:
@@ -18,9 +19,18 @@ def record_bubble_skipped(self, count: int = 1) -> None:
1819
if count > 0:
1920
self.bubbles_skipped += count
2021

22+
def record_composer_processing_failure(self, count: int = 1) -> None:
23+
"""Post-parse assembly failed; not a JSON/schema parse skip."""
24+
if count > 0:
25+
self.composers_processing_failed += count
26+
2127
@property
2228
def has_warnings(self) -> bool:
23-
return self.composers_skipped > 0 or self.bubbles_skipped > 0
29+
return (
30+
self.composers_skipped > 0
31+
or self.bubbles_skipped > 0
32+
or self.composers_processing_failed > 0
33+
)
2434

2535
def to_api_list(self) -> list[dict]:
2636
"""Structured warnings for JSON API responses (issue #67)."""
@@ -45,6 +55,16 @@ def to_api_list(self) -> list[dict]:
4555
f"{n} {noun} could not be loaded due to schema or JSON parse errors"
4656
),
4757
})
58+
if self.composers_processing_failed:
59+
n = self.composers_processing_failed
60+
noun = "conversation" if n == 1 else "conversations"
61+
warnings.append({
62+
"type": "processing_error",
63+
"count": n,
64+
"detail": (
65+
f"{n} {noun} could not be fully assembled after parsing"
66+
),
67+
})
4868
return warnings
4969

5070
def attach_to(self, payload: dict) -> dict:

services/workspace_listing.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,7 @@ def _safe_fetchall(query: str, params: tuple = ()) -> list:
138138
cid,
139139
e,
140140
)
141-
parse_warnings.record_composer_skipped()
141+
parse_warnings.record_composer_processing_failure()
142142
except Exception as e:
143143
_logger.error(
144144
"Failed to load composer rows from global storage: %s",

services/workspace_tabs.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -586,7 +586,7 @@ def _safe_fetchall(query: str, params: tuple = ()) -> list:
586586
composer_id,
587587
e,
588588
)
589-
parse_warnings.record_composer_skipped()
589+
parse_warnings.record_composer_processing_failure()
590590

591591
# Sort tabs by timestamp descending (newest first)
592592
response["tabs"].sort(key=lambda t: t.get("timestamp") or 0, reverse=True)

templates/index.html

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,11 @@ <h1>Projects</h1>
3737
fetch('/api/workspaces'),
3838
fetch('/api/export/state')
3939
]);
40+
if (!projRes.ok) {
41+
document.getElementById('loading').innerHTML =
42+
'<p class="text-danger">Failed to load projects.</p>';
43+
return;
44+
}
4045
const body = await projRes.json();
4146
const { projects, warnings } = normalizeWorkspacesResponse(body);
4247
showIncompleteResultsBanner('parse-warnings-host', warnings);

templates/search.html

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,12 @@ <h1>Search</h1>
8080

8181
try {
8282
const res = await fetch(`/api/search?q=${encodeURIComponent(query)}&type=${type}`);
83+
if (!res.ok) {
84+
showIncompleteResultsBanner('parse-warnings-host', []);
85+
loading.style.display = 'none';
86+
container.innerHTML = '<p class="text-danger">Search failed.</p>';
87+
return;
88+
}
8389
const data = await res.json();
8490
const results = data.results || [];
8591
showIncompleteResultsBanner('parse-warnings-host', data.warnings);
@@ -110,6 +116,7 @@ <h1>Search</h1>
110116
}
111117
container.innerHTML = html;
112118
} catch (e) {
119+
showIncompleteResultsBanner('parse-warnings-host', []);
113120
loading.style.display = 'none';
114121
container.innerHTML = '<p class="text-danger">Search failed.</p>';
115122
}

0 commit comments

Comments
 (0)