Files
Cortex-Inara/documentation/TODO__Agents.md
Scott Idem 1fefd42e19 docs: Gitea SSH port 2222 verified working
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>
2026-03-29 21:52:36 -04:00

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/tags to 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.com reaches 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.md output 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; add gitea.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 wintermute persona
  • Google OAuth registered (google-add brian memedrift@gmail.com)

[Tools] Reminders tools — 2026-03-29

  • reminders_add, reminders_list, reminders_clear added 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.py updated 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.json on every call
  • systemd service is a user unit (no sudo) — systemctl --user restart cortex is 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 .env to home/{username}/channels.json
  • New endpoints: POST /channels/google-chat/{username} and POST /webhook/nextcloud/{username}
  • No channel access by default — each user configures their own channels.json
  • Setup guides: docs/GOOGLE_CHAT_BOT.md and docs/NEXTCLOUD_TALK_BOT.md

[Auth] Google OAuth sign-in — 2026-03-27

  • GET /auth/google → Google consent → GET /auth/google/callback flow
  • Users pre-registered via manage_passwords.py google-add <user> <email>
  • Google sign-in button on /login; auth.json stores google_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.json as gemini_api_key
  • Orchestrator uses user key if set, falls back to server-level GEMINI_API_KEY
  • Manageable via /settings UI (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 in app.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 uses random + 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.md if present
  • Collapsible H2 sections via <details> elements

[Backend] Gemini CLI backend — 2026-03

  • gemini -p subprocess, 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.md per 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)