docs: update TODO and ROADMAP for 2026-04-29 session

Mark completed: email_send + allowlist UI, model inline edit, cross-session
search. Remove completed items from active lists (distill review, model edit,
session search). Update ROADMAP Phase 3 tool suite line and last-updated date.
Remove resolved Unsloth entry from Deferred.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Scott Idem
2026-04-29 22:03:50 -04:00
parent db3dd465b2
commit 165cf3552d
2 changed files with 26 additions and 26 deletions

View File

@@ -1,7 +1,7 @@
# Cortex — Roadmap
> Phases and priorities. For active tasks see `TODO__Agents.md`.
> Last updated: 2026-04-03
> Last updated: 2026-04-29
---
@@ -32,9 +32,9 @@
## Phase 3 — Intelligence Layer (In Progress)
- ✅ Gemini API orchestrator (tool loop → Claude responder)
- ✅ Tool suite: web search, AE Journal read/write, tasks, scratch, reminders, cron, system
- ✅ Agent mode in UI (async job, poll for result)
- ✅ Local LLM backend (Open WebUI/Ollama, per-user multi-model config)
- ✅ Tool suite: web search, AE Journal read/write, tasks, scratch, reminders, cron, system, email_send (+ per-user allowlist), nc_talk_send
- ✅ Agent mode in UI (async job, poll for result); role-based tool access + confirmation gate
- ✅ Local LLM backend (Open WebUI/Ollama, per-user multi-model config); inline model edit in registry UI
- ✅ Proactive cron (`message` / `brief` job types → NC Talk)
- ✅ Session search (full-text across past session logs)
- ✅ Distill notifications (NC Talk after mid/long runs)
@@ -64,7 +64,6 @@
---
## Deferred / Watching
- **Unsloth Gemma 4 GGUFs** — blocked on Ollama v0.20.1 (llama.cpp GGUF metadata issue); switch `agent-support-gemma-*` aliases to Unsloth Q4_K_M when ready
- **Speculative decoding** — llama.cpp supports it (E4B + E2B draft ≈ 2x speed); Ollama does not yet
- **RAG via Open WebUI** — feed Nextcloud docs into local knowledge collections; possible complement to AE Journals search
- **Multi-host local models** — per-user config already supports multiple hosts; routing logic TBD

View File

@@ -38,7 +38,7 @@ New tools for `cortex/tools/` — higher-value additions that fill obvious gaps.
- [x] **`file_list`** — directory listing with size, dirs first, 200 entry cap, admin-only — 2026-04-29
- [x] **`file_write`** — overwrite/append to home_root paths, admin-only, confirm-required — 2026-04-29
- [x] **`nc_talk_send`** — outbound NC Talk message via notification.py, admin-only — 2026-04-29
- [ ] **`email_send`** — send email via existing `email_utils.py` SMTP helper
- [x] **`email_send`** — SMTP via email_utils, per-user regex allowlist in `home/{user}/email_allowlist.json`, managed via Settings UI textarea + Files panel raw editor — 2026-04-29
- [ ] **`web_push`** — send a browser push notification (requires push subscription stored
per-user; pairs well with the PWA service worker already in place)
@@ -63,14 +63,6 @@ Upload an image or document inline and have it flow into context. Natural workfl
- Local (Open WebUI): `content` array with image_url items
- [ ] UI: show thumbnail/filename above the sent message
### [Models] Edit existing model entries
Currently models can only be removed and re-added. Add an edit flow so fields
(display name, model ID, context size, tags, notes) can be updated in-place.
- [ ] Add "Edit" button next to each model row in `local_llm.html` (alongside Remove)
- [ ] Populate the Add Model form with the model's current values when edit is clicked
- [ ] On save, `PATCH` or delete+recreate via `user_settings.py`
- [ ] Applies to both local and (future) cloud model entries
### [Auth] Encrypted sessions
Allow users to opt-in to per-session encryption so session logs on disk cannot be
read without the user's key.
@@ -101,11 +93,6 @@ See `ARCH__Intelligence_Layer.md` for full design.
- [ ] Target: markdown files from `~/DgrZone_Nextcloud/` and `~/OSIT_Nextcloud/`
- [ ] Tag strategy: source path, date, topic tags from frontmatter or filename
### [Distill] Review first auto_distill_long output — 2026-04-01
- Ran April 1 at 04:00 as scheduled
- Manually review `inara/MEMORY_LONG.md` — confirm quality before fully trusting
- Adjust distill prompts in `cortex/memory_distiller.py` if needed
---
## 🟢 Lower Priority / Future
@@ -126,13 +113,6 @@ Read before finalising either design.
- Nested agent delegation with dependency-aware batching
- Plugin/manifest-based tool registration — worth considering before tool suite grows
### [Sessions] Cross-session search
The file browser has per-file session search, but no way to query across all sessions
for a persona. A unified search would make the session archive useful as a knowledge source.
- [ ] `POST /sessions/search?q=...` — walks `home/{user}/persona/{name}/sessions/*.md`, returns matching excerpts with date + line context
- [ ] UI: search input in file browser sidebar already present — wire to new endpoint
- [ ] Consider: index on startup vs. live grep (live grep is fine at typical session volume)
### [Backend] API usage / cost tracking
Multi-user setup with real Gemini/Claude API costs. Track per-user token consumption
so Scott can see who's spending what.
@@ -202,6 +182,27 @@ other based on resources and specialisation. No central coordinator required.
## ✅ Completed
### [Tools] email_send tool + per-user email allowlist — 2026-04-29
- `email_send(to, subject, body)` in `cortex/tools/notify.py` — SMTP via `email_utils.py`
- Per-user regex allowlist at `home/{user}/email_allowlist.json` (JSON array of patterns)
- `re.fullmatch(..., re.IGNORECASE)` — supports wildcards like `.*@oneskyit\\.com`
- Blocked by default (no allowlist = no sends); non-matching addresses silently blocked
- Registered as admin-only tool in `TOOL_ROLES`
- **Settings UI**: `POST /settings/email-allowlist` — textarea in Account Settings, one pattern per line
- **Files panel**: `email_allowlist.json` added to `USER_FILES` in `files.py`; served from `home/{user}/`; appears in new "Settings" group in sidebar
### [Models] Edit existing model entries — 2026-04-29
- Inline edit form per model row in `local_llm.html` (`.model-row-header` + hidden `.model-edit-form`)
- "Edit" toggle shows pre-populated form; "Cancel" collapses it
- "Fetch models" button in edit form — same live-fetch flow as Add Model
- `POST /settings/local/models/{model_id}/edit` route in `local_llm.py` dispatches to `save_model` / `save_cloud_model` (upsert via `model_id`)
- Works for both `local_openai` and cloud model types
### [Sessions] Cross-session search — 2026-04-29
- `GET /sessions/search?q=&user=&persona=&limit=` in `files.py` — full-text grep across `sessions/*.md`, newest first
- Returns up to `limit` matches with 120-char excerpt and date; `total_files_searched` count
- UI: search input + results panel below Files sidebar; `Ctrl+F` / search icon shortcut; `marked.parse` highlights matches
### [Tools] Role-based access control + confirmation gate — 2026-04-29
- `TOOL_ROLES` dict maps tool names to minimum required role (`admin`/`user`)
- `CONFIRM_REQUIRED` set blocks destructive tools; orchestrator injects confirmation prompt instead