Releases: AgentsMesh/Loopal
v0.5.0 - Turn-as-Unit SSOT + 200-line discipline
Highlights
Architecture enforcement (8-phase plan)
- Move
TurnTrackerintoloopal-contextsoTurnStoremutators arepub(crate)— runtime crates cannot bypass the tracker at compile time. - Retire
ContextStore::from_messages; tests seed history vialoopal_test_support::seed_history. tests/architecture_boundary_test.rsgreps for cross-layer wire-type leaks (MessageRole/ContentBlockoutside provider/display/context layers).- Wire-only mutations (microcompact, condense_server_blocks) now flow through
TurnTracker::with_wire_mutso the ephemeral path also honors the SSOT contract. - Re-derive open
ToolBatchstep onTurnTracker::new/replace_storeso resume-mid-batch correctly routesupdate_tool_state.
File-size + comment discipline
- 10 source files split into directory modules:
turn_event_store,turn_store,turn_tracker,turn_projection,request_turns,compaction,compact_rehydrate,ingestion,turn_degradation,resolver. - Sibling extractions:
SettleSignal,mcp_settle,session_start_prompt. - All
src/**/*.rsfiles ≤200 lines. - Module-level
//!blocks and///docs that restate signatures stripped per HARD RULE — code is SSOT.
Dead-code removal
- Dropped
provider-api::Middlewaretrait, ContextStorepipeline/config_refresh/degradation/ingestionmiddleware,governance::compensation.
Breaking changes
loopal_runtime::agent_loop::turn_trackermoved toloopal_context.ContextStore::{from_messages, clear, truncate}removed.- Internal middleware modules retired (see above).
Stats
49 commits since v0.4.0 · Net -2904 lines in #183 alone.
Full diff: v0.4.0...v0.5.0
What's Changed
- fix(goals): trigger continuation kickoff on Create/Resume/Extend control by @yishuiliunian in #138
- refactor(permission): decompose into orthogonal Permission × Decision axes by @yishuiliunian in #139
- refactor(decision): split Auto into Classifier and Agent with race-to-respond UX by @yishuiliunian in #140
- fix(events): repair /clear and seal Control→Event→View drift by @yishuiliunian in #141
- feat(memory): codify SNR + latent structure as Prime Axioms by @yishuiliunian in #142
- refactor(git): move gitignore SSOT into .loopal/.gitignore by @yishuiliunian in #143
- refactor(view-state): silence allow-path decision echoes by @yishuiliunian in #144
- fix(logging): never delete .log files held by live processes by @yishuiliunian in #145
- fix(tools): restore WebSearch and make Fetch actually download pages by @yishuiliunian in #146
- feat(prompt): introduce core/soul.md with five Prime Axioms by @yishuiliunian in #147
- feat(askuser): strict schema validation + multi-question segment UI by @yishuiliunian in #148
- fix(tui): guard render paths against tiny terminals by @yishuiliunian in #149
- fix(spawn): split permission_mode and decision_mode into independent params by @yishuiliunian in #150
- refactor(arch): 9 architecture debts + 5 review cycles + 200-line split by @yishuiliunian in #151
- refactor(scheduler): async save worker + test consolidation by @yishuiliunian in #152
- fix(scheduler): remove wait_idle from startup path by @yishuiliunian in #153
- feat(provider): add OPENAI_BASE_URL env var and GPT-5.5 model by @yishuiliunian in #154
- refactor(tools): split ReadPdf and ReadHtml out of Read tool by @yishuiliunian in #155
- fix(tools): treat empty process_id as absent in Bash tool by @yishuiliunian in #156
- refactor(tools): TypedTool trait + input/schema normalization by @yishuiliunian in #158
- fix(provider): preserve OpenAI reasoning item for web_search_call multi-turn by @yishuiliunian in #159
- fix(tool-api): ensure object schemas always include properties field by @yishuiliunian in #160
- fix(provider): flush each OpenAI reasoning item as independent Thinking block by @yishuiliunian in #161
- feat(tui): persist /model picker selection + fix release-event double-fire by @yishuiliunian in #162
- feat(vault): zero-trust secret subsystem so plaintext never reaches LLM by @yishuiliunian in #163
- refactor(cli): bring vault into clap subcommand tree + arg help by @yishuiliunian in #164
- refactor(goal): remove token budget subsystem by @yishuiliunian in #165
- feat(bg-task): per-session log files + actor-based process supervision by @yishuiliunian in #166
- feat(goal): allow Complete → Active reopen so model can recover from premature complete by @yishuiliunian in #167
- fix(ipc): typed RpcError + auto-respond contract so missing-session fails fast by @yishuiliunian in #168
- refactor(goal): drop barren-driven auto-complete by @yishuiliunian in #169
- feat(soul): add Axiom 6 — see systems, not parts by @yishuiliunian in #170
- feat(tui-panel): unify Cron/Task/BgTask detail sub-pages with stop action by @yishuiliunian in #171
- fix: scroll slash command menu + isolate cleanup_orphans flaky by @yishuiliunian in #172
- refactor(governance): split TurnObserver into Governance + TurnHook with 6 enforced invariants by @yishuiliunian in #173
- feat(compact): three-tier defense + boundary marker + API token feedback for 1M-context sessions by @yishuiliunian in #175
- feat(tool-image): add ReadImage tool + multimodal image channel for LLM by @yishuiliunian in #174
- feat(mcp): non-blocking startup + sub-agent proxy + actionable diagnostics by @yishuiliunian in #176
- fix(tui-askuser): Enter confirms default option without prior ↑↓ by @yishuiliunian in #177
- refactor(tools-fs): typed paths + batch IO + virtual-FS ApplyPatch + actionable errors by @yishuiliunian in #178
- feat(hub): move Vault + MCP to Hub process with sharing model by @yishuiliunian in #179
- feat(agent-loop): ContinuationGate + DegenerationDetector + request_idle by @yishuiliunian in #180
- refactor(bootstrap): root-cause hub-only handshake deadlock via typestate + IpcBudget by @yishuiliunian in #181
- fix(agent-loop): /goal replace + request_idle turn-end + intercept emit invariant by @yishuiliunian in #182
- refactor: enforce Turn-as-Unit SSOT + 200-line file discipline by @yishuiliunian in #183
Full Changelog: v0.4.0...v0.5.0
v0.4.0
What's Changed
- feat(prompts): proactively trigger explore sub-agent for codebase research by @yishuiliunian in #129
- fix(spawn): propagate --no-sandbox to all sub-agents by @yishuiliunian in #130
- feat(askuser): inline UI + structured response protocol by @yishuiliunian in #131
- feat(tools): scenario-aware truncation + fetch LLM refiner by @yishuiliunian in #132
- refactor(runtime): turn state machine + decouple prefill from thinking by @yishuiliunian in #134
- refactor(hub): standalone Hub subprocess + detach/kill lifecycle by @yishuiliunian in #133
- feat(goals): thread-level goal tracking with auto-continuation and budget accounting by @yishuiliunian in #135
- fix(goals): unblock /goal pipeline and unify command reply channel by @yishuiliunian in #136
- refactor(cli): split passthrough by consumer + reflective completeness tests by @yishuiliunian in #137
Full Changelog: v0.3.0...v0.4.0
v0.3.0
What's Changed
- feat(provider): add Claude Opus 4.7 and set as default model by @yishuiliunian in #118
- feat(tui): add Crons panel for scheduled cron jobs by @yishuiliunian in #119
- feat(scheduler): add durable persistence for cron tasks by @yishuiliunian in #120
- fix(status-bar): emit explicit Running event on turn start by @yishuiliunian in #121
- fix(status-bar): keep spinner/timer alive across turn boundaries by @yishuiliunian in #122
- feat(tui): panel section headers + fix focus arrow residue by @yishuiliunian in #123
- refactor(protocol): NAT-style cross-hub address routing by @yishuiliunian in #124
- refactor(agent): event-driven symmetric session-scoped state for cron/task by @yishuiliunian in #125
- refactor(spawn): split sub-agent spawn IPC into InHub vs CrossHub by @yishuiliunian in #126
- feat(inbox): event-driven visibility for inter-agent messages by @yishuiliunian in #127
- refactor(hub): event-driven multi-UI architecture by @yishuiliunian in #128
Full Changelog: v0.2.0...v0.3.0
v0.2.0
What's Changed
- refactor(sandbox): remove OS-level write restrictions, shift to permission-gated model by @yishuiliunian in #101
- fix(tui): prevent Shift+Enter inserting 'j' instead of newline by @yishuiliunian in #102
- fix(runtime): emit error event on silent SSE stream truncation by @yishuiliunian in #104
- feat(tui): add /skills slash command by @yishuiliunian in #103
- feat(tui): show session resume info on /exit by @yishuiliunian in #105
- feat(tui): /mcp slash command with server status page and reconnect by @yishuiliunian in #106
- feat(tui): event-driven background task sync and log viewer by @yishuiliunian in #108
- feat(tui): convert /skills to sub-page overlay by @yishuiliunian in #110
- feat(context): config hot-reload via ContextPipeline middleware by @yishuiliunian in #111
- fix(ipc): retry initialize() on transient failures by @yishuiliunian in #112
- fix: resolve UTF-8 boundary panics in session resume by @yishuiliunian in #113
- fix(sandbox): unrestrict signal, process-info and add mach-register by @yishuiliunian in #114
- feat(mcp): .mcp.json config support and disconnect action in /mcp page by @yishuiliunian in #115
- fix(context): prevent context overflow by clamping max_tokens before API call by @yishuiliunian in #116
- feat(tui): add Tasks panel with PanelProvider registry architecture by @yishuiliunian in #117
Full Changelog: v0.1.1...v0.2.0
v0.1.1
What's Changed
- fix(ci): patch rules_rust to fix Windows build PATH overflow by @yishuiliunian in #97
- feat(memory): upgrade sidebar memory agent to Knowledge Manager by @yishuiliunian in #98
- refactor: enforce child process stderr isolation to protect TUI by @yishuiliunian in #99
- feat(agent): depth-limited spawning, hub budget, and fork context by @yishuiliunian in #100
Full Changelog: v0.1.0...v0.1.1
v0.1.0
What's Changed
- fix: align macOS seatbelt sandbox with Codex whitelist policy by @yishuiliunian in #58
- fix: ESC interrupt lost + background agent results not delivered to root by @yishuiliunian in #59
- feat: centralized FocusMode state machine for TUI input dispatch by @yishuiliunian in #60
- feat: enhance Plan mode with 5-phase workflow, hard enforcement, and user approval by @yishuiliunian in #61
- feat: MetaHub distributed agent cluster + execution mode refactoring by @yishuiliunian in #62
- feat: enhance Agent tool call display with name, spinner, and live progress by @yishuiliunian in #63
- fix: sub-agent returning empty output when final LLM response has no text by @yishuiliunian in #64
- feat: background task architecture refactoring by @yishuiliunian in #65
- feat: enable topology overlay by default by @yishuiliunian in #66
- refactor: replace raw u64 timeouts with Duration for type-safe time handling by @yishuiliunian in #68
- feat: display full thinking content in TUI by @yishuiliunian in #67
- feat: add diff preview for MultiEdit, Write, and ApplyPatch in TUI by @yishuiliunian in #69
- refactor: simplify macOS Seatbelt sandbox from whitelists to blanket allows by @yishuiliunian in #70
- feat: add table cell borders and centralize markdown styles by @yishuiliunian in #71
- fix: resolve /exit 5-second delay by properly closing transport writer by @yishuiliunian in #72
- feat: agent-type-aware system prompt with fragment selection by @yishuiliunian in #73
- fix(skill): add conflict detection to github-pr by @yishuiliunian in #74
- feat: upgrade hook system with multi-executor types, structured output, and event telemetry by @yishuiliunian in #75
- fix(provider): resilient HTTP client with auto-rebuild on pool corruption by @yishuiliunian in #76
- feat: enhance prompt system with feature-conditional fragments and enriched tool descriptions by @yishuiliunian in #77
- feat: add session resume as agent-level capability with /resume command by @yishuiliunian in #78
- fix(tui): Up/Down keys navigate history instead of scrolling content by @yishuiliunian in #79
- feat(tui): add session picker for /resume + auto session titles by @yishuiliunian in #80
- feat(tui): add full-screen tabbed /status sub-page by @yishuiliunian in #81
- fix(runtime): detect SSE stream truncation and auto-continue from partial response by @yishuiliunian in #82
- refactor: deliver messages directly to agent mailbox, remove TUI inbox routing by @yishuiliunian in #84
- feat(sandbox): replace hard denies with permission-gated RequiresApproval by @yishuiliunian in #83
- fix(tui): decouple mouse scroll from input history via timing-based debounce by @yishuiliunian in #85
- feat(prompt): add concurrency discipline for sub-agent spawning by @yishuiliunian in #86
- feat(agent): depth-aware delegation + StartAgentParams refactor by @yishuiliunian in #87
- fix(tui): replace scroll debounce with batch detection and absolute position indexing by @yishuiliunian in #88
- fix(tui): replace alternate scroll heuristic with MouseCapture by @yishuiliunian in #89
- fix(provider): thinking-mode prefill rejection + error misclassification by @yishuiliunian in #90
- docs(readme): fix tool count, sandbox policies and expand feature coverage by @yishuiliunian in #92
- fix(hub): close transport after IO loop to prevent sub-agent process leak by @yishuiliunian in #93
- fix(config): flaky test due to LOOPAL_MODEL env var race by @yishuiliunian in #94
- feat(telemetry): OpenTelemetry integration with JSONL file export by @yishuiliunian in #95
- fix(runtime): decouple tool dispatch from permission to prevent duplicate tool_result by @yishuiliunian in #96
Full Changelog: v0.0.1-alpha.2...v0.1.0
v0.0.1-alpha.2
What's Changed
- refactor: agent state machine, deterministic result passing, overflow-to-file by @yishuiliunian in #57
Full Changelog: v0.0.1-alpha.1...v0.0.1-alpha.2
Full Changelog: v0.0.1-alpha.1...v0.0.1-alpha.2
v0.0.1-alpha.1
What's Changed
- feat: migrate build system from Cargo to Bazel by @yishuiliunian in #39
- chore: add Makefile with common development commands by @yishuiliunian in #40
- fix: convert Bash tool timeout from seconds to milliseconds & remove WebSearch by @yishuiliunian in #41
- fix: decouple mouse scroll from input history navigation by @yishuiliunian in #42
- feat: add --version flag and make install target by @yishuiliunian in #43
- refactor: introduce TimeoutSecs newtype to eliminate timeout unit ambiguity by @yishuiliunian in #44
- feat: task-based model routing + provider enrichment by @yishuiliunian in #45
- feat: add cron scheduler for timed prompt injection by @yishuiliunian in #46
- feat: ACP standard alignment + Hub architecture split by @yishuiliunian in #47
- refactor: remove misleading token metrics from TUI status bar by @yishuiliunian in #48
- refactor: simplify CLI — remove --hub, hide --serve by @yishuiliunian in #49
- feat: make /init agent-powered — analyze project before generating LOOPAL.md by @yishuiliunian in #50
- chore: add github-pr skill for automated PR workflow by @yishuiliunian in #51
- feat: collapse skill invocations in TUI chat view by @yishuiliunian in #52
- feat: agent view switching — TUI can observe and interact with any agent by @yishuiliunian in #53
- feat: add Auto permission mode with LLM-based tool classification by @yishuiliunian in #54
- refactor: decouple agent layer from UI — pure service model by @yishuiliunian in #55
- fix: remove duplicate root agent in topology overlay by @yishuiliunian in #56
Full Changelog: v0.0.1-alpha...v0.0.1-alpha.1
Full Changelog: v0.0.1-alpha...v0.0.1-alpha.1
v0.0.1-alpha
Loopal v0.0.1-alpha
First alpha release of Loopal — an AI coding agent with TUI.
Highlights
- Multi-agent architecture: Hub-only gateway with parent/child agent topology
- MCP support: rmcp SDK integration with full protocol support
- TUI: ratatui-based terminal UI with agent panel, model picker, topology overlay
- Built-in tools: Read, Write, Edit, Bash, Grep, Glob, WebFetch, and more
- LLM providers: Anthropic, OpenAI, Google, OpenAI-compatible
- Context management: Middleware pipeline with smart compaction
- Permission system: ReadOnly / Supervised / Dangerous tool levels
Recent changes
/topologycommand: graphical Canvas-based agent topology overlay (#37)- Hub-only gateway architecture with agent collaboration (#36)
- MCP migration to rmcp SDK (#35)
- Fix: release workflow runner for macOS x86_64 (#38)
Note
This is an early alpha release for testing and feedback. APIs and configuration formats may change.
What's Changed
- fix: /compact command provides TUI feedback via Compacted event by @yishuiliunian in #1
- feat: agent loop architecture enhancement with Runner decomposition and 7 new capabilities by @yishuiliunian in #2
- feat: server-side web search for all providers + OpenAI Responses API migration by @yishuiliunian in #4
- fix: replace Notify with watch channel for interrupt cancellation by @yishuiliunian in #3
- fix: enable bracketed paste mode to prevent multiline paste splitting by @yishuiliunian in #5
- fix: replace mouse capture with alternate scroll for terminal text selection by @yishuiliunian in #6
- feat: generalize server tool handling + redesign compaction architecture by @yishuiliunian in #7
- feat: prompt engine, TUI improvements & bug fixes by @yishuiliunian in #8
- refactor: delegate grep/glob to Backend with parallel search by @yishuiliunian in #9
- fix: add dedicated tool preference warnings to Bash description by @yishuiliunian in #10
- feat: budget-constrained ContextStore replaces raw Vec by @yishuiliunian in #11
- fix: update model params and sanitize orphaned server tool blocks by @yishuiliunian in #12
- fix: replace xterm alternate scroll with native mouse capture by @yishuiliunian in #13
- feat: integration test infrastructure & comprehensive test coverage by @yishuiliunian in #14
- feat: display actual server tool result content in TUI by @yishuiliunian in #16
- feat: replace repeated retry errors with in-place transient banner by @yishuiliunian in #15
- refactor: unify slash command system with CommandHandler trait + registry by @yishuiliunian in #17
- feat: multi-process architecture with TUI/Agent IPC isolation by @yishuiliunian in #18
- feat: incremental markdown rendering + table cell wrapping by @yishuiliunian in #19
- fix: unify context budget with model-aware context window by @yishuiliunian in #22
- feat: improve plan mode workflow and enforce tool usage over Bash by @yishuiliunian in #20
- fix: ESC interrupt not reaching agent during tool execution in IPC mode by @yishuiliunian in #21
- feat: show inline diff content in Edit tool TUI display by @yishuiliunian in #23
- fix: resolve IPC pipe deadlock + add multi-process observability logging by @yishuiliunian in #24
- refactor: replace dynamic worktree tools with static isolation model by @yishuiliunian in #25
- refactor: remove unused cost/price dead code by @yishuiliunian in #26
- feat: multi-agent IPC architecture + type-safe completion signal by @yishuiliunian in #27
- refactor: remove single-process mode, unify on multi-process IPC by @yishuiliunian in #28
- fix: resolve HubFrontend stale interrupt causing agent loop exit by @yishuiliunian in #29
- fix: restore Up/Down history navigation when agent is idle by @yishuiliunian in #30
- refactor: extract loopal-agent-hub crate from session by @yishuiliunian in #31
- fix: route server tool input deltas + clear stale sub-agent status by @yishuiliunian in #33
- chore: switch from MIT to proprietary commercial license by @yishuiliunian in #34
- feat: migrate MCP to rmcp SDK with full protocol support by @yishuiliunian in #35
- refactor: Hub-only gateway architecture + agent collaboration overhaul by @yishuiliunian in #36
- feat: add /topology command with Canvas-based agent graph overlay by @yishuiliunian in #37
- fix: use macos-14 runner for x86_64-apple-darwin release build by @yishuiliunian in #38
New Contributors
- @yishuiliunian made their first contribution in #1
Full Changelog: https://github.com/AgentsMesh/Loopal/commits/v0.0.1-alpha
Full Changelog: https://github.com/AgentsMesh/Loopal/commits/v0.0.1-alpha