- Remotes and Local Remotes merged into a single grid/table layout; upstream connected remotes listed first, local remotes after
- Expanding a remote row shows its functions as indented rows; any number of remotes can be expanded simultaneously
- Each function row shows name and description, and expands into a detail section (10em min height) with JSON arguments on the left and call output on the right
- Connected and local remotes are visually identical; local remotes additionally offer connect/disconnect and delete options plus a connected status
- Disconnected local remotes show an editable function interface (args editor + JS body); when connected, functions become callable instead (only one mode shown at a time)
- Local remote<->upstream connection matching persisted across view reloads via sessionStorage (browser-session scoped, matching connection lifetime), not across tab reloads
- Local remote store and remote-call listener moved to module scope so they survive view reloads; stale matching flags are dropped when the socket connection is gone
Major refactoring to support isolated run objects with streaming, events, and OpenAI-compatible endpoints.
## Backend Changes
- **Agent class**: Added `run()` method, `received_message()` wraps chat into AgentRun
- **AgentRun class**: New class for run state with event system, serialization, and user tracking
- **inference.py**: Complete refactor with `build_messages()`, `chat_completion()`, tool support for llama-cpp/ollama/replicate
- **tools.py**: New centralized tool management (ToolSpec, ToolParameter, format_tools_for_engine)
- **tools.py**: Removed legacy Toolset/Action/ToolDescription system
- **server.py**: Added OpenAI-compatible `/api/openai/v1/chat/completions` endpoint with streaming support
- **temporary.py**: Added `self.runs` dict to State class
- **expert.py**: Refactored to use new Agent.run() signature
- **scripted.py**: Updated to raise NotImplementedError
## Frontend Changes
- **backend.js**: Added `onRunEvents()` for run event subscriptions
- **Sidebar.vue**: Added runs navigation mode
- **router/index.js**: Renamed User route to RunsView
- **RunsView.vue**: New view for listing/monitoring agent runs
## Breaking Changes
- Agent `prompt()` signature changed: `(instruction, input=None, **kwargs)` instead of `(content)`
- Agent `received_message()` must use AgentRun pattern
- Tools.py removed, functionality moved to tool.py
- Deprecated tool prompt/action system removed