Commit Graph

48 Commits

Author SHA1 Message Date
AzaelMew
7023468cea Fix YEARLY recurring CalDAV events only showing on DTSTART year (#179)
* Fix YEARLY recurring CalDAV events only showing on DTSTART year (#170)

Recurring events with RRULE:FREQ=YEARLY only appeared in the calendar
on the year matching DTSTART, not in subsequent years. The list_events
query filtered by , which excludes
recurring events whose original dtend (e.g. 2019-07-22) falls before
the requested window (e.g. 2026).

Fix: split the query into two branches — non-recurring events still
require window overlap, but recurring events (with non-empty RRULE)
are fetched by dtstart < end_dt alone. A new helper,
_expand_rrule_occurrences(), uses dateutil.rrule to expand each
recurring event into individual occurrence dicts within the requested
date range, so YEARLY/WEEKLY/MONTHLY events render correctly across
all years.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* recurrence: compound UIDs, frontend fixes, python-dateutil req, tests

- Replace _expand_rrule_occurrences with _expand_rrule that emits stable
  compound UIDs ({base_uid}::{date_or_datetime}) so the frontend can
  distinguish occurrences from the same series. Non-recurring events
  pass through with is_recurrence=false and series_uid=uid.

- Add _resolve_base_uid() to extract the base series UID from compound
  UIDs — used by PUT/DELETE /api/calendar/events/{uid} and the
  manage_calendar tool so edits/deletes always target the base row.

- Update manage_calendar tool to import and use _resolve_base_uid.

- Frontend _updateEvent / _deleteEvent: detect compound UIDs and
  invalidate localStorage cache after success so stale sibling
  occurrences aren't shown.

- Add python-dateutil to requirements.txt as an explicit dependency.

- Add 14 regression tests in tests/test_calendar_recurrence.py
  covering _resolve_base_uid edge cases, _expand_rrule with
  yearly/weekly/monthly/all-day/bad-rrule, unique UIDs, and
  metadata inheritance.

- Merge upstream's cleaner SQLAlchemy or_/and_ query pattern.

* recurrence: overlapping malformed-RRULE, exclusive end, multi-day crossings

Fix three edge cases in _expand_rrule:

1. Malformed-RRULE fallback now checks window overlap. list_events
   fetches recurring rows with only dtstart < end_dt, so a broken
   old recurring event could appear in unrelated future windows.
   Now fallback returns [] unless the base event's dtstart/dtend
   actually intersect [start, end).

2. Exclusive end boundary. rule.between(start, end, inc=True) was
   inclusive on end, but the route contract and non-recurring SQL
   filter both use [start, end). Added occ_start >= end guard.

3. Multi-day crossings. A recurring occurrence that starts before
   the window but ends inside it was missed (only occ_start was
   checked). Now expands from start - duration and filters by
   occ_start < end AND occ_end > start, matching non-recurring
   overlap behavior.

Tests: +4 tests for these cases (18 total)

---------

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-01 13:42:44 +09:00
pewdiepie-archdaemon
8df5ed2a96 Let email sends continue after closing compose tab 2026-06-01 13:42:14 +09:00
pewdiepie-archdaemon
a4349f4b29 Clarify contacts integration cards 2026-06-01 13:35:13 +09:00
cryptoji
17fe738659 fix(settings): MCP server add — POST as multipart/form-data, not JSON (#107)
routes/mcp_routes.py declares POST /api/mcp/servers with FastAPI
Form(...) params. The Save handler in static/js/settings.js was
sending application/json, so the Form parser saw no fields and
returned 422 with "Field required" for every input — clicking Save
did nothing visible.

Build a FormData object and let the browser set the multipart
Content-Type. args/env are JSON-stringified per the controller
contract (defaults "[]" / "{}"); bad JSON still falls back to
defaults, same as before.

Also check r.ok and surface non-2xx in the form-status span — the
previous code never checked status, so a 422 looked like success.

Matches the FormData pattern already used in this file (uf-mcp-toggle,
~L4036) for the toggle-enable PATCH against the same controller.

Co-authored-by: Toji <ccryptoji@gmail.com>
2026-06-01 13:23:05 +09:00
pewdiepie-archdaemon
791fd4711b Secure cookbook package probe endpoint 2026-06-01 13:22:37 +09:00
Hasn
490c8e1b91 codeblock copy and styling (#249) 2026-06-01 13:21:57 +09:00
pewdiepie-archdaemon
c6bb4d16bb Make email escape close reliable 2026-06-01 13:21:12 +09:00
pewdiepie-archdaemon
26364cc691 Revert "Keep email list mounted between opens"
This reverts commit b8fefe1a82.
2026-06-01 13:20:03 +09:00
pewdiepie-archdaemon
b8fefe1a82 Keep email list mounted between opens 2026-06-01 13:17:58 +09:00
pewdiepie-archdaemon
24f73bf539 Fix shell routes on Windows without PTY support 2026-06-01 13:15:40 +09:00
pewdiepie-archdaemon
3aa3f0fbc0 Prefetch adjacent emails while reading 2026-06-01 13:14:47 +09:00
pewdiepie-archdaemon
440373b96d Warm recent email read cache 2026-06-01 13:12:11 +09:00
chrisdvz.io
ff81a22285 perf(ui): hoist esc() lookup table and build option lists once (#160)
Hoist the HTML-escape lookup table in static/js/ui.js out of the
String.replace callback so it is allocated once instead of on every
matched character. esc() is the canonical escaper aliased across 27
modules and runs on essentially every render, so this removes a lot of
short-lived garbage on the hottest text path. Output is byte-identical
(verified across null/undefined/emoji/attribute edge cases).

Also build the <select> option lists in cookbook-hwfit.js and group.js
by accumulating a string and assigning innerHTML once, instead of
`innerHTML +=` inside a forEach (which makes the browser re-parse the
element's markup on every iteration). Final DOM is unchanged.

Pure micro-optimizations; no behavior change.

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-01 13:09:33 +09:00
Håkon Julius Størholt
91d3511580 Recognize local vision models so their images aren't dropped (#185)
An image attachment only got through if the model name was on a short
built-in list. Anything else was treated as text-only and the image was
quietly dropped, so the model never saw it. That left out a lot of the
smaller vision models you can run locally (moondream was the one I hit).

Pulled the check into is_vision_model() in chat_helpers, broadened it to
cover those, and added a test. Models that already worked are unaffected.

Fixes #124.
2026-06-01 13:09:21 +09:00
pewdiepie-archdaemon
32e7cec362 Use stable IMAP UIDs for email actions 2026-06-01 13:08:42 +09:00
pewdiepie-archdaemon
791939014c Move email account management to integrations 2026-06-01 13:01:33 +09:00
pewdiepie-archdaemon
4e79ddcfb7 Add admin user rename 2026-06-01 12:52:58 +09:00
pewdiepie-archdaemon
a66f241e21 Preserve large pasted messages in context 2026-06-01 12:38:35 +09:00
pewdiepie-archdaemon
1ce00b5dea Stop auto-adding Ollama endpoints 2026-06-01 11:52:49 +09:00
Alan Met
864e7ad558 Sidebar Chat button Quality of Life improvement. (#155) 2026-06-01 02:52:10 +00:00
Mikael A
411cb872cc Fix Windows startup compatibility issues (#149) 2026-06-01 02:51:31 +00:00
Daniel Grzelak
99ad456adf fix: group cookbook dependencies into Odysseus and Server sections (#144)
* fix: group cookbook dependencies into Odysseus and Server sections

* refactor: tidy dependency render with guard clauses and a section-header class
2026-06-01 02:50:50 +00:00
Sirsyorrz
b4a1d88beb docker: set CUDA_HOME for pip-installed vllm in Cookbook (#228)
When Cookbook installs vllm via `pip install --user vllm`, pip pulls in
nvidia-cuda-* wheels under /app/.local but doesn't set CUDA_HOME or
create /usr/local/cuda. vllm 0.22+ then crashes during engine init:

  RuntimeError: Could not find nvcc and default cuda_home='/usr/local/cuda' doesn't exist

After that, the mixed cuda-nvcc 13.3 / cuda-runtime 13.0 wheel combo
fails FlashInfer's JIT sampler with:

  error: "CUDA compiler and CUDA toolkit headers are incompatible"

Detect the pip-installed nvcc on startup, point CUDA_HOME at it, and
default VLLM_USE_FLASHINFER_SAMPLER=0 (sampler only, no attention
impact) so the engine boots. No-op when vllm isn't installed.

Fixes #214.

Co-authored-by: sirs <sirs@local>
2026-06-01 02:48:25 +00:00
Jasper Stubbe
83bab67641 Add explcit docker image source for the podman users (#224)
Co-authored-by: Jasper Stubbe <jasper.stubbe.b@gmail.com>
2026-06-01 02:47:59 +00:00
pewdiepie-archdaemon
c97375343d Clarify Cookbook diffusion dependencies 2026-06-01 11:45:26 +09:00
pewdiepie-archdaemon
c953c078e5 Improve Cookbook serve reliability 2026-06-01 11:43:08 +09:00
Ranjan Sharma
058d32451c Fix fresh checkout test failures
Make .env optional in tests and prevent endpoint resolver stubs from leaking into model route tests.
2026-06-01 02:22:17 +00:00
pewdiepie-archdaemon
415d115b17 Make Docker web port configurable 2026-06-01 11:20:25 +09:00
pewdiepie-archdaemon
577f2cfc18 Fix chat message history timestamps 2026-06-01 11:18:18 +09:00
Chat Sumlin
178befddd7 Fix duplicate CalDAV sync UIDs
Track uncommitted CalendarEvent rows during a CalDAV sync batch so duplicate UIDs update the pending row instead of inserting twice.
2026-06-01 02:17:43 +00:00
Chris Rowland
6c68631c26 Fix timezone-aware calendar event times
Render timezone-aware calendar timestamps in the browser local timezone while preserving naive wall-clock timestamps.
2026-06-01 02:15:58 +00:00
Juan Pablo Jiménez
4a04068818 Fix vision attachment timeout and stale cache
Increase local vision model timeout and avoid caching transient VL failure placeholders.\n\nCloses #202.
2026-06-01 02:04:46 +00:00
pewdiepie-archdaemon
71d74290f0 Generate SearXNG secret on first boot 2026-06-01 11:03:02 +09:00
pewdiepie-archdaemon
89093d0b9f Add contributing guide 2026-06-01 10:57:31 +09:00
pewdiepie-archdaemon
67f1675130 Restrict credentialed CORS headers 2026-06-01 10:54:08 +09:00
pewdiepie-archdaemon
7dd12fc3ad Fix landing footer snap and uvicorn docs 2026-06-01 10:51:55 +09:00
pewdiepie-archdaemon
0e3734a318 Align SearXNG fallback URL 2026-06-01 10:50:07 +09:00
pewdiepie-archdaemon
bf325f6b21 Gate embedding routes behind admin auth 2026-06-01 10:47:11 +09:00
pewdiepie-archdaemon
7e1a9ccc88 Close stale setup and line-ending gaps 2026-06-01 10:43:35 +09:00
pewdiepie-archdaemon
df5a4dd954 Clarify Windows install support status 2026-06-01 10:36:08 +09:00
pewdiepie-archdaemon
d9d95b4855 Improve OpenRouter and Groq provider requests 2026-06-01 10:32:14 +09:00
pewdiepie-archdaemon
172cc51972 Fix GitHub Pages repository links 2026-06-01 10:30:47 +09:00
pewdiepie-archdaemon
d026e13a5a Fix provider setup and strip message metadata 2026-06-01 10:20:18 +09:00
pewdiepie-archdaemon
fc7f107b22 Improve Ollama setup and model endpoint handling 2026-06-01 10:00:15 +09:00
pewdiepie-archdaemon
051751adcd Remove mobile fun fact from README 2026-06-01 00:52:10 +09:00
pewdiepie-archdaemon
d70e052aa9 Fix mobile preview interaction on landing page 2026-06-01 00:48:07 +09:00
pewdiepie-archdaemon
0b2d6d20c1 Landing page: GitHub URLs point to real repo (pewdiepie-archdaemon/odysseus) 2026-06-01 00:00:14 +09:00
pewdiepie-archdaemon
e5c99a5eee Odysseus v1.0 2026-05-31 23:58:26 +09:00