Commit Graph

1988 Commits

Author SHA1 Message Date
Ollie Agent 5b11e8afcb agent: embed GenerationParams in AgentConfig, remove GenParams()
Add JSON tags to backend.GenerationParams and embed it directly in
AgentConfig. The 14 duplicated sampling fields and the field-by-field
copy method disappear. Callers use cfg.GenerationParams directly.
2026-08-09 01:05:32 +02:00
Ollie Agent 5c81eefe0a remove dead code: TaskState subsystem, Verbosity, dead session fields
Remove entire TaskState machinery:
- TaskState struct, render(), taskState()/updateTaskState() on History
- inferTaskStateUpdate() — heuristic plan tracking
- Replan gate (replanGate const, roundsWithoutPlan counter)
- Stall detection (stallThreshold, stallRounds, lastAction)
- Plan reinject (planReinjectInterval, periodic re-injection)
- ReadPlanStep plumbing (AgentCfg → Agent → TurnCtx → loop)

None of this worked in practice — the model ignores the nudges,
ReadPlanStep was never wired to a non-nil value, and TaskState
fields were only populated by inferTaskStateUpdate (which depends
on ReadPlanStep being set).

Compaction now uses plain summary text in the cold zone instead
of serialized TaskState JSON.

Also remove:
- Verbosity field (declared, threaded, never read by any backend)
- DisallowTools (config field never wired to session)
- Session.listHandlers, plan, prevPrompt (never read)
- Config.Output, Config.ListHandlers, Config.ReadPlanStep (never set)

-246 net lines
2026-08-09 01:03:19 +02:00
Ollie Agent 625654fcef agent: simplify prompt resolver to file-path-only
All agent configs use the same pattern: JSON array of file paths with
env var expansion. Remove unused features:

- Shell command execution via resolveStringPrompt (the `!cmd` prefix
  path is kept as a trivial fallback but the 30s timeout/stderr
  capture/cwd probing is gone)
- Prompt directory search (PromptsDirs, resolvePromptFile)
- Shell metacharacter detection guard
- Literal-text-if-contains-newline heuristic
- IsExec flag on Prompt type (both string and array now mean the same
  thing: list of file paths)

207 + 49 → 104 + 38 lines (-114)
2026-08-09 00:51:13 +02:00
Ollie Agent 12894027dd session: export immutable fields, extract buildAgent helper
- Export ID, Uname, Ctx, Cancel, Proc, Keeper, Remote as struct fields
  (set-once at creation, not raced during agent loop)
- Keep mutex-protected accessors only for Name, ToolsConn, IsPaused
  which are read/written concurrently
- Extract buildAgent() shared helper used by both CreateAgent and
  restoreMultiAgentSession — eliminates ~100 lines of duplicated
  orchestration (tool server setup, prompt layers, runtime, backend)
- Paused sessions skip tool server entirely during restore (minimal
  agent with just history)
- Update fs/session_node.go delegators for exported fields
- 1638 → 1523 lines (-115)
2026-08-09 00:45:39 +02:00
Ollie Agent 010ad83944 simplify preamble: section-based model, no string surgery
Replace the monolithic preamble string with Preamble struct — an
ordered list of named sections joined on demand. Updates are simple
Set() calls; no marker-based string splicing.

Changes:
- Delete prompts/tool_discovery.md (content already in system_prompt.md)
- Reduce prompts/ package to just the embed + ResolveSystemPrompt
- Replace buildPreamble() with direct section construction
- Replace refreshToolListing() 90-line string surgery with one Set()
- Replace SetCWD string.ReplaceAll with env section rebuild
- Remove RenamePreamble (was a no-op; session ID is a template var)
- Export EnvironmentBlock() for session setup
- All callers use PreambleString() instead of raw string field
2026-08-09 00:32:49 +02:00
Ollie Agent 96d6d0b4cd update kde submodule: scroll-follow restored 2026-08-09 00:16:52 +02:00
Ollie Agent 97ee63cd9c update kde submodule: always-on chat stream 2026-08-09 00:14:38 +02:00
Ollie Agent bceb3708e9 update kde submodule: incremental rendering 2026-08-09 00:12:30 +02:00
Ollie Agent 8093566e67 justfile: standardize all installs to ~/.local/bin
Previously, Go binaries and scripts installed to ~/bin while cmake
(KDE) installed to ~/.local/bin. This caused stale binaries in ~/bin
to shadow fresh builds since ~/bin comes first on PATH.

- Change bin variable from ~/bin to ~/.local/bin
- Add migrate-bin target to clean stale ~/bin copies
- Run migrate-bin automatically during install
2026-08-09 00:03:49 +02:00
Ollie Agent 50a0737635 kde: fix gui deadlock (demand-driven chat streaming) 2026-08-08 23:20:11 +02:00
Ollie Agent dec80c85d2 kde: revert gui bulk load (didn't fix the freeze) 2026-08-08 23:16:11 +02:00
Ollie Agent fe5e99618e kde: update submodule (fix gui freeze on agent switch) 2026-08-08 23:15:04 +02:00
Ollie Agent 2c5444e902 o: /agent with no args shows current agent profile 2026-08-08 23:07:54 +02:00
Ollie Agent b5404fff87 o: /cwd with no args shows current working directory 2026-08-08 23:07:26 +02:00
Ollie Agent cf1866d646 o: /model and /backend with no args show current value 2026-08-08 23:04:33 +02:00
Ollie Agent 79afb09f3d o: fix /i command — was sending double-slash to prompt
$line still had the leading / from input, so echo "/$line" sent
//i ... to the agent. Use $cmd (which has the / stripped) instead.
2026-08-08 23:00:59 +02:00
Ollie Agent d596c31606 backend: move default backend selection to backends.conf
backends.conf now supports a top-level 'backend = name' line that
selects the default backend for new sessions. Lookup order:

  1. backends.conf 'backend = ...'
  2. OLLIE_BACKEND env var (fallback)
  3. session-level backend= parameter (override)

No env file needed for backend/model config anymore.
2026-08-08 22:57:37 +02:00
Ollie Agent c9df895445 data: add model field to copilot/kiro in sample backends.conf 2026-08-08 22:55:00 +02:00
Ollie Agent c1c0013f2d all: kill loadEnvFile dupe, extract text parser, tidy tests
backend:
- Delete loadEnvFile (env.EnsureDefaults at startup covers it)
- Move newFromEnv to test file (only tests use it)
- Delete dead tests (TestLoadEnvFile*, env-file override tests)
- new.go: 150→60 lines

agent:
- Extract text tool-call parser to text_parse.go (288 lines)
  parseTextToolCalls, shorthandToJSON, extractBalanced,
  parseExtraKV, extractJSONObject, relaxJSON
- loop.go: 1113→835 lines
2026-08-08 17:06:51 +02:00
Ollie Agent 68b844bbfa fs: fix cfg display — dereference pointer fields, omit when nil
temperature, topP, topK are *float64/*int pointers. Previously
printed as hex addresses or <nil>. Now shows actual values when
set, omitted when nil.
2026-08-08 16:58:48 +02:00
Ollie Agent 2c26a7fb9c backend: add backends.conf for per-backend configuration
Each backend is now configured via ~/.config/ollie/backends.conf:

    [openrouter]
    key = sk-or-v1-...
    model = qwen/qwen3-235b-a22b

    [anthropic]
    key = sk-ant-...

Each backend knows its own default URL (openrouter → openrouter.ai/api,
anthropic → api.anthropic.com, etc). Only key and optional model needed.

Env vars (OLLIE_OPENAI_KEY, OLLIE_ANTHROPIC_KEY, etc) still work as
fallback for backward compatibility, but backends.conf is the canonical
config path going forward.

- Delete openAIName() (URL no longer determines backend identity)
- Delete geminiKey() (config handles fallback)
- Install template with mode 600 (contains API keys)
- Only install template if user hasn't created their own
2026-08-08 16:25:47 +02:00
Ollie Agent f4caf29a35 fs: fix nil panic in sessionBindings — RootState captured at build time
The previous commit (3b83b9d) replaced globalRootState with
ctx.Root.Data.(*RootState), but ctx.Root is nil inside closures
captured by BuildTree (Root is set *after* the tree is built).

Fix: add RootState field to HandlerCtx and create it before BuildTree
so all closures capture the live pointer directly.
2026-08-08 16:17:42 +02:00
Ollie Agent 5f960b56f8 justfile: remove deleted packages (detach, skills) from build/test targets 2026-08-08 16:15:21 +02:00
Ollie Agent 455434608a all: merge toolsrv files, fix context hierarchy, remove dead params
toolsrv:
- Merge rpc.go into conn.go (wire types already there)
- Merge tools.go + discover.go into registry.go
- Merge accessors.go into server.go
- 4 files eliminated

fs:
- HandlerCtx.Context now carries the session context (set via
  sessionBindings Applier). Previously it was the daemon context
  which never cancels — handlers checking ctx.Done() now properly
  detect session kill/pause.
- Session-scoped blocking handlers (streamAgentChat, blockAgentStateWait)
  merge session context with per-read timeout via mergeCtx(). A session
  kill now immediately unblocks readers without waiting for the 5s timeout.
- Remove redundant manual AfterFunc in blockAgentStateWait.

session:
- Remove unused _ string parameter from WaitEvent
2026-08-08 16:13:55 +02:00
Ollie Agent 5b64d62d2e agent: remove auditLog (was always derived from log)
The audit logger was never a separate destination — it was always
log.Sub("audit"), writing to the same sink with a prefix. The
fallback in NewAgent even warned 'deriving from Log' every time.

Replace ag.auditLog.Debug() calls with ag.log.Debug() directly.
Remove the field, AgentCfg.AuditLog, and all session plumbing.
2026-08-08 15:59:00 +02:00
Ollie Agent 705a7226a2 all: merge thin packages and small files
- Merge detach/ into toolsrv/detach.go (single consumer)
  Rename Process → DetachedProcess to avoid collision with spawn.go
- Merge agent/state.go into loop.go (types used only there)
- Merge agent/runtime.go into runtime.go (formerly build_runtime.go)
- Merge agent/compaction.go + models.go into history.go
- Merge agent/new.go into agent.go (constructor lives with struct)
- Rename ResultTier → MemoryTier (TierHot/Warm/Cold → MemoryHot/Warm/Cold)
- Rename build_runtime.go → runtime.go
2026-08-08 15:56:26 +02:00
Ollie Agent 8152dec075 all: delete dead code, tighten API surface
toolsrv:
- Delete WithOnClose, WithOnEnvSet, SetOnExit (dead Options)
- Delete ListDetached, ListDetachedInfo (only ListDetachedRaw used)
- Delete Execute (dead wrapper)
- Delete CWD, ToolRegistry, SessionID, InjectContent (dead accessors)
- Delete ExecuteInSandbox, ExecuteElevated (zero external callers)
- Delete Summaries, RefreshLoaded from Registry (dead)
- Delete DialSSH (alias for RemoteDial)
- Simplify Dial: takes socket string directly, kill Addr/LocalAddr/SSHAddr
- Rename Server receiver e → s
- Unexport context import (no longer needed in tools.go)

session:
- Delete SaveFuncs, AgentAt, AgentCount, NextUncheckedStep
- Delete SetDisallowTools, SaveAllSessions

env:
- Delete Set, Get, All, Format, managed (dead exports)
- Unexport LoadFile → loadFile

fs:
- Delete HandlerCtx.ToolReg, Skills, SaveFn (never read by handlers)
- Delete Config.MkdirAll, Config.SkillsRegistry (dead plumbing)
- Delete AgentLog: Plan, SetPlan, PrevPrompt, Mu, LogInfo, Remote methods
- Delete unused type aliases (NodeOption, FileTree, FileConfig, etc.)

backend:
- Delete ClosePool, PoolStats (dead), New() (dead)
- Delete kiroTokenExpiringSoon standalone func (dead)
- Unexport SharedTransport/SharedClient → sharedTransport/sharedClient

skills:
- Delete entire package (zero importers; feature works via tool scripts)

agent:
- Delete BroadcastChange (dead duplicate of notifyChange)
- Delete HasHistory, ToolCallCount, CompactionModel, SetCompactionModel
- Unexport SetReply, BuildPreamble, DefaultPromptsDir
2026-08-08 15:51:13 +02:00
Ollie Agent 06a996e967 all: replace toolsrv.Runner interface with *toolsrv.Conn
The agent always talks to a *Conn (never a *Server directly).
Replace the Runner interface with the concrete type throughout:

- Runtime.ToolServer is now *toolsrv.Conn
- BuildRuntime takes *toolsrv.Conn
- session.Config, SessionInfra, InfraConfig use *toolsrv.Conn
- All inline type assertions in agent.go deleted — methods called
  directly on *Conn (SetEnv, SetCWD, Close, Detach, ListDetachedRaw,
  SignalDetached, GetDetachedOutput, DismissDetached, SetAllowTools,
  SetOnToolsChanged, Ping, ToolRegistryRevision)
- Added Conn.ToolRegistryRevision() that returns 0 (remote connections
  don't support revision tracking; use push-based OnToolsChanged instead)
- Deleted the Runner interface and its test
- Renamed LoadToolOnRunner → LoadToolOnConn
2026-08-08 15:10:01 +02:00
Ollie Agent 3b83b9d373 all: delete dead interfaces, kill globalRootState
- agent: delete 'state' interface (one implementation: *History). run()
  now takes *History directly.
- agent: delete 'backendNamer' interface. resolveCompactionModel takes
  backend.Backend directly.
- fs: delete Shutdown/InterruptAll/Lookup wrappers that took *Tree they
  never used. Callers (olliesrv) now call session.* directly.
- fs: delete globalRootState. sessionBindings uses ctx.Root.Data.(*RootState)
  via the HandlerCtx that was always available.
2026-08-08 14:58:47 +02:00
Ollie Agent 63c4cd6173 all: kill dead code, remove classifier system, clean up names
Dead code removed:
- agent: firstSentence, Checkpoint, WaitForChange, InitCond, cfgDir,
  execServer, SaveTo, SaveFull, saveTo, saveToFull, sanitizeMessages,
  LoadPersistedAgent, RestoreHistory, Restore, PersistedAgent type
- toolsrv: entire tier.go (MemoryTier, MemoryTierArgs, OutputFormat,
  CanParallelize on Server), same methods on Conn
- cmd/ollie-remote: can_parallelize, memory_tier, memory_tier_args RPC
  handlers
- toolsrv/rpc_integration_test: all classifier tests
- fs/lifecycle: state(root) dead helper

Renames:
- session.Session receiver: 'a' → 's' throughout
- SaveSession(path) → Save() (dead parameter removed)
- execServer() eliminated — callers use ag.runtime.ToolServer directly

The agent-package save/restore chain was entirely dead: PersistSession
in session/persist.go reads agent accessors directly and never called
SaveTo/SaveFull.
2026-08-08 14:52:10 +02:00
Ollie Agent b6694d409a agent/toolsrv: replace classifier system with ToolMeta map
The entire classifier indirection (interfaces, type assertions, RPC
methods for classification, closure wrappers in BuildRuntime) is replaced
by a simple map[string]ToolInfo on Runtime.

The .meta file is read once into ToolInfo. The loop reads fields directly:
  rt.ToolMeta[name].ReadOnly       (was: rt.CanParallelize(name))
  rt.ToolMeta[name].Tier           (was: rt.MemoryTier(name, args))
  rt.ToolMeta[name].OutputFormat   (was: rt.OutputFormat(name))
  rt.ToolMeta[name].ResetsCounter  (was: rt.ResetsCounter(name))

Removed: ParallelClassifier, MemoryTierClassifier, OutputFormatClassifier
interfaces, toolClassifier type, and all closure-wrapping in BuildRuntime.

The RPC methods on Server/Conn stay (used by ollie-remote) but the agent
no longer routes through them.
2026-08-08 14:33:23 +02:00
Ollie Agent 38b35f1ba5 toolsrv/agent: rename ClassifyTool→CanParallelize, ClassifyTier→MemoryTier
Rename throughout: Go methods, interface types, Runtime fields, wire
protocol RPCs, tests, and ollie-remote.

- IsParallelRead / ParallelClassifier → CanParallelize
- ResultTier / ResultTierArgs / TierClassifier → MemoryTier / MemoryTierArgs / MemoryTierClassifier
- Wire: is_parallel_read → can_parallelize, result_tier → memory_tier, result_tier_args → memory_tier_args
2026-08-08 14:29:41 +02:00
Ollie Agent 6e7b6e5f96 agent: TurnCtx embeds context.Context
run() signature is now run(rt *Runtime, ctx TurnCtx, state state).
The ctx parameter carries both the cancellation context and per-turn
closures — no more separate ctx + tc parameters.

emit() and retryCountdown() also take TurnCtx directly.
2026-08-08 14:23:32 +02:00
Ollie Agent 32ff54f708 agent: simplify configuration/instantiation layers
- Kill agentConfig struct. run() takes (*Runtime, TurnCtx, state) directly.
  TurnCtx holds only 7 per-turn closures; stable config reads come from Runtime.

- Lazy tool refresh: toolsNeedRefresh() checks ToolRegistryRevision() on the
  tool server. Skips ListTools IPC when registry hasn't changed. Remote Conn
  falls back to always-refetch (same as before).

- AgentConfig.GenParams() method replaces the 16-line manual field copy in
  BuildRuntime.

- Remove CfgBackend/CfgModel from Runtime. Callers read cfg.Backend/cfg.Model
  directly since they already have the AgentConfig in scope.
2026-08-08 14:19:46 +02:00
Ollie Agent 8f7d21fc38 toolsrv: fire OnToolsChanged after LoadTool
The system prompt tool listing now refreshes immediately on tool_load
instead of only on file-watcher events. buildToolListing helper added
to format the listing in the same format BuildPreamble uses.

Also updates kde submodule: GUI auto-switches to newly created agent,
removes remote field from agent dialog.
2026-08-08 14:02:22 +02:00
Ollie Agent ba740701e2 simplify prompt loading, some renames 2026-08-08 13:29:01 +02:00
Ollie Agent 605212e1fd Simplify preamble construction system
- Extract hardcoded tool sections into prompts.ToolSections() function
- Replace template system with simple Go code for better maintainability
- Fix refreshToolListing to preserve tool documentation and discovery sections
- Add comprehensive unit tests for prompts and agent packages
- Remove unnecessary tool_sections.md template file

The refactoring simplifies the preamble construction while maintaining
all functionality. Tool listing updates dynamically via refreshToolListing,
while tool documentation requires agent reload (full BuildPreamble call).
2026-08-08 12:27:53 +02:00
Ollie Agent 57052180d3 update kde submodule 2026-08-07 18:58:46 +02:00
Levi Neely e4bf5b492b kde: update submodule 2026-08-07 18:53:40 +02:00
Levi Neely dc1211b6a7 kde: update submodule 2026-08-07 18:51:30 +02:00
Levi Neely 4f5890f8db prompts: add mandatory API documentation lookup rule
When working with any API, the agent MUST look up official docs if not
highly confident in specific methods/properties/behaviors. No guessing.
2026-08-07 18:18:45 +02:00
Levi Neely eca1a9e232 kde: update submodule 2026-08-07 18:12:31 +02:00
Levi Neely 5cb3d0e68e kde: update submodule (hybrid native/subprocess streaming) 2026-08-07 18:06:44 +02:00
Levi Neely fc17a4cca3 kde: update submodule (native 9P streaming) 2026-08-07 18:02:52 +02:00
Levi Neely 991bbef840 lib9p: add streaming API for native reads
Add ollie9p_open, ollie9p_read_fid, ollie9p_close_fid for streaming
file reads. This allows the KDE GUI to read chat/statewait/eventwait
files natively without spawning subprocesses.
2026-08-07 18:02:24 +02:00
Levi Neely 63faa3b68a kde: update submodule 2026-08-07 17:54:41 +02:00
Levi Neely 07ec63704e o prompt: drop readline for paste support
Switch from 'read -e' to plain 'read' so multi-line paste can be
captured. Readline was consuming pasted lines individually.
Increase drain timeout to 100ms.
2026-08-07 17:46:35 +02:00
Levi Neely 189ec65aae o prompt: buffer multi-line paste input
Drains additional lines within 50ms of the first line to capture
multi-line pastes in the TUI prompt.
2026-08-07 17:44:05 +02:00
Levi Neely 8397f1aa74 o: add log command, rename tail to chatstream
- Add 'o log [-n N]' to read last N lines from agent log (default 1000)
- Rename 'o tail' to 'o chatstream' for clarity
- Update TUI to show log history before streaming chat
2026-08-07 17:34:33 +02:00
Levi Neely 7100942984 fix: correct plan path in replan-required message
Use session/$OLLIE_SESSION_ID/agent/$OLLIE_UNAME/plan instead of
outdated s/$OLLIE_SESSION_ID/plan
2026-08-07 17:21:51 +02:00