- GetSessionList_SortsMainSessionFirst now populates 3 sessions via
ParseSessions and verifies the main session is sorted first, instead
of only asserting an empty list.
- Added ParseSessionsPayload helper to expose the private parser.
- TaskbarAtBottom_TypicalScenario assertion changed from the tautological
'y + MenuHeight <= 1040 || y >= 0' to the strict 'y + MenuHeight <= 1040'.
571/571 tests pass.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Fixes two bugs that together caused issue #55:
1. Remove the healthList.Count > 0 guard so ChannelHealthUpdated fires even when all channels are removed.
2. Dispatch StatusDetailWindow.UpdateStatus when the window is already open.
3 new unit tests added. 478/478 shared tests pass.
Closes#55
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Extract testable pure logic from WinUI tray app into shared helpers:
- MenuDisplayHelper: status icons, text truncation, provider formatting
- DeepLinkParser: URI parsing for openclaw:// deep links
- MenuPositioner: tray popup positioning calculations
Create tests/OpenClaw.Tray.Tests with comprehensive coverage for
all extracted helpers plus settings serialization round-trips.
Closes#43
Extract duplicated metacharacter quoting logic from LocalCommandRunner
and SystemCapability into a shared ShellQuoting static class, following
the established GatewayUrlHelper pattern.
- ShellQuoting.NeedsQuoting: single source of truth for metachar detection
- ShellQuoting.QuoteForShell: shell-aware quoting (cmd vs PowerShell)
- ShellQuoting.FormatExecCommand: display formatting for gateway
- IsShellMetachar: idiomatic switch expression instead of duplicated
multi-case switch blocks
- 43 new unit tests covering all metacharacters, escaping edge cases,
null handling, and both shell modes
Co-authored-by: danedane <1402819+danedane@users.noreply.github.com>
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Initial plan
* Fix StatusIcon colour in Status dialog for 'ready' and 'active' channel statuses
Co-authored-by: shanselman <2892+shanselman@users.noreply.github.com>
* Centralize channel healthy-status check into ChannelHealth.IsHealthyStatus
Extract a shared static method ChannelHealth.IsHealthyStatus() in
OpenClaw.Shared to replace duplicated inline status checks across
the codebase. This ensures 'active' and 'ready' are consistently
recognized as healthy in all locations:
- StatusDetailWindow.xaml.cs (was missing active/ready - the original bug)
- App.xaml.cs flyout menu (was missing active/ready)
- App.xaml.cs channel toggle (was missing active/ready)
- TrayApplication.cs channel toggle (was missing active/ready)
Add comprehensive test coverage for the new helper method.
* Add intermediate status tier to Status dialog (yellow for idle/pending/connecting)
Address review feedback from @DanAtkinson: the Status dialog was
treating everything non-healthy as red, but intermediate statuses
like stopped, idle, paused, configured, pending, connecting, and
reconnecting should show yellow — matching the tray popup behavior.
- Add ChannelHealth.IsIntermediateStatus() shared helper
- Update StatusDetailWindow to use 3-tier coloring (green/yellow/red)
- Add test coverage for IsIntermediateStatus
* Fix flyout missing intermediate statuses; add mutual-exclusion tests
The WinUI flyout channel icon switch still had hardcoded
connecting/reconnecting instead of using IsIntermediateStatus(),
causing stopped/idle/paused/etc to show red instead of yellow.
Add mutual-exclusion test ensuring no status is ever classified
as both healthy and intermediate.
---------
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: shanselman <2892+shanselman@users.noreply.github.com>
Co-authored-by: Scott Hanselman <scott@hanselman.com>
- synchronize App session preview cache reads/writes/removal with a dedicated lock to avoid cross-thread Dictionary access races between gateway events and tray menu rendering
- reset unsupported-method capability flags on successful gateway reconnect so usage.status, usage.cost, sessions.preview, and node.list can recover after transient or older-gateway errors
- add focused OpenClawGatewayClient regression test covering unsupported-flag reset behavior
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- add shared models and gateway client handling for session, usage, and node.list telemetry
- add ActivityStreamService plus ActivityStreamWindow flyout with filtering, clear, and dashboard jump actions
- wire WinUI tray actions/status surfaces for activity, node/session/usage updates, and one-time discoverability tip
- document exec-policy troubleshooting in README, including Windows policy path and powershell.exe argv[0] matching
- expand shared tests for model parsing and gateway client behavior
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- Add shared GatewayUrlHelper for ws/wss/http/https validation and normalization\n- Use helper in OpenClawGatewayClient and WindowsNodeClient\n- Reuse helper in WinForms/WinUI settings validation and NodeService A2UI URL derivation\n- Add gateway URL normalization tests for helper, gateway client, and node client
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- Rewrite UpdateDialog as proper WindowEx (fixes black square and XamlRoot crash)
- Size and center DownloadProgressDialog
- Add Debug level to IOpenClawLogger interface and all implementations
- Downgrade raw JSON, response payloads, channel health, and debug spew from Info to Debug
- Debug messages still visible in dbgview.exe via System.Diagnostics.Debug
- Delete 10 stale remote branches
Replace keyword-only classification with a layered pipeline:
structured metadata (intent/channel) > user rules > keyword fallback.
- Add Channel, Agent, Intent, Tags fields to OpenClawNotification
- Extract NotificationCategorizer class with layered pipeline
- Add NotifyChatResponses toggle to suppress chat toasts
- Add UserNotificationRule model for custom regex/keyword rules
- Map error notifications to urgent setting
- Add 30+ unit tests for categorizer pipeline
- Document categorization system in docs/
Per the official OpenClaw spec (nodes-tool.ts), the 'command' param
for system.run is an argv array (e.g. ["echo","Hello"]), not a string.
Our handler was rejecting array format, causing the first invoke
attempts from the agent to fail with 'Missing command parameter'.
Changes:
- Accept command as array (primary, per spec) or string (fallback)
- Support 'timeoutMs' param name (spec) alongside legacy 'timeout'
- Preserve backward compat for string command + separate args array
- Add 6 new tests for array/string/single-element/error/timeout cases
All 180 tests pass.
Add 56 new tests covering all 4 capabilities (system, canvas, screen, camera),
NodeCapabilityBase arg parsing, DeviceIdentity keypair/signing (integration),
and fix default JsonElement crash in arg helpers.
Unit tests (135): always run in CI and locally
Integration tests (9): opt-in via OPENCLAW_RUN_INTEGRATION=1
Total: 144 tests, 0 failures
- Renamed all project directories and files
- Updated all namespaces and class names
- Updated deep link scheme from moltbot:// to openclaw://
- Updated AppData directories to OpenClawTray
- Updated README with OpenClaw references and added history note
- Updated all configuration and build files
- Kept mascot name "Molty" unchanged
Co-authored-by: shanselman <2892+shanselman@users.noreply.github.com>
- Upgrade all projects from .NET 9 to .NET 10
- Add .github/workflows/ci.yml with:
- Test job: runs 88 unit tests
- Build job: builds Tray for win-x64 and win-arm64
- Build-extension job: builds Command Palette extension
- Release job: creates GitHub release on version tags
- All tests passing on .NET 10