WAN port forward confirmed end-to-end. Clone URL: ssh://git@cortex.dgrzone.com:2222/<user>/<repo>.git Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
7.9 KiB
7.9 KiB
Cortex / Inara — Agent Task List
Read this file before starting any work on this project. Status: Active development — ongoing.
🔴 High Priority
[Backend] Ollama local model backend
- Add Ollama as a third LLM backend option (direct Ollama API, no CLI wrapper)
- Endpoint:
http://scott-gaming:<port>/api/(WireGuard) - Model selection: configurable per-request or per-session
- Auth status check: ping
/api/tagsto confirm reachability
[Testing] Gitea SSH port 2222 ✅ — 2026-03-29
- pfSense WAN → 192.168.32.7:2222 port forward confirmed working
ssh -p 2222 git@cortex.dgrzone.comreaches Gitea (returns "Invalid repository path" — expected, confirms connectivity)- Clone/push via SSH:
git clone ssh://git@cortex.dgrzone.com:2222/<user>/<repo>.git
🟡 Medium Priority
[Intelligence] Knowledge consolidation — Phase 1
See ARCH__Intelligence_Layer.md for full design.
- Tool:
ae_journal_search— search before creating to avoid duplicates - Tool:
ae_journal_entry_create— write a new entry with source metadata - Import script: walk a markdown directory, chunk by H2 section, create entries
- Target: markdown files from
~/DgrZone_Nextcloud/and~/OSIT_Nextcloud/ - Tag strategy: source path, date, topic tags from frontmatter or filename
[Distill] Monitor first auto_distill_long run
- Scheduled for ~April 1 at 04:00
- Manually review
inara/MEMORY_LONG.mdoutput before fully trusting - Adjust distill prompts if needed
[Distill] Distill quality review
- Short/mid/long distill prompts live in
cortex/memory_distiller.py - After first few automatic runs, review quality and tune
🟢 Lower Priority / Future
[Intelligence] Dev agent pipeline
See ARCH__Intelligence_Layer.md. Full design not yet started.
- Specialist agent: frontend (SvelteKit) code changes
- Specialist agent: backend (FastAPI) code changes
- Supervisor agent: diff review, syntax check, test runner
- Gitea webhook integration: trigger on push/PR, report back
- Human approval gate before commit
[Intelligence] Supervisor agent
- Runs
py_compile,svelte-check, unit tests after specialist agent work - Reports pass/fail back to orchestrator
- Only commits on explicit approval
[Channel] Gitea webhooks
- Receive push/PR/issue events → route to appropriate agent
cortex/routers/already has pattern; addgitea.py- Gitea Actions (CI) for "run tests on push" — simpler than custom runner
[Backend] Intelligent model routing
- Currently hardcoded: Claude default, Gemini fallback
- Future: route by task type (code → Claude, search → Gemini, private → Ollama)
- Future: route by context length (Gemini 2.0 has 1M token context)
✅ Completed
[Multi-user] Brian onboarding — 2026-03-29
- Invite sent to
memedrift@gmail.com - Brian completed onboarding, created
wintermutepersona - Google OAuth registered (
google-add brian memedrift@gmail.com)
[Tools] Reminders tools — 2026-03-29
reminders_add,reminders_list,reminders_clearadded to orchestrator tool suite- Tools live in
cortex/tools/reminders.py - All persona PROTOCOLS.md updated with Tools & Modes reference (direct chat vs Agent mode)
persona_template.pyupdated so new personas get the protocol automatically
[Auth] Token expiry — no restart needed — 2026-03-27
llm_client._fresh_claude_token()reads live from~/.claude/.credentials.jsonon every call- systemd service is a user unit (no sudo) —
systemctl --user restart cortexis sufficient - No manual token sync required after
claude auth login
[Multi-user] Per-user channel config — 2026-03-27
- Google Chat and NC Talk secrets/config moved from
.envtohome/{username}/channels.json - New endpoints:
POST /channels/google-chat/{username}andPOST /webhook/nextcloud/{username} - No channel access by default — each user configures their own
channels.json - Setup guides:
docs/GOOGLE_CHAT_BOT.mdanddocs/NEXTCLOUD_TALK_BOT.md
[Auth] Google OAuth sign-in — 2026-03-27
GET /auth/google→ Google consent →GET /auth/google/callbackflow- Users pre-registered via
manage_passwords.py google-add <user> <email> - Google sign-in button on
/login; auth.json storesgoogle_sub+google_email - Active users: scott (scott.idem@oneskyit.com), holly (holly.danner@gmail.com), brian (memedrift@gmail.com)
[Settings] Per-user Gemini API key — 2026-03-27
- Stored in
home/{username}/auth.jsonasgemini_api_key - Orchestrator uses user key if set, falls back to server-level
GEMINI_API_KEY - Manageable via
/settingsUI (add, remove, masked hint)
[UI] Session persistence across navigation — 2026-03-26
- localStorage keyed to
cx_sid_{user}_{persona}with 30-min inactivity TTL - Auto-restored silently on page load; cleared on "New session" or session delete
[UI] Persona picker page — 2026-03-26
GET /{username}shows a card grid of available personas instead of 404- Each card links directly to
/{username}/{persona}
[UI] Lucide icons — 2026-03-25
- Icons throughout: mode selector, send/stop buttons, edit/del/copy, save/cancel
- Loaded via UMD CDN;
icon_html()+render_icons()helpers inapp.js
[UI] Persona-specific favicon — 2026-03-25
- Emoji SVG favicon generated from persona config at load time
[Multi-user] Holly onboarding — 2026-03-20
- Holly's invite sent; onboarding completed via
/setup/{token} home/holly/persona/tina/created from template- Google OAuth registered (
holly.danner@gmail.com)
[Channel] Nextcloud Talk integration ✅ — 2026-03-20, updated 2026-03-27
- HMAC verification: incoming uses
random + raw_body; outgoing reply usesrandom + message_text - Per-user routing added 2026-03-27 (endpoint:
/webhook/nextcloud/{username}) - Docs:
docs/NEXTCLOUD_TALK_BOT.md
[Channel] Google Chat integration ✅ — 2026-03-20, updated 2026-03-27
- JWT verification via
authorizationEventObject.systemIdToken - Workspace Add-on format:
hostAppDataAction.chatDataAction.createMessageAction - Per-user routing added 2026-03-27 (endpoint:
/channels/google-chat/{username}) - Docs:
docs/GOOGLE_CHAT_BOT.md
[Intelligence] Orchestrator service — Phase 1 — 2026-03-18
- Gemini API (google-genai SDK) tool loop → Claude final response
POST /orchestrate(async job),GET /orchestrate/{job_id}(poll)- Tools: web search, AE API, file read, task list, scratch, reminders, cron
- Default model:
gemini-2.5-flash
[Auth] Session auth + persona onboarding — 2026-03-20
- bcrypt passwords in
home/{username}/auth.json - JWT session cookies (HS256, 30-day expiry)
- Invite tokens (72h, one-time-use) —
manage_passwords.py invite <user> [email] - Self-service onboarding:
/setup/{token}→/setup/persona - SMTP invite email via
noreply@oneskyit.com
[UI] Mobile-friendly header — 2026-03
- Backend toggle, font size, theme buttons moved into ⚙ settings panel
- Header reduced to core buttons
[UI] Help & Reference — 2026-03-27
- Shared base at
cortex/static/HELP.md(served to all users) - Persona-specific additions appended from
home/{username}/persona/{name}/HELP.mdif present - Collapsible H2 sections via
<details>elements
[Backend] Gemini CLI backend — 2026-03
gemini -psubprocess, streaming output; auth check at/auth/status
[Backend] Memory distiller — 2026-03
- APScheduler:
distill_short(daily 03:00),distill_mid(weekly Sun 03:30),distill_long(monthly 1st 04:00) - Writes to
MEMORY_SHORT.md,MEMORY_MID.md,MEMORY_LONG.mdper persona
[Backend] Session logging + file browser — 2026-03
- Sessions saved to
home/{user}/persona/{name}/sessions/ - Files panel in UI browses persona directory
[Backend] Dispatcher core — 2026-03-04
- FastAPI service with streaming SSE response
- Claude CLI and Gemini CLI subprocess backends
- Session context management (rolling window,
MAX_HISTORY_MESSAGES)