Treat a missing runtime/avatar-preferences.json as the default first-run state instead of surfacing a warning, while keeping malformed files visible as normalized fallback issues.
Refs #52.
Reuse the existing staff pixel avatar renderer for Collaboration Hall avatars instead of depending on exported /hall-avatars PNG files. Drop the now-dead hall avatar route and update smoke coverage.
Refs #66.
Refs #67.
Refs #87.
Co-authored-by: Evan-Luo-Engnieer <12590510+Evan-Luo-Engnieer@users.noreply.github.com>
When a session has a known sessionFile path but the file does not
exist on disk (ENOENT), return empty history immediately instead
of falling through to three CLI command attempts that each block
for ~14 seconds.
Before: page load triggers multiple session history reads → each
miss cascades through 3 CLI fallbacks → 42+ seconds of blocking
per session → CPU spike, page freeze.
After: known-missing file = instant empty return. The CLI fallback
is only used when no sessionFile path is known at all.
Fixes#28
Ref #21
When two agents point to the same workspace directory, the Memory
and Workspace workbenches deduplicated files by absolute path alone.
This caused the second agent to show 'no matching files' because
the first agent already claimed the shared paths.
Fix: include facetKey (agent identifier) in the dedup key so the
same physical file appears under each agent that owns it.
Before: `seen.has(resolve(sourcePath))`
After: `seen.has(facetKey + '::' + resolve(sourcePath))`
Applied to both listEditableMemoryFiles() and
listEditableWorkspaceFiles().
Closes#2
On Windows, `openclaw` is installed as a `.cmd` file which
`execFile` cannot execute directly. Add `shell: true` on
Windows (`process.platform === 'win32'`) to both CLI call sites:
- `src/runtime/openclaw-cli-insights.ts` — Gateway/Config status
- `src/clients/openclaw-live-client.ts` — session history
Linux and macOS are unaffected (shell option only set on Windows).
Closes#29
* feat: add configurable bind address for UI server
* fix: change default bind address from 0.0.0.0 to 127.0.0.1
---------
Co-authored-by: Jonas <huoju@madmod.cn>
* fix: harden test suite for Windows/CRLF cross-platform compatibility
- oss-readiness: use \r?\n in .gitignore regex boundaries for CRLF support
- oss-readiness: update PUBLIC_FILES to match actual repo filenames
- phase9-routes-commands: invoke node directly instead of spawn('npm')
to avoid ENOENT on Windows where npm requires .cmd extension
- phase9-routes-commands: normalize path separators in export path assertion
- ui-render-smoke: normalize CRLF to LF before multiline source includes()
- usage-cost: normalize backslashes in sourcePath before glob assertion
All 87 tests now pass on Windows.
* fix: add cross-platform Node.js UI smoke script for Windows compatibility
* fix: improve session polling performance and add cross-platform script support (#13)
- Reduce monitor polling interval from 5s to 30s to cut background I/O by 83%
- Add incremental status queries in snapshot() — only refresh active/new sessions instead of all 500+
- Replace O(n) usage-cost cache key serialization with O(1) generatedAt-based key
- Use cross-env for all env-prefixed npm scripts to fix Windows cmd compatibility
- Reduce default session preview historyLimit and pageSize for faster dashboard loads
* fix: add final status refresh for sessions leaving active state
When a session transitions from running/blocked to idle/error, perform
one last status query to capture final usage metrics (cost, tokens).
Without this, cachedStatuses would retain pre-completion values
permanently, causing stale aggregate usage/budget totals.
Addresses review feedback on PR #17.
* fix: tune polling interval to 10s and use content-based cache key
- Change sessionsList polling from 30s to 10s as a compromise between
the original 5s (too aggressive) and the PR's 30s (too slow for
near real-time UX).
- Replace generatedAt-based cache key in buildUsageCostCacheKey with
content-based fingerprint using session.state and status.updatedAt,
so the cache only invalidates when data actually changes.