Intent-without-action supervisor now references specific tool names
from verb→tool mapping when nudging the model ('DO IT NOW: call
list_vault' instead of just 'DO IT NOW'). Also extracts explicitly
named tools from the model's prose.
New wrong-tool detector fires when model calls tool X but prose
describes wanting Y (e.g. rename_session vs list_vault). Injects
correction nudge and skips execution of the wrong call.
7.3 KiB
Ulysses Improvement Tasks
Last updated: 2026-07-08
Priority: HIGH
-
Agent toolcalling loop: model narrates actions but never emits fenced blocks
Gemma-4-12b repeatedly narrates intent ("I'm calling list_vault now") without emitting the ```tool fenced block. The model clearly understands what it should do but the fenced block never arrives. This blocks agent workflows entirely when it occurs (~25% of tool calls). The anti-hallucination system prompt rule drafted yesterday is staged but not live (container not restarted). Need to investigate whether this is: (a) the missing system prompt rule, (b) a regex/parsing issue in parse_tool_blocks(), (c) the compact API-model prompt confusing non-tool-native models, or (d) a context/truncation issue preventing the fenced block from reaching the parser. -
Chat deletion dropdown broken — does not appear
Clicking the arrow on a chat in the left drawer no longer shows the dropdown menu (rename/delete/etc.). Cannot delete chats. Likely a JS event listener or DOM positioning issue — possibly zoom-related getBoundingClientRect() skew or a regression from recent dropdown/popup fixes. -
AUTO_START_LOCAL: persist & auto-restore last running model on restart
NewAUTO_START_LOCALenv var (bool, default false). On graceful shutdown/restart, persist the currently running model + all launch parameters (engine, quantization, context length, GPU layers, etc.) to a file in/app/data/. On startup, if the file exists and AUTO_START_LOCAL is true, automate the full launch pipeline: resolve the saved preset, spin up the engine, and register the endpoint — skipping the manual cookbook → Launch → pick model → verify params → launch → wait → refresh cycle the user currently endures on every restart. -
Floating windows overflow viewport after zoom/font changes — unreachable controls
:root.ui-scale-125 { zoom: 1.25 }renders all content 25% larger, butwindow.innerHeightdoesn't change withzoom(CSS rendering only, not DOM). ThewindowResize.jssaved-size restore at line 224 clamps towindow.innerHeight, which after zoom makes windows 1.25× the visible viewport — pushing headers, close buttons, and top resize handles off-screen. The user literally can't close or move them. Fix: (a) divide restored height by zoom factor in the restore path; (b) add a general safety net — any.modal-contenton open should clamp tocalc(100dvh / var(--ui-zoom, 1) - 40px). AlsowindowResize.jsline 134if (top + height > vh)needs zoom-awarevh. Current zoom compensation rules (line 181-196) only cover.modal-content,.cal-modal-content,.settings-modal-content,#theme-popup,#cookbook-modal, and.pdf-export-overlay— many windows lack the divisor. -
Fix manage_documents tool schema — missing "read" action
Themanage_documentsfunction-calling schema intool_schemas.pyhad"enum": ["list", "delete", "tidy"]but the handler indocument_tools.pysupports"read", "view", "open", "get". The model couldn't read documents through function calling. Fixed: added read/view/open/get to enum, addeddocument_id/offset/limitparams with read-specific descriptions, updated description with "DOCUMENT PANEL (not disk)" prefix. Also added disambiguation prefix tocreate_documentandedit_documentschemas. -
Add "Send to Chat" button to document editor
Button left of the Save button in#doc-actions-footer. Sends a document reference (title + doc_id + snippet) to the active chat, similar to how Cursor injects file references. Must NOT paste full content — just a reference the agent can resolve. Done: "Chat" button injects[Title](#document-<id>) — <120-char snippet>into the #message textarea.
Priority: MEDIUM
-
Bolster Library/Documents CRUD via MCP or native tools
Current document tools are solid but disjointed from agent-mode workflow. The agent has filesystem access (read_file,write_file,edit_file,glob,ls,grep,bash) but these tools operate on disk files, not Ulysses library documents. Need to bridge the gap: the agent should be able to list, read, grep, and edit library documents as naturally as files. Consider:- A unified
read_documenttool distinct frommanage_documents(which is an admin-style multi-action tool) - A
grep_documentsorsearch_documentstool for semantic/fulltext search - Auto-inject active document content into agent context when relevant
- A unified
-
Deep Research: "Send to Chat" reference + agent MCP tool to read reports
Two-part feature: (1) UI — Add a button (alongside "Discuss") to inject a research reference ([Title](#research-<id>)) into the active chat's message input, matching the document "Chat" button pattern. Applies to: research panel sidebar (panel.js:1012), research library cards (documentLibrary.js:2767), and inline result messages (chatRenderer.js:1070). (2) Agent tooling — Research reports are HTML artifacts served at/api/research/report/<id>, not library documents. The agent currently can't resolve a research reference — pasting an ID gets a blank stare. Need an MCP tool (e.g.read_researchorget_research_report) that accepts a research ID, fetches the report HTML, strips it to readable text, and returns it to the agent. Without this, the "Send to Chat" reference is dead text. -
First-party document support in agent mode
Documents feel "disjointed from the agent." The agent creates documents fine but can't easily discover or reference existing ones contextually. Ideas:- "Agent workspace" awareness — automatically surface relevant documents based on chat context
- Document references in chat that are clickable and auto-expand
- The "Send to Chat" button (HIGH priority) is step 1; step 2 is making the agent proactively aware of library contents
-
Improve
create_documentschema description
Current description is verbose and overlaps withedit_file/write_filedisambiguation. Models sometimes usecreate_documentfor disk files. Fixed: added "DOCUMENT PANEL (not disk)" prefix, explicit "For files on disk use write_file" at end. Also applied toedit_document.
Priority: LOW
-
Cookbook sliders: active highlight misaligned with zoom
The rounded highlight on CPU/GPU/RAM etc. toggle sliders doesn't scale withui-scale-125. The active indicator (e.g. "GPU") is partially outside the highlight pill. Low priority — cosmetic, obvious which option is selected. -
Document library: batch operations
Multi-select, bulk delete, bulk export. Currently only single-document operations. -
Document version diff view
The version history panel shows versions but doesn't offer a side-by-side diff view between versions. -
Auto-language detection on document open
The editor auto-detects language on typing but not on initial document open from the library. Opening a Python file saved as "markdown" should suggest the language switch.
Completed
- 2026-07-08: Edit message textarea now fills full message width
.msg-user { width: fit-content }collapsed container when body swapped for textarea. CSS:.msg-user.editing { width: 85% !important }. JS:editUserMessage()adds/removeseditingclass. (commitf0031ea)