Releases: deepakkumar1984/blazorly-harness
Release list
blazorly 0.5.0
What's New
Attach files and screenshots in chat
Paste, drag & drop, or use the 📎 button — anywhere in the app:
- Screenshots (PNG/JPG/GIF/WebP) go straight to vision models as image blocks — no saving to disk first
- Text files (.txt, .md, .json, .csv, code, logs…) are inlined into the message, capped at 256 KB like
@filereferences - Documents (PDF, DOCX, XLSX, PPTX…) are dropped into
.blazorly-uploads/in the workspace with their real names, and the agent is pointed at them to inspect with its tools (pdftotext,python, …)
Pending attachments show as chips above the composer (🖼 / 📄 / 📑 / 📎 with the filename) — click one to remove it. Send works with or without text. Uploads travel over HTTP (POST /api/session.uploadFile, 32 MB cap), never through the realtime circuit — so full-size screenshots attach reliably. Text-only pastes are never intercepted. Dropping a file anywhere on the page no longer navigates the browser away.
Skills from the shared collection
The skill discovery now reads three roots: ~/.blazorly/skills/ (native, wins collisions), ~/.agents/skills/ (the shared convention your other agent tools read — one collection serves them all), and <workspace>/.blazorly/skills/ (per project). Any standard SKILL.md folder is discovered live — new skills appear on the next turn without a restart, and the model loads them via the skill tool when your task matches a description.
Website
Initial documentation site under website/ (features, guides, install pages) with a static build script.
blazorly 0.4.0
What's New
Swarm — parallel delegation with review
- New
swarmtool: a planner subagent auto-shards your objective into independent tasks, workers execute concurrently as background subagents (capped atmax_parallel), and a reviewer agent verifies the completed work in the workspace — failed tasks re-dispatch with the review notes up tomax_review_rounds - Standalone
reviewtool: spawns an independent reviewer subagent forked from your conversation that reads the actual files, runs cheap verification, and returns a structured verdict (pass|fail|concerns) with severity-tagged issues
Delegation runs in one chat
- Delegated children no longer appear as separate chats in the sidebar — they run inside the parent chat
- Agents progress panel beside the tasks panel: live indicators (pulsing ◐ while working, ✔ finished, ✕ error), per-worker summary, each row links to the child session for full inspection
- Children can never hang on you:
ask_user_questionfrom a delegated child now answers itself instantly with standing guidance — no more invisible blocking prompts - Prompt guidance now reserves delegation for genuinely complex or parallelizable work; small tasks stay inline
Parallel teams
- Team tools (
send_message,spawn_teammate, etc.) are now concurrency-safe: batch several in one response to run teammates in parallel — deliveries to the same teammate still process in order (per-child gates in the subagent seam)
Tool gate — hybrid tool selection
- When MCP servers push the visible tool set past ~28, the pure-code gate prunes each request's schemas to a shortlist (core tools + recently used + lexical relevance to the current brief) with zero extra AI calls
- With
tool-gatein your System One seams and a JEV-1 key, the ambiguous tail gets one System OneChoice(cached per brief, so steps within a turn reuse it) — this is the consensus hybrid pattern: rules carry the easy cases, a small decision model handles the rest - Degrade-to-full on any failure: the gate falling back to the full tool list is byte-identical to pre-gate behaviour. Metrics at
GET /api/decisions→toolGate.stats
UX polish
- Sidebar scrolls properly when a workspace has many sessions — the bottom menu (Add workspace / Settings / theme) stays pinned
- Collapsible workspace groups: click a workspace header to collapse its session list, with a session-count chip showing what's hidden; your choices persist across reloads, and the smart default collapses everything except the workspace you're in
- Permission preset default → full access; the legacy
danger-full-accessspelling is nowfull-access(backward-compatible — old settings and session logs resolve to the same mode). Dropdown labels shortened toread-only/workspace-write/full access
blazorly 0.3.0
What's New
Live reasoning & tool status
- The chat shows a live thinking indicator with an elapsed timer while the model reasons, including a calm placeholder for providers that buffer long before their first byte.
- Tool cards now tick elapsed time while running, so long builds and tests are visibly alive.
- New first-byte watchdog (
LlmRuntime.FirstByteTimeout): a silent or dead endpoint fails fast instead of hanging the turn forever.
AI docs generation
- New "Generate docs" toolbar action: scans the workspace and drafts hierarchical
AGENTS.mddocumentation with AI — preview the result before anything is written, and manual notes are preserved on regeneration.
Web UI
- Composer now grows with your text (up to 200px) and keeps the end of large pasted text in view — no more scrolling a one-line box to find the tail of what you pasted.
- Tooltips on the session toolbar buttons; failed turns are surfaced clearly in the transcript.
CLI & console
blazorly serve --host <ip|name>— bind the web UI to a specific address.--token <secret>— pin the console access token for remote access (default: a fresh random token each boot).- Reasoning effort can be set when initializing a session;
/effortand the model menu cover it in the UI.
Fixes & internals
- Clearer errors for invalid requests; OpenAI-compatible adapters now parse SSE-framed error messages instead of surfacing them as truncations.
- Session timeout handling and error-message improvements across the agent loop and compaction.
- Provider catalog refreshed for new routes and per-route API key handling.
blazorly 0.2.0
blazorly 0.2.0
Token efficiency, smarter model metadata, and a rebuilt chat transcript.
Token efficiency
- Runtime-context snapshots no longer pile up in history: only the latest snapshot is sent to the model (older ones were full duplicates). Saves ~15–20% of tokens on long multi-step turns. Transcripts still show every snapshot.
Reasoning effort
- Models that advertise no effort levels (most discovered/API-only models) now offer low / medium / high / xhigh / max with a default of high — the model picker and
/effortboth work instead of reporting "does not advertise".
Context windows & output caps
/modelsendpoints that publish sizes (OpenRouter-stylecontext_length,max_completion_tokens, …) are now read and persisted per model, surviving restarts; legacy id-only settings files keep working.- Resolution order everywhere: API metadata → catalog → settings fallback.
- New defaults for fresh setups: 256K context window (was 64K), 64K max output tokens (new setting, clamped per model so small-output models can't 400), 0.9 compaction threshold (was 0.72).
Chat transcript
- Tail-windowed loading: refresh renders the newest 200 messages instantly and jumps straight to the bottom — no more load-stop-load virtualization walk.
- Scroll up (or "Show earlier messages") to prepend 100 more while holding your reading position.
- Fixed follow mode getting stuck mid-chat during streaming, and instant (non-animated) programmatic scrolling.
Upgrade notes
- Existing
settings.jsonfiles keep their saved values — to pick up the new 256K / 64K / 0.9 defaults, update them on the Settings page (Context section). - Requests now send an explicit
max_tokens(resolved cap) instead of leaving it to the provider default.
Install / upgrade
# Linux / macOS
curl -fsSL https://raw.githubusercontent.com/deepakkumar1984/blazorly-harness/main/installer/install.sh | sh
# Windows
powershell -c "irm https://raw.githubusercontent.com/deepakkumar1984/blazorly-harness/main/installer/install.ps1 | iex"blazorly 0.1.9
blazorly 0.1.9
Decision model — System One (new, off by default)
- A decision seam for the places in the harness that make a judgment rather than a generation: unstructured state in, typed decisions out (
Choice/Score/Noul), one parallel pass, no generated text. NewCore/Decisionslayer:DecisionModel,DecisionService,SystemOneClient,RiskGatePlugin. - Two live seams:
auto-plan— does this brief need a plan before anything changes? Engages plan mode at P ≥autoPlanEngageAt(0.60), skips at P ≤autoPlanSkipAt(0.25), and abstains to the existingautoPlanThresholdheuristic in between.risk-gate— could this call destroy data or leak secrets irreversibly? Parks the call for approval at P ≥riskGateThreshold(0.5).
- Configure from Settings → Capabilities or
settings.json:enableSystemOne,systemOneApiKey(also resolves fromSYSTEMONE_API_KEY),systemOneBaseUrl/systemOnePath/systemOneModel/systemOneAuthStyle/systemOneTimeoutMs/systemOneSeams, plusenableRiskGateandriskGateThreshold. - New CLI:
blazorly decisions doctor(what resolved, which seams are live) andblazorly decisions probe [--seam auto-plan|risk-gate|loop] [--text|--json]— one real call printing the raw request, raw reply and parsed result, so a schema mismatch is a two-line fix rather than a mystery. - New endpoint:
GET /api/decisionsreports config, live vsplannedSeams, and cost so far (calls, answered, degraded, cache hits, mean/max latency, per-seam counts). A climbingdegradedwith noansweredmeans the endpoint or reply shape needs adjusting. - Every decision is durable: an ignorable
decision/resultevent records the seam, implementation, state hash, probabilities and latency, so a behaviour change is attributable. - Safe to leave on: no opinion is a first-class result — disabled, unconfigured, timed out, errored or uncertain all fall back to the deterministic logic that was already there, so a decision model can never be the reason a turn fails. The gate is escalate-only: it can turn an allow into an ask, never an ask into an allow, never softens a deny, and stands down entirely in headless runs (new
ApprovalService.CanAsk). Reads, searches and fetches never reach the model, keeping it off the hot path. - Evals pin both flags off (
EvalSandbox.PinnedSettings) so scores stay reproducible and comparable with older runs.loopandcompactionare named in the settings vocabulary but not yet consumed — reported underplannedSeams, never as live.
Rate limits and retries
- The harness still never throttles itself; it only reacts to provider failures. Waits are now chosen in order: provider
Retry-Afterhonored verbatim up tomaxRetryAfterMs(120s) → rate-limit window backing off fromrateLimitMinDelayMs(5s) doubling torateLimitMaxDelayMs(30s) → generic ladderinitialDelayMs(500ms) tomaxDelayMs(10s) withjitterRatio. retryis fully configurable, with per-routeretryProvidersoverrides (e.g. give a flaky providermaxRetries: 8without changing global behaviour) and"mode": "always"for unattended batch runs. Stop/interrupt cancels a pending backoff immediately.- Each retry writes a durable
llm/retry+llm/retry-startedpair; the trajectory ↻ chip now reports the attempt and the wait in seconds and flags a delay the provider asked for versus one we computed.
Provider errors
- A 429 is not always a rate limit. Balance/quota exhaustion (Z.ai
1113, OpenAIinsufficient_quota) now classifies asQUOTA, which is not retryable — the turn fails in about a second with the provider's own words instead of spending ~95s retrying something that cannot succeed. Genuine throttling staysRATE_LIMITand is retried. - Every failure carries the provider's message/code, surfaced consistently in the web turn banner,
blazorly run(stderr and theerrorfield of--json), ACP (turn failed: …) and the session log. - Connection failures now name the phase and cause: DNS NXDOMAIN, temporary resolver failure, connection refused, connect timeout, network unreachable, rejected TLS handshake, upload-phase close, mid-stream drop, or request timeout — with the endpoint and underlying socket error.
--provider <id>switches the whole route, not just the label: keys and base URLs are stashed per provider (providerKeys,providerBaseUrls,baseUrlProvider), so an override never sends one route's credentials to another host. The Settings page keeps a custom gateway URL attached to the newly selected provider, since a proxy usually serves all of them.
UI
- Chat transcript is substantially denser: assistant messages no longer spend a full row below each step on actions, and tool rows, turn footers and markdown paragraph spacing were tightened — roughly half the vertical cost for a multi-tool turn.
- Copy is now a hover-revealed icon on the message header (with a ✓ tick on success) instead of a permanent
copylink; keyboard focus and touch devices still reach it.
Tests and docs
- 481 tests: 479 pass, 2 pre-existing macOS failures (
run_codeconfinement requires Linux Landlock). New:DecisionTestsandDecisionBootTestsagainst a fake decision server (parsing, choices/ratings, timeouts, HTTP failure, caching, no-op model, risk-gate interaction with tool policy and approval),TransportErrorTests,MultiProviderTests, and retry/kernel coverage. - README gained Decision model (System One), Rate limits and retries and Provider errors sections;
research/system-one-decision-layer.mdandresearch/per-workspace-learning.mdcapture the design reasoning.
Install / update
curl -fsSL https://raw.githubusercontent.com/deepakkumar1984/blazorly-harness/main/installer/install.sh | shpowershell -c "irm https://raw.githubusercontent.com/deepakkumar1984/blazorly-harness/main/installer/install.ps1 | iex"Already installed? blazorly update swaps in this release (checksum-verified).
Full Changelog: v0.1.8...v0.1.9
blazorly 0.1.8
blazorly 0.1.8
Sandbox
- bash and run_code now prompt for user approval when Linux Landlock is unavailable (macOS/Windows) instead of failing hard. The user sees "Allow once" / "Reject" buttons in the chat UI.
- Permission menu shows ⚠ indicators next to read-only and workspace-write when Landlock is not available, with a footer explaining that only danger-full-access runs without prompting.
- SessionRepair now handles corrupted session logs with duplicate TurnStart events by inserting proper TurnEnd boundaries, preventing crash-on-load for damaged sessions.
UI
- Model selection and reasoning effort are now separate controls in a modal dialog (replacing the inline popover). The header shows two compact chips: provider/model and effort level.
- Trajectory raw events view is paginated (50 events per page) with First/Previous/Next/Latest navigation, preventing UI hangs on sessions with thousands of events.
- Approval prompts and user questions auto-scroll into view when they arrive, using post-render scroll instead of synchronous scroll.
- Dropdown menus (model, permission, context) are no longer blocked by the transparent backdrop overlay — the header stacking context was removed.
Fixes
- Page no longer crashes on cold server start (SSR) due to null session/agent references in the title and workspace label.
- LoadSessionAsync catches errors and shows a user-friendly message with a retry button instead of crashing the entire page.
- Build succeeds with 0 errors; 411 tests pass (2 pre-existing macOS sandbox failures, 3 network-dependent search test failures).
What's Changed
Full Changelog: v0.1.7...v0.1.8
blazorly 0.1.7
blazorly 0.1.7
Tool contract
- edit / interrupt_agent / wait_agent / ralph: published snake_case arguments now bind (the
serializer is camelCase). A new schema-binding audit round-trips every tool's published
schema through the real serializer, so this class of silent argument drop fails the build. - A required argument sent as explicit null is rejected with an actionable INVALID_ARGS
message instead of surfacing as "Value cannot be null. (Parameter 'value')". - All three wire adapters emit parameters.properties for argument-less tools; LM Studio and
xAI answer 400 invalid_type without it.
Sandbox
- Hosts without Landlock (macOS/Windows) run bash/run_code directly when no sandbox was
configured, with a one-time notice. Explicit per-session presets still fail closed;
sandboxFailClosedWhenUnsupported restores strict behavior everywhere. - run_code resolves relative paths against the session workspace and exposes Workspace;
path errors name the cwd they resolved against. - Forwarded tool calls use published schema names in both in-process and confined modes.
Diagnostics
- Transport failures name the phase, endpoint and payload size instead of the opaque
"Error while copying content to a stream."; mid-stream drops report how much was kept.
Evals
- Execution-backend axis: --sandbox landlock,e2b,none, per-task "sandbox", one pinned home
per backend (behavior pinned, only routes/credentials inherited), and skipped rows with a
reason for backends that cannot run here — never a silent pass. - environment.json manifest: git SHA + dirty flag, OS/arch, Landlock and E2B availability,
applied plugins, published tools and a per-backend toolSchemaHash (SHA-256 over the
canonicalized schemas), mirrored into results.json and summary.md. - New recover-tool-failure task scores durable tool-failure recovery inside one turn, plus
scripts/fake_openai.py so scripted tasks run without a live provider.
What's Changed
Full Changelog: v0.1.6...v0.1.7
blazorly 0.1.6
Full Changelog: v0.1.5...v0.1.6
blazorly 0.1.5
Full Changelog: v0.1.4...v0.1.5