Commit Graph

408 Commits

Author SHA1 Message Date
ollie 2c36c023aa execute_code -> shell: simplify to single bash command, remove steps/parallel/detach/language 2026-07-28 23:03:31 +02:00
ollie 1b05433a5b strip execute_code to bash-only; remove language detection; run promoted tools directly 2026-07-28 22:59:44 +02:00
ollie 6bd77276ee remove call_tool and pipe implementations 2026-07-28 22:51:47 +02:00
ollie b26bd7f580 remove allowExecutors from config, execute server, and agent JSONs 2026-07-28 22:39:17 +02:00
ollie dce77f0b8d merge registry into execute: one server, one routing table, deterministic arg ordering 2026-07-28 22:08:44 +02:00
ollie f08e0abdf0 core: support dynamic tool registration 2026-07-28 14:13:08 +02:00
ollie 3fb5528c97 flushSave persists backend and model 2026-07-27 20:07:17 +02:00
ollie dfc387d7b8 sanitize invalid ToolCall.Arguments before save; atomic write 2026-07-27 20:01:31 +02:00
ollie 08c9b3dc76 fix unused desc variable in ReactTo 2026-07-27 19:55:11 +02:00
ollie 52849794e8 stop emitting reaction events to chat log; badges handle display 2026-07-27 19:54:39 +02:00
ollie 05524b8aa7 add Reactions() method to Core interface 2026-07-27 19:47:16 +02:00
ollie af9a22b1db response IDs and structured reactions with exact targeting 2026-07-27 19:12:12 +02:00
ollie c656846cce categorize emoji reactions as positive/negative/confused with tracked counters 2026-07-27 18:30:01 +02:00
Levi Neely 96a140a83c add React() for emoji reactions on assistant messages
New method on the Core interface that appends a lightweight user
message to session history without triggering a model turn. The
agent sees the reaction as context on its next turn.

Used by the 9P react file: echo emoji > s/{id}/react
2026-07-27 15:19:33 +02:00
Levi Neely 273a31c5f1 emit post-stream suffixes to chat output
When tool results are streamed, suffixes appended after execution
(truncation hints, user-interruptions, PostTool context) were only
written to the stored message history but never emitted to the chat
stream. This meant they never appeared in D-Bus signals or the chat
file.

Accumulate suffixes explicitly and emit them as a final event when
streaming was active, guaranteeing they appear at the end of the
tool output in all output paths.
2026-07-27 13:07:41 +02:00
Levi Neely 75f11a7dc9 enforce 128KB tool result ceiling unconditionally
The tool result truncation had two bypasses:

1. Error results were exempt (!isErr condition) — a command returning
   output in its error message could flood the context with megabytes
   of untruncated data.

2. The streaming callback emitted chunks to the event handler (and
   thus D-Bus signals) with no size check, flooding the bus even
   when the final stored result would be truncated.

Fix:
- Remove the configurable ToolResultMaxBytes field; use the constant
  defaultToolResultMaxBytes (128KB) unconditionally for all results
  regardless of success/error status.
- Cap the streaming callback at 128KB so chunks stop being emitted
  once the ceiling is reached.
- Cap output embedded in execute server error messages to 8KB as
  defense in depth.
2026-07-27 13:02:45 +02:00
Levi Neely 8973881c0a elevate: remove SSH agent proxy (unnecessary with integrated broker) 2026-07-27 11:06:21 +02:00
Levi Neely 116c7fa671 elevate: add ParsePolicy helper 2026-07-27 11:03:18 +02:00
Levi Neely fb8f4acff1 elevate: show key comment instead of fingerprint in notifications 2026-07-27 10:51:54 +02:00
Levi Neely d79861ff7c elevate: SSH agent proxy with approval gating
Proxies SSH agent requests to the real agent, intercepting
Sign/SignWithFlags for approval via the same broker flow
(notification + persist). Key fingerprints can be persisted
to auto-approve future sign requests.
2026-07-27 10:49:26 +02:00
Levi Neely c418148dc8 elevate: integrated elevation broker package
Core elevation broker that replaces the superpowerd adapter.
Handles command execution outside the sandbox with human-in-the-loop
approval via desktop notifications.

- Policy store: YAML-backed global policy + in-memory session policies
- Request lifecycle: 300s TTL, approve/deny/persist resolution
- Command execution: bash -c with caller env/cwd, streaming d/x frames
- SO_PEERCRED for caller identification
- NotifyFunc callback for UI integration (D-Bus, 9P, etc.)
2026-07-27 10:44:18 +02:00
ollie d903980256 persist usage/cost data across session restarts 2026-07-26 19:01:19 +02:00
ollie 95557b35ab persist active sessions under active directory 2026-07-26 12:10:11 +02:00
ollie 2202014397 backend: fail fast if OLLIE_OPENAI_KEY is missing for openai/openrouter 2026-07-21 15:07:47 +02:00
ollie 88ca0c1842 agent: inject baseLayers (system prompt, operational model, env) into /agent reload path
The operational model was only rendered for new sessions, not for
restored sessions or /agent reloads. Store baseLayers on the agent
struct and pass them through on rebuild.

Also fix pre-existing test failures caused by DiscoverTools reading
from the live OLLIE_TOOLS_PATH during tests.
2026-07-21 14:40:24 +02:00
ollie 8ff14935b7 fix: exclude discovered tools from backend tool definitions
DiscoverTools() results have no InputSchema and are invoked via
call_tool, not directly. Sending them to Bedrock as tool definitions
caused ValidationException (inputSchema.json.type must be object).

Now only built-in executors (execute_code, call_tool, pipe) with proper
schemas are registered as backend tools. Discovered scripts remain in
allToolInfos for the preamble surface listing only.
2026-07-21 13:47:30 +02:00
ollie 3c2bf3eb40 tools: two-tier discovery (surface listing + on-demand prompt)
BuildRuntime now appends a compact surface listing (name + one-liner)
to the preamble instead of full tool prompts. Full prompts are
available on-demand via ToolPrompt(name) for the /net/dns pattern.

- DiscoverTools: extracts short description from first content line
- BuildRuntime: appends "# Available Tools" with name + description
- ToolPrompt(name): returns full ollie:prompt for a specific tool
2026-07-21 13:36:16 +02:00
ollie 41eedb0c27 tools: discover prompts from ollie:prompt script headers
- Add Prompt field to tools.ToolInfo
- Add ExtractPrompt parser for ollie:prompt...ollie:end blocks
- Add DiscoverTools to scan tool scripts directory
- BuildRuntime appends discovered tool prompts to preamble

Tool scripts can now embed their usage documentation directly in
the script header. This replaces the separate tools-*.md prompt
files and ensures documentation stays co-located with implementation.
2026-07-21 13:18:38 +02:00
ollie f5298306b1 agent: layered preamble scaffolding
BuildRuntime now accepts optional baseLayers (variadic strings) that
are prepended to the agent-resolved preamble. This enables the server
to compose: system_prompt + operational_model + environment + agent_prompts.

- config.Config: add SystemPrompt field (path override)
- AgentCoreConfig: add OperationalModel and SystemPrompt fields
- BuildRuntime: prepend baseLayers before agent prompt content
- Remove debug fprintf statements from prompt resolution
2026-07-21 12:53:51 +02:00
ollie c2688a1d3d agent: cross-turn tool result cache
Move the read-safe tool result cache from a per-turn local variable
to the agent struct, persisting it across turns. This eliminates
redundant calls to file_read, lsp_*, and memory_recall when the
underlying data has not changed.

The cache is invalidated (cleared entirely) when file_write or
file_edit executes, ensuring stale results are never returned
after mutations.
2026-07-21 12:04:35 +02:00
ollie bd3b46bbed agent: debounce session persistence
saveSession() now sets a dirty flag and starts a 2-second timer
instead of immediately serializing and writing the full message
history. For a 50-step turn, this reduces 50 JSON marshals + disk
writes down to ~25 (one every 2s) plus a guaranteed flush at
turn end and on close.

flushSave() is called:
- At end of turn (after setState idle)
- On interrupt
- On Close()
- When the 2s timer fires (if still dirty)
2026-07-21 12:00:30 +02:00
ollie 69b90de68f remove ensureElevateAdapter
The elevation adapter is now managed by the system service manager
(openrc/systemd), not started on-demand from inside the sandbox.
The on-demand approach was unreliable (needed master token access,
exec chain failures on Gentoo, stale instances on socket).
2026-07-21 11:48:53 +02:00
ollie edc96cc841 executeElevated: improve error message when exit non-zero with no output
When the elevated process exits with a non-zero code but produces no
stdout/stderr output, report a cleaner error message instead of the
confusing "Output: " with empty string.
2026-07-21 07:28:21 +02:00
Levi Neely 05e43b9a7c agent: resolve prompt from file paths and OLLIE_PROMPTS_PATH 2026-07-20 13:37:09 +02:00
ollie 663311daa0 remote: persist Remote field in session save/restore 2026-07-19 21:53:01 +02:00
ollie 9c1dd58474 streaming: tool output streams into [tool:] block, no new roles 2026-07-19 21:36:55 +02:00
ollie 805933453f streaming: tool output streams into tool block directly 2026-07-19 21:25:42 +02:00
ollie 5fc7bd816e streaming: emit partial tool output via context callback 2026-07-19 21:06:13 +02:00
ollie d501b47bf7 prompt: store PromptEnvExtra on agent for /agent reloads
Added PromptEnvExtra to AgentCoreConfig and agent struct. The /agent
command now uses stored PRIME_* vars instead of recomputing locally.
This ensures remote sessions get the correct remote host info on
every prompt rebuild.
2026-07-19 20:37:37 +02:00
ollie 95d9e9fd85 prompt: unified PromptEnv for local and remote sessions
Added PromptEnv(cwd) helper that returns PRIME_CWD, PRIME_PLATFORM,
PRIME_IS_GIT_REPO. All callers of BuildRuntime now pass these.
prime script is now a pure template renderer with no detection logic.
Removed ad-hoc PRIME_CWD injection from prompt_resolver.
2026-07-19 20:26:52 +02:00
ollie a53d5b9618 remote: fetch host_info, inject PWD for remote prompt resolution
prompt_resolver: when cmd.Dir cannot be set (remote CWD does not exist
locally), inject PWD=cwd into subprocess env so envsubst in prime sees
the correct working directory.

remote.Server: fetch host_info RPC after connect, expose HostInfo struct
with platform, arch, is_git_repo for the session to pass to prompts.
2026-07-19 20:17:32 +02:00
ollie 414220c2e5 fix: pass PWD and OLLIE_UNAME to BuildRuntime in /agent command
The /agent command rebuilds the runtime but only passed OLLIE_SESSION_ID.
For remote sessions where cmd.Dir falls through, the prompt scripts need
PWD explicitly set to the session CWD for envsubst in prime.
2026-07-19 20:05:22 +02:00
ollie f19236d6df remote: SSH bootstrap with auto-deploy
Dial() now bootstraps ollie-remote on the remote host automatically:
- Computes SHA-256 of the local ollie-remote binary
- Sends a bootstrap script over SSH stdin
- If the remote has a matching cached binary, skips transfer
- Otherwise transfers gzip+base64 encoded binary
- Monitors stderr for OLLIE_LOADER_START/READY signals
- After bootstrap, stdin/stdout switch to JSON-RPC

The local binary is found at ~/bin/ollie-remote (just build output)
or ~/.local/bin/ollie-remote or PATH.
2026-07-19 19:54:57 +02:00
ollie 609e399219 remote: implement ListTools RPC and fix CallTool routing
remote.Server.ListTools() now calls the remote via a list_tools RPC
method instead of returning nil. This ensures the model receives
proper tool definitions through the API.

remote.Server.CallTool() now passes the actual tool name (execute_code,
call_tool, pipe) as the RPC method instead of hardcoding execute.
Simplified result handling since resp.Result is already json.RawMessage.
2026-07-19 19:49:31 +02:00
ollie 160e285e68 fix: prompt resolution for remote sessions + vet context leaks
prompt_resolver: guard cmd.Dir with stat check so remote CWDs that
do not exist locally do not cause prompt commands to fail with ENOENT.

server.go: add cancel on all early-return paths to fix go vet
cancel-not-used-on-all-paths warnings.
2026-07-19 19:43:12 +02:00
ollie 64ab94f121 hooks: skip non-existent CWD for remote sessions
If the session CWD does not exist locally (remote execution), do not
set cmd.Dir. This prevents fork/exec failures when the CWD only
exists on the remote host.
2026-07-19 19:18:28 +02:00
ollie 01e97daefc remote: parse port from user@host:port SSH target 2026-07-19 19:11:32 +02:00
ollie b218706f76 remote: use full path to ollie-remote binary
SSH non-interactive shells do not source .bashrc/.profile, so
~/.cache/ollie/bin is not in PATH. Use the full path directly.
2026-07-19 19:02:28 +02:00
ollie adb90e4e7c execute: skip sandbox config loading when Yolo is set
Previously loadSandboxConfig was called unconditionally, causing
failures on hosts without ~/.config/ollie/sandbox/ even when yolo
mode was enabled. Move the load inside the !Yolo branch.
2026-07-19 18:44:25 +02:00
ollie e468e15672 remote: add SSH-based remote execution client
Package remote provides a tools.Server implementation that forwards
tool calls to an ollie-remote process over SSH via JSON-RPC.

Key components:
- Dial(): opens SSH, launches ollie-remote, verifies with ping
- Server: implements tools.Server, forwards CallTool over RPC
- Decl(): factory compatible with tools.NewDispatcherFunc
- Config: SSH target, CWD, tools path, yolo flag

Integration: swap execute.Decl() with remote.Decl() in session
creation when remote= config is set.
2026-07-19 18:19:38 +02:00