Skip to content

release: 0.4.0#154

Merged
webup merged 40 commits into
mainfrom
release/0.4.0
May 13, 2026
Merged

release: 0.4.0#154
webup merged 40 commits into
mainfrom
release/0.4.0

Conversation

@webup
Copy link
Copy Markdown
Contributor

@webup webup commented May 13, 2026

What

Ship develop as release/0.4.0 — 26 non-merge commits, 120 files changed since v0.3.1.

Highlights

Added

  • Wiki / LLM Knowledge Base: workspace module, knowledge service backend, and PowerMem integration for wiki recall and link ingest
  • Gateway-backed Wiki LLM workflows: gateway-proxied LLM calls for wiki operations
  • GLM provider: native GLM model support and integration guidance
  • Baidu Qianfan Coding Plan provider: new provider for Baidu Qianfan coding models
  • Gateway watchdog: health monitor for ClawMaster service mode
  • Package download tracker: skill for tracking package download progress
  • Latest session cost on Observe: show most recent session cost in the Observe dashboard
  • ClawMaster release notifications: notify users of new releases

Fixed

  • Windows process management (taskkill, ENOENT for npm-installed CLI tools)
  • SIGTERM→SIGKILL grace period on non-Windows timeout
  • WeChat QR login cancellation and recovery
  • PaddleOCR OCR configuration UX
  • Settings update section UI
  • Security audit advisories
  • Windows WSL workspace path and Vitest workers

Changed

  • Wiki module repositioned as LLM knowledge base with consolidated PowerMem integration
  • Release workflow now uses release-action for GitHub releases

How

  • Branch release/0.4.0 from develop tip
  • Bump version to 0.4.0 in package.json, packages/web/package.json, packages/backend/package.json, src-tauri/tauri.conf.json, src-tauri/Cargo.toml
  • Update CHANGELOG.md with release notes

Post-merge

  1. Tag v0.4.0 on the merge commit
  2. Push tag → triggers desktop bundles + npm publish via build.yml
  3. Merge release/0.4.0 back into develop to catch up any release-line changes

webup added 30 commits April 26, 2026 00:31
* feat: show latest session cost on observe

* ci: stabilize wizard skip smoke

* fix: address observe session review

* ci: relax wizard gateway skip smoke
Add GLM provider support and contributor guidance
…plan-provider

Add Baidu Qianfan Coding Plan provider
Add a watchdog for OpenClaw gateway recovery
Fix Windows WSL workspace paths and Vitest workers
…#125)

- Add v0.4.0 milestone badge to the build/meta line; bump v0.3.0 install note to v0.3.1 and point at the milestone.
- Add Workshop badge to the brand/product line linking to clawmaster-workshop.
- Offer two on-ramps after "After Launch": hands-on workshop or pictured walkthrough via the Product Tour.
- Introduce a capability-framed Memory Highlights section with upstream PowerMem (Python / TS SDK / OpenClaw plugin) links and a brief on why PowerMem is the memory backbone.
- Reorder: Memory Highlights under "Why ClawMaster"; Who It Is For after "Product Tour".
- Tighten body: drop "ClawMaster vs. CLI Only" and "What You Can Do Today", collapse "Why ClawMaster" and "Who It Is For".
- Fix broken openclaw/powermem + openclaw/seekdb acknowledgments links (oceanbase/*).
- Drop the non-existent Discord link from the hero nav.
- Apply the same set of changes to README.md / README_CN.md / README_JP.md.
…lease-notifications

# Conflicts:
#	packages/web/src/modules/settings/__tests__/CapabilitiesSection.test.tsx
…tifications

Add ClawMaster release notifications
…t-layout

Fix settings update errors and render release notes compactly
…shing

Use release-action for GitHub release publishing
…awprobe, npm)

On Windows, npm global installs create .cmd wrapper scripts instead of
bare executables. Node's child_process.spawn/execFile and Rust's
std::process::Command cannot execute .cmd files directly — they need
either  or explicit  invocation.

Fixes across all layers:

Backend (Node.js):
- Add 'openclaw' and 'clawprobe' to NPM_INSTALLED_COMMANDS set so
  resolveExecFileCommand appends .cmd on Windows
- Add shell: process.platform === 'win32' to execOpenclaw(),
  execOpenclawSpawnStdin(), spawnOpenclawGatewayStart()
- Add shell: process.platform === 'win32' to runClawprobeCommand()
  and runClawprobeJson() in execClawprobe.ts
- Update tests for the new openclaw.cmd/clawprobe.cmd resolution

Bundled skills:
- Add shell: process.platform === 'win32' to getGlobalNpmRoot() in
  clawprobe-cost-digest/scripts/common.mjs
- Add shell: process.platform === 'win32' to defaultRunOpenclaw() in
  package-download-tracker/scripts/common.mjs

Tauri (Rust):
- openclaw_cmd(): wrap with cmd /C when exe_path extension is .cmd
  or when the path has no extension (bare name fallback)
- clawprobe_cmd(): same treatment
- All Command::new("npm") calls: use cmd /C npm on Windows
  (npm_root_g, npm_uninstall_global_robust, list_npm_package_versions,
   run_npm_install_openclaw_global, npm_install_openclaw_from_file,
   run_skillguard_scan_host)
- run_system_command(): wrap with cmd /C on Windows when the resolved
  program path ends in .cmd or the command is a known npm-installed
  tool (npm, clawhub)

Closes #140
webup added 10 commits May 3, 2026 17:27
When shell:true is used with spawn on Windows, cmd.exe becomes the
direct child process. Killing only the shell child leaves the real
openclaw/clawprobe process orphaned. Use taskkill /T /F /PID to kill
the entire process tree on Windows, with a fallback to SIGKILL.

Also add windowsHide:true to suppress console windows on Windows.
The previous refactored killChild() helper removed the graceful SIGTERM
then delayed SIGKILL shutdown window that existed before. On non-Windows,
the timeout path now sends SIGTERM first, then escalates to SIGKILL after
5 seconds — preserving the original behavior. On Windows, the taskkill
/T /F approach remains (no graceful shutdown needed; Windows process tree
cleanup takes priority over signal handling).
fix: resolve Windows ENOENT for npm-installed CLI tools (openclaw, clawprobe, npm)
* fix: recover wechat qr login flow

* fix: keep wechat qr polling responsive
* feat: add gateway-backed wiki llm workflows

* test: prove wiki powermem workflow end to end

* test: deflake darwin node home resolution check

* fix: address review issues in wiki module

- P1: Pass { detectContradictions: false } to lintWiki() in the HTTP
  route handler so /api/wiki/lint stays fast and local-only instead of
  making implicit LLM API calls
- P2: Restore showInNav: !getIsTauri() guard in wiki module index to
  prevent broken wiki nav entry on Tauri desktop
- P2: Replace shouldUseMockedFetchTransport() fragile globalThis.fetch
  identity check with an explicit WIKI_LLM_USE_GATEWAY env var

* fix: use explicit test transport flag instead of fragile fetch identity check

The previous commit replaced shouldUseMockedFetchTransport() with an
env-var-only check, which broke all tests that mock globalThis.fetch to
route LLM calls through the gateway-fetch path. The CI failures were:

- wikiLlm.test.ts test 178: mocked fetch never hit (no override, no env var)
- wikiService.test.ts tests 184-196: mocked fetch never hit, LLM calls
  went through infer-model path instead, causing assertion failures

Fix by introducing setWikiLlmUseGatewayFetchForTests() -- an explicit
test-only flag that forces the gateway-fetch transport. This replaces
the fragile globalThis.fetch !== nativeFetch identity check for
production (where WIKI_LLM_USE_GATEWAY env var is now the authoritative
signal) while keeping tests working without relying on fetch identity.

The shouldUseMockedFetchTransport function now checks:
1. test transport flag (set by tests that mock fetch)
2. WIKI_LLM_USE_GATEWAY env var (explicit production opt-in)
3. globalThis.fetch !== nativeFetch (legacy fallback)
…e powermem integration (#151)

* refactor(wiki): rename user-facing "Wiki" to "Knowledge"

The module is an LLM-curated knowledge base built around automated
ingest, derivation, and synthesis — not a hand-authored wiki. User-facing
copy is updated to reflect that, and this positioning informs follow-up
decisions such as not adding page-edit/CRUD endpoints.

Changes:
- packages/web/src/locales/main/{en,zh,ja}.ts: rename nav.wiki, wiki.title,
  wiki.subtitle, and related labels; reword copy that implied hand-editing
  (e.g. "compile into the wiki" → "ingest as a knowledge source"); drop
  stale references to PowerMem from user-facing strings where the backing
  engine is already surfaced by the stats panel.
- packages/web/src/modules/wiki/__tests__/WikiPage.test.tsx: update
  assertions to match the new strings.
- README.md / README_CN.md / README_JP.md: v0.4.0 roadmap entry renamed
  from "LLM Wiki" to "LLM Knowledge module" in all three languages.

Code identifiers, routes (/wiki, /api/wiki/*), file paths, and TypeScript
types remain unchanged — renaming them is high-cost, zero-user-value churn
that would bloat the diff without any observable improvement.

* refactor(wiki): share vault path and structure resolver with powermem plugin

Two layers used to own the same on-disk wiki vault: wikiService derived
the path from the OpenClaw profile selection, the PowerMem plugin derived
it from the managed data root. They converged for the default profile but
could drift under non-trivial configurations (named profile without a
data-root override, differing env handling), and each layer wrote the
vault scaffold (SCHEMA.md, .meta/*.json, index.md, log.md) independently.

Changes:
- packages/backend/src/openclawVaultPaths.ts (new): single source of
  truth for vault-root resolution and directory/meta scaffolding.
  Precedence: explicit override > CLAWMASTER_WIKI_ROOT env >
  OPENCLAW_STATE_DIR env > data-root-derived state dir > profile
  selection. Exports resolveWikiVaultRoot, resolveWikiVaultLayout,
  ensureWikiVaultStructure, and WIKI_SCHEMA_MARKDOWN.
- packages/backend/src/openclawVaultPaths.test.ts (new): matrix tests
  across override / env / data-root / profile inputs, plus a parity
  check asserting the plugin's join(resolveOpenclawWorkspaceDir(ctx),
  '..', 'wiki') lands on the same vault root as the shared helper.
- packages/backend/src/services/wikiService.ts: delete the local
  resolveOpenclawStateDir + WIKI_SCHEMA_TEMPLATE + inline directory
  ensure logic; delegate resolveWikiPaths and ensureWikiVault to the
  shared module. Drop the stealth SCHEMA.md force-overwrite block
  (obsolete migration).
- plugins/memory-clawmaster-powermem/index.ts: honor
  CLAWMASTER_WIKI_ROOT in resolveWikiVaultRoot for parity with the
  backend (no other behavior change).

* refactor(wiki): migrate list frontmatter to yaml arrays

generatedFromSourceIds, relatedPages, and relatedPageIds now persist as
YAML inline arrays on disk (e.g. `generatedFromSourceIds: ["a", "b"]`)
instead of pipe-delimited strings. External markdown editors render
these as native lists and can query them with dataview-style tools
without treating the value as a single opaque string.

The in-memory shape remains Record<string, string> — parseFrontmatter
pipe-joins array values on read so existing call sites keep working, and
renderFrontmatter splits them back out on write for any key in
LIST_FRONTMATTER_KEYS. A small set of helpers (readListFrontmatter,
serializeFrontmatterList, normalizeFrontmatterValueForWrite) replaces
the ad-hoc parsePipeList / serializePipeList pair.

Source pages no longer write a body-level "## Extracted Wiki Links"
generated block. The derived page titles now flow into a `relatedPages`
frontmatter array; re-ingest of any legacy page strips the old block via
removeGeneratedBlock before writing. summarizeParsedPages unions
frontmatter relatedPages into the page link graph so backlinks and
orphan detection still see the derived-entity edges.

The shared SCHEMA.md template documents the new array convention. The
wikiService test asserts the raw on-disk file carries YAML-array syntax
and that the legacy body section is absent.

* fix(wiki): replace fetch-identity transport sniffing with explicit resolution

wikiLlm.ts previously decided between gateway-fetch and infer-model by
comparing globalThis.fetch against a module-load-time reference. Any
APM agent, polyfill, or test harness that wraps fetch would silently
divert production traffic to the gateway-fetch path, bypassing the
intended CLI transport.

Changes:
- Drop the nativeFetch capture and shouldUseMockedFetchTransport logic.
  Transport resolution is now: explicit test override > WIKI_LLM_USE_GATEWAY
  env ('1' → gateway-fetch) > default (infer-model). WIKI_LLM_USE_GATEWAY
  is the only opt-in outside of tests.
- Introduce setWikiLlmTransportForTests(transport|null) as the primary
  test seam. setWikiLlmUseGatewayFetchForTests is kept as a deprecated
  shim so existing test files compile unchanged during the transition.
- Add tests asserting: default routes to infer-model without calling
  fetch; WIKI_LLM_USE_GATEWAY=1 forces gateway-fetch; explicit override
  beats the env.
- Replace bare catch {} blocks in wikiService.ts LLM call sites with
  logWikiLlmFailure() calls that emit console.warn with the error
  message and a structured context object. Warning code payloads are
  preserved.
- Simplify sanitizeWikiBody: the two CLAWMASTER-GENERATED-specific
  comment strips are subsumed by the single generic comment-strip regex.

* perf(wiki): hoist listWikiPages out of derived-page ingest loop

ingestWikiSource called listWikiPages(context) inside every iteration of
the derived-page upsert loop — an O(N×M) filesystem scan per ingest.
Fix: compute knownPages once before the loop and pass the snapshot to
upsertDerivedPage. A mutable copy is kept and extended after each
successful upsert so later suggestions in the same batch see freshly
created pages without a re-scan. The duplicate listWikiPages on the
skipped-fingerprint fast-path now reuses the same snapshot.

Also truncate and sanitize contradiction check inputs to
MAX_CONTRADICTION_PAGE_CHARS (3000 chars) per page — same sanitizer used
for query synthesis — to cap per-pair token spend in a dense vault.
A test asserts the user message delivered to the LLM is < 7500 chars
even when each source page is 10 000 chars of body text.

* chore(wiki): rename log helper, guard proof helper, document bridge install flag

- plugins/memory-clawmaster-powermem/index.ts: rename
  buildAutoRecallLogForTest → formatAutoRecallLog. The function is called
  in production code; the ForTest suffix was misleading. Update the call
  site and the test import.
- packages/backend/src/services/managedMemoryBridge.ts: expand the
  inline comment on dangerouslyForceUnsafeInstall to explain which
  specific check it bypasses (resetManagedMemory access + direct
  openclaw/plugin-sdk imports) and note what a narrower alternative
  would look like when OpenClaw adds one.
- tests/ui/wiki-powermem-proof-helper.ts: add a fail-fast check before
  syncManagedMemoryBridge runs — if the resolved --home path is the real
  user home or any subdirectory of it, throw rather than risk writing
  into the live OpenClaw profile.

* fix(wiki): resolve three post-review follow-ups

1. Plumb managedMemoryContext.dataRootOverride into resolveWikiPaths so
   the shared vault-root resolver is exercised at runtime, not only in
   unit tests. Before this change, the Stage 2 dataRootOverride support
   in resolveWikiVaultLayout was dead code from the wikiService call
   path. Add a unit test in openclawVaultPaths.test.ts and an integration
   test in wikiService.test.ts asserting the vault root resolves
   correctly when only dataRootOverride (no vaultRootOverride) is set.

2. Add a multi-element readListFrontmatter round-trip test. The previous
   YAML-array tests only exercised single-element arrays. The new test
   ingests a source page where the LLM returns two suggestions and asserts
   that relatedPages persists as a two-element YAML inline array on disk
   while the in-memory representation stays pipe-joined.

3. Replace setWikiLlmUseGatewayFetchForTests with
   setWikiLlmTransportForTests('gateway-fetch') in the contradiction-
   truncation test and in afterEach, ahead of the deprecated shim's
   removal.
* fix: clarify PaddleOCR OCR config flow

* fix: remove hardcoded PaddleOCR endpoint default
@webup webup merged commit 5b79730 into main May 13, 2026
36 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant