Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
1882 commits
Select commit Hold shift + click to select a range
597632c
refactor(tools): split tool_implementations.py into src/tools/ packag…
ydonghao Jun 26, 2026
0636d1c
test: split embedding lane tests (#4389)
alteixeira20 Jun 26, 2026
bf56dda
feat(teacher): add teacher_tier2_enabled setting and strict parser
GeekLuffy Jun 26, 2026
fb1dfcf
fix(upload): remove trailing whitespace
alteixeira20 Jun 26, 2026
9ccb497
Merge pull request #4448 from Muhammad-Ikhwan-Fathulloh/dev
alteixeira20 Jun 26, 2026
a26c632
Merge pull request #4280 from GeekLuffy/feat/llm-self-eval
alteixeira20 Jun 26, 2026
af0752e
docs(setup): add a self-host troubleshooting cookbook of common traps…
YAMRAJ13y Jun 26, 2026
a8e6401
fix(email): validate IMAP/SMTP ports instead of crashing with 500 (#4…
victorv2i Jun 26, 2026
e2edb4b
fix(auth): add config lock around migration methods (#4447)
DevSidd2006 Jun 26, 2026
4feb8cc
fix(security): prevent ReDoS in agent_loop <think> stripping (#4877)
nopoz Jun 27, 2026
681cd0b
Isolate untrusted context from visible user prompts (#3584)
kevinfiddick Jun 27, 2026
4ab68b6
Polish mobile UI and editor workflows
pewdiepie-archdaemon Jun 27, 2026
514fba4
fix(security): gate codex cookbook routes behind admin check for cook…
michaelxer Jun 27, 2026
b31d875
Fix _parse_msg_content corrupting JSON-array-like text messages on re…
afonsopc Jun 27, 2026
f6b9c72
fix: vCard parser drops folded continuation lines, corrupting emails …
afonsopc Jun 27, 2026
1e4d06e
Reduce cookbook startup polling
pewdiepie-archdaemon Jun 27, 2026
46110fd
fix(calendar): keep imported events with non-positive duration visibl…
ashvinctrl Jun 27, 2026
05a164c
fix(models): accept bare-list /models responses (Together AI) (#4761)
SINE Jun 27, 2026
178a955
refactor(tools): register update_plan tool and support dynamic execut…
dewanggaabdullah Jun 27, 2026
2d194b2
fix(notes): allow inline editing of checklist items (#4832)
Arpit483 Jun 27, 2026
c7fd5fe
fix(llm): add default context window lengths for Xiaomi Mimo 2.5 mode…
sonntam Jun 27, 2026
46558c0
fix(cookbook): preserve scheduled serve server metadata (#4545)
catalini82 Jun 27, 2026
fe41c73
fix(docker): install python-magic and libmagic for upload MIME sniffing
ashvinctrl Jun 27, 2026
abad9f7
fix(visual_report): make TOC heading slugs unique
Ohualtex Jun 27, 2026
6c1927c
fix(visual_report): ignore fenced headings in TOC extraction
afonsopc Jun 27, 2026
e8ede5d
fix(llm-core): prevent cache-affinity fields from reaching Cerebras
rudra496 Jun 27, 2026
c74e181
fix(security): prevent ReDoS in LLM-output tool/think parsers (#4704)
nopoz Jun 27, 2026
fce9d6b
fix(calendar): accept time-first datetimes in _parse_dt
Ohualtex Jun 27, 2026
032a2f9
fix(upload): handle corrupt uploads index and malformed vision JSON
YAMRAJ13y Jun 27, 2026
c3a3c36
fix(search): use generated query for chat mode web search #4547 (#4557)
Arpit483 Jun 27, 2026
5db6071
fix(chat): guard non-numeric agent tool budget setting
YAMRAJ13y Jun 27, 2026
b2908ec
fix: improve uploaded document retrieval and deep research reuse (#4784)
muhamedhamedvl Jun 27, 2026
e195edf
fix: tool results misthreaded to the wrong tool_call_id when a native…
afonsopc Jun 27, 2026
f1ca973
test: split llm-core temperature tests (#4935)
alteixeira20 Jun 27, 2026
e9446f4
Register email auto translate task
pewdiepie-archdaemon Jun 27, 2026
6dcd2dd
test: split provider detection tests (#4933)
alteixeira20 Jun 27, 2026
efa4370
Rename email auto translate task
pewdiepie-archdaemon Jun 27, 2026
6d78f6f
Add cookbook empty scan buttons
pewdiepie-archdaemon Jun 27, 2026
0fa3f4c
fix(email): don't probe IMAP for send-only (SMTP-only) accounts (#4830)
rmdes Jun 27, 2026
f177d38
Clamp unified llama context estimate
pewdiepie-archdaemon Jun 27, 2026
424ebfa
Raise unified llama context estimate
pewdiepie-archdaemon Jun 27, 2026
912a4e2
Color cookbook context fit notes
pewdiepie-archdaemon Jun 27, 2026
448ed1b
Limit cookbook spacing change to advanced tab
pewdiepie-archdaemon Jun 27, 2026
d45543a
Tighten llama advanced rows
pewdiepie-archdaemon Jun 27, 2026
277879b
Tighten llama advanced rows further
pewdiepie-archdaemon Jun 27, 2026
3b7e6bb
Nudge vllm attention field
pewdiepie-archdaemon Jun 27, 2026
4ced5da
Tighten llama advanced vertical spacing
pewdiepie-archdaemon Jun 27, 2026
a0f6f27
Nudge llama advanced rows right
pewdiepie-archdaemon Jun 27, 2026
cbc5d6c
Simplify llama MTP token input
pewdiepie-archdaemon Jun 27, 2026
c157553
Refine llama advanced row spacing
pewdiepie-archdaemon Jun 27, 2026
0ee2e00
Tint Ollama engine icon
pewdiepie-archdaemon Jun 27, 2026
1eebfb8
Lower cookbook serve top row
pewdiepie-archdaemon Jun 27, 2026
0c53672
Adjust llama advanced top spacing
pewdiepie-archdaemon Jun 27, 2026
745dc8d
fix(health): report unhealthy memory vector store as degraded
YAMRAJ13y Jun 27, 2026
7fe55a2
Fine tune llama advanced spacing
pewdiepie-archdaemon Jun 27, 2026
a193e6b
Tighten first llama advanced row gap
pewdiepie-archdaemon Jun 27, 2026
5bc3a69
Tighten llama memory row gap
pewdiepie-archdaemon Jun 27, 2026
edf06a8
Tighten llama memory row gap again
pewdiepie-archdaemon Jun 27, 2026
c0ee638
Stabilize llama advanced row spacing
pewdiepie-archdaemon Jun 27, 2026
eb51935
Lower stabilized llama advanced block
pewdiepie-archdaemon Jun 27, 2026
46e01b4
Increase llama mode toggle height
pewdiepie-archdaemon Jun 27, 2026
4db0fee
Nudge vllm attention field right
pewdiepie-archdaemon Jun 27, 2026
d46b08d
Darken cookbook launch command
pewdiepie-archdaemon Jun 27, 2026
c288fb9
Match launch command hover surface
pewdiepie-archdaemon Jun 27, 2026
60e13cf
Adjust CPU llama row and VRAM readout
pewdiepie-archdaemon Jun 27, 2026
3abe4f7
Lower CPU llama memory row
pewdiepie-archdaemon Jun 27, 2026
7d3f8d6
Move vllm attention farther right
pewdiepie-archdaemon Jun 27, 2026
91a94cf
Move vllm block size left
pewdiepie-archdaemon Jun 27, 2026
6d31cfc
Move vllm block size left again
pewdiepie-archdaemon Jun 27, 2026
97f8b3b
Add icons to cookbook engine filter
pewdiepie-archdaemon Jun 27, 2026
80b287e
Move core serve memory fields left
pewdiepie-archdaemon Jun 27, 2026
59c2cbe
Move core serve memory fields farther left
pewdiepie-archdaemon Jun 27, 2026
d33e3fd
Move core serve memory fields further left
pewdiepie-archdaemon Jun 27, 2026
20f5fa9
Align runtime note with serve presets
pewdiepie-archdaemon Jun 27, 2026
1aa3af7
Adjust serve preset and memory field offsets
pewdiepie-archdaemon Jun 27, 2026
b4b3a1e
Move serve memory fields left again
pewdiepie-archdaemon Jun 27, 2026
6f10e07
Clarify cookbook conda env support
pewdiepie-archdaemon Jun 27, 2026
27ce89a
Adjust cookbook serve control spacing
pewdiepie-archdaemon Jun 27, 2026
3b5d800
Simplify cookbook scan use cases
pewdiepie-archdaemon Jun 27, 2026
a7c25c1
Toggle manual hardware edit button
pewdiepie-archdaemon Jun 27, 2026
f938b89
Set cookbook GPU buttons to 30px
pewdiepie-archdaemon Jun 27, 2026
d62eba4
fix(security): prevent ReDoS in XML and args tool-call parsers (#4941)
nopoz Jun 27, 2026
5668241
Nudge serve GPU selector left
pewdiepie-archdaemon Jun 27, 2026
b2881ea
test: split endpoint resolver tests (#4957)
alteixeira20 Jun 27, 2026
80f062f
Move vllm advanced fields closer
pewdiepie-archdaemon Jun 27, 2026
64c8d33
Move vllm block size left
pewdiepie-archdaemon Jun 27, 2026
cb1b054
Move serve preset row up
pewdiepie-archdaemon Jun 27, 2026
449a304
fix(tasks): keep scheduled-task prompt cache stable
hestiaOS Jun 27, 2026
8584807
Lower serve preset buttons slightly
pewdiepie-archdaemon Jun 27, 2026
169e9a2
Clarify diffusers image editing support
pewdiepie-archdaemon Jun 27, 2026
fb551c9
Lower cookbook engine filter button
pewdiepie-archdaemon Jun 27, 2026
b248bb3
Align serve backend controls
pewdiepie-archdaemon Jun 27, 2026
4717046
Nudge serve engine control up
pewdiepie-archdaemon Jun 27, 2026
d3306d6
fix(ai): offload model resolution from async paths
tanmayraut45 Jun 27, 2026
4719941
Move vllm swap control left
pewdiepie-archdaemon Jun 27, 2026
8dfaf5e
Fine tune vllm advanced offsets
pewdiepie-archdaemon Jun 27, 2026
cbe8da0
Set vllm env preset width
pewdiepie-archdaemon Jun 27, 2026
6d8ea62
Adjust vllm preset and offsets
pewdiepie-archdaemon Jun 27, 2026
fc7f700
fix(cookbook): load user-site pth hooks for runtime installs
devpedrobarbosa Jun 28, 2026
dfad293
fix(mcp): retain builtin startup tasks and reap npx probe
tanmayraut45 Jun 28, 2026
27b3d43
fix(chat): sanitize web search query to strip markdown and code block…
rudra496 Jun 28, 2026
fb6447d
Reset mobile serve memory offsets
pewdiepie-archdaemon Jun 28, 2026
6fb8584
Persist OCR captions in gallery
pewdiepie-archdaemon Jun 28, 2026
40c3349
Harden added models endpoint rendering
pewdiepie-archdaemon Jun 28, 2026
37ccfcc
Make added models list cache-only
pewdiepie-archdaemon Jun 28, 2026
21998a8
Avoid model endpoint probes on boot
pewdiepie-archdaemon Jun 28, 2026
7c77b43
Fix mobile note archive action
pewdiepie-archdaemon Jun 28, 2026
3441061
refactor(routes): move gallery domain into routes/gallery subpackage …
ydonghao Jun 28, 2026
fc99486
Reject blank ownerless claim owner (#4929)
redpersongpt Jun 28, 2026
7f6044f
fix(security): prevent ReDoS in verdict-prose and continuation matche…
nopoz Jun 28, 2026
d749de2
Fix failed task activity colors
pewdiepie-archdaemon Jun 28, 2026
6ead14c
Fix expanded email attachment chip layout
pewdiepie-archdaemon Jun 28, 2026
a90b60a
Keep PDF annotation controls hoverable
pewdiepie-archdaemon Jun 28, 2026
e75e1d0
Close notes when opening documents
pewdiepie-archdaemon Jun 28, 2026
c096af5
fix(cookbook): accept $(find) subshells in serve command validation
michaelxer Jun 28, 2026
d13d8aa
refactor(routes): move research domain into routes/research/ subpackage
ydonghao Jun 28, 2026
38d5e65
Merge dev into main for testing
pewdiepie-archdaemon Jun 28, 2026
58ee4e7
Move email writing style into AI settings
pewdiepie-archdaemon Jun 28, 2026
cdc6918
fix(llm): normalize OpenAI-compatible chat URLs
nikakhalatiani Jun 28, 2026
caef11f
fix(docs): correct broken backup-restore link in setup.md
michaelxer Jun 28, 2026
3170501
test: localize calendar recurrence helper import (#4944)
alteixeira20 Jun 28, 2026
c8e106c
test: split provider endpoint tests (#4961)
alteixeira20 Jun 28, 2026
4e81a5a
Guard document style against persona guessing
pewdiepie-archdaemon Jun 28, 2026
9d576dc
Clear stale chat stream indicators
pewdiepie-archdaemon Jun 28, 2026
d0d83e9
Show busy spinner while deleting email
pewdiepie-archdaemon Jun 28, 2026
d8f3985
Show email delete overlay before request
pewdiepie-archdaemon Jun 28, 2026
bb5d57f
Show overlays during bulk email delete
pewdiepie-archdaemon Jun 28, 2026
fada157
Restore chat thumbnails and gallery OCR captions
pewdiepie-archdaemon Jun 29, 2026
ec93ea3
Persist upload OCR captions in gallery
pewdiepie-archdaemon Jun 29, 2026
99c87c7
Show chat uploads in gallery immediately
pewdiepie-archdaemon Jun 29, 2026
9401fd2
Allow stalled chat uploads to be cancelled
pewdiepie-archdaemon Jun 29, 2026
ef6cda2
Link gallery uploads back to chat
pewdiepie-archdaemon Jun 29, 2026
d919f84
Restore cookbook download task progress
pewdiepie-archdaemon Jun 29, 2026
757ebd8
Keep open editor drafts in chat context
pewdiepie-archdaemon Jun 29, 2026
c80a35a
Reuse open email drafts for agent replies
pewdiepie-archdaemon Jun 29, 2026
8016e3a
Clarify empty AI reply errors
pewdiepie-archdaemon Jun 29, 2026
fcf6ce5
Fix added models probe button
pewdiepie-archdaemon Jun 29, 2026
6139fc3
Retry blank email AI replies
pewdiepie-archdaemon Jun 29, 2026
18700f9
Persist email AI reply context notes
pewdiepie-archdaemon Jun 29, 2026
5a52849
Show cached model scan failures
pewdiepie-archdaemon Jun 29, 2026
79d7883
Ignore non-string mail CLI recipients (#1824)
redpersongpt Jun 29, 2026
968aaaa
Normalize gallery CLI text fields (#2012)
redpersongpt Jun 29, 2026
cb356c8
Skip invalid notes CLI item rows (#2005)
redpersongpt Jun 29, 2026
58dd754
Reject non-string atomic text writes (#1819)
redpersongpt Jun 29, 2026
a5a361e
Gate background tasks behind foreground activity
pewdiepie-archdaemon Jun 29, 2026
df5d22f
Fix task status toggle hit target
pewdiepie-archdaemon Jun 29, 2026
1a23f39
Rescue plain UI open-panel tool text
pewdiepie-archdaemon Jun 29, 2026
296fadc
Implement email auto translate cache task
pewdiepie-archdaemon Jun 29, 2026
f2bdf3f
Reject resolver results without IPs (#1826)
redpersongpt Jun 29, 2026
ddc9891
Ignore invalid serve profile inputs (#1827)
redpersongpt Jun 29, 2026
ce7e498
Keep snap helper safe without context (#1828)
redpersongpt Jun 29, 2026
18b2c91
Ignore invalid harmonize mask layers (#1829)
redpersongpt Jun 29, 2026
8209f73
Ignore non-string personal doc text (#1832)
redpersongpt Jun 29, 2026
c8fc4d0
Ignore invalid context budget numbers (#1831)
redpersongpt Jun 29, 2026
e92d438
Lengthen email loading skeleton rows
pewdiepie-archdaemon Jun 29, 2026
2584d03
Add task email output sender controls
pewdiepie-archdaemon Jun 30, 2026
061484c
Speed up task activity load
pewdiepie-archdaemon Jun 30, 2026
ea3e7f5
Lazy load startup task and email work
pewdiepie-archdaemon Jun 30, 2026
edbc913
Fix incognito agent mode and cookbook tmux preview
pewdiepie-archdaemon Jun 30, 2026
38e345d
Gate email auto translate behind active chat
pewdiepie-archdaemon Jun 30, 2026
0b56c06
Pause background tasks while Odysseus is active
pewdiepie-archdaemon Jun 30, 2026
f351555
Auto scan cookbook hardware when cache is missing
pewdiepie-archdaemon Jun 30, 2026
81193dc
Add hover labels to mini sidebar buttons
pewdiepie-archdaemon Jun 30, 2026
2f6c7cd
Cancel background tasks when Odysseus becomes active
pewdiepie-archdaemon Jun 30, 2026
affc8b1
Improve document agent streaming and chat metrics
pewdiepie-archdaemon Jun 30, 2026
3468503
Show thumbnails on past research cards
pewdiepie-archdaemon Jun 30, 2026
1f1a546
Fix task activity scrolling and background spam
pewdiepie-archdaemon Jun 30, 2026
e4e181a
Move task start-now pill up
pewdiepie-archdaemon Jun 30, 2026
7887d86
Merge remote-tracking branch 'origin/dev'
pewdiepie-archdaemon Jun 30, 2026
a1b317d
Write email replies into open composer
pewdiepie-archdaemon Jun 30, 2026
c374c6e
Preserve quoted email history during AI edits
pewdiepie-archdaemon Jun 30, 2026
a094426
Speed up email composer typing
pewdiepie-archdaemon Jun 30, 2026
6708fab
Keep email composer open during fast edits
pewdiepie-archdaemon Jun 30, 2026
2c0406c
Fallback model picker to available model
pewdiepie-archdaemon Jun 30, 2026
e32eb03
Preserve HTML email quote history
pewdiepie-archdaemon Jun 30, 2026
39335b7
Hide font size in markdown preview
pewdiepie-archdaemon Jun 30, 2026
873b315
fix(agent): execute fenced tool calls with inline args and route bare…
botinate Jun 30, 2026
fddcfd5
refactor(routes): move memory domain into routes/memory/ subpackage (…
ydonghao Jun 30, 2026
1e76598
fix(security): apply sensitive-file deny-list to grep tool (#5011) (#…
michaelxer Jun 30, 2026
2f1c411
fix(agent): confine glob literal lookups to the search root (#5010)
ashvinctrl Jun 30, 2026
960d6f1
fix(security): wrap email style, integration, and MCP descriptions as…
cjRem44x Jun 30, 2026
6522414
fix(model-context): read real context window for unknown proxy models…
ashvinctrl Jun 30, 2026
4c7db7c
fix(security): harden gallery endpoint URL checks (#4981)
alteixeira20 Jun 30, 2026
de39ebc
fix: add grace period to document tidy to prevent deleting new docume…
badgerbees Jun 30, 2026
e86ccae
fix(docker): make host Docker socket opt-in (#4902)
alteixeira20 Jun 30, 2026
d40e998
fix(parser): parse Gemma 3/4 custom tool calling tokens (#5033)
Katsoragi Jun 30, 2026
3548539
fix(agent): preserve bare email tool parity (#5075)
RaresKeY Jun 30, 2026
0b4ef71
Stabilize chat and cookbook workflows
pewdiepie-archdaemon Jul 1, 2026
1933201
Merge remote-tracking branch 'origin/dev'
pewdiepie-archdaemon Jul 1, 2026
5a0e4e4
Repair document tool args and metrics cleanup
pewdiepie-archdaemon Jul 1, 2026
22e0c71
Fix merged test regressions
pewdiepie-archdaemon Jul 1, 2026
246b8d8
Show fallback model in picker
pewdiepie-archdaemon Jul 1, 2026
2918ef7
Support mobile enter for queued agent prompts
pewdiepie-archdaemon Jul 1, 2026
c3c277d
fix(cookbook): stop Ollama runner from executing the install one-line…
mazen-salah Jul 2, 2026
b145720
fix(session): use utcnow_naive across session routes (#1116) (#5003)
lekt9 Jul 2, 2026
931adef
fix(security): match the sensitive-file deny-list case-insensitively …
ashvinctrl Jul 2, 2026
bbdea29
fix(agent): skip deny-listed sensitive files in glob (#5094)
ashvinctrl Jul 2, 2026
7a5d0d7
fix: auto-spam move/delete targets the wrong message (seqnum vs UID) …
afonsopc Jul 2, 2026
a24e749
fix(security): confine research file paths (#4986)
alteixeira20 Jul 2, 2026
c76d5e6
fix(search): pin httpx connection to resolved IP to block DNS rebindi…
ErnestHysa Jul 2, 2026
9d07400
fix(ui): prevent race condition in default chat model dropdown init (…
holden093 Jul 2, 2026
c9e5def
fix(mobile): stack the model-comparison grid into one column on phone…
BrunooMoniz Jul 2, 2026
5bcd228
Fix stale streams and cookbook task controls
pewdiepie-archdaemon Jul 3, 2026
7f833ee
Add bulk email attachment downloads
pewdiepie-archdaemon Jul 3, 2026
ac55f17
Add AI edit command box to gallery editor
pewdiepie-archdaemon Jul 3, 2026
25ba07a
Open documents from native tool outputs
pewdiepie-archdaemon Jul 3, 2026
f34f84d
Route structured writing requests to documents
pewdiepie-archdaemon Jul 3, 2026
339ca49
Keep open document context for section edits
pewdiepie-archdaemon Jul 3, 2026
62ad5cd
Parse local function_model tool wrappers
pewdiepie-archdaemon Jul 3, 2026
2fb3a31
Hide untagged reasoning dumps in chat
pewdiepie-archdaemon Jul 3, 2026
53450e2
fix(tools): handle non-dict JSON values in _parse_tool_args (closes #…
Tanmay9223 Jul 3, 2026
00cabb1
fix: resolve RAG manager search signature TypeError (#4994)
fatahjamro Jul 3, 2026
dabc30f
fix(agent): fall back to keyword tool selection when retrieval times out
QlikChrister Jul 3, 2026
667cc4e
test: split service health tests (#4972)
alteixeira20 Jul 3, 2026
972c2d6
ci: add focused test guidance signal (#4982)
alteixeira20 Jul 3, 2026
91fd104
fix(integrations): don't append a trailing slash when api_call path i…
harshit-ojha0324 Jul 3, 2026
8cb1243
fix(security): scope send_to_session to an exact session owner
ashvinctrl Jul 4, 2026
fe5d01f
refactor(routes): move history domain into routes/history/ subpackage…
ydonghao Jul 4, 2026
fc0ecc0
fix(calendar): honor list_events date range aliases (#3283)
badgerbees Jul 4, 2026
5b4ed45
Merge pull request #5195 from ashvinctrl/fix/send-to-session-null-owner
alteixeira20 Jul 4, 2026
deceb62
fix(security): match grep's rg sensitive-file exclusions case-insensi…
ashvinctrl Jul 4, 2026
df563a1
fix(security): validate integration api_call URLs with the outbound S…
wbaxterh Jul 4, 2026
6fc24e4
fix(security): pin webhook delivery to the SSRF-validated IP (DNS reb…
wbaxterh Jul 4, 2026
69bdd40
fix(security): apply the webhook SSRF guard to the reminder ntfy send…
wbaxterh Jul 4, 2026
15239e3
fix(search): extract non-ASCII capitalized names in _extract_entities
Ohualtex Jul 4, 2026
e466b02
fix(security): make research path lookup CodeQL-friendly (#5129)
alteixeira20 Jul 4, 2026
d90c09f
Merge pull request #5204 from Ohualtex/fix/search-query-unicode-entit…
bitboody Jul 4, 2026
a721d36
Merge pull request #5166 from QlikChrister/fix/tool-rag-timeout-keywo…
bitboody Jul 4, 2026
37aeefc
fix(security): sanitize email rich body render path (#5212)
undergroundrap Jul 4, 2026
e54a4ea
test(integrations): drop redundant trailing-slash assertion
harshit-ojha0324 Jul 4, 2026
d02b140
fix(chat): honor explicit web search denial
Jul 4, 2026
102aaa3
Merge pull request #5181 from harshit-ojha0324/fix/webhook-trailing-s…
bitboody Jul 5, 2026
c3e9286
Merge pull request #5222 from RaresKeY/fix/chat-web-search-deny-20260704
bitboody Jul 5, 2026
251ec72
refactor(routes): move contacts domain into routes/contacts/ subpacka…
ydonghao Jul 5, 2026
a920183
fix(security): scope owner-less email accounts to a mailbox match in …
ashvinctrl Jul 5, 2026
ab5d383
fix(email): enforce MCP account owner scope (#5234)
RaresKeY Jul 5, 2026
f1a057c
fix(tasks): gate cookbook serve task execution (#5235)
RaresKeY Jul 5, 2026
df6e6db
Merge pull request #4983 from michaelxer/fix-setup-link-4926-20260628
bitboody Jul 6, 2026
a1a14bd
Checkpoint Odysseus local update
pewdiepie-archdaemon Jul 7, 2026
4c24d5d
Merge remote-tracking branch 'origin/dev'
pewdiepie-archdaemon Jul 7, 2026
c426097
Stabilize local dev merge
pewdiepie-archdaemon Jul 7, 2026
5d6061a
Fix Cookbook download runner for Python 3.11
pewdiepie-archdaemon Jul 7, 2026
7906671
fix(chat): restore missing _explicit_web_intent definition (#5290)
SteveHolloway71 Jul 8, 2026
2c75801
fix(chat): require explicit web search enable
RaresKeY Jul 8, 2026
93107c5
chore(release): bump version to 1.0.2
RaresKeY Jul 11, 2026
cf4e240
Merge verified Odysseus fixes
pewdiepie-archdaemon Jul 23, 2026
94ba33f
chore: add ruff linting checks
victor-hermogenes Jul 27, 2026
0f1e352
fix: importing Any from typing otherwise uvicorn and setup breaks
victor-hermogenes Jul 27, 2026
0a92084
Merge branch 'main' of https://github.com/victor-hermogenes/odysseus …
victor-hermogenes Jul 27, 2026
bd18355
Merge branch 'main' of https://github.com/victor-hermogenes/odysseus …
victor-hermogenes Jul 27, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 21 additions & 0 deletions .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -130,6 +130,27 @@ SEARXNG_INSTANCE=http://localhost:8080
# FASTEMBED_MODEL=sentence-transformers/all-MiniLM-L6-v2
# FASTEMBED_CACHE_PATH= # defaults to ~/.cache/fastembed

# ============================================================
# Google OAuth2 (Google Workspace / .edu email accounts)
# ============================================================
# Required to use the "Connect with Google" OAuth flow in email account setup.
# Create credentials at: console.cloud.google.com → APIs & Services → Credentials
# 1. Enable the Gmail API for your project.
# 2. Configure the OAuth consent screen (User Type: Internal for Workspace orgs).
# Add scopes: https://mail.google.com/ and email.
# 3. Create an OAuth 2.0 Client ID (type: Web application).
# Add your redirect URI: http://localhost:7000/api/email/oauth/google/callback
# (replace host/port for hosted installs).
# 4. Copy the Client ID and Client Secret below.
#
# GOOGLE_OAUTH_CLIENT_ID=your-client-id.apps.googleusercontent.com
# GOOGLE_OAUTH_CLIENT_SECRET=replace-with-client-secret
#
# Set this explicitly for HTTPS, reverse-proxy, or hosted deployments. The
# value must exactly match an authorized redirect URI in the Google client.
# Local HTTP setups may use the callback URL inferred by the application.
# GOOGLE_OAUTH_REDIRECT_URI=https://your-domain.com/api/email/oauth/google/callback

# ============================================================
# Misc
# ============================================================
Expand Down
124 changes: 124 additions & 0 deletions .github/scripts/focused_test_guidance.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,124 @@
#!/usr/bin/env python3
"""Report focused pytest guidance for changed paths under tests/."""

from __future__ import annotations

import argparse
import os
import shlex
import subprocess
import sys
from collections.abc import Iterable
from pathlib import PurePosixPath


def parse_paths(raw_paths: bytes) -> list[str]:
"""Decode the NUL-delimited output of ``git diff --name-only -z``."""
return [os.fsdecode(path) for path in raw_paths.split(b"\0") if path]


def changed_paths_from_merge_base(base_sha: str, head_sha: str) -> list[str]:
"""Return changed ``tests/`` paths using GitHub PR three-dot semantics.

GitHub PR changed files are based on the merge base and the PR head, not a
direct endpoint diff between the current base branch tip and the PR head.
Using the direct endpoint diff can include files changed only on the base
branch when the PR branch is stale.
"""
merge_base = subprocess.check_output(
["git", "merge-base", base_sha, head_sha],
stderr=subprocess.DEVNULL,
).strip()
raw_paths = subprocess.check_output(
[
"git",
"diff",
"--name-only",
"--diff-filter=ACMRT",
"-z",
os.fsdecode(merge_base),
head_sha,
"--",
"tests/",
],
)
return parse_paths(raw_paths)


def select_test_paths(paths: Iterable[str]) -> list[str]:
"""Return unique, repository-relative paths contained by tests/."""
selected: set[str] = set()
for raw_path in paths:
path = PurePosixPath(raw_path)
if path.is_absolute() or ".." in path.parts:
continue
parts = tuple(part for part in path.parts if part != ".")
if len(parts) >= 2 and parts[0] == "tests":
selected.add(PurePosixPath(*parts).as_posix())
return sorted(selected)


def is_pytest_file(path: str) -> bool:
"""Return whether a changed path follows this repository's pytest naming."""
name = PurePosixPath(path).name
return name.endswith(".py") and (
name.startswith("test_") or name.endswith("_test.py")
)


def pytest_command(paths: Iterable[str]) -> str:
"""Build a copyable pytest command for changed runnable test files."""
command = ["python3", "-m", "pytest", "-q", *paths]
return shlex.join(command)


def format_report(paths: Iterable[str]) -> str:
"""Format focused guidance for CI logs and the workflow summary."""
changed_paths = select_test_paths(paths)
runnable_paths = [path for path in changed_paths if is_pytest_file(path)]
lines = ["## Focused test guidance (report-only)", ""]
if not changed_paths:
lines.append("No changed paths under `tests/`.")
else:
lines.extend(["Changed paths under `tests/`:", ""])
lines.extend(f"- `{path}`" for path in changed_paths)
lines.extend(["", "Suggested focused validation:", ""])
if runnable_paths:
lines.append(f"```sh\n{pytest_command(runnable_paths)}\n```")
else:
lines.append("No directly runnable pytest files changed.")
lines.extend(
[
"",
"This guidance does not infer tests from source changes. "
"Existing blocking CI remains the source of truth.",
]
)
return "\n".join(lines)


def _parse_args(argv: list[str]) -> argparse.Namespace:
parser = argparse.ArgumentParser(
description="Report focused pytest guidance for changed tests/ paths.",
)
parser.add_argument("--base-sha", help="Pull request base commit SHA.")
parser.add_argument("--head-sha", help="Pull request head commit SHA.")
return parser.parse_args(argv)


def main(argv: list[str] | None = None) -> int:
args = _parse_args(sys.argv[1:] if argv is None else argv)
if bool(args.base_sha) != bool(args.head_sha):
raise SystemExit("--base-sha and --head-sha must be provided together")

if args.base_sha and args.head_sha:
paths = changed_paths_from_merge_base(args.base_sha, args.head_sha)
else:
paths = parse_paths(sys.stdin.buffer.read())

print(format_report(paths))
return 0


if __name__ == "__main__":
raise SystemExit(main())
41 changes: 41 additions & 0 deletions .github/workflows/codeql.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
name: CodeQL

# Advanced setup so CodeQL also runs on pull requests (including from forks),
# surfacing findings before merge instead of only after a change lands on dev.
on:
push:
branches: [dev, main]
pull_request:
branches: [dev]
schedule:
- cron: "17 3 * * 1"

permissions:
contents: read

jobs:
analyze:
name: Analyze (${{ matrix.language }})
runs-on: ubuntu-latest
permissions:
security-events: write
actions: read
contents: read
strategy:
fail-fast: false
matrix:
language: [actions, javascript-typescript, python]
steps:
- name: Checkout
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
with:
persist-credentials: false
- name: Initialize CodeQL
uses: github/codeql-action/init@8aad20d150bbac5944a9f9d289da16a4b0d87c1e # v4.36.2
with:
languages: ${{ matrix.language }}
build-mode: none
- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@8aad20d150bbac5944a9f9d289da16a4b0d87c1e # v4.36.2
with:
category: "/language:${{ matrix.language }}"
1 change: 1 addition & 0 deletions ACKNOWLEDGMENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,7 @@ Bundled in `static/fonts/`:
| [Fira Code](https://github.com/tonsky/FiraCode) | SIL Open Font License 1.1 | Nikita Prokopov & contributors |
| [Inter](https://github.com/rsms/inter) | SIL Open Font License 1.1 | Rasmus Andersson |
| [GohuFont](https://font.gohu.org/) (`fonts/custom/GohuFont.ttf`) | WTFPL | Hugo Chargois |
| [OpenDyslexic](https://opendyslexic.org/) (`fonts/OpenDyslexic-{Regular,Bold}.woff2`) | SIL Open Font License 1.1 ([`licenses/OpenDyslexic-OFL.txt`](licenses/OpenDyslexic-OFL.txt)) | Abbie Gonzalez |

## Python dependencies

Expand Down
8 changes: 6 additions & 2 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ End-users cloning the repo will land on `dev` by default. To run the curated/sta
Docker is the recommended path for normal testing:

```bash
git clone https://github.com/pewdiepie-archdaemon/odysseus.git
git clone https://github.com/odysseus-dev/odysseus.git
cd odysseus
cp .env.example .env
docker compose up -d --build
Expand All @@ -47,11 +47,16 @@ Windows is not actively tested. Docker on Linux or a Linux/macOS manual install
Run the smallest relevant checks for your change:

```bash
python -m ruff check .
python -m pytest
python -m py_compile app.py routes/*.py src/*.py
node --check static/js/<file-you-changed>.js
```

Ruff is the fast Python lint pass. It catches import-order mistakes, unused
imports, stale `noqa` comments, missing subprocess safety flags, and similar
small issues that otherwise become noisy review comments.

For Docker-related changes:

```bash
Expand Down Expand Up @@ -130,4 +135,3 @@ Issues with only "help", "does not work", or a screenshot without context may be
Do not post secrets, API keys, private logs, personal documents, or public IPs in issues or pull requests.

For security reports, follow [SECURITY.md](SECURITY.md).

2 changes: 2 additions & 0 deletions core/atomic_io.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,8 @@ def atomic_write_json(path: str, data: Any, *, indent: Optional[int] = None) ->


def atomic_write_text(path: str, text: str) -> None:
if not isinstance(text, str):
raise TypeError("atomic_write_text expects a string")
os.makedirs(os.path.dirname(path) or ".", exist_ok=True)
tmp = f"{path}.tmp.{os.getpid()}"
with open(tmp, "w", encoding="utf-8") as f:
Expand Down
2 changes: 1 addition & 1 deletion core/exceptions.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# src/exceptions.py
# core/exceptions.py
"""Custom exceptions for the application."""

class SessionNotFoundError(Exception):
Expand Down
27 changes: 27 additions & 0 deletions core/log_safety.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
"""Helpers for keeping sensitive data out of logs.

Endpoint URLs configured by admins can embed credentials in the userinfo
(``https://user:pass@host``) or query string (``?api_key=...``). Logging them
raw leaks those secrets, so route/diagnostic logs run URLs through
``redact_url`` first. Reconstructing the URL without userinfo/query/fragment
also doubles as a sanitizer barrier for CodeQL's clear-text-logging query.
"""

from urllib.parse import urlparse, urlunparse


def redact_url(url: str) -> str:
"""Return a URL safe for logs by removing userinfo and query/fragment.

Keeps scheme, host, port and path so logs stay useful for debugging.
"""
try:
parsed = urlparse(url or "")
host = parsed.hostname or ""
if ":" in host: # IPv6 literal — re-bracket so host:port stays unambiguous
host = f"[{host}]"
if parsed.port:
host = f"{host}:{parsed.port}"
return urlunparse((parsed.scheme, host, parsed.path, "", "", ""))
except Exception:
return "<endpoint>"
2 changes: 1 addition & 1 deletion core/middleware.py
Original file line number Diff line number Diff line change
Expand Up @@ -117,7 +117,7 @@ async def dispatch(self, request: Request, call_next) -> Response:
f"script-src 'self' 'nonce-{nonce}' https://cdn.jsdelivr.net; "
"style-src 'self' 'unsafe-inline' https://cdn.jsdelivr.net; "
"font-src 'self' https://cdn.jsdelivr.net; "
"img-src 'self' data: blob:; "
"img-src 'self' data: blob: https:; "
"media-src 'self' blob:; "
"connect-src 'self'; "
"frame-src 'self'; "
Expand Down
70 changes: 70 additions & 0 deletions docker/build-realesrgan-wheels.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
#!/usr/bin/env bash
# Build patched wheels for Real-ESRGAN's unmaintained dependencies.
#
# basicsr / gfpgan / facexlib (xinntao, last released 2022) read their version
# in setup.py with:
#
# exec(compile(f.read(), version_file, 'exec'))
# return locals()['__version__']
#
# Python 3.13+ implements PEP 667: locals() inside a function returns an
# independent snapshot that exec() can no longer mutate, so the read raises
# `KeyError: '__version__'` and the sdist build fails. That is why the Cookbook
# "install realesrgan" button dies on the python:3.14 image. The packages have
# no fixed release, so we patch get_version() to exec into an explicit namespace
# dict (works on every Python) and build wheels from the patched source.
#
# Usage: build-realesrgan-wheels.sh [OUTPUT_DIR] (default: /wheels)
set -euo pipefail

OUT="${1:-/wheels}"
mkdir -p "$OUT"

work="$(mktemp -d)"
trap 'rm -rf "$work"' EXIT
cd "$work"

# Pinned to the versions Real-ESRGAN 0.3.0 resolves to.
SPECS="basicsr==1.4.2 gfpgan==1.3.8 facexlib==0.3.0"

for spec in $SPECS; do
name="${spec%%==*}"
ver="${spec##*==}"
# pip download builds metadata (and trips the same bug), so fetch the raw
# sdist URL from the PyPI JSON API instead.
url="$(python - "$name" "$ver" <<'PY'
import json, sys, urllib.request
name, ver = sys.argv[1], sys.argv[2]
data = json.load(urllib.request.urlopen(f"https://pypi.org/pypi/{name}/{ver}/json"))
for f in data["urls"]:
if f["packagetype"] == "sdist":
print(f["url"]); break
else:
sys.exit(f"no sdist found for {name}=={ver}")
PY
)"
echo ">> fetching ${name} ${ver}: ${url}"
curl -fsSL "$url" -o "${name}.tar.gz"
tar xzf "${name}.tar.gz"
done

echo ">> patching get_version()"
python - <<'PY'
import pathlib
old_exec = "exec(compile(f.read(), version_file, 'exec'))"
new_exec = "_ver_ns = {}\n exec(compile(f.read(), version_file, 'exec'), _ver_ns)"
old_ret = "return locals()['__version__']"
new_ret = "return _ver_ns['__version__']"
patched = 0
for setup in pathlib.Path(".").glob("*/setup.py"):
s = setup.read_text()
if old_exec in s and old_ret in s:
setup.write_text(s.replace(old_exec, new_exec).replace(old_ret, new_ret))
print(" patched", setup)
patched += 1
assert patched == 3, f"expected to patch 3 setup.py files, patched {patched}"
PY

echo ">> building wheels into ${OUT}"
pip wheel --no-deps -w "$OUT" ./basicsr-* ./gfpgan-* ./facexlib-*
ls -l "$OUT"
12 changes: 12 additions & 0 deletions docker/host-docker.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
# High-trust host Docker access. Enable only when local Docker-daemon
# management from Cookbook is required and you accept that raw socket access
# grants broad control over the host Docker daemon.
# COMPOSE_FILE=docker-compose.yml:docker/host-docker.yml
# DOCKER_GID=<numeric host Docker group id>
services:
odysseus:
volumes:
- /var/run/docker.sock:/var/run/docker.sock
group_add: ["${DOCKER_GID:-963}"]
environment:
- ODYSSEUS_ENABLE_HOST_DOCKER=true
Loading
Loading