- {{ (toolCall.result.data?.total as number) ?? 0 }} found
+ {{ (toolCall.result.data?.count as number) ?? (toolCall.result.data?.total as number) ?? 0 }} found
@@ -205,6 +222,15 @@ defineExpose({ reload: loadAll });
Due {{ activeTask.due_date }}
+
+ No Milestone
+ {{ ms.title }}
+
@@ -562,6 +588,19 @@ defineExpose({ reload: loadAll });
text-transform: capitalize;
}
+.milestone-select {
+ font-size: 0.72rem;
+ padding: 0.15rem 0.4rem;
+ border-radius: 10px;
+ background: var(--color-bg);
+ border: 1px solid var(--color-border);
+ color: var(--color-text-muted);
+ cursor: pointer;
+ max-width: 140px;
+}
+.milestone-select:disabled { opacity: 0.5; cursor: default; }
+.milestone-select:focus { outline: none; border-color: var(--color-primary); }
+
.detail-log {
flex: 1;
overflow-y: auto;
diff --git a/frontend/src/views/WorkspaceView.vue b/frontend/src/views/WorkspaceView.vue
index a99438d..deef333 100644
--- a/frontend/src/views/WorkspaceView.vue
+++ b/frontend/src/views/WorkspaceView.vue
@@ -79,7 +79,10 @@ watch(
watch(
() => chatStore.streaming,
(s) => {
- if (!s) processedCount.value = 0;
+ if (!s) {
+ processedCount.value = 0;
+ scrollToBottom();
+ }
}
);
diff --git a/src/fabledassistant/app.py b/src/fabledassistant/app.py
index 26a71d1..25e5cfa 100644
--- a/src/fabledassistant/app.py
+++ b/src/fabledassistant/app.py
@@ -74,7 +74,13 @@ def create_app() -> Quart:
async def after_request(response):
duration = time.monotonic() - getattr(g, "request_start", time.monotonic())
duration_ms = round(duration * 1000, 1)
- logger.info(
+ # Downgrade noisy high-frequency / static paths to DEBUG
+ _quiet = (
+ request.path in {"/api/health", "/api/chat/status"}
+ or request.path.startswith(("/static/", "/assets/", "/sw.js", "/manifest.json"))
+ )
+ log_fn = logger.debug if _quiet else logger.info
+ log_fn(
"%s %s %s %.1fms",
request.method,
request.path,
diff --git a/src/fabledassistant/services/push.py b/src/fabledassistant/services/push.py
index be2619a..c67f3bb 100644
--- a/src/fabledassistant/services/push.py
+++ b/src/fabledassistant/services/push.py
@@ -23,8 +23,8 @@ _VAPID_KEYS_FILE = Path(Config.IMAGE_CACHE_DIR).parent / "vapid_keys.json"
def _get_webpush():
"""Lazy import to avoid startup errors if pywebpush is not installed."""
try:
- from pywebpush import WebPusher
- return WebPusher
+ from pywebpush import webpush
+ return webpush
except ImportError:
return None
@@ -156,8 +156,8 @@ async def send_push_notification(
logger.debug("VAPID not configured, skipping push notification")
return
- WebPusher = _get_webpush()
- if WebPusher is None:
+ webpush = _get_webpush()
+ if webpush is None:
logger.warning("pywebpush not installed, cannot send push notifications")
return
@@ -182,7 +182,8 @@ async def send_push_notification(
"endpoint": sub.endpoint,
"keys": {"p256dh": sub.p256dh, "auth": sub.auth},
}
- response = WebPusher(subscription_info).send(
+ response = webpush(
+ subscription_info=subscription_info,
data=payload,
vapid_private_key=Config.VAPID_PRIVATE_KEY,
vapid_claims=vapid_claims,