diff --git a/CHANGELOG.md b/CHANGELOG.md index 3ac152d..a1271ec 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,13 +4,31 @@ All notable product changes are tracked here. ## Unreleased +_No changes yet._ + +## 0.2.0 - 2026-05-10 + +First minor release after the harness-core / workspace split. Aggregates +the work that landed across PRs #28 (OTel + model registry), #29 (model +routing + session-switch race), #30 (channel adapters + sidebar + +auto-mode refactor), and #31 (Makefile + docs CI alignment), plus the +web composer / workspace-probe work that introduced this `CHANGELOG.md`. + ### Added - Added a Claude Code-style composer context row in the web app. New sessions can now pick workspace and optional project context from chips above the input box instead of a blocking sidebar popover. - Added workspace probing for arbitrary folders through `GET /v1/workspace/probe`, allowing the UI to show the selected workspace's git branch before or while it is bound to a session. - Added workspace metadata to WebSocket `started` and `workspace_changed` frames so the client can keep workspace path, git branch, and dirty state in sync. -- Added an English-first `README.md` product overview. -- Added `README.zh-CN.md` as the Chinese translation of the README. +- Added the channels subsystem: `ChannelBinding` / `ChannelInstance` core types, JSON-file channel store, `/v1/channels` REST routes, a WeCom WebSocket gateway adapter, and a Channels section in web Settings. Lays groundwork for Feishu / DingTalk / Slack adapters per `docs/proposals/channel-plugins.md`. +- Added a Codex-style chat sidebar with project groups in `ConvoList` and a denser `ConvoRow` carrying run / unread state. +- Added subagent batch dispatch (`subagents/batch`), an internal subagent module, and richer tool-adapter plumbing in `harness-subagents`. +- Added an OTel observability stack: `infra/otel/collector.yaml` + `infra/otel/docker-compose.yml`, `docs/observability/local-stack.md`, server `observability_routes`, and `HarnessObservabilityPanel` / `HealthCenter` / `KpiStrip` UI surfaces. +- Added a model registry with capability-validating provider profiles, a routing-policy engine, fallback events with a UI banner, a model Market panel, and a Routing section in Settings. +- Added `harness-tools` extensions: `harness_health` tool, expanded `doc.rs`, and a default doc skill bundled with `harness-skill`. +- Added `jarvis-cli` `telemetry` and `web` subcommands. +- Added a `Customize` page and an extension-builder default skill. +- Added the `WorkOverview` agent runtime strip and a rewritten `RequirementDetail` page. +- Added an English-first `README.md` product overview and a `README.zh-CN.md` translation. - Added this `CHANGELOG.md` file. ### Changed @@ -18,16 +36,20 @@ All notable product changes are tracked here. - Changed the sidebar "New session" action to open a blank draft and focus the composer. Context is now applied lazily when the first message creates the persisted conversation. - Changed project selection in the web app to behave as light new-session context, with `Free chat` as the default. - Replaced the composer shoulder PR/diff row with a broader session context row for runtime, workspace, git branch, project, model, and permission-mode adjacency. -- Rebuilt the release web bundle and restarted the local server on `http://127.0.0.1:7001/` during development verification. +- Refactored `auto_mode.rs` (~700 LOC trimmed); `JARVIS_WORK_RUN_TIMEOUT_MS` default raised from 5 minutes to 10 minutes; `auto_mode_routes` expanded for richer status surfaces. +- Replaced the Lottie mascot in `AgentLoadingFooter` with three breathing dots — quieter feedback during silent moments. +- Rewrote `McpSection` / `PluginsSection` / `SkillsSection` / `RoutingSection` in web Settings. +- Aligned local cargo commands in `Makefile`, `CLAUDE.md`, and `AGENTS.md` with Linux CI by threading `--exclude jarvis-desktop` through `lint` / `test` / `check`. Override with `WORKSPACE_EXCLUDE=` on a machine with the GTK toolchain installed. ### Fixed +- Fixed the session-switch race that surfaced as `conversation not found` in the web UI: the backend now persists newly-`New`'d conversations immediately, normalises Resume load errors to a not-found signal, and the frontend reorders `setActiveId` to close the race window. Scoped streaming frames no longer toggle `activeId`. Locked in by 4 new vitest cases against the not-found cleanup + scoped-frame invariant. - Prevented a newly-created conversation from flashing an empty hint over a user message when the first send creates the session and immediately sends content. - Cleared stale workspace diff state when the active socket workspace changes. ### Verified -- `npm run build` in `apps/jarvis-web`. -- `cargo check -p harness-server`. -- `cargo build --release -p jarvis`. -- Manual HTTP check for `http://127.0.0.1:7001/`. +- `cargo check --workspace --exclude jarvis-desktop`. +- `cargo clippy --workspace --all-targets --exclude jarvis-desktop -- -D warnings`. +- `cargo test -p harness-server` (268/268 at PR #28-#29 merge time). +- `npm test` and `npm run build` in `apps/jarvis-web` (310/310 vitest). diff --git a/Cargo.lock b/Cargo.lock index 0c5daaf..5b9c3f3 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1964,7 +1964,7 @@ dependencies = [ [[package]] name = "harness-cloud" -version = "0.1.0" +version = "0.2.0" dependencies = [ "async-trait", "bytes", @@ -1983,7 +1983,7 @@ dependencies = [ [[package]] name = "harness-core" -version = "0.1.0" +version = "0.2.0" dependencies = [ "async-stream", "async-trait", @@ -2000,7 +2000,7 @@ dependencies = [ [[package]] name = "harness-llm" -version = "0.1.0" +version = "0.2.0" dependencies = [ "async-stream", "async-trait", @@ -2019,7 +2019,7 @@ dependencies = [ [[package]] name = "harness-mcp" -version = "0.1.0" +version = "0.2.0" dependencies = [ "async-trait", "futures", @@ -2035,7 +2035,7 @@ dependencies = [ [[package]] name = "harness-memory" -version = "0.1.0" +version = "0.2.0" dependencies = [ "async-trait", "blake3", @@ -2049,7 +2049,7 @@ dependencies = [ [[package]] name = "harness-plugin" -version = "0.1.0" +version = "0.2.0" dependencies = [ "chrono", "harness-core", @@ -2065,7 +2065,7 @@ dependencies = [ [[package]] name = "harness-requirement" -version = "0.1.0" +version = "0.2.0" dependencies = [ "async-trait", "chrono", @@ -2082,7 +2082,7 @@ dependencies = [ [[package]] name = "harness-server" -version = "0.1.0" +version = "0.2.0" dependencies = [ "async-stream", "async-trait", @@ -2117,7 +2117,7 @@ dependencies = [ [[package]] name = "harness-skill" -version = "0.1.0" +version = "0.2.0" dependencies = [ "harness-core", "include_dir", @@ -2131,7 +2131,7 @@ dependencies = [ [[package]] name = "harness-store" -version = "0.1.0" +version = "0.2.0" dependencies = [ "async-trait", "chrono", @@ -2147,7 +2147,7 @@ dependencies = [ [[package]] name = "harness-subagents" -version = "0.1.0" +version = "0.2.0" dependencies = [ "async-trait", "futures", @@ -2161,7 +2161,7 @@ dependencies = [ [[package]] name = "harness-tools" -version = "0.1.0" +version = "0.2.0" dependencies = [ "async-trait", "chrono", @@ -2666,7 +2666,7 @@ checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" [[package]] name = "jarvis" -version = "0.1.0" +version = "0.2.0" dependencies = [ "anyhow", "async-trait", @@ -2703,7 +2703,7 @@ dependencies = [ [[package]] name = "jarvis-cli" -version = "0.1.0" +version = "0.2.0" dependencies = [ "anyhow", "clap", @@ -2725,7 +2725,7 @@ dependencies = [ [[package]] name = "jarvis-desktop" -version = "0.1.0" +version = "0.2.0" dependencies = [ "anyhow", "open", diff --git a/Cargo.toml b/Cargo.toml index 3cad2b0..7ec6d3d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -19,7 +19,7 @@ members = [ ] [workspace.package] -version = "0.1.0" +version = "0.2.0" edition = "2021" license = "MIT" rust-version = "1.80"