Skip to content

Changelog

nick3 edited this page May 28, 2026 · 1 revision

Changelog

Major milestones in the ClusterSpace codebase. For the full git history: git log in the main repo.


v1.0.x — Autonomous AI roadmap (9 phases)

Completed in series after the initial AI subsystem landed. Each phase shipped as a single commit; the autonomous goal runner is the headline outcome.

Phase 1A — Tool registry + plugin loader

  • Extracted the giant ~3000-line executeTool switch into category files under src/main/ai-tools/
  • Self-describing ToolDef<TArgs, TResult> shape with auto-listing for the LLM
  • toolRegistry singleton with hot-reload of user plugin tools from <userData>/.../config/tools/*.js
  • Reduces ai-manager.ts to ~750 lines
  • See Tool-Registry · Plugin-Authoring

Phase 1B — Chunked tool-result envelopes

  • PagedTextResult envelope for large text outputs: {content, hasMore, nextCursor?, totalBytes}
  • Applied to read_terminal_output, browser_get_content, browser_get_axtree
  • Model taught about pagination in the default system prompt

Phase 1C — Per-pane conversation isolation

  • AIMemoryStore.getOrCreateConversation(providerId, workspaceId?, paneId?) — paneId added to match key
  • Builder agent in pane A no longer pollutes Tester agent in pane B

Phase 2A — Goal-scoped action policy

  • New goal-policy.ts: risk ladder (read_only → write_local → network_get → network_write → spends_money)
  • Per-tool permissions table for all 50+ tools
  • evaluate() returns allow/deny/needsApproval verdicts
  • Sandbox-dir support for file-touching tools
  • See Goal-Policy-and-Risk-Levels

Phase 2B — Persistent goal log + resume

  • New goal-store.ts: GoalCheckpoint, GoalStep, GoalStatus
  • electron-store backed, 50-goal cap (in-flight always kept), 500-step cap per goal (head+tail preservation)
  • IPC handlers: goal:list / get / list-resumable / delete / prune

Phase 3A — GoalRunner engine

  • New goal-runner.ts: the headline autonomous loop
  • Wall-clock cap → external abort → pause → streamMessage → for each tool_call: dispatch + log step → pendingClaim/pendingAbort handling
  • Two transient tools: claim_complete, abort_with_report
  • Shell + manual success criterion verifiers (model_question + json_predicate marked TODO)
  • See Goal-Runner-Overview

Phase 3B — Critic + replan loop

  • Sibling model call every N non-transient steps
  • Verdicts: PROGRESSING / STUCK / ACHIEVED / MISLED
  • STUCK injects "try a different angle" system message
  • ACHIEVED short-circuits to verification
  • MISLED re-anchors on original goal
  • model_question verifier implemented (strict YES/NO judge call)
  • Critic can use a separate cheaper provider (criticProviderId)
  • See Critic-and-Replan

Phase 4A — Goal observability dashboard

  • GoalDashboard.tsx: three-column live UI with goal list, step log, critic+verification rail
  • GoalCreateDialog.tsx: form for new goals (all 4 criterion types, 5 risk levels, sandbox, wall clock, critic interval)
  • Live event streaming via goal:event IPC channel
  • Status bar Goals pill with running-count pulse
  • Ctrl+Shift+G keyboard shortcut
  • See Goal-Dashboard

Phase 4B — Vision-grounded browser action loop

  • New browser_verify_visual_state tool: strict YES/NO vision judge for "did the expected thing happen?"
  • New browser_describe_screen tool: free-form vision description for "where am I?"
  • AIManager.buildVisionHelpers() exposed via ToolContext.vision
  • Falls back to main model for dual-purpose providers (Claude, GPT-4o)
  • See Vision-Verification

Bug fixes after roadmap

  • trim-regression: long conversations were stripping the original user message, causing strict OpenAI-compat endpoints to reject with "No user query found in messages." Fix: re-anchor first user message after trimming.

Pre-roadmap (foundational features)

AI subsystem (pre-Phase 1A)

  • AIChatPanel.tsx with three states (closed / minimized / full)
  • Streaming SSE parsing with tool-call accumulation
  • Per-provider AISettingsDialog.tsx with Discover for local providers
  • Provider-agnostic OpenAI-compat protocol — works with Claude, OpenAI, Ollama, LM Studio
  • AI memory store with conversation history (50 × 100 msgs)
  • Per-pane PaneAgentState + multi-pane OrchestrationGoal + event log
  • FleetDashboard.tsx for multi-pane visibility
  • 6 default personas, 2 skills, 2 task templates loaded from resources/defaults/

Browser panes

  • Full Chromium webview with chrome controls (back/forward/reload/address bar)
  • Multi-tab with persisted state (title, favicon, URL)
  • Bookmarks, history, downloads, find-in-page
  • Saved logins per-origin via Electron safeStorage
  • Custom user agent presets to dodge bot detection
  • Drag-to-move via title bar
  • Right-click context menu for convert pane / open DevTools / etc.

PTY-per-tab terminal model

  • Each tab in a terminal pane = its own SSH+tmux session
  • Pure-CSS tab switching (no tmux switch-client shell command leakage)
  • Tmux session picker with auto-list (key auth) + manual entry + legacy-name suggestion
  • Close-pane confirm dialog with "keep session" / "destroy session" options

Clipboard fixes

  • Ctrl+C always SIGINT (never copies)
  • Ctrl+Shift+C for copy
  • Ctrl+V bracketed-paste-aware
  • Per-pane "Disable App Mouse" toggle for native selection over tmux mouse mode
  • Removed auto-copy on mouseup (broke too often with mouse-mode apps)

Workspace switch preservation

  • PTYs are backgrounded, not killed, on workspace switch
  • Switch back and your htop/build/stream is still running

Fleet Term → ClusterSpace rename

  • One-time migration in legacy-rename.ts: copies fleet-term-data/ to clusterspace-data/, renames files in place
  • Legacy tmux session names suggested in the picker

Other major features

  • Window state persistence (position + size + maximized)
  • Drag-and-drop pane swap (Carolina-blue highlight)
  • Real-time drag-resize via gutter handles
  • Multi-workspace tab bar with persistent layouts
  • Broadcast mode (Ctrl+B)
  • Command palette (Ctrl+P)
  • SSH server manager with key + password auth
  • Workspace export/import as portable JSON

Versioning

ClusterSpace doesn't follow strict semver yet — v1.0.x is the post-rename release line and most commits land as patches. Major UX-breaking changes will bump the minor when they happen.


See also

Clone this wiki locally