Commit Graph

2645 Commits

Author SHA1 Message Date
Levi Neely f2f33e7826 Add chat file back for TUI text streaming 2026-10-09 19:09:20 +02:00
Levi Neely bc5f45854e scripts/o: tui reads filtered log instead of log.raw 2026-10-09 18:57:44 +02:00
Levi Neely c44c44dae3 doc: add Phase 40 (JSONL chat log format) to evolution.md 2026-10-09 18:53:59 +02:00
Levi Neely 57c40d541e Migrate chat log to JSONL format
Server changes:
- format/block.go: Block struct with JSONL marshaling, RenderBlock for text
- Deleted format/event.go, format.go, format_test.go (old delimiter format)
- agent/chat.go: Dual logs (rawLog JSONL + textLog rendered text)
- agent/chatlog.go: Streaming via flushPartial/closeBlock, skip internal events
- fs/spec.go: New files log.raw (JSONL), log (text), block (ID lookup)
- Removed chat/chat.raw/chat.search from namespace

GUI changes:
- chatblockmodel: JSONL parsing via QJsonDocument, removed regex state machine
- ollie9pclient: Read from log.raw for replay, removed old streaming code
- Added Context type to block enum, filter context/state/usage from display

Docs updated: AGENTS.md, system_prompt.md, architecture-*.md, scripts/o
2026-10-09 18:52:40 +02:00
Levi Neely e53d612bdb GUI: handle ollie:// plumb URLs to display chat blocks
Plumb ollie://session/agent#blockid URLs fetch the block via chat.search
and append to the chat pane. Non-persistent display for quick reference.
2026-10-09 17:08:21 +02:00
Levi Neely c186c87525 Use sha256-based deterministic block IDs
- NextBlockID now uses sha256(sessionID:agentID:counter)[:8] for deterministic,
  collision-resistant block IDs across sessions and agents
- Remove blockCounter reset on Clear() to maintain ID stability
2026-10-09 17:01:22 +02:00
Levi Neely 5f67d44e27 Add block ID tests and document chat log files
- Add unit tests for NextBlockID and ChatSearchByID in chat_test.go
- Add unit tests for ParseBlockHeader, BlockDelim, FormatEvent in format_test.go
- Add e2e test script using o CLI to verify block ID search
- Document chat log files in AGENTS.md: chat/chat.raw are blocking streams,
  use log for non-blocking reads, chat.search for block lookup
2026-10-09 17:00:37 +02:00
Levi Neely 582f7d1b91 event: emit clear event when agent is cleared
- Add onClear callback to Agent, wired via support.go
- Publish session.{sid}.agent.{aid}.clear event
- GUI listens for agentCleared signal and refreshes chat view
- Works for both GUI clear button and CLI /clear command
2026-10-09 16:31:30 +02:00
Levi Neely 1c863ce9ec gui: add Clear button next to Compact
- Clear button sends /clear command
- /clear now resets history, chat log, and block counter
- Completely fresh start without creating a new session
- Button disabled while agent is running
2026-10-09 16:28:28 +02:00
Levi Neely c8f42b2400 9p: add chat.search file for block lookup by ID
Write a block ID to chat.search, read the block content back.
Returns error if block not found.
2026-10-09 16:15:30 +02:00
Levi Neely 46aa901763 server-side block IDs for stable bookmark/plumb targets
- Add blockCounter to Agent, generating sequential hex IDs
- Include #blockId in all block headers: [[[role:name#id]]]
- GUI parses server-provided IDs from headers
- Falls back to client-generated IDs for legacy blocks without server IDs
- Block IDs are now deterministic based on chat history order
2026-10-09 16:12:26 +02:00
Levi Neely 233a5cc2e9 gui: reload full chat history when scrolling to trimmed block
When scrollToBlockId fails to find a block (trimmed from view),
reload the full chat without trimming and scroll to it.
2026-10-09 14:57:53 +02:00
Levi Neely 922b53de4a gui: reset blockIdCounter on chat reset for deterministic IDs 2026-10-09 14:56:26 +02:00
Levi Neely 2f45509af3 gui: use stable blockId instead of index for bookmarks/plumb
- Add blockId field to ChatBlock (12-char MD5 hash of counter+name)
- Bookmarks now use blockId instead of volatile list index
- Plumb URLs use blockId: ollie://session/agent#abc123def456
- Add indexForBlockId() to look up current index from stable ID
- Action buttons always visible (no hover flicker)
2026-10-09 14:53:36 +02:00
Levi Neely 483a4f0d4d gui: use font-relative sizing for bookmark buttons
- All ToolButtons now use theme.fontSize-based sizing
- Height, width, margins, and spacing scale with font
- Removed all hardcoded pixel values from bookmark UI
2026-10-09 14:10:14 +02:00
Levi Neely e5759e43d2 doc: add Plan 9 plumber integration documentation 2026-10-09 14:07:40 +02:00
Levi Neely 5ac2e67769 plumber: fix regex to allow colons in agent names, add file logging for debugging 2026-10-09 14:06:38 +02:00
Levi Neely df0b38aedf plumber: add debug logging for ollie port reader 2026-10-09 13:59:02 +02:00
Levi Neely 73e5af6ce8 plumbing: allow colons in session/agent names 2026-10-09 13:56:59 +02:00
Levi Neely ecbea0fe90 gui: integrate bookmarks with plan9 plumber
- Add ollie:// URL scheme for plumb messages
  Format: ollie://session/agent#block
- Plumber listens on 'ollie' port for navigation messages
- Bookmarks show 📋 button to copy ollie:// link
- Add data/plumbing with rules to route ollie:// URLs
- On plumb message: switch session/agent, scroll to block, raise window
2026-10-09 13:27:40 +02:00
Levi Neely 96b6406871 gui: add bookmark feature for chat blocks
- Add bookmark button (📌) on chat block hover
- Bookmarks section in left panel (SessionTree) with grouped view
- Non-persistent GUI-only state using ListModel
- Click bookmark to scroll to that block in chat
- Bookmark format: sessionName/agentName with block content preview
- Add activeSessionName/activeAgentName C++ getters for display
2026-10-09 13:21:33 +02:00
Levi Neely c8897b8251 doc: update usage.md and architecture-kde.md
- Document colon separator for session:agent
- Document agent-level bypass/approve/deny filtering
- Document !a !d !b shortcuts in prompt REPL
- Update tmux session naming to include agent
- Add Procs and Peers buttons to KDE GUI features
2026-10-09 13:09:13 +02:00
Levi Neely 8793202ef5 o: fix bypass agent filter to use agent ID instead of name
OLLIE_UNAME in bypass requests is the agent ID, not name.
Look up agent ID from idx before filtering.
2026-10-09 13:05:38 +02:00
Levi Neely 9fb150b6fe o: add !a !d !b shortcuts in prompt for bypass management
!a or !approve - approve first pending bypass for this agent
!d or !deny    - deny first pending bypass for this agent
!b or !bypass  - list pending bypass requests for this agent
2026-10-09 13:02:39 +02:00
Levi Neely 859bb4910f o: filter bypass/approve/deny by agent when agent context is set
o session/agent bypass   - shows only that agent's requests
o session/agent approve  - approves first request from that agent
o session/agent deny     - denies first request from that agent
o session bypass         - shows all requests (unchanged)
2026-10-09 13:01:36 +02:00
Levi Neely 2c8b301a59 o: handle expired bypass requests gracefully in approve/deny 2026-10-09 12:58:26 +02:00
Levi Neely 1663d2d212 o: fix approve/deny to handle array of pending requests 2026-10-09 12:56:34 +02:00
Levi Neely 995db45444 o: fix bypass command to handle array of pending requests 2026-10-09 12:54:39 +02:00
Levi Neely 780e558743 cmake: add PeerManagerWindow.qml to qt_add_resources 2026-10-09 12:52:38 +02:00
Levi Neely b5138fd55e o: fix tui event subscription - use IDs not names
Event topics use session/agent IDs, not names. Look up IDs from
the idx files before subscribing to state events.
2026-10-09 12:47:29 +02:00
Levi Neely f490d4eef2 o: add delays before tmux send-keys
Shell needs time to initialize before receiving commands.
2026-10-09 12:38:12 +02:00
Levi Neely 8c7a3bf83b o: simplify tui commands - remove grep filters
The shell escaping for grep patterns was complex and fragile.
Removed the cosmetic filters for [[[...]]] and backticks.
2026-10-09 12:35:33 +02:00
Levi Neely 9f69654d0c o: use slash separator in tui spawned commands
Slash is primary separator. Agent names may contain colons but
session names don't contain slashes, so slash is unambiguous.
2026-10-09 12:30:08 +02:00
Levi Neely 1d688d9944 o: sanitize agent name for tmux session too
Agent names like src:ollie need colon replaced with dash.
2026-10-09 12:29:14 +02:00
Levi Neely 9b063a24ce o: fix context parsing - slash is primary separator
Agent names may contain colons (e.g., src:ollie), so slash must
be the primary separator. Colon separator is only for the rare
case where session names contain slashes.

default/src:ollie now correctly parses as:
  session = default
  agent = src:ollie
2026-10-09 12:28:02 +02:00
Levi Neely aa939b0f84 o: fix tmux session targeting in tui command
Remove = prefix from tmux -t arguments - it doesn't work with
pane specifiers (:0.1). Also changed -g to -t for mouse option.
2026-10-09 12:24:35 +02:00
Levi Neely c30c75cea9 o: fix tui with session names containing slashes
- Sanitize tmux session name (replace / and : with -)
- Include agent name in tmux session for uniqueness
- Quote context arg in spawned o commands
- Use colon separator for robustness
2026-10-09 12:23:08 +02:00
Levi Neely e1d01716f3 o: support colon separator and quoted names in context arg
- session:agent works as alternative to session/agent
- Colon takes precedence (allows slashes in session names)
- Quoted arguments with spaces now work: o "my session:agent" prompt
- Removed set -- $* which broke quoted arguments
- Updated help with examples
2026-10-09 12:21:20 +02:00
Levi Neely 56f6d3c655 gui: add Peers button and peer management window
Canvas-based graph visualization of agents in current session:
- Nodes represent agents, colored by state
- Edges represent peer connections
- Drag nodes to reposition
- Click two nodes to toggle connection
- Double-click to start connecting
- Right-click for context menu
- Pan with middle mouse, zoom with scroll wheel
- Auto-layout arranges nodes in circle

9P API methods: listPeers, addPeer, removePeer, listAgentsInSession
2026-10-09 12:19:42 +02:00
Levi Neely 05dd33c1cf kate: remove git++ plugin integration
Use only Kate's built-in project git features. The reviewDiff action
now uses the active document text directly.
2026-10-09 12:13:01 +02:00
Levi Neely 83cae21957 kate: simplify diff review to git-based actions
Remove complex DiffWidget detection and context menu injection.
Add 'Review Staged Changes' and 'Review Unstaged Changes' to editor
context menu when in a git repo. Uses git diff directly.

-119 lines of code removed.
2026-10-09 12:11:44 +02:00
Levi Neely f822bf6c32 prompts: enforce terse output more aggressively
- Changed 'brief' to 'TERSE' with explicit one-sentence-per-action rule
- Added 'instant failure' framing for banned patterns
- Banned multi-sentence summaries explicitly
- Removed hedging allowances
- Simplified task completion to 'ONE sentence. Stop.'

Also: kate plugin diff widget detection with debug logging
2026-10-09 11:53:58 +02:00
Levi Neely e37d3b5c5b kate: simplify diff extraction from Kate's DiffWidget
Based on Kate source analysis (apps/lib/diff/diffwidget.*):
- DiffWidget uses DiffEditor children (QPlainTextEdit subclass)
- In Raw/Unified mode, editors contain the actual diff text
- Use looksLikeDiff() to identify which editor has valid diff

Simplified from multi-strategy approach to single focused method.
Removed unused QTextEdit and functional includes.
2026-10-09 11:25:19 +02:00
Levi Neely fd6829479c gui: set minimum window size for KDE tiling
Add minimumWidth: 320 and minimumHeight: 240 to allow the window to
resize properly when tiled by KDE's window manager. Without explicit
minimums, Qt calculates implicit minimums from content that may be
too large for narrow tile slots.
2026-10-09 11:04:29 +02:00
Levi Neely 0b09461dea kate: expose context actions as Q_INVOKABLE for cross-plugin triggering
Make the six context-menu action methods (askAboutFile, explainSelection,
submitSelectionPrompt, sendVerbatim, reviewDiff, startSession) public
Q_INVOKABLE so sibling plugins can trigger them by name via
QMetaObject::invokeMethod. The Deft radial menu uses this to offer an 'Ollie'
submenu when this plugin is enabled. No behaviour change for existing callers.
2026-10-09 10:54:51 +02:00
Levi Neely a4c659f591 kate: add Ollie context menu to project tree view
Right-click on files/directories in Kate's project panel now shows
Ollie actions:

For directories:
- Ask about directory (explain purpose/structure)
- Start Session Here

For files:
- Ask about file (explain purpose/design)
- Review file (code review)
- Write tests

Constructs file paths by walking up the tree model and joining with
the project base directory.
2026-10-09 10:51:35 +02:00
Levi Neely 2381ba4fbd prompts: add brevity constraints to all agent prompts
Added Output sections with explicit bans on narration, hedging, and
verbose summaries to all agent-*.md files:
- author, conductor, copilot, foreman, observer, panelist, reviewer, theo
- Strengthened existing Output sections in explorer, librarian, navigator, taskmanager

All agents now have consistent brevity guidelines.
2026-10-09 10:45:21 +02:00
Levi Neely dda056e3b1 prompts: explicit bans on verbose patterns
Added concrete examples of banned output patterns:
- Preambles (Great question!, I'd be happy to help!)
- Narration (Let me..., I'll now...)
- Hedging (It seems like, It appears that)
- Over-explaining and self-congratulation
- Summaries that restate what was just done

Added positive guidance: start with the answer, state task
completion in one sentence, end when information is delivered.

Models respond better to explicit prohibitions with examples than
to general instructions to 'be brief'.
2026-10-09 10:41:14 +02:00
Levi Neely 50ebcedb8a gui: support multiple concurrent bypass requests per agent
Frontend changes to match the backend's multi-request support:

- bypassResolved signal now includes the request ID
- ChatPane tracks pendingBypasses as a map (id -> request)
- onBypassRequested adds to the map; onBypassResolved removes by ID
- currentBypass shows the first pending request for the active agent
- Switching agents updates the banner to show that agent's pending request
- Approve/Deny now remove only the specific resolved request

This allows each agent to have multiple pending bypass requests without
blocking other agents, and the banner correctly shows requests only for
the currently active agent.
2026-10-09 10:21:09 +02:00
Levi Neely 5c0f463e4d session: add unit tests for concurrent bypass requests
Tests cover:
- Multiple concurrent pending requests from different agents
- BypassPendingByID lookup
- ResolveBypass removes only the resolved request
- ResolveBypass fails for non-existent ID
- Empty session has no pending requests
2026-10-09 10:17:37 +02:00